@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
@@ -6,6 +6,7 @@ import { stat, access } from 'node:fs/promises';
6
6
  import { join, dirname } from 'node:path';
7
7
  import { spawnSync } from 'node:child_process';
8
8
  import { constants } from 'node:fs';
9
+ import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
9
10
  // ---------------------------------------------------------------------------
10
11
  // Session-level cache
11
12
  // ---------------------------------------------------------------------------
@@ -22,7 +23,12 @@ async function hasPlanuDir(dir) {
22
23
  const s = await stat(join(dir, 'planu'));
23
24
  return s.isDirectory();
24
25
  }
25
- catch {
26
+ catch (error) {
27
+ if (error.code === 'ENOENT') {
28
+ return false;
29
+ }
30
+ // reliability-optional: PLANU_DIRECTORY_PROBE — inaccessible candidates are skipped
31
+ reportClassifiedDegradation('PLANU_DIRECTORY_PROBE', error);
26
32
  return false;
27
33
  }
28
34
  }
@@ -32,7 +38,12 @@ export async function isAccessible(p) {
32
38
  await access(p, constants.F_OK);
33
39
  return true;
34
40
  }
35
- catch {
41
+ catch (error) {
42
+ if (error.code === 'ENOENT') {
43
+ return false;
44
+ }
45
+ // reliability-optional: PATH_ACCESS_PROBE — callers consume a boolean probe
46
+ reportClassifiedDegradation('PATH_ACCESS_PROBE', error);
36
47
  return false;
37
48
  }
38
49
  }
@@ -48,7 +59,9 @@ function detectGitRootSync() {
48
59
  }
49
60
  return null;
50
61
  }
51
- catch {
62
+ catch (error) {
63
+ // reliability-optional: GIT_ROOT_PROBE — upward directory discovery remains available
64
+ reportClassifiedDegradation('GIT_ROOT_PROBE', error);
52
65
  return null;
53
66
  }
54
67
  }
@@ -1,8 +1,8 @@
1
- import { readJson, writeJson, hashProjectPath } from './base-store.js';
1
+ import { readJson, writeJson, hashProjectPath, projectDataDir } from './base-store.js';
2
2
  import { withFileLock } from './file-mutex.js';
3
3
  function prLinksFile(projectPath) {
4
4
  const hash = hashProjectPath(projectPath);
5
- return `data/projects/${hash}/pr-links.json`;
5
+ return `${projectDataDir(hash)}/pr-links.json`;
6
6
  }
7
7
  /**
8
8
  * Load all PR links for a project.
@@ -2,9 +2,11 @@
2
2
  import { readFile, writeFile, unlink, mkdir } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
4
  import { analyzeCommitRecord } from '../engine/project-drift-detector.js';
5
+ import { hashProjectPath, projectDataDir } from './base-store.js';
6
+ import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
5
7
  const DRIFT_FILE = 'drift-commits.ndjson';
6
8
  function driftFilePath(projectPath) {
7
- return join(projectPath, '.planu', DRIFT_FILE);
9
+ return join(projectDataDir(hashProjectPath(projectPath)), DRIFT_FILE);
8
10
  }
9
11
  /**
10
12
  * Read all unprocessed DriftCommitRecords from .planu/drift-commits.ndjson.
@@ -25,14 +27,20 @@ export async function readDriftCommits(projectPath) {
25
27
  records.push(parsed);
26
28
  }
27
29
  }
28
- catch {
29
- /* skip malformed lines */
30
+ catch (error) {
31
+ /* reliability-compat: MALFORMED_DRIFT_LINE — skip malformed historical lines */
32
+ reportClassifiedDegradation('MALFORMED_DRIFT_LINE', error);
33
+ continue;
30
34
  }
31
35
  }
32
36
  return records;
33
37
  }
34
- catch {
35
- return [];
38
+ catch (error) {
39
+ if (error.code === 'ENOENT' ||
40
+ (error instanceof Error && error.message === 'ENOENT')) {
41
+ return [];
42
+ }
43
+ throw new Error('Project drift queue is unreadable.', { cause: error });
36
44
  }
37
45
  }
