@planu/cli 4.12.3 → 4.14.1

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 (787) hide show
  1. package/CHANGELOG.md +35 -0
  2. package/README.md +29 -25
  3. package/dist/cli/commands/inspect.d.ts +4 -0
  4. package/dist/cli/commands/inspect.js +144 -0
  5. package/dist/cli/commands/install.d.ts +19 -1
  6. package/dist/cli/commands/install.js +145 -43
  7. package/dist/cli/commands/job.d.ts +3 -0
  8. package/dist/cli/commands/job.js +119 -0
  9. package/dist/cli/commands/offline.d.ts +15 -0
  10. package/dist/cli/commands/offline.js +132 -0
  11. package/dist/cli/commands/serve.js +4 -0
  12. package/dist/cli/commands/spec.js +1 -1
  13. package/dist/cli/commands/storage.d.ts +3 -0
  14. package/dist/cli/commands/storage.js +102 -0
  15. package/dist/cli/commands/uninstall.d.ts +10 -0
  16. package/dist/cli/commands/uninstall.js +93 -7
  17. package/dist/cli/commands/validate.js +1 -1
  18. package/dist/cli/index.js +2 -0
  19. package/dist/cli/router.js +9 -1
  20. package/dist/config/crash-shield-framework-rules.json +93 -0
  21. package/dist/config/environment-schema.json +149 -0
  22. package/dist/config/hardcode-exceptions.json +4 -0
  23. package/dist/config/license-plans.json +7 -0
  24. package/dist/config/native-release-public-key.pem +3 -0
  25. package/dist/config/native-targets.json +87 -0
  26. package/dist/config/product-public.d.ts +89 -0
  27. package/dist/config/product-public.js +140 -0
  28. package/dist/config/product-public.json +312 -0
  29. package/dist/config/product-public.ts +148 -0
  30. package/dist/config/release-compatibility.json +13 -0
  31. package/dist/config/release-policy.json +26 -0
  32. package/dist/config/runtime-policy.json +44 -0
  33. package/dist/config/skill-templates/planu-validate.md +7 -4
  34. package/dist/config/subagent-templates/planu-spec-implementer.md +7 -3
  35. package/dist/config/subagent-templates/planu-validator.md +10 -5
  36. package/dist/config/technology-registry.json +120 -0
  37. package/dist/config/version.js +7 -8
  38. package/dist/config/version.ts +10 -7
  39. package/dist/engine/abortable-process-runner.js +40 -9
  40. package/dist/engine/advanced-testing/accessibility-checker.js +12 -14
  41. package/dist/engine/advanced-testing/mutation-advisor.js +3 -4
  42. package/dist/engine/advanced-testing/property-based.js +2 -3
  43. package/dist/engine/advanced-testing/test-data-advisor.js +2 -3
  44. package/dist/engine/agent-generator.js +2 -1
  45. package/dist/engine/agent-handoff-store.js +2 -1
  46. package/dist/engine/agent-prompt-generator.js +7 -5
  47. package/dist/engine/agent-telemetry.js +2 -1
  48. package/dist/engine/ai-integration/gemini/extensions-advisor.js +41 -9
  49. package/dist/engine/ambiguity-detector.js +12 -11
  50. package/dist/engine/analyzer/db-engine.js +2 -3
  51. package/dist/engine/analyzer/detectors.js +13 -14
  52. package/dist/engine/analyzer/env-setup.js +9 -10
  53. package/dist/engine/analyzer-env-scanner/env-example.js +7 -8
  54. package/dist/engine/api-spec-generator/graphql-parser.js +2 -2
  55. package/dist/engine/api-validation/graphql-schema-validator.js +2 -1
  56. package/dist/engine/api-validation/openapi-impl-validator.js +6 -7
  57. package/dist/engine/architecture-detector.js +10 -8
  58. package/dist/engine/auth/config.d.ts +1 -1
  59. package/dist/engine/auth/config.js +4 -3
  60. package/dist/engine/auto-updater/atomic-upgrade.d.ts +8 -0
  61. package/dist/engine/auto-updater/atomic-upgrade.js +381 -0
  62. package/dist/engine/auto-updater/config-detector.js +9 -3
  63. package/dist/engine/auto-updater/config-patcher.d.ts +0 -4
  64. package/dist/engine/auto-updater/config-patcher.js +10 -15
  65. package/dist/engine/auto-updater/index.d.ts +3 -1
  66. package/dist/engine/auto-updater/index.js +44 -30
  67. package/dist/engine/auto-updater/npm-registry.js +10 -2
  68. package/dist/engine/auto-updater/release-verifier.d.ts +3 -0
  69. package/dist/engine/auto-updater/release-verifier.js +112 -0
  70. package/dist/engine/auto-updater/upgrade-lock.d.ts +6 -0
  71. package/dist/engine/auto-updater/upgrade-lock.js +28 -0
  72. package/dist/engine/auto-updater/upgrade-trust-state.d.ts +7 -0
  73. package/dist/engine/auto-updater/upgrade-trust-state.js +59 -0
  74. package/dist/engine/autopilot/audit-logger.js +2 -5
  75. package/dist/engine/best-practices-library.js +2 -1
  76. package/dist/engine/browser-validator.js +2 -1
  77. package/dist/engine/build-tool-detector.js +3 -2
  78. package/dist/engine/ci-generator/context-builders.js +7 -5
  79. package/dist/engine/ci-generator/stack-detector.js +0 -2
  80. package/dist/engine/ci-generator/yaml-builder.js +0 -2
  81. package/dist/engine/claude-config-auditor/rules-auditor.js +4 -3
  82. package/dist/engine/code-transforms/typescript/ast-utils.js +2 -3
  83. package/dist/engine/complexity-budget/trivial-detector.js +2 -1
  84. package/dist/engine/compliance-test-generator/index.js +7 -2
  85. package/dist/engine/compliance-test-generator/test-formatter.js +2 -2
  86. package/dist/engine/config-health/mcp-config-checker.js +2 -1
  87. package/dist/engine/config-health/ts-checker-scripts.js +4 -3
  88. package/dist/engine/config-health/ts-checker.js +3 -2
  89. package/dist/engine/convention-injector.js +5 -7
  90. package/dist/engine/convention-scanner/convention-parser.js +3 -2
  91. package/dist/engine/core-bridge-duplicate-blocks.d.ts +3 -0
  92. package/dist/engine/core-bridge-duplicate-blocks.js +57 -0
  93. package/dist/engine/core-bridge-gaps.d.ts +4 -0
  94. package/dist/engine/core-bridge-gaps.js +75 -0
  95. package/dist/engine/core-bridge.d.ts +9 -9
  96. package/dist/engine/core-bridge.js +196 -283
  97. package/dist/engine/cost-tracking/ledger.js +2 -5
  98. package/dist/engine/coverage-gap-analyzer.js +10 -1
  99. package/dist/engine/crash-shield/detectors/framework-detector.d.ts +2 -0
  100. package/dist/engine/crash-shield/detectors/framework-detector.js +110 -192
  101. package/dist/engine/crash-shield/detectors/typescript-detector.js +2 -1
  102. package/dist/engine/dashboard/data-loader.js +2 -1
  103. package/dist/engine/data-projects-gc/gc-runner.d.ts +7 -0
  104. package/dist/engine/data-projects-gc/gc-runner.js +113 -3
  105. package/dist/engine/data-projects-gc/scanner.js +5 -1
  106. package/dist/engine/decision-store.js +11 -14
  107. package/dist/engine/deleter/core.js +5 -5
  108. package/dist/engine/dep-auditor/abandonment-data.js +2 -1
  109. package/dist/engine/dep-auditor/abandonment-registry.js +3 -1
  110. package/dist/engine/dep-auditor/cve-fetcher.js +3 -0
  111. package/dist/engine/dep-auditor/dep-duplicates-detector.js +36 -4
  112. package/dist/engine/dep-auditor/license-registry.js +2 -0
  113. package/dist/engine/dependency-evaluator.d.ts +14 -0
  114. package/dist/engine/dependency-evaluator.js +81 -0
  115. package/dist/engine/deploy/providers/fly.js +7 -7
  116. package/dist/engine/deploy/providers/netlify.js +7 -7
  117. package/dist/engine/deploy/providers/railway.js +10 -12
  118. package/dist/engine/deploy/providers/vercel.js +7 -9
  119. package/dist/engine/deprecation-scanner/pattern-loader.js +0 -2
  120. package/dist/engine/desktop-detector.js +2 -3
  121. package/dist/engine/detect-duplication.js +2 -1
  122. package/dist/engine/detectors/advanced-framework-detector/css-state-detector.js +2 -1
  123. package/dist/engine/detectors/advanced-framework-detector/legacy-detector.js +2 -3
  124. package/dist/engine/detectors/advanced-framework-detector/modern-detector.js +3 -4
  125. package/dist/engine/detectors/agent-framework-detector.js +3 -2
  126. package/dist/engine/detectors/ai-native-detector.js +4 -6
  127. package/dist/engine/detectors/cache-db-detector.js +4 -3
  128. package/dist/engine/detectors/cicd-detector.js +4 -3
  129. package/dist/engine/detectors/deployment-detector.js +11 -12
  130. package/dist/engine/detectors/frontend-perf-detector.js +14 -9
  131. package/dist/engine/detectors/library-detector-multilang-a.js +16 -3
  132. package/dist/engine/detectors/library-detector-node.js +14 -4
  133. package/dist/engine/detectors/library-detector-python.js +7 -1
  134. package/dist/engine/detectors/library-detector.js +0 -2
  135. package/dist/engine/detectors/llm-detector/provider-maps.js +3 -2
  136. package/dist/engine/detectors/mcp-candidate-detector.js +12 -16
  137. package/dist/engine/detectors/mfe-detector.js +6 -7
  138. package/dist/engine/detectors/monitoring-detector.js +4 -3
  139. package/dist/engine/detectors/otel-detector.js +3 -2
  140. package/dist/engine/detectors/otel-ecosystem-detectors.d.ts +2 -2
  141. package/dist/engine/detectors/otel-ecosystem-detectors.js +4 -3
  142. package/dist/engine/detectors/platform-specialty-detector.js +3 -5
  143. package/dist/engine/detectors/template-engine-detector.js +3 -4
  144. package/dist/engine/doc-generator/builders.js +2 -3
  145. package/dist/engine/doc-generator/mobile-distribution-guide.js +13 -17
  146. package/dist/engine/doc-generator/portal/dirty-flag-map.d.ts +2 -2
  147. package/dist/engine/doc-generator/portal/portal-regenerator.js +3 -47
  148. package/dist/engine/domain-detector.js +3 -6
  149. package/dist/engine/dynamic-knowledge/knowledge-cache.js +3 -4
  150. package/dist/engine/dynamic-knowledge/knowledge-merger.js +17 -2
  151. package/dist/engine/dynamic-knowledge/web-researcher.js +15 -14
  152. package/dist/engine/dynamic-migration-detector/manifest-readers-extended.js +0 -2
  153. package/dist/engine/e2e-test-generator.js +4 -3
  154. package/dist/engine/ecosystem-absorber/knowledge-cache.js +2 -1
  155. package/dist/engine/ecosystem-absorber/platform-crawler.js +2 -2
  156. package/dist/engine/escalator/retry-counter.js +2 -1
  157. package/dist/engine/evidence-gates/artifact-reader.d.ts +6 -0
  158. package/dist/engine/evidence-gates/artifact-reader.js +105 -21
  159. package/dist/engine/evidence-gates/lifecycle-gate.d.ts +2 -1
  160. package/dist/engine/evidence-gates/lifecycle-gate.js +54 -0
  161. package/dist/engine/execution/context.d.ts +19 -0
  162. package/dist/engine/execution/context.js +127 -0
  163. package/dist/engine/execution/deadline-io.d.ts +21 -0
  164. package/dist/engine/execution/deadline-io.js +45 -0
  165. package/dist/engine/execution/job-executor.d.ts +16 -0
  166. package/dist/engine/execution/job-executor.js +140 -0
  167. package/dist/engine/execution/job-runtime.d.ts +78 -0
  168. package/dist/engine/execution/job-runtime.js +220 -0
  169. package/dist/engine/execution/native-relevance-scorer.d.ts +6 -0
  170. package/dist/engine/execution/native-relevance-scorer.js +64 -0
  171. package/dist/engine/execution/native-worker-dispatch.d.ts +3 -0
  172. package/dist/engine/execution/native-worker-dispatch.js +46 -0
  173. package/dist/engine/execution/native-worker-protocol.d.ts +6 -0
  174. package/dist/engine/execution/native-worker-protocol.js +33 -0
  175. package/dist/engine/execution/native-worker-runtime.d.ts +4 -0
  176. package/dist/engine/execution/native-worker-runtime.js +177 -0
  177. package/dist/engine/execution/native-worker-thread.d.ts +2 -0
  178. package/dist/engine/execution/native-worker-thread.js +66 -0
  179. package/dist/engine/execution/operation-journal.d.ts +66 -0
  180. package/dist/engine/execution/operation-journal.js +260 -0
  181. package/dist/engine/execution/outbox-worker.d.ts +31 -0
  182. package/dist/engine/execution/outbox-worker.js +192 -0
  183. package/dist/engine/execution/validate-job-executor.d.ts +24 -0
  184. package/dist/engine/execution/validate-job-executor.js +342 -0
  185. package/dist/engine/execution/validate-job-payload.d.ts +5 -0
  186. package/dist/engine/execution/validate-job-payload.js +87 -0
  187. package/dist/engine/execution/validate-job-recovery.d.ts +4 -0
  188. package/dist/engine/execution/validate-job-recovery.js +47 -0
  189. package/dist/engine/execution/validate-worker-runtime.d.ts +5 -0
  190. package/dist/engine/execution/validate-worker-runtime.js +100 -0
  191. package/dist/engine/execution/validate-worker-thread.d.ts +2 -0
  192. package/dist/engine/execution/validate-worker-thread.js +71 -0
  193. package/dist/engine/execution-plan/desktop-distribution.js +3 -7
  194. package/dist/engine/execution-plan/mobile-distribution.js +4 -9
  195. package/dist/engine/execution-plan/phases.js +4 -5
  196. package/dist/engine/execution-plan/plan-utils.js +8 -5
  197. package/dist/engine/facilitate/context-loader.js +3 -9
  198. package/dist/engine/figma/code-connect-fetcher.js +9 -8
  199. package/dist/engine/filesystem-watcher/index.d.ts +3 -3
  200. package/dist/engine/filesystem-watcher/index.js +5 -5
  201. package/dist/engine/framework-detector.js +14 -15
  202. package/dist/engine/git/planu-autocommit.js +8 -7
  203. package/dist/engine/git/repository-probe.d.ts +3 -0
  204. package/dist/engine/git/repository-probe.js +13 -0
  205. package/dist/engine/global-rules-manager.js +2 -2
  206. package/dist/engine/handoff-artifacts/io.js +2 -3
  207. package/dist/engine/handoff-artifacts/schemas/red-tests-handoff.js +8 -1
  208. package/dist/engine/handoff-artifacts/schemas.d.ts +4 -0
  209. package/dist/engine/handoff-artifacts/schemas.js +5 -0
  210. package/dist/engine/hook-generator/stack-hook-templates.js +4 -4
  211. package/dist/engine/hooks/config-loader.js +1 -1
  212. package/dist/engine/hooks/context-injector.js +4 -7
  213. package/dist/engine/hooks/file-watcher.js +1 -14
  214. package/dist/engine/hooks-reconciler.js +6 -4
  215. package/dist/engine/infrastructure/component-mapper.js +5 -7
  216. package/dist/engine/infrastructure/docker-compose-generator.js +8 -10
  217. package/dist/engine/infrastructure/index.js +6 -3
  218. package/dist/engine/infrastructure/kubernetes-generator.js +2 -2
  219. package/dist/engine/infrastructure/railway-generator.js +10 -8
  220. package/dist/engine/infrastructure/signal-detector.js +6 -8
  221. package/dist/engine/infrastructure/terraform-generator.js +6 -8
  222. package/dist/engine/legal-compliance/detector.js +3 -2
  223. package/dist/engine/local-first/storage-advisor.js +5 -6
  224. package/dist/engine/macos-keychain-native-port.d.ts +5 -0
  225. package/dist/engine/macos-keychain-native-port.js +26 -0
  226. package/dist/engine/marketplace-fetcher/cache.js +3 -1
  227. package/dist/engine/mcp-config/mcp-config-writer.d.ts +2 -2
  228. package/dist/engine/mcp-config/mcp-config-writer.js +10 -8
  229. package/dist/engine/migration/db-migrator.js +2 -5
  230. package/dist/engine/migration/equivalence-mapper.js +12 -13
  231. package/dist/engine/migration/service-catalogs.js +6 -7
  232. package/dist/engine/migration/service-migrator-catalogs.js +6 -7
  233. package/dist/engine/mobile-detector-ios.js +2 -3
  234. package/dist/engine/mobile-detector.js +16 -4
  235. package/dist/engine/model-router/complexity-analyzer.js +4 -7
  236. package/dist/engine/multi-agent-review/security-analyzer.js +3 -1
  237. package/dist/engine/multi-app-detector/app-type.js +26 -21
  238. package/dist/engine/multi-app-detector/core.js +3 -2
  239. package/dist/engine/multi-teammate-review/disagreement-counter.js +2 -1
  240. package/dist/engine/multi-teammate-review/panel-orchestrator.js +0 -2
  241. package/dist/engine/mutation-config-generator.js +10 -7
  242. package/dist/engine/native-capability-policy.d.ts +4 -0
  243. package/dist/engine/native-capability-policy.js +24 -0
  244. package/dist/engine/native-platform.d.ts +3 -0
  245. package/dist/engine/native-platform.js +44 -0
  246. package/dist/engine/native-runtime-handshake.d.ts +20 -0
  247. package/dist/engine/native-runtime-handshake.js +230 -0
  248. package/dist/engine/network-policy.d.ts +27 -0
  249. package/dist/engine/network-policy.js +174 -0
  250. package/dist/engine/next-spec-resolver/dependency-filter.js +2 -22
  251. package/dist/engine/nfr-profile-detector.js +12 -16
  252. package/dist/engine/nli-keywords.js +8 -9
  253. package/dist/engine/oauth/config-guard.js +4 -5
  254. package/dist/engine/observability/local-execution-spans.d.ts +15 -0
  255. package/dist/engine/observability/local-execution-spans.js +63 -0
  256. package/dist/engine/orchestrator/runtime.js +0 -1
  257. package/dist/engine/package-registry.js +2 -6
  258. package/dist/engine/performance-analyzer.js +2 -5
  259. package/dist/engine/permissions-merger/stack-detectors.js +5 -5
  260. package/dist/engine/planu-core.darwin-arm64.node.manifest.json +39 -0
  261. package/dist/engine/planu-core.darwin-arm64.node.sbom.json +1310 -0
  262. package/dist/engine/planu-core.darwin-x64.node.manifest.json +39 -0
  263. package/dist/engine/planu-core.darwin-x64.node.sbom.json +1310 -0
  264. package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +38 -0
  265. package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +1310 -0
  266. package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +38 -0
  267. package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +1310 -0
  268. package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +38 -0
  269. package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +1310 -0
  270. package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +38 -0
  271. package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +1310 -0
  272. package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +38 -0
  273. package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +1310 -0
  274. package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +38 -0
  275. package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +1310 -0
  276. package/dist/engine/platform-detector/desktop.js +15 -2
  277. package/dist/engine/platform-detector/extensions.js +2 -1
  278. package/dist/engine/platform-detector/games.js +2 -1
  279. package/dist/engine/platform-detector.js +3 -2
  280. package/dist/engine/platform-engineering/idp-detector.js +2 -1
  281. package/dist/engine/plugin-installer/stack-matcher.js +9 -17
  282. package/dist/engine/plugins/lifecycle.js +6 -2
  283. package/dist/engine/prior-decisions/contradiction-detector.js +60 -30
  284. package/dist/engine/project-dna/stack-detector.js +15 -17
  285. package/dist/engine/project-graph/builder.js +11 -0
  286. package/dist/engine/project-graph/cache.js +1 -1
  287. package/dist/engine/project-graph/freshness-projection.d.ts +16 -0
  288. package/dist/engine/project-graph/freshness-projection.js +95 -0
  289. package/dist/engine/project-graph/index.d.ts +1 -0
  290. package/dist/engine/project-graph/index.js +1 -0
  291. package/dist/engine/project-graph/query.js +15 -25
  292. package/dist/engine/project-health-checker.js +3 -4
  293. package/dist/engine/project-scanner/stack-detector.js +17 -17
  294. package/dist/engine/property-test-generator.js +2 -3
  295. package/dist/engine/qa-gate.d.ts +1 -0
  296. package/dist/engine/qa-gate.js +6 -4
  297. package/dist/engine/quality-gates/gate-catalog.js +47 -46
  298. package/dist/engine/quality-gates/gate-injector.js +9 -4
  299. package/dist/engine/registry/core.js +0 -2
  300. package/dist/engine/registry/loader.js +9 -12
  301. package/dist/engine/registry/matcher.js +129 -24
  302. package/dist/engine/resilience-detector/concurrency-detector.js +4 -4
  303. package/dist/engine/resilience-detector/middleware-detector.js +11 -13
  304. package/dist/engine/resilience-detector/validation-detector.js +17 -4
  305. package/dist/engine/reverse-engineer/config-analyzer.js +9 -8
  306. package/dist/engine/reverse-engineer/orchestrator.js +5 -9
  307. package/dist/engine/reverse-engineer/test-file-parser.js +6 -3
  308. package/dist/engine/rules-generator/index.js +6 -5
  309. package/dist/engine/runtime-policy.d.ts +7 -0
  310. package/dist/engine/runtime-policy.js +101 -0
  311. package/dist/engine/runtime-security/checkers/content-security.js +21 -6
  312. package/dist/engine/runtime-security/checkers/file-permissions.js +0 -2
  313. package/dist/engine/safety/atomic-write-file.js +20 -9
  314. package/dist/engine/safety/atomic-writer.js +10 -3
  315. package/dist/engine/safety/cross-process-lock.d.ts +3 -40
  316. package/dist/engine/safety/cross-process-lock.js +268 -272
  317. package/dist/engine/safety/file-mutex.d.ts +2 -9
  318. package/dist/engine/safety/file-mutex.js +155 -87
  319. package/dist/engine/safety/health-monitor.js +15 -6
  320. package/dist/engine/safety/lock-lease-store.d.ts +79 -0
  321. package/dist/engine/safety/lock-lease-store.js +372 -0
  322. package/dist/engine/safety/lock-scavenger.d.ts +2 -5
  323. package/dist/engine/safety/lock-scavenger.js +158 -76
  324. package/dist/engine/safety/lock-staleness.js +4 -1
  325. package/dist/engine/safety/obsolete-lock-guard.d.ts +8 -0
  326. package/dist/engine/safety/obsolete-lock-guard.js +31 -0
  327. package/dist/engine/safety/transaction.js +3 -3
  328. package/dist/engine/sandbox/index.js +2 -1
  329. package/dist/engine/sandbox/runner-detect.js +3 -2
  330. package/dist/engine/sandbox/runner-docker.js +4 -3
  331. package/dist/engine/scan-project/module-discoverer.js +3 -2
  332. package/dist/engine/schema-generator.js +16 -9
  333. package/dist/engine/security-analyzer/criteria-generator.js +2 -3
  334. package/dist/engine/self-healing/healer.js +4 -4
  335. package/dist/engine/session-safeguard/learnings-buffer.d.ts +1 -2
  336. package/dist/engine/session-safeguard/learnings-buffer.js +42 -65
  337. package/dist/engine/shared-agent-memory.js +66 -74
  338. package/dist/engine/skill-adapter/command-rewriter.js +3 -2
  339. package/dist/engine/skill-adapter/index.js +3 -3
  340. package/dist/engine/skill-adapter/placeholder-map.js +3 -2
  341. package/dist/engine/skill-bootstrap/stack-matcher.js +47 -48
  342. package/dist/engine/skill-generation/stack-content-generator.js +0 -2
  343. package/dist/engine/skill-generator/workflow-skill-generator.js +2 -1
  344. package/dist/engine/skill-registry/ttl-refresh.js +3 -1
  345. package/dist/engine/skills/skills-fetcher.js +3 -6
  346. package/dist/engine/skills-reconciler.js +19 -39
  347. package/dist/engine/spec-coverage/test-finder.js +7 -6
  348. package/dist/engine/spec-diff-engine.js +3 -3
  349. package/dist/engine/spec-generator/api-key-resolver.d.ts +1 -1
  350. package/dist/engine/spec-generator/api-key-resolver.js +3 -24
  351. package/dist/engine/spec-generators/issue-extractor.js +9 -3
  352. package/dist/engine/spec-migrator/drift-detector.js +5 -13
  353. package/dist/engine/spec-migrator/filesystem-import.js +14 -10
  354. package/dist/engine/spec-migrator/planu-canonical-policy.js +10 -1
  355. package/dist/engine/spec-migrator/strict-planu-cleanup.js +24 -25
  356. package/dist/engine/spec-registry/adapter.d.ts +0 -5
  357. package/dist/engine/spec-registry/adapter.js +45 -46
  358. package/dist/engine/spec-registry/client.js +2 -0
  359. package/dist/engine/spec-source-sync.js +3 -2
  360. package/dist/engine/spec-templates/custom-loader.js +2 -3
  361. package/dist/engine/spec-templates/templates-domain-specific.js +8 -5
  362. package/dist/engine/spec-templates/templates-perf-integration.js +2 -3
  363. package/dist/engine/stack-auditor/manifest-reader.js +0 -2
  364. package/dist/engine/staleness/stale-implementing.js +7 -7
  365. package/dist/engine/tdd-scaffold-generator.js +24 -11
  366. package/dist/engine/teammate-router/green-phase-verifier.js +2 -1
  367. package/dist/engine/teammate-router/red-phase-verifier.js +2 -1
  368. package/dist/engine/technology-registry.d.ts +11 -0
  369. package/dist/engine/technology-registry.js +142 -0
  370. package/dist/engine/telemetry/error-reporter.d.ts +1 -2
  371. package/dist/engine/telemetry/error-reporter.js +11 -18
  372. package/dist/engine/telemetry/health-checker.js +5 -14
  373. package/dist/engine/telemetry/index.d.ts +0 -1
  374. package/dist/engine/telemetry/index.js +0 -1
  375. package/dist/engine/telemetry/stance.js +3 -2
  376. package/dist/engine/telemetry/telemetry-client.d.ts +1 -5
  377. package/dist/engine/telemetry/telemetry-client.js +45 -29
  378. package/dist/engine/telemetry/telemetry-store.d.ts +3 -3
  379. package/dist/engine/telemetry/telemetry-store.js +30 -23
  380. package/dist/engine/test-framework-detector/detectors.js +8 -8
  381. package/dist/engine/test-framework-detector/strategy.js +8 -9
  382. package/dist/engine/test-generators/agent-test-templates.js +2 -3
  383. package/dist/engine/test-generators/contract-test-generator.d.ts +1 -1
  384. package/dist/engine/test-generators/contract-test-generator.js +9 -202
  385. package/dist/engine/test-generators/platform-test-templates-b.js +2 -3
  386. package/dist/engine/test-generators/platform-test-templates.js +2 -5
  387. package/dist/engine/test-mocks-generator.js +4 -3
  388. package/dist/engine/test-plan-generator.js +30 -12
  389. package/dist/engine/test-scaffold-generator/advanced-scaffold.js +4 -5
  390. package/dist/engine/test-scaffold-generator/unit-scaffold.js +5 -6
  391. package/dist/engine/timing/budget.d.ts +6 -17
  392. package/dist/engine/timing/budget.js +80 -64
  393. package/dist/engine/tool-groups/group-manager.js +3 -3
  394. package/dist/engine/universal-rules/installer.js +1 -1
  395. package/dist/engine/universal-rules/rules/planu-modes.js +2 -0
  396. package/dist/engine/universal-rules/rules/planu-release-policy.js +1 -0
  397. package/dist/engine/update-notifier.js +8 -5
  398. package/dist/engine/validation/approved-spec-portability.d.ts +12 -0
  399. package/dist/engine/validation/approved-spec-portability.js +107 -0
  400. package/dist/engine/validation/durable-validation.d.ts +36 -0
  401. package/dist/engine/validation/durable-validation.js +335 -0
  402. package/dist/engine/validation/validation-freshness.d.ts +36 -0
  403. package/dist/engine/validation/validation-freshness.js +427 -0
  404. package/dist/engine/validation/validation-receipt-codec.d.ts +13 -0
  405. package/dist/engine/validation/validation-receipt-codec.js +182 -0
  406. package/dist/engine/validation/validation-receipt.d.ts +59 -0
  407. package/dist/engine/validation/validation-receipt.js +282 -0
  408. package/dist/engine/validation/validation-source-policy.d.ts +4 -0
  409. package/dist/engine/validation/validation-source-policy.js +16 -0
  410. package/dist/engine/validation/validation-submission.d.ts +36 -0
  411. package/dist/engine/validation/validation-submission.js +128 -0
  412. package/dist/engine/validation-evidence-ledger.js +41 -0
  413. package/dist/engine/validation-impact-planner.js +25 -9
  414. package/dist/engine/validator/spec-compliance-runner.d.ts +1 -1
  415. package/dist/engine/validator/spec-compliance-runner.js +17 -8
  416. package/dist/engine/validator/validation-report-writer.js +1 -1
  417. package/dist/engine/validator.js +2 -1
  418. package/dist/engine/verify-integrations/index.js +1 -1
  419. package/dist/engine/version-resolver.js +5 -6
  420. package/dist/engine/web-fetcher/stack-advisor.js +156 -92
  421. package/dist/engine/web-fetcher/stack-detector.js +114 -54
  422. package/dist/engine/workspace-manager.js +3 -2
  423. package/dist/errors/classified-degradation.d.ts +3 -0
  424. package/dist/errors/classified-degradation.js +10 -0
  425. package/dist/errors/degradation-sink.d.ts +3 -0
  426. package/dist/errors/degradation-sink.js +5 -0
  427. package/dist/errors/error-taxonomy.d.ts +12 -0
  428. package/dist/errors/error-taxonomy.js +62 -0
  429. package/dist/hosts/claude-code/ux/mcp-prompts.js +10 -4
  430. package/dist/hosts/claude-code/ux/mcp-resources.js +4 -2
  431. package/dist/hosts/codex/config-scaffold.js +4 -3
  432. package/dist/hosts/gemini/config-scaffold.js +2 -1
  433. package/dist/hosts/gemini/multimodal-spec-flow.js +7 -4
  434. package/dist/index.js +21 -6
  435. package/dist/resources/patterns.js +3 -1
  436. package/dist/resources/specs.js +3 -1
  437. package/dist/resources/templates.js +3 -1
  438. package/dist/security/adapters/environment.d.ts +12 -0
  439. package/dist/security/adapters/environment.js +25 -0
  440. package/dist/security/adapters/linux-secret-service.d.ts +8 -0
  441. package/dist/security/adapters/linux-secret-service.js +60 -0
  442. package/dist/security/adapters/macos-keychain.d.ts +18 -0
  443. package/dist/security/adapters/macos-keychain.js +90 -0
  444. package/dist/security/adapters/windows-credential-manager.d.ts +8 -0
  445. package/dist/security/adapters/windows-credential-manager.js +58 -0
  446. package/dist/security/redactor.d.ts +5 -0
  447. package/dist/security/redactor.js +58 -0
  448. package/dist/security/secret-field.d.ts +5 -0
  449. package/dist/security/secret-field.js +17 -0
  450. package/dist/security/secret-migration.d.ts +3 -0
  451. package/dist/security/secret-migration.js +123 -0
  452. package/dist/security/secret-provider.d.ts +23 -0
  453. package/dist/security/secret-provider.js +145 -0
  454. package/dist/security/secure-json.d.ts +3 -0
  455. package/dist/security/secure-json.js +29 -0
  456. package/dist/storage/api-surfaces-store.js +2 -2
  457. package/dist/storage/approval-operation-lock.d.ts +1 -1
  458. package/dist/storage/approval-operation-lock.js +5 -3
  459. package/dist/storage/audit-trail-store.d.ts +1 -1
  460. package/dist/storage/audit-trail-store.js +48 -62
  461. package/dist/storage/autopilot-log-store.js +12 -5
  462. package/dist/storage/base-store.d.ts +8 -8
  463. package/dist/storage/base-store.js +57 -20
  464. package/dist/storage/checkpoint-store.js +5 -2
  465. package/dist/storage/comments-store.js +2 -2
  466. package/dist/storage/compliance-audit-store.js +5 -2
  467. package/dist/storage/compliance-gate-config-store.js +7 -4
  468. package/dist/storage/compliance-store.js +2 -2
  469. package/dist/storage/context-profile-store.js +2 -2
  470. package/dist/storage/crash-shield-store.js +8 -4
  471. package/dist/storage/feedback-store.js +10 -6
  472. package/dist/storage/figma-store.js +8 -4
  473. package/dist/storage/file-mutex.js +9 -1
  474. package/dist/storage/gaps-log.js +7 -4
  475. package/dist/storage/global-projects-store.js +4 -2
  476. package/dist/storage/ideas-store.js +2 -2
  477. package/dist/storage/index.d.ts +5 -0
  478. package/dist/storage/index.js +5 -0
  479. package/dist/storage/knowledge-store/knowledge.js +27 -33
  480. package/dist/storage/lessons-store.js +2 -2
  481. package/dist/storage/license-store.js +13 -41
  482. package/dist/storage/migrations/canonical-storage.d.ts +15 -0
  483. package/dist/storage/migrations/canonical-storage.js +599 -0
  484. package/dist/storage/oauth-store.js +36 -8
  485. package/dist/storage/path-resolver.js +16 -3
  486. package/dist/storage/pr-store.js +2 -2
  487. package/dist/storage/project-drift-store.js +20 -8
  488. package/dist/storage/project-identity.d.ts +32 -0
  489. package/dist/storage/project-identity.js +194 -0
  490. package/dist/storage/project-resolver.js +14 -7
  491. package/dist/storage/release-notes-store.js +2 -6
  492. package/dist/storage/runtime-db.d.ts +186 -0
  493. package/dist/storage/runtime-db.js +1054 -0
  494. package/dist/storage/schema-registry.d.ts +5 -0
  495. package/dist/storage/schema-registry.js +74 -0
  496. package/dist/storage/sentry-store.js +20 -9
  497. package/dist/storage/session-state-store.js +12 -5
  498. package/dist/storage/session-store.js +12 -4
  499. package/dist/storage/skill-registry-storage.d.ts +1 -1
  500. package/dist/storage/skill-registry-storage.js +13 -11
  501. package/dist/storage/slack-store.js +10 -5
  502. package/dist/storage/spec-store.js +31 -24
  503. package/dist/storage/status-store/file-lock.js +31 -9
  504. package/dist/storage/status-store/self-healing.js +10 -5
  505. package/dist/storage/status-store/version-sync.js +8 -6
  506. package/dist/storage/steering-store.js +2 -2
  507. package/dist/storage/storage-bundle.d.ts +5 -0
  508. package/dist/storage/storage-bundle.js +117 -0
  509. package/dist/storage/storage-catalog-validation.d.ts +3 -0
  510. package/dist/storage/storage-catalog-validation.js +20 -0
  511. package/dist/storage/storage-catalog.d.ts +25 -0
  512. package/dist/storage/storage-catalog.js +390 -0
  513. package/dist/storage/storage-layout.d.ts +24 -0
  514. package/dist/storage/storage-layout.js +101 -0
  515. package/dist/storage/storybook-store.js +2 -2
  516. package/dist/storage/supabase-store.js +24 -6
  517. package/dist/storage/tdd-policy-store.js +8 -6
  518. package/dist/storage/tech-debt-store.js +3 -3
  519. package/dist/storage/technology-selection-store.d.ts +1 -1
  520. package/dist/storage/technology-selection-store.js +6 -3
  521. package/dist/storage/token-cache-store.js +3 -3
  522. package/dist/storage/token-ledger-store.js +13 -8
  523. package/dist/storage/transition-log.js +7 -4
  524. package/dist/storage/trash-store.js +15 -6
  525. package/dist/storage/vector-store/migrator.js +7 -2
  526. package/dist/storage/vector-store/sqlite-adapter.js +4 -1
  527. package/dist/storage/webhook-server-store.js +2 -2
  528. package/dist/tools/api-spec-generator-handler.js +3 -2
  529. package/dist/tools/auto-update-handler.d.ts +1 -1
  530. package/dist/tools/auto-update-handler.js +1 -1
  531. package/dist/tools/browser-validate-handler.js +2 -1
  532. package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js +8 -5
  533. package/dist/tools/challenge-spec/scenarios-desktop.js +8 -3
  534. package/dist/tools/challenge-spec/scenarios-failure.js +7 -2
  535. package/dist/tools/challenge-spec/security-challenge-scenarios.js +3 -3
  536. package/dist/tools/clarify-requirements/multiple-choice.js +53 -41
  537. package/dist/tools/comments-handler.js +2 -3
  538. package/dist/tools/compliance-test-handler.js +2 -2
  539. package/dist/tools/configure-telemetry.js +11 -11
  540. package/dist/tools/create-spec/auto-pipeline.js +13 -1
  541. package/dist/tools/create-spec/autopilot-analyzer.d.ts +1 -1
  542. package/dist/tools/create-spec/autopilot-analyzer.js +2 -4
  543. package/dist/tools/create-spec/mcp-tool-contract.d.ts +10 -4
  544. package/dist/tools/create-spec/mcp-tool-contract.js +7 -36
  545. package/dist/tools/create-spec/post-creation.d.ts +2 -1
  546. package/dist/tools/create-spec/post-creation.js +56 -54
  547. package/dist/tools/create-spec/relevance-scorer.d.ts +1 -1
  548. package/dist/tools/create-spec/relevance-scorer.js +17 -1
  549. package/dist/tools/create-spec/spec-builder.js +2 -12
  550. package/dist/tools/create-spec/spec-created-outbox-consumer.d.ts +14 -0
  551. package/dist/tools/create-spec/spec-created-outbox-consumer.js +176 -0
  552. package/dist/tools/create-spec.js +385 -520
  553. package/dist/tools/define-ui-contract/agent-interaction-contract.js +2 -4
  554. package/dist/tools/define-ui-contract-desktop/desktop-contract.js +12 -4
  555. package/dist/tools/define-ui-contract-desktop/native-contract.js +7 -3
  556. package/dist/tools/define-ui-contract-extensions.js +2 -3
  557. package/dist/tools/define-ui-contract-mobile.js +5 -9
  558. package/dist/tools/define-ui-contract-web/component-tree.js +4 -3
  559. package/dist/tools/define-ui-contract.js +7 -4
  560. package/dist/tools/deploy/deploy-spec.js +2 -4
  561. package/dist/tools/deploy/deploy-status.js +2 -4
  562. package/dist/tools/design-schema/nosql-category-schemas.js +2 -3
  563. package/dist/tools/design-schema-sql/migrations.js +3 -2
  564. package/dist/tools/design-schema-sql/tables.js +4 -1
  565. package/dist/tools/design-schema.js +4 -3
  566. package/dist/tools/feedback-handler.js +2 -4
  567. package/dist/tools/gc-data-projects.js +5 -5
  568. package/dist/tools/generate-execution-plan.js +3 -4
  569. package/dist/tools/generate-sub-agent.js +2 -1
  570. package/dist/tools/generate-tests/generators/a11y-tests-generator.js +5 -4
  571. package/dist/tools/generate-tests/generators/advanced-testing-generator.js +5 -4
  572. package/dist/tools/generate-tests/generators/concurrency-test-generator/js-templates.js +9 -4
  573. package/dist/tools/generate-tests/generators/concurrency-test-generator.js +8 -4
  574. package/dist/tools/generate-tests/generators/database/detectors.js +9 -3
  575. package/dist/tools/generate-tests/generators/database/index.js +2 -4
  576. package/dist/tools/generate-tests/generators/event-test-generator.js +5 -4
  577. package/dist/tools/generate-tests/generators/game-tests-generator.js +2 -1
  578. package/dist/tools/generate-tests/generators/graphql-test-generator.js +11 -5
  579. package/dist/tools/generate-tests/generators/grpc-test-generator.js +2 -3
  580. package/dist/tools/generate-tests/generators/llm-security-test-generator.js +4 -3
  581. package/dist/tools/generate-tests/generators/local-first-test-generator.js +4 -3
  582. package/dist/tools/generate-tests/generators/mcp-tests-generator.js +11 -9
  583. package/dist/tools/generate-tests/generators/microservices/index.js +2 -3
  584. package/dist/tools/generate-tests/generators/otel-test-generator.js +6 -3
  585. package/dist/tools/generate-tests/generators/security/detectors.js +2 -5
  586. package/dist/tools/generate-tests/generators/security/index.js +2 -4
  587. package/dist/tools/generate-tests/generators/supply-chain-test-generator.js +2 -3
  588. package/dist/tools/generate-tests/generators/visual-regression-generator.js +14 -17
  589. package/dist/tools/generate-tests/generators/websocket-test-generator.js +2 -3
  590. package/dist/tools/generate-tests/test-helpers.js +11 -12
  591. package/dist/tools/generate-tests-content.js +4 -3
  592. package/dist/tools/generate-tests.js +7 -4
  593. package/dist/tools/git/git-helpers.d.ts +0 -2
  594. package/dist/tools/git/git-helpers.js +7 -7
  595. package/dist/tools/github-pr-handler.js +10 -3
  596. package/dist/tools/heal-spec-docs.js +6 -53
  597. package/dist/tools/hook-generator-handler.js +6 -6
  598. package/dist/tools/init-constitution/platform-principles.js +4 -2
  599. package/dist/tools/init-project/agents-md-writer.js +14 -5
  600. package/dist/tools/init-project/claude-md-generator.js +19 -12
  601. package/dist/tools/init-project/handler.js +165 -73
  602. package/dist/tools/init-project/host-assets-writer.d.ts +1 -1
  603. package/dist/tools/init-project/host-assets-writer.js +4 -2
  604. package/dist/tools/init-project/lifecycle-helpers.js +3 -5
  605. package/dist/tools/init-project/lint-scaffolder.js +6 -2
  606. package/dist/tools/init-project/migration-runner.d.ts +10 -1
  607. package/dist/tools/init-project/migration-runner.js +68 -3
  608. package/dist/tools/init-project/per-client-files-writer.js +14 -4
  609. package/dist/tools/init-project/rules-generator.js +10 -2
  610. package/dist/tools/init-project/scaffold-writer.d.ts +1 -1
  611. package/dist/tools/init-project/scaffold-writer.js +17 -15
  612. package/dist/tools/jobs/handlers.d.ts +15 -0
  613. package/dist/tools/jobs/handlers.js +126 -0
  614. package/dist/tools/list-specs.js +35 -34
  615. package/dist/tools/manage-plugins-handler.js +17 -9
  616. package/dist/tools/migrate-tech/advanced-handlers.js +3 -2
  617. package/dist/tools/migrate-tech/build-tool-handlers.js +3 -2
  618. package/dist/tools/migrate-tech/core-handlers.js +5 -2
  619. package/dist/tools/migrate-tech/data-handlers.js +6 -3
  620. package/dist/tools/migrate-tech-advanced/rollback-handlers.js +3 -2
  621. package/dist/tools/migrate-tech-advanced/service-handlers.js +5 -2
  622. package/dist/tools/oauth-handler.js +7 -1
  623. package/dist/tools/register-sdd-tools.d.ts +1 -1
  624. package/dist/tools/register-sdd-tools.js +5 -0
  625. package/dist/tools/register-spec-tools/core-spec-tools.js +31 -0
  626. package/dist/tools/registry/auth.js +13 -5
  627. package/dist/tools/registry/publish.js +7 -4
  628. package/dist/tools/resolve-project-path.d.ts +2 -2
  629. package/dist/tools/resolve-project-path.js +7 -7
  630. package/dist/tools/reverse-engineer/analyzer.js +14 -14
  631. package/dist/tools/rollback-release.js +3 -2
  632. package/dist/tools/safe-handler.js +295 -171
  633. package/dist/tools/schema-generator-handler.js +2 -1
  634. package/dist/tools/schemas/output-schemas.d.ts +88 -82
  635. package/dist/tools/schemas/output-schemas.js +12 -94
  636. package/dist/tools/schemas/plugins-schemas.js +0 -2
  637. package/dist/tools/schemas/registry.js +0 -2
  638. package/dist/tools/schemas/skill-registry-schemas.js +0 -2
  639. package/dist/tools/schemas/validate-output-schema.d.ts +256 -0
  640. package/dist/tools/schemas/validate-output-schema.js +212 -0
  641. package/dist/tools/sentry-handler.js +6 -1
  642. package/dist/tools/skill-bootstrap-handler.js +7 -4
  643. package/dist/tools/status-handler.js +4 -0
  644. package/dist/tools/storage-bundle-handler.d.ts +9 -0
  645. package/dist/tools/storage-bundle-handler.js +29 -0
  646. package/dist/tools/storage-paths-handler.d.ts +9 -0
  647. package/dist/tools/storage-paths-handler.js +17 -0
  648. package/dist/tools/suggest-mcp-server.js +11 -5
  649. package/dist/tools/suggest-mcps.js +29 -9
  650. package/dist/tools/suggest-tooling/advanced-testing-catalog.js +4 -5
  651. package/dist/tools/suggest-tooling/build-tool-catalog.js +2 -1
  652. package/dist/tools/suggest-tooling/css-framework-catalog.js +13 -7
  653. package/dist/tools/suggest-tooling/framework-catalog.js +3 -5
  654. package/dist/tools/suggest-tooling/frontend-perf-catalog.js +2 -6
  655. package/dist/tools/suggest-tooling/handler.js +10 -4
  656. package/dist/tools/suggest-tooling/hypermedia-catalog.js +11 -3
  657. package/dist/tools/suggest-tooling/linting-catalog.js +4 -7
  658. package/dist/tools/suggest-tooling/llm-security-catalog.js +2 -1
  659. package/dist/tools/suggest-tooling/local-first-catalog.js +7 -5
  660. package/dist/tools/suggest-tooling/observability-catalog.js +3 -4
  661. package/dist/tools/suggest-tooling/otel-catalog.js +4 -1
  662. package/dist/tools/suggest-tooling/resilience-catalog.js +16 -5
  663. package/dist/tools/suggest-tooling/skills-catalog.js +10 -9
  664. package/dist/tools/suggest-tooling/supply-chain-catalog.js +2 -3
  665. package/dist/tools/supabase-handler.js +2 -1
  666. package/dist/tools/token-intelligence-handler.js +2 -2
  667. package/dist/tools/token-recording.js +2 -2
  668. package/dist/tools/token-savings-handler.js +2 -2
  669. package/dist/tools/tool-registry/core-tools.js +131 -0
  670. package/dist/tools/tool-registry/group-infra.js +10 -12
  671. package/dist/tools/tool-registry/group-quality-compliance.js +5 -12
  672. package/dist/tools/update-status/approval-gates.d.ts +13 -0
  673. package/dist/tools/update-status/approval-gates.js +81 -0
  674. package/dist/tools/update-status/batch.js +4 -2
  675. package/dist/tools/update-status/dod-gates.d.ts +6 -24
  676. package/dist/tools/update-status/dod-gates.js +60 -135
  677. package/dist/tools/update-status/done-receipt-verifier.d.ts +15 -0
  678. package/dist/tools/update-status/done-receipt-verifier.js +145 -0
  679. package/dist/tools/update-status/evidence-gate.js +154 -2
  680. package/dist/tools/update-status/file-sync.js +23 -12
  681. package/dist/tools/update-status/gate-harness.d.ts +7 -0
  682. package/dist/tools/update-status/gate-harness.js +8 -0
  683. package/dist/tools/update-status/index.js +228 -325
  684. package/dist/tools/update-status/qa-gate.d.ts +1 -1
  685. package/dist/tools/update-status/qa-gate.js +2 -2
  686. package/dist/tools/update-status/side-effects.js +30 -37
  687. package/dist/tools/update-status/transition-guard.d.ts +4 -2
  688. package/dist/tools/update-status/transition-guard.js +57 -10
  689. package/dist/tools/update-status-convention-gate.js +24 -23
  690. package/dist/tools/update-status-reconcile.js +2 -2
  691. package/dist/tools/validate-api-contract-handler.js +3 -3
  692. package/dist/tools/validate-lint.js +20 -13
  693. package/dist/tools/validate.d.ts +3 -1
  694. package/dist/tools/validate.js +213 -5
  695. package/dist/transports/http-transport.js +84 -61
  696. package/dist/transports/middleware/with-telemetry.js +3 -2
  697. package/dist/types/abortable-process.d.ts +2 -0
  698. package/dist/types/advanced-framework.js +0 -2
  699. package/dist/types/atomic-upgrade.d.ts +71 -0
  700. package/dist/types/atomic-upgrade.js +2 -0
  701. package/dist/types/ci.js +0 -2
  702. package/dist/types/core-bridge.d.ts +78 -1
  703. package/dist/types/crash-shield-framework-rules.d.ts +24 -0
  704. package/dist/types/crash-shield-framework-rules.js +2 -0
  705. package/dist/types/data-gc.d.ts +16 -0
  706. package/dist/types/deploy.js +0 -2
  707. package/dist/types/durable-job.d.ts +78 -0
  708. package/dist/types/durable-job.js +2 -0
  709. package/dist/types/durable-validation.d.ts +60 -0
  710. package/dist/types/durable-validation.js +2 -0
  711. package/dist/types/estimation.d.ts +2 -0
  712. package/dist/types/evidence-gates.d.ts +9 -1
  713. package/dist/types/execution.d.ts +43 -0
  714. package/dist/types/handoff-artifacts.d.ts +2 -0
  715. package/dist/types/index.d.ts +2 -0
  716. package/dist/types/index.js +2 -0
  717. package/dist/types/infrastructure.js +0 -2
  718. package/dist/types/lifecycle.js +0 -2
  719. package/dist/types/migration/canonical-storage.d.ts +37 -0
  720. package/dist/types/migration/canonical-storage.js +2 -0
  721. package/dist/types/migration/index.d.ts +1 -1
  722. package/dist/types/native-worker.d.ts +48 -0
  723. package/dist/types/native-worker.js +2 -0
  724. package/dist/types/network-policy.d.ts +12 -0
  725. package/dist/types/network-policy.js +2 -0
  726. package/dist/types/oauth.js +0 -2
  727. package/dist/types/observability.d.ts +32 -0
  728. package/dist/types/outbox-worker.d.ts +35 -0
  729. package/dist/types/outbox-worker.js +11 -0
  730. package/dist/types/permissions-config.d.ts +0 -27
  731. package/dist/types/permissions-config.js +0 -2
  732. package/dist/types/plugin-install.d.ts +0 -11
  733. package/dist/types/plugin-install.js +0 -2
  734. package/dist/types/portal.d.ts +1 -0
  735. package/dist/types/product-public.d.ts +75 -0
  736. package/dist/types/product-public.js +2 -0
  737. package/dist/types/project/inputs.d.ts +2 -0
  738. package/dist/types/project/mfe-detection.js +0 -2
  739. package/dist/types/project/platform-mobile.js +0 -2
  740. package/dist/types/project/platform-specialty.js +0 -2
  741. package/dist/types/project-knowledge-graph.d.ts +7 -0
  742. package/dist/types/runtime-database.d.ts +10 -0
  743. package/dist/types/runtime-database.js +2 -0
  744. package/dist/types/runtime-policy.d.ts +40 -0
  745. package/dist/types/runtime-policy.js +2 -0
  746. package/dist/types/safety.d.ts +4 -5
  747. package/dist/types/schema-registry.d.ts +12 -0
  748. package/dist/types/schema-registry.js +2 -0
  749. package/dist/types/security.d.ts +52 -0
  750. package/dist/types/skill-registry.js +0 -2
  751. package/dist/types/spec/inputs.d.ts +2 -0
  752. package/dist/types/spec-lock-v2.d.ts +13 -7
  753. package/dist/types/spec-lock-v2.js +1 -1
  754. package/dist/types/spec-registry.js +0 -2
  755. package/dist/types/storage-bundle.d.ts +13 -0
  756. package/dist/types/storage-bundle.js +2 -0
  757. package/dist/types/storage-catalog.d.ts +18 -0
  758. package/dist/types/storage-catalog.js +2 -0
  759. package/dist/types/team-planner.js +0 -2
  760. package/dist/types/technology-registry.d.ts +35 -0
  761. package/dist/types/technology-registry.js +2 -0
  762. package/dist/types/technology-symbols.generated.d.ts +117 -0
  763. package/dist/types/technology-symbols.generated.js +2 -0
  764. package/dist/types/telemetry.d.ts +3 -3
  765. package/dist/types/transport.d.ts +2 -0
  766. package/dist/types/validate-worker.d.ts +44 -0
  767. package/dist/types/validate-worker.js +2 -0
  768. package/dist/types/validation-evidence.d.ts +1 -1
  769. package/dist/types/validation-receipt.d.ts +104 -0
  770. package/dist/types/validation-receipt.js +2 -0
  771. package/package.json +31 -20
  772. package/planu-native.json +1 -1
  773. package/planu-plugin.json +1 -1
  774. package/dist/engine/telemetry/geo-resolver.d.ts +0 -9
  775. package/dist/engine/telemetry/geo-resolver.js +0 -43
  776. package/dist/storage/data-dir-discovery.d.ts +0 -31
  777. package/dist/storage/data-dir-discovery.js +0 -140
  778. package/dist/storage/migrations/cwd-to-absolute.d.ts +0 -25
  779. package/dist/storage/migrations/cwd-to-absolute.js +0 -281
  780. package/dist/tools/create-spec/adapters/prior-decisions-hint.d.ts +0 -14
  781. package/dist/tools/create-spec/adapters/prior-decisions-hint.js +0 -30
  782. package/dist/tools/init-project/ancestor-data-detector.d.ts +0 -22
  783. package/dist/tools/init-project/ancestor-data-detector.js +0 -81
  784. package/dist/tools/update-status/force-done-audit.d.ts +0 -2
  785. package/dist/tools/update-status/force-done-audit.js +0 -23
  786. package/dist/types/migration/cwd-to-absolute.d.ts +0 -8
  787. package/dist/types/migration/cwd-to-absolute.js +0 -3
