aios-core 4.2.14 → 4.3.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 (288) hide show
  1. package/.aios-core/cli/commands/validate/index.js +1 -1
  2. package/.aios-core/core/code-intel/helpers/creation-helper.js +183 -0
  3. package/.aios-core/core/code-intel/helpers/devops-helper.js +166 -0
  4. package/.aios-core/core/code-intel/helpers/planning-helper.js +248 -0
  5. package/.aios-core/core/code-intel/helpers/qa-helper.js +187 -0
  6. package/.aios-core/core/code-intel/helpers/story-helper.js +146 -0
  7. package/.aios-core/core/config/schemas/framework-config.schema.json +155 -7
  8. package/.aios-core/core/config/schemas/project-config.schema.json +329 -15
  9. package/.aios-core/core/config/template-overrides.js +84 -0
  10. package/.aios-core/core/docs/troubleshooting-guide.md +1 -1
  11. package/.aios-core/core/doctor/checks/agent-memory.js +63 -0
  12. package/.aios-core/core/doctor/checks/claude-md.js +56 -0
  13. package/.aios-core/core/doctor/checks/code-intel.js +57 -0
  14. package/.aios-core/core/doctor/checks/commands-count.js +81 -0
  15. package/.aios-core/core/doctor/checks/core-config.js +53 -0
  16. package/.aios-core/core/doctor/checks/entity-registry.js +53 -0
  17. package/.aios-core/core/doctor/checks/git-hooks.js +50 -0
  18. package/.aios-core/core/doctor/checks/graph-dashboard.js +48 -0
  19. package/.aios-core/core/doctor/checks/hooks-claude-count.js +107 -0
  20. package/.aios-core/core/doctor/checks/ide-sync.js +68 -0
  21. package/.aios-core/core/doctor/checks/index.js +46 -0
  22. package/.aios-core/core/doctor/checks/node-version.js +33 -0
  23. package/.aios-core/core/doctor/checks/npm-packages.js +35 -0
  24. package/.aios-core/core/doctor/checks/rules-files.js +61 -0
  25. package/.aios-core/core/doctor/checks/settings-json.js +121 -0
  26. package/.aios-core/core/doctor/checks/skills-count.js +72 -0
  27. package/.aios-core/core/doctor/fix-handler.js +165 -0
  28. package/.aios-core/core/doctor/formatters/json.js +14 -0
  29. package/.aios-core/core/doctor/formatters/text.js +59 -0
  30. package/.aios-core/core/doctor/index.js +94 -0
  31. package/.aios-core/core/graph-dashboard/cli.js +361 -0
  32. package/.aios-core/core/graph-dashboard/data-sources/code-intel-source.js +234 -0
  33. package/.aios-core/core/graph-dashboard/data-sources/metrics-source.js +95 -0
  34. package/.aios-core/core/graph-dashboard/data-sources/registry-source.js +106 -0
  35. package/.aios-core/core/graph-dashboard/formatters/dot-formatter.js +45 -0
  36. package/.aios-core/core/graph-dashboard/formatters/html-formatter.js +1437 -0
  37. package/.aios-core/core/graph-dashboard/formatters/json-formatter.js +13 -0
  38. package/.aios-core/core/graph-dashboard/formatters/mermaid-formatter.js +59 -0
  39. package/.aios-core/core/graph-dashboard/index.js +21 -0
  40. package/.aios-core/core/graph-dashboard/renderers/stats-renderer.js +217 -0
  41. package/.aios-core/core/graph-dashboard/renderers/status-renderer.js +125 -0
  42. package/.aios-core/core/graph-dashboard/renderers/tree-renderer.js +119 -0
  43. package/.aios-core/core/health-check/base-check.js +1 -1
  44. package/.aios-core/core/health-check/check-registry.js +1 -1
  45. package/.aios-core/core/health-check/checks/deployment/build-config.js +1 -1
  46. package/.aios-core/core/health-check/checks/deployment/ci-config.js +1 -1
  47. package/.aios-core/core/health-check/checks/deployment/deployment-readiness.js +1 -1
  48. package/.aios-core/core/health-check/checks/deployment/docker-config.js +1 -1
  49. package/.aios-core/core/health-check/checks/deployment/env-file.js +1 -1
  50. package/.aios-core/core/health-check/checks/deployment/index.js +1 -1
  51. package/.aios-core/core/health-check/checks/index.js +1 -1
  52. package/.aios-core/core/health-check/checks/local/disk-space.js +1 -1
  53. package/.aios-core/core/health-check/checks/local/environment-vars.js +1 -1
  54. package/.aios-core/core/health-check/checks/local/git-install.js +1 -1
  55. package/.aios-core/core/health-check/checks/local/ide-detection.js +1 -1
  56. package/.aios-core/core/health-check/checks/local/index.js +1 -1
  57. package/.aios-core/core/health-check/checks/local/memory.js +1 -1
  58. package/.aios-core/core/health-check/checks/local/network.js +1 -1
  59. package/.aios-core/core/health-check/checks/local/npm-install.js +1 -1
  60. package/.aios-core/core/health-check/checks/local/shell-environment.js +1 -1
  61. package/.aios-core/core/health-check/checks/project/agent-config.js +1 -1
  62. package/.aios-core/core/health-check/checks/project/aios-directory.js +1 -1
  63. package/.aios-core/core/health-check/checks/project/dependencies.js +1 -1
  64. package/.aios-core/core/health-check/checks/project/framework-config.js +1 -1
  65. package/.aios-core/core/health-check/checks/project/index.js +1 -1
  66. package/.aios-core/core/health-check/checks/project/node-version.js +1 -1
  67. package/.aios-core/core/health-check/checks/project/package-json.js +1 -1
  68. package/.aios-core/core/health-check/checks/project/task-definitions.js +1 -1
  69. package/.aios-core/core/health-check/checks/project/workflow-dependencies.js +1 -1
  70. package/.aios-core/core/health-check/checks/repository/branch-protection.js +1 -1
  71. package/.aios-core/core/health-check/checks/repository/commit-history.js +1 -1
  72. package/.aios-core/core/health-check/checks/repository/conflicts.js +1 -1
  73. package/.aios-core/core/health-check/checks/repository/git-repo.js +1 -1
  74. package/.aios-core/core/health-check/checks/repository/git-status.js +1 -1
  75. package/.aios-core/core/health-check/checks/repository/gitignore.js +1 -1
  76. package/.aios-core/core/health-check/checks/repository/index.js +1 -1
  77. package/.aios-core/core/health-check/checks/repository/large-files.js +1 -1
  78. package/.aios-core/core/health-check/checks/repository/lockfile-integrity.js +1 -1
  79. package/.aios-core/core/health-check/checks/services/api-endpoints.js +1 -1
  80. package/.aios-core/core/health-check/checks/services/claude-code.js +1 -1
  81. package/.aios-core/core/health-check/checks/services/gemini-cli.js +1 -1
  82. package/.aios-core/core/health-check/checks/services/github-cli.js +1 -1
  83. package/.aios-core/core/health-check/checks/services/index.js +1 -1
  84. package/.aios-core/core/health-check/checks/services/mcp-integration.js +1 -1
  85. package/.aios-core/core/health-check/engine.js +1 -1
  86. package/.aios-core/core/health-check/healers/backup-manager.js +1 -1
  87. package/.aios-core/core/health-check/healers/index.js +1 -1
  88. package/.aios-core/core/health-check/index.js +9 -2
  89. package/.aios-core/core/health-check/reporters/console.js +1 -1
  90. package/.aios-core/core/health-check/reporters/index.js +1 -1
  91. package/.aios-core/core/health-check/reporters/json.js +1 -1
  92. package/.aios-core/core/health-check/reporters/markdown.js +1 -1
  93. package/.aios-core/core/ids/layer-classifier.js +65 -0
  94. package/.aios-core/core/ids/registry-updater.js +49 -0
  95. package/.aios-core/core/index.esm.js +1 -1
  96. package/.aios-core/core/index.js +1 -1
  97. package/.aios-core/core/session/context-detector.js +2 -7
  98. package/.aios-core/core/synapse/context/context-tracker.js +9 -1
  99. package/.aios-core/core/synapse/engine.js +33 -13
  100. package/.aios-core/core/synapse/runtime/hook-runtime.js +40 -2
  101. package/.aios-core/core/synapse/session/session-manager.js +3 -2
  102. package/.aios-core/core/synapse/utils/atomic-write.js +79 -0
  103. package/.aios-core/core-config.yaml +34 -1
  104. package/.aios-core/data/aios-kb.md +2 -2
  105. package/.aios-core/data/capability-detection.js +290 -0
  106. package/.aios-core/data/entity-registry.yaml +10424 -2127
  107. package/.aios-core/data/mcp-discipline.js +166 -0
  108. package/.aios-core/data/mcp-tool-examples.yaml +215 -0
  109. package/.aios-core/data/tok2-validation.js +168 -0
  110. package/.aios-core/data/tok3-token-comparison.js +123 -0
  111. package/.aios-core/data/tool-registry.yaml +648 -0
  112. package/.aios-core/data/tool-search-validation.js +174 -0
  113. package/.aios-core/development/agents/analyst/MEMORY.md +33 -0
  114. package/.aios-core/development/agents/architect/MEMORY.md +39 -0
  115. package/.aios-core/development/agents/data-engineer/MEMORY.md +32 -0
  116. package/.aios-core/development/agents/dev/MEMORY.md +46 -0
  117. package/.aios-core/development/agents/dev.md +1 -1
  118. package/.aios-core/development/agents/devops/MEMORY.md +39 -0
  119. package/.aios-core/development/agents/devops.md +22 -0
  120. package/.aios-core/development/agents/pm/MEMORY.md +38 -0
  121. package/.aios-core/development/agents/po/MEMORY.md +45 -0
  122. package/.aios-core/development/agents/qa/MEMORY.md +42 -0
  123. package/.aios-core/development/agents/qa.md +1 -1
  124. package/.aios-core/development/agents/sm/MEMORY.md +31 -0
  125. package/.aios-core/development/agents/ux/MEMORY.md +31 -0
  126. package/.aios-core/development/checklists/issue-triage-checklist.md +35 -0
  127. package/.aios-core/development/checklists/memory-audit-checklist.md +53 -0
  128. package/.aios-core/development/scripts/issue-triage.js +171 -0
  129. package/.aios-core/development/scripts/populate-entity-registry.js +412 -19
  130. package/.aios-core/development/scripts/unified-activation-pipeline.js +31 -10
  131. package/.aios-core/development/tasks/analyze-project-structure.md +48 -0
  132. package/.aios-core/development/tasks/brownfield-create-epic.md +41 -0
  133. package/.aios-core/development/tasks/create-doc.md +44 -0
  134. package/.aios-core/development/tasks/create-next-story.md +10 -0
  135. package/.aios-core/development/tasks/dev-develop-story.md +1 -1
  136. package/.aios-core/development/tasks/github-devops-github-pr-automation.md +49 -0
  137. package/.aios-core/development/tasks/github-devops-pre-push-quality-gate.md +63 -0
  138. package/.aios-core/development/tasks/github-issue-triage.md +118 -0
  139. package/.aios-core/development/tasks/health-check.yaml +206 -171
  140. package/.aios-core/development/tasks/kb-mode-interaction.md +3 -3
  141. package/.aios-core/development/tasks/plan-create-context.md +47 -1
  142. package/.aios-core/development/tasks/plan-create-implementation.md +55 -0
  143. package/.aios-core/development/tasks/pr-automation.md +5 -5
  144. package/.aios-core/development/tasks/qa-gate.md +48 -0
  145. package/.aios-core/development/tasks/qa-review-story.md +24 -1
  146. package/.aios-core/development/tasks/resolve-github-issue.md +608 -0
  147. package/.aios-core/development/tasks/review-contributor-pr.md +152 -0
  148. package/.aios-core/development/tasks/setup-llm-routing.md +1 -1
  149. package/.aios-core/development/tasks/spec-research-dependencies.md +4 -0
  150. package/.aios-core/development/tasks/triage-github-issues.md +356 -0
  151. package/.aios-core/development/tasks/validate-agents.md +4 -0
  152. package/.aios-core/development/tasks/validate-next-story.md +10 -0
  153. package/.aios-core/development/templates/agent-handoff-tmpl.yaml +48 -0
  154. package/.aios-core/development/templates/code-intel-integration-pattern.md +199 -0
  155. package/.aios-core/development/templates/ptc-entity-validation.md +113 -0
  156. package/.aios-core/development/templates/ptc-qa-gate.md +100 -0
  157. package/.aios-core/development/templates/ptc-research-aggregation.md +94 -0
  158. package/.aios-core/development/templates/service-template/README.md.hbs +158 -158
  159. package/.aios-core/development/templates/service-template/__tests__/index.test.ts.hbs +237 -237
  160. package/.aios-core/development/templates/service-template/client.ts.hbs +403 -403
  161. package/.aios-core/development/templates/service-template/errors.ts.hbs +182 -182
  162. package/.aios-core/development/templates/service-template/index.ts.hbs +120 -120
  163. package/.aios-core/development/templates/service-template/package.json.hbs +87 -87
  164. package/.aios-core/development/templates/service-template/types.ts.hbs +145 -145
  165. package/.aios-core/development/templates/squad/agent-template.md +11 -0
  166. package/.aios-core/development/templates/squad/task-template.md +21 -0
  167. package/.aios-core/development/templates/squad-template/LICENSE +21 -21
  168. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md +1 -1
  169. package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.2-SUMMARY.md +1 -1
  170. package/.aios-core/framework-config.yaml +8 -0
  171. package/.aios-core/index.esm.js +1 -1
  172. package/.aios-core/index.js +1 -1
  173. package/.aios-core/infrastructure/integrations/ai-providers/index.js +1 -1
  174. package/.aios-core/infrastructure/schemas/task-v3-schema.json +6 -0
  175. package/.aios-core/infrastructure/scripts/collect-tool-usage.js +311 -0
  176. package/.aios-core/infrastructure/scripts/generate-optimization-report.js +497 -0
  177. package/.aios-core/infrastructure/scripts/generate-settings-json.js +300 -0
  178. package/.aios-core/infrastructure/scripts/git-config-detector.js +65 -9
  179. package/.aios-core/infrastructure/scripts/ide-sync/index.js +3 -1
  180. package/.aios-core/infrastructure/scripts/ide-sync/transformers/github-copilot.js +184 -0
  181. package/.aios-core/infrastructure/scripts/repository-detector.js +3 -3
  182. package/.aios-core/infrastructure/templates/aios-sync.yaml.template +182 -182
  183. package/.aios-core/infrastructure/templates/coderabbit.yaml.template +279 -279
  184. package/.aios-core/infrastructure/templates/github-workflows/ci.yml.template +169 -169
  185. package/.aios-core/infrastructure/templates/github-workflows/pr-automation.yml.template +330 -330
  186. package/.aios-core/infrastructure/templates/github-workflows/release.yml.template +196 -196
  187. package/.aios-core/infrastructure/templates/gitignore/gitignore-aios-base.tmpl +63 -63
  188. package/.aios-core/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +18 -18
  189. package/.aios-core/infrastructure/templates/gitignore/gitignore-node.tmpl +85 -85
  190. package/.aios-core/infrastructure/templates/gitignore/gitignore-python.tmpl +145 -145
  191. package/.aios-core/install-manifest.yaml +541 -249
  192. package/.aios-core/lib/build.json +1 -0
  193. package/.aios-core/local-config.yaml.template +71 -71
  194. package/.aios-core/monitor/hooks/lib/__init__.py +1 -1
  195. package/.aios-core/monitor/hooks/lib/enrich.py +58 -58
  196. package/.aios-core/monitor/hooks/lib/send_event.py +47 -47
  197. package/.aios-core/monitor/hooks/notification.py +29 -29
  198. package/.aios-core/monitor/hooks/post_tool_use.py +45 -45
  199. package/.aios-core/monitor/hooks/pre_compact.py +29 -29
  200. package/.aios-core/monitor/hooks/pre_tool_use.py +40 -40
  201. package/.aios-core/monitor/hooks/stop.py +29 -29
  202. package/.aios-core/monitor/hooks/subagent_stop.py +29 -29
  203. package/.aios-core/monitor/hooks/user_prompt_submit.py +38 -38
  204. package/.aios-core/product/templates/adr.hbs +125 -125
  205. package/.aios-core/product/templates/dbdr.hbs +241 -241
  206. package/.aios-core/product/templates/epic.hbs +212 -212
  207. package/.aios-core/product/templates/ide-rules/claude-rules.md +77 -0
  208. package/.aios-core/product/templates/pmdr.hbs +186 -186
  209. package/.aios-core/product/templates/prd-v2.0.hbs +216 -216
  210. package/.aios-core/product/templates/prd.hbs +201 -201
  211. package/.aios-core/product/templates/story.hbs +263 -263
  212. package/.aios-core/product/templates/task.hbs +170 -170
  213. package/.aios-core/product/templates/tmpl-comment-on-examples.sql +158 -158
  214. package/.aios-core/product/templates/tmpl-migration-script.sql +91 -91
  215. package/.aios-core/product/templates/tmpl-rls-granular-policies.sql +104 -104
  216. package/.aios-core/product/templates/tmpl-rls-kiss-policy.sql +10 -10
  217. package/.aios-core/product/templates/tmpl-rls-roles.sql +135 -135
  218. package/.aios-core/product/templates/tmpl-rls-simple.sql +77 -77
  219. package/.aios-core/product/templates/tmpl-rls-tenant.sql +152 -152
  220. package/.aios-core/product/templates/tmpl-rollback-script.sql +77 -77
  221. package/.aios-core/product/templates/tmpl-seed-data.sql +140 -140
  222. package/.aios-core/product/templates/tmpl-smoke-test.sql +16 -16
  223. package/.aios-core/product/templates/tmpl-staging-copy-merge.sql +139 -139
  224. package/.aios-core/product/templates/tmpl-stored-proc.sql +140 -140
  225. package/.aios-core/product/templates/tmpl-trigger.sql +152 -152
  226. package/.aios-core/product/templates/tmpl-view-materialized.sql +133 -133
  227. package/.aios-core/product/templates/tmpl-view.sql +177 -177
  228. package/.aios-core/scripts/pm.sh +0 -0
  229. package/.aios-core/user-guide.md +15 -15
  230. package/.aios-core/utils/filters/constants.js +10 -0
  231. package/.aios-core/utils/filters/content-filter.js +223 -0
  232. package/.aios-core/utils/filters/field-filter.js +126 -0
  233. package/.aios-core/utils/filters/index.js +180 -0
  234. package/.aios-core/utils/filters/schema-filter.js +157 -0
  235. package/.claude/CLAUDE.md +62 -0
  236. package/.claude/hooks/enforce-architecture-first.py +196 -196
  237. package/.claude/hooks/enforce-git-push-authority.sh +33 -0
  238. package/.claude/hooks/mind-clone-governance.py +192 -192
  239. package/.claude/hooks/read-protection.py +151 -151
  240. package/.claude/hooks/slug-validation.py +176 -176
  241. package/.claude/hooks/sql-governance.py +182 -182
  242. package/.claude/hooks/synapse-engine.cjs +28 -5
  243. package/.claude/hooks/write-path-validation.py +194 -194
  244. package/.claude/rules/agent-authority.md +105 -0
  245. package/.claude/rules/agent-handoff.md +97 -0
  246. package/.claude/rules/agent-memory-imports.md +15 -0
  247. package/.claude/rules/coderabbit-integration.md +101 -0
  248. package/.claude/rules/ids-principles.md +119 -0
  249. package/.claude/rules/story-lifecycle.md +145 -0
  250. package/.claude/rules/tool-examples.md +64 -0
  251. package/.claude/rules/tool-response-filtering.md +57 -0
  252. package/.claude/rules/workflow-execution.md +150 -0
  253. package/LICENSE +33 -33
  254. package/bin/aios-graph.js +9 -0
  255. package/bin/aios-init.js +2 -2
  256. package/bin/aios-minimal.js +0 -0
  257. package/bin/aios.js +17 -221
  258. package/bin/utils/detect-fsmonitor.js +70 -0
  259. package/bin/utils/framework-guard.js +238 -0
  260. package/bin/utils/validate-publish.js +108 -0
  261. package/package.json +6 -3
  262. package/packages/aios-install/bin/aios-install.js +0 -0
  263. package/packages/aios-install/bin/edmcp.js +0 -0
  264. package/packages/aios-pro-cli/bin/aios-pro.js +2 -0
  265. package/packages/installer/src/installer/brownfield-upgrader.js +68 -5
  266. package/packages/installer/src/merger/index.js +3 -0
  267. package/packages/installer/src/merger/strategies/index.js +6 -0
  268. package/packages/installer/src/merger/strategies/yaml-merger.js +181 -0
  269. package/packages/installer/src/updater/index.js +4 -4
  270. package/packages/installer/src/wizard/i18n.js +321 -3
  271. package/packages/installer/src/wizard/ide-config-generator.js +152 -25
  272. package/packages/installer/src/wizard/index.js +119 -1
  273. package/packages/installer/src/wizard/pro-setup.js +137 -121
  274. package/packages/installer/tests/unit/artifact-copy-pipeline/artifact-copy-pipeline.test.js +261 -0
  275. package/packages/installer/tests/unit/claude-md-template-v5/claude-md-template-v5.test.js +192 -0
  276. package/packages/installer/tests/unit/doctor/doctor-checks.test.js +551 -0
  277. package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +134 -0
  278. package/packages/installer/tests/unit/entity-registry-bootstrap.test.js +186 -0
  279. package/packages/installer/tests/unit/generate-settings-json/generate-settings-json.test.js +309 -0
  280. package/packages/installer/tests/unit/ide-sync-integration/ide-sync-integration.test.js +230 -0
  281. package/packages/installer/tests/unit/merger/strategies.test.js +2 -2
  282. package/packages/installer/tests/unit/merger/yaml-merger.test.js +327 -0
  283. package/scripts/check-markdown-links.py +352 -352
  284. package/scripts/dashboard-parallel-dev.sh +0 -0
  285. package/scripts/dashboard-parallel-phase3.sh +0 -0
  286. package/scripts/dashboard-parallel-phase4.sh +0 -0
  287. package/scripts/install-monitor-hooks.sh +0 -0
  288. package/scripts/package-synapse.js +2 -1
