@planu/cli 5.3.68 → 5.3.69

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 (376) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/dist/.planu-build.json +1 -1
  3. package/dist/cli/commands/install.d.ts +2 -15
  4. package/dist/core/shared/fs.d.ts +11 -0
  5. package/dist/core/shared/fs.js +90 -0
  6. package/dist/core/shared/strings.d.ts +3 -0
  7. package/dist/core/shared/strings.js +13 -0
  8. package/dist/engine/actuals/git-analyzer.js +1 -1
  9. package/dist/engine/actuals/progress-parser.js +1 -3
  10. package/dist/engine/agent-handoff-store.js +1 -0
  11. package/dist/engine/agent-squad/dispatcher.js +1 -0
  12. package/dist/engine/agent-telemetry.js +1 -0
  13. package/dist/engine/auth/config.js +1 -0
  14. package/dist/engine/auto-updater/atomic-upgrade.js +1 -0
  15. package/dist/engine/auto-updater/index.js +1 -0
  16. package/dist/engine/autopilot/action-registry.js +20 -0
  17. package/dist/engine/autopilot/audit-logger.js +1 -0
  18. package/dist/engine/autopilot/bootstrap.js +9 -2
  19. package/dist/engine/autopilot/complete-loop.js +4 -0
  20. package/dist/engine/autopilot/crash-shield-rate-limiter.js +1 -0
  21. package/dist/engine/autopilot/event-bus.js +1 -0
  22. package/dist/engine/autopilot/state-updater.js +6 -0
  23. package/dist/engine/browser-validator.js +1 -3
  24. package/dist/engine/build-tool-detector.js +1 -8
  25. package/dist/engine/bundle-installer.js +2 -10
  26. package/dist/engine/cascade-hooks/core/append-releases.js +1 -0
  27. package/dist/engine/cascade-hooks/core/write-session-json.js +2 -2
  28. package/dist/engine/cascade-hooks/hooks/dispatch-hook-event.hook.d.ts +3 -1
  29. package/dist/engine/cascade-hooks/hooks/dispatch-hook-event.hook.js +12 -3
  30. package/dist/engine/cascade-hooks/hooks/estimate-calibration.hook.js +1 -0
  31. package/dist/engine/cascade-hooks/hooks/housekeeping-on-done.hook.js +2 -0
  32. package/dist/engine/cascade-hooks/hooks/implementing-kickoff.hook.js +5 -1
  33. package/dist/engine/cascade-hooks/hooks/lesson-drift.hook.js +1 -0
  34. package/dist/engine/cascade-hooks/hooks/orchestration-plan.hook.js +1 -0
  35. package/dist/engine/cascade-hooks/hooks/session-context.hook.js +4 -2
  36. package/dist/engine/cascade-hooks/hooks/slack-notify.hook.js +1 -0
  37. package/dist/engine/cascade-hooks/hooks/status-json.hook.js +2 -0
  38. package/dist/engine/cascade-hooks/hooks/velocity-profile.hook.js +2 -0
  39. package/dist/engine/cascade-hooks/runner.js +2 -0
  40. package/dist/engine/cascade-hooks/state-drift-detector.js +2 -0
  41. package/dist/engine/checkpoint/checkpoint-manager.js +2 -0
  42. package/dist/engine/checkpoint/policy-engine.js +1 -0
  43. package/dist/engine/ci-generator/stack-detector.js +2 -10
  44. package/dist/engine/clarification-gate/token-store.js +1 -0
  45. package/dist/engine/claude-config-auditor/claudemd-auditor.js +2 -10
  46. package/dist/engine/claude-config-auditor/settings-auditor.js +2 -10
  47. package/dist/engine/client-detection.js +2 -10
  48. package/dist/engine/compliance/auto-remediator.js +1 -0
  49. package/dist/engine/compliance/evidence-builder.d.ts +2 -2
  50. package/dist/engine/compliance/framework-catalog.d.ts +6 -6
  51. package/dist/engine/compliance/gap-analyzer.d.ts +2 -2
  52. package/dist/engine/config-health/build-tool-checker.js +1 -9
  53. package/dist/engine/config-health/ci-commands-collector.d.ts +2 -1
  54. package/dist/engine/config-health/ci-commands-collector.js +2 -9
  55. package/dist/engine/config-health/go-checker.js +1 -9
  56. package/dist/engine/config-health/mcp-config-checker.js +2 -10
  57. package/dist/engine/config-health/python-checker.js +1 -9
  58. package/dist/engine/config-health/rust-checker.js +1 -9
  59. package/dist/engine/config-health/ts-checker-scripts.js +1 -9
  60. package/dist/engine/config-health/ts-checker.js +1 -9
  61. package/dist/engine/context-artifacts/store.js +1 -0
  62. package/dist/engine/context-md-generator.js +1 -0
  63. package/dist/engine/context-orchestrator/index.js +2 -0
  64. package/dist/engine/convention-scanner/convention-parser.js +2 -9
  65. package/dist/engine/cost-guardrails.js +1 -0
  66. package/dist/engine/cost-tracking/ledger.js +1 -0
  67. package/dist/engine/criterion-identity.js +1 -1
  68. package/dist/engine/dashboard/data-loader.js +1 -0
  69. package/dist/engine/dashboard/drift-score.js +2 -0
  70. package/dist/engine/dashboard/spec-updater.d.ts +3 -1
  71. package/dist/engine/dashboard/spec-updater.js +9 -2
  72. package/dist/engine/dashboard/templates-layout.d.ts +2 -2
  73. package/dist/engine/dashboard/templates-layout.js +2 -9
  74. package/dist/engine/data-projects-gc/gc-runner.js +2 -4
  75. package/dist/engine/deleter/audit-logger.js +1 -0
  76. package/dist/engine/deleter/core.js +6 -0
  77. package/dist/engine/deleter/trash-manager.js +1 -0
  78. package/dist/engine/desktop-detector.js +1 -9
  79. package/dist/engine/detection-utils.d.ts +2 -1
  80. package/dist/engine/detection-utils.js +3 -10
  81. package/dist/engine/detectors/advanced-framework-detector/helpers.d.ts +3 -2
  82. package/dist/engine/detectors/advanced-framework-detector/helpers.js +3 -17
  83. package/dist/engine/detectors/cicd-detector.js +2 -10
  84. package/dist/engine/detectors/css-framework-detector.js +2 -10
  85. package/dist/engine/detectors/deployment-detector.js +3 -12
  86. package/dist/engine/detectors/frontend-perf-detector.js +2 -10
  87. package/dist/engine/detectors/gitops-detector.js +3 -11
  88. package/dist/engine/detectors/idp-detector.js +1 -3
  89. package/dist/engine/detectors/k3s-detector.js +3 -11
  90. package/dist/engine/detectors/llm-detector/file-readers.d.ts +2 -1
  91. package/dist/engine/detectors/llm-detector/file-readers.js +2 -9
  92. package/dist/engine/detectors/mfe-detector.js +5 -13
  93. package/dist/engine/detectors/monitoring-detector.js +2 -11
  94. package/dist/engine/detectors/monorepo-detector.d.ts +1 -0
  95. package/dist/engine/detectors/monorepo-detector.js +1 -10
  96. package/dist/engine/detectors/nomad-detector.js +3 -11
  97. package/dist/engine/detectors/otel-ecosystem-detectors.d.ts +2 -1
  98. package/dist/engine/detectors/otel-ecosystem-detectors.js +2 -10
  99. package/dist/engine/doc-generator/executive-summary/html-template.js +1 -7
  100. package/dist/engine/doc-generator/executive-summary/section-builders.js +1 -7
  101. package/dist/engine/doc-generator/per-spec-report/mermaid-renderer.js +1 -7
  102. package/dist/engine/doc-generator/per-spec-report/spec-section-builders.js +1 -7
  103. package/dist/engine/doc-generator/per-spec-report/technical-report.js +1 -7
  104. package/dist/engine/doc-generator/portal/analytics-page.js +1 -7
  105. package/dist/engine/doc-generator/portal/architecture-page.js +1 -7
  106. package/dist/engine/doc-generator/portal/changelog-page.js +1 -7
  107. package/dist/engine/doc-generator/portal/decision-page.js +1 -7
  108. package/dist/engine/doc-generator/portal/decision-timeline-builder.js +1 -7
  109. package/dist/engine/doc-generator/portal/kanban-view-builder.js +1 -7
  110. package/dist/engine/doc-generator/portal/portal-breadcrumbs.js +1 -7
  111. package/dist/engine/doc-generator/portal/portal-landing-cards.js +1 -7
  112. package/dist/engine/doc-generator/portal/portal-navbar.js +1 -7
  113. package/dist/engine/doc-generator/portal/portal-page-detector.d.ts +3 -0
  114. package/dist/engine/doc-generator/portal/portal-page-detector.js +1 -10
  115. package/dist/engine/doc-generator/portal/portal-regenerator.js +2 -0
  116. package/dist/engine/doc-generator/portal/risk-matrix-svg.js +1 -7
  117. package/dist/engine/doc-generator/portal/risk-page.js +1 -7
  118. package/dist/engine/doc-generator/portal/roadmap-page.js +1 -7
  119. package/dist/engine/doc-generator/proposal/proposal-gantt-builder.js +1 -7
  120. package/dist/engine/doc-generator/proposal/proposal-kpi-builder.js +1 -7
  121. package/dist/engine/doc-generator/proposal/proposal-section-builders-advanced.js +2 -8
  122. package/dist/engine/doc-generator/proposal/proposal-section-builders.js +1 -7
  123. package/dist/engine/docs-site-generator/html-templates.js +1 -7
  124. package/dist/engine/docs-site-generator/markdown-renderer.js +1 -7
  125. package/dist/engine/drift/violation-resolver.js +2 -0
  126. package/dist/engine/dynamic-knowledge/knowledge-cache.js +1 -0
  127. package/dist/engine/ecosystem-absorber/knowledge-cache.js +1 -0
  128. package/dist/engine/edge-db-detector.js +1 -10
  129. package/dist/engine/escalator/retry-counter.js +1 -0
  130. package/dist/engine/evidence-gates/artifact-reader.js +1 -0
  131. package/dist/engine/evidence-gates/evidence-autofill.js +1 -0
  132. package/dist/engine/evidence-gates/evidence-skeletons.js +1 -0
  133. package/dist/engine/evidence-gates/reconciliation-freshness.js +1 -0
  134. package/dist/engine/execution/durable-job-heartbeat-runtime.js +1 -0
  135. package/dist/engine/execution/job-runtime.js +2 -0
  136. package/dist/engine/execution/validate-job-executor.d.ts +1 -1
  137. package/dist/engine/execution/validate-job-executor.js +3 -0
  138. package/dist/engine/execution/validate-job-payload.js +1 -0
  139. package/dist/engine/execution/validate-worker-thread.js +1 -0
  140. package/dist/engine/facilitate/context-loader.js +1 -0
  141. package/dist/engine/figma/change-detector.d.ts +1 -8
  142. package/dist/engine/figma/code-connect-fetcher.d.ts +1 -7
  143. package/dist/engine/figma/design-enricher.d.ts +1 -17
  144. package/dist/engine/figma/design-enricher.js +0 -1
  145. package/dist/engine/figma/e2e-generator.d.ts +1 -23
  146. package/dist/engine/figma/flow-analyzer.d.ts +1 -11
  147. package/dist/engine/figma/frame-extractor.d.ts +1 -11
  148. package/dist/engine/figma/frame-extractor.js +3 -0
  149. package/dist/engine/figma/multi-file-manager.d.ts +1 -6
  150. package/dist/engine/figma/spec-generator.js +2 -0
  151. package/dist/engine/figma/thumbnail-fetcher.d.ts +1 -1
  152. package/dist/engine/figma/token-extractor.d.ts +1 -6
  153. package/dist/engine/figma/token-extractor.js +0 -1
  154. package/dist/engine/figma/version-tracker.d.ts +1 -7
  155. package/dist/engine/figma/version-tracker.js +0 -1
  156. package/dist/engine/figma/visual-qa.d.ts +5 -19
  157. package/dist/engine/figma/visual-qa.js +1 -2
  158. package/dist/engine/figma/webhook-manager.d.ts +1 -7
  159. package/dist/engine/frontmatter-sha/reseal.js +1 -0
  160. package/dist/engine/frontmatter-sha/verify-terminal.js +1 -0
  161. package/dist/engine/git-hook-injector.js +2 -10
  162. package/dist/engine/github/quality-dimensions.js +1 -3
  163. package/dist/engine/global-rules-manager.js +2 -3
  164. package/dist/engine/handoff-artifacts/implementation-review-reader.js +1 -0
  165. package/dist/engine/handoff-artifacts/io.js +2 -0
  166. package/dist/engine/handoff-packager.js +2 -1
  167. package/dist/engine/health/auto-fixer.js +1 -0
  168. package/dist/engine/hooks/context-injector.js +1 -0
  169. package/dist/engine/hooks-reconciler.js +1 -8
  170. package/dist/engine/impact-detector/index.js +2 -9
  171. package/dist/engine/implementation-contract/common.js +1 -3
  172. package/dist/engine/implementation-contract/evaluator.js +1 -3
  173. package/dist/engine/keyword-matcher/boundary.d.ts +2 -7
  174. package/dist/engine/keyword-matcher/boundary.js +2 -14
  175. package/dist/engine/lifecycle-reconciliation-io.js +1 -0
  176. package/dist/engine/lifecycle-reconciliation.js +3 -0
  177. package/dist/engine/local-first/detector.js +1 -9
  178. package/dist/engine/marketplace-fetcher/cache.js +2 -0
  179. package/dist/engine/marketplace-fetcher/index.js +1 -0
  180. package/dist/engine/mcp-config/mcp-config-writer.js +2 -10
  181. package/dist/engine/migrations/remove-commercial-state.js +2 -0
  182. package/dist/engine/mobile-detector-shared.d.ts +1 -1
  183. package/dist/engine/mobile-detector-shared.js +2 -9
  184. package/dist/engine/multi-channel-notifier.js +1 -0
  185. package/dist/engine/multi-teammate-review/disagreement-counter.js +1 -0
  186. package/dist/engine/multi-teammate-review/panel-orchestrator.js +1 -0
  187. package/dist/engine/onboarding-engine.js +1 -9
  188. package/dist/engine/permissions-merger/stack-detectors.js +2 -10
  189. package/dist/engine/pii-detector/core.js +1 -3
  190. package/dist/engine/platform-engineering/dx-analyzer.js +1 -10
  191. package/dist/engine/platform-engineering/idp-detector.js +2 -10
  192. package/dist/engine/project-dna/ai-tool-detector.js +2 -10
  193. package/dist/engine/project-dna/stack-detector.js +2 -10
  194. package/dist/engine/project-graph/builder.js +11 -2
  195. package/dist/engine/project-graph/cache.d.ts +5 -2
  196. package/dist/engine/project-graph/cache.js +174 -34
  197. package/dist/engine/project-graph/extractors/decision-store-extractor.js +1 -0
  198. package/dist/engine/project-graph/freshness-projection.js +3 -0
  199. package/dist/engine/project-graph/query.js +14 -11
  200. package/dist/engine/project-health-checker.js +2 -6
  201. package/dist/engine/provider-adapters/shared/spec-loader.js +1 -0
  202. package/dist/engine/quality-gates/gate-evaluator.js +1 -3
  203. package/dist/engine/react-detector.js +6 -14
  204. package/dist/engine/reconcile/apply-changes.js +1 -3
  205. package/dist/engine/registry/core.js +1 -0
  206. package/dist/engine/registry/loader.js +2 -0
  207. package/dist/engine/release/postmortem-generator.js +1 -0
  208. package/dist/engine/release/rollback-runner.d.ts +2 -2
  209. package/dist/engine/release/stuck-spec-detector.js +7 -0
  210. package/dist/engine/release-pipeline/release-spec-closer.js +3 -0
  211. package/dist/engine/rules-reconciler.d.ts +1 -1
  212. package/dist/engine/rules-reconciler.js +2 -9
  213. package/dist/engine/safety/atomic-writer.js +1 -0
  214. package/dist/engine/safety/cross-process-lock.js +2 -0
  215. package/dist/engine/safety/file-mutex.js +1 -0
  216. package/dist/engine/safety/lock-lease-store.js +1 -0
  217. package/dist/engine/safety/lock-scavenger.js +2 -0
  218. package/dist/engine/saga/transition-cascade.js +3 -0
  219. package/dist/engine/scan-project/index.js +1 -0
  220. package/dist/engine/scan-project/module-discoverer.js +1 -9
  221. package/dist/engine/schema-parity-auditor/handler-checker.js +1 -3
  222. package/dist/engine/schema-parity-auditor/index.js +1 -3
  223. package/dist/engine/schema-parity-auditor/type-checker.js +1 -3
  224. package/dist/engine/self-healing/strategies/coverage-fix.js +2 -10
  225. package/dist/engine/session-context-generator.d.ts +8 -0
  226. package/dist/engine/session-context-generator.js +33 -23
  227. package/dist/engine/session-state/session-artifact-refresher.d.ts +7 -0
  228. package/dist/engine/session-state/session-artifact-refresher.js +140 -0
  229. package/dist/engine/session-state/writer.d.ts +3 -0
  230. package/dist/engine/session-state/writer.js +35 -17
  231. package/dist/engine/shared-agent-memory.js +1 -0
  232. package/dist/engine/skill-adapter/index.js +3 -0
  233. package/dist/engine/skill-bootstrap/registry-fetcher.js +1 -0
  234. package/dist/engine/skill-bootstrap/skill-writer.js +2 -9
  235. package/dist/engine/skill-bootstrap/stack-matcher.js +1 -9
  236. package/dist/engine/skill-discovery/multi-agent-writer.d.ts +1 -0
  237. package/dist/engine/skill-discovery/multi-agent-writer.js +1 -9
  238. package/dist/engine/skill-generator/workflow-skill-generator.js +1 -0
  239. package/dist/engine/skill-registry/ttl-refresh.js +2 -0
  240. package/dist/engine/spec-audit/index.js +2 -0
  241. package/dist/engine/spec-audit/report-writer.js +1 -0
  242. package/dist/engine/spec-coverage/core.js +1 -0
  243. package/dist/engine/spec-decomposer/analyzer.js +1 -11
  244. package/dist/engine/spec-dependency-graph/dot-exporter.d.ts +1 -1
  245. package/dist/engine/spec-dependency-graph/graph-builder.d.ts +1 -20
  246. package/dist/engine/spec-dependency-graph/superseded-set.d.ts +1 -1
  247. package/dist/engine/spec-diff-engine.js +1 -7
  248. package/dist/engine/spec-format/read-technical-section.js +1 -3
  249. package/dist/engine/spec-format/replace-section.js +1 -3
  250. package/dist/engine/spec-format/spec-id.d.ts +9 -1
  251. package/dist/engine/spec-format/spec-id.js +24 -3
  252. package/dist/engine/spec-format/unified-spec-builder.js +1 -3
  253. package/dist/engine/spec-migrator/canonical-deduplicator.js +2 -0
  254. package/dist/engine/spec-observability/tracker.js +1 -0
  255. package/dist/engine/spec-registry/adapter.js +2 -10
  256. package/dist/engine/spec-registry/validator.d.ts +1 -0
  257. package/dist/engine/spec-registry/validator.js +1 -9
  258. package/dist/engine/spec-state-machine/transition-spec.js +1 -0
  259. package/dist/engine/spec-templates/custom-loader.js +1 -0
  260. package/dist/engine/stack-auditor/build-tool-auditor.js +1 -9
  261. package/dist/engine/staleness/stale-implementing.js +5 -14
  262. package/dist/engine/status-reconciler/index.js +4 -1
  263. package/dist/engine/structural-memory/helpers.js +1 -0
  264. package/dist/engine/supply-chain/slsa-checker.js +1 -9
  265. package/dist/engine/tdd-enforcer/stub-artifact-path.js +1 -0
  266. package/dist/engine/telemetry/health-checker.js +1 -0
  267. package/dist/engine/telemetry/telemetry-store.js +1 -0
  268. package/dist/engine/token-optimizer/response-cache.js +1 -3
  269. package/dist/engine/tool-groups/group-manager.js +2 -0
  270. package/dist/engine/update-notifier.js +1 -0
  271. package/dist/engine/validation/approved-spec-portability.js +1 -0
  272. package/dist/engine/validation/durable-validation.js +1 -0
  273. package/dist/engine/validation/validation-freshness.js +2 -0
  274. package/dist/engine/validation/validation-receipt.js +1 -0
  275. package/dist/engine/validation/validation-submission.d.ts +1 -1
  276. package/dist/engine/validation-evidence-ledger.js +1 -0
  277. package/dist/engine/validator/deep-code-checker.js +1 -3
  278. package/dist/engine/validator/executable-evidence.d.ts +1 -14
  279. package/dist/engine/validator/scope-resolver.d.ts +2 -2
  280. package/dist/engine/validator/spec-compliance-runner.d.ts +1 -31
  281. package/dist/engine/validator/validation-report-writer.js +1 -1
  282. package/dist/engine/validator.d.ts +1 -1
  283. package/dist/engine/validator.js +1 -0
  284. package/dist/engine/velocity/measure-velocity.js +2 -0
  285. package/dist/engine/version-resolver.js +1 -0
  286. package/dist/engine/workers/handlers/auto-drift.js +3 -0
  287. package/dist/engine/workspace-manager.js +4 -0
  288. package/dist/hosts/gemini/config-scaffold.js +2 -10
  289. package/dist/storage/approval-operation-lock.js +1 -0
  290. package/dist/storage/auto-promoter-config-store.js +1 -0
  291. package/dist/storage/autopilot-log-store.js +1 -0
  292. package/dist/storage/base-store.js +1 -0
  293. package/dist/storage/checkpoint-store.js +1 -0
  294. package/dist/storage/feedback-remote.js +1 -0
  295. package/dist/storage/gaps-log.js +1 -0
  296. package/dist/storage/global-projects-store.js +1 -0
  297. package/dist/storage/global-store.js +1 -0
  298. package/dist/storage/knowledge-store/sessions.js +2 -0
  299. package/dist/storage/migrations/canonical-storage.js +42 -18
  300. package/dist/storage/project-drift-store.js +1 -0
  301. package/dist/storage/project-identity.js +1 -0
  302. package/dist/storage/project-resolver.js +1 -17
  303. package/dist/storage/runtime-db.d.ts +2 -20
  304. package/dist/storage/runtime-db.js +2 -9
  305. package/dist/storage/semantic-index-store.js +1 -0
  306. package/dist/storage/sentry-store.js +1 -0
  307. package/dist/storage/session-state-store.js +1 -0
  308. package/dist/storage/spec-store.d.ts +7 -0
  309. package/dist/storage/spec-store.js +21 -1
  310. package/dist/storage/status-store/atomic-status-write.js +1 -0
  311. package/dist/storage/status-store/file-lock.js +1 -0
  312. package/dist/storage/status-store/self-healing.js +1 -0
  313. package/dist/storage/storage-bundle.d.ts +12 -2
  314. package/dist/storage/supabase-store.js +1 -0
  315. package/dist/storage/technology-selection-store.js +1 -0
  316. package/dist/storage/trash-store.d.ts +2 -4
  317. package/dist/storage/trash-store.js +2 -15
  318. package/dist/storage/vector-store/json-fallback.js +1 -0
  319. package/dist/storage/vector-store/migrator.js +1 -0
  320. package/dist/storage/vector-store/sqlite-adapter.js +1 -0
  321. package/dist/tools/audit-claude-config.js +1 -10
  322. package/dist/tools/check-readiness.js +104 -30
  323. package/dist/tools/clarify-requirements/multiple-choice.d.ts +3 -3
  324. package/dist/tools/configure-oauth-handler.js +1 -0
  325. package/dist/tools/create-spec-helpers.d.ts +1 -3
  326. package/dist/tools/create-spec-helpers.js +1 -8
  327. package/dist/tools/create-spec.js +1 -13
  328. package/dist/tools/dashboard.js +5 -0
  329. package/dist/tools/github-pr-handler.js +1 -0
  330. package/dist/tools/github-release-handler.d.ts +1 -0
  331. package/dist/tools/github-release-handler.js +4 -3
  332. package/dist/tools/graph-specs.d.ts +1 -1
  333. package/dist/tools/heal-spec-docs.js +1 -3
  334. package/dist/tools/init-project/git-setup.d.ts +2 -2
  335. package/dist/tools/init-project/host-assets-writer.js +2 -10
  336. package/dist/tools/init-project/lifecycle-helpers.d.ts +2 -2
  337. package/dist/tools/init-project/lint-scaffolder.js +2 -10
  338. package/dist/tools/init-project/stack-detector.d.ts +2 -2
  339. package/dist/tools/reconcile-interactive-question-hooks.d.ts +2 -2
  340. package/dist/tools/register-sdd-tools.js +1 -0
  341. package/dist/tools/safe-handler.js +1 -0
  342. package/dist/tools/schemas/spec-id.d.ts +1 -6
  343. package/dist/tools/schemas/spec-id.js +1 -16
  344. package/dist/tools/tool-entry.d.ts +2 -2
  345. package/dist/tools/tool-entry.js +1 -1
  346. package/dist/tools/tool-registry/core-tools.d.ts +2 -2
  347. package/dist/tools/tool-registry/deprecated-stubs.d.ts +3 -3
  348. package/dist/tools/tool-registry/deprecated-stubs.js +1 -1
  349. package/dist/tools/triage-request.d.ts +2 -2
  350. package/dist/tools/update-status/approval-gates.d.ts +2 -2
  351. package/dist/tools/update-status/approval-gates.js +1 -0
  352. package/dist/tools/update-status/dod-gates.d.ts +1 -1
  353. package/dist/tools/update-status/done-receipt-verifier.d.ts +1 -1
  354. package/dist/tools/update-status/side-effects.js +5 -0
  355. package/dist/tools/update-status-actions.js +28 -40
  356. package/dist/tools/validate-graph-coverage.js +14 -2
  357. package/dist/tools/validate.js +2 -0
  358. package/dist/transports/middleware/types.d.ts +3 -3
  359. package/dist/types/atomic-upgrade.d.ts +1 -1
  360. package/dist/types/cascade-hooks.d.ts +3 -0
  361. package/dist/types/dashboard.d.ts +4 -1
  362. package/dist/types/durable-job.d.ts +20 -0
  363. package/dist/types/durable-job.js +9 -1
  364. package/dist/types/index.d.ts +2 -0
  365. package/dist/types/index.js +2 -0
  366. package/dist/types/installation.d.ts +16 -0
  367. package/dist/types/installation.js +2 -0
  368. package/dist/types/project-knowledge-graph.d.ts +11 -0
  369. package/dist/types/session-checkpoint.d.ts +16 -0
  370. package/dist/types/spec-dependency-graph.d.ts +21 -0
  371. package/dist/types/spec-dependency-graph.js +2 -0
  372. package/dist/types/validation-evidence.d.ts +45 -0
  373. package/package.json +1 -1
  374. package/planu-plugin.json +1 -1
  375. package/dist/types/storage-bundle.d.ts +0 -13
  376. package/dist/types/storage-bundle.js +0 -2
