Skip to content
wiki.fftac.org

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;