@@ -0,0 +1,187 @@
1
+ 'use strict';
2
+
3
+ const { getEnricher, getClient, isCodeIntelAvailable } = require('../index');
4
+
5
+ // Risk level thresholds based on blast radius (reference count)
6
+ // Consistent with dev-helper.js
7
+ const RISK_THRESHOLDS = {
8
+ LOW_MAX: 4, // 0-4 refs = LOW
9
+ MEDIUM_MAX: 15, // 5-15 refs = MEDIUM
10
+ // >15 refs = HIGH
11
+ };
12
+
13
+ // Coverage status thresholds based on test reference count
14
+ const COVERAGE_THRESHOLDS = {
15
+ INDIRECT_MAX: 2, // 1-2 test refs = INDIRECT
16
+ MINIMAL_MAX: 5, // 3-5 test refs = MINIMAL
17
+ // >5 test refs = GOOD
18
+ };
19
+
20
+ /**
21
+ * QaHelper — Code intelligence helper for @qa agent tasks.
22
+ *
23
+ * All functions return null gracefully when no provider is available.
24
+ * Never throws — safe to call unconditionally in task workflows.
25
+ */
26
+
27
+ /**
28
+ * Get blast radius and risk level for a set of files.
29
+ * Used by qa-gate to assess impact of changes in gate decisions.
30
+ *
31
+ * @param {string[]} files - Files to assess blast radius for
32
+ * @returns {Promise<{blastRadius: number, riskLevel: string, references: Array}|null>}
33
+ */
34
+ async function getBlastRadius(files) {
35
+ if (!files || files.length === 0) return null;
36
+ if (!isCodeIntelAvailable()) return null;
37
+
38
+ try {
39
+ const enricher = getEnricher();
40
+ const impact = await enricher.assessImpact(files);
41
+
42
+ if (!impact) return null;
43
+
44
+ return {
45
+ blastRadius: impact.blastRadius,
46
+ riskLevel: _calculateRiskLevel(impact.blastRadius),
47
+ references: impact.references || [],
48
+ };
49
+ } catch {
50
+ return null;
51
+ }
52
+ }
53
+
54
+ /**
55
+ * Get test coverage status for a list of symbols.
56
+ * Used by qa-gate to assess test coverage per modified function.
57
+ *
58
+ * @param {string[]} symbols - Symbol names to check test coverage for
59
+ * @returns {Promise<Array<{symbol: string, status: string, testCount: number, tests: Array}>|null>}
60
+ */
61
+ async function getTestCoverage(symbols) {
62
+ if (!symbols || symbols.length === 0) return null;
63
+ if (!isCodeIntelAvailable()) return null;
64
+
65
+ try {
66
+ const enricher = getEnricher();
67
+ const results = await Promise.all(
68
+ symbols.map(async (symbol) => {
69
+ try {
70
+ const tests = await enricher.findTests(symbol);
71
+ const testCount = tests ? tests.length : 0;
72
+ return {
73
+ symbol,
74
+ status: _calculateCoverageStatus(testCount),
75
+ testCount,
76
+ tests: tests || [],
77
+ };
78
+ } catch {
79
+ return {
80
+ symbol,
81
+ status: 'NO_TESTS',
82
+ testCount: 0,
83
+ tests: [],
84
+ };
85
+ }
86
+ }),
87
+ );
88
+
89
+ return results;
90
+ } catch {
91
+ return null;
92
+ }
93
+ }
94
+
95
+ /**
96
+ * Get reference impact for a set of files — which consumers are affected.
97
+ * Used by qa-review-story to show consumers affected by each change.
98
+ *
99
+ * @param {string[]} files - Files to check reference impact for
100
+ * @returns {Promise<Array<{file: string, consumers: Array}>|null>}
101
+ */
102
+ async function getReferenceImpact(files) {
103
+ if (!files || files.length === 0) return null;
104
+ if (!isCodeIntelAvailable()) return null;
105
+
106
+ try {
107
+ const client = getClient();
108
+ const results = await Promise.all(
109
+ files.map(async (file) => {
110
+ try {
111
+ const refs = await client.findReferences(file);
112
+ return {
113
+ file,
114
+ consumers: refs || [],
115
+ };
116
+ } catch {
117
+ return {
118
+ file,
119
+ consumers: [],
120
+ };
121
+ }
122
+ }),
123
+ );
124
+
125
+ return results;
126
+ } catch {
127
+ return null;
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Suggest gate influence based on blast radius risk level.
133
+ * Returns advisory message when HIGH risk detected — never changes verdict automatically.
134
+ *
135
+ * @param {string} riskLevel - Risk level from getBlastRadius ('LOW'|'MEDIUM'|'HIGH')
136
+ * @returns {{advisory: string, suggestedGate: string}|null}
137
+ */
138
+ function suggestGateInfluence(riskLevel) {
139
+ if (!riskLevel) return null;
140
+
141
+ if (riskLevel === 'HIGH') {
142
+ return {
143
+ advisory: 'HIGH blast radius detected. Consider CONCERNS gate with additional review recommended.',
144
+ suggestedGate: 'CONCERNS',
145
+ };
146
+ }
147
+
148
+ return null;
149
+ }
150
+
151
+ /**
152
+ * Calculate risk level from blast radius count.
153
+ * Consistent with dev-helper.js thresholds.
154
+ * @param {number} blastRadius - Number of references affected
155
+ * @returns {string} 'LOW' | 'MEDIUM' | 'HIGH'
156
+ * @private
157
+ */
158
+ function _calculateRiskLevel(blastRadius) {
159
+ if (blastRadius <= RISK_THRESHOLDS.LOW_MAX) return 'LOW';
160
+ if (blastRadius <= RISK_THRESHOLDS.MEDIUM_MAX) return 'MEDIUM';
161
+ return 'HIGH';
162
+ }
163
+
164
+ /**
165
+ * Calculate coverage status from test reference count.
166
+ * @param {number} testCount - Number of test references found
167
+ * @returns {string} 'NO_TESTS' | 'INDIRECT' | 'MINIMAL' | 'GOOD'
168
+ * @private
169
+ */
170
+ function _calculateCoverageStatus(testCount) {
171
+ if (testCount === 0) return 'NO_TESTS';
172
+ if (testCount <= COVERAGE_THRESHOLDS.INDIRECT_MAX) return 'INDIRECT';
173
+ if (testCount <= COVERAGE_THRESHOLDS.MINIMAL_MAX) return 'MINIMAL';
174
+ return 'GOOD';
175
+ }
176
+
177
+ module.exports = {
178
+ getBlastRadius,
179
+ getTestCoverage,
180
+ getReferenceImpact,
181
+ suggestGateInfluence,
182
+ // Exposed for testing
183
+ _calculateRiskLevel,
184
+ _calculateCoverageStatus,
185
+ RISK_THRESHOLDS,
186
+ COVERAGE_THRESHOLDS,
187
+ };
@@ -0,0 +1,146 @@
1
+ 'use strict';
2
+
3
+ const { getEnricher, getClient, isCodeIntelAvailable } = require('../index');
4
+
5
+ /**
6
+ * StoryHelper — Code intelligence helper for @sm/@po agent tasks.
7
+ *
8
+ * All functions return null gracefully when no provider is available.
9
+ * Never throws — safe to call unconditionally in task workflows.
10
+ *
11
+ * Functions:
12
+ * - detectDuplicateStory(description) — for @sm story creation (advisory warning)
13
+ * - suggestRelevantFiles(description) — for @sm story creation (file suggestions)
14
+ * - validateNoDuplicates(description) — for @po story validation (checklist boolean)
15
+ */
16
+
17
+ /**
18
+ * Detect duplicate stories/functionality in the codebase.
19
+ * Used by @sm during story creation — returns advisory warning only, never blocks.
20
+ *
21
+ * @param {string} description - Story description to check for duplicates
22
+ * @returns {Promise<{matches: Array, warning: string}|null>} Duplicate info or null
23
+ */
24
+ async function detectDuplicateStory(description) {
25
+ if (!description) return null;
26
+ if (!isCodeIntelAvailable()) return null;
27
+
28
+ try {
29
+ const enricher = getEnricher();
30
+ const result = await enricher.detectDuplicates(description, { path: '.' });
31
+
32
+ if (!result || !result.matches || result.matches.length === 0) return null;
33
+
34
+ return {
35
+ matches: result.matches,
36
+ warning: _formatDuplicateWarning(result.matches),
37
+ };
38
+ } catch {
39
+ return null;
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Suggest relevant files for a new story based on description.
45
+ * Composes findReferences + analyzeCodebase for comprehensive file suggestions.
46
+ * Used by @sm during story creation to pre-populate "Suggested Files" section.
47
+ *
48
+ * @param {string} description - Story description to find relevant files for
49
+ * @returns {Promise<{files: Array, codebaseContext: Object|null}|null>} File suggestions or null
50
+ */
51
+ async function suggestRelevantFiles(description) {
52
+ if (!description) return null;
53
+ if (!isCodeIntelAvailable()) return null;
54
+
55
+ try {
56
+ const client = getClient();
57
+
58
+ // Per-capability try/catch — partial results accepted
59
+ let files = null;
60
+ let codebaseContext = null;
61
+
62
+ try {
63
+ const refs = await client.findReferences(description);
64
+ if (refs) {
65
+ files = refs;
66
+ }
67
+ } catch { /* skip — partial result ok */ }
68
+
69
+ try {
70
+ const analysis = await client.analyzeCodebase('.');
71
+ if (analysis) {
72
+ codebaseContext = analysis;
73
+ }
74
+ } catch { /* skip — partial result ok */ }
75
+
76
+ // Return null only if we got nothing at all
77
+ if (!files && !codebaseContext) return null;
78
+
79
+ return {
80
+ files: files || [],
81
+ codebaseContext,
82
+ };
83
+ } catch {
84
+ return null;
85
+ }
86
+ }
87
+
88
+ /**
89
+ * Validate that a story description does not duplicate existing functionality.
90
+ * Used by @po during story validation — returns boolean for checklist item.
91
+ *
92
+ * @param {string} description - Story description to validate
93
+ * @returns {Promise<{hasDuplicates: boolean, matches: Array, suggestion: string|null}|null>} Validation result or null
94
+ */
95
+ async function validateNoDuplicates(description) {
96
+ if (!description) return null;
97
+ if (!isCodeIntelAvailable()) return null;
98
+
99
+ try {
100
+ const enricher = getEnricher();
101
+ const result = await enricher.detectDuplicates(description, { path: '.' });
102
+
103
+ if (!result) {
104
+ return {
105
+ hasDuplicates: false,
106
+ matches: [],
107
+ suggestion: null,
108
+ };
109
+ }
110
+
111
+ const hasDuplicates = result.matches && result.matches.length > 0;
112
+
113
+ return {
114
+ hasDuplicates,
115
+ matches: result.matches || [],
116
+ suggestion: hasDuplicates ? 'Consider ADAPT instead of CREATE — similar functionality exists' : null,
117
+ };
118
+ } catch {
119
+ return null;
120
+ }
121
+ }
122
+
123
+ /**
124
+ * Format a human-readable warning message from duplicate matches.
125
+ * @param {Array} matches - Array of duplicate match objects
126
+ * @returns {string} Formatted warning message
127
+ * @private
128
+ */
129
+ function _formatDuplicateWarning(matches) {
130
+ if (!matches || matches.length === 0) return '';
131
+
132
+ const fileList = matches
133
+ .map((m) => m.file || m.path || 'unknown')
134
+ .slice(0, 5)
135
+ .join(', ');
136
+
137
+ return `Similar functionality already exists in: ${fileList}. Consider ADAPT instead of CREATE.`;
138
+ }
139
+
140
+ module.exports = {
141
+ detectDuplicateStory,
142
+ suggestRelevantFiles,
143
+ validateNoDuplicates,
144
+ // Exposed for testing
145
+ _formatDuplicateWarning,
146
+ };
@@ -5,14 +5,162 @@
5
5
  "description": "Read-only framework defaults shipped with the npm package",
6
6
  "type": "object",
7
7
  "properties": {
8
- "version": {
9
- "type": "string",
10
- "description": "Framework version"
8
+ "metadata": {
9
+ "type": "object",
10
+ "description": "Framework metadata — name and version",
11
+ "properties": {
12
+ "name": {
13
+ "type": "string",
14
+ "description": "Framework display name"
15
+ },
16
+ "framework_version": {
17
+ "type": "string",
18
+ "description": "Semantic version of the framework"
19
+ }
20
+ },
21
+ "required": ["name", "framework_version"],
22
+ "additionalProperties": false
11
23
  },
12
- "framework_name": {
13
- "type": "string",
14
- "description": "Framework name"
24
+ "markdownExploder": {
25
+ "type": "boolean",
26
+ "description": "Enable markdown exploder for document processing",
27
+ "default": true
28
+ },
29
+ "resource_locations": {
30
+ "type": "object",
31
+ "description": "Default paths for framework resources",
32
+ "properties": {
33
+ "agents_dir": { "type": "string", "description": "Path to agent definitions" },
34
+ "tasks_dir": { "type": "string", "description": "Path to task definitions" },
35
+ "templates_dir": { "type": "string", "description": "Path to templates" },
36
+ "checklists_dir": { "type": "string", "description": "Path to checklists" },
37
+ "tools_dir": { "type": "string", "description": "Path to tools" },
38
+ "scripts": {
39
+ "type": "object",
40
+ "description": "Script directory paths by category",
41
+ "properties": {
42
+ "core": { "type": "string" },
43
+ "development": { "type": "string" },
44
+ "infrastructure": { "type": "string" },
45
+ "legacy": { "type": "string" }
46
+ },
47
+ "additionalProperties": false
48
+ },
49
+ "data_dir": { "type": "string", "description": "Path to data directory" },
50
+ "elicitation_dir": { "type": "string", "description": "Path to elicitation templates" },
51
+ "squads_template_dir": { "type": "string", "description": "Path to squad templates" },
52
+ "minds_dir": { "type": "string", "description": "Path to minds output" }
53
+ },
54
+ "additionalProperties": false
55
+ },
56
+ "performance_defaults": {
57
+ "type": "object",
58
+ "description": "Default performance tuning options",
59
+ "properties": {
60
+ "lazy_loading": {
61
+ "type": "object",
62
+ "properties": {
63
+ "enabled": { "type": "boolean", "default": true },
64
+ "heavy_sections": {
65
+ "type": "array",
66
+ "items": { "type": "string" },
67
+ "description": "Config sections loaded lazily"
68
+ }
69
+ },
70
+ "additionalProperties": false
71
+ },
72
+ "git": {
73
+ "type": "object",
74
+ "properties": {
75
+ "show_config_warning": { "type": "boolean", "default": true },
76
+ "cache_time_seconds": { "type": "integer", "minimum": 0 }
77
+ },
78
+ "additionalProperties": false
79
+ }
80
+ },
81
+ "additionalProperties": false
82
+ },
83
+ "utility_scripts_registry": {
84
+ "type": "object",
85
+ "description": "Registry of utility scripts by category",
86
+ "properties": {
87
+ "helpers": {
88
+ "type": "array",
89
+ "items": { "type": "string" },
90
+ "description": "Agent helper utility names"
91
+ },
92
+ "executors": {
93
+ "type": "array",
94
+ "items": { "type": "string" },
95
+ "description": "Task execution utility names"
96
+ },
97
+ "framework": {
98
+ "type": "array",
99
+ "items": { "type": "string" },
100
+ "description": "Framework-level utility names"
101
+ }
102
+ },
103
+ "additionalProperties": false
104
+ },
105
+ "ide_sync_system": {
106
+ "type": "object",
107
+ "description": "IDE synchronization system for agent definitions",
108
+ "properties": {
109
+ "enabled": { "type": "boolean", "default": true },
110
+ "source": { "type": "string", "description": "Source directory for agent definitions" },
111
+ "targets": {
112
+ "type": "object",
113
+ "description": "IDE target configurations",
114
+ "additionalProperties": {
115
+ "type": "object",
116
+ "properties": {
117
+ "enabled": { "type": "boolean" },
118
+ "path": { "type": "string" },
119
+ "format": { "type": "string", "enum": ["full-markdown-yaml", "condensed-rules", "cursor-style"] }
120
+ },
121
+ "additionalProperties": false
122
+ }
123
+ },
124
+ "redirects": { "type": "object", "additionalProperties": true },
125
+ "validation": {
126
+ "type": "object",
127
+ "properties": {
128
+ "strict_mode": { "type": "boolean" },
129
+ "fail_on_drift": { "type": "boolean" },
130
+ "fail_on_orphaned": { "type": "boolean" }
131
+ },
132
+ "additionalProperties": false
133
+ }
134
+ },
135
+ "additionalProperties": false
136
+ },
137
+ "template_overrides": {
138
+ "type": "object",
139
+ "description": "Template customization defaults (override at L2)",
140
+ "properties": {
141
+ "story": {
142
+ "type": "object",
143
+ "properties": {
144
+ "sections_order": {
145
+ "oneOf": [
146
+ { "type": "array", "items": { "type": "string" } },
147
+ { "type": "null" }
148
+ ],
149
+ "description": "Custom section order for story templates. null = use template default.",
150
+ "default": null
151
+ },
152
+ "optional_sections": {
153
+ "type": "array",
154
+ "items": { "type": "string" },
155
+ "description": "Section IDs that can be skipped in story templates",
156
+ "default": []
157
+ }
158
+ },
159
+ "additionalProperties": false
160
+ }
161
+ },
162
+ "additionalProperties": false
15
163
  }
16
164
  },
17
- "additionalProperties": true
165
+ "additionalProperties": false
18
166
  }