package/CHANGELOG.md CHANGED
@@ -1,3 +1,71 @@
1
+ ## [5.3.69] - 2026-08-29
2
+
3
+ ### Features
4
+ - feat(SPEC-1674): tail or skip oversized operational graph sources instead of throwing
5
+
6
+ ### Bug Fixes
7
+ - fix(SPEC-1674): include warnings in graph coverage test fixtures
8
+ - fix(SPEC-1669): fail closed on ambiguous spec discovery, real validator in tests
9
+ - fix(SPEC-1669): quarantine journals via atomic rename, test via init_project
10
+ - fix(SPEC-1669): re-discover canonical spec.md when the readiness index is stale
11
+ - fix(SPEC-1669): quarantine stale terminal migration journals instead of throwing
12
+ - fix(SPEC-1673): capture nested vitest child output instead of inheriting stdio
13
+ - fix(SPEC-1673): serialize load-sensitive test suites into a dedicated vitest project
14
+ - fix(SPEC-1670): accept Next.js route group and dynamic segment characters in ownership paths
15
+ - fix(SPEC-1674): harden oversized-source handling per implementation review
16
+ - fix(SPEC-1674): surface persisted oversized graph sources as validate warnings
17
+ - fix(SPEC-1674): thread oversizedSources through the build result, artifact, and query slice
18
+ - fix(SPEC-1664): include backtick in criterion identity punctuation normalization
19
+ - fix(SPEC-1661): guarantee cascade-hook wiring in lean release process
20
+ - fix(SPEC-1660): grandfather full-allowlist and dynamic-import violations
21
+ - fix(SPEC-1660): full allowlist, subpath fix, dynamic imports, exemption scope
22
+ - fix(SPEC-1660): grandfather existing layer-boundary violations
23
+ - fix(SPEC-1660): enforce merged layer and status-write import rules per scope
24
+ - fix(SPEC-1320): serialize legacy session writers behind the paired refresher
25
+ - fix(SPEC-1320): derive both session artifacts from one serialized active-spec snapshot
26
+
27
+ ### Refactoring
28
+ - refactor(SPEC-1663): relocate DurableJobRecord/SpecGraph/validation-evidence types into src/types
29
+ - refactor(SPEC-1663): rename divergent tools-cluster types off shared names
30
+ - refactor(SPEC-1663): figma cluster imports canonical types, renames divergent thumbnail/visual-qa shapes
31
+ - refactor(SPEC-1663): rename divergent ToolHandler/SkipReason/RollbackStep off shared names
32
+ - refactor(SPEC-1663): rename divergent compliance catalog types off shared names
33
+ - refactor(SPEC-1663): index.d.ts trio re-exports FileHash/FileMetadata/SpecAnnotation from types/
34
+ - refactor(SPEC-1662): readFileOrNull — migrate 4 sites found by strengthened meta test
35
+ - refactor(SPEC-1662): apply review fixes — enoent code check, meta-test coverage, comment cleanup
36
+ - refactor(SPEC-1662): readFileSafe family — consolidate into src/core/shared
37
+ - refactor(SPEC-1662): escapeRegex family — consolidate into src/core/shared
38
+ - refactor(SPEC-1662): escapeHtml — consolidate into src/core/shared
39
+ - refactor(SPEC-1662): fileExists/pathExists — consolidate into src/core/shared
40
+ - refactor(SPEC-1662): setup — create src/core/shared and allow engine/storage/tools to import it
41
+ - refactor(SPEC-1661): invert hook dispatch via injected handler; add layer-inversion tests
42
+ - refactor(SPEC-1661): invert dashboard status update via injected handler
43
+ - refactor(SPEC-1661): consolidate generateSpecId and spec-id schema in engine
44
+ - refactor(SPEC-1661): remove now-unused src/types/storage-bundle.ts
45
+ - refactor(SPEC-1661): break types->storage inversion in StorageBundle
46
+ - refactor(SPEC-1661): move InstallationRecord/InstallationManifest into types
47
+
48
+ ### Chores
49
+ - chore: scope mutation gate to mutated-range suites via dedicated vitest config
50
+ - chore(SPEC-1669/1670): record approval and implementing transitions
51
+ - chore(SPEC-1674): record done transition and release pending entry
52
+ - chore(SPEC-1674): transition to implementing
53
+ - chore(SPEC-1663): record done transition and session context
54
+ - chore(SPEC-1663): record implementing transition
55
+ - chore(SPEC-1662): record done transition and session artifacts
56
+ - chore(SPEC-1662): record implementing transition
57
+ - chore(SPEC-1664): record done transition and session artifacts
58
+ - chore(SPEC-1664): record implementing transition
59
+ - chore(SPEC-1661): record done transition and session artifacts
60
+ - chore(SPEC-1661): record implementing transition
61
+ - chore(SPEC-1660): record done transition and session artifacts
62
+ - chore(SPEC-1660): record implementing transition
63
+ - chore(SPEC-1660): reconcile ownership format and risk section for handoff gate
64
+ - chore: absorb post-done session state
65
+ - chore(SPEC-1320): record done transition
66
+ - chore(SPEC-1320): record implementing transition and fix stale verification command
67
+
68
+
1
69
  ## [5.3.68] - 2026-08-28
