sinapse-ai 1.8.0 → 1.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/mind-clone-governance.py +212 -212
- package/.claude/hooks/read-protection.py +152 -152
- package/.claude/hooks/slug-validation.py +175 -175
- package/.claude/hooks/sql-governance.py +183 -183
- package/.claude/rules/documentation-first.md +1 -1
- package/.claude/rules/hook-governance.md +1 -1
- package/.claude/rules/mandatory-delegation.md +1 -1
- package/.claude/rules/project-intelligence.md +1 -1
- package/.codex/agents/analyst.md +4 -371
- package/.codex/agents/animations-orqx.md +4 -57
- package/.codex/agents/architect.md +4 -560
- package/.codex/agents/brand-orqx.md +4 -95
- package/.codex/agents/claude-mastery-chief.md +4 -0
- package/.codex/agents/cloning-orqx.md +4 -70
- package/.codex/agents/commercial-orqx.md +4 -67
- package/.codex/agents/config-engineer.md +2 -2
- package/.codex/agents/content-orqx.md +4 -77
- package/.codex/agents/copy-orqx.md +4 -65
- package/.codex/agents/cost-optimizer.md +4 -0
- package/.codex/agents/council-orqx.md +4 -68
- package/.codex/agents/courses-orqx.md +4 -64
- package/.codex/agents/cro-persuasion.md +4 -0
- package/.codex/agents/cyber-orqx.md +4 -67
- package/.codex/agents/data-engineer.md +4 -542
- package/.codex/agents/design-orqx.md +4 -65
- package/.codex/agents/design-system.md +4 -210
- package/.codex/agents/developer.md +4 -666
- package/.codex/agents/devops.md +4 -668
- package/.codex/agents/finance-orqx.md +4 -57
- package/.codex/agents/fiscal-compliance-br.md +4 -0
- package/.codex/agents/forecast-strategist.md +4 -0
- package/.codex/agents/growth-orqx.md +4 -75
- package/.codex/agents/hooks-architect.md +2 -2
- package/.codex/agents/mcp-integrator.md +2 -2
- package/.codex/agents/paidmedia-orqx.md +4 -67
- package/.codex/agents/platform-aesthetic-director.md +4 -0
- package/.codex/agents/premium-packaging-strategist.md +4 -0
- package/.codex/agents/product-lead.md +4 -371
- package/.codex/agents/product-orqx.md +4 -57
- package/.codex/agents/product-surface-director.md +4 -0
- package/.codex/agents/project-integrator.md +2 -2
- package/.codex/agents/project-lead.md +4 -414
- package/.codex/agents/quality-gate.md +4 -547
- package/.codex/agents/research-orqx.md +4 -67
- package/.codex/agents/roadmap-sentinel.md +2 -2
- package/.codex/agents/skill-craftsman.md +2 -2
- package/.codex/agents/snps-orqx.md +4 -684
- package/.codex/agents/sop-extractor.md +4 -61
- package/.codex/agents/sprint-lead.md +4 -324
- package/.codex/agents/squad-creator.md +4 -402
- package/.codex/agents/storytelling-orqx.md +4 -65
- package/.codex/agents/swarm-orqx.md +4 -64
- package/.codex/agents/ux-design-expert.md +4 -532
- package/.codex/agents/ux-designer.md +4 -124
- package/.codex/command-registry.json +9 -9
- package/.codex/delegation-matrix.json +375 -839
- package/.codex/delegation-parity.json +658 -0
- package/.codex/handoff-packet.parity.schema.json +148 -0
- package/.codex/handoff-packet.template.json +26 -0
- package/.codex/instructions.md +8 -8
- package/.codex/scripts/resolve-codex-agent.js +482 -0
- package/.codex/scripts/resolve-codex-command.js +75 -12
- package/.codex/scripts/resolve-codex-delegation.js +131 -92
- package/.codex/skills/sinapse-claude/SKILL.md +3 -3
- package/.codex/skills/sinapse-po/SKILL.md +1 -1
- package/.codex/tasks/resolve-sinapse-conflict.md +1 -1
- package/.sinapse-ai/constitution.md +5 -5
- package/.sinapse-ai/core/doctor/checks/git-hooks.js +163 -19
- package/.sinapse-ai/core/events/dashboard-emitter.js +30 -9
- package/.sinapse-ai/core/execution/subagent-dispatcher.js +1 -1
- package/.sinapse-ai/core/synapse/engine.js +15 -0
- package/.sinapse-ai/core/ui/observability-panel.js +240 -0
- package/.sinapse-ai/core-config.yaml +0 -20
- package/.sinapse-ai/data/entity-registry.yaml +185 -236
- package/.sinapse-ai/development/agents/snps-orqx.md +16 -26
- package/.sinapse-ai/development/tasks/build-autonomous.md +11 -1
- package/.sinapse-ai/development/tasks/build-resume.md +8 -0
- package/.sinapse-ai/development/tasks/build-status.md +8 -0
- package/.sinapse-ai/development/tasks/build.md +8 -0
- package/.sinapse-ai/development/tasks/cleanup-worktrees.md +8 -1
- package/.sinapse-ai/development/tasks/gotcha.md +8 -0
- package/.sinapse-ai/development/tasks/gotchas.md +8 -0
- package/.sinapse-ai/development/tasks/ids-health.md +14 -6
- package/.sinapse-ai/development/tasks/list-mcps.md +15 -0
- package/.sinapse-ai/development/tasks/merge-worktree.md +8 -1
- package/.sinapse-ai/development/tasks/qa-review-build.md +18 -0
- package/.sinapse-ai/development/tasks/remove-mcp.md +8 -1
- package/.sinapse-ai/development/tasks/validate-agents.md +26 -14
- package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
- package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
- package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
- package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
- package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
- package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
- package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
- package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
- package/.sinapse-ai/git-hooks/lib/framework-guard.js +258 -0
- package/.sinapse-ai/git-hooks/lib/secret-scanner-core.js +355 -0
- package/.sinapse-ai/git-hooks/lib/staged-secret-scan.js +179 -0
- package/.sinapse-ai/git-hooks/lib/staged-sql-guard.js +204 -0
- package/.sinapse-ai/git-hooks/post-commit +28 -0
- package/.sinapse-ai/git-hooks/pre-commit +81 -0
- package/.sinapse-ai/git-hooks/pre-push +83 -0
- package/.sinapse-ai/hooks/ids-post-commit.js +13 -11
- package/.sinapse-ai/hooks/ids-pre-push.js +9 -7
- package/.sinapse-ai/infrastructure/scripts/codex-parity/resolve.js +161 -0
- package/.sinapse-ai/infrastructure/scripts/dashboard-status-writer.js +6 -2
- package/.sinapse-ai/infrastructure/scripts/ide-sync/index.js +65 -68
- package/.sinapse-ai/infrastructure/scripts/sync-codex-local-first.js +156 -1
- package/.sinapse-ai/infrastructure/scripts/validate-codex-delegation.js +1 -4
- package/.sinapse-ai/infrastructure/scripts/validate-codex-integration.js +41 -5
- package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
- package/.sinapse-ai/infrastructure/templates/config/env.example +16 -16
- package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -59
- package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -12
- package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
- package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
- package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
- package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
- package/.sinapse-ai/infrastructure/templates/safe-collab/CODEOWNERS.template +16 -16
- package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
- package/.sinapse-ai/install-manifest.yaml +112 -164
- package/.sinapse-ai/local-config.yaml.template +65 -65
- package/.sinapse-ai/product/templates/adr.hbs +126 -126
- package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
- package/.sinapse-ai/product/templates/epic.hbs +213 -213
- package/.sinapse-ai/product/templates/ide-rules/codex-rules.md +30 -0
- package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
- package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
- package/.sinapse-ai/product/templates/prd.hbs +202 -202
- package/.sinapse-ai/product/templates/statusline/statusline-script.js +31 -8
- package/.sinapse-ai/product/templates/statusline/track-agent-clear.cjs +79 -0
- package/.sinapse-ai/product/templates/statusline/track-agent.cjs +218 -0
- package/.sinapse-ai/product/templates/story.hbs +264 -264
- package/.sinapse-ai/product/templates/task.hbs +171 -171
- package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
- package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
- package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
- package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
- package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
- package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
- package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
- package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
- package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
- package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
- package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
- package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
- package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
- package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
- package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
- package/AGENTS.md +193 -0
- package/CHANGELOG.md +1247 -0
- package/LICENSE +63 -63
- package/README.en.md +17 -18
- package/README.md +18 -19
- package/bin/cli.js +1 -1
- package/bin/commands/install.js +194 -22
- package/bin/commands/status.js +14 -1
- package/bin/commands/uninstall.js +2 -2
- package/bin/commands/update.js +52 -0
- package/bin/lib/setup-statusline.js +191 -0
- package/bin/sinapse-init.js +11 -83
- package/bin/utils/framework-guard.js +17 -4
- package/bin/utils/secret-scanner-core.js +109 -7
- package/bin/utils/staged-sql-guard.js +204 -0
- package/bin/utils/validate-publish.js +63 -0
- package/docs/agent-reference-guide.md +5 -7
- package/docs/framework/agent-prefix-convention.md +58 -0
- package/docs/framework/architecture-overview.md +4 -4
- package/docs/framework/collaboration-activation.md +45 -0
- package/docs/framework/guiding-principles.md +9 -9
- package/docs/getting-started.md +1 -1
- package/docs/guides/agent-reference.md +1 -1
- package/docs/guides/codex-config.md +4 -5
- package/docs/pt/architecture/sub-orqx-pattern.md +20 -18
- package/docs/security/overview.md +1 -1
- package/package.json +16 -12
- package/packages/installer/src/index.js +26 -0
- package/packages/installer/src/installer/git-hooks-installer.js +211 -47
- package/packages/installer/src/installer/sinapse-ai-installer.js +71 -0
- package/packages/installer/src/wizard/feedback.js +1 -1
- package/packages/installer/src/wizard/ide-config-generator.js +26 -26
- package/packages/installer/src/wizard/index.js +53 -4
- package/packages/sinapse-install/bin/edmcp.js +0 -0
- package/packages/sinapse-install/bin/sinapse-install.js +0 -0
- package/scripts/audit-tasks.cjs +112 -91
- package/scripts/check-markdown-links.py +352 -352
- package/scripts/prepare-hooks.js +58 -0
- package/scripts/regenerate-orqx-stubs.ps1 +2 -3
- package/scripts/sync-counts.js +10 -2
- package/scripts/sync-squad-yaml-components.js +108 -6
- package/scripts/validate-agents-md.js +128 -0
- package/scripts/validate-all.js +1 -0
- package/scripts/validate-squad-orqx.js +19 -9
- package/sinapse/agents/sinapse-orqx.md +16 -26
- package/sinapse/agents/snps-orqx.md +15 -25
- package/sinapse/knowledge-base/routing-catalog.md +1 -1
- package/sinapse/tasks/diagnose-and-route.md +1 -1
- package/sinapse/tasks/squad-status-report.md +1 -1
- package/squads/claude-code-mastery/agents/claude-mastery-chief.md +1 -1
- package/squads/claude-code-mastery/agents/hooks-architect.md +60 -68
- package/squads/claude-code-mastery/knowledge-base/swarm-orchestration-patterns.md +1 -1
- package/squads/claude-code-mastery/squad.yaml +8 -0
- package/squads/claude-code-mastery/tasks/audit-setup.md +1 -1
- package/squads/claude-code-mastery/workflows/optimization-cycle.yaml +4 -4
- package/squads/claude-code-mastery/workflows/project-setup-cycle.yaml +4 -4
- package/squads/squad-animations/README.md +1 -1
- package/squads/squad-animations/squad.yaml +1 -1
- package/squads/squad-brand/squad.yaml +1 -1
- package/squads/squad-cloning/README.md +1 -1
- package/squads/squad-cloning/squad.yaml +1 -1
- package/squads/squad-commercial/README.md +1 -1
- package/squads/squad-commercial/squad.yaml +2 -3
- package/squads/squad-content/README.md +1 -1
- package/squads/squad-content/squad.yaml +1 -1
- package/squads/squad-copy/README.md +1 -1
- package/squads/squad-copy/squad.yaml +2 -3
- package/squads/squad-council/README.md +1 -1
- package/squads/squad-courses/README.md +1 -1
- package/squads/squad-courses/squad.yaml +1 -1
- package/squads/squad-cybersecurity/README.md +1 -1
- package/squads/squad-cybersecurity/squad.yaml +2 -3
- package/squads/squad-design/README.md +1 -1
- package/squads/{squad-artdir → squad-design}/agents/cro-persuasion.md +1 -1
- package/squads/{squad-artdir → squad-design}/agents/platform-aesthetic-director.md +2 -2
- package/squads/{squad-artdir → squad-design}/agents/premium-packaging-strategist.md +2 -2
- package/squads/{squad-artdir → squad-design}/agents/product-surface-director.md +3 -3
- package/squads/squad-design/squad.yaml +6 -3
- package/squads/squad-finance/README.md +1 -1
- package/squads/squad-finance/squad.yaml +7 -1
- package/squads/squad-growth/README.md +1 -1
- package/squads/squad-growth/squad.yaml +1 -1
- package/squads/squad-paidmedia/README.md +1 -1
- package/squads/squad-paidmedia/squad.yaml +2 -3
- package/squads/squad-product/README.md +1 -1
- package/squads/squad-product/squad.yaml +1 -1
- package/squads/squad-research/README.md +1 -1
- package/squads/squad-research/squad.yaml +2 -3
- package/squads/squad-storytelling/README.md +1 -1
- package/squads/squad-storytelling/squad.yaml +2 -3
- package/.codex/agents/brad-frost.md +0 -46
- package/.codex/agents/claude-orqx.md +0 -72
- package/.codex/agents/copy-chief.md +0 -162
- package/.codex/agents/cyber-chief.md +0 -169
- package/.codex/agents/dan-mall.md +0 -43
- package/.codex/agents/data-chief.md +0 -198
- package/.codex/agents/dave-malouf.md +0 -43
- package/.codex/agents/db-sage.md +0 -152
- package/.codex/agents/design-chief.md +0 -226
- package/.codex/agents/dev.md +0 -102
- package/.codex/agents/legal-chief.md +0 -199
- package/.codex/agents/nano-banana-generator.md +0 -42
- package/.codex/agents/pm.md +0 -81
- package/.codex/agents/po.md +0 -85
- package/.codex/agents/qa.md +0 -98
- package/.codex/agents/sm.md +0 -77
- package/.codex/agents/squad-chief.md +0 -1553
- package/.codex/agents/squad.md +0 -66
- package/.codex/agents/story-chief.md +0 -180
- package/.codex/agents/tools-orqx.md +0 -219
- package/.codex/agents/traffic-masters-chief.md +0 -211
- package/.sinapse-ai/core/memory/__tests__/active-modules.verify.js +0 -265
- package/.sinapse-ai/core/permissions/__tests__/permission-mode.test.js +0 -293
- package/.sinapse-ai/data/registry-update-log.jsonl +0 -158
- package/.sinapse-ai/infrastructure/scripts/ide-sync/gemini-commands.js +0 -298
- package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/antigravity.js +0 -121
- package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/cursor.js +0 -119
- package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/github-copilot.js +0 -191
- package/.sinapse-ai/infrastructure/scripts/ide-sync/transformers/kimi.js +0 -448
- package/.sinapse-ai/infrastructure/tests/project-status-loader.test.js +0 -569
- package/.sinapse-ai/infrastructure/tests/regression-suite-v2.md +0 -622
- package/.sinapse-ai/infrastructure/tests/validate-module.js +0 -98
- package/.sinapse-ai/infrastructure/tests/worktree-manager.test.js +0 -620
- package/.sinapse-ai/monitor/hooks/lib/__init__.py +0 -2
- package/.sinapse-ai/monitor/hooks/lib/enrich.py +0 -59
- package/.sinapse-ai/monitor/hooks/lib/send_event.py +0 -48
- package/.sinapse-ai/monitor/hooks/notification.py +0 -30
- package/.sinapse-ai/monitor/hooks/post_tool_use.py +0 -46
- package/.sinapse-ai/monitor/hooks/pre_compact.py +0 -30
- package/.sinapse-ai/monitor/hooks/pre_tool_use.py +0 -41
- package/.sinapse-ai/monitor/hooks/stop.py +0 -30
- package/.sinapse-ai/monitor/hooks/subagent_stop.py +0 -30
- package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +0 -39
- package/.sinapse-ai/product/templates/statusline/track-agent.sh +0 -69
- package/.sinapse-ai/workflow-intelligence/__tests__/confidence-scorer.test.js +0 -335
- package/.sinapse-ai/workflow-intelligence/__tests__/integration.test.js +0 -340
- package/.sinapse-ai/workflow-intelligence/__tests__/suggestion-engine.test.js +0 -438
- package/.sinapse-ai/workflow-intelligence/__tests__/wave-analyzer.test.js +0 -448
- package/.sinapse-ai/workflow-intelligence/__tests__/workflow-registry.test.js +0 -303
- package/bin/sinapse-graph.js +0 -19
- package/docs/codex-integration-process.md +0 -22
- package/docs/codex-parity-program.md +0 -27
- package/packages/installer/src/__tests__/performance-benchmark.js +0 -383
- package/packages/installer/tests/integration/environment-configuration.test.js +0 -332
- package/packages/installer/tests/integration/wizard-detection.test.js +0 -352
- package/packages/installer/tests/unit/artifact-copy-pipeline/artifact-copy-pipeline.test.js +0 -383
- package/packages/installer/tests/unit/claude-md-template-v5/claude-md-template-v5.test.js +0 -193
- package/packages/installer/tests/unit/config-validator.test.js +0 -315
- package/packages/installer/tests/unit/detection/detect-project-type.test.js +0 -539
- package/packages/installer/tests/unit/doctor/doctor-checks.test.js +0 -636
- package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +0 -192
- package/packages/installer/tests/unit/entity-registry-bootstrap.test.js +0 -186
- package/packages/installer/tests/unit/env-template.test.js +0 -187
- package/packages/installer/tests/unit/generate-settings-json/generate-settings-json.test.js +0 -310
- package/packages/installer/tests/unit/git-hooks-installer.test.js +0 -262
- package/packages/installer/tests/unit/ide-sync-integration/ide-sync-integration.test.js +0 -231
- package/packages/installer/tests/unit/merger/env-merger.test.js +0 -191
- package/packages/installer/tests/unit/merger/markdown-merger.test.js +0 -262
- package/packages/installer/tests/unit/merger/strategies.test.js +0 -154
- package/packages/installer/tests/unit/merger/yaml-merger.test.js +0 -328
- package/packages/sinapse-install/tests/unit/chrome-brain.smoke.test.js +0 -66
- package/scripts/install-monitor-hooks.sh +0 -82
- package/squads/squad-artdir/README.md +0 -90
- package/squads/squad-artdir/agents/accessibility-guardian.md +0 -184
- package/squads/squad-artdir/agents/artdir-orqx.md +0 -222
- package/squads/squad-artdir/agents/color-psychologist.md +0 -166
- package/squads/squad-artdir/agents/design-system-architect.md +0 -100
- package/squads/squad-artdir/agents/ia-architect.md +0 -169
- package/squads/squad-artdir/agents/interaction-designer.md +0 -162
- package/squads/squad-artdir/agents/layout-engineer.md +0 -163
- package/squads/squad-artdir/agents/motion-architect.md +0 -185
- package/squads/squad-artdir/agents/type-systemist.md +0 -138
- package/squads/squad-artdir/agents/visual-strategist.md +0 -127
- package/squads/squad-artdir/checklists/seven-pillars-validation-checklist.md +0 -172
- package/squads/squad-artdir/knowledge-base/case-nyo-ia-reference.md +0 -289
- package/squads/squad-artdir/knowledge-base/deliverables-templates.md +0 -457
- package/squads/squad-artdir/knowledge-base/motion-technique-catalog.md +0 -247
- package/squads/squad-artdir/knowledge-base/premium-packaging-principles.md +0 -133
- package/squads/squad-artdir/knowledge-base/psychological-toolkit.md +0 -229
- package/squads/squad-artdir/knowledge-base/saas-art-direction-canon.md +0 -242
- package/squads/squad-artdir/knowledge-base/seven-pillars-framework.md +0 -289
- package/squads/squad-artdir/knowledge-base/ten-pillars-framework.md +0 -221
- package/squads/squad-artdir/package.json +0 -20
- package/squads/squad-artdir/squad.yaml +0 -299
- package/squads/squad-artdir/tasks/audit-conversion.md +0 -97
- package/squads/squad-artdir/tasks/audit-drift-multi-surface.md +0 -55
- package/squads/squad-artdir/tasks/consult-saas-canon.md +0 -54
- package/squads/squad-artdir/tasks/create-art-direction-brief.md +0 -110
- package/squads/squad-artdir/tasks/create-premium-packaging-brief.md +0 -61
- package/squads/squad-artdir/tasks/create-wireflow.md +0 -84
- package/squads/squad-artdir/tasks/design-color-system.md +0 -81
- package/squads/squad-artdir/tasks/design-product-surface.md +0 -60
- package/squads/squad-artdir/tasks/design-token-system.md +0 -58
- package/squads/squad-artdir/tasks/diagnose-visual-language.md +0 -92
- package/squads/squad-artdir/tasks/first-5-minutes-choreography.md +0 -65
- package/squads/squad-artdir/tasks/specify-motion-system.md +0 -84
- package/squads/squad-artdir/tasks/validate-against-pillars.md +0 -143
- package/squads/squad-artdir/templates/art-direction-brief-template.md +0 -215
- package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +0 -142
- package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +0 -179
- package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +0 -338
- package/squads/squad-commercial/agents/legal-chief.md +0 -199
- package/squads/squad-copy/agents/copy-chief.md +0 -162
- package/squads/squad-cybersecurity/agents/cyber-chief.md +0 -169
- package/squads/squad-design/agents/design-chief.md +0 -226
- package/squads/squad-paidmedia/agents/traffic-masters-chief.md +0 -211
- package/squads/squad-research/agents/data-chief.md +0 -198
- package/squads/squad-storytelling/agents/story-chief.md +0 -180
|
@@ -320,14 +320,13 @@ function llmLabel(selectedLLM) {
|
|
|
320
320
|
}
|
|
321
321
|
|
|
322
322
|
/**
|
|
323
|
-
*
|
|
323
|
+
* 18 orqx agent definitions to install globally (17 squad orqx + 1 master).
|
|
324
324
|
* Each entry maps agent-id to its squad directory name.
|
|
325
325
|
*/
|
|
326
326
|
const GLOBAL_AGENTS = [
|
|
327
327
|
{ id: 'sinapse-orqx', squad: 'sinapse' },
|
|
328
328
|
{ id: 'animations-orqx', squad: 'squad-animations' },
|
|
329
329
|
{ id: 'brand-orqx', squad: 'squad-brand' },
|
|
330
|
-
{ id: 'claude-orqx', squad: 'squad-claude' },
|
|
331
330
|
{ id: 'cloning-orqx', squad: 'squad-cloning' },
|
|
332
331
|
{ id: 'commercial-orqx', squad: 'squad-commercial' },
|
|
333
332
|
{ id: 'content-orqx', squad: 'squad-content' },
|
|
@@ -342,7 +341,7 @@ const GLOBAL_AGENTS = [
|
|
|
342
341
|
{ id: 'product-orqx', squad: 'squad-product' },
|
|
343
342
|
{ id: 'research-orqx', squad: 'squad-research' },
|
|
344
343
|
{ id: 'storytelling-orqx', squad: 'squad-storytelling' },
|
|
345
|
-
{ id: 'swarm-orqx', squad: '
|
|
344
|
+
{ id: 'swarm-orqx', squad: 'claude-code-mastery' },
|
|
346
345
|
];
|
|
347
346
|
|
|
348
347
|
/**
|
|
@@ -381,7 +380,7 @@ function buildAgentTemplate(agentId, squadName, homedir) {
|
|
|
381
380
|
}
|
|
382
381
|
|
|
383
382
|
/**
|
|
384
|
-
* Install
|
|
383
|
+
* Install 18 global orqx agent definitions to ~/.claude/agents/
|
|
385
384
|
* Each file is a small markdown that points to the full agent definition
|
|
386
385
|
* inside the user's ~/.sinapse/{squad}/ directory.
|
|
387
386
|
*
|
|
@@ -433,6 +432,16 @@ async function installGlobalAgents() {
|
|
|
433
432
|
async function generateAgentsMd(targetDir = process.cwd()) {
|
|
434
433
|
const agentsPath = path.join(targetDir, 'AGENTS.md');
|
|
435
434
|
if (await fse.pathExists(agentsPath)) return false;
|
|
435
|
+
// Prefer the canonical, honest AGENTS.md shipped with the framework (single
|
|
436
|
+
// source of truth; its counts are verified against disk by validate:agents-md).
|
|
437
|
+
// Fall back to the minimal table only if the canonical copy is unavailable.
|
|
438
|
+
const canonicalAgentsMd = path.join(__dirname, '..', '..', '..', '..', 'AGENTS.md');
|
|
439
|
+
try {
|
|
440
|
+
if (await fse.pathExists(canonicalAgentsMd)) {
|
|
441
|
+
await fse.copy(canonicalAgentsMd, agentsPath);
|
|
442
|
+
return true;
|
|
443
|
+
}
|
|
444
|
+
} catch (_e) { /* fall through to minimal generation */ }
|
|
436
445
|
const lines = [
|
|
437
446
|
'# AGENTS.md', '', 'Universal agent reference for AI-powered development tools.', '',
|
|
438
447
|
'## Available Agents', '', '| Agent | Persona | Scope |', '|-------|---------|-------|',
|
|
@@ -536,6 +545,7 @@ async function runWizard(options = {}) {
|
|
|
536
545
|
try {
|
|
537
546
|
sinapseCoreResult = await installSinapseCore({
|
|
538
547
|
targetDir: process.cwd(),
|
|
548
|
+
includeCodex: (answers.selectedLLM || 'claude-code') !== 'claude-code',
|
|
539
549
|
onProgress: (_status) => {
|
|
540
550
|
// Silent progress - spinner handles feedback
|
|
541
551
|
},
|
|
@@ -787,6 +797,28 @@ async function runWizard(options = {}) {
|
|
|
787
797
|
process.chdir(savedCwd);
|
|
788
798
|
}
|
|
789
799
|
|
|
800
|
+
// Codex local-first sync: the ide-sync above drives claude-code only now,
|
|
801
|
+
// so .codex/agents + .codex/skills are regenerated here from the canonical
|
|
802
|
+
// source (the static .codex payload — scripts/tasks/JSONs — was already
|
|
803
|
+
// copied by installSinapseCore when Codex was selected). Codex installs only.
|
|
804
|
+
if (selectedLLM === 'codex' || selectedLLM === 'both') {
|
|
805
|
+
console.log('\n🔄 Running Codex local-first sync...');
|
|
806
|
+
const savedCwdCodex = process.cwd();
|
|
807
|
+
try {
|
|
808
|
+
const { syncCodexLocalFirst } = require('../../../../.sinapse-ai/infrastructure/scripts/sync-codex-local-first');
|
|
809
|
+
process.chdir(targetProjectRoot);
|
|
810
|
+
const codexResult = syncCodexLocalFirst({ projectRoot: targetProjectRoot, quiet: true });
|
|
811
|
+
answers.codexSyncStatus = codexResult.ok ? 'synced' : 'failed';
|
|
812
|
+
const m = codexResult.metrics || {};
|
|
813
|
+
console.log(`✅ Codex sync: ${codexResult.ok ? 'synced' : 'issues'} (${m.codexAgents || 0} agents, ${m.codexSkills || 0} skills)`);
|
|
814
|
+
} catch (codexErr) {
|
|
815
|
+
console.warn(`⚠️ Codex sync failed: ${codexErr.message} — run 'npm run sync:ide:codex' post-install`);
|
|
816
|
+
answers.codexSyncStatus = 'failed';
|
|
817
|
+
} finally {
|
|
818
|
+
process.chdir(savedCwdCodex);
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
|
|
790
822
|
// Story INS-4.6: Entity Registry Bootstrap — populate entity-registry.yaml on install
|
|
791
823
|
// Story INS-4.12: Fix module resolution + bootstrap timing
|
|
792
824
|
// Bootstrap runs AFTER .sinapse-ai deps are installed (sinapse-ai-installer.js:324-345)
|
|
@@ -1134,6 +1166,23 @@ async function runWizard(options = {}) {
|
|
|
1134
1166
|
}
|
|
1135
1167
|
}
|
|
1136
1168
|
|
|
1169
|
+
// Statusline feedback loop: install global statusline + agent trackers (Cluster D).
|
|
1170
|
+
// Graceful skip if the user already has a statusLine; idempotent on hooks.
|
|
1171
|
+
if (answers.selectedLLM === 'claude-code' || answers.selectedLLM === 'both') {
|
|
1172
|
+
try {
|
|
1173
|
+
const { setupStatusline } = require('../../../../bin/lib/setup-statusline');
|
|
1174
|
+
const sourceCoreDir = path.join(__dirname, '..', '..', '..', '..', '.sinapse-ai');
|
|
1175
|
+
const slResult = await setupStatusline({ sourceCoreDir });
|
|
1176
|
+
if (slResult.installed) {
|
|
1177
|
+
console.log('\n✅ Statusline configurada (agente/squad ao vivo).');
|
|
1178
|
+
}
|
|
1179
|
+
answers.statuslineInstalled = !!slResult.installed;
|
|
1180
|
+
} catch (_slErr) {
|
|
1181
|
+
// Non-critical — statusline is observability, never blocks install.
|
|
1182
|
+
answers.statuslineInstalled = false;
|
|
1183
|
+
}
|
|
1184
|
+
}
|
|
1185
|
+
|
|
1137
1186
|
// Generate AGENTS.md at project root (universal format for Claude Code + Codex)
|
|
1138
1187
|
try {
|
|
1139
1188
|
const agentsCreated = await generateAgentsMd(process.cwd());
|
|
File without changes
|
|
File without changes
|
package/scripts/audit-tasks.cjs
CHANGED
|
@@ -1,10 +1,19 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* SINAPSE Task Audit Script
|
|
3
|
-
* Audits
|
|
3
|
+
* Audits task markdown files for structural completeness across the whole framework.
|
|
4
|
+
*
|
|
5
|
+
* Scope: squad tasks (squads/<name>/tasks), the framework core tasks
|
|
6
|
+
* (.sinapse-ai/development/tasks) and the master-squad tasks (sinapse/tasks).
|
|
7
|
+
*
|
|
8
|
+
* The checks are FORMAT-AGNOSTIC: a task is credited for a trait whether it is
|
|
9
|
+
* declared in YAML frontmatter OR in a markdown section (## Metadata,
|
|
10
|
+
* ## Task Definition, ## Inputs, ## Steps, etc.). This measures real completeness
|
|
11
|
+
* instead of conformance to one rigid template — which is what produced thousands
|
|
12
|
+
* of false "critical" flags before.
|
|
4
13
|
*
|
|
5
14
|
* Usage: node scripts/audit-tasks.cjs [--fix] [--json]
|
|
6
|
-
* --fix Add basic frontmatter to tasks missing
|
|
7
|
-
* --json Output raw JSON instead of summary
|
|
15
|
+
* --fix Add basic frontmatter to tasks missing any structured header
|
|
16
|
+
* --json Output raw JSON instead of the summary
|
|
8
17
|
*/
|
|
9
18
|
|
|
10
19
|
const fs = require('fs');
|
|
@@ -12,34 +21,63 @@ const path = require('path');
|
|
|
12
21
|
const { glob } = require('glob');
|
|
13
22
|
|
|
14
23
|
const ROOT = path.resolve(__dirname, '..');
|
|
15
|
-
const SQUADS_DIR = path.join(ROOT, 'squads');
|
|
16
24
|
const FIX_MODE = process.argv.includes('--fix');
|
|
17
25
|
const JSON_MODE = process.argv.includes('--json');
|
|
18
26
|
|
|
19
|
-
//
|
|
27
|
+
// Task sources scanned, in order. Paths are relative to ROOT.
|
|
28
|
+
const SOURCE_PATTERNS = [
|
|
29
|
+
'squads/*/tasks/*.md',
|
|
30
|
+
'.sinapse-ai/development/tasks/*.md',
|
|
31
|
+
'sinapse/tasks/*.md',
|
|
32
|
+
];
|
|
33
|
+
|
|
34
|
+
// ── Scoring weights (sum = 100) ──────────────────────────────────
|
|
20
35
|
const CHECKS = [
|
|
21
|
-
{ id: '
|
|
22
|
-
{ id: '
|
|
23
|
-
{ id: 'has_responsavel', weight: 10, label: '
|
|
24
|
-
{ id: 'has_entrada', weight: 10, label: '
|
|
25
|
-
{ id: 'has_saida', weight: 10, label: '
|
|
26
|
-
{ id: 'has_title', weight: 10, label: 'Has #
|
|
27
|
-
{ id: 'has_steps', weight:
|
|
28
|
-
{ id: 'has_metadata', weight: 5, label: 'Has ## Metadata section' },
|
|
36
|
+
{ id: 'has_header', weight: 20, label: 'Structured header (frontmatter OR ## Metadata / ## Task Definition)' },
|
|
37
|
+
{ id: 'has_identity', weight: 10, label: 'Identifiable (task/id/name field OR # title)' },
|
|
38
|
+
{ id: 'has_responsavel', weight: 10, label: 'Owner declared (responsavel/agent field OR ## Agent / ## Owner)' },
|
|
39
|
+
{ id: 'has_entrada', weight: 10, label: 'Inputs declared (field OR ## Input / ## Entrada / ## Context)' },
|
|
40
|
+
{ id: 'has_saida', weight: 10, label: 'Outputs declared (field OR ## Output / ## Saida / ## Acceptance)' },
|
|
41
|
+
{ id: 'has_title', weight: 10, label: 'Has # title' },
|
|
42
|
+
{ id: 'has_steps', weight: 20, label: 'Has a process (## Steps/Process/Workflow/... OR numbered steps)' },
|
|
29
43
|
{ id: 'min_content_length', weight: 10, label: 'Content >= 200 chars' },
|
|
30
44
|
];
|
|
31
45
|
|
|
32
46
|
const MAX_SCORE = CHECKS.reduce((s, c) => s + c.weight, 0);
|
|
33
47
|
|
|
34
|
-
// ──
|
|
48
|
+
// ── Detection helpers ────────────────────────────────────────────
|
|
35
49
|
function parseFrontmatter(content) {
|
|
36
50
|
const match = content.match(/^---\r?\n([\s\S]*?)\r?\n---/);
|
|
37
|
-
|
|
38
|
-
|
|
51
|
+
return match ? match[1] : null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// True if the body has a `## Heading` whose text starts with one of `names`.
|
|
55
|
+
function hasSection(body, names) {
|
|
56
|
+
const re = new RegExp('^#{2,4}\\s+(' + names.join('|') + ')(?:\\b|\\s|:|$)', 'mi');
|
|
57
|
+
return re.test(body);
|
|
39
58
|
}
|
|
40
59
|
|
|
60
|
+
// True if the frontmatter declares one of `fields` as a key.
|
|
61
|
+
function fmHas(fm, fields) {
|
|
62
|
+
if (!fm) return false;
|
|
63
|
+
const re = new RegExp('^\\s*(' + fields.join('|') + ')\\s*:', 'mi');
|
|
64
|
+
return re.test(fm);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// True if the body contains a numbered procedure of at least 3 steps.
|
|
68
|
+
function hasNumberedSteps(body) {
|
|
69
|
+
const m = body.match(/^\s*\d+[.)]\s+\S/gm);
|
|
70
|
+
return !!m && m.length >= 3;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const METADATA_SECTIONS = ['Metadata', 'Task Definition', 'Definição', 'Overview', 'Visão Geral'];
|
|
74
|
+
const OWNER_SECTIONS = ['Agent', 'Owner', 'Responsável', 'Responsible', 'Persona', 'Executor'];
|
|
75
|
+
const INPUT_SECTIONS = ['Input', 'Inputs', 'Entrada', 'Entradas', 'Context', 'Contexto', 'Prerequisites', 'Pré-requisitos', 'Pre-requisitos'];
|
|
76
|
+
const OUTPUT_SECTIONS = ['Output', 'Outputs', 'Saída', 'Saida', 'Saídas', 'Saidas', 'Deliverable', 'Deliverables', 'Result', 'Results', 'Acceptance', 'Critérios', 'Criterios'];
|
|
77
|
+
const STEP_SECTIONS = ['Steps', 'Step', 'Description', 'Etapas', 'Process', 'Processo', 'Workflow', 'Execution', 'Execução', 'Instructions', 'Instruções', 'Procedure', 'Activities', 'Activity', 'Phases', 'Fases', 'Fluxo', 'How', 'Como', 'Task Definition'];
|
|
78
|
+
|
|
41
79
|
// ── Audit a single file ──────────────────────────────────────────
|
|
42
|
-
function auditFile(filePath) {
|
|
80
|
+
function auditFile(filePath, group) {
|
|
43
81
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
44
82
|
const filename = path.basename(filePath, '.md');
|
|
45
83
|
const fm = parseFrontmatter(content);
|
|
@@ -48,57 +86,43 @@ function auditFile(filePath) {
|
|
|
48
86
|
const results = {};
|
|
49
87
|
const issues = [];
|
|
50
88
|
|
|
51
|
-
|
|
52
|
-
results.
|
|
53
|
-
if (!fm) issues.push('Missing frontmatter entirely');
|
|
89
|
+
results.has_title = /^#\s+\S/m.test(body);
|
|
90
|
+
if (!results.has_title) issues.push('No # title');
|
|
54
91
|
|
|
55
|
-
|
|
56
|
-
results.
|
|
57
|
-
if (!results.has_task_field && fm) issues.push('Missing task: field in frontmatter');
|
|
92
|
+
results.has_header = !!fm || hasSection(body, METADATA_SECTIONS);
|
|
93
|
+
if (!results.has_header) issues.push('No structured header (frontmatter or Metadata/Task Definition section)');
|
|
58
94
|
|
|
59
|
-
|
|
60
|
-
results.
|
|
61
|
-
if (!results.has_responsavel && fm) issues.push('Missing responsavel/responsible field');
|
|
95
|
+
results.has_identity = fmHas(fm, ['task', 'id', 'name', 'slug', 'title']) || results.has_title;
|
|
96
|
+
if (!results.has_identity) issues.push('Not identifiable (no task/id/name field and no title)');
|
|
62
97
|
|
|
63
|
-
|
|
64
|
-
results.
|
|
65
|
-
if (!results.has_entrada && fm) issues.push('Missing Entrada/input section');
|
|
98
|
+
results.has_responsavel = fmHas(fm, ['responsavel', 'responsável', 'responsible', 'agent', 'owner', 'persona', 'executor']) || hasSection(body, OWNER_SECTIONS);
|
|
99
|
+
if (!results.has_responsavel) issues.push('No owner/agent declared');
|
|
66
100
|
|
|
67
|
-
|
|
68
|
-
results.
|
|
69
|
-
if (!results.has_saida && fm) issues.push('Missing Saida/output section');
|
|
101
|
+
results.has_entrada = fmHas(fm, ['entrada', 'entradas', 'input', 'inputs', 'context', 'contexto', 'prerequisites']) || hasSection(body, INPUT_SECTIONS);
|
|
102
|
+
if (!results.has_entrada) issues.push('No inputs declared');
|
|
70
103
|
|
|
71
|
-
|
|
72
|
-
results.
|
|
73
|
-
if (!results.has_title) issues.push('Missing # title in body');
|
|
104
|
+
results.has_saida = fmHas(fm, ['saida', 'saída', 'saidas', 'output', 'outputs', 'deliverable', 'result', 'acceptance']) || hasSection(body, OUTPUT_SECTIONS);
|
|
105
|
+
if (!results.has_saida) issues.push('No outputs/acceptance declared');
|
|
74
106
|
|
|
75
|
-
|
|
76
|
-
results.has_steps
|
|
77
|
-
if (!results.has_steps) issues.push('Missing ## Steps or ## Description');
|
|
107
|
+
results.has_steps = hasSection(body, STEP_SECTIONS) || hasNumberedSteps(body);
|
|
108
|
+
if (!results.has_steps) issues.push('No process (steps/workflow/numbered procedure)');
|
|
78
109
|
|
|
79
|
-
// 8. Metadata
|
|
80
|
-
results.has_metadata = /^##\s+Metadata/mi.test(body);
|
|
81
|
-
if (!results.has_metadata) issues.push('Missing ## Metadata section');
|
|
82
|
-
|
|
83
|
-
// 9. Content length
|
|
84
110
|
results.min_content_length = content.length >= 200;
|
|
85
111
|
if (!results.min_content_length) issues.push(`Content too short (${content.length} chars)`);
|
|
86
112
|
|
|
87
|
-
// Score
|
|
88
113
|
let score = 0;
|
|
89
114
|
for (const check of CHECKS) {
|
|
90
115
|
if (results[check.id]) score += check.weight;
|
|
91
116
|
}
|
|
92
117
|
const pct = Math.round((score / MAX_SCORE) * 100);
|
|
93
118
|
|
|
94
|
-
return { file: filename, path: filePath, score: pct, results, issues };
|
|
119
|
+
return { file: filename, path: filePath, group, score: pct, results, issues };
|
|
95
120
|
}
|
|
96
121
|
|
|
97
|
-
// ── Fix: add frontmatter to files
|
|
122
|
+
// ── Fix: add a minimal frontmatter to files lacking any header ────
|
|
98
123
|
function fixFrontmatter(filePath) {
|
|
99
124
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
100
125
|
const filename = path.basename(filePath, '.md');
|
|
101
|
-
|
|
102
126
|
const frontmatter = [
|
|
103
127
|
'---',
|
|
104
128
|
`task: ${filename}`,
|
|
@@ -108,56 +132,64 @@ function fixFrontmatter(filePath) {
|
|
|
108
132
|
'---',
|
|
109
133
|
'',
|
|
110
134
|
].join('\n');
|
|
111
|
-
|
|
112
135
|
fs.writeFileSync(filePath, frontmatter + content, 'utf-8');
|
|
113
|
-
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// ── Group a file by its source location ──────────────────────────
|
|
139
|
+
function groupFor(absPath) {
|
|
140
|
+
const rel = path.relative(ROOT, absPath).replace(/\\/g, '/');
|
|
141
|
+
if (rel.startsWith('squads/')) return rel.split('/')[1];
|
|
142
|
+
if (rel.startsWith('.sinapse-ai/development/tasks/')) return 'core/development';
|
|
143
|
+
if (rel.startsWith('sinapse/tasks/')) return 'sinapse-master';
|
|
144
|
+
return rel.split('/')[0];
|
|
114
145
|
}
|
|
115
146
|
|
|
116
147
|
// ── Main ─────────────────────────────────────────────────────────
|
|
117
148
|
async function main() {
|
|
118
|
-
|
|
119
|
-
const
|
|
149
|
+
let files = [];
|
|
150
|
+
for (const pattern of SOURCE_PATTERNS) {
|
|
151
|
+
const matched = await glob(pattern, { cwd: ROOT, absolute: true });
|
|
152
|
+
files = files.concat(matched);
|
|
153
|
+
}
|
|
154
|
+
// De-dupe (defensive) and sort for stable output.
|
|
155
|
+
files = Array.from(new Set(files)).sort();
|
|
120
156
|
|
|
121
157
|
if (files.length === 0) {
|
|
122
158
|
console.error('No task files found.');
|
|
123
159
|
process.exit(1);
|
|
124
160
|
}
|
|
125
161
|
|
|
126
|
-
const
|
|
162
|
+
const groupMap = {};
|
|
127
163
|
const allResults = [];
|
|
128
164
|
let fixedCount = 0;
|
|
129
165
|
|
|
130
166
|
for (const filePath of files) {
|
|
131
|
-
const
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if (!squadMap[squadName]) {
|
|
135
|
-
squadMap[squadName] = { tasks: [], totalScore: 0, issues: [] };
|
|
136
|
-
}
|
|
167
|
+
const group = groupFor(filePath);
|
|
168
|
+
if (!groupMap[group]) groupMap[group] = { tasks: [], totalScore: 0 };
|
|
137
169
|
|
|
138
|
-
// Fix mode: add frontmatter before auditing
|
|
139
170
|
if (FIX_MODE) {
|
|
140
171
|
const content = fs.readFileSync(filePath, 'utf-8');
|
|
141
|
-
|
|
172
|
+
const fm = parseFrontmatter(content);
|
|
173
|
+
if (!fm && !hasSection(content, METADATA_SECTIONS)) {
|
|
142
174
|
fixFrontmatter(filePath);
|
|
143
175
|
fixedCount++;
|
|
144
176
|
}
|
|
145
177
|
}
|
|
146
178
|
|
|
147
|
-
const result = auditFile(filePath);
|
|
148
|
-
|
|
149
|
-
|
|
179
|
+
const result = auditFile(filePath, group);
|
|
180
|
+
groupMap[group].tasks.push(result);
|
|
181
|
+
groupMap[group].totalScore += result.score;
|
|
150
182
|
allResults.push(result);
|
|
151
183
|
}
|
|
152
184
|
|
|
153
185
|
// ── Build report ───────────────────────────────────────────────
|
|
154
|
-
const
|
|
155
|
-
for (const [name, data] of Object.entries(
|
|
186
|
+
const groupSummaries = [];
|
|
187
|
+
for (const [name, data] of Object.entries(groupMap).sort((a, b) => a[0].localeCompare(b[0]))) {
|
|
156
188
|
const avg = Math.round(data.totalScore / data.tasks.length);
|
|
157
189
|
const critical = data.tasks.filter(t => t.score < 50).length;
|
|
158
190
|
const warning = data.tasks.filter(t => t.score >= 50 && t.score < 70).length;
|
|
159
|
-
|
|
160
|
-
|
|
191
|
+
groupSummaries.push({
|
|
192
|
+
group: name,
|
|
161
193
|
taskCount: data.tasks.length,
|
|
162
194
|
avgScore: avg,
|
|
163
195
|
critical,
|
|
@@ -166,12 +198,9 @@ async function main() {
|
|
|
166
198
|
});
|
|
167
199
|
}
|
|
168
200
|
|
|
169
|
-
// Issue frequency
|
|
170
201
|
const issueFreq = {};
|
|
171
202
|
for (const r of allResults) {
|
|
172
|
-
for (const iss of r.issues)
|
|
173
|
-
issueFreq[iss] = (issueFreq[iss] || 0) + 1;
|
|
174
|
-
}
|
|
203
|
+
for (const iss of r.issues) issueFreq[iss] = (issueFreq[iss] || 0) + 1;
|
|
175
204
|
}
|
|
176
205
|
const commonIssues = Object.entries(issueFreq)
|
|
177
206
|
.sort((a, b) => b[1] - a[1])
|
|
@@ -183,42 +212,36 @@ async function main() {
|
|
|
183
212
|
const report = {
|
|
184
213
|
summary: {
|
|
185
214
|
totalFiles: allResults.length,
|
|
186
|
-
|
|
215
|
+
totalGroups: groupSummaries.length,
|
|
187
216
|
overallAvgScore: overallAvg,
|
|
188
217
|
passingFiles: allResults.filter(r => r.score >= 70).length,
|
|
189
218
|
warningFiles: allResults.filter(r => r.score >= 50 && r.score < 70).length,
|
|
190
219
|
criticalFiles: allResults.filter(r => r.score < 50).length,
|
|
191
220
|
fixedInThisRun: fixedCount,
|
|
192
221
|
},
|
|
193
|
-
|
|
222
|
+
groupSummaries,
|
|
194
223
|
commonIssues,
|
|
195
|
-
problemFiles: problemFiles.map(f => ({
|
|
196
|
-
file: f.file,
|
|
197
|
-
squad: path.relative(SQUADS_DIR, f.path).split(/[/\\]/)[0],
|
|
198
|
-
score: f.score,
|
|
199
|
-
issues: f.issues,
|
|
200
|
-
})),
|
|
224
|
+
problemFiles: problemFiles.map(f => ({ file: f.file, group: f.group, score: f.score, issues: f.issues })),
|
|
201
225
|
};
|
|
202
226
|
|
|
203
227
|
if (JSON_MODE) {
|
|
204
228
|
console.log(JSON.stringify(report, null, 2));
|
|
205
229
|
} else {
|
|
206
|
-
// Human-readable output
|
|
207
230
|
console.log('\n=== SINAPSE Task Audit Report ===\n');
|
|
208
231
|
console.log(`Total files: ${report.summary.totalFiles}`);
|
|
209
|
-
console.log(`Total
|
|
232
|
+
console.log(`Total groups: ${report.summary.totalGroups}`);
|
|
210
233
|
console.log(`Overall avg score: ${report.summary.overallAvgScore}%`);
|
|
211
234
|
console.log(`Passing (>=70): ${report.summary.passingFiles}`);
|
|
212
235
|
console.log(`Warning (50-69): ${report.summary.warningFiles}`);
|
|
213
236
|
console.log(`Critical (<50): ${report.summary.criticalFiles}`);
|
|
214
237
|
if (fixedCount > 0) console.log(`Fixed (frontmatter added): ${fixedCount}`);
|
|
215
238
|
|
|
216
|
-
console.log('\n---
|
|
217
|
-
console.log('
|
|
239
|
+
console.log('\n--- Group Summary ---\n');
|
|
240
|
+
console.log('Group'.padEnd(30) + 'Tasks'.padEnd(8) + 'Avg'.padEnd(6) + 'Crit'.padEnd(6) + 'Warn'.padEnd(6) + 'Pass');
|
|
218
241
|
console.log('-'.repeat(62));
|
|
219
|
-
for (const s of
|
|
242
|
+
for (const s of groupSummaries) {
|
|
220
243
|
console.log(
|
|
221
|
-
s.
|
|
244
|
+
s.group.padEnd(30) +
|
|
222
245
|
String(s.taskCount).padEnd(8) +
|
|
223
246
|
`${s.avgScore}%`.padEnd(6) +
|
|
224
247
|
String(s.critical).padEnd(6) +
|
|
@@ -235,17 +258,15 @@ async function main() {
|
|
|
235
258
|
if (problemFiles.length > 0) {
|
|
236
259
|
console.log(`\n--- Problem Files (score < 70): ${problemFiles.length} files ---\n`);
|
|
237
260
|
for (const f of problemFiles.slice(0, 50)) {
|
|
238
|
-
|
|
239
|
-
console.log(` [${f.score}%] ${squad}/${f.file}: ${f.issues.join('; ')}`);
|
|
240
|
-
}
|
|
241
|
-
if (problemFiles.length > 50) {
|
|
242
|
-
console.log(` ... and ${problemFiles.length - 50} more`);
|
|
261
|
+
console.log(` [${f.score}%] ${f.group}/${f.file}: ${f.issues.join('; ')}`);
|
|
243
262
|
}
|
|
263
|
+
if (problemFiles.length > 50) console.log(` ... and ${problemFiles.length - 50} more`);
|
|
244
264
|
}
|
|
245
265
|
}
|
|
246
266
|
|
|
247
|
-
// Write JSON
|
|
267
|
+
// Write JSON report (create the directory first — this used to crash with ENOENT).
|
|
248
268
|
const jsonPath = path.join(ROOT, 'docs', 'reports', '9.3-task-audit.json');
|
|
269
|
+
fs.mkdirSync(path.dirname(jsonPath), { recursive: true });
|
|
249
270
|
fs.writeFileSync(jsonPath, JSON.stringify(report, null, 2), 'utf-8');
|
|
250
271
|
console.log(`\nJSON saved to: ${jsonPath}`);
|
|
251
272
|
}
|