sinapse-ai 9.4.0 → 9.5.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 (266) hide show
  1. package/.claude/CLAUDE.md +10 -4
  2. package/.claude/hooks/enforce-architecture-first.py +197 -197
  3. package/.claude/hooks/enforce-git-push-authority.sh +25 -4
  4. package/.claude/hooks/mind-clone-governance.py +193 -193
  5. package/.claude/hooks/read-protection.py +152 -152
  6. package/.claude/hooks/sql-governance.py +183 -183
  7. package/.claude/hooks/verify-packages.cjs +83 -0
  8. package/.claude/hooks/write-path-validation.py +195 -195
  9. package/.claude/rules/hook-governance.md +1 -0
  10. package/.claude/rules/mandatory-delegation.md +24 -0
  11. package/.claude/rules/project-intelligence.md +63 -0
  12. package/.claude/rules/response-format.md +4 -0
  13. package/.claude/rules/safe-collaboration.md +4 -2
  14. package/.claude/rules/security-data-protection.md +18 -0
  15. package/.claude/rules/squad-awareness.md +93 -67
  16. package/.claude/rules/token-economy.md +148 -0
  17. package/.codex/agents/analyst.md +90 -0
  18. package/.codex/agents/architect.md +78 -0
  19. package/.codex/agents/data-engineer.md +38 -0
  20. package/.codex/agents/developer.md +97 -0
  21. package/.codex/agents/devops.md +121 -0
  22. package/.codex/agents/product-lead.md +27 -0
  23. package/.codex/agents/project-lead.md +28 -0
  24. package/.codex/agents/quality-gate.md +89 -0
  25. package/.codex/agents/sprint-lead.md +28 -0
  26. package/.codex/agents/squad-creator.md +58 -0
  27. package/.codex/agents/ux-design-expert.md +28 -0
  28. package/.sinapse-ai/core/code-intel/registry-syncer.js +56 -3
  29. package/.sinapse-ai/core/doctor/checks/agent-memory.js +5 -1
  30. package/.sinapse-ai/core/doctor/checks/claude-md.js +4 -1
  31. package/.sinapse-ai/core/doctor/checks/code-intel.js +5 -1
  32. package/.sinapse-ai/core/doctor/checks/commands-count.js +4 -1
  33. package/.sinapse-ai/core/doctor/checks/constitution-consistency.js +4 -1
  34. package/.sinapse-ai/core/doctor/checks/core-config.js +4 -1
  35. package/.sinapse-ai/core/doctor/checks/entity-registry.js +6 -1
  36. package/.sinapse-ai/core/doctor/checks/git-hooks.js +5 -1
  37. package/.sinapse-ai/core/doctor/checks/graph-dashboard.js +4 -1
  38. package/.sinapse-ai/core/doctor/checks/hooks-claude-count.js +5 -1
  39. package/.sinapse-ai/core/doctor/checks/ide-sync.js +4 -1
  40. package/.sinapse-ai/core/doctor/checks/node-version.js +4 -1
  41. package/.sinapse-ai/core/doctor/checks/npm-packages.js +4 -1
  42. package/.sinapse-ai/core/doctor/checks/rules-files.js +4 -1
  43. package/.sinapse-ai/core/doctor/checks/settings-json.js +4 -1
  44. package/.sinapse-ai/core/doctor/checks/skills-count.js +4 -1
  45. package/.sinapse-ai/core/doctor/index.js +157 -50
  46. package/.sinapse-ai/core/ids/registry-updater.js +6 -1
  47. package/.sinapse-ai/core/logger/index.js +319 -0
  48. package/.sinapse-ai/core/orchestration/terminal-spawner.js +2 -2
  49. package/.sinapse-ai/core/telemetry/index.js +247 -0
  50. package/.sinapse-ai/data/entity-registry.yaml +1384 -944
  51. package/.sinapse-ai/development/agents/architect.md +5 -0
  52. package/.sinapse-ai/development/agents/data-engineer.md +38 -0
  53. package/.sinapse-ai/development/agents/developer.md +28 -0
  54. package/.sinapse-ai/development/agents/devops.md +4 -0
  55. package/.sinapse-ai/development/agents/product-lead.md +27 -0
  56. package/.sinapse-ai/development/agents/project-lead.md +28 -0
  57. package/.sinapse-ai/development/agents/quality-gate.md +4 -0
  58. package/.sinapse-ai/development/agents/sprint-lead/MEMORY.md +8 -0
  59. package/.sinapse-ai/development/agents/sprint-lead.md +28 -0
  60. package/.sinapse-ai/development/agents/squad-creator.md +58 -0
  61. package/.sinapse-ai/development/agents/ux-design-expert.md +28 -0
  62. package/.sinapse-ai/development/knowledge-base/agent-communication-protocol.md +127 -0
  63. package/.sinapse-ai/development/knowledge-base/database-scaling-patterns.md +374 -0
  64. package/.sinapse-ai/development/knowledge-base/environment-deployment-patterns.md +353 -0
  65. package/.sinapse-ai/development/knowledge-base/gotchas-patterns.md +224 -0
  66. package/.sinapse-ai/development/knowledge-base/infrastructure-decision-framework.md +221 -0
  67. package/.sinapse-ai/development/knowledge-base/security-pre-deploy-checklist.md +410 -0
  68. package/.sinapse-ai/development/knowledge-base/software-architecture-patterns.md +299 -0
  69. package/.sinapse-ai/development/knowledge-base/token-economy-guide.md +198 -0
  70. package/.sinapse-ai/development/scripts/populate-entity-registry.js +5 -1
  71. package/.sinapse-ai/development/skills/captcha-handler.md +82 -0
  72. package/.sinapse-ai/development/skills/chrome-brain.md +81 -0
  73. package/.sinapse-ai/development/skills/deploy-readiness.md +93 -0
  74. package/.sinapse-ai/development/skills/model-router.md +92 -0
  75. package/.sinapse-ai/development/skills/sinapse-methodology.md +175 -0
  76. package/.sinapse-ai/development/skills/story-fast-track.md +71 -0
  77. package/.sinapse-ai/development/tasks/dev-develop-story.md +10 -0
  78. package/.sinapse-ai/development/tasks/environment-promotion-pipeline.md +582 -0
  79. package/.sinapse-ai/development/tasks/generate-agent-handoff.md +223 -0
  80. package/.sinapse-ai/development/tasks/infrastructure-assessment.md +432 -0
  81. package/.sinapse-ai/development/tasks/load-testing-setup.md +611 -0
  82. package/.sinapse-ai/development/tasks/observability-blueprint.md +562 -0
  83. package/.sinapse-ai/development/templates/legal/breach-notification-tmpl.md +113 -0
  84. package/.sinapse-ai/development/templates/legal/privacy-policy-tmpl.md +93 -0
  85. package/.sinapse-ai/development/templates/legal/terms-of-service-tmpl.md +85 -0
  86. package/.sinapse-ai/development/templates/service-template/README.md.hbs +159 -159
  87. package/.sinapse-ai/development/templates/service-template/__tests__/index.test.ts.hbs +238 -238
  88. package/.sinapse-ai/development/templates/service-template/client.ts.hbs +404 -404
  89. package/.sinapse-ai/development/templates/service-template/errors.ts.hbs +183 -183
  90. package/.sinapse-ai/development/templates/service-template/index.ts.hbs +121 -121
  91. package/.sinapse-ai/development/templates/service-template/package.json.hbs +88 -88
  92. package/.sinapse-ai/development/templates/service-template/types.ts.hbs +146 -146
  93. package/.sinapse-ai/development/templates/squad-template/LICENSE +22 -22
  94. package/.sinapse-ai/development/workflows/story-development-cycle.yaml +40 -1
  95. package/.sinapse-ai/hooks/ids-post-commit.js +22 -0
  96. package/.sinapse-ai/infrastructure/contracts/compatibility/README.md +42 -0
  97. package/.sinapse-ai/infrastructure/contracts/compatibility/sinapse-current.yaml +35 -0
  98. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/claude-free-tracked.cmd +127 -127
  99. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-proxy.cmd +71 -71
  100. package/.sinapse-ai/infrastructure/scripts/llm-routing/templates/deepseek-usage.cmd +51 -51
  101. package/.sinapse-ai/infrastructure/scripts/pr-review-ai.js +16 -13
  102. package/.sinapse-ai/infrastructure/scripts/setup-project-infra.js +128 -0
  103. package/.sinapse-ai/infrastructure/scripts/test-discovery.js +8 -3
  104. package/.sinapse-ai/infrastructure/scripts/validate-manifest-parity.js +380 -0
  105. package/.sinapse-ai/infrastructure/scripts/validate-parity.js +76 -25
  106. package/.sinapse-ai/infrastructure/templates/coderabbit.yaml.template +280 -280
  107. package/.sinapse-ai/infrastructure/templates/config/env.example +16 -0
  108. package/.sinapse-ai/infrastructure/templates/config/gitignore-additions.tmpl +59 -0
  109. package/.sinapse-ai/infrastructure/templates/github/CODEOWNERS.template +12 -0
  110. package/.sinapse-ai/infrastructure/templates/github/PULL_REQUEST_TEMPLATE.md +29 -0
  111. package/.sinapse-ai/infrastructure/templates/github/ci-template.yml +77 -0
  112. package/.sinapse-ai/infrastructure/templates/github/issue-templates/bug_report.md +34 -0
  113. package/.sinapse-ai/infrastructure/templates/github/issue-templates/feature_request.md +19 -0
  114. package/.sinapse-ai/infrastructure/templates/github-workflows/ci.yml.template +170 -170
  115. package/.sinapse-ai/infrastructure/templates/github-workflows/pr-automation.yml.template +331 -331
  116. package/.sinapse-ai/infrastructure/templates/github-workflows/release.yml.template +197 -197
  117. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-brownfield-merge.tmpl +19 -19
  118. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-node.tmpl +86 -86
  119. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-python.tmpl +146 -146
  120. package/.sinapse-ai/infrastructure/templates/gitignore/gitignore-sinapse-base.tmpl +64 -64
  121. package/.sinapse-ai/infrastructure/templates/sinapse-sync.yaml.template +183 -183
  122. package/.sinapse-ai/install-manifest.yaml +275 -140
  123. package/.sinapse-ai/local-config.yaml.template +65 -65
  124. package/.sinapse-ai/monitor/hooks/lib/__init__.py +2 -2
  125. package/.sinapse-ai/monitor/hooks/lib/enrich.py +59 -59
  126. package/.sinapse-ai/monitor/hooks/lib/send_event.py +48 -48
  127. package/.sinapse-ai/monitor/hooks/notification.py +30 -30
  128. package/.sinapse-ai/monitor/hooks/post_tool_use.py +46 -46
  129. package/.sinapse-ai/monitor/hooks/pre_compact.py +30 -30
  130. package/.sinapse-ai/monitor/hooks/pre_tool_use.py +41 -41
  131. package/.sinapse-ai/monitor/hooks/stop.py +30 -30
  132. package/.sinapse-ai/monitor/hooks/subagent_stop.py +30 -30
  133. package/.sinapse-ai/monitor/hooks/user_prompt_submit.py +39 -39
  134. package/.sinapse-ai/product/templates/adr.hbs +126 -126
  135. package/.sinapse-ai/product/templates/dbdr.hbs +242 -242
  136. package/.sinapse-ai/product/templates/epic.hbs +213 -213
  137. package/.sinapse-ai/product/templates/pmdr.hbs +187 -187
  138. package/.sinapse-ai/product/templates/prd-v2.0.hbs +217 -217
  139. package/.sinapse-ai/product/templates/prd.hbs +202 -202
  140. package/.sinapse-ai/product/templates/story-tmpl.yaml +59 -0
  141. package/.sinapse-ai/product/templates/story.hbs +264 -264
  142. package/.sinapse-ai/product/templates/task.hbs +171 -171
  143. package/.sinapse-ai/product/templates/tmpl-comment-on-examples.sql +159 -159
  144. package/.sinapse-ai/product/templates/tmpl-migration-script.sql +92 -92
  145. package/.sinapse-ai/product/templates/tmpl-rls-granular-policies.sql +105 -105
  146. package/.sinapse-ai/product/templates/tmpl-rls-kiss-policy.sql +11 -11
  147. package/.sinapse-ai/product/templates/tmpl-rls-roles.sql +136 -136
  148. package/.sinapse-ai/product/templates/tmpl-rls-simple.sql +78 -78
  149. package/.sinapse-ai/product/templates/tmpl-rls-tenant.sql +153 -153
  150. package/.sinapse-ai/product/templates/tmpl-rollback-script.sql +78 -78
  151. package/.sinapse-ai/product/templates/tmpl-seed-data.sql +141 -141
  152. package/.sinapse-ai/product/templates/tmpl-smoke-test.sql +17 -17
  153. package/.sinapse-ai/product/templates/tmpl-staging-copy-merge.sql +140 -140
  154. package/.sinapse-ai/product/templates/tmpl-stored-proc.sql +141 -141
  155. package/.sinapse-ai/product/templates/tmpl-trigger.sql +153 -153
  156. package/.sinapse-ai/product/templates/tmpl-view-materialized.sql +134 -134
  157. package/.sinapse-ai/product/templates/tmpl-view.sql +178 -178
  158. package/.sinapse-ai/scripts/diagnostics/health-dashboard/package-lock.json +427 -355
  159. package/LICENSE +34 -34
  160. package/README.en.md +167 -20
  161. package/README.md +190 -22
  162. package/bin/cli.js +510 -196
  163. package/bin/postinstall.js +564 -0
  164. package/bin/sinapse-cli +283 -283
  165. package/bin/sinapse-graph.js +9 -0
  166. package/bin/sinapse-init.js +36 -4
  167. package/bin/sinapse-minimal.js +20 -9
  168. package/bin/sinapse.js +202 -122
  169. package/bin/utils/deprecation-warning.js +46 -0
  170. package/bin/utils/pre-push-safety.js +14 -0
  171. package/docs/TELEMETRY.md +131 -0
  172. package/docs/chrome-brain-upgrade-plan.md +624 -0
  173. package/docs/framework/orqx-plan.md +1 -1
  174. package/docs/installation/chrome-brain.md +17 -7
  175. package/docs/mega-upgrade-orchestration-plan.md +71 -0
  176. package/docs/pt/contributing.md +20 -0
  177. package/docs/research-synthesis-for-upgrade.md +511 -0
  178. package/docs/security-audit-report.md +306 -0
  179. package/package.json +20 -8
  180. package/packages/installer/src/config/configure-environment.js +19 -44
  181. package/packages/installer/src/detection/detect-project-type.js +181 -63
  182. package/packages/installer/src/installer/manifest-signature.js +32 -17
  183. package/packages/installer/src/wizard/i18n.js +12 -0
  184. package/packages/installer/src/wizard/ide-config-generator.js +8 -39
  185. package/packages/installer/src/wizard/index.js +119 -14
  186. package/packages/installer/src/wizard/questions.js +2 -3
  187. package/packages/installer/tests/integration/environment-configuration.test.js +7 -5
  188. package/packages/installer/tests/unit/detection/detect-project-type.test.js +138 -1
  189. package/packages/installer/tests/unit/doctor/doctor-orchestrator.test.js +3 -3
  190. package/packages/sinapse-install/bin/edmcp.js +0 -0
  191. package/packages/sinapse-install/bin/sinapse-install.js +0 -0
  192. package/packages/sinapse-pro-cli/bin/sinapse-pro.js +0 -0
  193. package/scripts/check-markdown-links.py +353 -353
  194. package/scripts/coverage-report-summary.js +169 -0
  195. package/scripts/generate-install-manifest.js +6 -2
  196. package/scripts/release-readiness.js +169 -0
  197. package/scripts/test-install-matrix-local.sh +153 -0
  198. package/scripts/validate-install-docs.js +394 -0
  199. package/scripts/validate-no-external-refs.js +376 -0
  200. package/scripts/validate-squad-orqx.js +302 -0
  201. package/scripts/validate-story-meta.js +263 -0
  202. package/squads/claude-code-mastery/CHANGELOG.md +1 -1
  203. package/squads/claude-code-mastery/README.md +2 -2
  204. package/squads/claude-code-mastery/squad.yaml +1 -1
  205. package/squads/squad-artdir/README.md +90 -0
  206. package/squads/squad-artdir/agents/accessibility-guardian.md +184 -0
  207. package/squads/squad-artdir/agents/artdir-orqx.md +145 -0
  208. package/squads/squad-artdir/agents/color-psychologist.md +166 -0
  209. package/squads/squad-artdir/agents/cro-persuasion.md +161 -0
  210. package/squads/squad-artdir/agents/design-system-architect.md +100 -0
  211. package/squads/squad-artdir/agents/ia-architect.md +169 -0
  212. package/squads/squad-artdir/agents/interaction-designer.md +162 -0
  213. package/squads/squad-artdir/agents/layout-engineer.md +163 -0
  214. package/squads/squad-artdir/agents/motion-architect.md +185 -0
  215. package/squads/squad-artdir/agents/platform-aesthetic-director.md +84 -0
  216. package/squads/squad-artdir/agents/premium-packaging-strategist.md +107 -0
  217. package/squads/squad-artdir/agents/product-surface-director.md +86 -0
  218. package/squads/squad-artdir/agents/type-systemist.md +138 -0
  219. package/squads/squad-artdir/agents/visual-strategist.md +127 -0
  220. package/squads/squad-artdir/checklists/seven-pillars-validation-checklist.md +172 -0
  221. package/squads/squad-artdir/knowledge-base/case-nyo-ia-reference.md +289 -0
  222. package/squads/squad-artdir/knowledge-base/deliverables-templates.md +457 -0
  223. package/squads/squad-artdir/knowledge-base/motion-technique-catalog.md +247 -0
  224. package/squads/squad-artdir/knowledge-base/premium-packaging-principles.md +133 -0
  225. package/squads/squad-artdir/knowledge-base/psychological-toolkit.md +229 -0
  226. package/squads/squad-artdir/knowledge-base/saas-art-direction-canon.md +242 -0
  227. package/squads/squad-artdir/knowledge-base/seven-pillars-framework.md +289 -0
  228. package/squads/squad-artdir/knowledge-base/ten-pillars-framework.md +221 -0
  229. package/squads/squad-artdir/package.json +20 -0
  230. package/squads/squad-artdir/squad.yaml +271 -0
  231. package/squads/squad-artdir/tasks/audit-conversion.md +97 -0
  232. package/squads/squad-artdir/tasks/audit-drift-multi-surface.md +55 -0
  233. package/squads/squad-artdir/tasks/consult-saas-canon.md +54 -0
  234. package/squads/squad-artdir/tasks/create-art-direction-brief.md +110 -0
  235. package/squads/squad-artdir/tasks/create-premium-packaging-brief.md +61 -0
  236. package/squads/squad-artdir/tasks/create-wireflow.md +84 -0
  237. package/squads/squad-artdir/tasks/design-color-system.md +81 -0
  238. package/squads/squad-artdir/tasks/design-product-surface.md +60 -0
  239. package/squads/squad-artdir/tasks/design-token-system.md +58 -0
  240. package/squads/squad-artdir/tasks/diagnose-visual-language.md +92 -0
  241. package/squads/squad-artdir/tasks/first-5-minutes-choreography.md +65 -0
  242. package/squads/squad-artdir/tasks/specify-motion-system.md +84 -0
  243. package/squads/squad-artdir/tasks/validate-against-pillars.md +143 -0
  244. package/squads/squad-artdir/templates/art-direction-brief-template.md +215 -0
  245. package/squads/squad-artdir/workflows/conversion-audit-cycle.yaml +78 -0
  246. package/squads/squad-artdir/workflows/full-art-direction-cycle.yaml +98 -0
  247. package/squads/squad-artdir/workflows/saas-platform-art-direction-cycle.yaml +174 -0
  248. package/squads/squad-brand/knowledge-base/ai-visual-generation-canon.md +234 -0
  249. package/squads/squad-brand/squad.yaml +20 -6
  250. package/squads/squad-claude/knowledge-base/context-window-optimization.md +1 -1
  251. package/squads/squad-claude/knowledge-base/swarm-orchestration-patterns.md +2 -2
  252. package/squads/squad-content/knowledge-base/ai-native-content-loop.md +220 -0
  253. package/squads/squad-content/knowledge-base/signal-intelligence-v2.md +234 -0
  254. package/squads/squad-content/knowledge-base/task-ownership-map.md +235 -0
  255. package/squads/squad-content/squad.yaml +187 -27
  256. package/squads/squad-copy/knowledge-base/ai-copy-human-loop-canon.md +235 -0
  257. package/squads/squad-copy/squad.yaml +19 -4
  258. package/squads/squad-design/knowledge-base/cross-surface-token-canon.md +209 -0
  259. package/squads/squad-design/squad.yaml +19 -4
  260. package/.sinapse-ai/core/registry/service-registry.json +0 -6346
  261. package/.sinapse-ai/data/registry-update-log.jsonl +0 -1323
  262. package/.sinapse-ai/manifests/agents.csv +0 -29
  263. package/.sinapse-ai/manifests/tasks.csv +0 -204
  264. package/.sinapse-ai/manifests/workers.csv +0 -196
  265. package/squads/squad-growth/tasks/calculate-sample-size.md +0 -121
  266. package/squads/squad-paidmedia/tasks/calculate-sample-size.md +0 -57
