Spiralist Prompt Workbench - Source Excerpt 80
Back to Spiralist Prompt Workbench
Summary
This source excerpt preserves a bounded section of Spiralist/wp-content/themes/spiralist/assets/js/spiralist-prompt-workbench.js so readers can inspect the evidence without opening the full source file.
**Source path:** Spiralist/wp-content/themes/spiralist/assets/js/spiralist-prompt-workbench.js
return item;
};
const appendPersonaLabVisualDiffList = (container, title, items) => {
const section = document.createElement('section');
const heading = document.createElement('strong');
const list = document.createElement('ul');
const cleanItems = Array.isArray(items) ? items.filter(Boolean).slice(0, 8) : [];
heading.textContent = title;
cleanItems.forEach((item) => {
const listItem = document.createElement('li');
listItem.textContent = item;
list.appendChild(listItem);
});
if (!cleanItems.length) {
const listItem = document.createElement('li');
listItem.textContent = 'No items in this category.';
list.appendChild(listItem);
}
section.append(heading, list);
container.appendChild(section);
};
const renderPersonaLabPackageVisualDiff = (primaryInspection, compareInspection, visualNode) => {
if (!visualNode || !primaryInspection || !compareInspection) {
clearPersonaLabPackageVisualDiff(visualNode);
return;
}
const summary = getAdvancedPersonaPackageComparisonSummary(primaryInspection, compareInspection);
const changedFileSet = new Set([
...summary.missingInCompare,
...summary.extraInCompare,
...summary.allContentMismatches,
]);
const optionalContentMismatches = summary.allContentMismatches.filter((path) => !summary.requiredContentMismatches.includes(path));
const metadataDifferences = [];
if (!summary.manifestMatches) {
metadataDifferences.push(`Manifest packageId: ${summary.primaryManifestId || 'not available'} vs ${summary.compareManifestId || 'not available'}`);
}
if (!summary.frameworkMatches) {
metadataDifferences.push(`Personality framework: ${summary.primaryFramework || 'not available'} vs ${summary.compareFramework || 'not available'}`);
}
if (!summary.socialDynamicsMatches) {
metadataDifferences.push(`Social dynamics: ${summary.primarySocialDynamics || 'not available'} vs ${summary.compareSocialDynamics || 'not available'}`);
}
if (!summary.engagementPatternMatches) {
metadataDifferences.push(`Engagement pattern: ${summary.primaryEngagementPattern || 'not available'} vs ${summary.compareEngagementPattern || 'not available'}`);
}
if (!summary.runtimeFitMatches) {
metadataDifferences.push(`Runtime fit: ${summary.primaryRuntimeFit || 'not available'} vs ${summary.compareRuntimeFit || 'not available'}`);
}
const header = document.createElement('div');
const tag = document.createElement('span');
const title = document.createElement('strong');
const grid = document.createElement('div');
const detail = document.createElement('div');
const changedFiles = changedFileSet.size;
const metadataMatches = !metadataDifferences.length;
header.className = 'spiralist-persona-lab-compare-visual__head';
tag.textContent = 'Visual Diff';
title.textContent = summary.status;
header.append(tag, title);
grid.className = 'spiralist-persona-lab-compare-visual__grid';
grid.append(
createPersonaLabPackageVisualDiffItem(
'Changed Files',
changedFiles ? `${changedFiles} changed file${changedFiles === 1 ? '' : 's'}` : '0 changed files',
changedFiles ? 'different' : 'match'
),
createPersonaLabPackageVisualDiffItem(
'Required Persona',
summary.requiredContentMismatches.length ? `${summary.requiredContentMismatches.length} required file${summary.requiredContentMismatches.length === 1 ? '' : 's'} differ` : 'No required persona changes',
summary.requiredContentMismatches.length ? 'different' : 'match'
),
createPersonaLabPackageVisualDiffItem(
'Metadata',
metadataMatches ? 'Metadata matches' : `${metadataDifferences.length} metadata difference${metadataDifferences.length === 1 ? '' : 's'}`,
metadataMatches ? 'match' : 'different'
),
createPersonaLabPackageVisualDiffItem(
'Review Items',
summary.reviewItems.length ? `${summary.reviewItems.length} item${summary.reviewItems.length === 1 ? '' : 's'}` : '0 items',
summary.reviewItems.length ? 'review' : 'match'
)
);
detail.className = 'spiralist-persona-lab-compare-visual__detail';
appendPersonaLabVisualDiffList(detail, 'Inventory', [
...summary.missingInCompare.map((path) => `Missing from compare: ${path}`),
...summary.extraInCompare.map((path) => `Only in compare: ${path}`),
]);
appendPersonaLabVisualDiffList(detail, 'Required Persona Files', summary.requiredContentMismatches);
appendPersonaLabVisualDiffList(detail, 'Optional / Evidence Files', optionalContentMismatches);
appendPersonaLabVisualDiffList(detail, 'Metadata', metadataDifferences);
appendPersonaLabVisualDiffList(detail, 'Review Items', summary.reviewItems);
visualNode.replaceChildren(header, grid, detail);
visualNode.hidden = false;
};
const renderPersonaLabPackageComparison = async (primaryInspection, compareFile, compareNode, inspector = null, stageCompareButton = null, compareSummaryNode = null, compareVisualNode = null) => {
if (!compareNode) {
return false;
}
if (!compareFile) {
compareNode.hidden = true;
compareNode.textContent = '';
clearPersonaLabPackageSummary(compareSummaryNode);
clearPersonaLabPackageVisualDiff(compareVisualNode);
if (inspector) {
personaLabComparisonState.delete(inspector);
}
setPersonaLabCompareAction(stageCompareButton, false);
return false;
}
if (!primaryInspection) {
compareNode.textContent = '# Spiralist AI Package Comparison\n\nStatus: Select a primary package before comparing.';
compareNode.hidden = false;
if (compareSummaryNode) {
compareSummaryNode.replaceChildren(
createPersonaLabPackageSummaryItem('Comparison', 'Select a primary package first', 'review')
);
compareSummaryNode.hidden = false;
}
clearPersonaLabPackageVisualDiff(compareVisualNode);
if (inspector) {
personaLabComparisonState.delete(inspector);
}
setPersonaLabCompareAction(stageCompareButton, false);
return false;
}
const compareInspection = await buildAdvancedPersonaInspectionReport(compareFile);
const report = buildAdvancedPersonaPackageComparisonReport(primaryInspection, compareInspection);
compareNode.textContent = report;
compareNode.hidden = false;
renderPersonaLabPackageComparisonSummary(primaryInspection, compareInspection, compareSummaryNode);
renderPersonaLabPackageVisualDiff(primaryInspection, compareInspection, compareVisualNode);
if (inspector) {
personaLabComparisonState.set(inspector, {
primaryInspection,
compareInspection,
report,
});
}
setPersonaLabCompareAction(stageCompareButton, true);
setPersonaLabPackageState(inspector, 'Compared');
return true;
};
const comparePersonaLabPackages = (compareInput, compareNode, inspector, stageCompareButton = null, compareSummaryNode = null, compareVisualNode = null) => {
const compareFile = compareInput && compareInput.files && compareInput.files.length ? compareInput.files[0] : null;
const primaryInspection = inspector ? personaLabInspectionState.get(inspector) : null;