2
70
 
3
71
  ### Features
@@ -1 +1 @@
1
- {"schemaVersion":1,"commit":"39afacbb6522be60172b8571f6c5973000936a4a"}
1
+ {"schemaVersion":1,"commit":"3cfd6dac20d6444035162379c6284620d6d8961a"}
@@ -1,4 +1,5 @@
1
1
  import type { CliCommand } from '../../types/cli.js';
2
+ import type { InstallationManifest, InstallationRecord } from '../../types/installation.js';
2
3
  interface McpEntry {
3
4
  command: string;
4
5
  args: string[];
@@ -26,21 +27,7 @@ interface ToolDefinition {
26
27
  projectScopePath: string | null;
27
28
  format: 'standard' | 'zed';
28
29
  }
29
- export interface InstallationRecord {
30
- host: string;
31
- configPath: string;
32
- format: ToolDefinition['format'];
33
- scope: 'user' | 'project';
34
- package: string;
35
- version: string;
36
- offline: boolean;
37
- installedAt: string;
38
- }
39
- export interface InstallationManifest {
40
- schemaVersion: 1;
41
- updatedAt: string;
42
- installations: InstallationRecord[];
43
- }
30
+ export type { InstallationRecord, InstallationManifest } from '../../types/installation.js';
44
31
  declare function buildMcpEntry(): McpEntry;
45
32
  declare function readJsonFile(filePath: string): ToolConfig;
46
33
  declare function hasPlanuEntry(config: ToolConfig, format: ToolDefinition['format']): boolean;
@@ -0,0 +1,11 @@
1
+ export declare function fileExists(filePath: string): Promise<boolean>;
2
+ export declare function fileExistsIn(basePath: string, relativePath: string): Promise<boolean>;
3
+ export declare function fileExistsByRead(filePath: string): Promise<boolean>;
4
+ export declare const pathExists: typeof fileExists;
5
+ export declare function pathExistsByStat(filePath: string): Promise<boolean>;
6
+ export declare function pathExistsStrict(filePath: string): Promise<boolean>;
7
+ export declare function pathExistsStrictByStat(filePath: string): Promise<boolean>;
8
+ export declare function readFileSafe(filePath: string): Promise<string>;
9
+ export declare function readFileSafeSync(filePath: string): string;
10
+ export declare function readFileOrNull(filePath: string): Promise<string | null>;
11
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1,90 @@
1
+ import { access, readFile, stat } from 'node:fs/promises';
2
+ import { readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ function isEnoent(error) {
5
+ return (error.code === 'ENOENT' ||
6
+ (error instanceof Error && error.message === 'ENOENT'));
7
+ }
8
+ function isEnoentCode(error) {
9
+ return error.code === 'ENOENT';
10
+ }
11
+ export async function fileExists(filePath) {
12
+ try {
13
+ await access(filePath);
14
+ return true;
15
+ }
16
+ catch {
17
+ return false;
18
+ }
19
+ }
20
+ export async function fileExistsIn(basePath, relativePath) {
21
+ return fileExists(join(basePath, relativePath));
22
+ }
23
+ export async function fileExistsByRead(filePath) {
24
+ try {
25
+ await readFile(filePath, 'utf-8');
26
+ return true;
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ }
32
+ export const pathExists = fileExists;
33
+ export async function pathExistsByStat(filePath) {
34
+ try {
35
+ await stat(filePath);
36
+ return true;
37
+ }
38
+ catch {
39
+ return false;
40
+ }
41
+ }
42
+ export async function pathExistsStrict(filePath) {
43
+ try {
44
+ await access(filePath);
45
+ return true;
46
+ }
47
+ catch (error) {
48
+ if (isEnoent(error)) {
49
+ return false;
50
+ }
51
+ throw error;
52
+ }
53
+ }
54
+ export async function pathExistsStrictByStat(filePath) {
55
+ try {
56
+ await stat(filePath);
57
+ return true;
58
+ }
59
+ catch (error) {
60
+ if (isEnoentCode(error)) {
61
+ return false;
62
+ }
63
+ throw error;
64
+ }
65
+ }
66
+ export async function readFileSafe(filePath) {
67
+ try {
68
+ return await readFile(filePath, 'utf-8');
69
+ }
70
+ catch {
71
+ return '';
72
+ }
73
+ }
74
+ export function readFileSafeSync(filePath) {
75
+ try {
76
+ return readFileSync(filePath, 'utf-8');
77
+ }
78
+ catch {
79
+ return '';
80
+ }
81
+ }
82
+ export async function readFileOrNull(filePath) {
83
+ try {
84
+ return await readFile(filePath, 'utf-8');
85
+ }
86
+ catch {
87
+ return null;
88
+ }
89
+ }
90
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1,3 @@
1
+ export declare function escapeRegex(str: string): string;
2
+ export declare function escapeHtml(str: string): string;
3
+ //# sourceMappingURL=strings.d.ts.map
@@ -0,0 +1,13 @@
1
+ const REGEX_METACHARACTERS = /[.*+?^${}()|[\]\\]/g;
2
+ export function escapeRegex(str) {
3
+ return str.replace(REGEX_METACHARACTERS, '\\$&');
4
+ }
5
+ export function escapeHtml(str) {
6
+ return str
7
+ .replace(/&/g, '&amp;')
8
+ .replace(/</g, '&lt;')
9
+ .replace(/>/g, '&gt;')
10
+ .replace(/"/g, '&quot;')
11
+ .replace(/'/g, '&#39;');
12
+ }
13
+ //# sourceMappingURL=strings.js.map
@@ -1,7 +1,7 @@
1
1
  // Planu — engine/actuals/git-analyzer.ts (SPEC-061)
2
2
  // Derives actuals from git log history for a given spec.
3
3
  import { execFileSync } from 'node:child_process';
4
- import { isCanonicalSpecId } from '../../tools/schemas/spec-id.js';
4
+ import { isCanonicalSpecId } from '../spec-format/spec-id.js';
5
5
  const MAX_SESSION_GAP_MS = 2 * 60 * 60 * 1000; // 2 hours
6
6
  const REVIEW_HOURS_RATIO = 0.15;
7
7
  const MINIMUM_DEV_HOURS = 1;
@@ -1,6 +1,4 @@
1
- function escapeRegex(input) {
2
- return input.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
3
- }
1
+ import { escapeRegex } from '../../core/shared/strings.js';
4
2
  /**
5
3
  * Parses progress.md content and extracts any actual metrics found.
6
4
  *
@@ -1,6 +1,7 @@
1
1
  // engine/agent-handoff-store.ts — SPEC-639: handoff.json protocol for agent teams
2
2
  import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
3
  import { join } from 'node:path';
4
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
4
5
  import { hashProjectPath, projectDataDir } from '../storage/base-store.js';
5
6
  function handoffPath(projectPath, specId) {
6
7
  return join(projectDataDir(hashProjectPath(projectPath)), 'team', specId, 'handoff.json');
@@ -3,6 +3,7 @@ import { readFile } from 'node:fs/promises';
3
3
  import { join, dirname } from 'node:path';
4
4
  import { fileURLToPath } from 'node:url';
5
5
  import { resolveAgents } from '../agent-router.js';
6
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
6
7
  import { appendSquadRun, getSquadConfig } from '../../storage/agent-squad-store.js';
7
8
  const CONFIG_DIR = join(dirname(fileURLToPath(import.meta.url)), '../../config');
8
9
  async function loadRegistry() {
@@ -3,6 +3,7 @@ import { appendFile, stat, readFile, writeFile, mkdir } from 'node:fs/promises';
3
3
  import { createReadStream } from 'node:fs';
4
4
  import { createInterface } from 'node:readline';
5
5
  import { join } from 'node:path';
6
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
6
7
  import { hashProjectPath, projectDataDir } from '../storage/base-store.js';
7
8
  const MAX_FILE_BYTES = 1024 * 1024; // 1 MB
8
9
  const PRUNE_AGE_MS = 30 * 24 * 60 * 60 * 1000; // 30 days
@@ -3,6 +3,7 @@
3
3
  // Persists to the canonical config root. Never persists tokens.
4
4
  import { readFile, writeFile, mkdir } from 'node:fs/promises';
5
5
  import { join } from 'node:path';
6
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
6
7
  import { resolveStorageLayout } from '../../storage/storage-layout.js';
7
8
  const CONFIG_DIR = resolveStorageLayout().config;
8
9
  const CONFIG_PATH = join(CONFIG_DIR, 'auth-config.json');
@@ -1,6 +1,7 @@
1
1
  import { readFile, rm } from 'node:fs/promises';
2
2
  import { isAbsolute } from 'node:path';
3
3
  import { atomicWriteFile } from '../safety/atomic-write-file.js';
4
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
4
5
  import { readInstallationManifest, } from '../../cli/commands/install.js';
5
6
  import { buildPinnedEntry } from './config-patcher.js';
6
7
  import { stageAndVerifyRelease } from './release-verifier.js';
@@ -5,6 +5,7 @@ import { detectPlanuInstall } from './config-detector.js';
5
5
  import { buildPinnedEntry } from './config-patcher.js';
6
6
  import { fetchLatestVersion } from './npm-registry.js';
7
7
  import { PLANU_VERSION } from '../../config/version.js';
8
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
8
9
  import { resolveStorageLayout } from '../../storage/storage-layout.js';
9
10
  import { upgradeInventoriedAdapters } from './atomic-upgrade.js';
10
11
  export { upgradeInventoriedAdapters } from './atomic-upgrade.js';
@@ -79,6 +79,7 @@ const ACTION_HANDLERS = {
79
79
  if (!ctx.specId) {
80
80
  return { success: false, summary: 'No specId', durationMs: 0 };
81
81
  }
82
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
82
83
  const { handleSuggestCriteria } = await import('../../tools/domain-criteria-handler.js');
83
84
  const result = await handleSuggestCriteria({
84
85
  projectId: ctx.projectId,
@@ -91,6 +92,7 @@ const ACTION_HANDLERS = {
91
92
  };
92
93
  }),
93
94
  detect_contradictions: wrapHandler('detect_contradictions', async (ctx) => {
95
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
94
96
  const { specStore } = await import('../../storage/index.js');
95
97
  const { detectContradictions } = await import('../contradiction-detector.js');
96
98
  const specs = await specStore.listSpecs(ctx.projectId);
@@ -116,6 +118,7 @@ const ACTION_HANDLERS = {
116
118
  if (!ctx.specId) {
117
119
  return { success: false, summary: 'No specId', durationMs: 0 };
118
120
  }
121
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
119
122
  const { handleChallengeSpec } = await import('../../tools/challenge-spec.js');
120
123
  const result = await handleChallengeSpec({
121
124
  projectPath: ctx.projectPath,
@@ -131,6 +134,7 @@ const ACTION_HANDLERS = {
131
134
  if (!ctx.specId) {
132
135
  return { success: false, summary: 'No specId', durationMs: 0 };
133
136
  }
137
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
134
138
  const { handleSpecQualityScore } = await import('../../tools/spec-quality-score-handler.js');
135
139
  const result = await handleSpecQualityScore({
136
140
  projectPath: ctx.projectPath,
@@ -146,6 +150,7 @@ const ACTION_HANDLERS = {
146
150
  if (!ctx.specId) {
147
151
  return { success: false, summary: 'No specId', durationMs: 0 };
148
152
  }
153
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
149
154
  const { handleOrchestrateAgents } = await import('../../tools/orchestrate-agents-handler.js');
150
155
  const result = await handleOrchestrateAgents({
151
156
  projectPath: ctx.projectPath,
@@ -163,11 +168,13 @@ const ACTION_HANDLERS = {
163
168
  return { success: false, summary: 'No specId', durationMs: 0 };
164
169
  }
165
170
  // TDD scaffold needs specPath — resolve from specId
171
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
166
172
  const { specStore } = await import('../../storage/index.js');
167
173
  const spec = await specStore.getSpec(ctx.projectId, ctx.specId);
168
174
  if (!spec?.specPath) {
169
175
  return { success: false, summary: `Spec ${ctx.specId} has no specPath`, durationMs: 0 };
170
176
  }
177
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
171
178
  const { handleTddScaffold } = await import('../../tools/tdd-scaffold-handler.js');
172
179
  const result = await handleTddScaffold({
173
180
  projectPath: ctx.projectPath,
@@ -198,6 +205,7 @@ const ACTION_HANDLERS = {
198
205
  };
199
206
  }),
200
207
  generate_changelog: wrapHandler('generate_changelog', async (ctx) => {
208
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
201
209
  const { specStore } = await import('../../storage/index.js');
202
210
  const specs = await specStore.listSpecs(ctx.projectId);
203
211
  const { generateChangelog } = await import('../doc-generator/support-generators.js');
@@ -205,6 +213,7 @@ const ACTION_HANDLERS = {
205
213
  // Generated changelog is returned to callers; strict Planu mode forbids planu/CHANGELOG.md.
206
214
  const { writeFile, mkdir } = await import('node:fs/promises');
207
215
  const { join } = await import('node:path');
216
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
208
217
  const { projectDataDir } = await import('../../storage/base-store.js');
209
218
  const changelogPath = join(projectDataDir(ctx.projectId), 'generated', 'CHANGELOG.md');
210
219
  await mkdir(join(projectDataDir(ctx.projectId), 'generated'), { recursive: true });
@@ -237,6 +246,7 @@ const ACTION_HANDLERS = {
237
246
  };
238
247
  }),
239
248
  log_lesson: wrapHandler('log_lesson', async (ctx) => {
249
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
240
250
  const { addLesson } = await import('../../storage/lessons-store.js');
241
251
  // drift:detected events (auto-drift.ts) are project-wide and carry no
242
252
  // ctx.specId; fall back to the payload's specIds so the lesson stays
@@ -264,6 +274,7 @@ const ACTION_HANDLERS = {
264
274
  }),
265
275
  // ── B.2: spec:created triggers ──────────────────────────────────────────────
266
276
  heal_spec_docs: wrapHandler('heal_spec_docs', async (ctx) => {
277
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
267
278
  const { handleHealSpecDocs } = await import('../../tools/heal-spec-docs.js');
268
279
  // SPEC-579: pass specId so cascade-triggered healing scopes to the changing
269
280
  // spec only, instead of mass-rewriting all technical.md files in the project.
@@ -278,6 +289,7 @@ const ACTION_HANDLERS = {
278
289
  };
279
290
  }),
280
291
  similar_problems_finder: wrapHandler('similar_problems_finder', async (ctx) => {
292
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
281
293
  const { handleSimilarProblemsFinder } = await import('../../tools/knowledge-base-handler.js');
282
294
  const result = await handleSimilarProblemsFinder({
283
295
  projectPath: ctx.projectPath,
@@ -294,6 +306,7 @@ const ACTION_HANDLERS = {
294
306
  if (!ctx.specId) {
295
307
  return { success: false, summary: 'No specId', durationMs: 0 };
296
308
  }
309
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
297
310
  const { specStore } = await import('../../storage/index.js');
298
311
  const spec = await specStore.getSpec(ctx.projectId, ctx.specId);
299
312
  if (!spec) {
@@ -309,6 +322,7 @@ const ACTION_HANDLERS = {
309
322
  };
310
323
  }),
311
324
  run_spec_lint: wrapHandler('run_spec_lint', async (ctx) => {
325
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
312
326
  const { handleRunSpecLint } = await import('../../tools/spec-lint-handler.js');
313
327
  const result = await handleRunSpecLint({
314
328
  projectPath: ctx.projectPath,
@@ -341,6 +355,7 @@ const ACTION_HANDLERS = {
341
355
  if (!ctx.specId) {
342
356
  return { success: false, summary: 'No specId', durationMs: 0 };
343
357
  }
358
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
344
359
  const { handleSpecHealthCheck } = await import('../../tools/validation-loop-handler.js');
345
360
  const result = await handleSpecHealthCheck({
346
361
  projectPath: ctx.projectPath,
@@ -353,6 +368,7 @@ const ACTION_HANDLERS = {
353
368
  };
354
369
  }),
355
370
  check_parallel_safety: wrapHandler('check_parallel_safety', async (ctx) => {
371
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
356
372
  const { handleCheckParallelSafety } = await import('../../tools/parallel-safety-handler.js');
357
373
  const result = handleCheckParallelSafety({ projectPath: ctx.projectPath });
358
374
  return {
@@ -366,6 +382,7 @@ const ACTION_HANDLERS = {
366
382
  if (!ctx.specId) {
367
383
  return { success: false, summary: 'No specId', durationMs: 0 };
368
384
  }
385
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
369
386
  const { handleAutoFixValidation } = await import('../../tools/auto-fix-validation.js');
370
387
  const result = await handleAutoFixValidation({
371
388
  projectPath: ctx.projectPath,
@@ -380,6 +397,7 @@ const ACTION_HANDLERS = {
380
397
  };
381
398
  }),
382
399
  calibrate_estimates: wrapHandler('calibrate_estimates', async (ctx) => {
400
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
383
401
  const { handleCalibrateEstimates } = await import('../../tools/estimation-accuracy-handler.js');
384
402
  const result = await handleCalibrateEstimates({
385
403
  projectPath: ctx.projectPath,
@@ -394,6 +412,7 @@ const ACTION_HANDLERS = {
394
412
  if (!ctx.specId) {
395
413
  return { success: false, summary: 'No specId', durationMs: 0 };
396
414
  }
415
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
397
416
  const { specStore } = await import('../../storage/index.js');
398
417
  const spec = await specStore.getSpec(ctx.projectId, ctx.specId);
399
418
  const specPath = spec?.specPath ?? ctx.specId;
@@ -410,6 +429,7 @@ const ACTION_HANDLERS = {
410
429
  if (!ctx.specId) {
411
430
  return { success: false, summary: 'No specId', durationMs: 0 };
412
431
  }
432
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
413
433
  const { handleGenerateEdgeTests } = await import('../../tools/tdd-handler.js');
414
434
  const result = await handleGenerateEdgeTests({
415
435
  projectPath: ctx.projectPath,
@@ -1,6 +1,7 @@
1
1
  // engine/autopilot/audit-logger.ts — SPEC-468: Persistent audit log for autopilot cascade actions
2
2
  import { appendFile, readFile, mkdir, writeFile } from 'node:fs/promises';
3
3
  import { join, dirname } from 'node:path';
4
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
4
5
  import { hashProjectPath, projectDataDir } from '../../storage/base-store.js';
5
6
  const MAX_LINES = 1000;
6
7
  /** Fire-and-forget write. Never blocks. */
@@ -32,6 +32,7 @@ function registerImplementingCascadeListener() {
32
32
  onAutopilotEvent('spec:status:implementing', (event) => {
33
33
  void (async () => {
34
34
  try {
35
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
35
36
  const { handleRecommendModel } = await import('../../tools/recommend-model-handler.js');
36
37
  handleRecommendModel({ specId: event.specId });
37
38
  }
@@ -39,7 +40,9 @@ function registerImplementingCascadeListener() {
39
40
  /* best-effort */
40
41
  }
41
42
  try {
42
- const { handleContextWindowStatus } = await import('../../tools/context-manager-handler.js');
43
+ const { handleContextWindowStatus } =
44
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
45
+ await import('../../tools/context-manager-handler.js');
43
46
  await handleContextWindowStatus({ projectPath: event.projectPath });
44
47
  }
45
48
  catch {
@@ -81,6 +84,7 @@ function registerPluginInstalledListener() {
81
84
  if (!Array.isArray(pluginIds) || pluginIds.length === 0) {
82
85
  return;
83
86
  }
87
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
84
88
  const { handleManagePlugins } = await import('../../tools/manage-plugins-handler.js');
85
89
  for (const pluginId of pluginIds) {
86
90
  if (typeof pluginId !== 'string') {
@@ -108,7 +112,10 @@ function registerSemanticIndexRefreshListener() {
108
112
  onAutopilotEvent('spec:created', (event) => {
109
113
  void (async () => {
110
114
  try {
111
- const { getOrCreateBackend } = await import('../../storage/vector-store/backend-factory.js');
115
+ const { getOrCreateBackend } =
116
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
117
+ await import('../../storage/vector-store/backend-factory.js');
118
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
112
119
  const { SemanticIndexStore } = await import('../../storage/semantic-index-store.js');
113
120
  const backend = await getOrCreateBackend(event.projectId);
114
121
  const allDocs = await backend.getAll();
@@ -46,6 +46,7 @@ async function runWithProgress(projectPath, projectId, specId, action, fn) {
46
46
  * existing create-branch handler so naming conventions stay consistent.
47
47
  */
48
48
  async function doAutoCreateBranch(projectId, specId) {
49
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
49
50
  const { handleCreateBranch } = await import('../../tools/git/branch-ops.js');
50
51
  // SPEC-1396: cascade side effect — create the ref, never move the shared checkout.
51
52
  const result = await handleCreateBranch(projectId, specId, undefined, undefined, {
@@ -69,11 +70,13 @@ export function fireAutoCreateBranch(projectPath, projectId, specId) {
69
70
  * tdd_scaffold handler once the spec path is resolved.
70
71
  */
71
72
  async function doAutoScaffoldTdd(projectPath, projectId, specId) {
73
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
72
74
  const { specStore } = await import('../../storage/index.js');
73
75
  const spec = await specStore.getSpec(projectId, specId);
74
76
  if (!spec?.specPath) {
75
77
  throw new Error(`spec ${specId} has no specPath`);
76
78
  }
79
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
77
80
  const { handleTddScaffold } = await import('../../tools/tdd-scaffold-handler.js');
78
81
  const result = await handleTddScaffold({ projectPath, specPath: spec.specPath });
79
82
  if (result.isError === true) {
@@ -100,6 +103,7 @@ export function resolveAutoMergeThreshold(config) {
100
103
  * Fire-and-forget — delegates to handleCreatePRFromSpec and captures errors.
101
104
  */
102
105
  async function doAutoCreatePr(specId) {
106
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
103
107
  const { handleCreatePRFromSpec } = await import('../../tools/github-pr-handler.js');
104
108
  const result = await handleCreatePRFromSpec({
105
109
  specId,
@@ -1,6 +1,7 @@
1
1
  // engine/autopilot/crash-shield-rate-limiter.ts — SPEC-628: Rate-limit crash scans to max once per 6h per project
2
2
  import { readFile, writeFile, mkdir } from 'node:fs/promises';
3
3
  import { join, dirname } from 'node:path';
4
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
4
5
  import { hashProjectPath, projectDataDir } from '../../storage/base-store.js';
5
6
  const SIX_HOURS_MS = 6 * 60 * 60 * 1000;
6
7
  function stateFilePath(projectPath) {
@@ -1,5 +1,6 @@
1
1
  // engine/autopilot/event-bus.ts — SPEC-413: Simple in-memory event bus for autopilot triggers
2
2
  // SPEC-772: log each emitted event to autopilot-log.jsonl (best-effort, fire-and-forget)
3
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
3
4
  import { appendAutopilotLogEntry } from '../../storage/autopilot-log-store.js';
4
5
  const handlers = new Map();
5
6
  export function onAutopilotEvent(name, handler) {
@@ -4,10 +4,15 @@
4
4
  // SPEC-753: File-lock applied to all writes; self-healing on corrupt reads.
5
5
  import { readFile } from 'node:fs/promises';
6
6
  import { join } from 'node:path';
7
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
7
8
  import { withStatusLock } from '../../storage/status-store/file-lock.js';
9
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
8
10
  import { validateStatusJson, rebuildStatusFromFrontmatters, writeRebuiltStatus, } from '../../storage/status-store/self-healing.js';
11
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
9
12
  import { syncVersionField } from '../../storage/status-store/version-sync.js';
13
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
10
14
  import { hashProjectPath, projectDataDir } from '../../storage/base-store.js';
15
+ // eslint-disable-next-line no-restricted-imports -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
11
16
  import { atomicStatusWrite } from '../../storage/status-store/atomic-status-write.js';
12
17
  const STATUS_FILENAME = 'status.json';
13
18
  const MAX_RECENT_CHANGES = 20;
@@ -97,6 +102,7 @@ export async function refreshProjectStatus(projectPath, projectId) {
97
102
  const filePath = getStatusPath(projectPath);
98
103
  try {
99
104
  await withStatusLock(filePath, async () => {
105
+ // eslint-disable-next-line no-restricted-syntax -- grandfathered layer violation, remediation SPEC-1661 SPEC-1662 SPEC-1663
100
106
  const { specStore } = await import('../../storage/index.js');
101
107
  const specs = await specStore.listSpecs(projectId);
102
108
  const { PLANU_VERSION } = await import('../../config/version.js');
@@ -2,6 +2,7 @@ import { technologyValue } from './technology-registry.js';
2
2
  // engine/browser-validator.ts — SPEC-308: Parse spec criteria for UI checkable assertions
3
3
  import { execFile } from 'node:child_process';
4
4
  import { promisify } from 'node:util';
5
+ import { escapeRegex as escapeRegExpLiteral } from '../core/shared/strings.js';
5
6
  const execFileAsync = promisify(execFile);
6
7
  /** Patterns that indicate a visibility assertion. */
7
8
  const VISIBILITY_KEYWORDS = ['visible', 'shown', 'displayed', 'appear', 'shows', 'see'];
@@ -88,9 +89,6 @@ export function extractUIAssertions(criteriaMarkdown) {
88
89
  }
89
90
  return assertions;
90
91
  }
91
- function escapeRegExpLiteral(value) {
92
- return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
93
- }
94
92
  function safeComment(value) {
95
93
  return value.replace(/[\r\n\u2028\u2029]+/g, ' ');
96
94
  }
@@ -5,6 +5,7 @@ import { technologyValue } from './technology-registry.js';
5
5
  // package.json devDependencies and config files.
6
6
  import { readFile, access } from 'node:fs/promises';
7
7
  import { join } from 'node:path';
8
+ import { readFileSafe } from '../core/shared/fs.js';
8
9
  // -- Constants ----------------------------------------------------------------
9
10
  /** devDependency key → BuildTool */
10
11
  const DEV_DEP_TO_BUILD_TOOL = new Map([
@@ -71,14 +72,6 @@ async function configFileExists(filePath) {
71
72
  return false;
72
73
  }
73
74
  }
74
- async function readFileSafe(filePath) {
75
- try {
76
- return await readFile(filePath, 'utf-8');
77
- }
78
- catch {
79
- return '';
80
- }
81
- }
82
75
  function allDeps(pkg) {
83
76
  return { ...pkg.dependencies, ...pkg.devDependencies };
84
77
  }