@jaimevalasek/aioson 1.8.0 → 1.9.0
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/CHANGELOG.md +595 -595
- package/CODE_OF_CONDUCT.md +12 -12
- package/CONTRIBUTING.md +13 -13
- package/LICENSE +661 -661
- package/README.md +919 -919
- package/bin/aioson.js +4 -4
- package/docs/design-previews/aurora-command-ui-website.html +884 -884
- package/docs/design-previews/aurora-command-ui.html +682 -682
- package/docs/design-previews/bold-editorial-ui-website.html +658 -658
- package/docs/design-previews/bold-editorial-ui.html +717 -717
- package/docs/design-previews/clean-saas-ui-website.html +1202 -1202
- package/docs/design-previews/clean-saas-ui.html +549 -549
- package/docs/design-previews/cognitive-core-ui-website.html +1009 -1009
- package/docs/design-previews/cognitive-core-ui.html +463 -463
- package/docs/design-previews/glassmorphism-ui-website.html +572 -572
- package/docs/design-previews/glassmorphism-ui.html +886 -886
- package/docs/design-previews/index.html +699 -699
- package/docs/design-previews/interface-design-website.html +1187 -1187
- package/docs/design-previews/interface-design.html +513 -513
- package/docs/design-previews/neo-brutalist-ui-website.html +621 -621
- package/docs/design-previews/neo-brutalist-ui.html +797 -797
- package/docs/design-previews/premium-command-center-ui-website.html +1217 -1217
- package/docs/design-previews/premium-command-center-ui.html +552 -552
- package/docs/design-previews/pt.squarespace.com-homepage.html +889 -889
- package/docs/design-previews/warm-craft-ui-website.html +684 -684
- package/docs/design-previews/warm-craft-ui.html +739 -739
- package/docs/en/1-understand/ecosystem-map.md +228 -0
- package/docs/en/1-understand/glossary.md +288 -0
- package/docs/en/1-understand/what-is-aioson.md +94 -0
- package/docs/en/1-understand/why-it-exists.md +106 -0
- package/docs/en/2-start/existing-project.md +246 -0
- package/docs/en/2-start/first-project.md +307 -0
- package/docs/en/2-start/initial-decisions.md +223 -0
- package/docs/en/3-recipes/README.md +28 -0
- package/docs/en/3-recipes/continuity-between-sessions.md +303 -0
- package/docs/en/3-recipes/from-idea-to-prd-via-briefing.md +235 -0
- package/docs/en/3-recipes/full-feature-with-sheldon.md +338 -0
- package/docs/en/4-agents/README.md +56 -0
- package/docs/en/5-reference/README.md +60 -0
- package/docs/en/{cli-reference.md → 5-reference/cli-reference.md} +639 -464
- package/docs/en/{i18n.md → 5-reference/i18n.md} +52 -52
- package/docs/en/{json-schemas.md → 5-reference/json-schemas.md} +41 -41
- package/docs/en/{mcp.md → 5-reference/mcp.md} +56 -56
- package/docs/en/{parallel.md → 5-reference/parallel.md} +82 -82
- package/docs/en/{qa-browser.md → 5-reference/qa-browser.md} +339 -339
- package/docs/en/{release-flow.md → 5-reference/release-flow.md} +22 -22
- package/docs/en/{release-notes-template.md → 5-reference/release-notes-template.md} +41 -41
- package/docs/en/{release.md → 5-reference/release.md} +28 -28
- package/docs/en/{schemas → 5-reference/schemas}/agent-prompt.schema.json +17 -17
- package/docs/en/{schemas → 5-reference/schemas}/agents.schema.json +32 -32
- package/docs/en/{schemas → 5-reference/schemas}/context-validate.schema.json +36 -36
- package/docs/en/{schemas → 5-reference/schemas}/doctor.schema.json +89 -89
- package/docs/en/{schemas → 5-reference/schemas}/error.schema.json +24 -24
- package/docs/en/{schemas → 5-reference/schemas}/i18n-add.schema.json +15 -15
- package/docs/en/{schemas → 5-reference/schemas}/index.json +126 -126
- package/docs/en/{schemas → 5-reference/schemas}/info.schema.json +39 -39
- package/docs/en/{schemas → 5-reference/schemas}/init.schema.json +48 -48
- package/docs/en/{schemas → 5-reference/schemas}/install.schema.json +60 -60
- package/docs/en/{schemas → 5-reference/schemas}/locale-apply.schema.json +30 -30
- package/docs/en/{schemas → 5-reference/schemas}/mcp-doctor.schema.json +95 -95
- package/docs/en/{schemas → 5-reference/schemas}/mcp-init.schema.json +122 -122
- package/docs/en/{schemas → 5-reference/schemas}/package-test.schema.json +24 -24
- package/docs/en/{schemas → 5-reference/schemas}/parallel-assign.schema.json +66 -66
- package/docs/en/{schemas → 5-reference/schemas}/parallel-doctor.schema.json +122 -122
- package/docs/en/{schemas → 5-reference/schemas}/parallel-guard.schema.json +63 -63
- package/docs/en/{schemas → 5-reference/schemas}/parallel-init.schema.json +53 -53
- package/docs/en/{schemas → 5-reference/schemas}/parallel-merge.schema.json +84 -84
- package/docs/en/{schemas → 5-reference/schemas}/parallel-status.schema.json +184 -184
- package/docs/en/{schemas → 5-reference/schemas}/setup-context.schema.json +39 -39
- package/docs/en/{schemas → 5-reference/schemas}/smoke.schema.json +23 -23
- package/docs/en/{schemas → 5-reference/schemas}/update.schema.json +48 -48
- package/docs/en/{schemas → 5-reference/schemas}/workflow-plan.schema.json +30 -30
- package/docs/en/{squad-dashboard.md → 5-reference/squad-dashboard.md} +372 -372
- package/docs/en/{web3.md → 5-reference/web3.md} +54 -54
- package/docs/en/README.md +115 -0
- package/docs/en/active-learning-loop/README.md +117 -0
- package/docs/en/active-learning-loop/active-learning-loop.md +117 -0
- package/docs/en/active-learning-loop/cli-commands.md +320 -0
- package/docs/en/active-learning-loop/diagrams.md +225 -0
- package/docs/en/active-learning-loop/doctor-checks.md +151 -0
- package/docs/en/active-learning-loop/how-to-use.md +313 -0
- package/docs/en/active-learning-loop/troubleshooting.md +283 -0
- package/docs/en/deyvin-subtask-scout/README.md +109 -0
- package/docs/en/deyvin-subtask-scout/cli-commands.md +248 -0
- package/docs/en/deyvin-subtask-scout/diagrams.md +124 -0
- package/docs/en/deyvin-subtask-scout/how-to-use.md +221 -0
- package/docs/en/deyvin-subtask-scout/sub-task-scout.md +115 -0
- package/docs/en/deyvin-subtask-scout/troubleshooting.md +184 -0
- package/docs/integrations/apps-publish-marketplace.md +94 -94
- package/docs/integrations/sdlc-genius-boundary.md +76 -76
- package/docs/integrations/sdlc-genius-eval-matrix.md +75 -75
- package/docs/integrations/sdlc-genius-install-checklist.md +93 -93
- package/docs/integrations/sdlc-genius-review-samples.md +86 -86
- package/docs/openclaw-bridge.md +308 -308
- package/docs/pt/1-entender/glossario.md +288 -0
- package/docs/pt/1-entender/mapa-do-ecossistema.md +228 -0
- package/docs/pt/1-entender/o-que-e-aioson.md +94 -0
- package/docs/pt/1-entender/por-que-existe.md +107 -0
- package/docs/pt/2-comecar/decisoes-iniciais.md +223 -0
- package/docs/pt/2-comecar/primeiro-projeto.md +307 -0
- package/docs/pt/2-comecar/projeto-existente.md +245 -0
- package/docs/pt/3-receitas/README.md +28 -0
- package/docs/pt/3-receitas/app-saas-do-zero.md +324 -0
- package/docs/pt/3-receitas/auditoria-seguranca.md +254 -0
- package/docs/pt/3-receitas/clonar-design-de-site.md +211 -0
- package/docs/pt/3-receitas/continuidade-entre-sessoes.md +303 -0
- package/docs/pt/3-receitas/da-ideia-ao-prd-via-briefing.md +234 -0
- package/docs/pt/3-receitas/feature-completa-com-sheldon.md +338 -0
- package/docs/pt/3-receitas/integracao-em-codebase-grande.md +243 -0
- package/docs/pt/3-receitas/landing-page.md +281 -0
- package/docs/pt/3-receitas/plans-externos-para-product.md +191 -0
- package/docs/pt/3-receitas/publicar-no-aioson-com.md +219 -0
- package/docs/pt/3-receitas/refatoracao-grande.md +251 -0
- package/docs/pt/4-agentes/README.md +65 -0
- package/docs/pt/4-agentes/analyst.md +111 -0
- package/docs/pt/4-agentes/architect.md +113 -0
- package/docs/pt/4-agentes/briefing.md +95 -0
- package/docs/pt/4-agentes/committer.md +108 -0
- package/docs/pt/4-agentes/copywriter.md +279 -0
- package/docs/pt/4-agentes/design-hybrid-forge.md +116 -0
- package/docs/pt/4-agentes/dev.md +136 -0
- package/docs/pt/4-agentes/deyvin.md +99 -0
- package/docs/pt/4-agentes/discover.md +122 -0
- package/docs/pt/4-agentes/discovery-design-doc.md +91 -0
- package/docs/pt/4-agentes/genome.md +115 -0
- package/docs/pt/4-agentes/neo.md +93 -0
- package/docs/pt/4-agentes/orache.md +107 -0
- package/docs/pt/4-agentes/orchestrator.md +118 -0
- package/docs/pt/4-agentes/pentester.md +131 -0
- package/docs/pt/4-agentes/pm.md +97 -0
- package/docs/pt/4-agentes/product.md +114 -0
- package/docs/pt/4-agentes/profiler-enricher.md +93 -0
- package/docs/pt/4-agentes/profiler-forge.md +93 -0
- package/docs/pt/4-agentes/profiler-researcher.md +98 -0
- package/docs/pt/4-agentes/qa.md +124 -0
- package/docs/pt/4-agentes/setup.md +104 -0
- package/docs/pt/4-agentes/sheldon.md +95 -0
- package/docs/pt/4-agentes/site-forge.md +104 -0
- package/docs/pt/4-agentes/squad.md +127 -0
- package/docs/pt/4-agentes/tester.md +105 -0
- package/docs/pt/4-agentes/ux-ui.md +110 -0
- package/docs/pt/4-agentes/validator.md +118 -0
- package/docs/pt/5-referencia/README.md +88 -0
- package/docs/pt/5-referencia/agent-chain-continuity.md +124 -0
- package/docs/pt/{agent-sharding.md → 5-referencia/agent-sharding.md} +132 -132
- package/docs/pt/5-referencia/aioson-com-store.md +119 -0
- package/docs/pt/{automacao-squads.md → 5-referencia/automacao-squads.md} +407 -407
- package/docs/pt/{clientes-ai.md → 5-referencia/clientes-ai.md} +300 -290
- package/docs/pt/{comandos-cli.md → 5-referencia/comandos-cli.md} +1823 -1781
- package/docs/pt/{compress-agents.md → 5-referencia/compress-agents.md} +304 -304
- package/docs/pt/{design-docs-governance.md → 5-referencia/design-docs-governance.md} +59 -59
- package/docs/pt/{devlog-pipeline.md → 5-referencia/devlog-pipeline.md} +270 -270
- package/docs/pt/{feature-archive.md → 5-referencia/feature-archive.md} +199 -191
- package/docs/pt/5-referencia/feature-dossier.md +121 -0
- package/docs/pt/{fluxo-artefatos.md → 5-referencia/fluxo-artefatos.md} +179 -178
- package/docs/pt/{genome-3.0-spec.md → 5-referencia/genome-4.0-spec.md} +407 -407
- package/docs/pt/{genome-distribution.md → 5-referencia/genome-distribution.md} +232 -232
- package/docs/pt/{hooks-session-guard.md → 5-referencia/hooks-session-guard.md} +454 -454
- package/docs/pt/{inteligencia-adaptativa.md → 5-referencia/inteligencia-adaptativa.md} +324 -324
- package/docs/pt/5-referencia/live-sessions.md +144 -0
- package/docs/pt/5-referencia/memoria-e-contexto.md +340 -0
- package/docs/pt/{motor-hardening.md → 5-referencia/motor-hardening.md} +493 -492
- package/docs/pt/{output-strategy-delivery.md → 5-referencia/output-strategy-delivery.md} +655 -655
- package/docs/pt/{runner-system.md → 5-referencia/runner-system.md} +113 -113
- package/docs/pt/{runtime-observability.md → 5-referencia/runtime-observability.md} +76 -76
- package/docs/pt/{sandbox.md → 5-referencia/sandbox.md} +125 -125
- package/docs/pt/{sdd-automation-scripts.md → 5-referencia/sdd-automation-scripts.md} +559 -557
- package/docs/pt/5-referencia/sdd-framework.md +115 -0
- package/docs/pt/5-referencia/sdd-planos-e-estrutura.md +321 -0
- package/docs/pt/5-referencia/secure-by-default.md +117 -0
- package/docs/pt/{skills.md → 5-referencia/skills.md} +275 -267
- package/docs/pt/{spec-learnings-pipeline.md → 5-referencia/spec-learnings-pipeline.md} +265 -265
- package/docs/pt/{squad-dashboard.md → 5-referencia/squad-dashboard.md} +373 -373
- package/docs/pt/{web3.md → 5-referencia/web3.md} +797 -797
- package/docs/pt/README.md +111 -125
- package/docs/pt/_arquivo/README.md +130 -0
- package/docs/pt/{advisor-spec.md → _arquivo/advisor-spec.md} +343 -335
- package/docs/pt/{agentes-customizados.md → _arquivo/agentes-customizados.md} +678 -670
- package/docs/pt/{busca-de-contexto.md → _arquivo/busca-de-contexto.md} +136 -129
- package/docs/pt/{cache-de-contexto.md → _arquivo/cache-de-contexto.md} +163 -156
- package/docs/pt/{cenarios.md → _arquivo/cenarios.md} +1282 -1274
- package/docs/pt/{design-hybrid-forge.md → _arquivo/design-hybrid-forge.md} +365 -356
- package/docs/pt/{deyvin.md → _arquivo/deyvin.md} +123 -115
- package/docs/pt/{guia-engineer.md → _arquivo/guia-engineer.md} +234 -226
- package/docs/pt/{inicio-rapido.md → _arquivo/inicio-rapido.md} +261 -251
- package/docs/pt/{memoria-contexto.md → _arquivo/memoria-contexto.md} +262 -255
- package/docs/pt/{monitor-de-contexto.md → _arquivo/monitor-de-contexto.md} +165 -158
- package/docs/pt/{profiler-system.md → _arquivo/profiler-system.md} +222 -214
- package/docs/pt/{recuperacao-de-sessao.md → _arquivo/recuperacao-de-sessao.md} +134 -125
- package/docs/pt/{site-forge.md → _arquivo/site-forge.md} +318 -309
- package/docs/pt/{squad-genome.md → _arquivo/squad-genome.md} +793 -783
- package/docs/pt/active-learning-loop/README.md +117 -0
- package/docs/pt/active-learning-loop/ativo-learning-loop.md +117 -0
- package/docs/pt/active-learning-loop/comandos-cli.md +320 -0
- package/docs/pt/active-learning-loop/como-usar.md +313 -0
- package/docs/pt/active-learning-loop/diagramas.md +225 -0
- package/docs/pt/active-learning-loop/doctor-checks.md +151 -0
- package/docs/pt/active-learning-loop/troubleshooting.md +283 -0
- package/docs/pt/agentes.md +996 -993
- package/docs/pt/deyvin-subtask-scout/README.md +109 -0
- package/docs/pt/deyvin-subtask-scout/comandos-cli.md +248 -0
- package/docs/pt/deyvin-subtask-scout/como-usar.md +221 -0
- package/docs/pt/deyvin-subtask-scout/diagramas.md +124 -0
- package/docs/pt/deyvin-subtask-scout/sub-task-scout.md +113 -0
- package/docs/pt/deyvin-subtask-scout/troubleshooting.md +184 -0
- package/docs/pt/living-memory/README.md +81 -0
- package/docs/pt/living-memory/autonomy-contract.md +206 -0
- package/docs/pt/living-memory/diagramas.md +365 -0
- package/docs/pt/living-memory/memoria-viva.md +141 -0
- package/docs/pt/living-memory/notificacoes-info.md +142 -0
- package/docs/pt/living-memory/reflexao-in-harness.md +218 -0
- package/docs/pt/living-memory/troubleshooting.md +286 -0
- package/docs/testing/genome-2.0-manual-regression.md +23 -23
- package/docs/testing/genome-2.0-matrix.md +36 -36
- package/docs/testing/genome-2.0-rollout.md +184 -184
- package/package.json +51 -51
- package/src/a2a/client.js +165 -165
- package/src/a2a/server.js +223 -223
- package/src/agent-loader.js +280 -280
- package/src/agent-manifests.js +86 -66
- package/src/agents.js +92 -92
- package/src/autonomy-policy.js +163 -139
- package/src/backup-local.js +74 -74
- package/src/backup-provider.js +303 -303
- package/src/brain-query.js +171 -161
- package/src/cli.js +77 -4
- package/src/commands/agent-audit.js +397 -397
- package/src/commands/agent-export-skill.js +229 -229
- package/src/commands/agent-loader.js +85 -85
- package/src/commands/agents.js +273 -255
- package/src/commands/artifact-validate.js +218 -218
- package/src/commands/auth.js +298 -272
- package/src/commands/backup-local-cmd.js +25 -25
- package/src/commands/backup.js +533 -533
- package/src/commands/brain-query.js +44 -44
- package/src/commands/brief-gen.js +405 -405
- package/src/commands/brief-validate.js +65 -65
- package/src/commands/briefing.js +344 -344
- package/src/commands/classify.js +256 -256
- package/src/commands/cloud.js +1767 -1767
- package/src/commands/commit-prepare.js +610 -547
- package/src/commands/compress-agents.js +416 -416
- package/src/commands/config.js +90 -90
- package/src/commands/context-cache.js +90 -90
- package/src/commands/context-compact.js +49 -49
- package/src/commands/context-health.js +187 -177
- package/src/commands/context-load.js +219 -0
- package/src/commands/context-monitor.js +163 -163
- package/src/commands/context-pack.js +45 -45
- package/src/commands/context-search.js +66 -66
- package/src/commands/context-trim.js +183 -183
- package/src/commands/context-validate.js +91 -91
- package/src/commands/design-hybrid-options.js +385 -385
- package/src/commands/detect-test-runner.js +55 -55
- package/src/commands/dev-resume.js +32 -0
- package/src/commands/devlog-export-brains.js +27 -27
- package/src/commands/devlog-process.js +294 -294
- package/src/commands/devlog-watch.js +131 -131
- package/src/commands/doctor.js +123 -123
- package/src/commands/dossier-add-research.js +114 -0
- package/src/commands/dossier-audit.js +222 -0
- package/src/commands/dossier.js +423 -423
- package/src/commands/feature-archive.js +513 -513
- package/src/commands/feature-close.js +554 -270
- package/src/commands/gate-approve.js +198 -198
- package/src/commands/gate-check.js +247 -247
- package/src/commands/genome-doctor.js +489 -198
- package/src/commands/genome-migrate.js +49 -49
- package/src/commands/git-guard.js +170 -170
- package/src/commands/harness.js +307 -121
- package/src/commands/health.js +214 -214
- package/src/commands/hooks-emit.js +253 -253
- package/src/commands/hooks-install.js +347 -347
- package/src/commands/i18n-add.js +56 -56
- package/src/commands/implementation-plan.js +367 -367
- package/src/commands/info.js +41 -41
- package/src/commands/init.js +120 -120
- package/src/commands/install.js +162 -111
- package/src/commands/learning-auto-promote.js +197 -195
- package/src/commands/learning-evolve.js +364 -364
- package/src/commands/learning-export.js +103 -103
- package/src/commands/learning-rollback.js +164 -164
- package/src/commands/learning.js +134 -134
- package/src/commands/live.js +2101 -2082
- package/src/commands/locale-apply.js +54 -54
- package/src/commands/locale-diff.js +25 -25
- package/src/commands/mcp-doctor.js +407 -407
- package/src/commands/mcp-init.js +373 -373
- package/src/commands/memory-archive.js +193 -0
- package/src/commands/memory-reflect-commit.js +148 -0
- package/src/commands/memory-reflect-prepare.js +97 -0
- package/src/commands/memory-restore.js +177 -0
- package/src/commands/memory-search.js +135 -0
- package/src/commands/memory.js +299 -234
- package/src/commands/notify.js +68 -0
- package/src/commands/package-e2e.js +273 -273
- package/src/commands/parallel-assign.js +483 -483
- package/src/commands/parallel-doctor.js +850 -850
- package/src/commands/parallel-guard.js +241 -241
- package/src/commands/parallel-init.js +311 -311
- package/src/commands/parallel-merge.js +299 -299
- package/src/commands/parallel-status.js +434 -434
- package/src/commands/pattern-detect.js +33 -33
- package/src/commands/preflight-context.js +30 -30
- package/src/commands/preflight.js +267 -267
- package/src/commands/pulse-update.js +130 -130
- package/src/commands/qa-doctor.js +185 -185
- package/src/commands/qa-init.js +166 -166
- package/src/commands/qa-report.js +58 -58
- package/src/commands/qa-run.js +873 -873
- package/src/commands/qa-scan.js +337 -337
- package/src/commands/recovery.js +43 -43
- package/src/commands/revision.js +235 -235
- package/src/commands/runner-daemon.js +274 -274
- package/src/commands/runner-plan.js +70 -70
- package/src/commands/runner-queue-from-plan.js +166 -166
- package/src/commands/runner-queue.js +189 -189
- package/src/commands/runner-run.js +129 -129
- package/src/commands/runtime.js +2086 -2067
- package/src/commands/sandbox.js +37 -37
- package/src/commands/scaffold-complete.js +188 -188
- package/src/commands/scan-project.js +1371 -1371
- package/src/commands/scout-commit.js +163 -0
- package/src/commands/scout-prep.js +214 -0
- package/src/commands/scout-validate.js +112 -0
- package/src/commands/security-audit.js +275 -275
- package/src/commands/security-scan.js +376 -376
- package/src/commands/self-implement-loop.js +306 -300
- package/src/commands/session-guard.js +218 -218
- package/src/commands/setup-context.js +699 -699
- package/src/commands/setup.js +178 -178
- package/src/commands/sizing.js +165 -165
- package/src/commands/skill.js +670 -670
- package/src/commands/smoke.js +426 -426
- package/src/commands/spec-checkpoint.js +177 -177
- package/src/commands/spec-status.js +79 -79
- package/src/commands/spec-sync.js +190 -190
- package/src/commands/spec-tasks.js +288 -288
- package/src/commands/squad-agent-create.js +830 -830
- package/src/commands/squad-autorun.js +1220 -1220
- package/src/commands/squad-bus.js +217 -217
- package/src/commands/squad-card.js +149 -149
- package/src/commands/squad-daemon.js +343 -343
- package/src/commands/squad-dashboard.js +39 -39
- package/src/commands/squad-dependency-graph.js +164 -164
- package/src/commands/squad-deploy.js +64 -64
- package/src/commands/squad-doctor.js +460 -460
- package/src/commands/squad-export.js +77 -46
- package/src/commands/squad-investigate.js +314 -314
- package/src/commands/squad-learning.js +209 -209
- package/src/commands/squad-mcp.js +270 -270
- package/src/commands/squad-pipeline.js +343 -343
- package/src/commands/squad-plan.js +361 -361
- package/src/commands/squad-processes.js +56 -56
- package/src/commands/squad-recovery.js +42 -42
- package/src/commands/squad-repair-genomes.js +39 -39
- package/src/commands/squad-review.js +106 -106
- package/src/commands/squad-roi.js +291 -291
- package/src/commands/squad-scaffold.js +56 -56
- package/src/commands/squad-score.js +311 -307
- package/src/commands/squad-status.js +481 -481
- package/src/commands/squad-tool-register.js +157 -157
- package/src/commands/squad-validate.js +438 -438
- package/src/commands/squad-webhook.js +160 -160
- package/src/commands/squad-worker.js +191 -191
- package/src/commands/squad-worktrees.js +75 -75
- package/src/commands/state-save.js +122 -122
- package/src/commands/store-genome.js +667 -304
- package/src/commands/store-skill.js +247 -247
- package/src/commands/store-squad.js +431 -431
- package/src/commands/store-system.js +392 -392
- package/src/commands/sync-agents-preflight.js +176 -0
- package/src/commands/test-agents.js +199 -199
- package/src/commands/tool-capabilities.js +63 -63
- package/src/commands/tool-registry-cmd.js +232 -232
- package/src/commands/update.js +64 -64
- package/src/commands/verify-gate.js +612 -612
- package/src/commands/web-map.js +70 -70
- package/src/commands/web-scrape.js +71 -71
- package/src/commands/workflow-execute.js +730 -730
- package/src/commands/workflow-harden.js +231 -231
- package/src/commands/workflow-heal.js +136 -136
- package/src/commands/workflow-next.js +1279 -1039
- package/src/commands/workflow-plan.js +108 -108
- package/src/commands/workflow-status.js +440 -440
- package/src/commands/workspace.js +144 -144
- package/src/constants.js +413 -384
- package/src/context-cache.js +159 -159
- package/src/context-memory.js +975 -966
- package/src/context-parse-reason.js +22 -22
- package/src/context-search.js +326 -326
- package/src/context-writer.js +197 -197
- package/src/context.js +247 -247
- package/src/delivery-runner.js +319 -319
- package/src/design-variation-catalog.js +503 -503
- package/src/detector.js +261 -261
- package/src/doctor.js +760 -329
- package/src/dossier/codemap-store.js +267 -267
- package/src/dossier/dossier-bootstrap.js +222 -222
- package/src/dossier/dossier-compact.js +159 -159
- package/src/dossier/lock.js +128 -128
- package/src/dossier/research-index-store.js +233 -0
- package/src/dossier/revision-store.js +313 -313
- package/src/dossier/schema.js +162 -155
- package/src/dossier/scout-section.js +127 -0
- package/src/dossier/store.js +406 -400
- package/src/execution-gateway.js +464 -464
- package/src/friction-scanner.js +202 -202
- package/src/genome-files.js +198 -198
- package/src/genome-format.js +442 -442
- package/src/genome-schema.js +238 -238
- package/src/genomes/bindings.js +281 -281
- package/src/genomes.js +500 -500
- package/src/handoff-contract.js +417 -363
- package/src/handoff-validator.js +45 -45
- package/src/harness/circuit-breaker.js +135 -135
- package/src/i18n/index.js +103 -103
- package/src/i18n/messages/en.js +1541 -1434
- package/src/i18n/messages/es.js +1325 -1221
- package/src/i18n/messages/fr.js +1333 -1229
- package/src/i18n/messages/pt-BR.js +1561 -1457
- package/src/i18n/scaffold.js +64 -64
- package/src/install-animation.js +260 -260
- package/src/install-profile.js +127 -127
- package/src/install-wizard.js +475 -475
- package/src/installer-config-merge.js +207 -0
- package/src/installer.js +449 -358
- package/src/learning-loop-archive.js +595 -0
- package/src/learning-loop-doctor.js +217 -0
- package/src/learning-loop-engine.js +254 -0
- package/src/learning-loop-fts5.js +132 -0
- package/src/learning-loop-migration.js +163 -0
- package/src/lib/dev-resume.js +140 -0
- package/src/lib/dossier-telemetry.js +36 -0
- package/src/lib/genomes/compat.js +206 -206
- package/src/lib/genomes/migrate.js +90 -90
- package/src/lib/git-commit-guard.js +751 -691
- package/src/lib/health-check.js +158 -158
- package/src/lib/hook-protocol.js +76 -76
- package/src/lib/llm-content-sanitizer.js +44 -0
- package/src/lib/security/artifact-reader.js +167 -167
- package/src/lib/security/exit-codes.js +51 -51
- package/src/lib/security/findings-writer.js +176 -176
- package/src/lib/security/runtime-events.js +77 -77
- package/src/lib/security/secrets-regex.js +115 -115
- package/src/lib/squads/genome-repair.js +49 -49
- package/src/lib/store/security-scan.js +175 -173
- package/src/lib/terminal-checkbox.js +135 -130
- package/src/lib/terminal-picker.js +447 -0
- package/src/lib/tmux-launcher.js +163 -163
- package/src/lib/tool-capabilities.js +102 -102
- package/src/lib/webhook-server.js +328 -328
- package/src/locales.js +88 -88
- package/src/mcp/apps/squad-dashboard/app.js +163 -163
- package/src/mcp/apps/squad-dashboard/index.html +261 -261
- package/src/mcp/apps/squad-dashboard/mcp-manifest.json +23 -23
- package/src/mcp/resources/squad-state.js +130 -130
- package/src/mcp-connectors/registry.js +602 -602
- package/src/memory-reflect-engine.js +359 -0
- package/src/notify-renderer.js +32 -0
- package/src/onboarding.js +305 -305
- package/src/parallel-workspace.js +756 -756
- package/src/parser.js +66 -66
- package/src/path-guard.js +47 -47
- package/src/permissions-generator.js +400 -0
- package/src/preflight-engine.js +654 -654
- package/src/prompt-tool.js +20 -20
- package/src/qa-html-report.js +472 -472
- package/src/recovery-context-session.js +154 -154
- package/src/runner/cascade.js +97 -97
- package/src/runner/cli-launcher.js +109 -109
- package/src/runner/plan-importer.js +63 -63
- package/src/runner/queue-store.js +159 -159
- package/src/runtime-store.js +2720 -2676
- package/src/sandbox.js +194 -177
- package/src/self-healing.js +142 -142
- package/src/session-handoff.js +295 -187
- package/src/squad/agent-teams-adapter.js +270 -264
- package/src/squad/brief-validator.js +350 -350
- package/src/squad/bus-bridge.js +140 -140
- package/src/squad/context-compactor.js +265 -265
- package/src/squad/cross-ai-synthesizer.js +250 -250
- package/src/squad/external-session.js +180 -180
- package/src/squad/hooks-generator.js +196 -196
- package/src/squad/inter-squad-events.js +175 -175
- package/src/squad/inter-squad.js +74 -74
- package/src/squad/intra-bus.js +345 -345
- package/src/squad/learning-extractor.js +213 -213
- package/src/squad/pattern-detector.js +365 -365
- package/src/squad/preflight-context.js +296 -296
- package/src/squad/recovery-context.js +372 -372
- package/src/squad/reflection.js +365 -365
- package/src/squad/squad-scaffold.js +341 -341
- package/src/squad/state-manager.js +310 -310
- package/src/squad/task-decomposer.js +652 -652
- package/src/squad/verify-gate.js +303 -303
- package/src/squad/worktree-manager.js +114 -114
- package/src/squad-daemon.js +490 -490
- package/src/squad-dashboard/api.js +223 -223
- package/src/squad-dashboard/attachment-handler.js +93 -93
- package/src/squad-dashboard/context-monitor.js +157 -157
- package/src/squad-dashboard/execution-logs.js +115 -115
- package/src/squad-dashboard/hunk-review.js +209 -209
- package/src/squad-dashboard/metrics.js +133 -133
- package/src/squad-dashboard/process-monitor.js +125 -125
- package/src/squad-dashboard/renderer.js +858 -858
- package/src/squad-dashboard/server.js +232 -232
- package/src/squad-dashboard/styles.js +525 -525
- package/src/squad-dashboard/token-tracker.js +99 -99
- package/src/squads/apply-genome.js +21 -21
- package/src/squads/genome-binding-service.js +154 -154
- package/src/sub-task-engine.js +415 -0
- package/src/sub-task-schemas.js +150 -0
- package/src/sub-task-state.js +152 -0
- package/src/sub-task-telemetry.js +69 -0
- package/src/test-briefing.js +226 -226
- package/src/tool-executor.js +94 -94
- package/src/updater.js +39 -39
- package/src/utils.js +49 -49
- package/src/version.js +50 -50
- package/src/web.js +284 -284
- package/src/worker-runner.js +541 -524
- package/src/workflow-gates.js +185 -185
- package/template/.aioson/advisors/.gitkeep +1 -1
- package/template/.aioson/agents/analyst.md +333 -318
- package/template/.aioson/agents/architect.md +325 -305
- package/template/.aioson/agents/{cypher.md → briefing.md} +264 -252
- package/template/.aioson/agents/committer.md +161 -161
- package/template/.aioson/agents/copywriter.md +937 -463
- package/template/.aioson/agents/design-hybrid-forge.md +141 -141
- package/template/.aioson/agents/dev.md +295 -263
- package/template/.aioson/agents/deyvin.md +198 -87
- package/template/.aioson/agents/discover.md +235 -235
- package/template/.aioson/agents/discovery-design-doc.md +56 -29
- package/template/.aioson/agents/genome.md +1904 -364
- package/template/.aioson/agents/manifests/analyst.manifest.json +26 -26
- package/template/.aioson/agents/manifests/architect.manifest.json +23 -23
- package/template/.aioson/agents/manifests/committer.manifest.json +23 -23
- package/template/.aioson/agents/manifests/dev.manifest.json +54 -37
- package/template/.aioson/agents/manifests/deyvin.manifest.json +41 -0
- package/template/.aioson/agents/manifests/orchestrator.manifest.json +30 -30
- package/template/.aioson/agents/manifests/pentester.manifest.json +39 -39
- package/template/.aioson/agents/manifests/pm.manifest.json +26 -26
- package/template/.aioson/agents/manifests/product.manifest.json +23 -23
- package/template/.aioson/agents/manifests/qa.manifest.json +41 -25
- package/template/.aioson/agents/manifests/setup.manifest.json +20 -20
- package/template/.aioson/agents/manifests/ux-ui.manifest.json +24 -24
- package/template/.aioson/agents/neo.md +341 -231
- package/template/.aioson/agents/orache.md +430 -430
- package/template/.aioson/agents/orchestrator.md +274 -263
- package/template/.aioson/agents/pair.md +5 -5
- package/template/.aioson/agents/pentester.md +289 -235
- package/template/.aioson/agents/pm.md +141 -130
- package/template/.aioson/agents/product.md +351 -273
- package/template/.aioson/agents/profiler-enricher.md +331 -331
- package/template/.aioson/agents/profiler-forge.md +212 -212
- package/template/.aioson/agents/profiler-researcher.md +282 -282
- package/template/.aioson/agents/qa.md +432 -342
- package/template/.aioson/agents/setup.md +423 -423
- package/template/.aioson/agents/sheldon.md +259 -197
- package/template/.aioson/agents/site-forge.md +281 -281
- package/template/.aioson/agents/squad.md +160 -156
- package/template/.aioson/agents/tester.md +536 -473
- package/template/.aioson/agents/ux-ui.md +195 -162
- package/template/.aioson/agents/validator.md +101 -69
- package/template/.aioson/brains/README.md +132 -128
- package/template/.aioson/brains/_archived/.gitkeep +0 -0
- package/template/.aioson/brains/_index.json +34 -16
- package/template/.aioson/brains/dev/patterns.brain.json +79 -0
- package/template/.aioson/brains/scripts/query.js +107 -107
- package/template/.aioson/brains/sheldon/architecture-decisions.brain.json +79 -0
- package/template/.aioson/brains/site-forge/visual-patterns.brain.json +205 -205
- package/template/.aioson/config/autonomy-protocol.json +125 -43
- package/template/.aioson/config/learning-loop.json +10 -0
- package/template/.aioson/config/scout-engine.json +1 -0
- package/template/.aioson/config.md +410 -410
- package/template/.aioson/context/_archived/.gitkeep +0 -0
- package/template/.aioson/context/design-doc.md +136 -136
- package/template/.aioson/context/project-map.md +57 -57
- package/template/.aioson/context/project-pulse.md +34 -34
- package/template/.aioson/context/seeds/seed-example.md +27 -27
- package/template/.aioson/context/spec.md.template +54 -54
- package/template/.aioson/context/user-profile.md +42 -42
- package/template/.aioson/design-docs/code-reuse.md +48 -48
- package/template/.aioson/design-docs/componentization.md +47 -47
- package/template/.aioson/design-docs/file-size.md +52 -52
- package/template/.aioson/design-docs/folder-structure.md +51 -51
- package/template/.aioson/design-docs/naming.md +54 -54
- package/template/.aioson/docs/LAYERS.md +89 -89
- package/template/.aioson/docs/README.md +76 -76
- package/template/.aioson/docs/autonomy-protocol.md +80 -0
- package/template/.aioson/docs/briefing/briefing-craft.md +237 -0
- package/template/.aioson/docs/dev/execution-discipline.md +106 -106
- package/template/.aioson/docs/dev/stack-conventions.md +83 -83
- package/template/.aioson/docs/deyvin/continuity-recovery.md +57 -57
- package/template/.aioson/docs/deyvin/debugging-escalation.md +30 -30
- package/template/.aioson/docs/deyvin/pair-execution.md +44 -44
- package/template/.aioson/docs/deyvin/runtime-handoffs.md +36 -36
- package/template/.aioson/docs/example-external-api-context.md +72 -72
- package/template/.aioson/docs/pentester/app-playbooks.md +206 -0
- package/template/.aioson/docs/pentester/llm-supplychain.md +165 -0
- package/template/.aioson/docs/product/conversation-playbook.md +116 -116
- package/template/.aioson/docs/product/prd-contract.md +107 -107
- package/template/.aioson/docs/product/quality-lens.md +57 -57
- package/template/.aioson/docs/product/research-loop.md +65 -65
- package/template/.aioson/docs/sheldon/enrichment-paths.md +134 -134
- package/template/.aioson/docs/sheldon/harness-contract.md +118 -0
- package/template/.aioson/docs/sheldon/quality-lens.md +57 -57
- package/template/.aioson/docs/sheldon/research-loop.md +56 -56
- package/template/.aioson/docs/sheldon/web-intelligence.md +75 -75
- package/template/.aioson/docs/site-forge-build.md +195 -195
- package/template/.aioson/docs/site-forge-extraction.md +135 -135
- package/template/.aioson/docs/site-forge-qa.md +155 -155
- package/template/.aioson/docs/site-forge-recon.md +434 -434
- package/template/.aioson/docs/site-forge-transform.md +249 -249
- package/template/.aioson/docs/squad/content-output.md +91 -91
- package/template/.aioson/docs/squad/creation-flow.md +149 -135
- package/template/.aioson/docs/squad/domain-breadth.md +322 -0
- package/template/.aioson/docs/squad/domain-classification.md +117 -117
- package/template/.aioson/docs/squad/genome-bindings.md +47 -47
- package/template/.aioson/docs/squad/package-contract.md +260 -234
- package/template/.aioson/docs/squad/quality-lens.md +60 -56
- package/template/.aioson/docs/squad/research-loop.md +59 -59
- package/template/.aioson/docs/squad/session-operations.md +117 -117
- package/template/.aioson/docs/squad/workflow-quality.md +165 -165
- package/template/.aioson/docs/tester/coverage-quality.md +351 -0
- package/template/.aioson/docs/ux-ui/accessibility-audit.md +55 -55
- package/template/.aioson/docs/ux-ui/audit-mode.md +86 -86
- package/template/.aioson/docs/ux-ui/component-map.md +35 -35
- package/template/.aioson/docs/ux-ui/design-execution.md +111 -111
- package/template/.aioson/docs/ux-ui/design-gate.md +27 -27
- package/template/.aioson/docs/ux-ui/research-mode.md +39 -39
- package/template/.aioson/docs/ux-ui/site-delivery.md +156 -156
- package/template/.aioson/docs/ux-ui/token-contract.md +57 -57
- package/template/.aioson/genomes/INDEX.md +195 -0
- package/template/.aioson/genomes/copywriting/SKILL.md +137 -0
- package/template/.aioson/genomes/copywriting/manifest.json +140 -0
- package/template/.aioson/genomes/copywriting/references/application-notes.md +145 -0
- package/template/.aioson/genomes/copywriting/references/decision-weights.md +45 -0
- package/template/.aioson/genomes/copywriting/references/frameworks/5-act-narrative.md +184 -0
- package/template/.aioson/genomes/copywriting/references/frameworks/classical-formulas.md +164 -0
- package/template/.aioson/genomes/copywriting/references/frameworks/offer-stack.md +195 -0
- package/template/.aioson/genomes/copywriting/references/frameworks/one-belief.md +135 -0
- package/template/.aioson/genomes/copywriting/references/frameworks/pms-research.md +211 -0
- package/template/.aioson/genomes/copywriting/references/frameworks/two-paths-close.md +190 -0
- package/template/.aioson/genomes/copywriting/references/heuristics.md +114 -0
- package/template/.aioson/genomes/copywriting/references/meta-axioms.md +68 -0
- package/template/.aioson/genomes/copywriting/references/methodology.md +115 -0
- package/template/.aioson/genomes/copywriting-brunson/SKILL.md +133 -0
- package/template/.aioson/genomes/copywriting-brunson/manifest.json +152 -0
- package/template/.aioson/genomes/copywriting-brunson/references/application-notes.md +113 -0
- package/template/.aioson/genomes/copywriting-brunson/references/decision-weights.md +33 -0
- package/template/.aioson/genomes/copywriting-brunson/references/evidence-and-attribution.md +81 -0
- package/template/.aioson/genomes/copywriting-brunson/references/frameworks/6-part-structure.md +136 -0
- package/template/.aioson/genomes/copywriting-brunson/references/frameworks/origin-story.md +121 -0
- package/template/.aioson/genomes/copywriting-brunson/references/frameworks/perfect-webinar-script.md +139 -0
- package/template/.aioson/genomes/copywriting-brunson/references/frameworks/persuasive-storytelling-5-structures.md +164 -0
- package/template/.aioson/genomes/copywriting-brunson/references/frameworks/value-stack.md +136 -0
- package/template/.aioson/genomes/copywriting-brunson/references/frameworks/who-what-why-how.md +110 -0
- package/template/.aioson/genomes/copywriting-brunson/references/meta-axioms.md +36 -0
- package/template/.aioson/genomes/copywriting-brunson/references/methodology.md +112 -0
- package/template/.aioson/git-guard.json +12 -11
- package/template/.aioson/mcp/servers.md +23 -23
- package/template/.aioson/profiler-reports/.gitkeep +1 -1
- package/template/.aioson/rules/README.md +69 -69
- package/template/.aioson/rules/_archived/.gitkeep +0 -0
- package/template/.aioson/rules/agent-language-policy.md +93 -93
- package/template/.aioson/rules/aioson-context-boundary.md +63 -63
- package/template/.aioson/rules/canonical-path-contract.md +47 -47
- package/template/.aioson/rules/data-format-convention.md +74 -74
- package/template/.aioson/rules/disk-first-artifacts.md +44 -44
- package/template/.aioson/rules/example-monetary-values.md +30 -30
- package/template/.aioson/rules/output-brevity.md +44 -44
- package/template/.aioson/rules/prd-section-ownership.md +49 -49
- package/template/.aioson/rules/security-baseline.md +139 -139
- package/template/.aioson/rules/spec-level-ownership.md +61 -61
- package/template/.aioson/rules/squad/README.md +50 -50
- package/template/.aioson/rules/squad-driver-pattern.md +81 -81
- package/template/.aioson/schemas/content-blueprint.schema.json +30 -30
- package/template/.aioson/schemas/genome-meta.schema.json +150 -150
- package/template/.aioson/schemas/genome.schema.json +115 -115
- package/template/.aioson/schemas/readiness.schema.json +27 -27
- package/template/.aioson/schemas/squad-blueprint.schema.json +228 -228
- package/template/.aioson/schemas/squad-manifest.schema.json +874 -874
- package/template/.aioson/skills/design/aurora-command-ui/SKILL.md +243 -243
- package/template/.aioson/skills/design/aurora-command-ui/references/art-direction.md +293 -293
- package/template/.aioson/skills/design/aurora-command-ui/references/components.md +827 -827
- package/template/.aioson/skills/design/aurora-command-ui/references/dashboards.md +250 -250
- package/template/.aioson/skills/design/aurora-command-ui/references/design-tokens.md +585 -585
- package/template/.aioson/skills/design/aurora-command-ui/references/motion.md +365 -365
- package/template/.aioson/skills/design/aurora-command-ui/references/patterns.md +482 -482
- package/template/.aioson/skills/design/aurora-command-ui/references/websites.md +387 -387
- package/template/.aioson/skills/design/bold-editorial-ui/SKILL.md +205 -205
- package/template/.aioson/skills/design/bold-editorial-ui/references/art-direction.md +338 -338
- package/template/.aioson/skills/design/bold-editorial-ui/references/components.md +977 -977
- package/template/.aioson/skills/design/bold-editorial-ui/references/dashboards.md +218 -218
- package/template/.aioson/skills/design/bold-editorial-ui/references/design-tokens.md +326 -326
- package/template/.aioson/skills/design/bold-editorial-ui/references/motion.md +461 -461
- package/template/.aioson/skills/design/bold-editorial-ui/references/patterns.md +293 -293
- package/template/.aioson/skills/design/bold-editorial-ui/references/websites.md +352 -352
- package/template/.aioson/skills/design/clean-saas-ui/SKILL.md +210 -210
- package/template/.aioson/skills/design/clean-saas-ui/references/art-direction.md +319 -319
- package/template/.aioson/skills/design/clean-saas-ui/references/components.md +365 -365
- package/template/.aioson/skills/design/clean-saas-ui/references/dashboards.md +196 -196
- package/template/.aioson/skills/design/clean-saas-ui/references/design-tokens.md +244 -244
- package/template/.aioson/skills/design/clean-saas-ui/references/motion.md +235 -235
- package/template/.aioson/skills/design/clean-saas-ui/references/patterns.md +215 -215
- package/template/.aioson/skills/design/clean-saas-ui/references/websites.md +295 -295
- package/template/.aioson/skills/design/cognitive-core-ui/SKILL.md +203 -203
- package/template/.aioson/skills/design/cognitive-core-ui/references/art-direction.md +339 -339
- package/template/.aioson/skills/design/cognitive-core-ui/references/components.md +407 -407
- package/template/.aioson/skills/design/cognitive-core-ui/references/dashboards.md +272 -272
- package/template/.aioson/skills/design/cognitive-core-ui/references/design-tokens.md +524 -524
- package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +279 -279
- package/template/.aioson/skills/design/cognitive-core-ui/references/patterns.md +289 -289
- package/template/.aioson/skills/design/cognitive-core-ui/references/websites.md +437 -437
- package/template/.aioson/skills/design/glassmorphism-ui/SKILL.md +222 -222
- package/template/.aioson/skills/design/glassmorphism-ui/references/art-direction.md +159 -159
- package/template/.aioson/skills/design/glassmorphism-ui/references/components.md +498 -498
- package/template/.aioson/skills/design/glassmorphism-ui/references/dashboards.md +236 -236
- package/template/.aioson/skills/design/glassmorphism-ui/references/design-tokens.md +274 -274
- package/template/.aioson/skills/design/glassmorphism-ui/references/motion.md +355 -355
- package/template/.aioson/skills/design/glassmorphism-ui/references/patterns.md +198 -198
- package/template/.aioson/skills/design/glassmorphism-ui/references/websites.md +307 -307
- package/template/.aioson/skills/design/interface-design/SKILL.md +47 -47
- package/template/.aioson/skills/design/interface-design/references/components-and-states.md +105 -105
- package/template/.aioson/skills/design/interface-design/references/design-directions.md +101 -101
- package/template/.aioson/skills/design/interface-design/references/handoff-and-quality.md +71 -71
- package/template/.aioson/skills/design/interface-design/references/intent-and-domain.md +74 -74
- package/template/.aioson/skills/design/interface-design/references/tokens-and-depth.md +173 -173
- package/template/.aioson/skills/design/neo-brutalist-ui/SKILL.md +213 -213
- package/template/.aioson/skills/design/neo-brutalist-ui/references/art-direction.md +228 -228
- package/template/.aioson/skills/design/neo-brutalist-ui/references/components.md +855 -855
- package/template/.aioson/skills/design/neo-brutalist-ui/references/dashboards.md +334 -334
- package/template/.aioson/skills/design/neo-brutalist-ui/references/design-tokens.md +342 -342
- package/template/.aioson/skills/design/neo-brutalist-ui/references/motion.md +286 -286
- package/template/.aioson/skills/design/neo-brutalist-ui/references/patterns.md +458 -458
- package/template/.aioson/skills/design/neo-brutalist-ui/references/websites.md +723 -723
- package/template/.aioson/skills/design/premium-command-center-ui/SKILL.md +62 -62
- package/template/.aioson/skills/design/premium-command-center-ui/references/operations.md +74 -74
- package/template/.aioson/skills/design/premium-command-center-ui/references/patterns.md +116 -116
- package/template/.aioson/skills/design/premium-command-center-ui/references/validation.md +47 -47
- package/template/.aioson/skills/design/premium-command-center-ui/references/visual-system.md +215 -215
- package/template/.aioson/skills/design/pt.squarespace.com/.skill-meta.json +31 -31
- package/template/.aioson/skills/design/pt.squarespace.com/SKILL.md +66 -66
- package/template/.aioson/skills/design/pt.squarespace.com/references/components.md +368 -368
- package/template/.aioson/skills/design/pt.squarespace.com/references/design-tokens.md +150 -150
- package/template/.aioson/skills/design/pt.squarespace.com/references/motion.md +270 -270
- package/template/.aioson/skills/design/pt.squarespace.com/references/patterns.md +189 -189
- package/template/.aioson/skills/design/pt.squarespace.com/references/websites.md +165 -165
- package/template/.aioson/skills/design/warm-craft-ui/SKILL.md +209 -209
- package/template/.aioson/skills/design/warm-craft-ui/references/art-direction.md +324 -324
- package/template/.aioson/skills/design/warm-craft-ui/references/components.md +508 -508
- package/template/.aioson/skills/design/warm-craft-ui/references/dashboards.md +223 -223
- package/template/.aioson/skills/design/warm-craft-ui/references/design-tokens.md +374 -374
- package/template/.aioson/skills/design/warm-craft-ui/references/motion.md +356 -356
- package/template/.aioson/skills/design/warm-craft-ui/references/patterns.md +288 -288
- package/template/.aioson/skills/design/warm-craft-ui/references/websites.md +289 -289
- package/template/.aioson/skills/design-system/SKILL.md +92 -92
- package/template/.aioson/skills/design-system/components/SKILL.md +274 -274
- package/template/.aioson/skills/design-system/dashboards/SKILL.md +184 -184
- package/template/.aioson/skills/design-system/foundations/SKILL.md +250 -250
- package/template/.aioson/skills/design-system/motion/SKILL.md +197 -197
- package/template/.aioson/skills/design-system/patterns/SKILL.md +231 -231
- package/template/.aioson/skills/dynamic/README.md +30 -30
- package/template/.aioson/skills/dynamic/cardano-docs.md +16 -16
- package/template/.aioson/skills/dynamic/ethereum-docs.md +17 -17
- package/template/.aioson/skills/dynamic/flux-ui-docs.md +13 -13
- package/template/.aioson/skills/dynamic/laravel-docs.md +41 -41
- package/template/.aioson/skills/dynamic/npm-packages.md +16 -16
- package/template/.aioson/skills/dynamic/solana-docs.md +16 -16
- package/template/.aioson/skills/marketing/references/anti-patterns.md +254 -254
- package/template/.aioson/skills/marketing/references/cta-matrix.md +361 -0
- package/template/.aioson/skills/marketing/references/fascinations.md +192 -192
- package/template/.aioson/skills/marketing/references/five-acts.md +248 -248
- package/template/.aioson/skills/marketing/references/headline-matrix.md +358 -0
- package/template/.aioson/skills/marketing/references/market-intelligence.md +198 -198
- package/template/.aioson/skills/marketing/references/offer-structure.md +203 -203
- package/template/.aioson/skills/marketing/references/one-belief.md +149 -149
- package/template/.aioson/skills/marketing/references/patterns.md +218 -218
- package/template/.aioson/skills/marketing/references/platform-constraints.md +337 -0
- package/template/.aioson/skills/marketing/references/pms-research.md +193 -193
- package/template/.aioson/skills/marketing/vsl-craft.md +385 -385
- package/template/.aioson/skills/premium-visual-design/SKILL.md +83 -83
- package/template/.aioson/skills/premium-visual-design/components/agent-badge.md +92 -92
- package/template/.aioson/skills/premium-visual-design/components/dependency-node.md +102 -102
- package/template/.aioson/skills/premium-visual-design/components/mention-autocomplete.md +136 -136
- package/template/.aioson/skills/premium-visual-design/components/notification-center.md +136 -136
- package/template/.aioson/skills/premium-visual-design/components/review-action-bar.md +188 -188
- package/template/.aioson/skills/premium-visual-design/components/team-switcher.md +131 -131
- package/template/.aioson/skills/premium-visual-design/patterns/agent-message-thread.md +198 -198
- package/template/.aioson/skills/premium-visual-design/patterns/notification-panel.md +275 -275
- package/template/.aioson/skills/premium-visual-design/patterns/review-workflow-ui.md +234 -234
- package/template/.aioson/skills/premium-visual-design/patterns/task-dependency-graph.md +147 -147
- package/template/.aioson/skills/premium-visual-design/tokens/status-extended.md +142 -142
- package/template/.aioson/skills/process/aioson-spec-driven/SKILL.md +46 -46
- package/template/.aioson/skills/process/aioson-spec-driven/references/analyst.md +30 -30
- package/template/.aioson/skills/process/aioson-spec-driven/references/approval-gates.md +109 -109
- package/template/.aioson/skills/process/aioson-spec-driven/references/architect.md +23 -23
- package/template/.aioson/skills/process/aioson-spec-driven/references/artifact-map.md +44 -44
- package/template/.aioson/skills/process/aioson-spec-driven/references/classification-map.md +37 -37
- package/template/.aioson/skills/process/aioson-spec-driven/references/dev.md +47 -47
- package/template/.aioson/skills/process/aioson-spec-driven/references/deyvin.md +27 -27
- package/template/.aioson/skills/process/aioson-spec-driven/references/hardening-lane.md +49 -49
- package/template/.aioson/skills/process/aioson-spec-driven/references/maintenance-and-state.md +101 -101
- package/template/.aioson/skills/process/aioson-spec-driven/references/pm.md +30 -30
- package/template/.aioson/skills/process/aioson-spec-driven/references/product.md +25 -25
- package/template/.aioson/skills/process/aioson-spec-driven/references/qa.md +30 -30
- package/template/.aioson/skills/process/aioson-spec-driven/references/sheldon.md +25 -25
- package/template/.aioson/skills/process/aioson-spec-driven/references/ui-language.md +75 -75
- package/template/.aioson/skills/process/design-hybrid-forge/SKILL.md +147 -147
- package/template/.aioson/skills/process/design-hybrid-forge/references/crossover-protocol.md +221 -221
- package/template/.aioson/skills/process/design-hybrid-forge/references/naming-registry.md +88 -88
- package/template/.aioson/skills/process/design-hybrid-forge/references/output-contract.md +306 -306
- package/template/.aioson/skills/process/design-hybrid-forge/references/pair-compatibility.md +149 -149
- package/template/.aioson/skills/process/design-hybrid-forge/references/quality-gates.md +208 -208
- package/template/.aioson/skills/process/design-hybrid-forge/references/variation-library.md +125 -125
- package/template/.aioson/skills/process/secure-tdd/SKILL.md +97 -97
- package/template/.aioson/skills/process/simplify/SKILL.md +173 -173
- package/template/.aioson/skills/references/premium-command-center-ui/master-application-prompt.md +79 -79
- package/template/.aioson/skills/references/premium-command-center-ui/operational-ux-playbook.md +253 -253
- package/template/.aioson/skills/references/premium-command-center-ui/quality-validation-checklist.md +82 -82
- package/template/.aioson/skills/references/premium-command-center-ui/visual-system-and-component-patterns.md +270 -270
- package/template/.aioson/skills/squad/SKILL.md +58 -58
- package/template/.aioson/skills/squad/formats/catalog.json +15 -15
- package/template/.aioson/skills/squad/formats/content/blog-post.md +47 -47
- package/template/.aioson/skills/squad/formats/content/newsletter.md +47 -47
- package/template/.aioson/skills/squad/formats/creative/podcast-script.md +43 -43
- package/template/.aioson/skills/squad/formats/creative/video-script.md +41 -41
- package/template/.aioson/skills/squad/formats/social/instagram-feed.md +42 -42
- package/template/.aioson/skills/squad/formats/social/linkedin-post.md +42 -42
- package/template/.aioson/skills/squad/formats/social/tiktok.md +39 -39
- package/template/.aioson/skills/squad/formats/social/twitter-thread.md +39 -39
- package/template/.aioson/skills/squad/formats/social/youtube-long.md +47 -47
- package/template/.aioson/skills/squad/formats/social/youtube-shorts.md +39 -39
- package/template/.aioson/skills/squad/patterns/multi-platform-pattern.md +108 -108
- package/template/.aioson/skills/squad/patterns/persona-based-pattern.md +98 -98
- package/template/.aioson/skills/squad/patterns/pipeline-pattern.md +106 -106
- package/template/.aioson/skills/squad/patterns/review-loop-pattern.md +81 -81
- package/template/.aioson/skills/squad/references/checklist-templates.md +122 -122
- package/template/.aioson/skills/squad/references/executor-archetypes.md +123 -123
- package/template/.aioson/skills/squad/references/workflow-templates.md +169 -169
- package/template/.aioson/skills/static/context-budget-guide.md +46 -46
- package/template/.aioson/skills/static/debugging-protocol.md +42 -42
- package/template/.aioson/skills/static/django-patterns.md +342 -342
- package/template/.aioson/skills/static/fastapi-patterns.md +344 -344
- package/template/.aioson/skills/static/filament-patterns.md +267 -267
- package/template/.aioson/skills/static/flux-ui-components.md +262 -262
- package/template/.aioson/skills/static/git-conventions.md +227 -227
- package/template/.aioson/skills/static/git-worktrees.md +36 -36
- package/template/.aioson/skills/static/harness-sensors.md +74 -74
- package/template/.aioson/skills/static/harness-validate/SKILL.md +46 -46
- package/template/.aioson/skills/static/jetstream-setup.md +200 -200
- package/template/.aioson/skills/static/landing-page-deploy.md +192 -192
- package/template/.aioson/skills/static/landing-page-forge.md +730 -730
- package/template/.aioson/skills/static/laravel-conventions.md +491 -491
- package/template/.aioson/skills/static/multi-agent-patterns.md +43 -43
- package/template/.aioson/skills/static/nextjs-patterns.md +321 -321
- package/template/.aioson/skills/static/node-express-patterns.md +317 -317
- package/template/.aioson/skills/static/node-typescript-patterns.md +282 -282
- package/template/.aioson/skills/static/rails-conventions.md +307 -307
- package/template/.aioson/skills/static/react-motion-patterns.md +599 -599
- package/template/.aioson/skills/static/static-html-patterns/checklists.md +43 -43
- package/template/.aioson/skills/static/static-html-patterns/css-tokens.md +609 -609
- package/template/.aioson/skills/static/static-html-patterns/motion.md +193 -193
- package/template/.aioson/skills/static/static-html-patterns/premium.md +711 -711
- package/template/.aioson/skills/static/static-html-patterns/structure.md +209 -209
- package/template/.aioson/skills/static/static-html-patterns/utilities.md +190 -190
- package/template/.aioson/skills/static/static-html-patterns.md +80 -80
- package/template/.aioson/skills/static/tall-stack-patterns.md +286 -286
- package/template/.aioson/skills/static/threejs-patterns.md +929 -929
- package/template/.aioson/skills/static/ui-ux-modern.md +76 -76
- package/template/.aioson/skills/static/web-research-cache.md +115 -115
- package/template/.aioson/skills/static/web3-cardano-patterns.md +337 -337
- package/template/.aioson/skills/static/web3-ethereum-patterns.md +310 -310
- package/template/.aioson/skills/static/web3-security-checklist.md +284 -284
- package/template/.aioson/skills/static/web3-solana-patterns.md +324 -324
- package/template/.aioson/squads/memory.md +5 -5
- package/template/.aioson/tasks/implementation-plan.md +327 -327
- package/template/.aioson/tasks/squad-analyze.md +83 -83
- package/template/.aioson/tasks/squad-create.md +148 -148
- package/template/.aioson/tasks/squad-design.md +206 -206
- package/template/.aioson/tasks/squad-execution-plan.md +279 -279
- package/template/.aioson/tasks/squad-export.md +20 -20
- package/template/.aioson/tasks/squad-extend.md +68 -68
- package/template/.aioson/tasks/squad-investigate.md +57 -57
- package/template/.aioson/tasks/squad-learning-review.md +44 -44
- package/template/.aioson/tasks/squad-output-config.md +177 -177
- package/template/.aioson/tasks/squad-pipeline.md +122 -122
- package/template/.aioson/tasks/squad-profile.md +48 -48
- package/template/.aioson/tasks/squad-refresh.md +236 -0
- package/template/.aioson/tasks/squad-repair.md +85 -85
- package/template/.aioson/tasks/squad-review.md +61 -61
- package/template/.aioson/tasks/squad-task-decompose.md +66 -66
- package/template/.aioson/tasks/squad-validate.md +58 -58
- package/template/.aioson/templates/reflect-prompts/current-state.md +36 -0
- package/template/.aioson/templates/reflect-prompts/how-it-works.md +23 -0
- package/template/.aioson/templates/reflect-prompts/what-it-does.md +21 -0
- package/template/.aioson/templates/squads/content-basic/template.json +21 -21
- package/template/.aioson/templates/squads/digital-marketing-agency/template.json +96 -96
- package/template/.aioson/templates/squads/media-channel/template.json +24 -24
- package/template/.aioson/templates/squads/research-analysis/template.json +22 -22
- package/template/.aioson/templates/squads/software-delivery/template.json +21 -21
- package/template/.claude/commands/aioson/agent/analyst.md +5 -5
- package/template/.claude/commands/aioson/agent/architect.md +5 -5
- package/template/.claude/commands/aioson/agent/briefing.md +5 -0
- package/template/.claude/commands/aioson/agent/committer.md +5 -5
- package/template/.claude/commands/aioson/agent/copywriter.md +5 -5
- package/template/.claude/commands/aioson/agent/design-hybrid-forge.md +5 -5
- package/template/.claude/commands/aioson/agent/dev.md +5 -5
- package/template/.claude/commands/aioson/agent/deyvin.md +5 -5
- package/template/.claude/commands/aioson/agent/discover.md +5 -0
- package/template/.claude/commands/aioson/agent/discovery-design-doc.md +5 -5
- package/template/.claude/commands/aioson/agent/genome.md +5 -5
- package/template/.claude/commands/aioson/agent/neo.md +5 -5
- package/template/.claude/commands/aioson/agent/orache.md +5 -5
- package/template/.claude/commands/aioson/agent/orchestrator.md +5 -5
- package/template/.claude/commands/aioson/agent/pair.md +5 -5
- package/template/.claude/commands/aioson/agent/pentester.md +5 -0
- package/template/.claude/commands/aioson/agent/pm.md +5 -5
- package/template/.claude/commands/aioson/agent/product.md +5 -5
- package/template/.claude/commands/aioson/agent/profiler-enricher.md +5 -5
- package/template/.claude/commands/aioson/agent/profiler-forge.md +5 -5
- package/template/.claude/commands/aioson/agent/profiler-researcher.md +5 -5
- package/template/.claude/commands/aioson/agent/qa.md +5 -5
- package/template/.claude/commands/aioson/agent/setup.md +5 -5
- package/template/.claude/commands/aioson/agent/sheldon.md +5 -5
- package/template/.claude/commands/aioson/agent/site-forge.md +5 -5
- package/template/.claude/commands/aioson/agent/squad.md +5 -5
- package/template/.claude/commands/aioson/agent/tester.md +5 -5
- package/template/.claude/commands/aioson/agent/ux-ui.md +5 -5
- package/template/.claude/commands/aioson/agent/validator.md +5 -5
- package/template/.gemini/GEMINI.md +13 -13
- package/template/.gemini/commands/aios-analyst.toml +7 -7
- package/template/.gemini/commands/aios-architect.toml +8 -8
- package/template/.gemini/commands/aios-committer.toml +7 -7
- package/template/.gemini/commands/aios-copywriter.toml +7 -7
- package/template/.gemini/commands/aios-cypher.toml +7 -7
- package/template/.gemini/commands/aios-dev.toml +9 -9
- package/template/.gemini/commands/aios-deyvin.toml +7 -7
- package/template/.gemini/commands/aios-discover.toml +6 -0
- package/template/.gemini/commands/aios-discovery-design-doc.toml +7 -7
- package/template/.gemini/commands/aios-genome.toml +7 -7
- package/template/.gemini/commands/aios-neo.toml +6 -6
- package/template/.gemini/commands/aios-orache.toml +7 -7
- package/template/.gemini/commands/aios-orchestrator.toml +9 -9
- package/template/.gemini/commands/aios-pair.toml +7 -7
- package/template/.gemini/commands/aios-pm.toml +9 -9
- package/template/.gemini/commands/aios-product.toml +6 -6
- package/template/.gemini/commands/aios-qa.toml +7 -7
- package/template/.gemini/commands/aios-setup.toml +6 -6
- package/template/.gemini/commands/aios-sheldon.toml +7 -7
- package/template/.gemini/commands/aios-site-forge.toml +7 -7
- package/template/.gemini/commands/aios-squad.toml +7 -7
- package/template/.gemini/commands/aios-tester.toml +7 -7
- package/template/.gemini/commands/aios-ux-ui.toml +9 -9
- package/template/.gemini/commands/aios-validator.toml +7 -7
- package/template/AGENTS.md +184 -183
- package/template/CLAUDE.md +98 -97
- package/template/OPENCODE.md +35 -34
- package/template/aioson-models.json +40 -40
- package/template/.aioson/genomes/copywriting.md +0 -204
- package/template/.aioson/genomes/copywriting.meta.json +0 -48
- package/template/.aioson/skills/process/secure-tdd/references/nextjs.md +0 -81
- package/template/.aioson/skills/process/secure-tdd/references/node-express.md +0 -91
- package/template/.aioson/skills/process/secure-tdd/references/planned-stacks.md +0 -33
- package/template/.claude/commands/aioson/agent/cypher.md +0 -5
package/src/context-memory.js
CHANGED
|
@@ -1,966 +1,975 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
const path = require('node:path');
|
|
4
|
-
const fs = require('node:fs/promises');
|
|
5
|
-
const { exists, readTextIfExists, ensureDir } = require('./utils');
|
|
6
|
-
|
|
7
|
-
const CONTEXT_DIR = '.aioson/context';
|
|
8
|
-
const PROJECT_CONTEXT_FILE = `${CONTEXT_DIR}/project.context.md`;
|
|
9
|
-
const DISCOVERY_FILE = `${CONTEXT_DIR}/discovery.md`;
|
|
10
|
-
const SKELETON_FILE = `${CONTEXT_DIR}/skeleton-system.md`;
|
|
11
|
-
const ARCHITECTURE_FILE = `${CONTEXT_DIR}/architecture.md`;
|
|
12
|
-
const SPEC_FILE = `${CONTEXT_DIR}/spec.md`;
|
|
13
|
-
const SPEC_CURRENT_FILE = `${CONTEXT_DIR}/spec-current.md`;
|
|
14
|
-
const SPEC_HISTORY_FILE = `${CONTEXT_DIR}/spec-history.md`;
|
|
15
|
-
const MEMORY_INDEX_FILE = `${CONTEXT_DIR}/memory-index.md`;
|
|
16
|
-
const DESIGN_DOC_FILE = `${CONTEXT_DIR}/design-doc.md`;
|
|
17
|
-
const READINESS_FILE = `${CONTEXT_DIR}/readiness.md`;
|
|
18
|
-
const PRD_FILE = `${CONTEXT_DIR}/prd.md`;
|
|
19
|
-
const UI_SPEC_FILE = `${CONTEXT_DIR}/ui-spec.md`;
|
|
20
|
-
const SCAN_INDEX_FILE = `${CONTEXT_DIR}/scan-index.md`;
|
|
21
|
-
const SCAN_FOLDERS_FILE = `${CONTEXT_DIR}/scan-folders.md`;
|
|
22
|
-
const SCAN_AIOSON_FILE = `${CONTEXT_DIR}/scan-aioson.md`;
|
|
23
|
-
const CONTEXT_PACK_FILE = `${CONTEXT_DIR}/context-pack.md`;
|
|
24
|
-
const BOOTSTRAP_DIR = '.aioson/context/bootstrap';
|
|
25
|
-
const BOOTSTRAP_WHAT_IS = `${BOOTSTRAP_DIR}/what-is.md`;
|
|
26
|
-
const BOOTSTRAP_HOW_IT_WORKS = `${BOOTSTRAP_DIR}/how-it-works.md`;
|
|
27
|
-
const BOOTSTRAP_WHAT_IT_DOES = `${BOOTSTRAP_DIR}/what-it-does.md`;
|
|
28
|
-
const BOOTSTRAP_CURRENT_STATE = `${BOOTSTRAP_DIR}/current-state.md`;
|
|
29
|
-
|
|
30
|
-
const SPEC_SECTION_ALIASES = {
|
|
31
|
-
stack: ['stack'],
|
|
32
|
-
current_state: ['estado atual', 'current state', 'estado actual', 'etat actuel'],
|
|
33
|
-
done: ['concluido', 'done', 'completado', 'termine'],
|
|
34
|
-
in_progress: ['em andamento', 'in progress', 'en progreso', 'en cours'],
|
|
35
|
-
planned: ['planejado', 'planned', 'planificado', 'planifie'],
|
|
36
|
-
open_decisions: ['decisoes em aberto', 'open decisions', 'decisiones abiertas', 'decisions ouvertes'],
|
|
37
|
-
decided: ['decisoes tomadas', 'decisions taken', 'decisiones tomadas', 'decisions prises'],
|
|
38
|
-
notes: ['notas', 'notes']
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
const CONTEXT_DOC_SPECS = [
|
|
42
|
-
{
|
|
43
|
-
relPath: PROJECT_CONTEXT_FILE,
|
|
44
|
-
title: 'Project Context',
|
|
45
|
-
group: 'foundation',
|
|
46
|
-
readWhen: 'stack, classification, framework installation status, language and tool assumptions',
|
|
47
|
-
tags: ['foundation', 'project', 'stack']
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
relPath: MEMORY_INDEX_FILE,
|
|
51
|
-
title: 'Memory Index',
|
|
52
|
-
group: 'foundation',
|
|
53
|
-
readWhen: 'you want to decide the minimum context to load next',
|
|
54
|
-
tags: ['foundation', 'index', 'routing']
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
relPath: SKELETON_FILE,
|
|
58
|
-
title: 'System Skeleton',
|
|
59
|
-
group: 'system',
|
|
60
|
-
readWhen: 'you need a quick structural map before opening deeper files',
|
|
61
|
-
tags: ['system', 'structure', 'quick']
|
|
62
|
-
},
|
|
63
|
-
{
|
|
64
|
-
relPath: DISCOVERY_FILE,
|
|
65
|
-
title: 'Discovery',
|
|
66
|
-
group: 'system',
|
|
67
|
-
readWhen: 'you need entities, routes, conventions, dependencies or what must be preserved',
|
|
68
|
-
tags: ['system', 'domain', 'entities', 'routes']
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
relPath: ARCHITECTURE_FILE,
|
|
72
|
-
title: 'Architecture',
|
|
73
|
-
group: 'system',
|
|
74
|
-
readWhen: 'you need technical boundaries, module order, migration sequence or implementation structure',
|
|
75
|
-
tags: ['system', 'architecture', 'implementation']
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
relPath: SPEC_FILE,
|
|
79
|
-
title: 'Spec',
|
|
80
|
-
group: 'development',
|
|
81
|
-
readWhen: 'you need the authoritative living development memory for the whole project',
|
|
82
|
-
tags: ['development', 'source-of-truth', 'spec']
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
relPath: SPEC_CURRENT_FILE,
|
|
86
|
-
title: 'Spec Current',
|
|
87
|
-
group: 'development',
|
|
88
|
-
readWhen: 'you only need current state, in-progress items and open decisions',
|
|
89
|
-
tags: ['development', 'current', 'spec']
|
|
90
|
-
},
|
|
91
|
-
{
|
|
92
|
-
relPath: SPEC_HISTORY_FILE,
|
|
93
|
-
title: 'Spec History',
|
|
94
|
-
group: 'development',
|
|
95
|
-
readWhen: 'you need completed work, historical decisions, regressions or previous implementation context',
|
|
96
|
-
tags: ['development', 'history', 'decisions', 'regression']
|
|
97
|
-
},
|
|
98
|
-
{
|
|
99
|
-
relPath: DESIGN_DOC_FILE,
|
|
100
|
-
title: 'Design Doc',
|
|
101
|
-
group: 'scope',
|
|
102
|
-
readWhen: 'you need the living scope framing for the current initiative',
|
|
103
|
-
tags: ['scope', 'design-doc', 'planning']
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
relPath: READINESS_FILE,
|
|
107
|
-
title: 'Readiness',
|
|
108
|
-
group: 'scope',
|
|
109
|
-
readWhen: 'you need to know if the current scope is ready for planning or implementation',
|
|
110
|
-
tags: ['scope', 'readiness', 'planning']
|
|
111
|
-
},
|
|
112
|
-
{
|
|
113
|
-
relPath: PRD_FILE,
|
|
114
|
-
title: 'PRD',
|
|
115
|
-
group: 'scope',
|
|
116
|
-
readWhen: 'you need product intent, MVP scope or acceptance targets',
|
|
117
|
-
tags: ['scope', 'product', 'acceptance']
|
|
118
|
-
},
|
|
119
|
-
{
|
|
120
|
-
relPath: UI_SPEC_FILE,
|
|
121
|
-
title: 'UI Spec',
|
|
122
|
-
group: 'scope',
|
|
123
|
-
readWhen: 'you need UI tokens, screen map, states or handoff notes',
|
|
124
|
-
tags: ['scope', 'ui', 'design']
|
|
125
|
-
},
|
|
126
|
-
{
|
|
127
|
-
relPath: SCAN_INDEX_FILE,
|
|
128
|
-
title: 'Scan Index',
|
|
129
|
-
group: 'scan',
|
|
130
|
-
readWhen: 'you need the brownfield scan footprint and links to local maps',
|
|
131
|
-
tags: ['scan', 'brownfield', 'index']
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
relPath: SCAN_FOLDERS_FILE,
|
|
135
|
-
title: 'Folder Map',
|
|
136
|
-
group: 'scan',
|
|
137
|
-
readWhen: 'you need the top-level directory map of the project',
|
|
138
|
-
tags: ['scan', 'brownfield', 'folders']
|
|
139
|
-
},
|
|
140
|
-
{
|
|
141
|
-
relPath: SCAN_AIOSON_FILE,
|
|
142
|
-
title: 'AIOSON Generated Map',
|
|
143
|
-
group: 'scan',
|
|
144
|
-
readWhen: 'you need generated context pages, squads, genomes or local MCP artifacts',
|
|
145
|
-
tags: ['scan', 'brownfield', 'aioson']
|
|
146
|
-
},
|
|
147
|
-
{
|
|
148
|
-
relPath: BOOTSTRAP_WHAT_IS,
|
|
149
|
-
title: 'System Identity',
|
|
150
|
-
group: 'bootstrap',
|
|
151
|
-
readWhen: 'you need to understand what the system IS, who uses it, and why it exists',
|
|
152
|
-
tags: ['bootstrap', 'identity', 'semantic']
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
relPath: BOOTSTRAP_HOW_IT_WORKS,
|
|
156
|
-
title: 'System Mechanics',
|
|
157
|
-
group: 'bootstrap',
|
|
158
|
-
readWhen: 'you need to understand how the system works — architecture, modules, data flow',
|
|
159
|
-
tags: ['bootstrap', 'architecture', 'semantic']
|
|
160
|
-
},
|
|
161
|
-
{
|
|
162
|
-
relPath: BOOTSTRAP_WHAT_IT_DOES,
|
|
163
|
-
title: 'System Features',
|
|
164
|
-
group: 'bootstrap',
|
|
165
|
-
readWhen: 'you need to know what features exist, business rules, and user workflows',
|
|
166
|
-
tags: ['bootstrap', 'features', 'semantic']
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
relPath: BOOTSTRAP_CURRENT_STATE,
|
|
170
|
-
title: 'System Current State',
|
|
171
|
-
group: 'bootstrap',
|
|
172
|
-
readWhen: 'you need to know what is implemented, in progress, or planned',
|
|
173
|
-
tags: ['bootstrap', 'state', 'semantic']
|
|
174
|
-
}
|
|
175
|
-
];
|
|
176
|
-
|
|
177
|
-
function normalizeForLookup(value) {
|
|
178
|
-
return String(value || '')
|
|
179
|
-
.normalize('NFD')
|
|
180
|
-
.replace(/[\u0300-\u036f]/g, '')
|
|
181
|
-
.toLowerCase()
|
|
182
|
-
.replace(/[`*_]/g, '')
|
|
183
|
-
.replace(/[^a-z0-9]+/g, ' ')
|
|
184
|
-
.trim();
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
function sanitizeContextSegment(value) {
|
|
188
|
-
return String(value || '')
|
|
189
|
-
.trim()
|
|
190
|
-
.replace(/\\/g, '/')
|
|
191
|
-
.replace(/^\.\/+/, '')
|
|
192
|
-
.replace(/[/.]+/g, '-')
|
|
193
|
-
.replace(/[^a-zA-Z0-9_-]+/g, '-')
|
|
194
|
-
.replace(/-+/g, '-')
|
|
195
|
-
.replace(/^-|-$/g, '') || 'module';
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
function buildModuleMemoryRelativePath(folder) {
|
|
199
|
-
return `${CONTEXT_DIR}/module-${sanitizeContextSegment(folder)}.md`;
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
function splitFrontmatter(markdown) {
|
|
203
|
-
const text = String(markdown || '');
|
|
204
|
-
if (!text.startsWith('---\n')) {
|
|
205
|
-
return { frontmatter: '', body: text };
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
const markerIndex = text.indexOf('\n---\n', 4);
|
|
209
|
-
if (markerIndex === -1) {
|
|
210
|
-
return { frontmatter: '', body: text };
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
return {
|
|
214
|
-
frontmatter: text.slice(0, markerIndex + 5).trim(),
|
|
215
|
-
body: text.slice(markerIndex + 5)
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
|
|
219
|
-
function extractMarkdownSection(markdown, aliases) {
|
|
220
|
-
const wanted = new Set((aliases || []).map(normalizeForLookup));
|
|
221
|
-
if (wanted.size === 0) return '';
|
|
222
|
-
|
|
223
|
-
const { body } = splitFrontmatter(markdown);
|
|
224
|
-
const lines = String(body || '').split('\n');
|
|
225
|
-
let start = -1;
|
|
226
|
-
let level = 0;
|
|
227
|
-
|
|
228
|
-
for (let i = 0; i < lines.length; i += 1) {
|
|
229
|
-
const line = lines[i];
|
|
230
|
-
const match = /^(#{1,6})\s+(.+?)\s*$/.exec(line);
|
|
231
|
-
if (!match) continue;
|
|
232
|
-
|
|
233
|
-
const headingLevel = match[1].length;
|
|
234
|
-
const heading = normalizeForLookup(match[2]);
|
|
235
|
-
|
|
236
|
-
if (start === -1 && wanted.has(heading)) {
|
|
237
|
-
start = i + 1;
|
|
238
|
-
level = headingLevel;
|
|
239
|
-
continue;
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
if (start !== -1 && headingLevel <= level) {
|
|
243
|
-
return lines.slice(start, i).join('\n').trim();
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
|
|
247
|
-
if (start !== -1) {
|
|
248
|
-
return lines.slice(start).join('\n').trim();
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
return '';
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
function trimExcerpt(markdown, maxChars = 2200) {
|
|
255
|
-
const text = String(markdown || '').trim();
|
|
256
|
-
if (text.length <= maxChars) return text;
|
|
257
|
-
return `${text.slice(0, maxChars).trimEnd()}\n... [truncated at ${maxChars} chars]`;
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
function takeLastListItems(markdown, maxItems = 5) {
|
|
261
|
-
const lines = String(markdown || '')
|
|
262
|
-
.split('\n')
|
|
263
|
-
.map((line) => line.trim())
|
|
264
|
-
.filter((line) => /^[-*]\s+/.test(line) || /^\d+\.\s+/.test(line));
|
|
265
|
-
|
|
266
|
-
if (lines.length === 0) return '';
|
|
267
|
-
return lines.slice(-maxItems).join('\n');
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
function fallbackSection(text) {
|
|
271
|
-
const trimmed = String(text || '').trim();
|
|
272
|
-
return trimmed || '_Not captured in spec.md_';
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
function buildSpecCurrentMarkdown(specContent, generatedAt) {
|
|
276
|
-
if (!specContent) return null;
|
|
277
|
-
|
|
278
|
-
const stack = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.stack);
|
|
279
|
-
const currentState = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.current_state);
|
|
280
|
-
const inProgress = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.in_progress);
|
|
281
|
-
const planned = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.planned);
|
|
282
|
-
const openDecisions = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.open_decisions);
|
|
283
|
-
const notes = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.notes);
|
|
284
|
-
const latestDecisions = takeLastListItems(
|
|
285
|
-
extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.decided),
|
|
286
|
-
5
|
|
287
|
-
);
|
|
288
|
-
|
|
289
|
-
return [
|
|
290
|
-
'# Spec Current',
|
|
291
|
-
`_Generated from spec.md — ${generatedAt}_`,
|
|
292
|
-
'',
|
|
293
|
-
'## Source',
|
|
294
|
-
`- Authoritative source: \`${SPEC_FILE}\``,
|
|
295
|
-
'- This file is a focused view for current implementation context.',
|
|
296
|
-
'',
|
|
297
|
-
'## Stack',
|
|
298
|
-
fallbackSection(stack),
|
|
299
|
-
'',
|
|
300
|
-
'## Current state',
|
|
301
|
-
fallbackSection(currentState),
|
|
302
|
-
'',
|
|
303
|
-
'## In progress',
|
|
304
|
-
fallbackSection(inProgress),
|
|
305
|
-
'',
|
|
306
|
-
'## Planned next',
|
|
307
|
-
fallbackSection(planned),
|
|
308
|
-
'',
|
|
309
|
-
'## Open decisions',
|
|
310
|
-
fallbackSection(openDecisions),
|
|
311
|
-
'',
|
|
312
|
-
'## Latest decisions',
|
|
313
|
-
fallbackSection(latestDecisions),
|
|
314
|
-
'',
|
|
315
|
-
'## Notes for the next session',
|
|
316
|
-
fallbackSection(notes)
|
|
317
|
-
].join('\n');
|
|
318
|
-
}
|
|
319
|
-
|
|
320
|
-
function buildSpecHistoryMarkdown(specContent, generatedAt) {
|
|
321
|
-
if (!specContent) return null;
|
|
322
|
-
|
|
323
|
-
const done = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.done);
|
|
324
|
-
const decided = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.decided);
|
|
325
|
-
const notes = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.notes);
|
|
326
|
-
|
|
327
|
-
return [
|
|
328
|
-
'# Spec History',
|
|
329
|
-
`_Generated from spec.md — ${generatedAt}_`,
|
|
330
|
-
'',
|
|
331
|
-
'## Source',
|
|
332
|
-
`- Authoritative source: \`${SPEC_FILE}\``,
|
|
333
|
-
'- Use this view when you need historical implementation context, completed work or dated decisions.',
|
|
334
|
-
'',
|
|
335
|
-
'## Completed work',
|
|
336
|
-
fallbackSection(done),
|
|
337
|
-
'',
|
|
338
|
-
'## Decision log',
|
|
339
|
-
fallbackSection(decided),
|
|
340
|
-
'',
|
|
341
|
-
'## Archived notes',
|
|
342
|
-
fallbackSection(notes)
|
|
343
|
-
].join('\n');
|
|
344
|
-
}
|
|
345
|
-
|
|
346
|
-
function extractTreeBlock(markdown) {
|
|
347
|
-
const match = /```text\n([\s\S]*?)\n```/.exec(String(markdown || ''));
|
|
348
|
-
return match ? match[1].trim() : '';
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
function summarizeTree(tree) {
|
|
352
|
-
const lines = String(tree || '').split('\n').filter(Boolean);
|
|
353
|
-
const directories = lines.filter((line) => line.trim().endsWith('/')).length;
|
|
354
|
-
const files = Math.max(0, lines.length - directories);
|
|
355
|
-
return { directories, files, preview: lines.slice(0, 18).join('\n') };
|
|
356
|
-
}
|
|
357
|
-
|
|
358
|
-
function buildModuleMemoryMarkdown({ folder, scanRelativePath, scanMarkdown, generatedAt }) {
|
|
359
|
-
const tree = extractTreeBlock(scanMarkdown);
|
|
360
|
-
const treeSummary = summarizeTree(tree);
|
|
361
|
-
|
|
362
|
-
return [
|
|
363
|
-
`# Module Memory: ${folder}`,
|
|
364
|
-
`_Generated from ${scanRelativePath} — ${generatedAt}_`,
|
|
365
|
-
'',
|
|
366
|
-
'## Read this when',
|
|
367
|
-
`- you are working inside \`${folder}/\``,
|
|
368
|
-
'- you want a focused context slice before opening the raw scan map',
|
|
369
|
-
'- you need to route a context pack to this module or folder',
|
|
370
|
-
'',
|
|
371
|
-
'## Scope',
|
|
372
|
-
`- Source folder: \`${folder}/\``,
|
|
373
|
-
`- Source scan map: \`${scanRelativePath}\``,
|
|
374
|
-
`- Approx structure: ${treeSummary.directories} directories, ${treeSummary.files} files`,
|
|
375
|
-
'',
|
|
376
|
-
'## Quick map',
|
|
377
|
-
treeSummary.preview
|
|
378
|
-
? ['```text', treeSummary.preview, '```'].join('\n')
|
|
379
|
-
: '_No tree preview available_',
|
|
380
|
-
'',
|
|
381
|
-
'## Related memory',
|
|
382
|
-
`- \`${SKELETON_FILE}\` for project-wide structure`,
|
|
383
|
-
`- \`${DISCOVERY_FILE}\` for domain, conventions and entities`,
|
|
384
|
-
`- \`${ARCHITECTURE_FILE}\` for technical boundaries`,
|
|
385
|
-
`- \`${SPEC_CURRENT_FILE}\` for active implementation context`
|
|
386
|
-
].join('\n');
|
|
387
|
-
}
|
|
388
|
-
|
|
389
|
-
async function loadExistingFolderScans(targetDir) {
|
|
390
|
-
const contextDir = path.join(targetDir, CONTEXT_DIR);
|
|
391
|
-
let names = [];
|
|
392
|
-
try {
|
|
393
|
-
names = await fs.readdir(contextDir);
|
|
394
|
-
} catch {
|
|
395
|
-
return [];
|
|
396
|
-
}
|
|
397
|
-
|
|
398
|
-
const scanFiles = names
|
|
399
|
-
.filter((name) => /^scan-.+\.md$/.test(name))
|
|
400
|
-
.filter((name) => !['scan-index.md', 'scan-folders.md', 'scan-aioson.md'].includes(name))
|
|
401
|
-
.sort((a, b) => a.localeCompare(b));
|
|
402
|
-
|
|
403
|
-
const out = [];
|
|
404
|
-
for (const name of scanFiles) {
|
|
405
|
-
const relPath = `${CONTEXT_DIR}/${name}`;
|
|
406
|
-
const markdown = await readTextIfExists(path.join(targetDir, relPath));
|
|
407
|
-
if (!markdown) continue;
|
|
408
|
-
const titleMatch = /^# Folder Scan: (.+)$/m.exec(markdown);
|
|
409
|
-
const folder = titleMatch ? titleMatch[1].trim() : name.replace(/^scan-/, '').replace(/\.md$/, '');
|
|
410
|
-
out.push({
|
|
411
|
-
folder,
|
|
412
|
-
relativePath: relPath,
|
|
413
|
-
absolutePath: path.join(targetDir, relPath),
|
|
414
|
-
markdown
|
|
415
|
-
});
|
|
416
|
-
}
|
|
417
|
-
return out;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
async function collectContextCatalog(targetDir) {
|
|
421
|
-
const docs = [];
|
|
422
|
-
|
|
423
|
-
for (const spec of CONTEXT_DOC_SPECS) {
|
|
424
|
-
docs.push({
|
|
425
|
-
...spec,
|
|
426
|
-
exists: await exists(path.join(targetDir, spec.relPath))
|
|
427
|
-
});
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
const contextDir = path.join(targetDir, CONTEXT_DIR);
|
|
431
|
-
let names = [];
|
|
432
|
-
try {
|
|
433
|
-
names = await fs.readdir(contextDir);
|
|
434
|
-
} catch {
|
|
435
|
-
return docs;
|
|
436
|
-
}
|
|
437
|
-
|
|
438
|
-
const dynamicFiles = names
|
|
439
|
-
.filter((name) => name.endsWith('.md'))
|
|
440
|
-
.filter((name) => !docs.some((doc) => path.basename(doc.relPath) === name))
|
|
441
|
-
.sort((a, b) => a.localeCompare(b));
|
|
442
|
-
|
|
443
|
-
for (const name of dynamicFiles) {
|
|
444
|
-
const relPath = `${CONTEXT_DIR}/${name}`;
|
|
445
|
-
if (/^module-.+\.md$/.test(name)) {
|
|
446
|
-
docs.push({
|
|
447
|
-
relPath,
|
|
448
|
-
title: `Module Memory (${name.replace(/^module-/, '').replace(/\.md$/, '')})`,
|
|
449
|
-
group: 'modules',
|
|
450
|
-
readWhen: 'you need a focused module-level slice instead of the whole project memory',
|
|
451
|
-
tags: ['module', 'focus'],
|
|
452
|
-
exists: true
|
|
453
|
-
});
|
|
454
|
-
continue;
|
|
455
|
-
}
|
|
456
|
-
|
|
457
|
-
if (/^scan-.+\.md$/.test(name)) {
|
|
458
|
-
docs.push({
|
|
459
|
-
relPath,
|
|
460
|
-
title: `Scan Map (${name.replace(/^scan-/, '').replace(/\.md$/, '')})`,
|
|
461
|
-
group: 'scan',
|
|
462
|
-
readWhen: 'you need raw brownfield structure for a specific folder',
|
|
463
|
-
tags: ['scan', 'brownfield'],
|
|
464
|
-
exists: true
|
|
465
|
-
});
|
|
466
|
-
continue;
|
|
467
|
-
}
|
|
468
|
-
|
|
469
|
-
if (/^prd-.+\.md$/.test(name)) {
|
|
470
|
-
docs.push({
|
|
471
|
-
relPath,
|
|
472
|
-
title: `Feature PRD (${name.replace(/^prd-/, '').replace(/\.md$/, '')})`,
|
|
473
|
-
group: 'scope',
|
|
474
|
-
readWhen: 'you are working on a feature-specific product scope',
|
|
475
|
-
tags: ['scope', 'prd', 'feature'],
|
|
476
|
-
exists: true
|
|
477
|
-
});
|
|
478
|
-
continue;
|
|
479
|
-
}
|
|
480
|
-
|
|
481
|
-
if (/^spec-.+\.md$/.test(name)) {
|
|
482
|
-
docs.push({
|
|
483
|
-
relPath,
|
|
484
|
-
title: `Feature Spec (${name.replace(/^spec-/, '').replace(/\.md$/, '')})`,
|
|
485
|
-
group: 'development',
|
|
486
|
-
readWhen: 'you need implementation details for a specific feature rather than the whole project',
|
|
487
|
-
tags: ['development', 'feature', 'spec'],
|
|
488
|
-
exists: true
|
|
489
|
-
});
|
|
490
|
-
continue;
|
|
491
|
-
}
|
|
492
|
-
|
|
493
|
-
if (/^requirements-.+\.md$/.test(name)) {
|
|
494
|
-
docs.push({
|
|
495
|
-
relPath,
|
|
496
|
-
title: `Feature Requirements (${name.replace(/^requirements-/, '').replace(/\.md$/, '')})`,
|
|
497
|
-
group: 'scope',
|
|
498
|
-
readWhen: 'you need feature-specific requirements and edge cases',
|
|
499
|
-
tags: ['scope', 'feature', 'requirements'],
|
|
500
|
-
exists: true
|
|
501
|
-
});
|
|
502
|
-
}
|
|
503
|
-
}
|
|
504
|
-
|
|
505
|
-
return docs;
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
function buildMemoryIndexMarkdown({ generatedAt, catalog }) {
|
|
509
|
-
const available = catalog.filter((doc) => doc.exists);
|
|
510
|
-
const grouped = new Map();
|
|
511
|
-
for (const doc of available) {
|
|
512
|
-
if (!grouped.has(doc.group)) grouped.set(doc.group, []);
|
|
513
|
-
grouped.get(doc.group).push(doc);
|
|
514
|
-
}
|
|
515
|
-
|
|
516
|
-
const lines = [
|
|
517
|
-
'# Memory Index',
|
|
518
|
-
`_Generated by aioson memory refresh — ${generatedAt}_`,
|
|
519
|
-
'',
|
|
520
|
-
'## Start here',
|
|
521
|
-
`- Read \`${PROJECT_CONTEXT_FILE}\` first for stack, classification, framework state and language.`,
|
|
522
|
-
`- Read \`${MEMORY_INDEX_FILE}\` when you need to decide the smallest useful context pack.`,
|
|
523
|
-
`- Read \`${SKELETON_FILE}\` before \`${DISCOVERY_FILE}\` when you only need quick orientation.`,
|
|
524
|
-
`- Treat \`${DISCOVERY_FILE}\` + \`${SPEC_FILE}\` as the full project memory pair.`,
|
|
525
|
-
`- Prefer \`${SPEC_CURRENT_FILE}\` for the active state and \`${SPEC_HISTORY_FILE}\` for historical decisions.`,
|
|
526
|
-
'',
|
|
527
|
-
'## Suggested reading order by task',
|
|
528
|
-
`- Code change: \`${PROJECT_CONTEXT_FILE}\` -> \`${SKELETON_FILE}\` -> \`${DISCOVERY_FILE}\` -> \`${SPEC_CURRENT_FILE}\` -> \`${ARCHITECTURE_FILE}\``,
|
|
529
|
-
`- Regression / bugfix: \`${PROJECT_CONTEXT_FILE}\` -> \`${SKELETON_FILE}\` -> \`${DISCOVERY_FILE}\` -> \`${SPEC_CURRENT_FILE}\` -> \`${SPEC_HISTORY_FILE}\``,
|
|
530
|
-
`- Product / planning: \`${PROJECT_CONTEXT_FILE}\` -> \`${DISCOVERY_FILE}\` -> \`${PRD_FILE}\` -> \`${DESIGN_DOC_FILE}\` -> \`${READINESS_FILE}\``,
|
|
531
|
-
`- Brownfield deep dive: \`${SCAN_INDEX_FILE}\` -> module memory -> folder scan -> \`${DISCOVERY_FILE}\``,
|
|
532
|
-
''
|
|
533
|
-
];
|
|
534
|
-
|
|
535
|
-
const groupOrder = ['foundation', 'bootstrap', 'system', 'development', 'scope', 'modules', 'scan'];
|
|
536
|
-
const groupTitles = {
|
|
537
|
-
foundation: 'Foundation Docs',
|
|
538
|
-
bootstrap: 'Bootstrap — Semantic Knowledge Cache',
|
|
539
|
-
system: 'System Memory',
|
|
540
|
-
development: 'Development Memory',
|
|
541
|
-
scope: 'Scope Docs',
|
|
542
|
-
modules: 'Module Docs',
|
|
543
|
-
scan: 'Brownfield Maps'
|
|
544
|
-
};
|
|
545
|
-
|
|
546
|
-
for (const group of groupOrder) {
|
|
547
|
-
const docs = grouped.get(group) || [];
|
|
548
|
-
if (docs.length === 0) continue;
|
|
549
|
-
lines.push(`## ${groupTitles[group]}`);
|
|
550
|
-
lines.push('| File | Read when |');
|
|
551
|
-
lines.push('|------|-----------|');
|
|
552
|
-
for (const doc of docs) {
|
|
553
|
-
lines.push(`| ${doc.relPath} | ${doc.readWhen} |`);
|
|
554
|
-
}
|
|
555
|
-
lines.push('');
|
|
556
|
-
}
|
|
557
|
-
|
|
558
|
-
if (available.length === 0) {
|
|
559
|
-
lines.push('_No context documents detected yet_');
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
return lines.join('\n').trim();
|
|
563
|
-
}
|
|
564
|
-
|
|
565
|
-
function rankContextDoc(doc, { agent, goal, module }) {
|
|
566
|
-
let score = 0;
|
|
567
|
-
const reasons = [];
|
|
568
|
-
const lowerGoal = normalizeForLookup(goal);
|
|
569
|
-
const lowerAgent = normalizeForLookup(agent);
|
|
570
|
-
const lowerModule = normalizeForLookup(module);
|
|
571
|
-
const lookupText = `${lowerAgent} ${lowerGoal}`.trim();
|
|
572
|
-
|
|
573
|
-
if (doc.relPath === PROJECT_CONTEXT_FILE) {
|
|
574
|
-
score += 100;
|
|
575
|
-
reasons.push('base project metadata');
|
|
576
|
-
}
|
|
577
|
-
if (doc.relPath === MEMORY_INDEX_FILE) {
|
|
578
|
-
score += 90;
|
|
579
|
-
reasons.push('routing map for minimal context');
|
|
580
|
-
}
|
|
581
|
-
if (doc.relPath === SKELETON_FILE) {
|
|
582
|
-
score += 80;
|
|
583
|
-
reasons.push('fast structural orientation');
|
|
584
|
-
}
|
|
585
|
-
if (doc.relPath === DISCOVERY_FILE) {
|
|
586
|
-
score += 75;
|
|
587
|
-
reasons.push('domain and conventions');
|
|
588
|
-
}
|
|
589
|
-
if (doc.relPath === SPEC_CURRENT_FILE) {
|
|
590
|
-
score += 70;
|
|
591
|
-
reasons.push('active development state');
|
|
592
|
-
}
|
|
593
|
-
if (doc.relPath === SPEC_HISTORY_FILE && /(history|historico|historic|regress|rollback|why|decision|decisao|decisión)/.test(lowerGoal)) {
|
|
594
|
-
score += 70;
|
|
595
|
-
reasons.push('historical decision context');
|
|
596
|
-
}
|
|
597
|
-
if (doc.relPath === ARCHITECTURE_FILE && /(architect|dev|qa|refactor|endpoint|service|migration|model|api)/.test(lowerAgent || lowerGoal)) {
|
|
598
|
-
score += 60;
|
|
599
|
-
reasons.push('technical boundaries and sequencing');
|
|
600
|
-
}
|
|
601
|
-
if (doc.relPath === UI_SPEC_FILE && /(ui|ux|layout|screen|tela|css|design|frontend)/.test(lowerGoal || lowerAgent)) {
|
|
602
|
-
score += 60;
|
|
603
|
-
reasons.push('UI-specific context');
|
|
604
|
-
}
|
|
605
|
-
if (doc.relPath === PRD_FILE && /(product|pm|qa|accept|scope|mvp|feature)/.test(lowerGoal || lowerAgent)) {
|
|
606
|
-
score += 45;
|
|
607
|
-
reasons.push('product and acceptance context');
|
|
608
|
-
}
|
|
609
|
-
if (doc.relPath === DESIGN_DOC_FILE && /(scope|product|analyst|architect|pm|plan)/.test(lowerGoal || lowerAgent)) {
|
|
610
|
-
score += 45;
|
|
611
|
-
reasons.push('current scope framing');
|
|
612
|
-
}
|
|
613
|
-
if (doc.relPath === READINESS_FILE && /(ready|readiness|plan|architect|analyst|pm)/.test(lowerGoal || lowerAgent)) {
|
|
614
|
-
score += 35;
|
|
615
|
-
reasons.push('readiness signal');
|
|
616
|
-
}
|
|
617
|
-
if (doc.group === 'bootstrap') {
|
|
618
|
-
if (doc.relPath === BOOTSTRAP_WHAT_IS && /(product|analyst|what|identity|understand|discover|bootstrap|memory|continuity)/.test(lookupText)) {
|
|
619
|
-
score += 70;
|
|
620
|
-
reasons.push('semantic system identity');
|
|
621
|
-
}
|
|
622
|
-
if (doc.relPath === BOOTSTRAP_HOW_IT_WORKS && /(dev|architect|how|architecture|implement|refactor|bootstrap|memory|continuity)/.test(lookupText)) {
|
|
623
|
-
score += 70;
|
|
624
|
-
reasons.push('semantic system mechanics');
|
|
625
|
-
}
|
|
626
|
-
if (doc.relPath === BOOTSTRAP_WHAT_IT_DOES && /(product|analyst|feature|business|rule|workflow|bootstrap|memory|continuity)/.test(lookupText)) {
|
|
627
|
-
score += 65;
|
|
628
|
-
reasons.push('semantic features and business rules');
|
|
629
|
-
}
|
|
630
|
-
if (doc.relPath === BOOTSTRAP_CURRENT_STATE && /(dev|qa|state|current|progress|status|bootstrap|memory|continuity)/.test(lookupText)) {
|
|
631
|
-
score += 65;
|
|
632
|
-
reasons.push('semantic current state');
|
|
633
|
-
}
|
|
634
|
-
}
|
|
635
|
-
if (/module-/.test(doc.relPath) && lowerModule) {
|
|
636
|
-
if (normalizeForLookup(doc.relPath).includes(lowerModule)) {
|
|
637
|
-
score += 80;
|
|
638
|
-
reasons.push(`module focus: ${module}`);
|
|
639
|
-
}
|
|
640
|
-
}
|
|
641
|
-
if (/scan-/.test(doc.relPath) && lowerModule) {
|
|
642
|
-
if (normalizeForLookup(doc.relPath).includes(lowerModule)) {
|
|
643
|
-
score += 55;
|
|
644
|
-
reasons.push(`raw scan for module: ${module}`);
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
if (/module-/.test(doc.relPath) && /(module|folder|area|feature)/.test(lowerGoal)) {
|
|
648
|
-
score += 25;
|
|
649
|
-
reasons.push('module-focused request');
|
|
650
|
-
}
|
|
651
|
-
if (/(bug|fix|regress|refactor|implement|endpoint|route|service|model|migration|auth|caption|editor)/.test(lowerGoal)) {
|
|
652
|
-
if ([DISCOVERY_FILE, SPEC_CURRENT_FILE, ARCHITECTURE_FILE, SKELETON_FILE].includes(doc.relPath)) {
|
|
653
|
-
score += 20;
|
|
654
|
-
}
|
|
655
|
-
}
|
|
656
|
-
|
|
657
|
-
if (reasons.length === 0 && doc.group === 'scan') {
|
|
658
|
-
score += 10;
|
|
659
|
-
reasons.push('fallback brownfield map');
|
|
660
|
-
}
|
|
661
|
-
|
|
662
|
-
return { score, reasons };
|
|
663
|
-
}
|
|
664
|
-
|
|
665
|
-
function buildPackExcerpt(content, relPath) {
|
|
666
|
-
if (!content) return '_File not found_';
|
|
667
|
-
if (relPath === SPEC_HISTORY_FILE) {
|
|
668
|
-
const lines = String(content).trim().split('\n');
|
|
669
|
-
return trimExcerpt(lines.slice(-80).join('\n'), 2200);
|
|
670
|
-
}
|
|
671
|
-
if (relPath.endsWith('project.context.md') || relPath.endsWith('memory-index.md')) {
|
|
672
|
-
return trimExcerpt(content, 2800);
|
|
673
|
-
}
|
|
674
|
-
if (/module-|scan-/.test(path.basename(relPath))) {
|
|
675
|
-
return trimExcerpt(content, 1800);
|
|
676
|
-
}
|
|
677
|
-
return trimExcerpt(content, 2400);
|
|
678
|
-
}
|
|
679
|
-
|
|
680
|
-
function buildContextPackMarkdown({ generatedAt, agent, goal, module, selectedDocs }) {
|
|
681
|
-
const lines = [
|
|
682
|
-
'# Context Pack',
|
|
683
|
-
`_Generated by aioson context:pack — ${generatedAt}_`,
|
|
684
|
-
'',
|
|
685
|
-
'## Request',
|
|
686
|
-
`- Agent: ${agent ? `@${agent}` : '(not specified)'}`,
|
|
687
|
-
`- Goal: ${goal || '(not specified)'}`,
|
|
688
|
-
`- Module focus: ${module || '(not specified)'}`,
|
|
689
|
-
'',
|
|
690
|
-
'## Recommended reading order'
|
|
691
|
-
];
|
|
692
|
-
|
|
693
|
-
if (selectedDocs.length === 0) {
|
|
694
|
-
lines.push('_No context files matched yet. Run setup:context, scan:project, or create the relevant context docs first._');
|
|
695
|
-
} else {
|
|
696
|
-
selectedDocs.forEach((doc, index) => {
|
|
697
|
-
lines.push(`${index + 1}. \`${doc.relPath}\` — ${doc.reason}`);
|
|
698
|
-
});
|
|
699
|
-
}
|
|
700
|
-
|
|
701
|
-
lines.push('', '## Embedded context');
|
|
702
|
-
if (selectedDocs.length === 0) {
|
|
703
|
-
lines.push('', '_No embedded excerpts available yet_');
|
|
704
|
-
} else {
|
|
705
|
-
for (const doc of selectedDocs) {
|
|
706
|
-
lines.push('', `### ${doc.relPath}`);
|
|
707
|
-
lines.push(`Reason: ${doc.reason}`);
|
|
708
|
-
lines.push('```md');
|
|
709
|
-
lines.push(doc.excerpt);
|
|
710
|
-
lines.push('```');
|
|
711
|
-
}
|
|
712
|
-
}
|
|
713
|
-
|
|
714
|
-
return lines.join('\n');
|
|
715
|
-
}
|
|
716
|
-
|
|
717
|
-
async function writeTextFile(filePath, content) {
|
|
718
|
-
await ensureDir(path.dirname(filePath));
|
|
719
|
-
await fs.writeFile(filePath, `${String(content).trim()}\n`, 'utf8');
|
|
720
|
-
}
|
|
721
|
-
|
|
722
|
-
async function writeDerivedContextMemory({
|
|
723
|
-
targetDir,
|
|
724
|
-
generatedAt = new Date().toISOString().replace(/\.\d+Z$/, 'Z'),
|
|
725
|
-
folderScans = []
|
|
726
|
-
}) {
|
|
727
|
-
const effectiveFolderScans =
|
|
728
|
-
folderScans.length > 0 ? folderScans : await loadExistingFolderScans(targetDir);
|
|
729
|
-
|
|
730
|
-
const specContent = await readTextIfExists(path.join(targetDir, SPEC_FILE));
|
|
731
|
-
const written = [];
|
|
732
|
-
|
|
733
|
-
let specCurrentPath = null;
|
|
734
|
-
let specHistoryPath = null;
|
|
735
|
-
if (specContent) {
|
|
736
|
-
specCurrentPath = path.join(targetDir, SPEC_CURRENT_FILE);
|
|
737
|
-
specHistoryPath = path.join(targetDir, SPEC_HISTORY_FILE);
|
|
738
|
-
await writeTextFile(specCurrentPath, buildSpecCurrentMarkdown(specContent, generatedAt));
|
|
739
|
-
await writeTextFile(specHistoryPath, buildSpecHistoryMarkdown(specContent, generatedAt));
|
|
740
|
-
written.push(SPEC_CURRENT_FILE, SPEC_HISTORY_FILE);
|
|
741
|
-
}
|
|
742
|
-
|
|
743
|
-
const moduleDocs = [];
|
|
744
|
-
for (const scan of effectiveFolderScans) {
|
|
745
|
-
const relativePath = buildModuleMemoryRelativePath(scan.folder);
|
|
746
|
-
const absolutePath = path.join(targetDir, relativePath);
|
|
747
|
-
const markdown = buildModuleMemoryMarkdown({
|
|
748
|
-
folder: scan.folder,
|
|
749
|
-
scanRelativePath: scan.relativePath,
|
|
750
|
-
scanMarkdown: scan.markdown,
|
|
751
|
-
generatedAt
|
|
752
|
-
});
|
|
753
|
-
await writeTextFile(absolutePath, markdown);
|
|
754
|
-
moduleDocs.push({
|
|
755
|
-
folder: scan.folder,
|
|
756
|
-
relativePath,
|
|
757
|
-
absolutePath
|
|
758
|
-
});
|
|
759
|
-
written.push(relativePath);
|
|
760
|
-
}
|
|
761
|
-
|
|
762
|
-
const catalog = await collectContextCatalog(targetDir);
|
|
763
|
-
const catalogWithMemoryIndex = catalog.some((doc) => doc.relPath === MEMORY_INDEX_FILE)
|
|
764
|
-
? catalog
|
|
765
|
-
: [
|
|
766
|
-
...catalog,
|
|
767
|
-
{
|
|
768
|
-
relPath: MEMORY_INDEX_FILE,
|
|
769
|
-
title: 'Memory Index',
|
|
770
|
-
group: 'foundation',
|
|
771
|
-
readWhen: 'you want to decide the minimum context to load next',
|
|
772
|
-
tags: ['foundation', 'index', 'routing'],
|
|
773
|
-
exists: true
|
|
774
|
-
}
|
|
775
|
-
];
|
|
776
|
-
const memoryIndexPath = path.join(targetDir, MEMORY_INDEX_FILE);
|
|
777
|
-
const memoryIndexMarkdown = buildMemoryIndexMarkdown({
|
|
778
|
-
generatedAt,
|
|
779
|
-
catalog: catalogWithMemoryIndex
|
|
780
|
-
});
|
|
781
|
-
await writeTextFile(memoryIndexPath, memoryIndexMarkdown);
|
|
782
|
-
written.push(MEMORY_INDEX_FILE);
|
|
783
|
-
|
|
784
|
-
return {
|
|
785
|
-
written,
|
|
786
|
-
memoryIndexPath,
|
|
787
|
-
specCurrentPath,
|
|
788
|
-
specHistoryPath,
|
|
789
|
-
moduleDocs
|
|
790
|
-
};
|
|
791
|
-
}
|
|
792
|
-
|
|
793
|
-
async function collectActiveDossiers(targetDir) {
|
|
794
|
-
const featuresDir = path.join(targetDir, CONTEXT_DIR, 'features');
|
|
795
|
-
let slugs = [];
|
|
796
|
-
try {
|
|
797
|
-
const entries = await fs.readdir(featuresDir, { withFileTypes: true });
|
|
798
|
-
slugs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
799
|
-
} catch {
|
|
800
|
-
return [];
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
const active = [];
|
|
804
|
-
for (const slug of slugs) {
|
|
805
|
-
const p = path.join(featuresDir, slug, 'dossier.md');
|
|
806
|
-
try {
|
|
807
|
-
const raw = await fs.readFile(p, 'utf8');
|
|
808
|
-
const statusMatch = raw.match(/^status:\s*(\S+)\s*$/m);
|
|
809
|
-
const updatedMatch = raw.match(/^last_updated_at:\s*(\S+)\s*$/m);
|
|
810
|
-
if (!statusMatch || statusMatch[1] !== 'active') continue;
|
|
811
|
-
const relPath = `${CONTEXT_DIR}/features/${slug}/dossier.md`;
|
|
812
|
-
active.push({
|
|
813
|
-
relPath,
|
|
814
|
-
slug,
|
|
815
|
-
lastUpdatedAt: updatedMatch ? updatedMatch[1] : null,
|
|
816
|
-
title: `Feature Dossier (${slug})`,
|
|
817
|
-
group: 'dossier',
|
|
818
|
-
readWhen: `active feature "${slug}" synthesis — why, what, code map, agent trail`,
|
|
819
|
-
tags: ['dossier', 'feature', 'active'],
|
|
820
|
-
exists: true
|
|
821
|
-
});
|
|
822
|
-
} catch {
|
|
823
|
-
// skip unreadable
|
|
824
|
-
}
|
|
825
|
-
}
|
|
826
|
-
|
|
827
|
-
// Sort by last_updated_at descending (most recent first)
|
|
828
|
-
active.sort((a, b) => {
|
|
829
|
-
if (!a.lastUpdatedAt && !b.lastUpdatedAt) return 0;
|
|
830
|
-
if (!a.lastUpdatedAt) return 1;
|
|
831
|
-
if (!b.lastUpdatedAt) return -1;
|
|
832
|
-
return b.lastUpdatedAt.localeCompare(a.lastUpdatedAt);
|
|
833
|
-
});
|
|
834
|
-
|
|
835
|
-
return active;
|
|
836
|
-
}
|
|
837
|
-
|
|
838
|
-
function rankDossier(dossier, { agent, goal }, rank) {
|
|
839
|
-
// Base score: between PRD (45) and bootstrap (65). Most recent dossier gets 60.
|
|
840
|
-
let score = 60 - rank * 5;
|
|
841
|
-
const reasons = [`active feature dossier (${dossier.slug})`];
|
|
842
|
-
const lookupText = `${normalizeForLookup(agent)} ${normalizeForLookup(goal)}`.trim();
|
|
843
|
-
if (lookupText.includes(dossier.slug.replace(/-/g, ' '))) {
|
|
844
|
-
score += 15;
|
|
845
|
-
reasons.push('matches active feature slug');
|
|
846
|
-
}
|
|
847
|
-
if (/(dev|architect|qa|implement|feature|dossier)/.test(lookupText)) {
|
|
848
|
-
score += 10;
|
|
849
|
-
reasons.push('agent/goal matches dossier context');
|
|
850
|
-
}
|
|
851
|
-
return { score: Math.max(score, 0), reasons };
|
|
852
|
-
}
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
858
|
-
|
|
859
|
-
|
|
860
|
-
|
|
861
|
-
|
|
862
|
-
|
|
863
|
-
|
|
864
|
-
|
|
865
|
-
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
const
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
const
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
};
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
895
|
-
|
|
896
|
-
|
|
897
|
-
|
|
898
|
-
|
|
899
|
-
|
|
900
|
-
const
|
|
901
|
-
for (const doc of
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
|
|
909
|
-
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
}
|
|
917
|
-
|
|
918
|
-
const
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
|
|
924
|
-
|
|
925
|
-
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
959
|
-
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
|
|
963
|
-
|
|
964
|
-
|
|
965
|
-
|
|
966
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const path = require('node:path');
|
|
4
|
+
const fs = require('node:fs/promises');
|
|
5
|
+
const { exists, readTextIfExists, ensureDir } = require('./utils');
|
|
6
|
+
|
|
7
|
+
const CONTEXT_DIR = '.aioson/context';
|
|
8
|
+
const PROJECT_CONTEXT_FILE = `${CONTEXT_DIR}/project.context.md`;
|
|
9
|
+
const DISCOVERY_FILE = `${CONTEXT_DIR}/discovery.md`;
|
|
10
|
+
const SKELETON_FILE = `${CONTEXT_DIR}/skeleton-system.md`;
|
|
11
|
+
const ARCHITECTURE_FILE = `${CONTEXT_DIR}/architecture.md`;
|
|
12
|
+
const SPEC_FILE = `${CONTEXT_DIR}/spec.md`;
|
|
13
|
+
const SPEC_CURRENT_FILE = `${CONTEXT_DIR}/spec-current.md`;
|
|
14
|
+
const SPEC_HISTORY_FILE = `${CONTEXT_DIR}/spec-history.md`;
|
|
15
|
+
const MEMORY_INDEX_FILE = `${CONTEXT_DIR}/memory-index.md`;
|
|
16
|
+
const DESIGN_DOC_FILE = `${CONTEXT_DIR}/design-doc.md`;
|
|
17
|
+
const READINESS_FILE = `${CONTEXT_DIR}/readiness.md`;
|
|
18
|
+
const PRD_FILE = `${CONTEXT_DIR}/prd.md`;
|
|
19
|
+
const UI_SPEC_FILE = `${CONTEXT_DIR}/ui-spec.md`;
|
|
20
|
+
const SCAN_INDEX_FILE = `${CONTEXT_DIR}/scan-index.md`;
|
|
21
|
+
const SCAN_FOLDERS_FILE = `${CONTEXT_DIR}/scan-folders.md`;
|
|
22
|
+
const SCAN_AIOSON_FILE = `${CONTEXT_DIR}/scan-aioson.md`;
|
|
23
|
+
const CONTEXT_PACK_FILE = `${CONTEXT_DIR}/context-pack.md`;
|
|
24
|
+
const BOOTSTRAP_DIR = '.aioson/context/bootstrap';
|
|
25
|
+
const BOOTSTRAP_WHAT_IS = `${BOOTSTRAP_DIR}/what-is.md`;
|
|
26
|
+
const BOOTSTRAP_HOW_IT_WORKS = `${BOOTSTRAP_DIR}/how-it-works.md`;
|
|
27
|
+
const BOOTSTRAP_WHAT_IT_DOES = `${BOOTSTRAP_DIR}/what-it-does.md`;
|
|
28
|
+
const BOOTSTRAP_CURRENT_STATE = `${BOOTSTRAP_DIR}/current-state.md`;
|
|
29
|
+
|
|
30
|
+
const SPEC_SECTION_ALIASES = {
|
|
31
|
+
stack: ['stack'],
|
|
32
|
+
current_state: ['estado atual', 'current state', 'estado actual', 'etat actuel'],
|
|
33
|
+
done: ['concluido', 'done', 'completado', 'termine'],
|
|
34
|
+
in_progress: ['em andamento', 'in progress', 'en progreso', 'en cours'],
|
|
35
|
+
planned: ['planejado', 'planned', 'planificado', 'planifie'],
|
|
36
|
+
open_decisions: ['decisoes em aberto', 'open decisions', 'decisiones abiertas', 'decisions ouvertes'],
|
|
37
|
+
decided: ['decisoes tomadas', 'decisions taken', 'decisiones tomadas', 'decisions prises'],
|
|
38
|
+
notes: ['notas', 'notes']
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
const CONTEXT_DOC_SPECS = [
|
|
42
|
+
{
|
|
43
|
+
relPath: PROJECT_CONTEXT_FILE,
|
|
44
|
+
title: 'Project Context',
|
|
45
|
+
group: 'foundation',
|
|
46
|
+
readWhen: 'stack, classification, framework installation status, language and tool assumptions',
|
|
47
|
+
tags: ['foundation', 'project', 'stack']
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
relPath: MEMORY_INDEX_FILE,
|
|
51
|
+
title: 'Memory Index',
|
|
52
|
+
group: 'foundation',
|
|
53
|
+
readWhen: 'you want to decide the minimum context to load next',
|
|
54
|
+
tags: ['foundation', 'index', 'routing']
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
relPath: SKELETON_FILE,
|
|
58
|
+
title: 'System Skeleton',
|
|
59
|
+
group: 'system',
|
|
60
|
+
readWhen: 'you need a quick structural map before opening deeper files',
|
|
61
|
+
tags: ['system', 'structure', 'quick']
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
relPath: DISCOVERY_FILE,
|
|
65
|
+
title: 'Discovery',
|
|
66
|
+
group: 'system',
|
|
67
|
+
readWhen: 'you need entities, routes, conventions, dependencies or what must be preserved',
|
|
68
|
+
tags: ['system', 'domain', 'entities', 'routes']
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
relPath: ARCHITECTURE_FILE,
|
|
72
|
+
title: 'Architecture',
|
|
73
|
+
group: 'system',
|
|
74
|
+
readWhen: 'you need technical boundaries, module order, migration sequence or implementation structure',
|
|
75
|
+
tags: ['system', 'architecture', 'implementation']
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
relPath: SPEC_FILE,
|
|
79
|
+
title: 'Spec',
|
|
80
|
+
group: 'development',
|
|
81
|
+
readWhen: 'you need the authoritative living development memory for the whole project',
|
|
82
|
+
tags: ['development', 'source-of-truth', 'spec']
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
relPath: SPEC_CURRENT_FILE,
|
|
86
|
+
title: 'Spec Current',
|
|
87
|
+
group: 'development',
|
|
88
|
+
readWhen: 'you only need current state, in-progress items and open decisions',
|
|
89
|
+
tags: ['development', 'current', 'spec']
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
relPath: SPEC_HISTORY_FILE,
|
|
93
|
+
title: 'Spec History',
|
|
94
|
+
group: 'development',
|
|
95
|
+
readWhen: 'you need completed work, historical decisions, regressions or previous implementation context',
|
|
96
|
+
tags: ['development', 'history', 'decisions', 'regression']
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
relPath: DESIGN_DOC_FILE,
|
|
100
|
+
title: 'Design Doc',
|
|
101
|
+
group: 'scope',
|
|
102
|
+
readWhen: 'you need the living scope framing for the current initiative',
|
|
103
|
+
tags: ['scope', 'design-doc', 'planning']
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
relPath: READINESS_FILE,
|
|
107
|
+
title: 'Readiness',
|
|
108
|
+
group: 'scope',
|
|
109
|
+
readWhen: 'you need to know if the current scope is ready for planning or implementation',
|
|
110
|
+
tags: ['scope', 'readiness', 'planning']
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
relPath: PRD_FILE,
|
|
114
|
+
title: 'PRD',
|
|
115
|
+
group: 'scope',
|
|
116
|
+
readWhen: 'you need product intent, MVP scope or acceptance targets',
|
|
117
|
+
tags: ['scope', 'product', 'acceptance']
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
relPath: UI_SPEC_FILE,
|
|
121
|
+
title: 'UI Spec',
|
|
122
|
+
group: 'scope',
|
|
123
|
+
readWhen: 'you need UI tokens, screen map, states or handoff notes',
|
|
124
|
+
tags: ['scope', 'ui', 'design']
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
relPath: SCAN_INDEX_FILE,
|
|
128
|
+
title: 'Scan Index',
|
|
129
|
+
group: 'scan',
|
|
130
|
+
readWhen: 'you need the brownfield scan footprint and links to local maps',
|
|
131
|
+
tags: ['scan', 'brownfield', 'index']
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
relPath: SCAN_FOLDERS_FILE,
|
|
135
|
+
title: 'Folder Map',
|
|
136
|
+
group: 'scan',
|
|
137
|
+
readWhen: 'you need the top-level directory map of the project',
|
|
138
|
+
tags: ['scan', 'brownfield', 'folders']
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
relPath: SCAN_AIOSON_FILE,
|
|
142
|
+
title: 'AIOSON Generated Map',
|
|
143
|
+
group: 'scan',
|
|
144
|
+
readWhen: 'you need generated context pages, squads, genomes or local MCP artifacts',
|
|
145
|
+
tags: ['scan', 'brownfield', 'aioson']
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
relPath: BOOTSTRAP_WHAT_IS,
|
|
149
|
+
title: 'System Identity',
|
|
150
|
+
group: 'bootstrap',
|
|
151
|
+
readWhen: 'you need to understand what the system IS, who uses it, and why it exists',
|
|
152
|
+
tags: ['bootstrap', 'identity', 'semantic']
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
relPath: BOOTSTRAP_HOW_IT_WORKS,
|
|
156
|
+
title: 'System Mechanics',
|
|
157
|
+
group: 'bootstrap',
|
|
158
|
+
readWhen: 'you need to understand how the system works — architecture, modules, data flow',
|
|
159
|
+
tags: ['bootstrap', 'architecture', 'semantic']
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
relPath: BOOTSTRAP_WHAT_IT_DOES,
|
|
163
|
+
title: 'System Features',
|
|
164
|
+
group: 'bootstrap',
|
|
165
|
+
readWhen: 'you need to know what features exist, business rules, and user workflows',
|
|
166
|
+
tags: ['bootstrap', 'features', 'semantic']
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
relPath: BOOTSTRAP_CURRENT_STATE,
|
|
170
|
+
title: 'System Current State',
|
|
171
|
+
group: 'bootstrap',
|
|
172
|
+
readWhen: 'you need to know what is implemented, in progress, or planned',
|
|
173
|
+
tags: ['bootstrap', 'state', 'semantic']
|
|
174
|
+
}
|
|
175
|
+
];
|
|
176
|
+
|
|
177
|
+
function normalizeForLookup(value) {
|
|
178
|
+
return String(value || '')
|
|
179
|
+
.normalize('NFD')
|
|
180
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
181
|
+
.toLowerCase()
|
|
182
|
+
.replace(/[`*_]/g, '')
|
|
183
|
+
.replace(/[^a-z0-9]+/g, ' ')
|
|
184
|
+
.trim();
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
function sanitizeContextSegment(value) {
|
|
188
|
+
return String(value || '')
|
|
189
|
+
.trim()
|
|
190
|
+
.replace(/\\/g, '/')
|
|
191
|
+
.replace(/^\.\/+/, '')
|
|
192
|
+
.replace(/[/.]+/g, '-')
|
|
193
|
+
.replace(/[^a-zA-Z0-9_-]+/g, '-')
|
|
194
|
+
.replace(/-+/g, '-')
|
|
195
|
+
.replace(/^-|-$/g, '') || 'module';
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function buildModuleMemoryRelativePath(folder) {
|
|
199
|
+
return `${CONTEXT_DIR}/module-${sanitizeContextSegment(folder)}.md`;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
function splitFrontmatter(markdown) {
|
|
203
|
+
const text = String(markdown || '');
|
|
204
|
+
if (!text.startsWith('---\n')) {
|
|
205
|
+
return { frontmatter: '', body: text };
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
const markerIndex = text.indexOf('\n---\n', 4);
|
|
209
|
+
if (markerIndex === -1) {
|
|
210
|
+
return { frontmatter: '', body: text };
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return {
|
|
214
|
+
frontmatter: text.slice(0, markerIndex + 5).trim(),
|
|
215
|
+
body: text.slice(markerIndex + 5)
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
function extractMarkdownSection(markdown, aliases) {
|
|
220
|
+
const wanted = new Set((aliases || []).map(normalizeForLookup));
|
|
221
|
+
if (wanted.size === 0) return '';
|
|
222
|
+
|
|
223
|
+
const { body } = splitFrontmatter(markdown);
|
|
224
|
+
const lines = String(body || '').split('\n');
|
|
225
|
+
let start = -1;
|
|
226
|
+
let level = 0;
|
|
227
|
+
|
|
228
|
+
for (let i = 0; i < lines.length; i += 1) {
|
|
229
|
+
const line = lines[i];
|
|
230
|
+
const match = /^(#{1,6})\s+(.+?)\s*$/.exec(line);
|
|
231
|
+
if (!match) continue;
|
|
232
|
+
|
|
233
|
+
const headingLevel = match[1].length;
|
|
234
|
+
const heading = normalizeForLookup(match[2]);
|
|
235
|
+
|
|
236
|
+
if (start === -1 && wanted.has(heading)) {
|
|
237
|
+
start = i + 1;
|
|
238
|
+
level = headingLevel;
|
|
239
|
+
continue;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
if (start !== -1 && headingLevel <= level) {
|
|
243
|
+
return lines.slice(start, i).join('\n').trim();
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (start !== -1) {
|
|
248
|
+
return lines.slice(start).join('\n').trim();
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
return '';
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
function trimExcerpt(markdown, maxChars = 2200) {
|
|
255
|
+
const text = String(markdown || '').trim();
|
|
256
|
+
if (text.length <= maxChars) return text;
|
|
257
|
+
return `${text.slice(0, maxChars).trimEnd()}\n... [truncated at ${maxChars} chars]`;
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function takeLastListItems(markdown, maxItems = 5) {
|
|
261
|
+
const lines = String(markdown || '')
|
|
262
|
+
.split('\n')
|
|
263
|
+
.map((line) => line.trim())
|
|
264
|
+
.filter((line) => /^[-*]\s+/.test(line) || /^\d+\.\s+/.test(line));
|
|
265
|
+
|
|
266
|
+
if (lines.length === 0) return '';
|
|
267
|
+
return lines.slice(-maxItems).join('\n');
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
function fallbackSection(text) {
|
|
271
|
+
const trimmed = String(text || '').trim();
|
|
272
|
+
return trimmed || '_Not captured in spec.md_';
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
function buildSpecCurrentMarkdown(specContent, generatedAt) {
|
|
276
|
+
if (!specContent) return null;
|
|
277
|
+
|
|
278
|
+
const stack = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.stack);
|
|
279
|
+
const currentState = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.current_state);
|
|
280
|
+
const inProgress = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.in_progress);
|
|
281
|
+
const planned = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.planned);
|
|
282
|
+
const openDecisions = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.open_decisions);
|
|
283
|
+
const notes = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.notes);
|
|
284
|
+
const latestDecisions = takeLastListItems(
|
|
285
|
+
extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.decided),
|
|
286
|
+
5
|
|
287
|
+
);
|
|
288
|
+
|
|
289
|
+
return [
|
|
290
|
+
'# Spec Current',
|
|
291
|
+
`_Generated from spec.md — ${generatedAt}_`,
|
|
292
|
+
'',
|
|
293
|
+
'## Source',
|
|
294
|
+
`- Authoritative source: \`${SPEC_FILE}\``,
|
|
295
|
+
'- This file is a focused view for current implementation context.',
|
|
296
|
+
'',
|
|
297
|
+
'## Stack',
|
|
298
|
+
fallbackSection(stack),
|
|
299
|
+
'',
|
|
300
|
+
'## Current state',
|
|
301
|
+
fallbackSection(currentState),
|
|
302
|
+
'',
|
|
303
|
+
'## In progress',
|
|
304
|
+
fallbackSection(inProgress),
|
|
305
|
+
'',
|
|
306
|
+
'## Planned next',
|
|
307
|
+
fallbackSection(planned),
|
|
308
|
+
'',
|
|
309
|
+
'## Open decisions',
|
|
310
|
+
fallbackSection(openDecisions),
|
|
311
|
+
'',
|
|
312
|
+
'## Latest decisions',
|
|
313
|
+
fallbackSection(latestDecisions),
|
|
314
|
+
'',
|
|
315
|
+
'## Notes for the next session',
|
|
316
|
+
fallbackSection(notes)
|
|
317
|
+
].join('\n');
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
function buildSpecHistoryMarkdown(specContent, generatedAt) {
|
|
321
|
+
if (!specContent) return null;
|
|
322
|
+
|
|
323
|
+
const done = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.done);
|
|
324
|
+
const decided = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.decided);
|
|
325
|
+
const notes = extractMarkdownSection(specContent, SPEC_SECTION_ALIASES.notes);
|
|
326
|
+
|
|
327
|
+
return [
|
|
328
|
+
'# Spec History',
|
|
329
|
+
`_Generated from spec.md — ${generatedAt}_`,
|
|
330
|
+
'',
|
|
331
|
+
'## Source',
|
|
332
|
+
`- Authoritative source: \`${SPEC_FILE}\``,
|
|
333
|
+
'- Use this view when you need historical implementation context, completed work or dated decisions.',
|
|
334
|
+
'',
|
|
335
|
+
'## Completed work',
|
|
336
|
+
fallbackSection(done),
|
|
337
|
+
'',
|
|
338
|
+
'## Decision log',
|
|
339
|
+
fallbackSection(decided),
|
|
340
|
+
'',
|
|
341
|
+
'## Archived notes',
|
|
342
|
+
fallbackSection(notes)
|
|
343
|
+
].join('\n');
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function extractTreeBlock(markdown) {
|
|
347
|
+
const match = /```text\n([\s\S]*?)\n```/.exec(String(markdown || ''));
|
|
348
|
+
return match ? match[1].trim() : '';
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
function summarizeTree(tree) {
|
|
352
|
+
const lines = String(tree || '').split('\n').filter(Boolean);
|
|
353
|
+
const directories = lines.filter((line) => line.trim().endsWith('/')).length;
|
|
354
|
+
const files = Math.max(0, lines.length - directories);
|
|
355
|
+
return { directories, files, preview: lines.slice(0, 18).join('\n') };
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function buildModuleMemoryMarkdown({ folder, scanRelativePath, scanMarkdown, generatedAt }) {
|
|
359
|
+
const tree = extractTreeBlock(scanMarkdown);
|
|
360
|
+
const treeSummary = summarizeTree(tree);
|
|
361
|
+
|
|
362
|
+
return [
|
|
363
|
+
`# Module Memory: ${folder}`,
|
|
364
|
+
`_Generated from ${scanRelativePath} — ${generatedAt}_`,
|
|
365
|
+
'',
|
|
366
|
+
'## Read this when',
|
|
367
|
+
`- you are working inside \`${folder}/\``,
|
|
368
|
+
'- you want a focused context slice before opening the raw scan map',
|
|
369
|
+
'- you need to route a context pack to this module or folder',
|
|
370
|
+
'',
|
|
371
|
+
'## Scope',
|
|
372
|
+
`- Source folder: \`${folder}/\``,
|
|
373
|
+
`- Source scan map: \`${scanRelativePath}\``,
|
|
374
|
+
`- Approx structure: ${treeSummary.directories} directories, ${treeSummary.files} files`,
|
|
375
|
+
'',
|
|
376
|
+
'## Quick map',
|
|
377
|
+
treeSummary.preview
|
|
378
|
+
? ['```text', treeSummary.preview, '```'].join('\n')
|
|
379
|
+
: '_No tree preview available_',
|
|
380
|
+
'',
|
|
381
|
+
'## Related memory',
|
|
382
|
+
`- \`${SKELETON_FILE}\` for project-wide structure`,
|
|
383
|
+
`- \`${DISCOVERY_FILE}\` for domain, conventions and entities`,
|
|
384
|
+
`- \`${ARCHITECTURE_FILE}\` for technical boundaries`,
|
|
385
|
+
`- \`${SPEC_CURRENT_FILE}\` for active implementation context`
|
|
386
|
+
].join('\n');
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
async function loadExistingFolderScans(targetDir) {
|
|
390
|
+
const contextDir = path.join(targetDir, CONTEXT_DIR);
|
|
391
|
+
let names = [];
|
|
392
|
+
try {
|
|
393
|
+
names = await fs.readdir(contextDir);
|
|
394
|
+
} catch {
|
|
395
|
+
return [];
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
const scanFiles = names
|
|
399
|
+
.filter((name) => /^scan-.+\.md$/.test(name))
|
|
400
|
+
.filter((name) => !['scan-index.md', 'scan-folders.md', 'scan-aioson.md'].includes(name))
|
|
401
|
+
.sort((a, b) => a.localeCompare(b));
|
|
402
|
+
|
|
403
|
+
const out = [];
|
|
404
|
+
for (const name of scanFiles) {
|
|
405
|
+
const relPath = `${CONTEXT_DIR}/${name}`;
|
|
406
|
+
const markdown = await readTextIfExists(path.join(targetDir, relPath));
|
|
407
|
+
if (!markdown) continue;
|
|
408
|
+
const titleMatch = /^# Folder Scan: (.+)$/m.exec(markdown);
|
|
409
|
+
const folder = titleMatch ? titleMatch[1].trim() : name.replace(/^scan-/, '').replace(/\.md$/, '');
|
|
410
|
+
out.push({
|
|
411
|
+
folder,
|
|
412
|
+
relativePath: relPath,
|
|
413
|
+
absolutePath: path.join(targetDir, relPath),
|
|
414
|
+
markdown
|
|
415
|
+
});
|
|
416
|
+
}
|
|
417
|
+
return out;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
async function collectContextCatalog(targetDir) {
|
|
421
|
+
const docs = [];
|
|
422
|
+
|
|
423
|
+
for (const spec of CONTEXT_DOC_SPECS) {
|
|
424
|
+
docs.push({
|
|
425
|
+
...spec,
|
|
426
|
+
exists: await exists(path.join(targetDir, spec.relPath))
|
|
427
|
+
});
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
const contextDir = path.join(targetDir, CONTEXT_DIR);
|
|
431
|
+
let names = [];
|
|
432
|
+
try {
|
|
433
|
+
names = await fs.readdir(contextDir);
|
|
434
|
+
} catch {
|
|
435
|
+
return docs;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
const dynamicFiles = names
|
|
439
|
+
.filter((name) => name.endsWith('.md'))
|
|
440
|
+
.filter((name) => !docs.some((doc) => path.basename(doc.relPath) === name))
|
|
441
|
+
.sort((a, b) => a.localeCompare(b));
|
|
442
|
+
|
|
443
|
+
for (const name of dynamicFiles) {
|
|
444
|
+
const relPath = `${CONTEXT_DIR}/${name}`;
|
|
445
|
+
if (/^module-.+\.md$/.test(name)) {
|
|
446
|
+
docs.push({
|
|
447
|
+
relPath,
|
|
448
|
+
title: `Module Memory (${name.replace(/^module-/, '').replace(/\.md$/, '')})`,
|
|
449
|
+
group: 'modules',
|
|
450
|
+
readWhen: 'you need a focused module-level slice instead of the whole project memory',
|
|
451
|
+
tags: ['module', 'focus'],
|
|
452
|
+
exists: true
|
|
453
|
+
});
|
|
454
|
+
continue;
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
if (/^scan-.+\.md$/.test(name)) {
|
|
458
|
+
docs.push({
|
|
459
|
+
relPath,
|
|
460
|
+
title: `Scan Map (${name.replace(/^scan-/, '').replace(/\.md$/, '')})`,
|
|
461
|
+
group: 'scan',
|
|
462
|
+
readWhen: 'you need raw brownfield structure for a specific folder',
|
|
463
|
+
tags: ['scan', 'brownfield'],
|
|
464
|
+
exists: true
|
|
465
|
+
});
|
|
466
|
+
continue;
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
if (/^prd-.+\.md$/.test(name)) {
|
|
470
|
+
docs.push({
|
|
471
|
+
relPath,
|
|
472
|
+
title: `Feature PRD (${name.replace(/^prd-/, '').replace(/\.md$/, '')})`,
|
|
473
|
+
group: 'scope',
|
|
474
|
+
readWhen: 'you are working on a feature-specific product scope',
|
|
475
|
+
tags: ['scope', 'prd', 'feature'],
|
|
476
|
+
exists: true
|
|
477
|
+
});
|
|
478
|
+
continue;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
if (/^spec-.+\.md$/.test(name)) {
|
|
482
|
+
docs.push({
|
|
483
|
+
relPath,
|
|
484
|
+
title: `Feature Spec (${name.replace(/^spec-/, '').replace(/\.md$/, '')})`,
|
|
485
|
+
group: 'development',
|
|
486
|
+
readWhen: 'you need implementation details for a specific feature rather than the whole project',
|
|
487
|
+
tags: ['development', 'feature', 'spec'],
|
|
488
|
+
exists: true
|
|
489
|
+
});
|
|
490
|
+
continue;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
if (/^requirements-.+\.md$/.test(name)) {
|
|
494
|
+
docs.push({
|
|
495
|
+
relPath,
|
|
496
|
+
title: `Feature Requirements (${name.replace(/^requirements-/, '').replace(/\.md$/, '')})`,
|
|
497
|
+
group: 'scope',
|
|
498
|
+
readWhen: 'you need feature-specific requirements and edge cases',
|
|
499
|
+
tags: ['scope', 'feature', 'requirements'],
|
|
500
|
+
exists: true
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
return docs;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
function buildMemoryIndexMarkdown({ generatedAt, catalog }) {
|
|
509
|
+
const available = catalog.filter((doc) => doc.exists);
|
|
510
|
+
const grouped = new Map();
|
|
511
|
+
for (const doc of available) {
|
|
512
|
+
if (!grouped.has(doc.group)) grouped.set(doc.group, []);
|
|
513
|
+
grouped.get(doc.group).push(doc);
|
|
514
|
+
}
|
|
515
|
+
|
|
516
|
+
const lines = [
|
|
517
|
+
'# Memory Index',
|
|
518
|
+
`_Generated by aioson memory refresh — ${generatedAt}_`,
|
|
519
|
+
'',
|
|
520
|
+
'## Start here',
|
|
521
|
+
`- Read \`${PROJECT_CONTEXT_FILE}\` first for stack, classification, framework state and language.`,
|
|
522
|
+
`- Read \`${MEMORY_INDEX_FILE}\` when you need to decide the smallest useful context pack.`,
|
|
523
|
+
`- Read \`${SKELETON_FILE}\` before \`${DISCOVERY_FILE}\` when you only need quick orientation.`,
|
|
524
|
+
`- Treat \`${DISCOVERY_FILE}\` + \`${SPEC_FILE}\` as the full project memory pair.`,
|
|
525
|
+
`- Prefer \`${SPEC_CURRENT_FILE}\` for the active state and \`${SPEC_HISTORY_FILE}\` for historical decisions.`,
|
|
526
|
+
'',
|
|
527
|
+
'## Suggested reading order by task',
|
|
528
|
+
`- Code change: \`${PROJECT_CONTEXT_FILE}\` -> \`${SKELETON_FILE}\` -> \`${DISCOVERY_FILE}\` -> \`${SPEC_CURRENT_FILE}\` -> \`${ARCHITECTURE_FILE}\``,
|
|
529
|
+
`- Regression / bugfix: \`${PROJECT_CONTEXT_FILE}\` -> \`${SKELETON_FILE}\` -> \`${DISCOVERY_FILE}\` -> \`${SPEC_CURRENT_FILE}\` -> \`${SPEC_HISTORY_FILE}\``,
|
|
530
|
+
`- Product / planning: \`${PROJECT_CONTEXT_FILE}\` -> \`${DISCOVERY_FILE}\` -> \`${PRD_FILE}\` -> \`${DESIGN_DOC_FILE}\` -> \`${READINESS_FILE}\``,
|
|
531
|
+
`- Brownfield deep dive: \`${SCAN_INDEX_FILE}\` -> module memory -> folder scan -> \`${DISCOVERY_FILE}\``,
|
|
532
|
+
''
|
|
533
|
+
];
|
|
534
|
+
|
|
535
|
+
const groupOrder = ['foundation', 'bootstrap', 'system', 'development', 'scope', 'modules', 'scan'];
|
|
536
|
+
const groupTitles = {
|
|
537
|
+
foundation: 'Foundation Docs',
|
|
538
|
+
bootstrap: 'Bootstrap — Semantic Knowledge Cache',
|
|
539
|
+
system: 'System Memory',
|
|
540
|
+
development: 'Development Memory',
|
|
541
|
+
scope: 'Scope Docs',
|
|
542
|
+
modules: 'Module Docs',
|
|
543
|
+
scan: 'Brownfield Maps'
|
|
544
|
+
};
|
|
545
|
+
|
|
546
|
+
for (const group of groupOrder) {
|
|
547
|
+
const docs = grouped.get(group) || [];
|
|
548
|
+
if (docs.length === 0) continue;
|
|
549
|
+
lines.push(`## ${groupTitles[group]}`);
|
|
550
|
+
lines.push('| File | Read when |');
|
|
551
|
+
lines.push('|------|-----------|');
|
|
552
|
+
for (const doc of docs) {
|
|
553
|
+
lines.push(`| ${doc.relPath} | ${doc.readWhen} |`);
|
|
554
|
+
}
|
|
555
|
+
lines.push('');
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
if (available.length === 0) {
|
|
559
|
+
lines.push('_No context documents detected yet_');
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
return lines.join('\n').trim();
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
function rankContextDoc(doc, { agent, goal, module }) {
|
|
566
|
+
let score = 0;
|
|
567
|
+
const reasons = [];
|
|
568
|
+
const lowerGoal = normalizeForLookup(goal);
|
|
569
|
+
const lowerAgent = normalizeForLookup(agent);
|
|
570
|
+
const lowerModule = normalizeForLookup(module);
|
|
571
|
+
const lookupText = `${lowerAgent} ${lowerGoal}`.trim();
|
|
572
|
+
|
|
573
|
+
if (doc.relPath === PROJECT_CONTEXT_FILE) {
|
|
574
|
+
score += 100;
|
|
575
|
+
reasons.push('base project metadata');
|
|
576
|
+
}
|
|
577
|
+
if (doc.relPath === MEMORY_INDEX_FILE) {
|
|
578
|
+
score += 90;
|
|
579
|
+
reasons.push('routing map for minimal context');
|
|
580
|
+
}
|
|
581
|
+
if (doc.relPath === SKELETON_FILE) {
|
|
582
|
+
score += 80;
|
|
583
|
+
reasons.push('fast structural orientation');
|
|
584
|
+
}
|
|
585
|
+
if (doc.relPath === DISCOVERY_FILE) {
|
|
586
|
+
score += 75;
|
|
587
|
+
reasons.push('domain and conventions');
|
|
588
|
+
}
|
|
589
|
+
if (doc.relPath === SPEC_CURRENT_FILE) {
|
|
590
|
+
score += 70;
|
|
591
|
+
reasons.push('active development state');
|
|
592
|
+
}
|
|
593
|
+
if (doc.relPath === SPEC_HISTORY_FILE && /(history|historico|historic|regress|rollback|why|decision|decisao|decisión)/.test(lowerGoal)) {
|
|
594
|
+
score += 70;
|
|
595
|
+
reasons.push('historical decision context');
|
|
596
|
+
}
|
|
597
|
+
if (doc.relPath === ARCHITECTURE_FILE && /(architect|dev|qa|refactor|endpoint|service|migration|model|api)/.test(lowerAgent || lowerGoal)) {
|
|
598
|
+
score += 60;
|
|
599
|
+
reasons.push('technical boundaries and sequencing');
|
|
600
|
+
}
|
|
601
|
+
if (doc.relPath === UI_SPEC_FILE && /(ui|ux|layout|screen|tela|css|design|frontend)/.test(lowerGoal || lowerAgent)) {
|
|
602
|
+
score += 60;
|
|
603
|
+
reasons.push('UI-specific context');
|
|
604
|
+
}
|
|
605
|
+
if (doc.relPath === PRD_FILE && /(product|pm|qa|accept|scope|mvp|feature)/.test(lowerGoal || lowerAgent)) {
|
|
606
|
+
score += 45;
|
|
607
|
+
reasons.push('product and acceptance context');
|
|
608
|
+
}
|
|
609
|
+
if (doc.relPath === DESIGN_DOC_FILE && /(scope|product|analyst|architect|pm|plan)/.test(lowerGoal || lowerAgent)) {
|
|
610
|
+
score += 45;
|
|
611
|
+
reasons.push('current scope framing');
|
|
612
|
+
}
|
|
613
|
+
if (doc.relPath === READINESS_FILE && /(ready|readiness|plan|architect|analyst|pm)/.test(lowerGoal || lowerAgent)) {
|
|
614
|
+
score += 35;
|
|
615
|
+
reasons.push('readiness signal');
|
|
616
|
+
}
|
|
617
|
+
if (doc.group === 'bootstrap') {
|
|
618
|
+
if (doc.relPath === BOOTSTRAP_WHAT_IS && /(product|analyst|what|identity|understand|discover|bootstrap|memory|continuity)/.test(lookupText)) {
|
|
619
|
+
score += 70;
|
|
620
|
+
reasons.push('semantic system identity');
|
|
621
|
+
}
|
|
622
|
+
if (doc.relPath === BOOTSTRAP_HOW_IT_WORKS && /(dev|architect|how|architecture|implement|refactor|bootstrap|memory|continuity)/.test(lookupText)) {
|
|
623
|
+
score += 70;
|
|
624
|
+
reasons.push('semantic system mechanics');
|
|
625
|
+
}
|
|
626
|
+
if (doc.relPath === BOOTSTRAP_WHAT_IT_DOES && /(product|analyst|feature|business|rule|workflow|bootstrap|memory|continuity)/.test(lookupText)) {
|
|
627
|
+
score += 65;
|
|
628
|
+
reasons.push('semantic features and business rules');
|
|
629
|
+
}
|
|
630
|
+
if (doc.relPath === BOOTSTRAP_CURRENT_STATE && /(dev|qa|state|current|progress|status|bootstrap|memory|continuity)/.test(lookupText)) {
|
|
631
|
+
score += 65;
|
|
632
|
+
reasons.push('semantic current state');
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
if (/module-/.test(doc.relPath) && lowerModule) {
|
|
636
|
+
if (normalizeForLookup(doc.relPath).includes(lowerModule)) {
|
|
637
|
+
score += 80;
|
|
638
|
+
reasons.push(`module focus: ${module}`);
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
if (/scan-/.test(doc.relPath) && lowerModule) {
|
|
642
|
+
if (normalizeForLookup(doc.relPath).includes(lowerModule)) {
|
|
643
|
+
score += 55;
|
|
644
|
+
reasons.push(`raw scan for module: ${module}`);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
if (/module-/.test(doc.relPath) && /(module|folder|area|feature)/.test(lowerGoal)) {
|
|
648
|
+
score += 25;
|
|
649
|
+
reasons.push('module-focused request');
|
|
650
|
+
}
|
|
651
|
+
if (/(bug|fix|regress|refactor|implement|endpoint|route|service|model|migration|auth|caption|editor)/.test(lowerGoal)) {
|
|
652
|
+
if ([DISCOVERY_FILE, SPEC_CURRENT_FILE, ARCHITECTURE_FILE, SKELETON_FILE].includes(doc.relPath)) {
|
|
653
|
+
score += 20;
|
|
654
|
+
}
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
if (reasons.length === 0 && doc.group === 'scan') {
|
|
658
|
+
score += 10;
|
|
659
|
+
reasons.push('fallback brownfield map');
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
return { score, reasons };
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
function buildPackExcerpt(content, relPath) {
|
|
666
|
+
if (!content) return '_File not found_';
|
|
667
|
+
if (relPath === SPEC_HISTORY_FILE) {
|
|
668
|
+
const lines = String(content).trim().split('\n');
|
|
669
|
+
return trimExcerpt(lines.slice(-80).join('\n'), 2200);
|
|
670
|
+
}
|
|
671
|
+
if (relPath.endsWith('project.context.md') || relPath.endsWith('memory-index.md')) {
|
|
672
|
+
return trimExcerpt(content, 2800);
|
|
673
|
+
}
|
|
674
|
+
if (/module-|scan-/.test(path.basename(relPath))) {
|
|
675
|
+
return trimExcerpt(content, 1800);
|
|
676
|
+
}
|
|
677
|
+
return trimExcerpt(content, 2400);
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
function buildContextPackMarkdown({ generatedAt, agent, goal, module, selectedDocs }) {
|
|
681
|
+
const lines = [
|
|
682
|
+
'# Context Pack',
|
|
683
|
+
`_Generated by aioson context:pack — ${generatedAt}_`,
|
|
684
|
+
'',
|
|
685
|
+
'## Request',
|
|
686
|
+
`- Agent: ${agent ? `@${agent}` : '(not specified)'}`,
|
|
687
|
+
`- Goal: ${goal || '(not specified)'}`,
|
|
688
|
+
`- Module focus: ${module || '(not specified)'}`,
|
|
689
|
+
'',
|
|
690
|
+
'## Recommended reading order'
|
|
691
|
+
];
|
|
692
|
+
|
|
693
|
+
if (selectedDocs.length === 0) {
|
|
694
|
+
lines.push('_No context files matched yet. Run setup:context, scan:project, or create the relevant context docs first._');
|
|
695
|
+
} else {
|
|
696
|
+
selectedDocs.forEach((doc, index) => {
|
|
697
|
+
lines.push(`${index + 1}. \`${doc.relPath}\` — ${doc.reason}`);
|
|
698
|
+
});
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
lines.push('', '## Embedded context');
|
|
702
|
+
if (selectedDocs.length === 0) {
|
|
703
|
+
lines.push('', '_No embedded excerpts available yet_');
|
|
704
|
+
} else {
|
|
705
|
+
for (const doc of selectedDocs) {
|
|
706
|
+
lines.push('', `### ${doc.relPath}`);
|
|
707
|
+
lines.push(`Reason: ${doc.reason}`);
|
|
708
|
+
lines.push('```md');
|
|
709
|
+
lines.push(doc.excerpt);
|
|
710
|
+
lines.push('```');
|
|
711
|
+
}
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
return lines.join('\n');
|
|
715
|
+
}
|
|
716
|
+
|
|
717
|
+
async function writeTextFile(filePath, content) {
|
|
718
|
+
await ensureDir(path.dirname(filePath));
|
|
719
|
+
await fs.writeFile(filePath, `${String(content).trim()}\n`, 'utf8');
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
async function writeDerivedContextMemory({
|
|
723
|
+
targetDir,
|
|
724
|
+
generatedAt = new Date().toISOString().replace(/\.\d+Z$/, 'Z'),
|
|
725
|
+
folderScans = []
|
|
726
|
+
}) {
|
|
727
|
+
const effectiveFolderScans =
|
|
728
|
+
folderScans.length > 0 ? folderScans : await loadExistingFolderScans(targetDir);
|
|
729
|
+
|
|
730
|
+
const specContent = await readTextIfExists(path.join(targetDir, SPEC_FILE));
|
|
731
|
+
const written = [];
|
|
732
|
+
|
|
733
|
+
let specCurrentPath = null;
|
|
734
|
+
let specHistoryPath = null;
|
|
735
|
+
if (specContent) {
|
|
736
|
+
specCurrentPath = path.join(targetDir, SPEC_CURRENT_FILE);
|
|
737
|
+
specHistoryPath = path.join(targetDir, SPEC_HISTORY_FILE);
|
|
738
|
+
await writeTextFile(specCurrentPath, buildSpecCurrentMarkdown(specContent, generatedAt));
|
|
739
|
+
await writeTextFile(specHistoryPath, buildSpecHistoryMarkdown(specContent, generatedAt));
|
|
740
|
+
written.push(SPEC_CURRENT_FILE, SPEC_HISTORY_FILE);
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
const moduleDocs = [];
|
|
744
|
+
for (const scan of effectiveFolderScans) {
|
|
745
|
+
const relativePath = buildModuleMemoryRelativePath(scan.folder);
|
|
746
|
+
const absolutePath = path.join(targetDir, relativePath);
|
|
747
|
+
const markdown = buildModuleMemoryMarkdown({
|
|
748
|
+
folder: scan.folder,
|
|
749
|
+
scanRelativePath: scan.relativePath,
|
|
750
|
+
scanMarkdown: scan.markdown,
|
|
751
|
+
generatedAt
|
|
752
|
+
});
|
|
753
|
+
await writeTextFile(absolutePath, markdown);
|
|
754
|
+
moduleDocs.push({
|
|
755
|
+
folder: scan.folder,
|
|
756
|
+
relativePath,
|
|
757
|
+
absolutePath
|
|
758
|
+
});
|
|
759
|
+
written.push(relativePath);
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
const catalog = await collectContextCatalog(targetDir);
|
|
763
|
+
const catalogWithMemoryIndex = catalog.some((doc) => doc.relPath === MEMORY_INDEX_FILE)
|
|
764
|
+
? catalog
|
|
765
|
+
: [
|
|
766
|
+
...catalog,
|
|
767
|
+
{
|
|
768
|
+
relPath: MEMORY_INDEX_FILE,
|
|
769
|
+
title: 'Memory Index',
|
|
770
|
+
group: 'foundation',
|
|
771
|
+
readWhen: 'you want to decide the minimum context to load next',
|
|
772
|
+
tags: ['foundation', 'index', 'routing'],
|
|
773
|
+
exists: true
|
|
774
|
+
}
|
|
775
|
+
];
|
|
776
|
+
const memoryIndexPath = path.join(targetDir, MEMORY_INDEX_FILE);
|
|
777
|
+
const memoryIndexMarkdown = buildMemoryIndexMarkdown({
|
|
778
|
+
generatedAt,
|
|
779
|
+
catalog: catalogWithMemoryIndex
|
|
780
|
+
});
|
|
781
|
+
await writeTextFile(memoryIndexPath, memoryIndexMarkdown);
|
|
782
|
+
written.push(MEMORY_INDEX_FILE);
|
|
783
|
+
|
|
784
|
+
return {
|
|
785
|
+
written,
|
|
786
|
+
memoryIndexPath,
|
|
787
|
+
specCurrentPath,
|
|
788
|
+
specHistoryPath,
|
|
789
|
+
moduleDocs
|
|
790
|
+
};
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
async function collectActiveDossiers(targetDir) {
|
|
794
|
+
const featuresDir = path.join(targetDir, CONTEXT_DIR, 'features');
|
|
795
|
+
let slugs = [];
|
|
796
|
+
try {
|
|
797
|
+
const entries = await fs.readdir(featuresDir, { withFileTypes: true });
|
|
798
|
+
slugs = entries.filter((e) => e.isDirectory()).map((e) => e.name);
|
|
799
|
+
} catch {
|
|
800
|
+
return [];
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
const active = [];
|
|
804
|
+
for (const slug of slugs) {
|
|
805
|
+
const p = path.join(featuresDir, slug, 'dossier.md');
|
|
806
|
+
try {
|
|
807
|
+
const raw = await fs.readFile(p, 'utf8');
|
|
808
|
+
const statusMatch = raw.match(/^status:\s*(\S+)\s*$/m);
|
|
809
|
+
const updatedMatch = raw.match(/^last_updated_at:\s*(\S+)\s*$/m);
|
|
810
|
+
if (!statusMatch || statusMatch[1] !== 'active') continue;
|
|
811
|
+
const relPath = `${CONTEXT_DIR}/features/${slug}/dossier.md`;
|
|
812
|
+
active.push({
|
|
813
|
+
relPath,
|
|
814
|
+
slug,
|
|
815
|
+
lastUpdatedAt: updatedMatch ? updatedMatch[1] : null,
|
|
816
|
+
title: `Feature Dossier (${slug})`,
|
|
817
|
+
group: 'dossier',
|
|
818
|
+
readWhen: `active feature "${slug}" synthesis — why, what, code map, agent trail`,
|
|
819
|
+
tags: ['dossier', 'feature', 'active'],
|
|
820
|
+
exists: true
|
|
821
|
+
});
|
|
822
|
+
} catch {
|
|
823
|
+
// skip unreadable
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
// Sort by last_updated_at descending (most recent first)
|
|
828
|
+
active.sort((a, b) => {
|
|
829
|
+
if (!a.lastUpdatedAt && !b.lastUpdatedAt) return 0;
|
|
830
|
+
if (!a.lastUpdatedAt) return 1;
|
|
831
|
+
if (!b.lastUpdatedAt) return -1;
|
|
832
|
+
return b.lastUpdatedAt.localeCompare(a.lastUpdatedAt);
|
|
833
|
+
});
|
|
834
|
+
|
|
835
|
+
return active;
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
function rankDossier(dossier, { agent, goal }, rank) {
|
|
839
|
+
// Base score: between PRD (45) and bootstrap (65). Most recent dossier gets 60.
|
|
840
|
+
let score = 60 - rank * 5;
|
|
841
|
+
const reasons = [`active feature dossier (${dossier.slug})`];
|
|
842
|
+
const lookupText = `${normalizeForLookup(agent)} ${normalizeForLookup(goal)}`.trim();
|
|
843
|
+
if (lookupText.includes(dossier.slug.replace(/-/g, ' '))) {
|
|
844
|
+
score += 15;
|
|
845
|
+
reasons.push('matches active feature slug');
|
|
846
|
+
}
|
|
847
|
+
if (/(dev|architect|qa|implement|feature|dossier)/.test(lookupText)) {
|
|
848
|
+
score += 10;
|
|
849
|
+
reasons.push('agent/goal matches dossier context');
|
|
850
|
+
}
|
|
851
|
+
return { score: Math.max(score, 0), reasons };
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
// SF-project-11: paths under these prefixes are NEVER returned in a context
|
|
855
|
+
// pack, regardless of catalog score. This enforces the dev.md HARD RULE
|
|
856
|
+
// "Agent files are never your context" at the code level.
|
|
857
|
+
const EXCLUDED_FROM_CONTEXT_PREFIXES = ['.aioson/agents/'];
|
|
858
|
+
|
|
859
|
+
async function createContextPack({
|
|
860
|
+
targetDir,
|
|
861
|
+
agent = '',
|
|
862
|
+
goal = '',
|
|
863
|
+
module = '',
|
|
864
|
+
maxFiles = 8
|
|
865
|
+
}) {
|
|
866
|
+
const generatedAt = new Date().toISOString().replace(/\.\d+Z$/, 'Z');
|
|
867
|
+
await writeDerivedContextMemory({ targetDir, generatedAt });
|
|
868
|
+
const requestedMaxFiles = Number(maxFiles);
|
|
869
|
+
const normalizedMaxFiles = Number.isFinite(requestedMaxFiles)
|
|
870
|
+
? Math.max(1, Math.min(20, Math.trunc(requestedMaxFiles)))
|
|
871
|
+
: 8;
|
|
872
|
+
|
|
873
|
+
const catalog = (await collectContextCatalog(targetDir)).filter((doc) => doc.exists);
|
|
874
|
+
|
|
875
|
+
// Inject active dossiers as ranked sources (reference, not inline copy)
|
|
876
|
+
const activeDossiers = await collectActiveDossiers(targetDir);
|
|
877
|
+
const dossierDocs = activeDossiers.map((d, i) => {
|
|
878
|
+
const rank = rankDossier(d, { agent, goal }, i);
|
|
879
|
+
return { ...d, score: rank.score, reason: rank.reasons.join('; ') };
|
|
880
|
+
});
|
|
881
|
+
|
|
882
|
+
const ranked = [
|
|
883
|
+
...catalog.map((doc) => {
|
|
884
|
+
const rank = rankContextDoc(doc, { agent, goal, module });
|
|
885
|
+
return {
|
|
886
|
+
...doc,
|
|
887
|
+
score: rank.score,
|
|
888
|
+
reason: rank.reasons.join('; ') || doc.readWhen
|
|
889
|
+
};
|
|
890
|
+
}),
|
|
891
|
+
...dossierDocs
|
|
892
|
+
]
|
|
893
|
+
.filter((doc) => doc.score > 0)
|
|
894
|
+
// SF-project-11: enforce the dev.md HARD RULE in code, not just in prompts.
|
|
895
|
+
// Agent prompt files are never valid context for another agent.
|
|
896
|
+
.filter((doc) => !EXCLUDED_FROM_CONTEXT_PREFIXES.some((prefix) => doc.relPath.startsWith(prefix)))
|
|
897
|
+
.sort((a, b) => b.score - a.score || a.relPath.localeCompare(b.relPath));
|
|
898
|
+
|
|
899
|
+
const selectedDocs = [];
|
|
900
|
+
const seen = new Set();
|
|
901
|
+
for (const doc of ranked) {
|
|
902
|
+
if (seen.has(doc.relPath)) continue;
|
|
903
|
+
selectedDocs.push(doc);
|
|
904
|
+
seen.add(doc.relPath);
|
|
905
|
+
if (selectedDocs.length >= normalizedMaxFiles) break;
|
|
906
|
+
}
|
|
907
|
+
|
|
908
|
+
const withContent = [];
|
|
909
|
+
for (const doc of selectedDocs) {
|
|
910
|
+
const content = await readTextIfExists(path.join(targetDir, doc.relPath));
|
|
911
|
+
withContent.push({
|
|
912
|
+
relPath: doc.relPath,
|
|
913
|
+
reason: doc.reason,
|
|
914
|
+
excerpt: buildPackExcerpt(content, doc.relPath)
|
|
915
|
+
});
|
|
916
|
+
}
|
|
917
|
+
|
|
918
|
+
const packMarkdown = buildContextPackMarkdown({
|
|
919
|
+
generatedAt,
|
|
920
|
+
agent,
|
|
921
|
+
goal,
|
|
922
|
+
module,
|
|
923
|
+
selectedDocs: withContent
|
|
924
|
+
});
|
|
925
|
+
|
|
926
|
+
const outputPath = path.join(targetDir, CONTEXT_PACK_FILE);
|
|
927
|
+
await writeTextFile(outputPath, packMarkdown);
|
|
928
|
+
|
|
929
|
+
return {
|
|
930
|
+
ok: true,
|
|
931
|
+
targetDir,
|
|
932
|
+
agent,
|
|
933
|
+
goal,
|
|
934
|
+
module,
|
|
935
|
+
maxFiles: normalizedMaxFiles,
|
|
936
|
+
packPath: outputPath,
|
|
937
|
+
selectedFiles: withContent.map((doc) => ({
|
|
938
|
+
path: doc.relPath,
|
|
939
|
+
reason: doc.reason
|
|
940
|
+
}))
|
|
941
|
+
};
|
|
942
|
+
}
|
|
943
|
+
|
|
944
|
+
module.exports = {
|
|
945
|
+
PROJECT_CONTEXT_FILE,
|
|
946
|
+
DISCOVERY_FILE,
|
|
947
|
+
SKELETON_FILE,
|
|
948
|
+
ARCHITECTURE_FILE,
|
|
949
|
+
SPEC_FILE,
|
|
950
|
+
SPEC_CURRENT_FILE,
|
|
951
|
+
SPEC_HISTORY_FILE,
|
|
952
|
+
MEMORY_INDEX_FILE,
|
|
953
|
+
DESIGN_DOC_FILE,
|
|
954
|
+
READINESS_FILE,
|
|
955
|
+
PRD_FILE,
|
|
956
|
+
UI_SPEC_FILE,
|
|
957
|
+
SCAN_INDEX_FILE,
|
|
958
|
+
SCAN_FOLDERS_FILE,
|
|
959
|
+
SCAN_AIOSON_FILE,
|
|
960
|
+
CONTEXT_PACK_FILE,
|
|
961
|
+
BOOTSTRAP_DIR,
|
|
962
|
+
BOOTSTRAP_WHAT_IS,
|
|
963
|
+
BOOTSTRAP_HOW_IT_WORKS,
|
|
964
|
+
BOOTSTRAP_WHAT_IT_DOES,
|
|
965
|
+
BOOTSTRAP_CURRENT_STATE,
|
|
966
|
+
buildModuleMemoryRelativePath,
|
|
967
|
+
buildSpecCurrentMarkdown,
|
|
968
|
+
buildSpecHistoryMarkdown,
|
|
969
|
+
buildMemoryIndexMarkdown,
|
|
970
|
+
writeDerivedContextMemory,
|
|
971
|
+
createContextPack,
|
|
972
|
+
EXCLUDED_FROM_CONTEXT_PREFIXES,
|
|
973
|
+
collectContextCatalog,
|
|
974
|
+
loadExistingFolderScans
|
|
975
|
+
};
|