@jaimevalasek/aioson 1.7.0 → 1.8.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.
Files changed (383) hide show
  1. package/CHANGELOG.md +60 -0
  2. package/README.md +153 -10
  3. package/docs/en/cli-reference.md +56 -1
  4. package/docs/en/i18n.md +18 -18
  5. package/docs/en/schemas/index.json +10 -0
  6. package/docs/en/schemas/parallel-assign.schema.json +9 -0
  7. package/docs/en/schemas/parallel-doctor.schema.json +36 -0
  8. package/docs/en/schemas/parallel-guard.schema.json +63 -0
  9. package/docs/en/schemas/parallel-merge.schema.json +84 -0
  10. package/docs/en/schemas/parallel-status.schema.json +91 -1
  11. package/docs/integrations/apps-publish-marketplace.md +94 -0
  12. package/docs/pt/README.md +9 -0
  13. package/docs/pt/agentes.md +324 -3
  14. package/docs/pt/clientes-ai.md +7 -3
  15. package/docs/pt/comandos-cli.md +160 -13
  16. package/docs/pt/compress-agents.md +304 -0
  17. package/docs/pt/design-docs-governance.md +59 -0
  18. package/docs/pt/feature-archive.md +191 -0
  19. package/docs/pt/genome-3.0-spec.md +115 -4
  20. package/docs/pt/genome-distribution.md +232 -0
  21. package/docs/pt/inicio-rapido.md +1 -0
  22. package/docs/pt/motor-hardening.md +492 -0
  23. package/docs/pt/runner-system.md +113 -0
  24. package/package.json +2 -1
  25. package/src/agent-manifests.js +66 -0
  26. package/src/agents.js +27 -7
  27. package/src/autonomy-policy.js +139 -0
  28. package/src/brain-query.js +161 -0
  29. package/src/cli.js +1377 -1099
  30. package/src/commands/agents.js +102 -7
  31. package/src/commands/artifact-validate.js +33 -4
  32. package/src/commands/auth.js +272 -0
  33. package/src/commands/brain-query.js +44 -0
  34. package/src/commands/briefing.js +344 -0
  35. package/src/commands/commit-prepare.js +547 -0
  36. package/src/commands/compress-agents.js +416 -0
  37. package/src/commands/context-health.js +4 -2
  38. package/src/commands/context-trim.js +17 -11
  39. package/src/commands/design-hybrid-options.js +3 -3
  40. package/src/commands/devlog-process.js +6 -4
  41. package/src/commands/dossier.js +423 -0
  42. package/src/commands/feature-archive.js +513 -0
  43. package/src/commands/feature-close.js +123 -18
  44. package/src/commands/gate-approve.js +198 -0
  45. package/src/commands/gate-check.js +24 -5
  46. package/src/commands/genome-doctor.js +166 -9
  47. package/src/commands/git-guard.js +170 -0
  48. package/src/commands/harness.js +121 -0
  49. package/src/commands/implementation-plan.js +47 -20
  50. package/src/commands/init.js +6 -2
  51. package/src/commands/install.js +6 -2
  52. package/src/commands/live.js +497 -56
  53. package/src/commands/locale-apply.js +9 -6
  54. package/src/commands/locale-diff.js +11 -112
  55. package/src/commands/mcp-doctor.js +2 -1
  56. package/src/commands/mcp-init.js +4 -10
  57. package/src/commands/memory.js +234 -0
  58. package/src/commands/parallel-assign.js +107 -27
  59. package/src/commands/parallel-doctor.js +416 -3
  60. package/src/commands/parallel-guard.js +241 -0
  61. package/src/commands/parallel-init.js +66 -4
  62. package/src/commands/parallel-merge.js +299 -0
  63. package/src/commands/parallel-status.js +147 -3
  64. package/src/commands/preflight.js +63 -4
  65. package/src/commands/qa-init.js +10 -5
  66. package/src/commands/revision.js +235 -0
  67. package/src/commands/scaffold-complete.js +188 -0
  68. package/src/commands/security-audit.js +275 -0
  69. package/src/commands/security-scan.js +376 -0
  70. package/src/commands/self-implement-loop.js +46 -2
  71. package/src/commands/setup-context.js +11 -10
  72. package/src/commands/squad-agent-create.js +51 -9
  73. package/src/commands/squad-investigate.js +53 -0
  74. package/src/commands/squad-plan.js +33 -1
  75. package/src/commands/squad-scaffold.js +4 -3
  76. package/src/commands/squad-score.js +71 -14
  77. package/src/commands/squad-status.js +22 -1
  78. package/src/commands/squad-validate.js +93 -2
  79. package/src/commands/store-genome.js +304 -0
  80. package/src/commands/store-skill.js +247 -0
  81. package/src/commands/store-squad.js +431 -0
  82. package/src/commands/store-system.js +392 -0
  83. package/src/commands/tool-capabilities.js +63 -0
  84. package/src/commands/update.js +3 -3
  85. package/src/commands/verify-gate.js +40 -0
  86. package/src/commands/workflow-execute.js +644 -155
  87. package/src/commands/workflow-harden.js +231 -0
  88. package/src/commands/workflow-heal.js +136 -0
  89. package/src/commands/workflow-next.js +460 -22
  90. package/src/commands/workflow-status.js +328 -138
  91. package/src/commands/workspace.js +144 -0
  92. package/src/constants.js +55 -75
  93. package/src/context-memory.js +133 -4
  94. package/src/context-writer.js +2 -1
  95. package/src/context.js +32 -2
  96. package/src/doctor.js +46 -6
  97. package/src/dossier/codemap-store.js +267 -0
  98. package/src/dossier/dossier-bootstrap.js +222 -0
  99. package/src/dossier/dossier-compact.js +159 -0
  100. package/src/dossier/lock.js +128 -0
  101. package/src/dossier/revision-store.js +313 -0
  102. package/src/dossier/schema.js +155 -0
  103. package/src/dossier/store.js +400 -0
  104. package/src/execution-gateway.js +3 -0
  105. package/src/friction-scanner.js +202 -0
  106. package/src/genome-schema.js +24 -1
  107. package/src/genomes.js +33 -0
  108. package/src/handoff-contract.js +363 -0
  109. package/src/handoff-validator.js +45 -0
  110. package/src/harness/circuit-breaker.js +135 -0
  111. package/src/i18n/messages/en.js +317 -22
  112. package/src/i18n/messages/es.js +259 -18
  113. package/src/i18n/messages/fr.js +260 -18
  114. package/src/i18n/messages/pt-BR.js +313 -22
  115. package/src/install-profile.js +0 -16
  116. package/src/installer.js +70 -6
  117. package/src/lib/git-commit-guard.js +691 -0
  118. package/src/lib/security/artifact-reader.js +167 -0
  119. package/src/lib/security/exit-codes.js +51 -0
  120. package/src/lib/security/findings-writer.js +176 -0
  121. package/src/lib/security/runtime-events.js +77 -0
  122. package/src/lib/security/secrets-regex.js +115 -0
  123. package/src/lib/store/security-scan.js +173 -0
  124. package/src/lib/terminal-checkbox.js +130 -0
  125. package/src/lib/tmux-launcher.js +163 -0
  126. package/src/lib/tool-capabilities.js +102 -0
  127. package/src/locales.js +12 -8
  128. package/src/parallel-workspace.js +756 -0
  129. package/src/parser.js +8 -1
  130. package/src/path-guard.js +47 -0
  131. package/src/preflight-engine.js +237 -26
  132. package/src/self-healing.js +142 -0
  133. package/src/session-handoff.js +111 -1
  134. package/src/squad/squad-scaffold.js +183 -19
  135. package/src/test-briefing.js +226 -0
  136. package/src/updater.js +1 -1
  137. package/src/utils.js +3 -0
  138. package/src/workflow-gates.js +185 -0
  139. package/template/.aioson/agents/analyst.md +76 -130
  140. package/template/.aioson/agents/architect.md +53 -86
  141. package/template/.aioson/agents/committer.md +161 -0
  142. package/template/.aioson/agents/copywriter.md +463 -0
  143. package/template/.aioson/agents/cypher.md +252 -0
  144. package/template/.aioson/agents/dev.md +112 -600
  145. package/template/.aioson/agents/deyvin.md +33 -235
  146. package/template/.aioson/agents/discover.md +235 -0
  147. package/template/.aioson/agents/discovery-design-doc.md +17 -252
  148. package/template/.aioson/agents/genome.md +76 -26
  149. package/template/.aioson/agents/manifests/analyst.manifest.json +26 -0
  150. package/template/.aioson/agents/manifests/architect.manifest.json +23 -0
  151. package/template/.aioson/agents/manifests/committer.manifest.json +23 -0
  152. package/template/.aioson/agents/manifests/dev.manifest.json +37 -0
  153. package/template/.aioson/agents/manifests/orchestrator.manifest.json +30 -0
  154. package/template/.aioson/agents/manifests/pentester.manifest.json +39 -0
  155. package/template/.aioson/agents/manifests/pm.manifest.json +26 -0
  156. package/template/.aioson/agents/manifests/product.manifest.json +23 -0
  157. package/template/.aioson/agents/manifests/qa.manifest.json +25 -0
  158. package/template/.aioson/agents/manifests/setup.manifest.json +20 -0
  159. package/template/.aioson/agents/manifests/ux-ui.manifest.json +24 -0
  160. package/template/.aioson/agents/neo.md +10 -8
  161. package/template/.aioson/agents/orache.md +2 -6
  162. package/template/.aioson/agents/orchestrator.md +81 -182
  163. package/template/.aioson/agents/pentester.md +235 -0
  164. package/template/.aioson/agents/pm.md +40 -104
  165. package/template/.aioson/agents/product.md +99 -344
  166. package/template/.aioson/agents/profiler-enricher.md +57 -6
  167. package/template/.aioson/agents/profiler-forge.md +17 -7
  168. package/template/.aioson/agents/profiler-researcher.md +29 -6
  169. package/template/.aioson/agents/qa.md +165 -410
  170. package/template/.aioson/agents/setup.md +52 -262
  171. package/template/.aioson/agents/sheldon.md +122 -754
  172. package/template/.aioson/agents/site-forge.md +111 -1583
  173. package/template/.aioson/agents/squad.md +139 -1820
  174. package/template/.aioson/agents/tester.md +10 -0
  175. package/template/.aioson/agents/ux-ui.md +103 -645
  176. package/template/.aioson/agents/validator.md +69 -0
  177. package/template/.aioson/brains/scripts/query.js +5 -1
  178. package/template/.aioson/config/autonomy-protocol.json +43 -0
  179. package/template/.aioson/config.md +43 -15
  180. package/template/.aioson/constitution.md +36 -33
  181. package/template/.aioson/context/design-doc.md +136 -0
  182. package/template/.aioson/context/project-map.md +57 -0
  183. package/template/.aioson/design-docs/code-reuse.md +48 -0
  184. package/template/.aioson/design-docs/componentization.md +47 -0
  185. package/template/.aioson/design-docs/file-size.md +52 -0
  186. package/template/.aioson/design-docs/folder-structure.md +51 -0
  187. package/template/.aioson/design-docs/naming.md +54 -0
  188. package/template/.aioson/docs/LAYERS.md +12 -2
  189. package/template/.aioson/docs/dev/execution-discipline.md +106 -0
  190. package/template/.aioson/docs/dev/stack-conventions.md +83 -0
  191. package/template/.aioson/docs/deyvin/continuity-recovery.md +57 -0
  192. package/template/.aioson/docs/deyvin/debugging-escalation.md +30 -0
  193. package/template/.aioson/docs/deyvin/pair-execution.md +44 -0
  194. package/template/.aioson/docs/deyvin/runtime-handoffs.md +36 -0
  195. package/template/.aioson/docs/product/conversation-playbook.md +116 -0
  196. package/template/.aioson/docs/product/prd-contract.md +107 -0
  197. package/template/.aioson/docs/product/quality-lens.md +57 -0
  198. package/template/.aioson/docs/product/research-loop.md +65 -0
  199. package/template/.aioson/docs/sheldon/enrichment-paths.md +134 -0
  200. package/template/.aioson/docs/sheldon/quality-lens.md +57 -0
  201. package/template/.aioson/docs/sheldon/research-loop.md +56 -0
  202. package/template/.aioson/docs/sheldon/web-intelligence.md +75 -0
  203. package/template/.aioson/docs/site-forge-build.md +195 -0
  204. package/template/.aioson/docs/site-forge-extraction.md +135 -0
  205. package/template/.aioson/docs/site-forge-qa.md +155 -0
  206. package/template/.aioson/docs/site-forge-recon.md +434 -0
  207. package/template/.aioson/docs/site-forge-transform.md +249 -0
  208. package/template/.aioson/docs/squad/content-output.md +91 -0
  209. package/template/.aioson/docs/squad/creation-flow.md +135 -0
  210. package/template/.aioson/docs/squad/domain-classification.md +117 -0
  211. package/template/.aioson/docs/squad/genome-bindings.md +47 -0
  212. package/template/.aioson/docs/squad/package-contract.md +234 -0
  213. package/template/.aioson/docs/squad/quality-lens.md +56 -0
  214. package/template/.aioson/docs/squad/research-loop.md +59 -0
  215. package/template/.aioson/docs/squad/session-operations.md +117 -0
  216. package/template/.aioson/docs/squad/workflow-quality.md +165 -0
  217. package/template/.aioson/docs/ux-ui/accessibility-audit.md +55 -0
  218. package/template/.aioson/docs/ux-ui/audit-mode.md +86 -0
  219. package/template/.aioson/docs/ux-ui/component-map.md +35 -0
  220. package/template/.aioson/docs/ux-ui/design-execution.md +111 -0
  221. package/template/.aioson/docs/ux-ui/design-gate.md +27 -0
  222. package/template/.aioson/docs/ux-ui/research-mode.md +39 -0
  223. package/template/.aioson/docs/ux-ui/site-delivery.md +156 -0
  224. package/template/.aioson/docs/ux-ui/token-contract.md +57 -0
  225. package/template/.aioson/genomes/copywriting.md +204 -0
  226. package/template/.aioson/genomes/copywriting.meta.json +48 -0
  227. package/template/.aioson/git-guard.json +11 -0
  228. package/template/.aioson/mcp/servers.md +0 -1
  229. package/template/.aioson/rules/agent-language-policy.md +93 -0
  230. package/template/.aioson/rules/aioson-context-boundary.md +63 -0
  231. package/template/.aioson/rules/canonical-path-contract.md +47 -0
  232. package/template/.aioson/rules/data-format-convention.md +24 -86
  233. package/template/.aioson/rules/disk-first-artifacts.md +44 -0
  234. package/template/.aioson/rules/output-brevity.md +44 -0
  235. package/template/.aioson/rules/prd-section-ownership.md +49 -0
  236. package/template/.aioson/rules/security-baseline.md +139 -0
  237. package/template/.aioson/rules/spec-level-ownership.md +61 -0
  238. package/template/.aioson/rules/squad-driver-pattern.md +81 -0
  239. package/template/.aioson/schemas/squad-blueprint.schema.json +24 -0
  240. package/template/.aioson/schemas/squad-manifest.schema.json +44 -0
  241. package/template/.aioson/skills/design/cognitive-core-ui/references/motion.md +2 -0
  242. package/template/.aioson/skills/marketing/references/anti-patterns.md +254 -0
  243. package/template/.aioson/skills/marketing/references/fascinations.md +192 -0
  244. package/template/.aioson/skills/marketing/references/five-acts.md +248 -0
  245. package/template/.aioson/skills/marketing/references/market-intelligence.md +198 -0
  246. package/template/.aioson/skills/marketing/references/offer-structure.md +203 -0
  247. package/template/.aioson/skills/marketing/references/one-belief.md +149 -0
  248. package/template/.aioson/skills/marketing/references/patterns.md +218 -0
  249. package/template/.aioson/skills/marketing/references/pms-research.md +193 -0
  250. package/template/.aioson/skills/marketing/vsl-craft.md +385 -0
  251. package/template/.aioson/skills/process/aioson-spec-driven/references/pm.md +30 -0
  252. package/template/.aioson/skills/process/secure-tdd/SKILL.md +97 -0
  253. package/template/.aioson/skills/process/secure-tdd/references/nextjs.md +81 -0
  254. package/template/.aioson/skills/process/secure-tdd/references/node-express.md +91 -0
  255. package/template/.aioson/skills/process/secure-tdd/references/planned-stacks.md +33 -0
  256. package/template/.aioson/skills/static/harness-validate/SKILL.md +46 -0
  257. package/template/.aioson/skills/static/landing-page-deploy.md +192 -0
  258. package/template/.aioson/skills/static/landing-page-forge.md +730 -0
  259. package/template/.aioson/skills/static/ui-ux-modern.md +1 -0
  260. package/template/.aioson/skills/static/web-research-cache.md +3 -0
  261. package/template/.aioson/tasks/squad-create.md +56 -7
  262. package/template/.aioson/tasks/squad-design.md +80 -2
  263. package/template/.aioson/tasks/squad-investigate.md +14 -1
  264. package/template/.aioson/templates/squads/digital-marketing-agency/template.json +96 -0
  265. package/template/.claude/commands/aioson/agent/committer.md +5 -0
  266. package/template/.claude/commands/aioson/agent/copywriter.md +5 -0
  267. package/template/.claude/commands/aioson/agent/cypher.md +5 -0
  268. package/template/.claude/commands/aioson/agent/pair.md +5 -0
  269. package/template/.claude/commands/aioson/agent/validator.md +5 -0
  270. package/template/.gemini/commands/aios-analyst.toml +6 -3
  271. package/template/.gemini/commands/aios-architect.toml +7 -6
  272. package/template/.gemini/commands/aios-committer.toml +7 -0
  273. package/template/.gemini/commands/aios-copywriter.toml +7 -0
  274. package/template/.gemini/commands/aios-cypher.toml +7 -0
  275. package/template/.gemini/commands/aios-dev.toml +8 -7
  276. package/template/.gemini/commands/aios-deyvin.toml +6 -5
  277. package/template/.gemini/commands/aios-discovery-design-doc.toml +6 -3
  278. package/template/.gemini/commands/aios-genome.toml +7 -0
  279. package/template/.gemini/commands/aios-neo.toml +5 -3
  280. package/template/.gemini/commands/aios-orache.toml +7 -0
  281. package/template/.gemini/commands/aios-orchestrator.toml +8 -7
  282. package/template/.gemini/commands/aios-pair.toml +6 -5
  283. package/template/.gemini/commands/aios-pm.toml +8 -7
  284. package/template/.gemini/commands/aios-product.toml +5 -3
  285. package/template/.gemini/commands/aios-qa.toml +6 -5
  286. package/template/.gemini/commands/aios-setup.toml +5 -2
  287. package/template/.gemini/commands/aios-sheldon.toml +7 -0
  288. package/template/.gemini/commands/aios-site-forge.toml +7 -0
  289. package/template/.gemini/commands/aios-squad.toml +7 -0
  290. package/template/.gemini/commands/aios-tester.toml +6 -5
  291. package/template/.gemini/commands/aios-ux-ui.toml +8 -7
  292. package/template/.gemini/commands/aios-validator.toml +7 -0
  293. package/template/AGENTS.md +12 -1
  294. package/template/CLAUDE.md +6 -1
  295. package/template/.aioson/locales/en/agents/analyst.md +0 -244
  296. package/template/.aioson/locales/en/agents/architect.md +0 -245
  297. package/template/.aioson/locales/en/agents/dev.md +0 -397
  298. package/template/.aioson/locales/en/agents/deyvin.md +0 -137
  299. package/template/.aioson/locales/en/agents/discovery-design-doc.md +0 -27
  300. package/template/.aioson/locales/en/agents/genome.md +0 -212
  301. package/template/.aioson/locales/en/agents/neo.md +0 -8
  302. package/template/.aioson/locales/en/agents/orache.md +0 -6
  303. package/template/.aioson/locales/en/agents/orchestrator.md +0 -189
  304. package/template/.aioson/locales/en/agents/pair.md +0 -5
  305. package/template/.aioson/locales/en/agents/pm.md +0 -84
  306. package/template/.aioson/locales/en/agents/product.md +0 -378
  307. package/template/.aioson/locales/en/agents/profiler-enricher.md +0 -5
  308. package/template/.aioson/locales/en/agents/profiler-forge.md +0 -5
  309. package/template/.aioson/locales/en/agents/profiler-researcher.md +0 -5
  310. package/template/.aioson/locales/en/agents/qa.md +0 -270
  311. package/template/.aioson/locales/en/agents/setup.md +0 -421
  312. package/template/.aioson/locales/en/agents/sheldon.md +0 -455
  313. package/template/.aioson/locales/en/agents/squad.md +0 -449
  314. package/template/.aioson/locales/en/agents/tester.md +0 -6
  315. package/template/.aioson/locales/en/agents/ux-ui.md +0 -668
  316. package/template/.aioson/locales/es/agents/analyst.md +0 -225
  317. package/template/.aioson/locales/es/agents/architect.md +0 -245
  318. package/template/.aioson/locales/es/agents/dev.md +0 -370
  319. package/template/.aioson/locales/es/agents/deyvin.md +0 -99
  320. package/template/.aioson/locales/es/agents/discovery-design-doc.md +0 -21
  321. package/template/.aioson/locales/es/agents/genome.md +0 -104
  322. package/template/.aioson/locales/es/agents/neo.md +0 -50
  323. package/template/.aioson/locales/es/agents/orache.md +0 -105
  324. package/template/.aioson/locales/es/agents/orchestrator.md +0 -194
  325. package/template/.aioson/locales/es/agents/pair.md +0 -7
  326. package/template/.aioson/locales/es/agents/pm.md +0 -90
  327. package/template/.aioson/locales/es/agents/product.md +0 -372
  328. package/template/.aioson/locales/es/agents/profiler-enricher.md +0 -7
  329. package/template/.aioson/locales/es/agents/profiler-forge.md +0 -7
  330. package/template/.aioson/locales/es/agents/profiler-researcher.md +0 -7
  331. package/template/.aioson/locales/es/agents/qa.md +0 -198
  332. package/template/.aioson/locales/es/agents/setup.md +0 -405
  333. package/template/.aioson/locales/es/agents/sheldon.md +0 -309
  334. package/template/.aioson/locales/es/agents/squad.md +0 -532
  335. package/template/.aioson/locales/es/agents/tester.md +0 -9
  336. package/template/.aioson/locales/es/agents/ux-ui.md +0 -212
  337. package/template/.aioson/locales/fr/agents/analyst.md +0 -225
  338. package/template/.aioson/locales/fr/agents/architect.md +0 -245
  339. package/template/.aioson/locales/fr/agents/dev.md +0 -370
  340. package/template/.aioson/locales/fr/agents/deyvin.md +0 -99
  341. package/template/.aioson/locales/fr/agents/discovery-design-doc.md +0 -21
  342. package/template/.aioson/locales/fr/agents/genome.md +0 -104
  343. package/template/.aioson/locales/fr/agents/neo.md +0 -50
  344. package/template/.aioson/locales/fr/agents/orache.md +0 -106
  345. package/template/.aioson/locales/fr/agents/orchestrator.md +0 -194
  346. package/template/.aioson/locales/fr/agents/pair.md +0 -7
  347. package/template/.aioson/locales/fr/agents/pm.md +0 -90
  348. package/template/.aioson/locales/fr/agents/product.md +0 -372
  349. package/template/.aioson/locales/fr/agents/profiler-enricher.md +0 -7
  350. package/template/.aioson/locales/fr/agents/profiler-forge.md +0 -7
  351. package/template/.aioson/locales/fr/agents/profiler-researcher.md +0 -7
  352. package/template/.aioson/locales/fr/agents/qa.md +0 -198
  353. package/template/.aioson/locales/fr/agents/setup.md +0 -405
  354. package/template/.aioson/locales/fr/agents/sheldon.md +0 -309
  355. package/template/.aioson/locales/fr/agents/squad.md +0 -532
  356. package/template/.aioson/locales/fr/agents/tester.md +0 -9
  357. package/template/.aioson/locales/fr/agents/ux-ui.md +0 -212
  358. package/template/.aioson/locales/pt-BR/agents/analyst.md +0 -319
  359. package/template/.aioson/locales/pt-BR/agents/architect.md +0 -284
  360. package/template/.aioson/locales/pt-BR/agents/dev.md +0 -483
  361. package/template/.aioson/locales/pt-BR/agents/deyvin.md +0 -184
  362. package/template/.aioson/locales/pt-BR/agents/discovery-design-doc.md +0 -198
  363. package/template/.aioson/locales/pt-BR/agents/genome.md +0 -297
  364. package/template/.aioson/locales/pt-BR/agents/neo.md +0 -208
  365. package/template/.aioson/locales/pt-BR/agents/orache.md +0 -137
  366. package/template/.aioson/locales/pt-BR/agents/orchestrator.md +0 -324
  367. package/template/.aioson/locales/pt-BR/agents/pair.md +0 -5
  368. package/template/.aioson/locales/pt-BR/agents/pm.md +0 -182
  369. package/template/.aioson/locales/pt-BR/agents/product.md +0 -466
  370. package/template/.aioson/locales/pt-BR/agents/profiler-enricher.md +0 -5
  371. package/template/.aioson/locales/pt-BR/agents/profiler-forge.md +0 -5
  372. package/template/.aioson/locales/pt-BR/agents/profiler-researcher.md +0 -5
  373. package/template/.aioson/locales/pt-BR/agents/qa.md +0 -300
  374. package/template/.aioson/locales/pt-BR/agents/setup.md +0 -533
  375. package/template/.aioson/locales/pt-BR/agents/sheldon.md +0 -323
  376. package/template/.aioson/locales/pt-BR/agents/squad.md +0 -1330
  377. package/template/.aioson/locales/pt-BR/agents/tester.md +0 -449
  378. package/template/.aioson/locales/pt-BR/agents/ux-ui.md +0 -669
  379. package/template/.aioson/skills/design-system/components/SKILL.md:Zone.Identifier +0 -0
  380. package/template/.aioson/skills/design-system/dashboards/SKILL.md:Zone.Identifier +0 -0
  381. package/template/.aioson/skills/design-system/foundations/SKILL.md:Zone.Identifier +0 -0
  382. package/template/.aioson/skills/design-system/motion/SKILL.md:Zone.Identifier +0 -0
  383. package/template/.aioson/skills/design-system/patterns/SKILL.md:Zone.Identifier +0 -0
