@jaimevalasek/aioson 1.7.2 → 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 (362) hide show
  1. package/CHANGELOG.md +35 -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 +42 -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/cypher.md +252 -0
  143. package/template/.aioson/agents/dev.md +112 -628
  144. package/template/.aioson/agents/deyvin.md +33 -236
  145. package/template/.aioson/agents/discover.md +235 -0
  146. package/template/.aioson/agents/discovery-design-doc.md +17 -252
  147. package/template/.aioson/agents/genome.md +76 -26
  148. package/template/.aioson/agents/manifests/analyst.manifest.json +26 -0
  149. package/template/.aioson/agents/manifests/architect.manifest.json +23 -0
  150. package/template/.aioson/agents/manifests/committer.manifest.json +23 -0
  151. package/template/.aioson/agents/manifests/dev.manifest.json +37 -0
  152. package/template/.aioson/agents/manifests/orchestrator.manifest.json +30 -0
  153. package/template/.aioson/agents/manifests/pentester.manifest.json +39 -0
  154. package/template/.aioson/agents/manifests/pm.manifest.json +26 -0
  155. package/template/.aioson/agents/manifests/product.manifest.json +23 -0
  156. package/template/.aioson/agents/manifests/qa.manifest.json +25 -0
  157. package/template/.aioson/agents/manifests/setup.manifest.json +20 -0
  158. package/template/.aioson/agents/manifests/ux-ui.manifest.json +24 -0
  159. package/template/.aioson/agents/neo.md +5 -7
  160. package/template/.aioson/agents/orache.md +2 -6
  161. package/template/.aioson/agents/orchestrator.md +81 -182
  162. package/template/.aioson/agents/pentester.md +235 -0
  163. package/template/.aioson/agents/pm.md +40 -104
  164. package/template/.aioson/agents/product.md +99 -344
  165. package/template/.aioson/agents/profiler-enricher.md +57 -6
  166. package/template/.aioson/agents/profiler-forge.md +17 -7
  167. package/template/.aioson/agents/profiler-researcher.md +29 -6
  168. package/template/.aioson/agents/qa.md +168 -514
  169. package/template/.aioson/agents/setup.md +52 -278
  170. package/template/.aioson/agents/sheldon.md +122 -754
  171. package/template/.aioson/agents/site-forge.md +111 -1583
  172. package/template/.aioson/agents/squad.md +139 -2010
  173. package/template/.aioson/agents/tester.md +10 -0
  174. package/template/.aioson/agents/ux-ui.md +104 -812
  175. package/template/.aioson/agents/validator.md +69 -0
  176. package/template/.aioson/brains/scripts/query.js +5 -1
  177. package/template/.aioson/config/autonomy-protocol.json +43 -0
  178. package/template/.aioson/config.md +43 -15
  179. package/template/.aioson/constitution.md +36 -33
  180. package/template/.aioson/context/design-doc.md +136 -0
  181. package/template/.aioson/context/project-map.md +57 -0
  182. package/template/.aioson/design-docs/code-reuse.md +48 -0
  183. package/template/.aioson/design-docs/componentization.md +47 -0
  184. package/template/.aioson/design-docs/file-size.md +52 -0
  185. package/template/.aioson/design-docs/folder-structure.md +51 -0
  186. package/template/.aioson/design-docs/naming.md +54 -0
  187. package/template/.aioson/docs/LAYERS.md +12 -2
  188. package/template/.aioson/docs/dev/execution-discipline.md +106 -0
  189. package/template/.aioson/docs/dev/stack-conventions.md +83 -0
  190. package/template/.aioson/docs/deyvin/continuity-recovery.md +57 -0
  191. package/template/.aioson/docs/deyvin/debugging-escalation.md +30 -0
  192. package/template/.aioson/docs/deyvin/pair-execution.md +44 -0
  193. package/template/.aioson/docs/deyvin/runtime-handoffs.md +36 -0
  194. package/template/.aioson/docs/product/conversation-playbook.md +116 -0
  195. package/template/.aioson/docs/product/prd-contract.md +107 -0
  196. package/template/.aioson/docs/product/quality-lens.md +57 -0
  197. package/template/.aioson/docs/product/research-loop.md +65 -0
  198. package/template/.aioson/docs/sheldon/enrichment-paths.md +134 -0
  199. package/template/.aioson/docs/sheldon/quality-lens.md +57 -0
  200. package/template/.aioson/docs/sheldon/research-loop.md +56 -0
  201. package/template/.aioson/docs/sheldon/web-intelligence.md +75 -0
  202. package/template/.aioson/docs/site-forge-build.md +195 -0
  203. package/template/.aioson/docs/site-forge-extraction.md +135 -0
  204. package/template/.aioson/docs/site-forge-qa.md +155 -0
  205. package/template/.aioson/docs/site-forge-recon.md +434 -0
  206. package/template/.aioson/docs/site-forge-transform.md +249 -0
  207. package/template/.aioson/docs/squad/content-output.md +91 -0
  208. package/template/.aioson/docs/squad/creation-flow.md +135 -0
  209. package/template/.aioson/docs/squad/domain-classification.md +117 -0
  210. package/template/.aioson/docs/squad/genome-bindings.md +47 -0
  211. package/template/.aioson/docs/squad/package-contract.md +234 -0
  212. package/template/.aioson/docs/squad/quality-lens.md +56 -0
  213. package/template/.aioson/docs/squad/research-loop.md +59 -0
  214. package/template/.aioson/docs/squad/session-operations.md +117 -0
  215. package/template/.aioson/docs/squad/workflow-quality.md +165 -0
  216. package/template/.aioson/docs/ux-ui/accessibility-audit.md +55 -0
  217. package/template/.aioson/docs/ux-ui/audit-mode.md +86 -0
  218. package/template/.aioson/docs/ux-ui/component-map.md +35 -0
  219. package/template/.aioson/docs/ux-ui/design-execution.md +111 -0
  220. package/template/.aioson/docs/ux-ui/design-gate.md +27 -0
  221. package/template/.aioson/docs/ux-ui/research-mode.md +39 -0
  222. package/template/.aioson/docs/ux-ui/site-delivery.md +156 -0
  223. package/template/.aioson/docs/ux-ui/token-contract.md +57 -0
  224. package/template/.aioson/genomes/copywriting.meta.json +48 -0
  225. package/template/.aioson/git-guard.json +11 -0
  226. package/template/.aioson/mcp/servers.md +0 -1
  227. package/template/.aioson/rules/agent-language-policy.md +93 -0
  228. package/template/.aioson/rules/aioson-context-boundary.md +63 -0
  229. package/template/.aioson/rules/canonical-path-contract.md +47 -0
  230. package/template/.aioson/rules/data-format-convention.md +24 -86
  231. package/template/.aioson/rules/disk-first-artifacts.md +44 -0
  232. package/template/.aioson/rules/output-brevity.md +44 -0
  233. package/template/.aioson/rules/prd-section-ownership.md +49 -0
  234. package/template/.aioson/rules/security-baseline.md +139 -0
  235. package/template/.aioson/rules/spec-level-ownership.md +61 -0
  236. package/template/.aioson/rules/squad-driver-pattern.md +81 -0
  237. package/template/.aioson/schemas/squad-blueprint.schema.json +24 -0
  238. package/template/.aioson/schemas/squad-manifest.schema.json +44 -0
  239. package/template/.aioson/skills/process/aioson-spec-driven/references/pm.md +30 -0
  240. package/template/.aioson/skills/process/secure-tdd/SKILL.md +97 -0
  241. package/template/.aioson/skills/process/secure-tdd/references/nextjs.md +81 -0
  242. package/template/.aioson/skills/process/secure-tdd/references/node-express.md +91 -0
  243. package/template/.aioson/skills/process/secure-tdd/references/planned-stacks.md +33 -0
  244. package/template/.aioson/skills/static/harness-validate/SKILL.md +46 -0
  245. package/template/.aioson/skills/static/web-research-cache.md +3 -0
  246. package/template/.aioson/tasks/squad-create.md +35 -8
  247. package/template/.aioson/tasks/squad-design.md +50 -2
  248. package/template/.aioson/tasks/squad-investigate.md +14 -1
  249. package/template/.claude/commands/aioson/agent/committer.md +5 -0
  250. package/template/.claude/commands/aioson/agent/copywriter.md +5 -0
  251. package/template/.claude/commands/aioson/agent/cypher.md +5 -0
  252. package/template/.claude/commands/aioson/agent/pair.md +5 -0
  253. package/template/.claude/commands/aioson/agent/validator.md +5 -0
  254. package/template/.gemini/commands/aios-analyst.toml +6 -3
  255. package/template/.gemini/commands/aios-architect.toml +7 -6
  256. package/template/.gemini/commands/aios-committer.toml +7 -0
  257. package/template/.gemini/commands/aios-copywriter.toml +7 -0
  258. package/template/.gemini/commands/aios-cypher.toml +7 -0
  259. package/template/.gemini/commands/aios-dev.toml +8 -7
  260. package/template/.gemini/commands/aios-deyvin.toml +6 -5
  261. package/template/.gemini/commands/aios-discovery-design-doc.toml +6 -3
  262. package/template/.gemini/commands/aios-genome.toml +7 -0
  263. package/template/.gemini/commands/aios-neo.toml +5 -3
  264. package/template/.gemini/commands/aios-orache.toml +7 -0
  265. package/template/.gemini/commands/aios-orchestrator.toml +8 -7
  266. package/template/.gemini/commands/aios-pair.toml +6 -5
  267. package/template/.gemini/commands/aios-pm.toml +8 -7
  268. package/template/.gemini/commands/aios-product.toml +5 -3
  269. package/template/.gemini/commands/aios-qa.toml +6 -5
  270. package/template/.gemini/commands/aios-setup.toml +5 -2
  271. package/template/.gemini/commands/aios-sheldon.toml +7 -0
  272. package/template/.gemini/commands/aios-site-forge.toml +7 -0
  273. package/template/.gemini/commands/aios-squad.toml +7 -0
  274. package/template/.gemini/commands/aios-tester.toml +6 -5
  275. package/template/.gemini/commands/aios-ux-ui.toml +8 -7
  276. package/template/.gemini/commands/aios-validator.toml +7 -0
  277. package/template/AGENTS.md +12 -1
  278. package/template/CLAUDE.md +5 -1
  279. package/template/.aioson/locales/en/agents/analyst.md +0 -244
  280. package/template/.aioson/locales/en/agents/architect.md +0 -245
  281. package/template/.aioson/locales/en/agents/dev.md +0 -397
  282. package/template/.aioson/locales/en/agents/deyvin.md +0 -137
  283. package/template/.aioson/locales/en/agents/discovery-design-doc.md +0 -27
  284. package/template/.aioson/locales/en/agents/genome.md +0 -212
  285. package/template/.aioson/locales/en/agents/neo.md +0 -8
  286. package/template/.aioson/locales/en/agents/orache.md +0 -6
  287. package/template/.aioson/locales/en/agents/orchestrator.md +0 -189
  288. package/template/.aioson/locales/en/agents/pair.md +0 -5
  289. package/template/.aioson/locales/en/agents/pm.md +0 -84
  290. package/template/.aioson/locales/en/agents/product.md +0 -378
  291. package/template/.aioson/locales/en/agents/profiler-enricher.md +0 -5
  292. package/template/.aioson/locales/en/agents/profiler-forge.md +0 -5
  293. package/template/.aioson/locales/en/agents/profiler-researcher.md +0 -5
  294. package/template/.aioson/locales/en/agents/qa.md +0 -270
  295. package/template/.aioson/locales/en/agents/setup.md +0 -421
  296. package/template/.aioson/locales/en/agents/sheldon.md +0 -455
  297. package/template/.aioson/locales/en/agents/squad.md +0 -449
  298. package/template/.aioson/locales/en/agents/tester.md +0 -6
  299. package/template/.aioson/locales/en/agents/ux-ui.md +0 -668
  300. package/template/.aioson/locales/es/agents/analyst.md +0 -225
  301. package/template/.aioson/locales/es/agents/architect.md +0 -245
  302. package/template/.aioson/locales/es/agents/dev.md +0 -370
  303. package/template/.aioson/locales/es/agents/deyvin.md +0 -99
  304. package/template/.aioson/locales/es/agents/discovery-design-doc.md +0 -21
  305. package/template/.aioson/locales/es/agents/genome.md +0 -104
  306. package/template/.aioson/locales/es/agents/neo.md +0 -50
  307. package/template/.aioson/locales/es/agents/orache.md +0 -105
  308. package/template/.aioson/locales/es/agents/orchestrator.md +0 -194
  309. package/template/.aioson/locales/es/agents/pair.md +0 -7
  310. package/template/.aioson/locales/es/agents/pm.md +0 -90
  311. package/template/.aioson/locales/es/agents/product.md +0 -372
  312. package/template/.aioson/locales/es/agents/profiler-enricher.md +0 -7
  313. package/template/.aioson/locales/es/agents/profiler-forge.md +0 -7
  314. package/template/.aioson/locales/es/agents/profiler-researcher.md +0 -7
  315. package/template/.aioson/locales/es/agents/qa.md +0 -198
  316. package/template/.aioson/locales/es/agents/setup.md +0 -405
  317. package/template/.aioson/locales/es/agents/sheldon.md +0 -309
  318. package/template/.aioson/locales/es/agents/squad.md +0 -532
  319. package/template/.aioson/locales/es/agents/tester.md +0 -9
  320. package/template/.aioson/locales/es/agents/ux-ui.md +0 -212
  321. package/template/.aioson/locales/fr/agents/analyst.md +0 -225
  322. package/template/.aioson/locales/fr/agents/architect.md +0 -245
  323. package/template/.aioson/locales/fr/agents/dev.md +0 -370
  324. package/template/.aioson/locales/fr/agents/deyvin.md +0 -99
  325. package/template/.aioson/locales/fr/agents/discovery-design-doc.md +0 -21
  326. package/template/.aioson/locales/fr/agents/genome.md +0 -104
  327. package/template/.aioson/locales/fr/agents/neo.md +0 -50
  328. package/template/.aioson/locales/fr/agents/orache.md +0 -106
  329. package/template/.aioson/locales/fr/agents/orchestrator.md +0 -194
  330. package/template/.aioson/locales/fr/agents/pair.md +0 -7
  331. package/template/.aioson/locales/fr/agents/pm.md +0 -90
  332. package/template/.aioson/locales/fr/agents/product.md +0 -372
  333. package/template/.aioson/locales/fr/agents/profiler-enricher.md +0 -7
  334. package/template/.aioson/locales/fr/agents/profiler-forge.md +0 -7
  335. package/template/.aioson/locales/fr/agents/profiler-researcher.md +0 -7
  336. package/template/.aioson/locales/fr/agents/qa.md +0 -198
  337. package/template/.aioson/locales/fr/agents/setup.md +0 -405
  338. package/template/.aioson/locales/fr/agents/sheldon.md +0 -309
  339. package/template/.aioson/locales/fr/agents/squad.md +0 -532
  340. package/template/.aioson/locales/fr/agents/tester.md +0 -9
  341. package/template/.aioson/locales/fr/agents/ux-ui.md +0 -212
  342. package/template/.aioson/locales/pt-BR/agents/analyst.md +0 -319
  343. package/template/.aioson/locales/pt-BR/agents/architect.md +0 -284
  344. package/template/.aioson/locales/pt-BR/agents/dev.md +0 -483
  345. package/template/.aioson/locales/pt-BR/agents/deyvin.md +0 -184
  346. package/template/.aioson/locales/pt-BR/agents/discovery-design-doc.md +0 -198
  347. package/template/.aioson/locales/pt-BR/agents/genome.md +0 -297
  348. package/template/.aioson/locales/pt-BR/agents/neo.md +0 -208
  349. package/template/.aioson/locales/pt-BR/agents/orache.md +0 -137
  350. package/template/.aioson/locales/pt-BR/agents/orchestrator.md +0 -324
  351. package/template/.aioson/locales/pt-BR/agents/pair.md +0 -5
  352. package/template/.aioson/locales/pt-BR/agents/pm.md +0 -182
  353. package/template/.aioson/locales/pt-BR/agents/product.md +0 -466
  354. package/template/.aioson/locales/pt-BR/agents/profiler-enricher.md +0 -5
  355. package/template/.aioson/locales/pt-BR/agents/profiler-forge.md +0 -5
  356. package/template/.aioson/locales/pt-BR/agents/profiler-researcher.md +0 -5
  357. package/template/.aioson/locales/pt-BR/agents/qa.md +0 -300
  358. package/template/.aioson/locales/pt-BR/agents/setup.md +0 -533
  359. package/template/.aioson/locales/pt-BR/agents/sheldon.md +0 -323
  360. package/template/.aioson/locales/pt-BR/agents/squad.md +0 -1330
  361. package/template/.aioson/locales/pt-BR/agents/tester.md +0 -449
  362. package/template/.aioson/locales/pt-BR/agents/ux-ui.md +0 -669
