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,261 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const os = require('os');
6
+
7
+ const {
8
+ copySkillFiles,
9
+ copyExtraCommandFiles,
10
+ createClaudeSettingsLocal,
11
+ } = require('../../../../../packages/installer/src/wizard/ide-config-generator');
12
+
13
+ function createTempDir() {
14
+ return fs.mkdtempSync(path.join(os.tmpdir(), 'artifact-copy-'));
15
+ }
16
+
17
+ function cleanup(dir) {
18
+ fs.rmSync(dir, { recursive: true, force: true });
19
+ }
20
+
21
+ describe('artifact-copy-pipeline (Story INS-4.3)', () => {
22
+ describe('copySkillFiles', () => {
23
+ test('copies skill directories from source to target via real function', async () => {
24
+ const sourceRoot = createTempDir();
25
+ const targetRoot = createTempDir();
26
+
27
+ try {
28
+ // Create source skills
29
+ const skillsDir = path.join(sourceRoot, '.claude', 'skills');
30
+ for (const skill of ['skill-a', 'skill-b', 'skill-c']) {
31
+ const dir = path.join(skillsDir, skill);
32
+ fs.mkdirSync(dir, { recursive: true });
33
+ fs.writeFileSync(path.join(dir, 'SKILL.md'), `# ${skill}`, 'utf8');
34
+ }
35
+
36
+ // Call the REAL exported function with _sourceRoot override
37
+ const result = await copySkillFiles(targetRoot, sourceRoot);
38
+
39
+ expect(result.count).toBe(3);
40
+ expect(result.skipped).toBe(false);
41
+
42
+ // Verify files actually copied to target
43
+ const targetSkills = path.join(targetRoot, '.claude', 'skills');
44
+ const copied = fs.readdirSync(targetSkills);
45
+ expect(copied).toContain('skill-a');
46
+ expect(copied).toContain('skill-b');
47
+ expect(copied).toContain('skill-c');
48
+ expect(copied.length).toBe(3);
49
+
50
+ // Verify SKILL.md content preserved
51
+ const skillMd = fs.readFileSync(path.join(targetSkills, 'skill-a', 'SKILL.md'), 'utf8');
52
+ expect(skillMd).toBe('# skill-a');
53
+ } finally {
54
+ cleanup(sourceRoot);
55
+ cleanup(targetRoot);
56
+ }
57
+ });
58
+
59
+ test('returns skipped when source does not exist', async () => {
60
+ const targetRoot = createTempDir();
61
+ const fakeSourceRoot = path.join(os.tmpdir(), 'nonexistent-source-' + Date.now());
62
+
63
+ try {
64
+ // Call the REAL function with a non-existent source
65
+ const result = await copySkillFiles(targetRoot, fakeSourceRoot);
66
+
67
+ expect(result.skipped).toBe(true);
68
+ expect(result.count).toBe(0);
69
+ } finally {
70
+ cleanup(targetRoot);
71
+ }
72
+ });
73
+
74
+ test('copy is idempotent — re-copy overwrites without corruption', async () => {
75
+ const sourceRoot = createTempDir();
76
+ const targetRoot = createTempDir();
77
+
78
+ try {
79
+ const skillsDir = path.join(sourceRoot, '.claude', 'skills', 'test-skill');
80
+ fs.mkdirSync(skillsDir, { recursive: true });
81
+ fs.writeFileSync(path.join(skillsDir, 'SKILL.md'), '# v1', 'utf8');
82
+
83
+ // First copy
84
+ await copySkillFiles(targetRoot, sourceRoot);
85
+
86
+ // Update source to v2
87
+ fs.writeFileSync(path.join(skillsDir, 'SKILL.md'), '# v2', 'utf8');
88
+
89
+ // Second copy (idempotent overwrite)
90
+ const result = await copySkillFiles(targetRoot, sourceRoot);
91
+
92
+ expect(result.count).toBe(1);
93
+ const content = fs.readFileSync(
94
+ path.join(targetRoot, '.claude', 'skills', 'test-skill', 'SKILL.md'),
95
+ 'utf8'
96
+ );
97
+ expect(content).toBe('# v2');
98
+ } finally {
99
+ cleanup(sourceRoot);
100
+ cleanup(targetRoot);
101
+ }
102
+ });
103
+ });
104
+
105
+ describe('copyExtraCommandFiles', () => {
106
+ test('copies .md files recursively excluding AIOS/agents/ via real function', async () => {
107
+ const sourceRoot = createTempDir();
108
+ const targetRoot = createTempDir();
109
+
110
+ try {
111
+ const cmdDir = path.join(sourceRoot, '.claude', 'commands');
112
+
113
+ // Create greet.md (root level)
114
+ fs.mkdirSync(cmdDir, { recursive: true });
115
+ fs.writeFileSync(path.join(cmdDir, 'greet.md'), '# Greet', 'utf8');
116
+
117
+ // Create synapse/manager.md
118
+ const synapseDir = path.join(cmdDir, 'synapse');
119
+ fs.mkdirSync(synapseDir, { recursive: true });
120
+ fs.writeFileSync(path.join(synapseDir, 'manager.md'), '# Manager', 'utf8');
121
+
122
+ // Create synapse/tasks/add-rule.md
123
+ const tasksDir = path.join(synapseDir, 'tasks');
124
+ fs.mkdirSync(tasksDir, { recursive: true });
125
+ fs.writeFileSync(path.join(tasksDir, 'add-rule.md'), '# Add Rule', 'utf8');
126
+
127
+ // Create AIOS/agents/dev.md (should be EXCLUDED)
128
+ const agentsDir = path.join(cmdDir, 'AIOS', 'agents');
129
+ fs.mkdirSync(agentsDir, { recursive: true });
130
+ fs.writeFileSync(path.join(agentsDir, 'dev.md'), '# Dev Agent', 'utf8');
131
+
132
+ // Create AIOS/stories/story.md (should be INCLUDED)
133
+ const storiesDir = path.join(cmdDir, 'AIOS', 'stories');
134
+ fs.mkdirSync(storiesDir, { recursive: true });
135
+ fs.writeFileSync(path.join(storiesDir, 'story.md'), '# Story', 'utf8');
136
+
137
+ // Call the REAL exported function with _sourceRoot override
138
+ const result = await copyExtraCommandFiles(targetRoot, sourceRoot);
139
+
140
+ expect(result.count).toBe(4); // greet.md, manager.md, add-rule.md, story.md
141
+ expect(result.skipped).toBe(false);
142
+
143
+ // Verify extras copied
144
+ const targetCmd = path.join(targetRoot, '.claude', 'commands');
145
+ expect(fs.existsSync(path.join(targetCmd, 'greet.md'))).toBe(true);
146
+ expect(fs.existsSync(path.join(targetCmd, 'synapse', 'manager.md'))).toBe(true);
147
+ expect(fs.existsSync(path.join(targetCmd, 'synapse', 'tasks', 'add-rule.md'))).toBe(true);
148
+ expect(fs.existsSync(path.join(targetCmd, 'AIOS', 'stories', 'story.md'))).toBe(true);
149
+
150
+ // Verify AIOS/agents/ was excluded
151
+ expect(fs.existsSync(path.join(targetCmd, 'AIOS', 'agents', 'dev.md'))).toBe(false);
152
+ } finally {
153
+ cleanup(sourceRoot);
154
+ cleanup(targetRoot);
155
+ }
156
+ });
157
+ });
158
+
159
+ describe('createClaudeSettingsLocal — hooks registration', () => {
160
+ test('registers ALL .cjs hooks in settings.local.json', async () => {
161
+ const tmpDir = createTempDir();
162
+
163
+ try {
164
+ // Create hooks directory with 2 .cjs files
165
+ const hooksDir = path.join(tmpDir, '.claude', 'hooks');
166
+ fs.mkdirSync(hooksDir, { recursive: true });
167
+ fs.writeFileSync(path.join(hooksDir, 'synapse-engine.cjs'), '// hook 1', 'utf8');
168
+ fs.writeFileSync(path.join(hooksDir, 'precompact-session-digest.cjs'), '// hook 2', 'utf8');
169
+ fs.writeFileSync(path.join(hooksDir, 'README.md'), '# Hooks', 'utf8');
170
+
171
+ const result = await createClaudeSettingsLocal(tmpDir);
172
+
173
+ expect(result).not.toBeNull();
174
+
175
+ const settingsContent = fs.readFileSync(path.join(tmpDir, '.claude', 'settings.local.json'), 'utf8');
176
+ const settings = JSON.parse(settingsContent);
177
+
178
+ // Should have hooks.UserPromptSubmit with 2 entries
179
+ expect(settings.hooks).toBeDefined();
180
+ expect(settings.hooks.UserPromptSubmit).toBeDefined();
181
+ expect(settings.hooks.UserPromptSubmit.length).toBe(2);
182
+
183
+ // Both hooks registered
184
+ const commands = settings.hooks.UserPromptSubmit.flatMap(entry =>
185
+ entry.hooks.map(h => h.command)
186
+ );
187
+ expect(commands.some(c => c.includes('synapse-engine'))).toBe(true);
188
+ expect(commands.some(c => c.includes('precompact-session-digest'))).toBe(true);
189
+ } finally {
190
+ cleanup(tmpDir);
191
+ }
192
+ });
193
+
194
+ test('returns null when no hooks directory exists', async () => {
195
+ const tmpDir = createTempDir();
196
+
197
+ try {
198
+ fs.mkdirSync(path.join(tmpDir, '.claude'), { recursive: true });
199
+ const result = await createClaudeSettingsLocal(tmpDir);
200
+ expect(result).toBeNull();
201
+ } finally {
202
+ cleanup(tmpDir);
203
+ }
204
+ });
205
+
206
+ test('does not duplicate hooks on re-run (idempotent)', async () => {
207
+ const tmpDir = createTempDir();
208
+
209
+ try {
210
+ const hooksDir = path.join(tmpDir, '.claude', 'hooks');
211
+ fs.mkdirSync(hooksDir, { recursive: true });
212
+ fs.writeFileSync(path.join(hooksDir, 'synapse-engine.cjs'), '// hook', 'utf8');
213
+
214
+ // Run twice
215
+ await createClaudeSettingsLocal(tmpDir);
216
+ await createClaudeSettingsLocal(tmpDir);
217
+
218
+ const settingsContent = fs.readFileSync(path.join(tmpDir, '.claude', 'settings.local.json'), 'utf8');
219
+ const settings = JSON.parse(settingsContent);
220
+
221
+ // Should still have only 1 entry
222
+ expect(settings.hooks.UserPromptSubmit.length).toBe(1);
223
+ } finally {
224
+ cleanup(tmpDir);
225
+ }
226
+ });
227
+
228
+ test('preserves existing settings when merging hooks', async () => {
229
+ const tmpDir = createTempDir();
230
+
231
+ try {
232
+ const hooksDir = path.join(tmpDir, '.claude', 'hooks');
233
+ fs.mkdirSync(hooksDir, { recursive: true });
234
+ fs.writeFileSync(path.join(hooksDir, 'synapse-engine.cjs'), '// hook', 'utf8');
235
+
236
+ // Create existing settings
237
+ const settingsPath = path.join(tmpDir, '.claude', 'settings.local.json');
238
+ fs.writeFileSync(settingsPath, JSON.stringify({ customKey: 'preserved' }, null, 2), 'utf8');
239
+
240
+ await createClaudeSettingsLocal(tmpDir);
241
+
242
+ const settingsContent = fs.readFileSync(settingsPath, 'utf8');
243
+ const settings = JSON.parse(settingsContent);
244
+
245
+ expect(settings.customKey).toBe('preserved');
246
+ expect(settings.hooks.UserPromptSubmit.length).toBe(1);
247
+ } finally {
248
+ cleanup(tmpDir);
249
+ }
250
+ });
251
+ });
252
+
253
+ describe('generator failure graceful degradation', () => {
254
+ test('generate-settings-json throws on missing config — install should catch', () => {
255
+ const { generate } = require('../../../../../.aios-core/infrastructure/scripts/generate-settings-json');
256
+
257
+ // Calling generate on a non-existent path should throw
258
+ expect(() => generate('/nonexistent/path')).toThrow();
259
+ });
260
+ });
261
+ });
@@ -0,0 +1,192 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const { MarkdownMerger } = require('../../../src/merger/strategies/markdown-merger.js');
6
+ const {
7
+ parseMarkdownSections,
8
+ hasAiosMarkers,
9
+ } = require('../../../src/merger/parsers/markdown-section-parser.js');
10
+
11
+ const TEMPLATE_PATH = path.join(
12
+ __dirname, '..', '..', '..', '..', '..', '.aios-core',
13
+ 'product', 'templates', 'ide-rules', 'claude-rules.md'
14
+ );
15
+
16
+ describe('CLAUDE.md Template v5 (Story INS-4.4)', () => {
17
+ let templateContent;
18
+
19
+ beforeAll(() => {
20
+ templateContent = fs.readFileSync(TEMPLATE_PATH, 'utf8');
21
+ });
22
+
23
+ describe('template has 4 new sections with AIOS-MANAGED markers', () => {
24
+ test('template file exists and has AIOS markers', () => {
25
+ expect(templateContent).toBeTruthy();
26
+ expect(hasAiosMarkers(templateContent)).toBe(true);
27
+ });
28
+
29
+ test('contains framework-boundary section', () => {
30
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-START: framework-boundary -->');
31
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-END: framework-boundary -->');
32
+ expect(templateContent).toContain('## Framework vs Project Boundary');
33
+ });
34
+
35
+ test('contains rules-system section', () => {
36
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-START: rules-system -->');
37
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-END: rules-system -->');
38
+ expect(templateContent).toContain('## Rules System');
39
+ });
40
+
41
+ test('contains code-intelligence section', () => {
42
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-START: code-intelligence -->');
43
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-END: code-intelligence -->');
44
+ expect(templateContent).toContain('## Code Intelligence');
45
+ });
46
+
47
+ test('contains graph-dashboard section', () => {
48
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-START: graph-dashboard -->');
49
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-END: graph-dashboard -->');
50
+ expect(templateContent).toContain('## Graph Dashboard');
51
+ });
52
+
53
+ test('template has exactly 9 AIOS-MANAGED sections total', () => {
54
+ const startMatches = templateContent.match(/<!-- AIOS-MANAGED-START:/g);
55
+ const endMatches = templateContent.match(/<!-- AIOS-MANAGED-END:/g);
56
+ expect(startMatches.length).toBe(9);
57
+ expect(endMatches.length).toBe(9);
58
+ });
59
+ });
60
+
61
+ describe('section content quality', () => {
62
+ test('framework-boundary has L1-L4 table', () => {
63
+ expect(templateContent).toContain('**L1** Framework Core');
64
+ expect(templateContent).toContain('**L2** Framework Templates');
65
+ expect(templateContent).toContain('**L3** Project Config');
66
+ expect(templateContent).toContain('**L4** Project Runtime');
67
+ expect(templateContent).toContain('frameworkProtection');
68
+ });
69
+
70
+ test('rules-system lists all 8 rule files', () => {
71
+ const ruleFiles = [
72
+ 'agent-authority.md',
73
+ 'agent-handoff.md',
74
+ 'agent-memory-imports.md',
75
+ 'coderabbit-integration.md',
76
+ 'ids-principles.md',
77
+ 'mcp-usage.md',
78
+ 'story-lifecycle.md',
79
+ 'workflow-execution.md',
80
+ ];
81
+ for (const file of ruleFiles) {
82
+ expect(templateContent).toContain(file);
83
+ }
84
+ });
85
+
86
+ test('code-intelligence has provider status table', () => {
87
+ expect(templateContent).toContain('**Configured**');
88
+ expect(templateContent).toContain('**Fallback**');
89
+ expect(templateContent).toContain('**Disabled**');
90
+ expect(templateContent).toContain('isCodeIntelAvailable()');
91
+ });
92
+
93
+ test('graph-dashboard has CLI commands', () => {
94
+ expect(templateContent).toContain('aios graph --deps');
95
+ expect(templateContent).toContain('--format=json');
96
+ expect(templateContent).toContain('--format=html');
97
+ expect(templateContent).toContain('--watch');
98
+ expect(templateContent).toContain('aios graph --stats');
99
+ });
100
+ });
101
+
102
+ describe('existing sections preserved', () => {
103
+ test('original 5 AIOS-MANAGED sections still present', () => {
104
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-START: core-framework -->');
105
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-START: agent-system -->');
106
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-START: framework-structure -->');
107
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-START: aios-patterns -->');
108
+ expect(templateContent).toContain('<!-- AIOS-MANAGED-START: common-commands -->');
109
+ });
110
+
111
+ test('non-managed sections still present', () => {
112
+ expect(templateContent).toContain('## Development Methodology');
113
+ expect(templateContent).toContain('## Workflow Execution');
114
+ expect(templateContent).toContain('## Best Practices');
115
+ expect(templateContent).toContain('## Debugging');
116
+ });
117
+ });
118
+
119
+ describe('upgrade: new sections added to existing CLAUDE.md', () => {
120
+ let merger;
121
+
122
+ beforeEach(() => {
123
+ merger = new MarkdownMerger();
124
+ });
125
+
126
+ test('upgrade adds 4 new sections to CLAUDE.md without them', async () => {
127
+ const existingClaudeMd = `# Synkra AIOS
128
+
129
+ <!-- AIOS-MANAGED-START: core-framework -->
130
+ ## Core Framework Understanding
131
+ Old core content
132
+ <!-- AIOS-MANAGED-END: core-framework -->
133
+
134
+ ## My Custom Section
135
+ User content that must be preserved`;
136
+
137
+ const result = await merger.merge(existingClaudeMd, templateContent);
138
+
139
+ // New sections added
140
+ expect(result.content).toContain('## Framework vs Project Boundary');
141
+ expect(result.content).toContain('## Rules System');
142
+ expect(result.content).toContain('## Code Intelligence');
143
+ expect(result.content).toContain('## Graph Dashboard');
144
+
145
+ // User content preserved
146
+ expect(result.content).toContain('## My Custom Section');
147
+ expect(result.content).toContain('User content that must be preserved');
148
+
149
+ // Stats reflect additions
150
+ expect(result.stats.added).toBeGreaterThanOrEqual(4);
151
+ });
152
+
153
+ test('upgrade preserves custom PROJECT-CUSTOMIZED content', async () => {
154
+ const existingClaudeMd = `# My Project Rules
155
+
156
+ <!-- AIOS-MANAGED-START: core-framework -->
157
+ ## Core Framework Understanding
158
+ Core content
159
+ <!-- AIOS-MANAGED-END: core-framework -->
160
+
161
+ ## Padroes de Codigo
162
+ My custom coding standards here
163
+
164
+ ## Testes & Quality Gates
165
+ My custom testing rules`;
166
+
167
+ const result = await merger.merge(existingClaudeMd, templateContent);
168
+
169
+ // Custom sections preserved
170
+ expect(result.content).toContain('## Padroes de Codigo');
171
+ expect(result.content).toContain('My custom coding standards here');
172
+ expect(result.content).toContain('## Testes & Quality Gates');
173
+ expect(result.content).toContain('My custom testing rules');
174
+
175
+ // Managed sections updated
176
+ expect(result.content).toContain('<!-- AIOS-MANAGED-START: framework-boundary -->');
177
+ });
178
+ });
179
+
180
+ describe('section order in template', () => {
181
+ test('4 new sections come after framework-structure and before workflow-execution', () => {
182
+ const frameworkStructureEnd = templateContent.indexOf('<!-- AIOS-MANAGED-END: framework-structure -->');
183
+ const frameworkBoundaryStart = templateContent.indexOf('<!-- AIOS-MANAGED-START: framework-boundary -->');
184
+ const graphDashboardEnd = templateContent.indexOf('<!-- AIOS-MANAGED-END: graph-dashboard -->');
185
+ const workflowExecution = templateContent.indexOf('## Workflow Execution');
186
+
187
+ expect(frameworkStructureEnd).toBeLessThan(frameworkBoundaryStart);
188
+ expect(frameworkBoundaryStart).toBeLessThan(graphDashboardEnd);
189
+ expect(graphDashboardEnd).toBeLessThan(workflowExecution);
190
+ });
191
+ });
192
+ });