38
46
  /**
@@ -68,8 +76,12 @@ export async function clearDriftCommits(projectPath) {
68
76
  try {
69
77
  await unlink(driftFilePath(projectPath));
70
78
  }
71
- catch {
72
- /* file doesn't exist that's fine */
79
+ catch (error) {
80
+ /* reliability-cleanup: ABSENT_DRIFT_FILEidempotent removal */
81
+ if (!(error instanceof Error && 'code' in error && error.code === 'ENOENT')) {
82
+ throw error;
83
+ }
84
+ reportClassifiedDegradation('ABSENT_DRIFT_FILE', error);
73
85
  }
74
86
  }
75
87
  /**
@@ -77,7 +89,7 @@ export async function clearDriftCommits(projectPath) {
77
89
  * Used by tests and the post-commit hook (via shell).
78
90
  */
79
91
  export async function appendDriftCommit(projectPath, record) {
80
- const dir = join(projectPath, '.planu');
92
+ const dir = projectDataDir(hashProjectPath(projectPath));
81
93
  await mkdir(dir, { recursive: true });
82
94
  const line = JSON.stringify(record) + '\n';
83
95
  await writeFile(driftFilePath(projectPath), line, { flag: 'a', encoding: 'utf-8' });
@@ -0,0 +1,32 @@
1
+ import { type StorageLayout } from './storage-layout.js';
2
+ export interface ProjectIdentity {
3
+ readonly schemaVersion: 1;
4
+ readonly logicalProjectId: string;
5
+ readonly createdAt: string;
6
+ readonly forkedFrom?: string;
7
+ }
8
+ export interface WorkspaceIdentity {
9
+ readonly schemaVersion: 1;
10
+ readonly workspaceId: string;
11
+ readonly logicalProjectId: string;
12
+ readonly createdAt: string;
13
+ }
14
+ export interface ResolvedProjectIdentity {
15
+ readonly project: ProjectIdentity;
16
+ readonly workspace: WorkspaceIdentity;
17
+ readonly canonicalProjectPath: string;
18
+ }
19
+ export interface ProjectIdentityOptions {
20
+ readonly workspaceKey: string;
21
+ readonly layout?: StorageLayout;
22
+ }
23
+ /** Canonicalize a path without making it an identity source. */
24
+ export declare function canonicalizeProjectPath(projectPath: string): Promise<string>;
25
+ export declare function hashWorkspaceKey(workspaceKey: string): string;
26
+ /** Derive a move-stable local checkout key from filesystem identity when available. */
27
+ export declare function deriveWorkspaceKey(projectPath: string): Promise<string>;
28
+ /** Resolve or create stable project and machine-workspace UUIDs. */
29
+ export declare function ensureProjectIdentity(projectPath: string, options: ProjectIdentityOptions): Promise<ResolvedProjectIdentity>;
30
+ /** Explicitly turn a copied project into an independent logical project. */
31
+ export declare function forkProjectIdentity(projectPath: string, options: ProjectIdentityOptions): Promise<ResolvedProjectIdentity>;
32
+ //# sourceMappingURL=project-identity.d.ts.map
@@ -0,0 +1,194 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { mkdir, open, readFile, realpath, rename, rm, stat } from 'node:fs/promises';
3
+ import { basename, dirname, join, normalize, resolve, sep } from 'node:path';
4
+ import { resolveStorageLayout } from './storage-layout.js';
5
+ const IDENTITY_VERSION = 1;
6
+ const UUID_PATTERN = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
7
+ function isProjectIdentity(value) {
8
+ if (!value || typeof value !== 'object') {
9
+ return false;
10
+ }
11
+ const candidate = value;
12
+ return (candidate.schemaVersion === IDENTITY_VERSION &&
13
+ typeof candidate.logicalProjectId === 'string' &&
14
+ UUID_PATTERN.test(candidate.logicalProjectId) &&
15
+ typeof candidate.createdAt === 'string' &&
16
+ (candidate.forkedFrom === undefined || UUID_PATTERN.test(candidate.forkedFrom)));
17
+ }
18
+ function isWorkspaceIdentity(value) {
19
+ if (!value || typeof value !== 'object') {
20
+ return false;
21
+ }
22
+ const candidate = value;
23
+ return (candidate.schemaVersion === IDENTITY_VERSION &&
24
+ typeof candidate.workspaceId === 'string' &&
25
+ UUID_PATTERN.test(candidate.workspaceId) &&
26
+ typeof candidate.logicalProjectId === 'string' &&
27
+ UUID_PATTERN.test(candidate.logicalProjectId) &&
28
+ typeof candidate.createdAt === 'string');
29
+ }
30
+ async function readValidated(filePath, validate) {
31
+ try {
32
+ const value = JSON.parse(await readFile(filePath, 'utf8'));
33
+ if (!validate(value)) {
34
+ throw new Error(`[Planu] Invalid identity document: ${filePath}`);
35
+ }
36
+ return value;
37
+ }
38
+ catch (error) {
39
+ if (error instanceof Error && 'code' in error && error.code === 'ENOENT') {
40
+ return undefined;
41
+ }
42
+ throw error;
43
+ }
44
+ }
45
+ async function createExclusiveJson(filePath, value) {
46
+ await mkdir(dirname(filePath), { recursive: true });
47
+ try {
48
+ const handle = await open(filePath, 'wx', 0o600);
49
+ try {
50
+ await handle.writeFile(`${JSON.stringify(value, null, 2)}\n`, 'utf8');
51
+ await handle.sync();
52
+ }
53
+ finally {
54
+ await handle.close();
55
+ }
56
+ return value;
57
+ }
58
+ catch (error) {
59
+ if (error instanceof Error && 'code' in error && error.code === 'EEXIST') {
60
+ throw error;
61
+ }
62
+ throw error;
63
+ }
64
+ }
65
+ /** Canonicalize a path without making it an identity source. */
66
+ export async function canonicalizeProjectPath(projectPath) {
67
+ if (!projectPath.trim()) {
68
+ throw new Error('[Planu] projectPath is required');
69
+ }
70
+ const absolute = resolve(projectPath);
71
+ const info = await stat(absolute);
72
+ if (!info.isDirectory()) {
73
+ throw new Error('[Planu] projectPath must be a directory');
74
+ }
75
+ const physical = normalize(await realpath(absolute));
76
+ const slashNormalized = sep === '\\' ? physical.replaceAll('\\', '/') : physical;
77
+ return process.platform === 'win32' ? slashNormalized.toLowerCase() : slashNormalized;
78
+ }
79
+ export function hashWorkspaceKey(workspaceKey) {
80
+ const normalizedKey = workspaceKey.trim();
81
+ if (!normalizedKey || normalizedKey.length > 1_024) {
82
+ throw new Error('[Planu] workspaceKey is required and must not exceed 1024 characters');
83
+ }
84
+ return createHash('sha256').update(normalizedKey).digest('hex');
85
+ }
86
+ /** Derive a move-stable local checkout key from filesystem identity when available. */
87
+ export async function deriveWorkspaceKey(projectPath) {
88
+ const canonicalPath = await canonicalizeProjectPath(projectPath);
89
+ const info = await stat(canonicalPath);
90
+ if (info.dev !== 0 && info.ino !== 0) {
91
+ return `fs:${process.platform}:${info.dev.toString()}:${info.ino.toString()}`;
92
+ }
93
+ // Filesystems without stable inode identity still remain isolated by physical path.
94
+ return `path:${process.platform}:${canonicalPath}`;
95
+ }
96
+ function workspaceIdentityPath(layout, workspaceKey, logicalProjectId) {
97
+ const keyHash = hashWorkspaceKey(workspaceKey);
98
+ return join(layout.state, 'workspaces', 'identities', keyHash, `${logicalProjectId}.json`);
99
+ }
100
+ async function ensureProjectDocument(projectPath) {
101
+ const filePath = join(projectPath, 'planu', 'project.json');
102
+ const existing = await readValidated(filePath, isProjectIdentity);
103
+ if (existing) {
104
+ return existing;
105
+ }
106
+ const created = {
107
+ schemaVersion: IDENTITY_VERSION,
108
+ logicalProjectId: randomUUID(),
109
+ createdAt: new Date().toISOString(),
110
+ };
111
+ try {
112
+ return await createExclusiveJson(filePath, created);
113
+ }
114
+ catch (error) {
115
+ if (error instanceof Error && 'code' in error && error.code === 'EEXIST') {
116
+ const raced = await readValidated(filePath, isProjectIdentity);
117
+ if (raced) {
118
+ return raced;
119
+ }
120
+ }
121
+ throw error;
122
+ }
123
+ }
124
+ async function ensureWorkspaceDocument(layout, workspaceKey, logicalProjectId) {
125
+ const filePath = workspaceIdentityPath(layout, workspaceKey, logicalProjectId);
126
+ const existing = await readValidated(filePath, isWorkspaceIdentity);
127
+ if (existing) {
128
+ if (existing.logicalProjectId !== logicalProjectId) {
129
+ throw new Error('[Planu] Workspace identity belongs to a different logical project');
130
+ }
131
+ return existing;
132
+ }
133
+ const created = {
134
+ schemaVersion: IDENTITY_VERSION,
135
+ workspaceId: randomUUID(),
136
+ logicalProjectId,
137
+ createdAt: new Date().toISOString(),
138
+ };
139
+ try {
140
+ return await createExclusiveJson(filePath, created);
141
+ }
142
+ catch (error) {
143
+ if (error instanceof Error && 'code' in error && error.code === 'EEXIST') {
144
+ const raced = await readValidated(filePath, isWorkspaceIdentity);
145
+ if (raced) {
146
+ return raced;
147
+ }
148
+ }
149
+ throw error;
150
+ }
151
+ }
152
+ /** Resolve or create stable project and machine-workspace UUIDs. */
153
+ export async function ensureProjectIdentity(projectPath, options) {
154
+ const canonicalProjectPath = await canonicalizeProjectPath(projectPath);
155
+ const project = await ensureProjectDocument(canonicalProjectPath);
156
+ const workspace = await ensureWorkspaceDocument(options.layout ?? resolveStorageLayout(), options.workspaceKey, project.logicalProjectId);
157
+ return { project, workspace, canonicalProjectPath };
158
+ }
159
+ /** Explicitly turn a copied project into an independent logical project. */
160
+ export async function forkProjectIdentity(projectPath, options) {
161
+ const canonicalProjectPath = await canonicalizeProjectPath(projectPath);
162
+ const identityPath = join(canonicalProjectPath, 'planu', 'project.json');
163
+ const previous = await readValidated(identityPath, isProjectIdentity);
164
+ if (!previous) {
165
+ throw new Error('[Planu] Cannot fork a project without an existing identity');
166
+ }
167
+ const next = {
168
+ schemaVersion: IDENTITY_VERSION,
169
+ logicalProjectId: randomUUID(),
170
+ createdAt: new Date().toISOString(),
171
+ forkedFrom: previous.logicalProjectId,
172
+ };
173
+ // Prepare the new workspace document first. A crash before the identity rename
174
+ // leaves only an unreachable orphan; a crash after it leaves a complete pair.
175
+ const workspace = await ensureWorkspaceDocument(options.layout ?? resolveStorageLayout(), options.workspaceKey, next.logicalProjectId);
176
+ const temporary = join(dirname(identityPath), `.${basename(identityPath)}.${randomUUID()}.tmp`);
177
+ const handle = await open(temporary, 'wx', 0o600);
178
+ try {
179
+ await handle.writeFile(`${JSON.stringify(next, null, 2)}\n`, 'utf8');
180
+ await handle.sync();
181
+ }
182
+ finally {
183
+ await handle.close();
184
+ }
185
+ try {
186
+ await rename(temporary, identityPath);
187
+ }
188
+ catch (error) {
189
+ await rm(temporary, { force: true });
190
+ throw error;
191
+ }
192
+ return { project: next, workspace, canonicalProjectPath };
193
+ }
194
+ //# sourceMappingURL=project-identity.js.map
@@ -6,6 +6,7 @@ import { access } from 'node:fs/promises';
6
6
  import { join } from 'node:path';
7
7
  import { getKnowledge, saveKnowledge } from './knowledge-store/knowledge.js';
8
8
  import { hashProjectPath, projectDataDir } from './base-store.js';
9
+ import { reportClassifiedDegradation } from '../errors/classified-degradation.js';
9
10
  /**
10
11
  * Check whether a file/directory path exists on disk (no-throw helper).
11
12
  */
@@ -14,8 +15,12 @@ async function pathExists(p) {
14
15
  await access(p);
15
16
  return true;
16
17
  }
17
- catch {
18
- return false;
18
+ catch (error) {
19
+ if (error.code === 'ENOENT' ||
20
+ (error instanceof Error && error.message === 'ENOENT')) {
21
+ return false;
22
+ }
23
+ throw error;
19
24
  }
20
25
  }
21
26
  /**
@@ -51,7 +56,7 @@ export async function resolveProjectFromPath(projectPath) {
51
56
  ]);
52
57
  let matchedFingerprint = null;
53
58
  if (dataDirExists) {
54
- matchedFingerprint = `data/projects/${projectId}/ exists`;
59
+ matchedFingerprint = 'canonical project data exists';
55
60
  }
56
61
  else if (planuDirExists && (statusJsonExists || specsDirExists)) {
57
62
  matchedFingerprint = statusJsonExists
@@ -66,8 +71,9 @@ export async function resolveProjectFromPath(projectPath) {
66
71
  try {
67
72
  await saveKnowledge(projectId, minimalKnowledge);
68
73
  }
69
- catch {
70
- // If save fails, still return the minimal knowledge so the caller can proceed this call
74
+ catch (error) {
75
+ // reliability-optional: MINIMAL_KNOWLEDGE_CACHE caller can proceed with in-memory knowledge
76
+ reportClassifiedDegradation('MINIMAL_KNOWLEDGE_CACHE', error);
71
77
  }
72
78
  // Log the silent recovery for observability (best-effort, fire-and-forget)
73
79
  void logSilentRecovery(projectId, projectPath, matchedFingerprint);
@@ -87,8 +93,9 @@ async function logSilentRecovery(projectId, projectPath, reason) {
87
93
  ...{ event: 'silent_project_recovery', projectPath, reason },
88
94
  });
89
95
  }
90
- catch {
91
- // best-effort — log failure must never block project resolution
96
+ catch (error) {
97
+ // reliability-optional: RECOVERY_OBSERVABILITY_LOG — log failure must not block resolution
98
+ reportClassifiedDegradation('RECOVERY_OBSERVABILITY_LOG', error);
92
99
  }
93
100
  }
94
101
  /** Build a minimal but valid ProjectKnowledge entry for a recovered project. */
@@ -1,14 +1,10 @@
1
1
  // storage/release-notes-store.ts — SPEC-438: Persistence for release notes config
2
2
  import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
3
  import { join, dirname } from 'node:path';
4
- import { createHash } from 'node:crypto';
5
- import { safeJsonParse } from './base-store.js';
6
- function hashProjectPath(p) {
7
- return createHash('sha256').update(p).digest('hex').slice(0, 16);
8
- }
4
+ import { hashProjectPath, projectDataDir, safeJsonParse } from './base-store.js';
9
5
  function configFile(projectPath) {
10
6
  const hash = hashProjectPath(projectPath);
11
- return join('data', 'projects', hash, 'release-notes-config.json');
7
+ return join(projectDataDir(hash), 'release-notes-config.json');
12
8
  }
13
9
  /**
14
10
  * Load the release notes config for a project.
@@ -0,0 +1,186 @@
1
+ export type RuntimeRecordKind = 'mutation' | 'index' | 'audit-state';
2
+ export interface RuntimeDatabaseOptions {
3
+ readonly path: string;
4
+ readonly busyTimeoutMs?: number;
5
+ readonly checkIntegrity?: boolean;
6
+ readonly maxConnections?: number;
7
+ }
8
+ export interface RuntimeRecord {
9
+ readonly projectId: string;
10
+ readonly workspaceId: string;
11
+ readonly kind: RuntimeRecordKind;
12
+ readonly key: string;
13
+ readonly value: unknown;
14
+ readonly sourceDigest?: string;
15
+ readonly updatedAt: string;
16
+ }
17
+ export interface RuntimeOutboxRecord {
18
+ readonly id: number;
19
+ readonly projectId: string;
20
+ readonly workspaceId: string;
21
+ readonly topic: string;
22
+ readonly payload: unknown;
23
+ readonly createdAt: string;
24
+ readonly deliveredAt?: string;
25
+ }
26
+ export interface RuntimeOutboxScope {
27
+ readonly projectId: string;
28
+ readonly workspaceId: string;
29
+ }
30
+ export interface RuntimeAuditRecord {
31
+ readonly id: number;
32
+ readonly projectId: string;
33
+ readonly workspaceId: string;
34
+ readonly eventType: string;
35
+ readonly payload: unknown;
36
+ readonly createdAt: string;
37
+ }
38
+ export interface RuntimeProjectBundle {
39
+ readonly schemaVersion: 1;
40
+ readonly projectId: string;
41
+ readonly records: readonly RuntimeRecord[];
42
+ readonly jobs: readonly Record<string, unknown>[];
43
+ readonly outbox: readonly Record<string, unknown>[];
44
+ readonly audit: readonly Record<string, unknown>[];
45
+ }
46
+ export declare const DURABLE_JOB_STATES: readonly ['accepted', 'running', 'checkpointed', 'cancelled', 'failed', 'dead-letter', 'completed'];
47
+ export type DurableJobState = (typeof DURABLE_JOB_STATES)[number];
48
+ export interface DurableJobRecord {
49
+ readonly id: string;
50
+ readonly projectId: string;
51
+ readonly workspaceId: string;
52
+ readonly state: DurableJobState;
53
+ readonly payload: unknown;
54
+ readonly checkpoint?: unknown;
55
+ readonly result?: unknown;
56
+ readonly error?: string;
57
+ readonly attempts: number;
58
+ readonly maxAttempts: number;
59
+ readonly cancelRequested: boolean;
60
+ readonly leaseOwner?: string;
61
+ readonly leaseExpiresAt?: string;
62
+ readonly fencingToken: number;
63
+ readonly createdAt: string;
64
+ readonly updatedAt: string;
65
+ }
66
+ export interface JobLeaseInput {
67
+ readonly id: string;
68
+ readonly projectId: string;
69
+ readonly workspaceId: string;
70
+ readonly workerId: string;
71
+ readonly leaseMs: number;
72
+ readonly fencingToken?: number;
73
+ readonly now?: string;
74
+ }
75
+ export interface RuntimeWorkspaceRecovery {
76
+ readonly schemaVersion: 4;
77
+ readonly projectId: string;
78
+ readonly workspaceId: string;
79
+ readonly records: readonly RuntimeRecord[];
80
+ readonly jobs: readonly DurableJobRecord[];
81
+ readonly outbox: readonly RuntimeOutboxRecord[];
82
+ readonly audit: readonly RuntimeAuditRecord[];
83
+ }
84
+ export declare class RuntimeDatabaseCorruptionError extends Error {
85
+ readonly databasePath: string;
86
+ readonly detail: string;
87
+ constructor(databasePath: string, detail: string);
88
+ }
89
+ export declare class RuntimeDatabaseResourceExhaustedError extends Error {
90
+ readonly databasePath: string;
91
+ readonly maxConnections: number;
92
+ constructor(databasePath: string, maxConnections: number);
93
+ }
94
+ /** A bounded (one connection), transactional SQLite runtime store. */
95
+ export declare class RuntimeDatabase implements Disposable {
96
+ readonly path: string;
97
+ readonly schemaVersion = 4;
98
+ private readonly database;
99
+ private readonly connectionKey;
100
+ private closed;
101
+ private inTransaction;
102
+ constructor(options: RuntimeDatabaseOptions);
103
+ private releaseConnection;
104
+ private assertOpen;
105
+ private migrate;
106
+ assertIntegrity(): void;
107
+ journalMode(): string;
108
+ transaction<T>(operation: () => T): T;
109
+ /** Run a consistent read-only snapshot without acquiring an immediate writer lock. */
110
+ snapshot<T>(operation: () => T): T;
111
+ putRecord(record: Omit<RuntimeRecord, 'updatedAt'> & {
112
+ readonly updatedAt?: string;
113
+ }): void;
114
+ getRecord(projectId: string, workspaceId: string, kind: RuntimeRecordKind, key: string): RuntimeRecord | undefined;
115
+ listRecords(projectId: string, workspaceId: string, kind?: RuntimeRecordKind): readonly RuntimeRecord[];
116
+ enqueueJob(input: {
117
+ readonly id: string;
118
+ readonly projectId: string;
119
+ readonly workspaceId: string;
120
+ readonly payload: unknown;
121
+ readonly maxAttempts?: number;
122
+ }): void;
123
+ getJob(projectId: string, workspaceId: string, id: string): DurableJobRecord | undefined;
124
+ listJobs(projectId: string, workspaceId: string): readonly DurableJobRecord[];
125
+ listRunnableJobScopes(): readonly {
126
+ projectId: string;
127
+ workspaceId: string;
128
+ }[];
129
+ claimJob(input: JobLeaseInput): DurableJobRecord | undefined;
130
+ renewJobLease(input: JobLeaseInput): boolean;
131
+ recordJobProgress(input: JobLeaseInput & {
132
+ readonly checkpoint: unknown;
133
+ }): DurableJobRecord;
134
+ checkpointJob(input: JobLeaseInput & {
135
+ readonly checkpoint: unknown;
136
+ }): DurableJobRecord;
137
+ completeJob(input: JobLeaseInput & {
138
+ readonly result: unknown;
139
+ }): DurableJobRecord;
140
+ failJob(input: JobLeaseInput & {
141
+ readonly error: string;
142
+ }): DurableJobRecord;
143
+ retryJob(projectId: string, workspaceId: string, id: string): DurableJobRecord;
144
+ restartJob(projectId: string, workspaceId: string, id: string): DurableJobRecord;
145
+ restartJobWithPayload(projectId: string, workspaceId: string, id: string, payload: unknown): DurableJobRecord;
146
+ cancelJob(projectId: string, workspaceId: string, id: string): DurableJobRecord;
147
+ private archiveCheckpointBeforeRestart;
148
+ recoverExpiredJobs(now?: string, projectId?: string, workspaceId?: string): number;
149
+ private requireLeasedJob;
150
+ private finishLeasedUpdate;
151
+ enqueueOutbox(input: {
152
+ readonly projectId: string;
153
+ readonly workspaceId: string;
154
+ readonly topic: string;
155
+ readonly payload: unknown;
156
+ }): number;
157
+ listOutbox(projectId: string, workspaceId: string, options?: {
158
+ readonly pendingOnly?: boolean;
159
+ readonly limit?: number;
160
+ readonly topics?: readonly string[];
161
+ }): readonly RuntimeOutboxRecord[];
162
+ listPendingOutboxScopes(): readonly RuntimeOutboxScope[];
163
+ markOutboxDelivered(projectId: string, workspaceId: string, id: number, deliveredAt?: string): boolean;
164
+ appendAudit(input: {
165
+ readonly projectId: string;
166
+ readonly workspaceId: string;
167
+ readonly eventType: string;
168
+ readonly payload: unknown;
169
+ }): number;
170
+ listAudit(projectId: string, workspaceId: string, options?: {
171
+ readonly afterId?: number;
172
+ readonly limit?: number;
173
+ }): readonly RuntimeAuditRecord[];
174
+ /** Recover every authoritative mutable family for one isolated workspace. */
175
+ recoverWorkspace(projectId: string, workspaceId: string): RuntimeWorkspaceRecovery;
176
+ exportProject(projectId: string): RuntimeProjectBundle;
177
+ private exportProjectSnapshot;
178
+ private importJob;
179
+ private assertLedgerIdAvailable;
180
+ private importOutbox;
181
+ private importAudit;
182
+ importProject(bundle: RuntimeProjectBundle): void;
183
+ close(): void;
184
+ [Symbol.dispose](): void;
185
+ }
186
+ //# sourceMappingURL=runtime-db.d.ts.map