@@ -0,0 +1,231 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * aioson workflow:harden — autonomous friction detection and codebase hardening.
5
+ *
6
+ * Reads workflow error logs, identifies recurring patterns, and applies
7
+ * preventive fixes where possible (git hooks, test helpers, rules, etc.).
8
+ *
9
+ * Usage:
10
+ * aioson workflow:harden .
11
+ * aioson workflow:harden . --dry-run
12
+ * aioson workflow:harden . --json
13
+ */
14
+
15
+ const path = require('node:path');
16
+ const fs = require('node:fs/promises');
17
+ const { scanFriction, buildRecommendations } = require('../friction-scanner');
18
+ const { ensureDir, exists } = require('../utils');
19
+ const { installPreCommitHook } = require('../lib/git-commit-guard');
20
+
21
+ async function ensureGitignoreBlocks(targetDir, blocks) {
22
+ const gitignorePath = path.join(targetDir, '.gitignore');
23
+ let content = '';
24
+ try {
25
+ content = await fs.readFile(gitignorePath, 'utf8');
26
+ } catch {
27
+ content = '';
28
+ }
29
+ const lines = content.split('\n');
30
+ const added = [];
31
+ for (const block of blocks) {
32
+ if (!lines.some((l) => l.trim() === block)) {
33
+ lines.push(block);
34
+ added.push(block);
35
+ }
36
+ }
37
+ if (added.length > 0) {
38
+ await fs.writeFile(gitignorePath, lines.join('\n') + '\n', 'utf8');
39
+ }
40
+ return added;
41
+ }
42
+
43
+ async function ensureMockHelperStub(targetDir) {
44
+ const helperPath = path.join(targetDir, 'tests', 'helpers', 'mocks.ts');
45
+ if (await exists(helperPath)) return { created: false, path: helperPath };
46
+ const jsPath = path.join(targetDir, 'tests', 'helpers', 'mocks.js');
47
+ if (await exists(jsPath)) return { created: false, path: jsPath };
48
+
49
+ const stub = `/**
50
+ * Shared mock factory — prevents ordering bugs and inconsistent mocks.
51
+ *
52
+ * Usage:
53
+ * import { createServiceMock } from './helpers/mocks';
54
+ */
55
+
56
+ export function createServiceMock(overrides = {}) {
57
+ return {
58
+ get: vi.fn(),
59
+ post: vi.fn(),
60
+ ...overrides
61
+ };
62
+ }
63
+ `;
64
+ await ensureDir(path.dirname(helperPath));
65
+ await fs.writeFile(helperPath, stub, 'utf8');
66
+ return { created: true, path: helperPath };
67
+ }
68
+
69
+ async function applyAutoFixes(targetDir, recommendations, dryRun) {
70
+ const fixes = [];
71
+ for (const rec of recommendations) {
72
+ if (!rec.autoFixable) continue;
73
+
74
+ if (rec.pattern === 'Git staging accidents') {
75
+ const blocks = ['node_modules/', 'dist/', '.next/', '*.db', 'build/', 'coverage/'];
76
+ if (!dryRun) {
77
+ const added = await ensureGitignoreBlocks(targetDir, blocks);
78
+ if (added.length > 0) {
79
+ fixes.push({ ok: true, action: 'Updated .gitignore', details: added });
80
+ }
81
+ } else {
82
+ fixes.push({ ok: true, action: 'Would update .gitignore', details: blocks });
83
+ }
84
+
85
+ if (!dryRun) {
86
+ try {
87
+ const hookResult = await installPreCommitHook(targetDir, { force: false });
88
+ fixes.push({
89
+ ok: hookResult.ok,
90
+ action: hookResult.ok ? 'Installed pre-commit hook' : 'Pre-commit hook already exists or blocked',
91
+ details: hookResult.message || null
92
+ });
93
+ } catch (err) {
94
+ fixes.push({ ok: false, action: 'Failed to install pre-commit hook', details: err.message });
95
+ }
96
+ } else {
97
+ fixes.push({ ok: true, action: 'Would install pre-commit hook', details: null });
98
+ }
99
+ }
100
+
101
+ if (rec.pattern === 'Mock ordering / test helper issues') {
102
+ if (!dryRun) {
103
+ const result = await ensureMockHelperStub(targetDir);
104
+ fixes.push({
105
+ ok: true,
106
+ action: result.created ? 'Created shared mock helper stub' : 'Shared mock helper already exists',
107
+ path: result.path
108
+ });
109
+ } else {
110
+ fixes.push({ ok: true, action: 'Would create shared mock helper stub', path: 'tests/helpers/mocks.ts' });
111
+ }
112
+ }
113
+ }
114
+ return fixes;
115
+ }
116
+
117
+ function buildReport(analysis, recommendations, fixes) {
118
+ const lines = [
119
+ '---',
120
+ `generated_at: ${new Date().toISOString()}`,
121
+ `total_errors_scanned: ${analysis.total}`,
122
+ `patterns_found: ${analysis.patterns.length}`,
123
+ '---',
124
+ '',
125
+ '# Codebase Hardening Report',
126
+ '',
127
+ '## Recurring friction patterns',
128
+ ''
129
+ ];
130
+
131
+ if (analysis.patterns.length === 0) {
132
+ lines.push('No recurring patterns detected. Great job!');
133
+ } else {
134
+ for (const p of analysis.patterns) {
135
+ lines.push(`### ${p.name} (${p.count} occurrences)`);
136
+ if (p.examples.length > 0) {
137
+ lines.push('Recent examples:');
138
+ for (const ex of p.examples) {
139
+ lines.push(`- \`${ex}\``);
140
+ }
141
+ }
142
+ lines.push('');
143
+ }
144
+ }
145
+
146
+ lines.push('## Recommendations');
147
+ lines.push('');
148
+ if (recommendations.length === 0) {
149
+ lines.push('None.');
150
+ } else {
151
+ for (const r of recommendations) {
152
+ lines.push(`- **${r.pattern}** — priority: ${r.priority}`);
153
+ lines.push(` - Action: ${r.action}`);
154
+ lines.push(` - Auto-fixable: ${r.autoFixable ? 'yes' : 'no'}`);
155
+ lines.push('');
156
+ }
157
+ }
158
+
159
+ lines.push('## Auto-fixes applied');
160
+ lines.push('');
161
+ if (fixes.length === 0) {
162
+ lines.push('No auto-fixes were applicable.');
163
+ } else {
164
+ for (const f of fixes) {
165
+ lines.push(`- ${f.action}${f.details ? ` (${Array.isArray(f.details) ? f.details.join(', ') : f.details})` : ''}`);
166
+ }
167
+ }
168
+
169
+ lines.push('');
170
+ lines.push('## Next steps');
171
+ lines.push('- Review high-priority recommendations.');
172
+ lines.push('- Run the full test suite to verify no regressions from auto-fixes.');
173
+ lines.push('- Update `.aioson/rules/` with project-specific conventions.');
174
+ lines.push('');
175
+
176
+ return lines.join('\n');
177
+ }
178
+
179
+ async function runWorkflowHarden({ args, options, logger }) {
180
+ const targetDir = path.resolve(process.cwd(), args[0] || '.');
181
+ const dryRun = Boolean(options['dry-run'] || options.dryRun);
182
+ const jsonMode = Boolean(options.json);
183
+
184
+ const analysis = await scanFriction(targetDir);
185
+ const recommendations = buildRecommendations(analysis);
186
+ const fixes = await applyAutoFixes(targetDir, recommendations, dryRun);
187
+
188
+ const reportMd = buildReport(analysis, recommendations, fixes);
189
+ const reportPath = path.join(targetDir, '.aioson', 'context', 'hardening-report.md');
190
+
191
+ if (!dryRun) {
192
+ await ensureDir(path.dirname(reportPath));
193
+ await fs.writeFile(reportPath, reportMd, 'utf8');
194
+ }
195
+
196
+ const result = {
197
+ ok: true,
198
+ targetDir,
199
+ dryRun,
200
+ totalErrors: analysis.total,
201
+ patternsFound: analysis.patterns.length,
202
+ patterns: analysis.patterns,
203
+ recommendations,
204
+ fixes,
205
+ reportPath: path.relative(targetDir, reportPath)
206
+ };
207
+
208
+ if (jsonMode) {
209
+ return result;
210
+ }
211
+
212
+ logger.log('');
213
+ logger.log(`Codebase Hardening — ${dryRun ? 'DRY RUN' : 'ACTIVE'}`);
214
+ logger.log('━'.repeat(40));
215
+ logger.log(`Errors scanned: ${analysis.total}`);
216
+ logger.log(`Patterns found: ${analysis.patterns.length}`);
217
+ logger.log(`Auto-fixes applied: ${fixes.length}`);
218
+ if (analysis.patterns.length > 0) {
219
+ logger.log('');
220
+ logger.log('Top patterns:');
221
+ for (const p of analysis.patterns.slice(0, 5)) {
222
+ logger.log(` - ${p.name}: ${p.count}`);
223
+ }
224
+ }
225
+ logger.log('');
226
+ logger.log(`Report: ${result.reportPath}`);
227
+
228
+ return result;
229
+ }
230
+
231
+ module.exports = { runWorkflowHarden };
@@ -0,0 +1,136 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * aioson workflow:heal — re-run a failed stage with corrective context.
5
+ *
6
+ * Usage:
7
+ * aioson workflow:heal . --stage=dev
8
+ * aioson workflow:heal . --stage=qa
9
+ *
10
+ * Reads the last recorded error, checks retry budget (max 3),
11
+ * builds a healing prompt, and re-activates the agent.
12
+ */
13
+
14
+ const path = require('node:path');
15
+ const {
16
+ loadOrCreateState,
17
+ activateStage,
18
+ persistState,
19
+ appendWorkflowEvent
20
+ } = require('./workflow-next');
21
+ const { syncWorkflowRuntime } = require('../execution-gateway');
22
+ const { writeHandoff, buildWorkflowHandoff } = require('../session-handoff');
23
+ const { resolveLocaleForTarget } = require('./workflow-next');
24
+ const {
25
+ canRetry,
26
+ incrementRetryCount,
27
+ buildHealingActivation
28
+ } = require('../self-healing');
29
+
30
+ async function runWorkflowHeal({ args, options, logger, t }) {
31
+ const targetDir = path.resolve(process.cwd(), args[0] || '.');
32
+ const tool = options.tool || 'codex';
33
+ const stage = options.stage ? String(options.stage).replace(/^@/, '') : null;
34
+ const locale = await resolveLocaleForTarget(targetDir, options);
35
+
36
+ if (!stage) {
37
+ logger.error('--stage=<agent> is required. Example: aioson workflow:heal . --stage=dev');
38
+ return { ok: false, reason: 'missing_stage' };
39
+ }
40
+
41
+ const allowedStages = ['dev', 'qa', 'tester', 'architect', 'ux-ui'];
42
+ if (!allowedStages.includes(stage)) {
43
+ logger.error(`Stage @${stage} is not supported for healing. Allowed: ${allowedStages.join(', ')}`);
44
+ return { ok: false, reason: 'unsupported_stage' };
45
+ }
46
+
47
+ const retryOk = await canRetry(targetDir, stage);
48
+ if (!retryOk) {
49
+ logger.error(`Retry budget exhausted for @${stage}. Maximum 3 attempts reached. Please intervene manually.`);
50
+ return { ok: false, reason: 'retry_budget_exhausted', stage };
51
+ }
52
+
53
+ const { state } = await loadOrCreateState(targetDir, options);
54
+
55
+ // Ensure the stage is part of the workflow sequence
56
+ if (!state.sequence.includes(stage)) {
57
+ logger.error(`Stage @${stage} is not part of the active workflow sequence.`);
58
+ return { ok: false, reason: 'stage_not_in_sequence' };
59
+ }
60
+
61
+ // Build healing activation
62
+ let activation;
63
+ try {
64
+ activation = await buildHealingActivation(
65
+ targetDir,
66
+ state,
67
+ stage,
68
+ locale,
69
+ tool,
70
+ activateStage
71
+ );
72
+ } catch (err) {
73
+ logger.error(`Unable to build healing activation: ${err.message}`);
74
+ return { ok: false, reason: 'activation_failed', error: err.message };
75
+ }
76
+
77
+ // Increment retry counter
78
+ const newCount = await incrementRetryCount(targetDir, stage, activation.prompt.substring(0, 200));
79
+
80
+ // Persist state with the healed stage as active
81
+ const healedState = {
82
+ ...state,
83
+ current: stage,
84
+ detour: null
85
+ };
86
+ await persistState(targetDir, healedState);
87
+
88
+ // Emit workflow event
89
+ const eventPayload = {
90
+ id: Date.now(),
91
+ kind: 'workflow',
92
+ createdAt: new Date().toISOString(),
93
+ eventType: 'heal',
94
+ message: `Healing @${stage} — retry ${newCount}/3`,
95
+ mode: state.mode,
96
+ classification: state.classification,
97
+ featureSlug: state.featureSlug,
98
+ current: stage,
99
+ next: state.next,
100
+ completed: state.completed,
101
+ skipped: state.skipped,
102
+ sequence: state.sequence,
103
+ healing: true,
104
+ retryCount: newCount
105
+ };
106
+ await appendWorkflowEvent(targetDir, eventPayload);
107
+
108
+ // Sync runtime
109
+ const runtime = await syncWorkflowRuntime(targetDir, {
110
+ state: healedState,
111
+ eventPayload,
112
+ activationAgent: stage,
113
+ completedStage: null
114
+ });
115
+
116
+ // Update handoff
117
+ const handoffData = buildWorkflowHandoff(healedState, null, stage);
118
+ await writeHandoff(targetDir, handoffData);
119
+
120
+ logger.log(t('workflow_heal.title', { stage: `@${stage}`, count: newCount }));
121
+ logger.log(activation.prompt);
122
+
123
+ return {
124
+ ok: true,
125
+ targetDir,
126
+ stage,
127
+ retryCount: newCount,
128
+ maxRetries: 3,
129
+ runtime,
130
+ agent: activation.agent,
131
+ instructionPath: activation.instructionPath,
132
+ prompt: activation.prompt
133
+ };
134
+ }
135
+
136
+ module.exports = { runWorkflowHeal };