@@ -0,0 +1,142 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { z } from 'zod';
4
+ import bundledAuthority from '../config/technology-registry.json' with { type: 'json' };
5
+ import bundledFrameworkCatalog from '../config/framework-registry/index.json' with { type: 'json' };
6
+ import bundledDetectionCatalog from '../config/detection-signals.json' with { type: 'json' };
7
+ const nonBlank = z.string().trim().min(1);
8
+ const relativeJsonFile = nonBlank.regex(/^(?!\/)(?!.*\/\/)(?!.*(?:^|\/)\.{1,2}(?:\/|$))[A-Za-z0-9_-]+(?:\/[A-Za-z0-9_.-]+)*\.json$/u);
9
+ const authoritySchema = z
10
+ .object({
11
+ schemaVersion: z.literal(1),
12
+ frameworkCatalog: relativeJsonFile,
13
+ detectionCatalog: relativeJsonFile,
14
+ symbols: z.record(nonBlank, nonBlank),
15
+ })
16
+ .strict();
17
+ const frameworkSchema = z
18
+ .object({
19
+ id: nonBlank,
20
+ displayName: nonBlank,
21
+ ecosystem: nonBlank,
22
+ frameworkVersion: nonBlank,
23
+ lastUpdated: nonBlank,
24
+ file: relativeJsonFile,
25
+ })
26
+ .strict();
27
+ const signalSchema = z
28
+ .object({
29
+ frameworkId: nonBlank,
30
+ ecosystem: nonBlank,
31
+ type: z.enum(['dependency', 'file', 'env']),
32
+ pattern: nonBlank,
33
+ manager: nonBlank.optional(),
34
+ })
35
+ .strict();
36
+ const targetSchema = z
37
+ .object({
38
+ id: nonBlank,
39
+ type: z.enum(['dependency', 'file', 'env']),
40
+ pattern: nonBlank,
41
+ manager: nonBlank.optional(),
42
+ additionalMatch: nonBlank.optional(),
43
+ })
44
+ .strict();
45
+ const frameworkCatalogSchema = z.object({ frameworks: z.array(frameworkSchema) }).strict();
46
+ const detectionCatalogSchema = z
47
+ .object({
48
+ schemaVersion: z.literal(1),
49
+ description: nonBlank.optional(),
50
+ signals: z.array(signalSchema),
51
+ deployTargets: z.array(targetSchema),
52
+ databases: z.array(targetSchema),
53
+ aliases: z.array(z.object({ alias: nonBlank, canonical: nonBlank }).strict()).default([]),
54
+ })
55
+ .strict();
56
+ let cache;
57
+ function readJsonSource(path) {
58
+ try {
59
+ const source = readFileSync(path, 'utf8');
60
+ return { identity: source, value: JSON.parse(source) };
61
+ }
62
+ catch (error) {
63
+ throw new Error(`TECHNOLOGY_REGISTRY_INVALID: cannot read ${path}`, { cause: error });
64
+ }
65
+ }
66
+ export function parseTechnologyRegistry(input) {
67
+ const authority = authoritySchema.parse(input.authority);
68
+ const frameworks = frameworkCatalogSchema.parse(input.frameworkCatalog).frameworks;
69
+ const detection = detectionCatalogSchema.parse(input.detectionCatalog);
70
+ const duplicates = frameworks.filter((entry, index) => frameworks.slice(0, index).some((candidate) => candidate.id === entry.id));
71
+ if (duplicates.length > 0) {
72
+ throw new Error(`TECHNOLOGY_REGISTRY_INVALID: duplicate framework ${duplicates[0]?.id ?? ''}`);
73
+ }
74
+ const canonicalTerms = new Set([
75
+ ...frameworks.flatMap((entry) => [entry.id, entry.displayName]),
76
+ ...detection.signals.map((entry) => entry.frameworkId),
77
+ ...detection.deployTargets.map((entry) => entry.id),
78
+ ...detection.databases.map((entry) => entry.id),
79
+ ...detection.aliases.flatMap((entry) => [entry.alias, entry.canonical]),
80
+ ].map((term) => term.toLowerCase()));
81
+ for (const [symbol, value] of Object.entries(authority.symbols)) {
82
+ if (!/^technology-[a-z0-9-]+-[a-f0-9]{6}$/u.test(symbol) ||
83
+ !canonicalTerms.has(value.toLowerCase())) {
84
+ throw new Error(`TECHNOLOGY_REGISTRY_INVALID: invalid symbol ${symbol}`);
85
+ }
86
+ }
87
+ return {
88
+ schemaVersion: 1,
89
+ frameworks,
90
+ signals: detection.signals,
91
+ deployTargets: detection.deployTargets,
92
+ databases: detection.databases,
93
+ aliases: detection.aliases,
94
+ symbols: authority.symbols,
95
+ };
96
+ }
97
+ export function technologyValue(symbol) {
98
+ const registry = cache?.registry ?? loadTechnologyRegistry();
99
+ const value = registry.symbols[symbol];
100
+ if (value === undefined) {
101
+ throw new Error(`TECHNOLOGY_REGISTRY_INVALID: unknown symbol ${symbol}`);
102
+ }
103
+ return value;
104
+ }
105
+ export function loadTechnologyRegistry(directory) {
106
+ if (directory === undefined) {
107
+ const identity = JSON.stringify([
108
+ bundledAuthority,
109
+ bundledFrameworkCatalog,
110
+ bundledDetectionCatalog,
111
+ ]);
112
+ if (cache?.identity === identity) {
113
+ return cache.registry;
114
+ }
115
+ const registry = parseTechnologyRegistry({
116
+ authority: bundledAuthority,
117
+ frameworkCatalog: bundledFrameworkCatalog,
118
+ detectionCatalog: bundledDetectionCatalog,
119
+ });
120
+ cache = { identity, registry };
121
+ return registry;
122
+ }
123
+ const authoritySource = readJsonSource(join(directory, 'technology-registry.json'));
124
+ const authority = authoritySchema.parse(authoritySource.value);
125
+ const frameworkSource = readJsonSource(join(directory, authority.frameworkCatalog));
126
+ const detectionSource = readJsonSource(join(directory, authority.detectionCatalog));
127
+ const identity = `${authoritySource.identity}\0${frameworkSource.identity}\0${detectionSource.identity}`;
128
+ if (cache?.identity === identity) {
129
+ return cache.registry;
130
+ }
131
+ const registry = parseTechnologyRegistry({
132
+ authority,
133
+ frameworkCatalog: frameworkSource.value,
134
+ detectionCatalog: detectionSource.value,
135
+ });
136
+ cache = { identity, registry };
137
+ return registry;
138
+ }
139
+ export function resetTechnologyRegistryCache() {
140
+ cache = undefined;
141
+ }
142
+ //# sourceMappingURL=technology-registry.js.map
@@ -1,6 +1,5 @@
1
1
  /**
2
- * Returns true when remote error reporting is active (default: on).
3
- * Disabled by setting env var PLANU_TELEMETRY=off.
2
+ * Environment-only fast check. The client also enforces persisted versioned opt-in.
4
3
  */