@@ -0,0 +1,394 @@
1
+ #!/usr/bin/env node
2
+
3
+ /**
4
+ * validate-install-docs.js
5
+ *
6
+ * Story 10.13 — Doc-drift guard for the canonical install commands.
7
+ *
8
+ * Scans user-facing installation documentation for any reference to a
9
+ * non-canonical install/update/uninstall command. Fails with exit code 1
10
+ * (and a clear, grep-friendly report) if drift is detected.
11
+ *
12
+ * Canonical commands (the ONLY public entry points):
13
+ * npx sinapse-ai install
14
+ * npx sinapse-ai update
15
+ * npx sinapse-ai uninstall
16
+ *
17
+ * Non-canonical patterns the guard rejects in public docs:
18
+ * - `sinapse install|update|uninstall` (missing the `-ai` suffix)
19
+ * - `sinapse-minimal` (internal/legacy binary)
20
+ * - `sinapse-graph` (internal/legacy binary)
21
+ * - `install-squads.sh` (internal script, must not be exposed)
22
+ * - `update-squads.sh` (internal script, must not be exposed)
23
+ * - `install-chrome-brain.sh` (internal script, must not be exposed)
24
+ * - `install-monitor-hooks.sh` (internal script, must not be exposed)
25
+ *
26
+ * Allow-lists (to prevent false positives):
27
+ * - Sections explicitly marked as `### Internal (developer-only)` within a
28
+ * file are treated as developer notes and skipped by the scanner. The
29
+ * section ends at the next heading of equal or higher level.
30
+ * - Historical / release-notes paths: `CHANGELOG.md`, `docs/releases/**`,
31
+ * `docs/changelog/**`.
32
+ *
33
+ * Usage:
34
+ * node scripts/validate-install-docs.js [--root <dir>]
35
+ *
36
+ * Exit codes:
37
+ * 0 = no drift
38
+ * 1 = drift detected (report printed to stdout)
39
+ * 2 = usage / filesystem error (message printed to stderr)
40
+ *
41
+ * The scanner is pure (no side-effects) so it can be unit-tested by passing
42
+ * a custom `rootDir` to `validateInstallDocs()` — see tests/scripts/validate-install-docs.test.js.
43
+ */
44
+
45
+ 'use strict';
46
+
47
+ const fs = require('fs');
48
+ const path = require('path');
49
+
50
+ // ── Rules ────────────────────────────────────────────────────────────────────
51
+
52
+ /**
53
+ * Each rule has a regex and a human-readable reason. The regex is applied
54
+ * line-by-line so the reporter can pinpoint the exact line number.
55
+ */
56
+ const FORBIDDEN_PATTERNS = [
57
+ {
58
+ id: 'legacy-sinapse-install',
59
+ regex: /\bsinapse\s+install\b/,
60
+ reason: 'Use `npx sinapse-ai install` (the `sinapse install` form is deprecated).',
61
+ },
62
+ {
63
+ id: 'legacy-sinapse-update',
64
+ regex: /\bsinapse\s+update\b/,
65
+ reason: 'Use `npx sinapse-ai update` (the `sinapse update` form is deprecated).',
66
+ },
67
+ {
68
+ id: 'legacy-sinapse-uninstall',
69
+ regex: /\bsinapse\s+uninstall\b/,
70
+ reason: 'Use `npx sinapse-ai uninstall` (the `sinapse uninstall` form is deprecated).',
71
+ },
72
+ {
73
+ id: 'sinapse-minimal-binary',
74
+ regex: /\bsinapse-minimal\b/,
75
+ reason: '`sinapse-minimal` is internal/deprecated. Use `npx sinapse-ai install`.',
76
+ },
77
+ {
78
+ id: 'sinapse-graph-binary',
79
+ regex: /\bsinapse-graph\b/,
80
+ reason: '`sinapse-graph` is internal/deprecated. Use `npx sinapse-ai --help`.',
81
+ },
82
+ {
83
+ id: 'install-squads-script',
84
+ regex: /\binstall-squads\.sh\b/,
85
+ reason: 'Internal script — do not expose in public docs. It runs under `npx sinapse-ai install`.',
86
+ },
87
+ {
88
+ id: 'update-squads-script',
89
+ regex: /\bupdate-squads\.sh\b/,
90
+ reason: 'Internal script — do not expose in public docs. It runs under `npx sinapse-ai update`.',
91
+ },
92
+ {
93
+ id: 'install-chrome-brain-script',
94
+ regex: /\binstall-chrome-brain\.sh\b/,
95
+ reason:
96
+ 'Internal script — use `npx sinapse-ai chrome-brain install`. Developer-only mentions must live under a `### Internal (developer-only)` section.',
97
+ },
98
+ {
99
+ id: 'install-monitor-hooks-script',
100
+ regex: /\binstall-monitor-hooks\.sh\b/,
101
+ reason:
102
+ 'Internal script — must be invoked internally by `npx sinapse-ai install`, never shown as a user-facing command.',
103
+ },
104
+ ];
105
+
106
+ // ── Paths ────────────────────────────────────────────────────────────────────
107
+
108
+ /**
109
+ * Directories whose `.md` files are public user-facing installation docs.
110
+ * Everything in these trees is scanned.
111
+ */
112
+ const PUBLIC_DOC_DIRS = ['docs/installation'];
113
+
114
+ /**
115
+ * Additional top-level public doc files (relative to root).
116
+ */
117
+ const PUBLIC_DOC_FILES = ['README.md'];
118
+
119
+ /**
120
+ * Path fragments that identify historical / release notes. Any file whose
121
+ * relative path (forward-slash normalized) contains one of these is skipped
122
+ * even if it lives under a public directory.
123
+ */
124
+ const HISTORICAL_PATH_FRAGMENTS = [
125
+ 'CHANGELOG.md',
126
+ 'docs/releases/',
127
+ 'docs/changelog/',
128
+ ];
129
+
130
+ // ── Internal-section allow-list ──────────────────────────────────────────────
131
+
132
+ /**
133
+ * Matches a heading that opens a developer-only section. The section is
134
+ * considered active until the next heading of the same or higher level.
135
+ *
136
+ * Accepts both exact phrasing and the loose form "internal — developer-only".
137
+ */
138
+ const INTERNAL_SECTION_HEADING = /^(#{1,6})\s+Internal\s*(\(|—|-)\s*developer[-\s]?only/i;
139
+
140
+ /**
141
+ * Walk the file line-by-line and return the set of line indices (0-based)
142
+ * that fall inside an "Internal (developer-only)" block. These lines are
143
+ * exempt from the forbidden-pattern scan.
144
+ */
145
+ function computeAllowedLineSet(lines) {
146
+ const allowed = new Set();
147
+ let insideInternal = false;
148
+ let internalLevel = 0;
149
+ // Track fenced code blocks so that shell comments like `# Run this` inside
150
+ // a ```bash``` block are NOT misinterpreted as markdown headings (which
151
+ // would incorrectly close an internal section).
152
+ let insideFence = false;
153
+
154
+ const FENCE_RE = /^\s*(```|~~~)/;
155
+
156
+ for (let i = 0; i < lines.length; i++) {
157
+ const line = lines[i];
158
+
159
+ // Toggle code-fence state first — everything else honours the current state.
160
+ if (FENCE_RE.test(line)) {
161
+ // If we are inside an internal block, the fence lines themselves are allowed.
162
+ if (insideInternal) allowed.add(i);
163
+ insideFence = !insideFence;
164
+ continue;
165
+ }
166
+
167
+ if (insideFence) {
168
+ // Lines inside a fenced block are verbatim content — never treat them as
169
+ // headings. If we are inside an internal section, they are allowed.
170
+ if (insideInternal) allowed.add(i);
171
+ continue;
172
+ }
173
+
174
+ const headingMatch = line.match(/^(#{1,6})\s+/);
175
+
176
+ if (insideInternal && headingMatch) {
177
+ const level = headingMatch[1].length;
178
+ if (level <= internalLevel) {
179
+ // New heading at same or higher level closes the internal block.
180
+ insideInternal = false;
181
+ internalLevel = 0;
182
+ }
183
+ }
184
+
185
+ const internalMatch = line.match(INTERNAL_SECTION_HEADING);
186
+ if (internalMatch) {
187
+ insideInternal = true;
188
+ internalLevel = internalMatch[1].length;
189
+ // The heading line itself is part of the allowed region.
190
+ allowed.add(i);
191
+ continue;
192
+ }
193
+
194
+ if (insideInternal) {
195
+ allowed.add(i);
196
+ }
197
+ }
198
+
199
+ return allowed;
200
+ }
201
+
202
+ // ── File discovery ───────────────────────────────────────────────────────────
203
+
204
+ function isHistorical(relPath) {
205
+ const normalized = relPath.replace(/\\/g, '/');
206
+ return HISTORICAL_PATH_FRAGMENTS.some((fragment) => normalized.includes(fragment));
207
+ }
208
+
209
+ function walkMarkdown(rootDir, relDir, collected) {
210
+ const absDir = path.join(rootDir, relDir);
211
+ let entries;
212
+ try {
213
+ entries = fs.readdirSync(absDir, { withFileTypes: true });
214
+ } catch {
215
+ return;
216
+ }
217
+ for (const entry of entries) {
218
+ const entryRel = path.posix.join(relDir.replace(/\\/g, '/'), entry.name);
219
+ if (entry.isDirectory()) {
220
+ walkMarkdown(rootDir, entryRel, collected);
221
+ } else if (entry.isFile() && entry.name.toLowerCase().endsWith('.md')) {
222
+ if (!isHistorical(entryRel)) collected.push(entryRel);
223
+ }
224
+ }
225
+ }
226
+
227
+ function discoverPublicDocs(rootDir) {
228
+ const files = [];
229
+ for (const dir of PUBLIC_DOC_DIRS) {
230
+ walkMarkdown(rootDir, dir, files);
231
+ }
232
+ for (const file of PUBLIC_DOC_FILES) {
233
+ const abs = path.join(rootDir, file);
234
+ if (fs.existsSync(abs) && !isHistorical(file)) files.push(file);
235
+ }
236
+ return files;
237
+ }
238
+
239
+ // ── Scanner ──────────────────────────────────────────────────────────────────
240
+
241
+ /**
242
+ * Scan a single file for forbidden patterns, respecting internal-section
243
+ * allow-lists. Returns an array of violation objects.
244
+ *
245
+ * @param {string} rootDir
246
+ * @param {string} relPath
247
+ * @returns {Array<{file:string, line:number, col:number, ruleId:string, reason:string, snippet:string}>}
248
+ */
249
+ function scanFile(rootDir, relPath) {
250
+ const absPath = path.join(rootDir, relPath);
251
+ const content = fs.readFileSync(absPath, 'utf8');
252
+ const lines = content.split(/\r?\n/);
253
+ const allowed = computeAllowedLineSet(lines);
254
+ const violations = [];
255
+
256
+ for (let i = 0; i < lines.length; i++) {
257
+ if (allowed.has(i)) continue;
258
+ const line = lines[i];
259
+ for (const rule of FORBIDDEN_PATTERNS) {
260
+ const match = line.match(rule.regex);
261
+ if (match) {
262
+ violations.push({
263
+ file: relPath,
264
+ line: i + 1,
265
+ col: (match.index || 0) + 1,
266
+ ruleId: rule.id,
267
+ reason: rule.reason,
268
+ snippet: line.trim(),
269
+ });
270
+ }
271
+ }
272
+ }
273
+
274
+ return violations;
275
+ }
276
+
277
+ /**
278
+ * Validate all public install docs under `rootDir`. Returns a structured
279
+ * result object (no side effects). Callers decide how to present it.
280
+ *
281
+ * @param {string} rootDir
282
+ * @returns {{ok:boolean, scanned:string[], violations:Array<object>}}
283
+ */
284
+ function validateInstallDocs(rootDir) {
285
+ const scanned = discoverPublicDocs(rootDir);
286
+ const violations = [];
287
+ for (const relPath of scanned) {
288
+ violations.push(...scanFile(rootDir, relPath));
289
+ }
290
+ return { ok: violations.length === 0, scanned, violations };
291
+ }
292
+
293
+ // ── Reporter ─────────────────────────────────────────────────────────────────
294
+
295
+ function formatReport(result) {
296
+ const lines = [];
297
+ lines.push('');
298
+ lines.push('=== validate-install-docs ===');
299
+ lines.push(`Scanned ${result.scanned.length} public install doc(s).`);
300
+ if (result.ok) {
301
+ lines.push('');
302
+ lines.push('OK — no drift detected. Every public doc uses the canonical');
303
+ lines.push('`npx sinapse-ai install | update | uninstall` commands.');
304
+ lines.push('');
305
+ return lines.join('\n');
306
+ }
307
+ lines.push('');
308
+ lines.push(`FAIL — ${result.violations.length} non-canonical reference(s):`);
309
+ lines.push('');
310
+ for (const v of result.violations) {
311
+ lines.push(` ${v.file}:${v.line}:${v.col} [${v.ruleId}]`);
312
+ lines.push(` ${v.snippet}`);
313
+ lines.push(` -> ${v.reason}`);
314
+ lines.push('');
315
+ }
316
+ lines.push('Canonical commands:');
317
+ lines.push(' npx sinapse-ai install');
318
+ lines.push(' npx sinapse-ai update');
319
+ lines.push(' npx sinapse-ai uninstall');
320
+ lines.push('');
321
+ lines.push('Wrap developer-only mentions in an `### Internal (developer-only)` section to opt them out.');
322
+ lines.push('');
323
+ return lines.join('\n');
324
+ }
325
+
326
+ // ── CLI entry point ──────────────────────────────────────────────────────────
327
+
328
+ function parseArgs(argv) {
329
+ const args = { root: process.cwd() };
330
+ for (let i = 0; i < argv.length; i++) {
331
+ const a = argv[i];
332
+ if (a === '--root' || a === '-r') {
333
+ args.root = argv[++i];
334
+ } else if (a === '--help' || a === '-h') {
335
+ args.help = true;
336
+ }
337
+ }
338
+ return args;
339
+ }
340
+
341
+ function printUsage() {
342
+ process.stdout.write(
343
+ [
344
+ 'Usage: node scripts/validate-install-docs.js [--root <dir>]',
345
+ '',
346
+ 'Validates that user-facing install docs reference only the canonical',
347
+ '`npx sinapse-ai install | update | uninstall` commands.',
348
+ '',
349
+ 'Options:',
350
+ ' --root, -r <dir> Root directory to scan (defaults to cwd).',
351
+ ' --help, -h Show this help.',
352
+ '',
353
+ ].join('\n'),
354
+ );
355
+ }
356
+
357
+ function main() {
358
+ const args = parseArgs(process.argv.slice(2));
359
+ if (args.help) {
360
+ printUsage();
361
+ process.exit(0);
362
+ }
363
+ try {
364
+ const rootAbs = path.resolve(args.root);
365
+ if (!fs.existsSync(rootAbs)) {
366
+ process.stderr.write(`error: root directory not found: ${rootAbs}\n`);
367
+ process.exit(2);
368
+ }
369
+ const result = validateInstallDocs(rootAbs);
370
+ process.stdout.write(formatReport(result));
371
+ process.exit(result.ok ? 0 : 1);
372
+ } catch (err) {
373
+ process.stderr.write(`error: ${err && err.message ? err.message : err}\n`);
374
+ process.exit(2);
375
+ }
376
+ }
377
+
378
+ // Exports for unit testing.
379
+ module.exports = {
380
+ FORBIDDEN_PATTERNS,
381
+ PUBLIC_DOC_DIRS,
382
+ PUBLIC_DOC_FILES,
383
+ HISTORICAL_PATH_FRAGMENTS,
384
+ computeAllowedLineSet,
385
+ discoverPublicDocs,
386
+ scanFile,
387
+ validateInstallDocs,
388
+ formatReport,
389
+ };
390
+
391
+ // Only run the CLI when invoked directly (not when required by tests).
392
+ if (require.main === module) {
393
+ main();
394
+ }