@@ -1,125 +1,24 @@
1
1
  'use strict';
2
2
 
3
- const fs = require('node:fs/promises');
4
- const path = require('node:path');
5
- const { TEMPLATE_DIR } = require('../installer');
6
-
7
- const AGENTS = ['setup', 'analyst', 'architect', 'pm', 'ux-ui', 'dev', 'qa', 'orchestrator'];
8
- const LOCALES = ['en', 'pt-BR', 'es', 'fr'];
9
-
10
- // Extract ## Section headings from markdown content
11
- function extractSections(content) {
12
- const sections = [];
13
- for (const line of content.split('\n')) {
14
- if (/^#{1,3} /.test(line)) {
15
- sections.push(line.trim());
16
- }
17
- }
18
- return sections;
19
- }
20
-
21
- // Normalize a heading to a comparable key (remove locale-specific punctuation/accents)
22
- function normalizeHeading(heading) {
23
- return heading
24
- .toLowerCase()
25
- .replace(/[áàâãä]/g, 'a')
26
- .replace(/[éèêë]/g, 'e')
27
- .replace(/[íìîï]/g, 'i')
28
- .replace(/[óòôõö]/g, 'o')
29
- .replace(/[úùûü]/g, 'u')
30
- .replace(/[ç]/g, 'c')
31
- .replace(/[ñ]/g, 'n')
32
- .replace(/[^a-z0-9# ]/g, '')
33
- .replace(/\s+/g, ' ')
34
- .trim();
35
- }
36
-
37
- async function readFile(filePath) {
38
- try {
39
- return await fs.readFile(filePath, 'utf8');
40
- } catch {
41
- return null;
42
- }
43
- }
44
-
45
3
  async function runLocaleDiff({ args, options, logger }) {
46
4
  const jsonMode = Boolean(options.json);
47
5
  const log = jsonMode ? () => {} : logger.log.bind(logger);
48
-
49
- const filterAgent = args[0] || null; // optional: check only one agent
50
- const filterLocale = options.lang || options.language || null;
51
-
52
- const baseAgentsDir = path.join(TEMPLATE_DIR, '.aioson', 'agents');
53
- const localesDir = path.join(TEMPLATE_DIR, '.aioson', 'locales');
54
-
55
- const agentsToCheck = filterAgent
56
- ? AGENTS.filter(a => a === filterAgent)
57
- : AGENTS;
58
- const localesToCheck = filterLocale
59
- ? LOCALES.filter(l => l === filterLocale)
60
- : LOCALES;
61
-
62
- const report = [];
63
- let totalMissing = 0;
64
-
65
- for (const agent of agentsToCheck) {
66
- const baseFile = path.join(baseAgentsDir, `${agent}.md`);
67
- const baseContent = await readFile(baseFile);
68
- if (!baseContent) {
69
- log(`WARN: base agent @${agent} not found`);
70
- continue;
71
- }
72
-
73
- const baseSections = extractSections(baseContent);
74
- const baseNorm = baseSections.map(s => ({ original: s, key: normalizeHeading(s) }));
75
-
76
- for (const locale of localesToCheck) {
77
- const localeFile = path.join(localesDir, locale, 'agents', `${agent}.md`);
78
- const localeContent = await readFile(localeFile);
79
- if (!localeContent) {
80
- log(`WARN: @${agent} (${locale}) not found`);
81
- continue;
82
- }
83
-
84
- const localeSections = extractSections(localeContent);
85
- const localeNormSet = new Set(localeSections.map(s => normalizeHeading(s)));
86
-
87
- const missing = baseNorm.filter(({ key }) => !localeNormSet.has(key));
88
-
89
- if (missing.length > 0) {
90
- totalMissing += missing.length;
91
- const entry = {
92
- agent,
93
- locale,
94
- missingSections: missing.map(m => m.original)
95
- };
96
- report.push(entry);
97
- if (!jsonMode) {
98
- log(`@${agent} (${locale}) — ${missing.length} section(s) missing in locale:`);
99
- for (const m of missing) {
100
- log(` - ${m.original}`);
101
- }
102
- }
103
- }
104
- }
105
- }
6
+ const requestedAgent = args[0] || null;
7
+ const requestedLanguage = options.lang || options.language || null;
106
8
 
107
9
  if (!jsonMode) {
108
- log('');
109
- if (totalMissing === 0) {
110
- log('No drift detected — all locale files contain equivalent sections to base.');
111
- } else {
112
- log(`${totalMissing} section(s) present in base but missing in locale files.`);
113
- log('These may be intentional simplifications or unintentional drift.');
114
- }
10
+ log('Agent locale packs are no longer shipped.');
11
+ log('Canonical agent prompts now live only in `.aioson/agents/` and user-facing language is controlled by `interaction_language`.');
115
12
  }
116
13
 
117
14
  return {
118
- ok: totalMissing === 0,
119
- totalMissing,
120
- agents: agentsToCheck,
121
- locales: localesToCheck,
122
- drifts: report
15
+ ok: true,
16
+ deprecated: true,
17
+ mode: 'canonical-english-only',
18
+ agent: requestedAgent,
19
+ language: requestedLanguage,
20
+ totalMissing: 0,
21
+ drifts: []
123
22
  };
124
23
  }
125
24
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  const fs = require('node:fs/promises');
4
4
  const path = require('node:path');
5
- const { validateProjectContextFile } = require('../context');
5
+ const { validateProjectContextFile, getInteractionLanguage } = require('../context');
6
6
  const { localizeContextParseReason } = require('../context-parse-reason');
7
7
  const { exists, readTextIfExists } = require('../utils');
8
8
  const { extractStackValue, normalizeDatabaseEngine } = require('./mcp-init');
@@ -354,6 +354,7 @@ async function runMcpDoctor({ args, options = {}, logger, t }) {
354
354
  filePath: contextPath,
355
355
  projectType: String(contextData.project_type || ''),
356
356
  framework: String(contextData.framework || ''),
357
+ interactionLanguage: getInteractionLanguage(contextData, 'en'),
357
358
  conversationLanguage: String(contextData.conversation_language || '')
358
359
  },
359
360
  plan: {
@@ -2,7 +2,7 @@
2
2
 
3
3
  const fs = require('node:fs/promises');
4
4
  const path = require('node:path');
5
- const { validateProjectContextFile } = require('../context');
5
+ const { validateProjectContextFile, getInteractionLanguage } = require('../context');
6
6
  const { createTranslator } = require('../i18n');
7
7
  const { ensureDir, readTextIfExists } = require('../utils');
8
8
 
@@ -151,14 +151,7 @@ function buildMcpPlan(targetDir, contextData, contextMarkdown, t) {
151
151
  reason: translate('mcp_init.reason_web_search'),
152
152
  env: []
153
153
  },
154
- buildChainRpcServer(web3Enabled, networks, t),
155
- {
156
- id: 'makopy',
157
- enabled: false,
158
- recommended: false,
159
- reason: translate('mcp_init.reason_makopy'),
160
- env: ['MAKOPY_API_KEY']
161
- }
154
+ buildChainRpcServer(web3Enabled, networks, t)
162
155
  ];
163
156
 
164
157
  return {
@@ -167,7 +160,8 @@ function buildMcpPlan(targetDir, contextData, contextMarkdown, t) {
167
160
  path: targetDir,
168
161
  framework: contextData.framework || '',
169
162
  project_type: contextData.project_type || '',
170
- conversation_language: contextData.conversation_language || 'en'
163
+ interaction_language: getInteractionLanguage(contextData, 'en'),
164
+ conversation_language: getInteractionLanguage(contextData, 'en')
171
165
  },
172
166
  database_engine: databaseEngine,
173
167
  web3_enabled: web3Enabled,
@@ -0,0 +1,234 @@
1
+ 'use strict';
2
+
3
+ const fs = require('node:fs/promises');
4
+ const path = require('node:path');
5
+ const { openRuntimeDb } = require('../runtime-store');
6
+
7
+ const REQUIRED_BOOTSTRAP = ['what-is.md', 'what-it-does.md', 'how-it-works.md', 'current-state.md'];
8
+
9
+ async function fileExists(filePath) {
10
+ try {
11
+ const stat = await fs.stat(filePath);
12
+ return stat.isFile();
13
+ } catch {
14
+ return false;
15
+ }
16
+ }
17
+
18
+ async function readText(filePath) {
19
+ try {
20
+ return await fs.readFile(filePath, 'utf8');
21
+ } catch {
22
+ return '';
23
+ }
24
+ }
25
+
26
+ async function listFiles(dirPath, predicate = () => true) {
27
+ try {
28
+ const entries = await fs.readdir(dirPath, { withFileTypes: true });
29
+ return entries
30
+ .filter((entry) => entry.isFile() && predicate(entry.name))
31
+ .map((entry) => entry.name)
32
+ .sort();
33
+ } catch {
34
+ return [];
35
+ }
36
+ }
37
+
38
+ function firstLine(text) {
39
+ const withoutFrontmatter = String(text || '').replace(/^---[\s\S]*?---\r?\n?/, '');
40
+ return withoutFrontmatter
41
+ .split(/\r?\n/)
42
+ .map((line) => line.trim())
43
+ .find((line) => line && !line.startsWith('#')) || '';
44
+ }
45
+
46
+ async function collectRuntimeSummary(targetDir) {
47
+ let handle;
48
+ try {
49
+ handle = await openRuntimeDb(targetDir, { mustExist: true });
50
+ } catch {
51
+ return { exists: false, taskCounts: {}, recentRuns: [], learnings: 0 };
52
+ }
53
+
54
+ if (!handle || !handle.db) {
55
+ return { exists: false, taskCounts: {}, recentRuns: [], learnings: 0 };
56
+ }
57
+
58
+ const { db, dbPath } = handle;
59
+ try {
60
+ const rows = db.prepare('SELECT status, COUNT(*) AS count FROM tasks GROUP BY status').all();
61
+ const taskCounts = {};
62
+ for (const row of rows) taskCounts[row.status] = Number(row.count || 0);
63
+
64
+ const recentRuns = db.prepare(`
65
+ SELECT agent_name, status, summary, title, finished_at, updated_at
66
+ FROM agent_runs
67
+ ORDER BY COALESCE(finished_at, updated_at, started_at) DESC
68
+ LIMIT 8
69
+ `).all();
70
+
71
+ let learnings = 0;
72
+ try {
73
+ const row = db.prepare("SELECT COUNT(*) AS count FROM project_learnings WHERE status = 'active'").get();
74
+ learnings = Number(row?.count || 0);
75
+ } catch {
76
+ learnings = 0;
77
+ }
78
+
79
+ return { exists: true, dbPath, taskCounts, recentRuns, learnings };
80
+ } finally {
81
+ db.close();
82
+ }
83
+ }
84
+
85
+ async function collectMemoryStatus(targetDir) {
86
+ const bootstrapDir = path.join(targetDir, '.aioson', 'context', 'bootstrap');
87
+ const bootstrapFiles = [];
88
+ for (const name of REQUIRED_BOOTSTRAP) {
89
+ bootstrapFiles.push({
90
+ path: `.aioson/context/bootstrap/${name}`,
91
+ exists: await fileExists(path.join(bootstrapDir, name))
92
+ });
93
+ }
94
+
95
+ const memoryIndexPath = path.join(targetDir, '.aioson', 'context', 'memory-index.md');
96
+ const contextPackPath = path.join(targetDir, '.aioson', 'context', 'context-pack.md');
97
+ const projectPulsePath = path.join(targetDir, '.aioson', 'context', 'project-pulse.md');
98
+ const logsDir = path.join(targetDir, 'aioson-logs');
99
+ const devlogs = await listFiles(logsDir, (name) => name.startsWith('devlog-') && name.endsWith('.md'));
100
+ const devlogManifestPath = path.join(logsDir, 'manifest.md');
101
+
102
+ const brainsDir = path.join(targetDir, '.aioson', 'brains');
103
+ const brainIndexPath = path.join(brainsDir, '_index.json');
104
+ let brainIndex = null;
105
+ const brainWarnings = [];
106
+ try {
107
+ brainIndex = JSON.parse(await fs.readFile(brainIndexPath, 'utf8'));
108
+ } catch {
109
+ brainWarnings.push(`Missing or invalid ${path.relative(targetDir, brainIndexPath)}`);
110
+ }
111
+
112
+ const brains = Array.isArray(brainIndex?.brains) ? brainIndex.brains : [];
113
+ for (const brain of brains) {
114
+ const rel = String(brain.path || '');
115
+ const brainPath = rel.startsWith('.aioson/brains/')
116
+ ? path.join(targetDir, rel)
117
+ : path.join(brainsDir, rel);
118
+ if (!(await fileExists(brainPath))) {
119
+ brainWarnings.push(`Missing brain file: ${rel || brain.id || '(unknown)'}`);
120
+ }
121
+ }
122
+
123
+ const runtime = await collectRuntimeSummary(targetDir);
124
+ const bootstrapCoverage = bootstrapFiles.filter((file) => file.exists).length;
125
+
126
+ return {
127
+ ok: bootstrapCoverage === REQUIRED_BOOTSTRAP.length && brainWarnings.length === 0,
128
+ targetDir,
129
+ bootstrap: {
130
+ required: REQUIRED_BOOTSTRAP.length,
131
+ present: bootstrapCoverage,
132
+ missing: bootstrapFiles.filter((file) => !file.exists).map((file) => file.path),
133
+ files: bootstrapFiles
134
+ },
135
+ context: {
136
+ memoryIndex: await fileExists(memoryIndexPath),
137
+ contextPack: await fileExists(contextPackPath),
138
+ projectPulse: await fileExists(projectPulsePath)
139
+ },
140
+ devlogs: {
141
+ count: devlogs.length,
142
+ manifest: await fileExists(devlogManifestPath),
143
+ files: devlogs.map((name) => `aioson-logs/${name}`)
144
+ },
145
+ brains: {
146
+ index: await fileExists(brainIndexPath),
147
+ count: brains.length,
148
+ files: brains.map((brain) => brain.path).filter(Boolean),
149
+ warnings: brainWarnings
150
+ },
151
+ runtime
152
+ };
153
+ }
154
+
155
+ function formatTaskCounts(counts) {
156
+ const entries = Object.entries(counts || {});
157
+ if (entries.length === 0) return 'none';
158
+ return entries.map(([key, value]) => `${key}:${value}`).join(', ');
159
+ }
160
+
161
+ async function runMemoryStatus({ args, options = {}, logger }) {
162
+ const targetDir = path.resolve(process.cwd(), args[0] || '.');
163
+ const status = await collectMemoryStatus(targetDir);
164
+
165
+ if (options.json) return status;
166
+
167
+ logger.log('AIOSON Memory Status');
168
+ logger.log(`Bootstrap: ${status.bootstrap.present}/${status.bootstrap.required}`);
169
+ if (status.bootstrap.missing.length > 0) {
170
+ logger.log(`Missing bootstrap: ${status.bootstrap.missing.join(', ')}`);
171
+ }
172
+ logger.log(`Memory index: ${status.context.memoryIndex ? 'present' : 'missing'}`);
173
+ logger.log(`Context pack: ${status.context.contextPack ? 'present' : 'missing'}`);
174
+ logger.log(`Project pulse: ${status.context.projectPulse ? 'present' : 'missing'}`);
175
+ logger.log(`Devlogs: ${status.devlogs.count} (${status.devlogs.manifest ? 'manifest present' : 'no manifest'})`);
176
+ logger.log(`Brains: ${status.brains.count} indexed${status.brains.warnings.length ? `, ${status.brains.warnings.length} warning(s)` : ''}`);
177
+ for (const warning of status.brains.warnings) logger.log(`- ${warning}`);
178
+ logger.log(`Runtime: ${status.runtime.exists ? formatTaskCounts(status.runtime.taskCounts) : 'missing'}`);
179
+ logger.log(`Active learnings: ${status.runtime.learnings || 0}`);
180
+ return status;
181
+ }
182
+
183
+ async function runMemorySummary({ args, options = {}, logger }) {
184
+ const targetDir = path.resolve(process.cwd(), args[0] || '.');
185
+ const status = await collectMemoryStatus(targetDir);
186
+ const pulse = await readText(path.join(targetDir, '.aioson', 'context', 'project-pulse.md'));
187
+ const whatIs = await readText(path.join(targetDir, '.aioson', 'context', 'bootstrap', 'what-is.md'));
188
+ const currentState = await readText(path.join(targetDir, '.aioson', 'context', 'bootstrap', 'current-state.md'));
189
+
190
+ const recentRuns = (status.runtime.recentRuns || []).slice(0, Number(options.last || 5));
191
+ const lines = [
192
+ '# AIOSON Memory Summary',
193
+ '',
194
+ '## Bootstrap',
195
+ `- Coverage: ${status.bootstrap.present}/${status.bootstrap.required}`,
196
+ `- Identity: ${firstLine(whatIs) || 'not available'}`,
197
+ `- Current state: ${firstLine(currentState) || 'not available'}`,
198
+ '',
199
+ '## Project Pulse',
200
+ pulse ? pulse.split(/\r?\n/).slice(0, 28).join('\n') : '_No project-pulse.md found_',
201
+ '',
202
+ '## Recent Runtime',
203
+ status.runtime.exists
204
+ ? `- Tasks: ${formatTaskCounts(status.runtime.taskCounts)}`
205
+ : '- Runtime database missing',
206
+ `- Active learnings: ${status.runtime.learnings || 0}`
207
+ ];
208
+
209
+ if (recentRuns.length > 0) {
210
+ lines.push('', '## Recent Runs');
211
+ for (const run of recentRuns) {
212
+ const when = run.finished_at || run.updated_at || '';
213
+ const summary = run.summary || run.title || '(no summary)';
214
+ lines.push(`- ${when} ${run.agent_name}: ${summary}`);
215
+ }
216
+ }
217
+
218
+ lines.push('', '## Retrieval Hints');
219
+ lines.push('- Use `aioson context:pack . --agent=<agent> --goal="<task>"` for focused project context.');
220
+ lines.push('- Use `aioson brain:query . --tags=<tags> --min-quality=4` for procedural patterns.');
221
+ lines.push('- Use Git only when memory and runtime do not explain recent work.');
222
+
223
+ const summary = lines.join('\n');
224
+ if (options.json) return { ok: true, status, summary };
225
+ logger.log(summary);
226
+ return { ok: true, status, summary };
227
+ }
228
+
229
+ module.exports = {
230
+ REQUIRED_BOOTSTRAP,
231
+ collectMemoryStatus,
232
+ runMemoryStatus,
233
+ runMemorySummary
234
+ };
@@ -6,6 +6,20 @@ const { validateProjectContextFile } = require('../context');
6
6
  const { exists, toRelativeSafe } = require('../utils');
7
7
  const { parseWorkers, normalizeClassification } = require('./parallel-init');
8
8
  const { recordRuntimeOperation } = require('../execution-gateway');
9
+ const {
10
+ WORKSPACE_MANIFEST_RELATIVE_PATH,
11
+ OWNERSHIP_MAP_RELATIVE_PATH,
12
+ MERGE_PLAN_RELATIVE_PATH,
13
+ buildLaneOwnershipEntries,
14
+ buildWorkspaceManifest,
15
+ buildOwnershipMap,
16
+ buildMergePlan,
17
+ extractStatusDependencyItems,
18
+ extractStatusWritePathItems,
19
+ extractStatusMergeRank,
20
+ replaceSection,
21
+ replaceMetadataLine
22
+ } = require('../parallel-workspace');
9
23
 
10
24
  const SOURCE_ALIAS = {
11
25
  prd: '.aioson/context/prd.md',
@@ -164,30 +178,11 @@ function distributeScopes(scopes, workers) {
164
178
  }
165
179
 
166
180
  function replaceScopeSection(content, items) {
167
- const text = String(content || '');
168
- const lines = text.split(/\r?\n/);
169
- const start = lines.findIndex((line) => line.trim() === '## Scope');
170
- const scopeLines = items.length > 0 ? items.map((item) => `- ${item}`) : ['- [unassigned]'];
171
-
172
- if (start === -1) {
173
- const suffix = lines.length > 0 && lines[lines.length - 1] === '' ? '' : '\n';
174
- return `${text}${suffix}\n## Scope\n${scopeLines.join('\n')}\n`;
175
- }
176
-
177
- let end = lines.length;
178
- for (let i = start + 1; i < lines.length; i += 1) {
179
- if (lines[i].startsWith('## ')) {
180
- end = i;
181
- break;
182
- }
183
- }
184
-
185
- const replaced = [
186
- ...lines.slice(0, start + 1),
187
- ...scopeLines,
188
- ...lines.slice(end)
189
- ];
190
- return `${replaced.join('\n').replace(/\n*$/, '\n')}`;
181
+ return replaceSection(
182
+ content,
183
+ 'Scope',
184
+ items.length > 0 ? items.map((item) => `- ${item}`) : ['- [unassigned]']
185
+ );
191
186
  }
192
187
 
193
188
  function updateTimestamp(content, generatedAt) {
@@ -198,6 +193,13 @@ function updateTimestamp(content, generatedAt) {
198
193
  return text;
199
194
  }
200
195
 
196
+ function extractMetadata(content, key, fallback = '') {
197
+ const regex = new RegExp(`^-\\s*${key}:\\s*(.*)$`, 'im');
198
+ const match = String(content || '').match(regex);
199
+ if (!match) return fallback;
200
+ return String(match[1] || '').trim() || fallback;
201
+ }
202
+
201
203
  function appendSharedDecision(content, generatedAt, sourcePath, workers, scopeCount) {
202
204
  const row =
203
205
  `| ${generatedAt} | Scope assignment initialized | ` +
@@ -290,19 +292,90 @@ async function runParallelAssign({ args, options = {}, logger, t }) {
290
292
  const assignments = distributeScopes(extracted.scopes, workers);
291
293
  const generatedAt = new Date().toISOString();
292
294
  const filesUpdated = [];
295
+ const projectName =
296
+ String((context.data && context.data.project_name) || '').trim() || path.basename(targetDir) || 'project';
297
+ const laneStatusByIndex = new Map();
298
+ const enrichedAssignments = [];
293
299
 
294
300
  for (const lane of assignments) {
295
301
  const rel = `.aioson/context/parallel/agent-${lane.lane}.status.md`;
296
302
  const lanePath = path.join(targetDir, rel);
297
303
  const current = await fs.readFile(lanePath, 'utf8');
304
+ laneStatusByIndex.set(lane.lane, current);
305
+ enrichedAssignments.push({
306
+ ...lane,
307
+ owner: extractMetadata(current, 'owner', `lane-${lane.lane}`),
308
+ dependsOn: extractStatusDependencyItems(current),
309
+ writePaths: extractStatusWritePathItems(current),
310
+ mergeRank: extractStatusMergeRank(current, lane.lane)
311
+ });
312
+ }
313
+
314
+ const laneEntries = buildLaneOwnershipEntries(enrichedAssignments);
315
+
316
+ for (const lane of assignments) {
317
+ const rel = `.aioson/context/parallel/agent-${lane.lane}.status.md`;
318
+ const lanePath = path.join(targetDir, rel);
319
+ const current = laneStatusByIndex.get(lane.lane);
320
+ const laneEntry = laneEntries.find((item) => item.lane === lane.lane);
298
321
  let next = replaceScopeSection(current, lane.items);
299
322
  next = updateTimestamp(next, generatedAt);
323
+ next = replaceMetadataLine(next, 'owner', laneEntry.owner);
324
+ next = replaceSection(next, 'Ownership', [
325
+ `- lane_key: ${laneEntry.lane_key}`,
326
+ `- scope_keys: ${laneEntry.scope_keys.length > 0 ? laneEntry.scope_keys.join(', ') : '[unassigned]'}`,
327
+ `- write_scope: ${laneEntry.scope_labels.length > 0 ? laneEntry.scope_labels.join(' | ') : '[unassigned]'}`,
328
+ `- write_paths: ${laneEntry.write_paths.length > 0 ? laneEntry.write_paths.join(', ') : '[unassigned]'}`
329
+ ]);
330
+ next = replaceSection(next, 'Merge', [
331
+ `- merge_rank: ${laneEntry.merge_rank}`,
332
+ '- merge_strategy: lane-index-asc'
333
+ ]);
300
334
  if (!dryRun) {
301
335
  await fs.writeFile(lanePath, next, 'utf8');
302
336
  }
303
337
  filesUpdated.push(rel);
304
338
  }
305
339
 
340
+ const workspaceManifest = buildWorkspaceManifest({
341
+ projectName,
342
+ classification: classification || 'MEDIUM',
343
+ workers,
344
+ generatedAt,
345
+ lanes: laneEntries,
346
+ sourceFile: sourceFile.relPath
347
+ });
348
+ const ownershipMap = buildOwnershipMap({
349
+ generatedAt,
350
+ lanes: laneEntries
351
+ });
352
+ const mergePlan = buildMergePlan({
353
+ generatedAt,
354
+ lanes: laneEntries,
355
+ sourceFile: sourceFile.relPath
356
+ });
357
+ const machineFiles = [
358
+ {
359
+ rel: WORKSPACE_MANIFEST_RELATIVE_PATH,
360
+ payload: workspaceManifest
361
+ },
362
+ {
363
+ rel: OWNERSHIP_MAP_RELATIVE_PATH,
364
+ payload: ownershipMap
365
+ },
366
+ {
367
+ rel: MERGE_PLAN_RELATIVE_PATH,
368
+ payload: mergePlan
369
+ }
370
+ ];
371
+
372
+ for (const file of machineFiles) {
373
+ if (!dryRun) {
374
+ await fs.writeFile(path.join(targetDir, file.rel), `${JSON.stringify(file.payload, null, 2)}\n`, 'utf8');
375
+ }
376
+ filesUpdated.push(file.rel);
377
+ }
378
+
306
379
  const sharedPath = path.join(parallelDir, 'shared-decisions.md');
307
380
  if (await exists(sharedPath)) {
308
381
  const sharedContent = await fs.readFile(sharedPath, 'utf8');
@@ -335,9 +408,15 @@ async function runParallelAssign({ args, options = {}, logger, t }) {
335
408
  assignments: assignments.map((item) => ({
336
409
  lane: item.lane,
337
410
  file: `.aioson/context/parallel/agent-${item.lane}.status.md`,
338
- items: item.items
411
+ items: item.items,
412
+ writePaths: (laneEntries.find((laneEntry) => laneEntry.lane === item.lane) || {}).write_paths || []
339
413
  })),
340
- filesUpdated
414
+ filesUpdated,
415
+ machineFiles: {
416
+ workspaceManifest: WORKSPACE_MANIFEST_RELATIVE_PATH,
417
+ ownershipMap: OWNERSHIP_MAP_RELATIVE_PATH,
418
+ mergePlan: MERGE_PLAN_RELATIVE_PATH
419
+ }
341
420
  };
342
421
 
343
422
  if (!dryRun) {
@@ -361,7 +440,8 @@ async function runParallelAssign({ args, options = {}, logger, t }) {
361
440
  extractionMethod: output.extractionMethod,
362
441
  fallbackUsed: output.fallbackUsed,
363
442
  scopeCount: output.scopeCount,
364
- filesUpdated
443
+ filesUpdated,
444
+ machineFiles: output.machineFiles
365
445
  }
366
446
  });
367
447
  }