5
4
  export declare function isErrorReportingEnabled(): boolean;
6
5
  /**
@@ -5,23 +5,21 @@
5
5
  // No PII: only tool name, sanitized error message, version, and Node version are sent.
6
6
  import { sendTelemetryEvent } from './telemetry-client.js';
7
7
  import { PLANU_VERSION } from '../../config/version.js';
8
+ import { redactText } from '../../security/redactor.js';
9
+ import { TELEMETRY_CONSENT_VERSION } from './telemetry-store.js';
8
10
  /**
9
- * Returns true when remote error reporting is active (default: on).
10
- * Disabled by setting env var PLANU_TELEMETRY=off.
11
+ * Environment-only fast check. The client also enforces persisted versioned opt-in.
11
12
  */
12
13
  export function isErrorReportingEnabled() {
13
- return process.env.PLANU_TELEMETRY !== 'off';
14
+ return (process.env.PLANU_TELEMETRY === 'on' &&
15
+ process.env.PLANU_TELEMETRY_CONSENT_VERSION === String(TELEMETRY_CONSENT_VERSION));
14
16
  }
15
17
  /**
16
18
  * Sanitizes an error message by removing filesystem paths and home-dir fragments
17
19
  * so no user-specific data is transmitted.
18
20
  */
19
21
  export function sanitizeErrorMessage(message) {
20
- return message
21
- .replace(/\/Users\/[^\s/]+/g, '/[user]')
22
- .replace(/\/home\/[^\s/]+/g, '/[user]')
23
- .replace(/C:\\Users\\[^\s\\]+/g, 'C:\\[user]')
24
- .slice(0, 300);
22
+ return redactText(message).slice(0, 300);
25
23
  }
26
24
  /** Patterns in error messages that indicate a gate/policy block (not an exception). */
27
25
  const BLOCKED_PATTERNS = [
@@ -51,21 +49,19 @@ export function classifyToolEvent(errorMessage, errorType) {
51
49
  * Call this from safe-handler catch blocks after returning isError:true to the user.
52
50
  */
53
51
  export function reportToolError(toolName, error) {
54
- if (!isErrorReportingEnabled()) {
52
+ if (process.env.PLANU_TELEMETRY === 'off') {
55
53
  return;
56
54
  }
57
- const rawMessage = error instanceof Error ? error.message : String(error);
58
- const message = sanitizeErrorMessage(rawMessage);
55
+ const errorClass = error instanceof Error ? error.name : typeof error;
59
56
  sendTelemetryEvent({
60
57
  event: 'tool_error',
61
58
  properties: {
62
59
  tool: toolName,
63
- message,
64
60
  errorType: 'exception',
61
+ errorClass,
65
62
  planVersion: PLANU_VERSION,
66
63
  nodeVersion: process.version,
67
64
  },
68
- installationId: 'anonymous',
69
65
  });
70
66
  }
71
67
  /**
@@ -75,21 +71,18 @@ export function reportToolError(toolName, error) {
75
71
  * Fire-and-forget — never throws.
76
72
  */
77
73
  export function reportToolValidationError(toolName, message) {
78
- if (!isErrorReportingEnabled()) {
74
+ if (process.env.PLANU_TELEMETRY === 'off') {
79
75
  return;
80
76
  }
81
- const sanitized = sanitizeErrorMessage(message);
82
- const event = classifyToolEvent(sanitized, 'validation');
77
+ const event = classifyToolEvent(message, 'validation');
83
78
  sendTelemetryEvent({
84
79
  event,
85
80
  properties: {
86
81
  tool: toolName,
87
- message: sanitized,
88
82
  errorType: 'validation',
89
83
  planVersion: PLANU_VERSION,
90
84
  nodeVersion: process.version,
91
85
  },
92
- installationId: 'anonymous',
93
86
  });
94
87
  }
95
88
  //# sourceMappingURL=error-reporter.js.map
@@ -4,6 +4,7 @@ import { readFile } from 'node:fs/promises';
4
4
  import { join } from 'node:path';
5
5
  import { readTelemetryConfig } from './telemetry-store.js';
6
6
  import { sendTelemetryEvent } from './telemetry-client.js';
7
+ import { hashProjectPath, projectDataDir } from '../../storage/base-store.js';
7
8
  const NETWORK_TIMEOUT_MS = 5_000;
8
9
  const RECENT_EVENT_THRESHOLD_DAYS = 7;
9
10
  // ---------------------------------------------------------------------------
@@ -80,11 +81,7 @@ async function checkNetworkReachable(endpoint) {
80
81
  }
81
82
  }
82
83
  async function checkLastEvent(projectPath) {
83
- const candidates = [
84
- join(projectPath, 'data', 'telemetry-events.json'),
85
- join(projectPath, '.planu', 'telemetry-events.json'),
86
- join(projectPath, 'data', 'telemetry.json'),
87
- ];
84
+ const candidates = [join(projectDataDir(hashProjectPath(projectPath)), 'telemetry-events.json')];
88
85
  for (const candidate of candidates) {
89
86
  try {
90
87
  const raw = await readFile(candidate, 'utf-8');
@@ -126,10 +123,7 @@ async function checkLastEvent(projectPath) {
126
123
  };
127
124
  }
128
125
  async function checkErrorLog(projectPath) {
129
- const candidates = [
130
- join(projectPath, 'data', 'telemetry-errors.json'),
131
- join(projectPath, '.planu', 'telemetry-errors.json'),
132
- ];
126
+ const candidates = [join(projectDataDir(hashProjectPath(projectPath)), 'telemetry-errors.json')];
133
127
  for (const candidate of candidates) {
134
128
  try {
135
129
  const raw = await readFile(candidate, 'utf-8');
@@ -196,7 +190,7 @@ async function checkClientVersion(projectPath) {
196
190
  // ---------------------------------------------------------------------------
197
191
  // Test event
198
192
  // ---------------------------------------------------------------------------
199
- function sendTestDiagnosticEvent(installationId) {
193
+ function sendTestDiagnosticEvent() {
200
194
  sendTelemetryEvent({
201
195
  event: 'tool_used',
202
196
  properties: {
@@ -204,7 +198,6 @@ function sendTestDiagnosticEvent(installationId) {
204
198
  diagnostic: true,
205
199
  timestamp: new Date().toISOString(),
206
200
  },
207
- installationId,
208
201
  });
209
202
  }
210
203
  // ---------------------------------------------------------------------------
@@ -284,9 +277,7 @@ export async function checkTelemetryHealth(projectPath, options) {
284
277
  ];
285
278
  const status = computeStatus(enabled, checks);
286
279
  if (options?.sendTestEvent === true) {
287
- const config = await readTelemetryConfig();
288
- const installationId = config?.installationId ?? 'anonymous';
289
- sendTestDiagnosticEvent(installationId);
280
+ sendTestDiagnosticEvent();
290
281
  }
291
282
  return {
292
283
  status,
@@ -1,5 +1,4 @@
1
1
  export * from './telemetry-store.js';
2
2
  export * from './telemetry-client.js';
3
3
  export * from './health-checker.js';
4
- export { resolveGeo, resetGeoCache } from './geo-resolver.js';
5
4
  //# sourceMappingURL=index.d.ts.map
@@ -2,5 +2,4 @@
2
2
  export * from './telemetry-store.js';
3
3
  export * from './telemetry-client.js';
4
4
  export * from './health-checker.js';
5
- export { resolveGeo, resetGeoCache } from './geo-resolver.js';
6
5
  //# sourceMappingURL=index.js.map
@@ -1,6 +1,7 @@
1
1
  // engine/telemetry/stance.ts — Telemetry opt-in stance reader (SPEC-741)
2
2
  import { readFileSync, existsSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
+ import { TELEMETRY_CONSENT_VERSION } from './telemetry-store.js';
4
5
  /**
5
6
  * Returns true if telemetry is enabled for the given project root.
6
7
  * Reads conventions.json synchronously.
@@ -11,7 +12,7 @@ export function isTelemetryEnabled(projectRoot) {
11
12
  return false;
12
13
  }
13
14
  if (process.env.PLANU_TELEMETRY === 'on') {
14
- return true;
15
+ return process.env.PLANU_TELEMETRY_CONSENT_VERSION === String(TELEMETRY_CONSENT_VERSION);
15
16
  }
16
17
  try {
17
18
  const conventionsPath = join(projectRoot, 'planu', 'conventions.json');
@@ -21,7 +22,7 @@ export function isTelemetryEnabled(projectRoot) {
21
22
  const raw = readFileSync(conventionsPath, 'utf-8');
22
23
  const parsed = JSON.parse(raw);
23
24
  const telemetry = parsed.telemetry;
24
- return telemetry?.enabled === true;
25
+ return telemetry?.enabled === true && telemetry.consentVersion === TELEMETRY_CONSENT_VERSION;
25
26
  }
26
27
  catch {
27
28
  return false;
@@ -1,8 +1,4 @@
1
1
  import type { TelemetryEvent } from '../../types/index.js';
2
- /**
3
- * Send a telemetry event to Supabase. Fire-and-forget — never awaited by callers.
4
- * Enriches events with geo data (country/timezone) from a cached IP lookup.
5
- * No PII: properties must not contain paths, emails, or user identifiers.
6
- */
2
+ /** Fire-and-forget; absence or staleness of opt-in prevents any network access. */
7
3
  export declare function sendTelemetryEvent(event: TelemetryEvent): void;
8
4
  //# sourceMappingURL=telemetry-client.d.ts.map
@@ -1,31 +1,46 @@
1
- // engine/telemetry/telemetry-client.ts SPEC-200: Fire-and-forget telemetry POST to Supabase.
2
- // Never throws all errors are silently swallowed to avoid blocking tool responses.
3
- import { resolveGeo } from './geo-resolver.js';
1
+ // Remote telemetry is disabled by default and always crosses consent + redaction boundaries.
2
+ import { networkFetch, withNetworkConsent } from '../network-policy.js';
3
+ import { redactSensitiveValue } from '../../security/redactor.js';
4
+ import { isTelemetryEnabled } from './telemetry-store.js';
4
5
  const SUPABASE_URL = 'https://canusqigtzldstnjddio.supabase.co';
5
6
  const SUPABASE_ANON_KEY = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJzdXBhYmFzZSIsInJlZiI6ImNhbnVzcWlndHpsZHN0bmpkZGlvIiwicm9sZSI6ImFub24iLCJpYXQiOjE3NzI3NTk2MjgsImV4cCI6MjA4ODMzNTYyOH0.Thw1Xgf9_iabOD75J00u35d2k5NsIpUBU9PrqOShxMU';
6
7
  const TELEMETRY_ENDPOINT = `${SUPABASE_URL}/rest/v1/telemetry_events`;
7
- /**
8
- * Send a telemetry event to Supabase. Fire-and-forget — never awaited by callers.
9
- * Enriches events with geo data (country/timezone) from a cached IP lookup.
10
- * No PII: properties must not contain paths, emails, or user identifiers.
11
- */
8
+ const ALLOWED_PROPERTIES = new Set([
9
+ 'allowed',
10
+ 'context',
11
+ 'diagnostic',
12
+ 'duplicateCount',
13
+ 'durationMs',
14
+ 'errorClass',
15
+ 'errorType',
16
+ 'framework',
17
+ 'freeGBObserved',
18
+ 'language',
19
+ 'nodeVersion',
20
+ 'planVersion',
21
+ 'platform',
22
+ 'pressureLevel',
23
+ 'requested',
24
+ 'specCount',
25
+ 'stack',
26
+ 'timestamp',
27
+ 'tool',
28
+ ]);
29
+ function safeProperties(properties) {
30
+ const allowlisted = Object.fromEntries(Object.entries(properties).filter(([key]) => ALLOWED_PROPERTIES.has(key)));
31
+ const redacted = redactSensitiveValue(allowlisted);
32
+ return redacted !== null && typeof redacted === 'object' && !Array.isArray(redacted)
33
+ ? redacted
34
+ : {};
35
+ }
36
+ /** Fire-and-forget; absence or staleness of opt-in prevents any network access. */
12
37
  export function sendTelemetryEvent(event) {
13
- // Enrich with geo data asynchronously, then send
14
- resolveGeo()
15
- .then((geo) => {
16
- const properties = geo
17
- ? {
18
- ...event.properties,
19
- country: geo.countryCode,
20
- timezone: geo.timezone,
21
- }
22
- : event.properties;
23
- const payload = {
24
- event_name: event.event,
25
- properties,
26
- installation_id: event.installationId,
27
- };
28
- return fetch(TELEMETRY_ENDPOINT, {
38
+ void isTelemetryEnabled()
39
+ .then((enabled) => {
40
+ if (!enabled) {
41
+ return undefined;
42
+ }
43
+ return withNetworkConsent('telemetry', (receipt) => networkFetch(receipt, TELEMETRY_ENDPOINT, {
29
44
  method: 'POST',
30
45
  headers: {
31
46
  'Content-Type': 'application/json',
@@ -33,12 +48,13 @@ export function sendTelemetryEvent(event) {
33
48
  Authorization: `Bearer ${SUPABASE_ANON_KEY}`,
34
49
  Prefer: 'return=minimal',
35
50
  },
36
- body: JSON.stringify(payload),
51
+ body: JSON.stringify({
52
+ event_name: event.event,
53
+ properties: safeProperties(event.properties),
54
+ }),
37
55
  signal: AbortSignal.timeout(5_000),
38
- });
56
+ }));
39
57
  })
40
- .catch(() => {
41
- // Silently swallow all errors — telemetry must never break the tool
42
- });
58
+ .catch(() => undefined);
43
59
  }
44
60
  //# sourceMappingURL=telemetry-client.js.map
@@ -1,11 +1,11 @@
1
1
  import type { TelemetryConfig } from '../../types/index.js';
2
+ export declare const TELEMETRY_CONSENT_VERSION: 1;
2
3
  export declare function readTelemetryConfig(): Promise<TelemetryConfig | null>;
3
4
  export declare function writeTelemetryConfig(config: TelemetryConfig): Promise<void>;
4
- export declare function getOrCreateInstallationId(): Promise<string>;
5
5
  /**
6
6
  * Returns true if telemetry is enabled.
7
- * Default: ENABLED (opt-out model). Disable by setting PLANU_TELEMETRY=off
8
- * or by explicitly calling configure_telemetry with enabled=false.
7
+ * Default: disabled. Both environment and stored opt-ins are versioned so a
8
+ * changed privacy contract requires renewed consent.
9
9
  */
10
10
  export declare function isTelemetryEnabled(): Promise<boolean>;
11
11
  /** Returns true if the user has never been shown the opt-in prompt. */
@@ -3,14 +3,25 @@
3
3
  // Stores opt-in preference and installation ID outside the project directory.
4
4
  import { readFile, writeFile, mkdir } from 'node:fs/promises';
5
5
  import { join } from 'node:path';
6
- import { homedir } from 'node:os';
7
- import { randomUUID } from 'node:crypto';
8
- const PLANU_DIR = join(homedir(), '.planu');
6
+ import { resolveStorageLayout } from '../../storage/storage-layout.js';
7
+ const PLANU_DIR = resolveStorageLayout().config;
9
8
  const TELEMETRY_FILE = join(PLANU_DIR, 'telemetry.json');
9
+ export const TELEMETRY_CONSENT_VERSION = 1;
10
10
  export async function readTelemetryConfig() {
11
11
  try {
12
12
  const raw = await readFile(TELEMETRY_FILE, 'utf-8');
13
- return JSON.parse(raw);
13
+ const parsed = JSON.parse(raw);
14
+ const config = {
15
+ enabled: parsed.enabled === true,
16
+ promptedAt: typeof parsed.promptedAt === 'string' ? parsed.promptedAt : '',
17
+ };
18
+ if (typeof parsed.consentVersion === 'number') {
19
+ config.consentVersion = parsed.consentVersion;
20
+ }
21
+ if (parsed.enableObservatory === true) {
22
+ config.enableObservatory = true;
23
+ }
24
+ return config;
14
25
  }
15
26
  catch {
16
27
  return null;
@@ -18,32 +29,28 @@ export async function readTelemetryConfig() {
18
29
  }
19
30
  export async function writeTelemetryConfig(config) {
20
31
  await mkdir(PLANU_DIR, { recursive: true });
21
- await writeFile(TELEMETRY_FILE, JSON.stringify(config, null, 2) + '\n', 'utf-8');
22
- }
23
- export async function getOrCreateInstallationId() {
24
- const config = await readTelemetryConfig();
25
- if (config?.installationId) {
26
- return config.installationId;
27
- }
28
- const id = randomUUID();
29
- await writeTelemetryConfig({
30
- enabled: false,
31
- installationId: id,
32
- promptedAt: '',
33
- });
34
- return id;
32
+ const safeConfig = {
33
+ enabled: config.enabled,
34
+ promptedAt: config.promptedAt,
35
+ consentVersion: config.consentVersion,
36
+ enableObservatory: config.enableObservatory,
37
+ };
38
+ await writeFile(TELEMETRY_FILE, JSON.stringify(safeConfig, null, 2) + '\n', 'utf-8');
35
39
  }
36
40
  /**
37
41
  * Returns true if telemetry is enabled.
38
- * Default: ENABLED (opt-out model). Disable by setting PLANU_TELEMETRY=off
39
- * or by explicitly calling configure_telemetry with enabled=false.
42
+ * Default: disabled. Both environment and stored opt-ins are versioned so a
43
+ * changed privacy contract requires renewed consent.
40
44
  */
41
45
  export async function isTelemetryEnabled() {
42
46
  if (process.env.PLANU_TELEMETRY === 'off') {
43
47
  return false;
44
48
  }
49
+ if (process.env.PLANU_TELEMETRY === 'on') {
50
+ return process.env.PLANU_TELEMETRY_CONSENT_VERSION === String(TELEMETRY_CONSENT_VERSION);
51
+ }
45
52
  const config = await readTelemetryConfig();
46
- return config?.enabled !== false; // default true unless explicitly disabled
53
+ return config?.enabled === true && config.consentVersion === TELEMETRY_CONSENT_VERSION;
47
54
  }
48
55
  /** Returns true if the user has never been shown the opt-in prompt. */
49
56
  export async function hasNeverBeenPrompted() {
@@ -53,11 +60,11 @@ export async function hasNeverBeenPrompted() {
53
60
  /** Mark that the user was shown the opt-in prompt (so we don't show it again). */
54
61
  export async function markAsPrompted() {
55
62
  const existing = await readTelemetryConfig();
56
- const id = existing?.installationId ?? randomUUID();
57
63
  await writeTelemetryConfig({
58
64
  enabled: existing?.enabled ?? false,
59
- installationId: id,
60
65
  promptedAt: new Date().toISOString(),
66
+ consentVersion: existing?.consentVersion,
67
+ enableObservatory: existing?.enableObservatory,
61
68
  });
62
69
  }
63
70
  //# sourceMappingURL=telemetry-store.js.map
@@ -1,11 +1,10 @@
1
- // engine/test-framework-detector/detectors.ts SPEC-018
2
- // Individual testing framework detectors. Pure functions — no I/O.
1
+ import { technologyValue } from '../technology-registry.js';
3
2
  // === Unit test framework detection ===
4
3
  const TESTING_FRAMEWORK_DEPS = [
5
- ['vitest', 'vitest'],
6
- ['jest', 'jest'],
4
+ [technologyValue('technology-vitest-a9127f'), technologyValue('technology-vitest-a9127f')],
5
+ [technologyValue('technology-jest-35e99f'), technologyValue('technology-jest-35e99f')],
7
6
  ['mocha', 'mocha'],
8
- ['pytest', 'pytest'],
7
+ [technologyValue('technology-pytest-2b0121'), technologyValue('technology-pytest-2b0121')],
9
8
  ['junit', 'junit'],
10
9
  ['xunit', 'xunit'],
11
10
  ['rspec', 'rspec'],
@@ -207,7 +206,8 @@ export function detectVisualRegFramework(deps, files) {
207
206
  }
208
207
  }
209
208
  // Playwright with toMatchSnapshot is detected by playwright presence + snapshot usage
210
- if (depSet.has('@playwright/test') || depSet.has('playwright')) {
209
+ if (depSet.has('@playwright/test') ||
210
+ depSet.has(technologyValue('technology-playwright-7827e8'))) {
211
211
  return 'playwright-snapshot';
212
212
  }
213
213
  return null;
@@ -215,8 +215,8 @@ export function detectVisualRegFramework(deps, files) {
215
215
  // === Test double pattern detection ===
216
216
  const TEST_DOUBLE_DEP_MAP = [
217
217
  ['sinon', 'sinon-stub'],
218
- ['vitest', 'vitest-mock'],
219
- ['jest', 'jest-mock'],
218
+ [technologyValue('technology-vitest-a9127f'), 'vitest-mock'],
219
+ [technologyValue('technology-jest-35e99f'), 'jest-mock'],
220
220
  ];
221
221
  export function detectTestDoublePattern(deps, fileContents) {
222
222
  const depSet = new Set(deps.map((d) => d.toLowerCase()));
@@ -1,7 +1,4 @@
1
- // SPEC-597-EXEMPT: canonical mapping (npm-package↔framework, keyword catalogue)
2
- // — must enumerate framework names by design; no detection logic to migrate.
3
- // engine/test-framework-detector/strategy.ts — SPEC-018
4
- // Test strategy selection and full ecosystem detection.
1
+ import { technologyValue } from '../technology-registry.js';
5
2
  import { detectTestingFramework, detectBDDFramework, detectPropertyTestFramework, detectLoadTestFramework, detectChaosFramework, detectVisualRegFramework, detectMutationFramework, detectTestDoublePattern, } from './detectors.js';
6
3
  /**
7
4
  * Select the appropriate test strategy based on project type and stack.
@@ -9,14 +6,16 @@ import { detectTestingFramework, detectBDDFramework, detectPropertyTestFramework
9
6
  export function selectTestStrategy(projectType, stack) {
10
7
  const stackSet = new Set(stack.map((s) => s.toLowerCase()));
11
8
  // Microservices → Honeycomb (more integration, minimal unit and E2E)
12
- if (projectType === 'microservices' || stackSet.has('kubernetes') || stackSet.has('docker')) {
9
+ if (projectType === 'microservices' ||
10
+ stackSet.has(technologyValue('technology-kubernetes-94abcb')) ||
11
+ stackSet.has(technologyValue('technology-docker-d548c5'))) {
13
12
  return 'honeycomb';
14
13
  }
15
14
  // Frontend frameworks → Testing Trophy (more integration than unit)
16
- if (stackSet.has('react') ||
17
- stackSet.has('vue') ||
18
- stackSet.has('angular') ||
19
- stackSet.has('svelte') ||
15
+ if (stackSet.has(technologyValue('technology-react-275976')) ||
16
+ stackSet.has(technologyValue('technology-vue-564382')) ||
17
+ stackSet.has(technologyValue('technology-angular-a39f89')) ||
18
+ stackSet.has(technologyValue('technology-svelte-c190ac')) ||
20
19
  projectType === 'frontend') {
21
20
  return 'testing-trophy';
22
21
  }
@@ -1,5 +1,4 @@
1
- // Planu Agent Test Templates
2
- // SPEC-016a criteria 6 and 20: AI agent test scaffolds.
1
+ import { technologyValue } from '../technology-registry.js';
3
2
  import { generatePytestAgentContent } from './agent-test-pytest.js';
4
3
  // === Test Definitions (criterion 6) ===
5
4
  /**
@@ -82,7 +81,7 @@ export function generateAgentTestDefs(title, testDir) {
82
81
  */
83
82
  export function generateAgentTestContent(title, testFramework) {
84
83
  const slug = title.toLowerCase().replace(/[^a-z0-9]/g, '-');
85
- if (testFramework === 'pytest') {
84
+ if (testFramework === technologyValue('technology-pytest-2b0121')) {
86
85
  return generatePytestAgentContent(title, slug);
87
86
  }
88
87
  return generateVitestAgentContent(title, slug);
@@ -13,7 +13,7 @@ export declare function buildSampleEndpoints(_specTitle: string): ContractSpecEn
13
13
  * Generate a contract spec for the given spec title and knowledge.
14
14
  * Format is auto-detected from project stack.
15
15
  */
16
- export declare function generateContractSpec(specTitle: string, knowledge: ProjectKnowledge): ContractSpec;
16
+ export declare function generateContractSpec(_specTitle: string, knowledge: ProjectKnowledge): ContractSpec;
17
17
  /**
18
18
  * Get the file extension for a given contract format.
19
19
  */