peaks-loop 4.0.0-beta.8 → 4.0.0-beta.9
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.
- package/CHANGELOG.md +45 -0
- package/bin/peaks.js +1 -1
- package/dist/cli/cli-helpers.d.ts +43 -0
- package/dist/cli/cli-helpers.js +86 -0
- package/dist/cli/commands/_cli-error-envelope.d.ts +19 -0
- package/dist/cli/commands/_cli-error-envelope.js +50 -0
- package/dist/cli/commands/adapter-commands-s2a.d.ts +34 -0
- package/dist/cli/commands/adapter-commands-s2a.js +92 -0
- package/dist/cli/commands/adapter-commands.d.ts +30 -0
- package/dist/cli/commands/adapter-commands.js +35 -0
- package/dist/cli/commands/agent-commands.d.ts +20 -0
- package/dist/cli/commands/agent-commands.js +48 -0
- package/dist/cli/commands/asset-commands.d.ts +45 -0
- package/dist/cli/commands/asset-commands.js +404 -0
- package/dist/cli/commands/audit-commands.d.ts +28 -0
- package/dist/cli/commands/audit-commands.js +437 -0
- package/dist/cli/commands/bee-commands.d.ts +26 -0
- package/dist/cli/commands/bee-commands.js +169 -0
- package/dist/cli/commands/capability-commands.d.ts +16 -0
- package/dist/cli/commands/capability-commands.js +45 -0
- package/dist/cli/commands/capability-worker-config-sc-commands.d.ts +3 -0
- package/dist/cli/commands/capability-worker-config-sc-commands.js +10 -0
- package/dist/cli/commands/classify-classify-commands.d.ts +19 -0
- package/dist/cli/commands/classify-classify-commands.js +151 -0
- package/dist/cli/commands/code-commands.d.ts +80 -0
- package/dist/cli/commands/code-commands.js +798 -0
- package/dist/cli/commands/code-review-commands.d.ts +34 -0
- package/dist/cli/commands/code-review-commands.js +83 -0
- package/dist/cli/commands/codegraph-commands.d.ts +3 -0
- package/dist/cli/commands/codegraph-commands.js +99 -0
- package/dist/cli/commands/compact-command.d.ts +21 -0
- package/dist/cli/commands/compact-command.js +252 -0
- package/dist/cli/commands/complexity-commands.d.ts +9 -0
- package/dist/cli/commands/complexity-commands.js +34 -0
- package/dist/cli/commands/config-commands.d.ts +3 -0
- package/dist/cli/commands/config-commands.js +220 -0
- package/dist/cli/commands/context-builder-commands.d.ts +11 -0
- package/dist/cli/commands/context-builder-commands.js +85 -0
- package/dist/cli/commands/context-commands.d.ts +21 -0
- package/dist/cli/commands/context-commands.js +254 -0
- package/dist/cli/commands/contract-commands.d.ts +26 -0
- package/dist/cli/commands/contract-commands.js +114 -0
- package/dist/cli/commands/core/artifacts-command.d.ts +3 -0
- package/dist/cli/commands/core/artifacts-command.js +62 -0
- package/dist/cli/commands/core/binding-commands.d.ts +3 -0
- package/dist/cli/commands/core/binding-commands.js +58 -0
- package/dist/cli/commands/core/doctor-command.d.ts +11 -0
- package/dist/cli/commands/core/doctor-command.js +204 -0
- package/dist/cli/commands/core/memory-command.d.ts +3 -0
- package/dist/cli/commands/core/memory-command.js +98 -0
- package/dist/cli/commands/core/profile-command.d.ts +3 -0
- package/dist/cli/commands/core/profile-command.js +9 -0
- package/dist/cli/commands/core/proxy-command.d.ts +3 -0
- package/dist/cli/commands/core/proxy-command.js +26 -0
- package/dist/cli/commands/core/session-command.d.ts +3 -0
- package/dist/cli/commands/core/session-command.js +241 -0
- package/dist/cli/commands/core/skill-command.d.ts +3 -0
- package/dist/cli/commands/core/skill-command.js +300 -0
- package/dist/cli/commands/core/standards-command.d.ts +3 -0
- package/dist/cli/commands/core/standards-command.js +95 -0
- package/dist/cli/commands/core-artifact-commands.d.ts +15 -0
- package/dist/cli/commands/core-artifact-commands.js +31 -0
- package/dist/cli/commands/dispatch-commands.d.ts +10 -0
- package/dist/cli/commands/dispatch-commands.js +351 -0
- package/dist/cli/commands/dispatch-from-dag.d.ts +3 -0
- package/dist/cli/commands/dispatch-from-dag.js +251 -0
- package/dist/cli/commands/doc-commands.d.ts +11 -0
- package/dist/cli/commands/doc-commands.js +65 -0
- package/dist/cli/commands/evolution-commands.d.ts +27 -0
- package/dist/cli/commands/evolution-commands.js +393 -0
- package/dist/cli/commands/feedback-commands.d.ts +18 -0
- package/dist/cli/commands/feedback-commands.js +145 -0
- package/dist/cli/commands/final-review-commands.d.ts +31 -0
- package/dist/cli/commands/final-review-commands.js +161 -0
- package/dist/cli/commands/fixture-commands.d.ts +32 -0
- package/dist/cli/commands/fixture-commands.js +91 -0
- package/dist/cli/commands/fork-commands.d.ts +16 -0
- package/dist/cli/commands/fork-commands.js +163 -0
- package/dist/cli/commands/gate-commands.d.ts +3 -0
- package/dist/cli/commands/gate-commands.js +117 -0
- package/dist/cli/commands/heartbeat-commands.d.ts +3 -0
- package/dist/cli/commands/heartbeat-commands.js +135 -0
- package/dist/cli/commands/hook-handle.d.ts +17 -0
- package/dist/cli/commands/hook-handle.js +157 -0
- package/dist/cli/commands/hooks-commands.d.ts +3 -0
- package/dist/cli/commands/hooks-commands.js +156 -0
- package/dist/cli/commands/ide-commands.d.ts +25 -0
- package/dist/cli/commands/ide-commands.js +42 -0
- package/dist/cli/commands/impact-commands.d.ts +15 -0
- package/dist/cli/commands/impact-commands.js +62 -0
- package/dist/cli/commands/job-commands.d.ts +3 -0
- package/dist/cli/commands/job-commands.js +289 -0
- package/dist/cli/commands/legacy-commands.d.ts +11 -0
- package/dist/cli/commands/legacy-commands.js +32 -0
- package/dist/cli/commands/log-commands.d.ts +17 -0
- package/dist/cli/commands/log-commands.js +64 -0
- package/dist/cli/commands/loop-commands.d.ts +27 -0
- package/dist/cli/commands/loop-commands.js +262 -0
- package/dist/cli/commands/loop-eval-commands.d.ts +20 -0
- package/dist/cli/commands/loop-eval-commands.js +526 -0
- package/dist/cli/commands/memory-commands.d.ts +23 -0
- package/dist/cli/commands/memory-commands.js +129 -0
- package/dist/cli/commands/migrate-1-4-1-command.d.ts +11 -0
- package/dist/cli/commands/migrate-1-4-1-command.js +34 -0
- package/dist/cli/commands/migrate-v2-10-to-v2-11-command.d.ts +20 -0
- package/dist/cli/commands/migrate-v2-10-to-v2-11-command.js +52 -0
- package/dist/cli/commands/mut-commands.d.ts +20 -0
- package/dist/cli/commands/mut-commands.js +239 -0
- package/dist/cli/commands/observability-commands.d.ts +22 -0
- package/dist/cli/commands/observability-commands.js +201 -0
- package/dist/cli/commands/openspec-commands.d.ts +3 -0
- package/dist/cli/commands/openspec-commands.js +237 -0
- package/dist/cli/commands/perf-audit-commands.d.ts +22 -0
- package/dist/cli/commands/perf-audit-commands.js +132 -0
- package/dist/cli/commands/perf-commands.d.ts +3 -0
- package/dist/cli/commands/perf-commands.js +41 -0
- package/dist/cli/commands/playwright-commands.d.ts +95 -0
- package/dist/cli/commands/playwright-commands.js +432 -0
- package/dist/cli/commands/polyrepo-commands.d.ts +37 -0
- package/dist/cli/commands/polyrepo-commands.js +155 -0
- package/dist/cli/commands/prd-blocks-commands.d.ts +18 -0
- package/dist/cli/commands/prd-blocks-commands.js +50 -0
- package/dist/cli/commands/prd-commands.d.ts +18 -0
- package/dist/cli/commands/prd-commands.js +141 -0
- package/dist/cli/commands/preferences-commands.d.ts +2 -0
- package/dist/cli/commands/preferences-commands.js +197 -0
- package/dist/cli/commands/project-commands.d.ts +3 -0
- package/dist/cli/commands/project-commands.js +253 -0
- package/dist/cli/commands/qa-business-review-commands.d.ts +17 -0
- package/dist/cli/commands/qa-business-review-commands.js +148 -0
- package/dist/cli/commands/qa-commands.d.ts +94 -0
- package/dist/cli/commands/qa-commands.js +271 -0
- package/dist/cli/commands/release-commands.d.ts +24 -0
- package/dist/cli/commands/release-commands.js +231 -0
- package/dist/cli/commands/request-commands.d.ts +3 -0
- package/dist/cli/commands/request-commands.js +548 -0
- package/dist/cli/commands/retrospective-commands.d.ts +12 -0
- package/dist/cli/commands/retrospective-commands.js +175 -0
- package/dist/cli/commands/reviewer-commands.d.ts +14 -0
- package/dist/cli/commands/reviewer-commands.js +64 -0
- package/dist/cli/commands/role-commands.d.ts +13 -0
- package/dist/cli/commands/role-commands.js +85 -0
- package/dist/cli/commands/runtime-commands.d.ts +52 -0
- package/dist/cli/commands/runtime-commands.js +150 -0
- package/dist/cli/commands/sc-commands.d.ts +3 -0
- package/dist/cli/commands/sc-commands.js +45 -0
- package/dist/cli/commands/scan-commands.d.ts +3 -0
- package/dist/cli/commands/scan-commands.js +445 -0
- package/dist/cli/commands/security-audit-commands.d.ts +23 -0
- package/dist/cli/commands/security-audit-commands.js +132 -0
- package/dist/cli/commands/sediment-commands.d.ts +80 -0
- package/dist/cli/commands/sediment-commands.js +649 -0
- package/dist/cli/commands/session-auto-compact-hook-command.d.ts +37 -0
- package/dist/cli/commands/session-auto-compact-hook-command.js +127 -0
- package/dist/cli/commands/session-checkpoint-command.d.ts +10 -0
- package/dist/cli/commands/session-checkpoint-command.js +100 -0
- package/dist/cli/commands/session-migrate-skill-name.d.ts +17 -0
- package/dist/cli/commands/session-migrate-skill-name.js +41 -0
- package/dist/cli/commands/session-resume-command.d.ts +11 -0
- package/dist/cli/commands/session-resume-command.js +83 -0
- package/dist/cli/commands/share-commands.d.ts +17 -0
- package/dist/cli/commands/share-commands.js +296 -0
- package/dist/cli/commands/skill-conformance-commands.d.ts +9 -0
- package/dist/cli/commands/skill-conformance-commands.js +39 -0
- package/dist/cli/commands/skill-loop-engineering-readiness-commands.d.ts +67 -0
- package/dist/cli/commands/skill-loop-engineering-readiness-commands.js +173 -0
- package/dist/cli/commands/skill-search-commands.d.ts +25 -0
- package/dist/cli/commands/skill-search-commands.js +68 -0
- package/dist/cli/commands/skill-visibility.d.ts +8 -0
- package/dist/cli/commands/skill-visibility.js +63 -0
- package/dist/cli/commands/slice-commands.d.ts +24 -0
- package/dist/cli/commands/slice-commands.js +492 -0
- package/dist/cli/commands/slice-integrate-commands.d.ts +11 -0
- package/dist/cli/commands/slice-integrate-commands.js +74 -0
- package/dist/cli/commands/slice-review-commands.d.ts +23 -0
- package/dist/cli/commands/slice-review-commands.js +162 -0
- package/dist/cli/commands/smoke-commands.d.ts +21 -0
- package/dist/cli/commands/smoke-commands.js +203 -0
- package/dist/cli/commands/sop-commands.d.ts +3 -0
- package/dist/cli/commands/sop-commands.js +215 -0
- package/dist/cli/commands/statusline-commands.d.ts +3 -0
- package/dist/cli/commands/statusline-commands.js +169 -0
- package/dist/cli/commands/sub-agent-commands.d.ts +22 -0
- package/dist/cli/commands/sub-agent-commands.js +19 -0
- package/dist/cli/commands/sub-agent-dispatch-guard.d.ts +55 -0
- package/dist/cli/commands/sub-agent-dispatch-guard.js +57 -0
- package/dist/cli/commands/sub-agent-shared.d.ts +99 -0
- package/dist/cli/commands/sub-agent-shared.js +67 -0
- package/dist/cli/commands/test-commands.d.ts +47 -0
- package/dist/cli/commands/test-commands.js +204 -0
- package/dist/cli/commands/understand-commands.d.ts +3 -0
- package/dist/cli/commands/understand-commands.js +148 -0
- package/dist/cli/commands/upgrade-commands.d.ts +23 -0
- package/dist/cli/commands/upgrade-commands.js +119 -0
- package/dist/cli/commands/user-touchpoint-commands.d.ts +18 -0
- package/dist/cli/commands/user-touchpoint-commands.js +78 -0
- package/dist/cli/commands/verdict-aggregate-command.d.ts +14 -0
- package/dist/cli/commands/verdict-aggregate-command.js +106 -0
- package/dist/cli/commands/worker-commands.d.ts +3 -0
- package/dist/cli/commands/worker-commands.js +52 -0
- package/dist/cli/commands/workflow-commands.d.ts +3 -0
- package/dist/cli/commands/workflow-commands.js +544 -0
- package/dist/cli/commands/workflow-plan-commands.d.ts +39 -0
- package/dist/cli/commands/workflow-plan-commands.js +163 -0
- package/dist/cli/commands/workspace/clean-command.d.ts +14 -0
- package/dist/cli/commands/workspace/clean-command.js +49 -0
- package/dist/cli/commands/workspace/helpers.d.ts +28 -0
- package/dist/cli/commands/workspace/helpers.js +87 -0
- package/dist/cli/commands/workspace/init-command.d.ts +139 -0
- package/dist/cli/commands/workspace/init-command.js +505 -0
- package/dist/cli/commands/workspace/migrate-command.d.ts +11 -0
- package/dist/cli/commands/workspace/migrate-command.js +91 -0
- package/dist/cli/commands/workspace/reconcile-command.d.ts +14 -0
- package/dist/cli/commands/workspace/reconcile-command.js +103 -0
- package/dist/cli/commands/workspace-commands.d.ts +18 -0
- package/dist/cli/commands/workspace-commands.js +50 -0
- package/dist/cli/index.d.ts +1 -0
- package/dist/cli/index.js +30 -0
- package/dist/cli/program.d.ts +5 -0
- package/dist/cli/program.js +408 -0
- package/dist/hooks/pre-tool-use-sub-agent.d.ts +28 -0
- package/dist/hooks/pre-tool-use-sub-agent.js +105 -0
- package/dist/lib/render/message-renderer.d.ts +20 -0
- package/dist/lib/render/message-renderer.js +80 -0
- package/dist/services/adapter/adapter-registry.d.ts +48 -0
- package/dist/services/adapter/adapter-registry.js +186 -0
- package/dist/services/adapter/adapter.d.ts +27 -0
- package/dist/services/adapter/adapter.js +5 -0
- package/dist/services/adapter/auto-adapter.d.ts +11 -0
- package/dist/services/adapter/auto-adapter.js +15 -0
- package/dist/services/adapter/claude-adapter.d.ts +14 -0
- package/dist/services/adapter/claude-adapter.js +40 -0
- package/dist/services/adapter/codex-adapter.d.ts +14 -0
- package/dist/services/adapter/codex-adapter.js +14 -0
- package/dist/services/adapter/copilot-adapter.d.ts +14 -0
- package/dist/services/adapter/copilot-adapter.js +14 -0
- package/dist/services/agent/ecc-agent-service.d.ts +47 -0
- package/dist/services/agent/ecc-agent-service.js +143 -0
- package/dist/services/artifacts/artifact-lint-service.d.ts +23 -0
- package/dist/services/artifacts/artifact-lint-service.js +99 -0
- package/dist/services/artifacts/artifact-prerequisites.d.ts +78 -0
- package/dist/services/artifacts/artifact-prerequisites.js +491 -0
- package/dist/services/artifacts/artifact-service.d.ts +43 -0
- package/dist/services/artifacts/artifact-service.js +98 -0
- package/dist/services/artifacts/artifact-templates.d.ts +30 -0
- package/dist/services/artifacts/artifact-templates.js +302 -0
- package/dist/services/artifacts/repair-cycle-service.d.ts +23 -0
- package/dist/services/artifacts/repair-cycle-service.js +52 -0
- package/dist/services/artifacts/request-artifact-service.d.ts +116 -0
- package/dist/services/artifacts/request-artifact-service.js +451 -0
- package/dist/services/artifacts/request-artifact-state-helpers.d.ts +51 -0
- package/dist/services/artifacts/request-artifact-state-helpers.js +114 -0
- package/dist/services/artifacts/workspace-service.d.ts +34 -0
- package/dist/services/artifacts/workspace-service.js +272 -0
- package/dist/services/audit/artifact-writer.d.ts +93 -0
- package/dist/services/audit/artifact-writer.js +303 -0
- package/dist/services/audit/audit-goal-service.d.ts +35 -0
- package/dist/services/audit/audit-goal-service.js +75 -0
- package/dist/services/audit/audit-goal-types.d.ts +40 -0
- package/dist/services/audit/audit-goal-types.js +15 -0
- package/dist/services/audit/backing-detector.d.ts +24 -0
- package/dist/services/audit/backing-detector.js +59 -0
- package/dist/services/audit/classifier.d.ts +38 -0
- package/dist/services/audit/classifier.js +134 -0
- package/dist/services/audit/decision-writer.d.ts +76 -0
- package/dist/services/audit/decision-writer.js +217 -0
- package/dist/services/audit/enforcers/active-skill-resolver.d.ts +29 -0
- package/dist/services/audit/enforcers/active-skill-resolver.js +71 -0
- package/dist/services/audit/enforcers/code-ban.d.ts +23 -0
- package/dist/services/audit/enforcers/code-ban.js +27 -0
- package/dist/services/audit/enforcers/design-draft-confirm.d.ts +24 -0
- package/dist/services/audit/enforcers/design-draft-confirm.js +58 -0
- package/dist/services/audit/enforcers/lint-audit-regression.d.ts +21 -0
- package/dist/services/audit/enforcers/lint-audit-regression.js +86 -0
- package/dist/services/audit/enforcers/lint-catalog-governance.d.ts +32 -0
- package/dist/services/audit/enforcers/lint-catalog-governance.js +48 -0
- package/dist/services/audit/enforcers/lint-cli-back.d.ts +16 -0
- package/dist/services/audit/enforcers/lint-cli-back.js +35 -0
- package/dist/services/audit/enforcers/lint-output-style.d.ts +11 -0
- package/dist/services/audit/enforcers/lint-output-style.js +94 -0
- package/dist/services/audit/enforcers/lint-reference-integrity.d.ts +6 -0
- package/dist/services/audit/enforcers/lint-reference-integrity.js +83 -0
- package/dist/services/audit/enforcers/lint-reference-shape.d.ts +30 -0
- package/dist/services/audit/enforcers/lint-reference-shape.js +272 -0
- package/dist/services/audit/enforcers/lint-style.d.ts +49 -0
- package/dist/services/audit/enforcers/lint-style.js +173 -0
- package/dist/services/audit/enforcers/lint-workflow-shape.d.ts +4 -0
- package/dist/services/audit/enforcers/lint-workflow-shape.js +100 -0
- package/dist/services/audit/enforcers/login-gate.d.ts +23 -0
- package/dist/services/audit/enforcers/login-gate.js +40 -0
- package/dist/services/audit/enforcers/mock-placement.d.ts +25 -0
- package/dist/services/audit/enforcers/mock-placement.js +48 -0
- package/dist/services/audit/enforcers/no-root-pollution.d.ts +21 -0
- package/dist/services/audit/enforcers/no-root-pollution.js +56 -0
- package/dist/services/audit/enforcers/pre-rd-scan.d.ts +22 -0
- package/dist/services/audit/enforcers/pre-rd-scan.js +23 -0
- package/dist/services/audit/enforcers/prototype-fidelity.d.ts +25 -0
- package/dist/services/audit/enforcers/prototype-fidelity.js +75 -0
- package/dist/services/audit/enforcers/resume-detection.d.ts +21 -0
- package/dist/services/audit/enforcers/resume-detection.js +52 -0
- package/dist/services/audit/enforcers/sub-agent-sid.d.ts +25 -0
- package/dist/services/audit/enforcers/sub-agent-sid.js +63 -0
- package/dist/services/audit/prose-ratio-calculator.d.ts +45 -0
- package/dist/services/audit/prose-ratio-calculator.js +52 -0
- package/dist/services/audit/red-line-catalog-p2-a.d.ts +21 -0
- package/dist/services/audit/red-line-catalog-p2-a.js +229 -0
- package/dist/services/audit/red-line-catalog-p2-b.d.ts +19 -0
- package/dist/services/audit/red-line-catalog-p2-b.js +225 -0
- package/dist/services/audit/red-line-catalog.d.ts +51 -0
- package/dist/services/audit/red-line-catalog.js +195 -0
- package/dist/services/audit/red-lines-service.d.ts +23 -0
- package/dist/services/audit/red-lines-service.js +464 -0
- package/dist/services/audit/scanners/openspec-scanner.d.ts +15 -0
- package/dist/services/audit/scanners/openspec-scanner.js +55 -0
- package/dist/services/audit/scanners/rules-tree-scanner.d.ts +16 -0
- package/dist/services/audit/scanners/rules-tree-scanner.js +56 -0
- package/dist/services/audit/scanners/skills-tree-scanner.d.ts +17 -0
- package/dist/services/audit/scanners/skills-tree-scanner.js +68 -0
- package/dist/services/audit/static-service.d.ts +60 -0
- package/dist/services/audit/static-service.js +130 -0
- package/dist/services/audit/types.d.ts +86 -0
- package/dist/services/audit/types.js +13 -0
- package/dist/services/audit-independent/perf-audit-service.d.ts +151 -0
- package/dist/services/audit-independent/perf-audit-service.js +316 -0
- package/dist/services/audit-independent/security-audit-service.d.ts +155 -0
- package/dist/services/audit-independent/security-audit-service.js +316 -0
- package/dist/services/classify/classify-service.d.ts +42 -0
- package/dist/services/classify/classify-service.js +122 -0
- package/dist/services/classify/classify-types.d.ts +79 -0
- package/dist/services/classify/classify-types.js +90 -0
- package/dist/services/code/auto-compact-orchestrator.d.ts +98 -0
- package/dist/services/code/auto-compact-orchestrator.js +343 -0
- package/dist/services/code/batch-heartbeat-poller.d.ts +51 -0
- package/dist/services/code/batch-heartbeat-poller.js +88 -0
- package/dist/services/code/dag-orchestrator.d.ts +128 -0
- package/dist/services/code/dag-orchestrator.js +304 -0
- package/dist/services/code/emit-handoff.d.ts +49 -0
- package/dist/services/code/emit-handoff.js +79 -0
- package/dist/services/code/job-shape-decision.d.ts +71 -0
- package/dist/services/code/job-shape-decision.js +151 -0
- package/dist/services/code/mode-gate.d.ts +163 -0
- package/dist/services/code/mode-gate.js +212 -0
- package/dist/services/code/post-compact-detector.d.ts +61 -0
- package/dist/services/code/post-compact-detector.js +240 -0
- package/dist/services/code/status-line-renderer.d.ts +34 -0
- package/dist/services/code/status-line-renderer.js +55 -0
- package/dist/services/code/step-08-gate.d.ts +90 -0
- package/dist/services/code/step-08-gate.js +136 -0
- package/dist/services/code/user-touchpoint-classifier.d.ts +44 -0
- package/dist/services/code/user-touchpoint-classifier.js +145 -0
- package/dist/services/code-review/ecc-bridge.d.ts +148 -0
- package/dist/services/code-review/ecc-bridge.js +242 -0
- package/dist/services/code-review/ocr-service.d.ts +129 -0
- package/dist/services/code-review/ocr-service.js +369 -0
- package/dist/services/codegraph/codegraph-process-runner.d.ts +2 -0
- package/dist/services/codegraph/codegraph-process-runner.js +93 -0
- package/dist/services/codegraph/codegraph-service.d.ts +43 -0
- package/dist/services/codegraph/codegraph-service.js +160 -0
- package/dist/services/compact/decision-tables.d.ts +66 -0
- package/dist/services/compact/decision-tables.js +127 -0
- package/dist/services/compact/request-transition-hook.d.ts +20 -0
- package/dist/services/compact/request-transition-hook.js +110 -0
- package/dist/services/compact/suggest-service.d.ts +74 -0
- package/dist/services/compact/suggest-service.js +203 -0
- package/dist/services/complexity/complexity-estimator.d.ts +34 -0
- package/dist/services/complexity/complexity-estimator.js +64 -0
- package/dist/services/config/config-migration.d.ts +45 -0
- package/dist/services/config/config-migration.js +154 -0
- package/dist/services/config/config-restore.d.ts +10 -0
- package/dist/services/config/config-restore.js +47 -0
- package/dist/services/config/config-rollback.d.ts +13 -0
- package/dist/services/config/config-rollback.js +26 -0
- package/dist/services/config/config-safety.d.ts +40 -0
- package/dist/services/config/config-safety.js +359 -0
- package/dist/services/config/config-service.d.ts +69 -0
- package/dist/services/config/config-service.js +814 -0
- package/dist/services/config/config-types.d.ts +119 -0
- package/dist/services/config/config-types.js +18 -0
- package/dist/services/config/model-routing.d.ts +66 -0
- package/dist/services/config/model-routing.js +105 -0
- package/dist/services/config/provider-service.d.ts +48 -0
- package/dist/services/config/provider-service.js +143 -0
- package/dist/services/config/proxy-service.d.ts +21 -0
- package/dist/services/config/proxy-service.js +44 -0
- package/dist/services/config/sidecar-store.d.ts +25 -0
- package/dist/services/config/sidecar-store.js +61 -0
- package/dist/services/config/workspace-state-service.d.ts +30 -0
- package/dist/services/config/workspace-state-service.js +142 -0
- package/dist/services/context/artifact-meta.d.ts +72 -0
- package/dist/services/context/artifact-meta.js +105 -0
- package/dist/services/context/auto-compact-dispatcher.d.ts +37 -0
- package/dist/services/context/auto-compact-dispatcher.js +240 -0
- package/dist/services/context/auto-compact-reader.d.ts +51 -0
- package/dist/services/context/auto-compact-reader.js +164 -0
- package/dist/services/context/auto-compact-types.d.ts +143 -0
- package/dist/services/context/auto-compact-types.js +36 -0
- package/dist/services/context/collector.d.ts +24 -0
- package/dist/services/context/collector.js +133 -0
- package/dist/services/context/context-builder.d.ts +30 -0
- package/dist/services/context/context-builder.js +78 -0
- package/dist/services/context/context-guard.d.ts +49 -0
- package/dist/services/context/context-guard.js +91 -0
- package/dist/services/context/context-schema.d.ts +415 -0
- package/dist/services/context/context-schema.js +73 -0
- package/dist/services/context/dispatch-context-guard.d.ts +27 -0
- package/dist/services/context/dispatch-context-guard.js +192 -0
- package/dist/services/context/doc-retriever.d.ts +26 -0
- package/dist/services/context/doc-retriever.js +51 -0
- package/dist/services/context/headroom-client.d.ts +34 -0
- package/dist/services/context/headroom-client.js +117 -0
- package/dist/services/context/headroom-fetcher.d.ts +6 -0
- package/dist/services/context/headroom-fetcher.js +28 -0
- package/dist/services/context/headroom-prefs.d.ts +46 -0
- package/dist/services/context/headroom-prefs.js +34 -0
- package/dist/services/context/index.d.ts +7 -0
- package/dist/services/context/index.js +6 -0
- package/dist/services/context/main-session-monitor.d.ts +89 -0
- package/dist/services/context/main-session-monitor.js +142 -0
- package/dist/services/context/renderer.d.ts +20 -0
- package/dist/services/context/renderer.js +30 -0
- package/dist/services/context/shared-channel.d.ts +93 -0
- package/dist/services/context/shared-channel.js +308 -0
- package/dist/services/context/threshold.d.ts +35 -0
- package/dist/services/context/threshold.js +76 -0
- package/dist/services/context/tokenizer.d.ts +12 -0
- package/dist/services/context/tokenizer.js +43 -0
- package/dist/services/context/types.d.ts +93 -0
- package/dist/services/context/types.js +9 -0
- package/dist/services/crystallization/crystallization-service.d.ts +239 -0
- package/dist/services/crystallization/crystallization-service.js +397 -0
- package/dist/services/crystallization/crystallization-store.d.ts +75 -0
- package/dist/services/crystallization/crystallization-store.js +193 -0
- package/dist/services/crystallization/crystallization-types.d.ts +313 -0
- package/dist/services/crystallization/crystallization-types.js +299 -0
- package/dist/services/crystallization/evidence-brief-builder.d.ts +237 -0
- package/dist/services/crystallization/evidence-brief-builder.js +240 -0
- package/dist/services/dashboard/project-dashboard-service.d.ts +91 -0
- package/dist/services/dashboard/project-dashboard-service.js +147 -0
- package/dist/services/dispatch/batch-counter.d.ts +27 -0
- package/dist/services/dispatch/batch-counter.js +102 -0
- package/dist/services/dispatch/contract-store.d.ts +63 -0
- package/dist/services/dispatch/contract-store.js +157 -0
- package/dist/services/dispatch/dispatch-record-writer.d.ts +138 -0
- package/dist/services/dispatch/dispatch-record-writer.js +460 -0
- package/dist/services/dispatch/heartbeat-truncator.d.ts +26 -0
- package/dist/services/dispatch/heartbeat-truncator.js +13 -0
- package/dist/services/dispatch/leak-detector.d.ts +11 -0
- package/dist/services/dispatch/leak-detector.js +72 -0
- package/dist/services/dispatch/slice-dag.d.ts +81 -0
- package/dist/services/dispatch/slice-dag.js +238 -0
- package/dist/services/dispatch/sub-agent-dispatcher.d.ts +239 -0
- package/dist/services/dispatch/sub-agent-dispatcher.js +382 -0
- package/dist/services/dispatch/test-tool-detection.d.ts +36 -0
- package/dist/services/dispatch/test-tool-detection.js +46 -0
- package/dist/services/doc/doc-generator.d.ts +38 -0
- package/dist/services/doc/doc-generator.js +122 -0
- package/dist/services/doctor/doctor-service.d.ts +149 -0
- package/dist/services/doctor/doctor-service.js +929 -0
- package/dist/services/evolution/evolution-service.d.ts +137 -0
- package/dist/services/evolution/evolution-service.js +281 -0
- package/dist/services/evolution/evolution-store.d.ts +57 -0
- package/dist/services/evolution/evolution-store.js +232 -0
- package/dist/services/evolution/evolution-types.d.ts +706 -0
- package/dist/services/evolution/evolution-types.js +286 -0
- package/dist/services/evolution/independent-evaluator-runner.d.ts +90 -0
- package/dist/services/evolution/independent-evaluator-runner.js +106 -0
- package/dist/services/evolution/regression-skeptic-runner.d.ts +64 -0
- package/dist/services/evolution/regression-skeptic-runner.js +113 -0
- package/dist/services/feedback/feedback-promotion-service.d.ts +123 -0
- package/dist/services/feedback/feedback-promotion-service.js +300 -0
- package/dist/services/filesystem/file-lock.d.ts +11 -0
- package/dist/services/filesystem/file-lock.js +152 -0
- package/dist/services/final-review/final-review-service.d.ts +12 -0
- package/dist/services/final-review/final-review-service.js +52 -0
- package/dist/services/final-review/final-review-types.d.ts +42 -0
- package/dist/services/final-review/final-review-types.js +18 -0
- package/dist/services/fixture/fixture-capture-service.d.ts +87 -0
- package/dist/services/fixture/fixture-capture-service.js +317 -0
- package/dist/services/fixture/fixture-sanitize-service.d.ts +117 -0
- package/dist/services/fixture/fixture-sanitize-service.js +161 -0
- package/dist/services/fixture/index.d.ts +8 -0
- package/dist/services/fixture/index.js +8 -0
- package/dist/services/fork/fork-sync-state.d.ts +85 -0
- package/dist/services/fork/fork-sync-state.js +130 -0
- package/dist/services/fuzzy-matching/fuzzy-match-service.d.ts +15 -0
- package/dist/services/fuzzy-matching/fuzzy-match-service.js +56 -0
- package/dist/services/fuzzy-matching/fzf-pick-service.d.ts +68 -0
- package/dist/services/fuzzy-matching/fzf-pick-service.js +158 -0
- package/dist/services/fuzzy-matching/types.d.ts +20 -0
- package/dist/services/fuzzy-matching/types.js +1 -0
- package/dist/services/handoff/handoff-parser.d.ts +28 -0
- package/dist/services/handoff/handoff-parser.js +69 -0
- package/dist/services/handoff/handoff-types.d.ts +39 -0
- package/dist/services/handoff/handoff-types.js +19 -0
- package/dist/services/handoff/handoff-writer.d.ts +23 -0
- package/dist/services/handoff/handoff-writer.js +30 -0
- package/dist/services/hooks/auto-compact-hook-install.d.ts +104 -0
- package/dist/services/hooks/auto-compact-hook-install.js +157 -0
- package/dist/services/hooks/output.d.ts +92 -0
- package/dist/services/hooks/output.js +111 -0
- package/dist/services/hooks/presence-marker-detector.d.ts +16 -0
- package/dist/services/hooks/presence-marker-detector.js +105 -0
- package/dist/services/ide/adapters/claude-code-adapter.d.ts +18 -0
- package/dist/services/ide/adapters/claude-code-adapter.js +103 -0
- package/dist/services/ide/adapters/codex-adapter.d.ts +46 -0
- package/dist/services/ide/adapters/codex-adapter.js +97 -0
- package/dist/services/ide/adapters/cursor-adapter.d.ts +36 -0
- package/dist/services/ide/adapters/cursor-adapter.js +84 -0
- package/dist/services/ide/adapters/hermes-adapter.d.ts +21 -0
- package/dist/services/ide/adapters/hermes-adapter.js +51 -0
- package/dist/services/ide/adapters/openclaw-adapter.d.ts +14 -0
- package/dist/services/ide/adapters/openclaw-adapter.js +42 -0
- package/dist/services/ide/adapters/trae-adapter.d.ts +42 -0
- package/dist/services/ide/adapters/trae-adapter.js +83 -0
- package/dist/services/ide/adapters/zcode-adapter.d.ts +40 -0
- package/dist/services/ide/adapters/zcode-adapter.js +220 -0
- package/dist/services/ide/current-model-detector.d.ts +14 -0
- package/dist/services/ide/current-model-detector.js +60 -0
- package/dist/services/ide/hook-protocol.d.ts +47 -0
- package/dist/services/ide/hook-protocol.js +74 -0
- package/dist/services/ide/hook-translator.d.ts +72 -0
- package/dist/services/ide/hook-translator.js +128 -0
- package/dist/services/ide/ide-detector.d.ts +10 -0
- package/dist/services/ide/ide-detector.js +19 -0
- package/dist/services/ide/ide-registry.d.ts +14 -0
- package/dist/services/ide/ide-registry.js +63 -0
- package/dist/services/ide/ide-types.d.ts +253 -0
- package/dist/services/ide/ide-types.js +2 -0
- package/dist/services/ide/resource-profile.d.ts +52 -0
- package/dist/services/ide/resource-profile.js +33 -0
- package/dist/services/ide/shared/atomic-json.d.ts +15 -0
- package/dist/services/ide/shared/atomic-json.js +58 -0
- package/dist/services/ide/shared/safe-path.d.ts +11 -0
- package/dist/services/ide/shared/safe-path.js +29 -0
- package/dist/services/impact/impact-scan-service.d.ts +66 -0
- package/dist/services/impact/impact-scan-service.js +197 -0
- package/dist/services/job/job-event-emitter.d.ts +30 -0
- package/dist/services/job/job-event-emitter.js +5 -0
- package/dist/services/job/job-orchestrator.d.ts +50 -0
- package/dist/services/job/job-orchestrator.js +104 -0
- package/dist/services/job/job-progress-store.d.ts +60 -0
- package/dist/services/job/job-progress-store.js +70 -0
- package/dist/services/job/job-resource-snapshot.d.ts +7 -0
- package/dist/services/job/job-resource-snapshot.js +75 -0
- package/dist/services/job/job-rotation.d.ts +17 -0
- package/dist/services/job/job-rotation.js +30 -0
- package/dist/services/job/job-state-store.d.ts +24 -0
- package/dist/services/job/job-state-store.js +60 -0
- package/dist/services/job/job-types.d.ts +444 -0
- package/dist/services/job/job-types.js +87 -0
- package/dist/services/job/subagent-job-wrapper.d.ts +35 -0
- package/dist/services/job/subagent-job-wrapper.js +30 -0
- package/dist/services/legacy/legacy-detector.d.ts +34 -0
- package/dist/services/legacy/legacy-detector.js +111 -0
- package/dist/services/log/log-commands-service.d.ts +54 -0
- package/dist/services/log/log-commands-service.js +83 -0
- package/dist/services/log/logger.d.ts +103 -0
- package/dist/services/log/logger.js +224 -0
- package/dist/services/log/redact.d.ts +32 -0
- package/dist/services/log/redact.js +89 -0
- package/dist/services/log/retention.d.ts +34 -0
- package/dist/services/log/retention.js +78 -0
- package/dist/services/loop/evaluator-dispatcher.d.ts +50 -0
- package/dist/services/loop/evaluator-dispatcher.js +552 -0
- package/dist/services/loop/loop-bee-relation-service.d.ts +107 -0
- package/dist/services/loop/loop-bee-relation-service.js +211 -0
- package/dist/services/loop/loop-bee-relation-store.d.ts +53 -0
- package/dist/services/loop/loop-bee-relation-store.js +130 -0
- package/dist/services/loop/loop-bee-relation-types.d.ts +118 -0
- package/dist/services/loop/loop-bee-relation-types.js +114 -0
- package/dist/services/loop/loop-release-service.d.ts +46 -0
- package/dist/services/loop/loop-release-service.js +66 -0
- package/dist/services/loop/loop-release-store.d.ts +55 -0
- package/dist/services/loop/loop-release-store.js +134 -0
- package/dist/services/loop/loop-release-types.d.ts +250 -0
- package/dist/services/loop/loop-release-types.js +162 -0
- package/dist/services/loop/monotonic-guard.d.ts +80 -0
- package/dist/services/loop/monotonic-guard.js +232 -0
- package/dist/services/loop/monotonic-runner.d.ts +58 -0
- package/dist/services/loop/monotonic-runner.js +231 -0
- package/dist/services/loop/run-driver.d.ts +70 -0
- package/dist/services/loop/run-driver.js +400 -0
- package/dist/services/loop/spec-service.d.ts +90 -0
- package/dist/services/loop/spec-service.js +497 -0
- package/dist/services/memory/llm-reranker.d.ts +174 -0
- package/dist/services/memory/llm-reranker.js +284 -0
- package/dist/services/memory/memory-search-service.d.ts +93 -0
- package/dist/services/memory/memory-search-service.js +117 -0
- package/dist/services/memory/project-context-service.d.ts +21 -0
- package/dist/services/memory/project-context-service.js +161 -0
- package/dist/services/memory/project-memory-service.d.ts +167 -0
- package/dist/services/memory/project-memory-service.js +817 -0
- package/dist/services/migrate-skill-name/migrate.d.ts +17 -0
- package/dist/services/migrate-skill-name/migrate.js +152 -0
- package/dist/services/migrate-skill-name/schema.d.ts +42 -0
- package/dist/services/migrate-skill-name/schema.js +25 -0
- package/dist/services/migration/v2-10-to-v2-11-service.d.ts +44 -0
- package/dist/services/migration/v2-10-to-v2-11-service.js +190 -0
- package/dist/services/migration/v2-10-to-v2-11-types.d.ts +41 -0
- package/dist/services/migration/v2-10-to-v2-11-types.js +23 -0
- package/dist/services/mode/bypass-tracker.d.ts +4 -0
- package/dist/services/mode/bypass-tracker.js +31 -0
- package/dist/services/mode/mode-enforcement.d.ts +14 -0
- package/dist/services/mode/mode-enforcement.js +84 -0
- package/dist/services/mut/assert-scanner.d.ts +6 -0
- package/dist/services/mut/assert-scanner.js +116 -0
- package/dist/services/mut/index.d.ts +8 -0
- package/dist/services/mut/index.js +7 -0
- package/dist/services/mut/mut-runner.d.ts +39 -0
- package/dist/services/mut/mut-runner.js +29 -0
- package/dist/services/mut/production-stryker.d.ts +2 -0
- package/dist/services/mut/production-stryker.js +75 -0
- package/dist/services/mut/report-builder.d.ts +11 -0
- package/dist/services/mut/report-builder.js +110 -0
- package/dist/services/mut/report-loader.d.ts +31 -0
- package/dist/services/mut/report-loader.js +78 -0
- package/dist/services/mut/thresholds.d.ts +21 -0
- package/dist/services/mut/thresholds.js +22 -0
- package/dist/services/mut/types.d.ts +336 -0
- package/dist/services/mut/types.js +59 -0
- package/dist/services/observability/aggregation.d.ts +64 -0
- package/dist/services/observability/aggregation.js +217 -0
- package/dist/services/observability/jsonl-store.d.ts +59 -0
- package/dist/services/observability/jsonl-store.js +120 -0
- package/dist/services/observability/observability-service.d.ts +95 -0
- package/dist/services/observability/observability-service.js +119 -0
- package/dist/services/observability/report-formatter.d.ts +42 -0
- package/dist/services/observability/report-formatter.js +156 -0
- package/dist/services/openspec/openspec-archive-service.d.ts +12 -0
- package/dist/services/openspec/openspec-archive-service.js +28 -0
- package/dist/services/openspec/openspec-bridge-service.d.ts +16 -0
- package/dist/services/openspec/openspec-bridge-service.js +76 -0
- package/dist/services/openspec/openspec-init-service.d.ts +23 -0
- package/dist/services/openspec/openspec-init-service.js +122 -0
- package/dist/services/openspec/openspec-propose-from-doctor-service.d.ts +31 -0
- package/dist/services/openspec/openspec-propose-from-doctor-service.js +95 -0
- package/dist/services/openspec/openspec-render-service.d.ts +38 -0
- package/dist/services/openspec/openspec-render-service.js +130 -0
- package/dist/services/openspec/openspec-scan-service.d.ts +6 -0
- package/dist/services/openspec/openspec-scan-service.js +123 -0
- package/dist/services/openspec/openspec-types.d.ts +39 -0
- package/dist/services/openspec/openspec-types.js +1 -0
- package/dist/services/openspec/openspec-validate-service.d.ts +27 -0
- package/dist/services/openspec/openspec-validate-service.js +77 -0
- package/dist/services/perf/perf-baseline-service.d.ts +70 -0
- package/dist/services/perf/perf-baseline-service.js +214 -0
- package/dist/services/polyrepo/polyrepo-dispatcher.d.ts +34 -0
- package/dist/services/polyrepo/polyrepo-dispatcher.js +119 -0
- package/dist/services/polyrepo/polyrepo-scanner.d.ts +9 -0
- package/dist/services/polyrepo/polyrepo-scanner.js +94 -0
- package/dist/services/polyrepo/polyrepo-service.d.ts +34 -0
- package/dist/services/polyrepo/polyrepo-service.js +49 -0
- package/dist/services/polyrepo/polyrepo-types.d.ts +55 -0
- package/dist/services/polyrepo/polyrepo-types.js +1 -0
- package/dist/services/prd/handoff-auto-regen.d.ts +22 -0
- package/dist/services/prd/handoff-auto-regen.js +73 -0
- package/dist/services/prd/handoff-service.d.ts +54 -0
- package/dist/services/prd/handoff-service.js +142 -0
- package/dist/services/prd/handoff-types.d.ts +64 -0
- package/dist/services/prd/handoff-types.js +22 -0
- package/dist/services/prd/prd-blocks-checker.d.ts +51 -0
- package/dist/services/prd/prd-blocks-checker.js +130 -0
- package/dist/services/prd/project-scan-bootstrap-service.d.ts +52 -0
- package/dist/services/prd/project-scan-bootstrap-service.js +445 -0
- package/dist/services/prd/project-scan-reader.d.ts +24 -0
- package/dist/services/prd/project-scan-reader.js +150 -0
- package/dist/services/prd/project-scan-sediment.d.ts +97 -0
- package/dist/services/prd/project-scan-sediment.js +445 -0
- package/dist/services/prd/project-scan-types.d.ts +66 -0
- package/dist/services/prd/project-scan-types.js +20 -0
- package/dist/services/preferences/preferences-service.d.ts +38 -0
- package/dist/services/preferences/preferences-service.js +198 -0
- package/dist/services/preferences/preferences-types.d.ts +148 -0
- package/dist/services/preferences/preferences-types.js +53 -0
- package/dist/services/profiles/profile-service.d.ts +6 -0
- package/dist/services/profiles/profile-service.js +19 -0
- package/dist/services/progress/progress-service.d.ts +125 -0
- package/dist/services/progress/progress-service.js +192 -0
- package/dist/services/providers/minimax-provider-service.d.ts +24 -0
- package/dist/services/providers/minimax-provider-service.js +143 -0
- package/dist/services/providers/minimax-worker-service.d.ts +21 -0
- package/dist/services/providers/minimax-worker-service.js +83 -0
- package/dist/services/proxy/proxy-service.d.ts +7 -0
- package/dist/services/proxy/proxy-service.js +31 -0
- package/dist/services/qa/browser-event-logger.d.ts +40 -0
- package/dist/services/qa/browser-event-logger.js +54 -0
- package/dist/services/qa/browser-restart-detector.d.ts +74 -0
- package/dist/services/qa/browser-restart-detector.js +138 -0
- package/dist/services/qa/browser-reuse-hint.d.ts +18 -0
- package/dist/services/qa/browser-reuse-hint.js +18 -0
- package/dist/services/qa/browser-wrapper-service.d.ts +37 -0
- package/dist/services/qa/browser-wrapper-service.js +88 -0
- package/dist/services/qa/qa-business-review-state.d.ts +47 -0
- package/dist/services/qa/qa-business-review-state.js +96 -0
- package/dist/services/rd/ast-gate.d.ts +19 -0
- package/dist/services/rd/ast-gate.js +71 -0
- package/dist/services/rd/impl.d.ts +9 -0
- package/dist/services/rd/impl.js +57 -0
- package/dist/services/rd/rd-service.d.ts +129 -0
- package/dist/services/rd/rd-service.js +441 -0
- package/dist/services/rd/reviewer-dispatch-policy.d.ts +122 -0
- package/dist/services/rd/reviewer-dispatch-policy.js +148 -0
- package/dist/services/rd/standards-diagnostic.d.ts +76 -0
- package/dist/services/rd/standards-diagnostic.js +166 -0
- package/dist/services/rd/strategic-stage.d.ts +4 -0
- package/dist/services/rd/strategic-stage.js +15 -0
- package/dist/services/rd/strategy.d.ts +13 -0
- package/dist/services/rd/strategy.js +60 -0
- package/dist/services/rd/tactical-stage.d.ts +33 -0
- package/dist/services/rd/tactical-stage.js +62 -0
- package/dist/services/rd/types.d.ts +252 -0
- package/dist/services/rd/types.js +47 -0
- package/dist/services/recommendations/capability-availability.d.ts +5 -0
- package/dist/services/recommendations/capability-availability.js +40 -0
- package/dist/services/recommendations/capability-map-service.d.ts +7 -0
- package/dist/services/recommendations/capability-map-service.js +131 -0
- package/dist/services/recommendations/capability-seed-items.d.ts +2 -0
- package/dist/services/recommendations/capability-seed-items.js +140 -0
- package/dist/services/recommendations/capability-seed-mappings.d.ts +2 -0
- package/dist/services/recommendations/capability-seed-mappings.js +54 -0
- package/dist/services/recommendations/capability-seed-sources.d.ts +2 -0
- package/dist/services/recommendations/capability-seed-sources.js +35 -0
- package/dist/services/recommendations/recommendation-service.d.ts +8 -0
- package/dist/services/recommendations/recommendation-service.js +106 -0
- package/dist/services/recommendations/recommendation-types.d.ts +129 -0
- package/dist/services/recommendations/recommendation-types.js +1 -0
- package/dist/services/recommendations/seed-capability-catalog.d.ts +3 -0
- package/dist/services/recommendations/seed-capability-catalog.js +3 -0
- package/dist/services/refactor/refactor-service.d.ts +9 -0
- package/dist/services/refactor/refactor-service.js +36 -0
- package/dist/services/release/release-state.d.ts +70 -0
- package/dist/services/release/release-state.js +140 -0
- package/dist/services/retrospective/retrospective-index.d.ts +37 -0
- package/dist/services/retrospective/retrospective-index.js +110 -0
- package/dist/services/retrospective/retrospective-search-service.d.ts +55 -0
- package/dist/services/retrospective/retrospective-search-service.js +107 -0
- package/dist/services/retrospective/retrospective-show.d.ts +40 -0
- package/dist/services/retrospective/retrospective-show.js +109 -0
- package/dist/services/reviewer/model-family.d.ts +18 -0
- package/dist/services/reviewer/model-family.js +70 -0
- package/dist/services/reviewer/providers/anthropic.d.ts +2 -0
- package/dist/services/reviewer/providers/anthropic.js +61 -0
- package/dist/services/reviewer/providers/ollama.d.ts +26 -0
- package/dist/services/reviewer/providers/ollama.js +38 -0
- package/dist/services/reviewer/providers/openai.d.ts +2 -0
- package/dist/services/reviewer/providers/openai.js +63 -0
- package/dist/services/reviewer/reviewer-config.d.ts +34 -0
- package/dist/services/reviewer/reviewer-config.js +100 -0
- package/dist/services/reviewer/reviewer-service.d.ts +56 -0
- package/dist/services/reviewer/reviewer-service.js +263 -0
- package/dist/services/reviewer/selection-strategies.d.ts +27 -0
- package/dist/services/reviewer/selection-strategies.js +53 -0
- package/dist/services/role/role-registry.d.ts +38 -0
- package/dist/services/role/role-registry.js +83 -0
- package/dist/services/runtime/runtime-detector.d.ts +15 -0
- package/dist/services/runtime/runtime-detector.js +62 -0
- package/dist/services/runtime/runtime-service.d.ts +59 -0
- package/dist/services/runtime/runtime-service.js +51 -0
- package/dist/services/runtime/vendor-adapter.d.ts +59 -0
- package/dist/services/runtime/vendor-adapter.js +1 -0
- package/dist/services/runtime/vendors/claude-code.d.ts +7 -0
- package/dist/services/runtime/vendors/claude-code.js +39 -0
- package/dist/services/runtime/vendors/codex.d.ts +7 -0
- package/dist/services/runtime/vendors/codex.js +43 -0
- package/dist/services/runtime/vendors/copilot.d.ts +7 -0
- package/dist/services/runtime/vendors/copilot.js +40 -0
- package/dist/services/sc/index.d.ts +1 -0
- package/dist/services/sc/index.js +1 -0
- package/dist/services/sc/sc-service.d.ts +131 -0
- package/dist/services/sc/sc-service.js +552 -0
- package/dist/services/scan/acceptance-coverage-service.d.ts +42 -0
- package/dist/services/scan/acceptance-coverage-service.js +140 -0
- package/dist/services/scan/api-surface-service.d.ts +69 -0
- package/dist/services/scan/api-surface-service.js +239 -0
- package/dist/services/scan/archetype-service.d.ts +5 -0
- package/dist/services/scan/archetype-service.js +254 -0
- package/dist/services/scan/diff-scope-service.d.ts +40 -0
- package/dist/services/scan/diff-scope-service.js +198 -0
- package/dist/services/scan/existing-system-service.d.ts +7 -0
- package/dist/services/scan/existing-system-service.js +300 -0
- package/dist/services/scan/file-size-scan.d.ts +23 -0
- package/dist/services/scan/file-size-scan.js +68 -0
- package/dist/services/scan/karpathy-service.d.ts +60 -0
- package/dist/services/scan/karpathy-service.js +228 -0
- package/dist/services/scan/libraries-service.d.ts +24 -0
- package/dist/services/scan/libraries-service.js +419 -0
- package/dist/services/scan/libraries-types.d.ts +59 -0
- package/dist/services/scan/libraries-types.js +9 -0
- package/dist/services/scan/orphan-service.d.ts +76 -0
- package/dist/services/scan/orphan-service.js +538 -0
- package/dist/services/scan/scan-types.d.ts +59 -0
- package/dist/services/scan/scan-types.js +1 -0
- package/dist/services/scan/type-sanity-service.d.ts +23 -0
- package/dist/services/scan/type-sanity-service.js +116 -0
- package/dist/services/security/safe-settings-path.d.ts +12 -0
- package/dist/services/security/safe-settings-path.js +104 -0
- package/dist/services/sediment/dispose-confirm.d.ts +9 -0
- package/dist/services/sediment/dispose-confirm.js +5 -0
- package/dist/services/sediment/json-schema.d.ts +247 -0
- package/dist/services/sediment/json-schema.js +26 -0
- package/dist/services/sediment/manifest-lint.d.ts +13 -0
- package/dist/services/sediment/manifest-lint.js +11 -0
- package/dist/services/sediment/pool-paths.d.ts +22 -0
- package/dist/services/sediment/pool-paths.js +25 -0
- package/dist/services/sediment/pool-read.d.ts +20 -0
- package/dist/services/sediment/pool-read.js +73 -0
- package/dist/services/sediment/pool-rebuild-index.d.ts +15 -0
- package/dist/services/sediment/pool-rebuild-index.js +28 -0
- package/dist/services/sediment/pool-write.d.ts +14 -0
- package/dist/services/sediment/pool-write.js +25 -0
- package/dist/services/sediment/promotion-gate.d.ts +12 -0
- package/dist/services/sediment/promotion-gate.js +20 -0
- package/dist/services/sediment/types.d.ts +52 -0
- package/dist/services/sediment/types.js +1 -0
- package/dist/services/session/binding-status-service.d.ts +56 -0
- package/dist/services/session/binding-status-service.js +106 -0
- package/dist/services/session/binding-store.d.ts +161 -0
- package/dist/services/session/binding-store.js +509 -0
- package/dist/services/session/caller-binding-service.d.ts +70 -0
- package/dist/services/session/caller-binding-service.js +148 -0
- package/dist/services/session/caller-id-types.d.ts +77 -0
- package/dist/services/session/caller-id-types.js +46 -0
- package/dist/services/session/getSessionDir.d.ts +1 -0
- package/dist/services/session/getSessionDir.js +27 -0
- package/dist/services/session/index.d.ts +6 -0
- package/dist/services/session/index.js +7 -0
- package/dist/services/session/platform-fallbacks.d.ts +31 -0
- package/dist/services/session/platform-fallbacks.js +35 -0
- package/dist/services/session/resolve-caller-id.d.ts +57 -0
- package/dist/services/session/resolve-caller-id.js +88 -0
- package/dist/services/session/session-binding-bridge.d.ts +76 -0
- package/dist/services/session/session-binding-bridge.js +247 -0
- package/dist/services/session/session-checkpoint-service.d.ts +57 -0
- package/dist/services/session/session-checkpoint-service.js +143 -0
- package/dist/services/session/session-manager.d.ts +168 -0
- package/dist/services/session/session-manager.js +502 -0
- package/dist/services/session/session-resume-service.d.ts +25 -0
- package/dist/services/session/session-resume-service.js +101 -0
- package/dist/services/share/bundle-reader.d.ts +100 -0
- package/dist/services/share/bundle-reader.js +434 -0
- package/dist/services/share/bundle-types.d.ts +392 -0
- package/dist/services/share/bundle-types.js +318 -0
- package/dist/services/share/bundle-writer.d.ts +97 -0
- package/dist/services/share/bundle-writer.js +429 -0
- package/dist/services/share/run-state-contract.d.ts +133 -0
- package/dist/services/share/run-state-contract.js +138 -0
- package/dist/services/signal/cancel-handler.d.ts +14 -0
- package/dist/services/signal/cancel-handler.js +76 -0
- package/dist/services/skill/resume-detector.d.ts +54 -0
- package/dist/services/skill/resume-detector.js +334 -0
- package/dist/services/skill/skill-scheduler.d.ts +40 -0
- package/dist/services/skill/skill-scheduler.js +53 -0
- package/dist/services/skill/skill-search-service.d.ts +88 -0
- package/dist/services/skill/skill-search-service.js +228 -0
- package/dist/services/skillhub/release-diff.d.ts +18 -0
- package/dist/services/skillhub/release-diff.js +38 -0
- package/dist/services/skillhub/release-export.d.ts +8 -0
- package/dist/services/skillhub/release-export.js +31 -0
- package/dist/services/skillhub/release-gc-blobs.d.ts +13 -0
- package/dist/services/skillhub/release-gc-blobs.js +32 -0
- package/dist/services/skillhub/release-import.d.ts +7 -0
- package/dist/services/skillhub/release-import.js +64 -0
- package/dist/services/skillhub/release-retain.d.ts +23 -0
- package/dist/services/skillhub/release-retain.js +94 -0
- package/dist/services/skillhub/sqlite-store.d.ts +22 -0
- package/dist/services/skillhub/sqlite-store.js +63 -0
- package/dist/services/skillhub/tar-runtime.d.ts +21 -0
- package/dist/services/skillhub/tar-runtime.js +91 -0
- package/dist/services/skillhub/types.d.ts +115 -0
- package/dist/services/skillhub/types.js +1 -0
- package/dist/services/skills/hooks-settings-service.d.ts +137 -0
- package/dist/services/skills/hooks-settings-service.js +396 -0
- package/dist/services/skills/skill-conformance-service.d.ts +40 -0
- package/dist/services/skills/skill-conformance-service.js +139 -0
- package/dist/services/skills/skill-presence-service.d.ts +158 -0
- package/dist/services/skills/skill-presence-service.js +474 -0
- package/dist/services/skills/skill-registry.d.ts +17 -0
- package/dist/services/skills/skill-registry.js +67 -0
- package/dist/services/skills/skill-runbook-service.d.ts +11 -0
- package/dist/services/skills/skill-runbook-service.js +128 -0
- package/dist/services/skills/skill-statusline-renderer.d.ts +6 -0
- package/dist/services/skills/skill-statusline-renderer.js +55 -0
- package/dist/services/skills/skill-statusline-service.d.ts +24 -0
- package/dist/services/skills/skill-statusline-service.js +110 -0
- package/dist/services/skills/statusline-settings-service.d.ts +59 -0
- package/dist/services/skills/statusline-settings-service.js +141 -0
- package/dist/services/skills/sync-service.d.ts +86 -0
- package/dist/services/skills/sync-service.js +271 -0
- package/dist/services/slice/calibration-store.d.ts +39 -0
- package/dist/services/slice/calibration-store.js +68 -0
- package/dist/services/slice/cross-pass-edge-merger.d.ts +53 -0
- package/dist/services/slice/cross-pass-edge-merger.js +246 -0
- package/dist/services/slice/granularity-decider.d.ts +37 -0
- package/dist/services/slice/granularity-decider.js +40 -0
- package/dist/services/slice/llm-arbitrator.d.ts +35 -0
- package/dist/services/slice/llm-arbitrator.js +63 -0
- package/dist/services/slice/multi-pass-orchestrator.d.ts +67 -0
- package/dist/services/slice/multi-pass-orchestrator.js +225 -0
- package/dist/services/slice/schema-router.d.ts +44 -0
- package/dist/services/slice/schema-router.js +61 -0
- package/dist/services/slice/slice-archive-service.d.ts +20 -0
- package/dist/services/slice/slice-archive-service.js +111 -0
- package/dist/services/slice/slice-benchmark-service.d.ts +19 -0
- package/dist/services/slice/slice-benchmark-service.js +60 -0
- package/dist/services/slice/slice-check-service.d.ts +2 -0
- package/dist/services/slice/slice-check-service.js +459 -0
- package/dist/services/slice/slice-check-types.d.ts +104 -0
- package/dist/services/slice/slice-check-types.js +28 -0
- package/dist/services/slice/slice-decompose-runners.d.ts +23 -0
- package/dist/services/slice/slice-decompose-runners.js +174 -0
- package/dist/services/slice/slice-decompose-service.d.ts +24 -0
- package/dist/services/slice/slice-decompose-service.js +532 -0
- package/dist/services/slice/slice-decompose-types.d.ts +263 -0
- package/dist/services/slice/slice-decompose-types.js +30 -0
- package/dist/services/slice/slice-integration.d.ts +43 -0
- package/dist/services/slice/slice-integration.js +106 -0
- package/dist/services/slice/slice-pick-service.d.ts +32 -0
- package/dist/services/slice/slice-pick-service.js +75 -0
- package/dist/services/slice/slice-review-state.d.ts +70 -0
- package/dist/services/slice/slice-review-state.js +109 -0
- package/dist/services/slice/slice-topology-types.d.ts +115 -0
- package/dist/services/slice/slice-topology-types.js +20 -0
- package/dist/services/smoke/smoke-paths-state.d.ts +73 -0
- package/dist/services/smoke/smoke-paths-state.js +117 -0
- package/dist/services/sop/gate-enforce-service.d.ts +33 -0
- package/dist/services/sop/gate-enforce-service.js +168 -0
- package/dist/services/sop/sop-advance-service.d.ts +74 -0
- package/dist/services/sop/sop-advance-service.js +115 -0
- package/dist/services/sop/sop-check-service.d.ts +45 -0
- package/dist/services/sop/sop-check-service.js +181 -0
- package/dist/services/sop/sop-paths.d.ts +62 -0
- package/dist/services/sop/sop-paths.js +92 -0
- package/dist/services/sop/sop-registry-service.d.ts +46 -0
- package/dist/services/sop/sop-registry-service.js +89 -0
- package/dist/services/sop/sop-service.d.ts +55 -0
- package/dist/services/sop/sop-service.js +222 -0
- package/dist/services/sop/sop-types.d.ts +95 -0
- package/dist/services/sop/sop-types.js +11 -0
- package/dist/services/standards/ide-aware-standards-service.d.ts +94 -0
- package/dist/services/standards/ide-aware-standards-service.js +91 -0
- package/dist/services/standards/loop-engineering-lint.d.ts +38 -0
- package/dist/services/standards/loop-engineering-lint.js +101 -0
- package/dist/services/standards/loop-engineering-readiness-lint.d.ts +111 -0
- package/dist/services/standards/loop-engineering-readiness-lint.js +248 -0
- package/dist/services/standards/migrate-claude-rules-service.d.ts +19 -0
- package/dist/services/standards/migrate-claude-rules-service.js +214 -0
- package/dist/services/standards/migrate-service.d.ts +63 -0
- package/dist/services/standards/migrate-service.js +193 -0
- package/dist/services/standards/missing-standards-detector.d.ts +81 -0
- package/dist/services/standards/missing-standards-detector.js +139 -0
- package/dist/services/standards/project-context.d.ts +24 -0
- package/dist/services/standards/project-context.js +314 -0
- package/dist/services/standards/project-standards-service.d.ts +114 -0
- package/dist/services/standards/project-standards-service.js +693 -0
- package/dist/services/tech/tech-service.d.ts +69 -0
- package/dist/services/tech/tech-service.js +299 -0
- package/dist/services/test-cache/test-cache-service.d.ts +70 -0
- package/dist/services/test-cache/test-cache-service.js +175 -0
- package/dist/services/understand/hybrid-types.d.ts +32 -0
- package/dist/services/understand/hybrid-types.js +1 -0
- package/dist/services/understand/understand-hybrid-service.d.ts +10 -0
- package/dist/services/understand/understand-hybrid-service.js +100 -0
- package/dist/services/understand/understand-scan-service.d.ts +28 -0
- package/dist/services/understand/understand-scan-service.js +170 -0
- package/dist/services/understand/understand-types.d.ts +50 -0
- package/dist/services/understand/understand-types.js +1 -0
- package/dist/services/upgrade/1x-detector-service.d.ts +7 -0
- package/dist/services/upgrade/1x-detector-service.js +94 -0
- package/dist/services/upgrade/gitignore-migrate-service.d.ts +56 -0
- package/dist/services/upgrade/gitignore-migrate-service.js +170 -0
- package/dist/services/upgrade/upgrade-service.d.ts +81 -0
- package/dist/services/upgrade/upgrade-service.js +403 -0
- package/dist/services/verdict/envelopes.d.ts +93 -0
- package/dist/services/verdict/envelopes.js +349 -0
- package/dist/services/verdict/verdict-aggregator.d.ts +94 -0
- package/dist/services/verdict/verdict-aggregator.js +112 -0
- package/dist/services/workflow/artifact-paths.d.ts +59 -0
- package/dist/services/workflow/artifact-paths.js +166 -0
- package/dist/services/workflow/autonomous-resume-writer.d.ts +16 -0
- package/dist/services/workflow/autonomous-resume-writer.js +170 -0
- package/dist/services/workflow/pipeline-verify-service.d.ts +90 -0
- package/dist/services/workflow/pipeline-verify-service.js +449 -0
- package/dist/services/workflow/plan-reader.d.ts +29 -0
- package/dist/services/workflow/plan-reader.js +174 -0
- package/dist/services/workflow/plan-refresher.d.ts +32 -0
- package/dist/services/workflow/plan-refresher.js +353 -0
- package/dist/services/workflow/plan-trigger-detector.d.ts +55 -0
- package/dist/services/workflow/plan-trigger-detector.js +142 -0
- package/dist/services/workflow/workflow-autonomous-resume-helpers.d.ts +19 -0
- package/dist/services/workflow/workflow-autonomous-resume-helpers.js +300 -0
- package/dist/services/workflow/workflow-autonomous-service.d.ts +100 -0
- package/dist/services/workflow/workflow-autonomous-service.js +306 -0
- package/dist/services/workflow/workflow-loader.d.ts +63 -0
- package/dist/services/workflow/workflow-loader.js +168 -0
- package/dist/services/workflow/workflow-router-service.d.ts +85 -0
- package/dist/services/workflow/workflow-router-service.js +233 -0
- package/dist/services/workflow/workflow-skip-service.d.ts +106 -0
- package/dist/services/workflow/workflow-skip-service.js +209 -0
- package/dist/services/workflow/workflow-spec.d.ts +116 -0
- package/dist/services/workflow/workflow-spec.js +431 -0
- package/dist/services/workflow/workflow-state-store.d.ts +27 -0
- package/dist/services/workflow/workflow-state-store.js +95 -0
- package/dist/services/workspace/claude-settings-template.d.ts +101 -0
- package/dist/services/workspace/claude-settings-template.js +254 -0
- package/dist/services/workspace/migrate-1-4-1-service.d.ts +44 -0
- package/dist/services/workspace/migrate-1-4-1-service.js +195 -0
- package/dist/services/workspace/migrate-service.d.ts +2 -0
- package/dist/services/workspace/migrate-service.js +613 -0
- package/dist/services/workspace/migrate-types.d.ts +127 -0
- package/dist/services/workspace/migrate-types.js +21 -0
- package/dist/services/workspace/reconcile-service.d.ts +188 -0
- package/dist/services/workspace/reconcile-service.js +683 -0
- package/dist/services/workspace/reconcile-types.d.ts +130 -0
- package/dist/services/workspace/reconcile-types.js +13 -0
- package/dist/services/workspace/sid-naming-guard.d.ts +17 -0
- package/dist/services/workspace/sid-naming-guard.js +34 -0
- package/dist/services/workspace/templates/project-scan/audit-output-schema.md +100 -0
- package/dist/services/workspace/templates/project-scan/business-knowledge.md +44 -0
- package/dist/services/workspace/templates/project-scan/index.d.ts +34 -0
- package/dist/services/workspace/templates/project-scan/index.js +60 -0
- package/dist/services/workspace/templates/project-scan/perf-template.md +109 -0
- package/dist/services/workspace/templates/project-scan/security-template.md +99 -0
- package/dist/services/workspace/workspace-claude-settings-materializer.d.ts +45 -0
- package/dist/services/workspace/workspace-claude-settings-materializer.js +194 -0
- package/dist/services/workspace/workspace-clean-service.d.ts +28 -0
- package/dist/services/workspace/workspace-clean-service.js +46 -0
- package/dist/services/workspace/workspace-service.d.ts +177 -0
- package/dist/services/workspace/workspace-service.js +432 -0
- package/dist/services/workspace/workspace-state-service.d.ts +7 -0
- package/dist/services/workspace/workspace-state-service.js +43 -0
- package/dist/shared/format-md-compact.d.ts +32 -0
- package/dist/shared/format-md-compact.js +297 -0
- package/dist/shared/frontmatter.d.ts +6 -0
- package/dist/shared/frontmatter.js +165 -0
- package/dist/shared/fs-utils.d.ts +4 -0
- package/dist/shared/fs-utils.js +16 -0
- package/dist/shared/fs.d.ts +4 -0
- package/dist/shared/fs.js +26 -0
- package/dist/shared/incrementing-number.d.ts +23 -0
- package/dist/shared/incrementing-number.js +68 -0
- package/dist/shared/json-schema-mini.d.ts +10 -0
- package/dist/shared/json-schema-mini.js +113 -0
- package/dist/shared/path-safety.d.ts +21 -0
- package/dist/shared/path-safety.js +54 -0
- package/dist/shared/path-utils.d.ts +13 -0
- package/dist/shared/path-utils.js +56 -0
- package/dist/shared/paths.d.ts +6 -0
- package/dist/shared/paths.js +50 -0
- package/dist/shared/planner-response.d.ts +21 -0
- package/dist/shared/planner-response.js +26 -0
- package/dist/shared/platform.d.ts +6 -0
- package/dist/shared/platform.js +11 -0
- package/dist/shared/process.d.ts +5 -0
- package/dist/shared/process.js +12 -0
- package/dist/shared/result.d.ts +22 -0
- package/dist/shared/result.js +46 -0
- package/dist/shared/stale-policy.d.ts +67 -0
- package/dist/shared/stale-policy.js +85 -0
- package/dist/shared/version.d.ts +1 -0
- package/dist/shared/version.js +1 -0
- package/dist/skills/peaks-maker/index.d.ts +5 -0
- package/dist/skills/peaks-maker/index.js +32 -0
- package/package.json +5 -4
- package/scripts/copy-templates.mjs +1 -1
|
@@ -0,0 +1,817 @@
|
|
|
1
|
+
import { closeSync, constants, copyFileSync, existsSync, lstatSync, mkdirSync, openSync, readdirSync, readFileSync, realpathSync, statSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { dirname, basename, isAbsolute, join, relative, resolve } from 'node:path';
|
|
3
|
+
import { isInsidePath, isWindowsAbsolutePath, normalizePath, resolveInputPath, stablePath, stableRealPath } from '../../shared/path-utils.js';
|
|
4
|
+
import { containsSensitiveConfigValue, isSensitiveConfigPath } from '../config/config-service.js';
|
|
5
|
+
import { getSessionDir } from '../session/getSessionDir.js';
|
|
6
|
+
// Hot kinds: full body kept in index for always-available context
|
|
7
|
+
const HOT_KINDS = new Set(['feedback', 'decision', 'rule', 'convention', 'module', 'lesson']);
|
|
8
|
+
// ---------------------------------------------------------------------------
|
|
9
|
+
// Internal helpers (kept from original, sorted by dependency order)
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
const START_MARKER = '<!-- peaks-memory:start -->';
|
|
12
|
+
const END_MARKER = '<!-- peaks-memory:end -->';
|
|
13
|
+
const VALID_MEMORY_KINDS = new Set(['project', 'rule', 'decision', 'reference', 'feedback', 'convention', 'module', 'lesson']);
|
|
14
|
+
/** Exported for guard tests + tooling that needs to enumerate the valid
|
|
15
|
+
* set without duplicating the literal. Single source of truth. */
|
|
16
|
+
export const VALID_PROJECT_MEMORY_KINDS = Array.from(VALID_MEMORY_KINDS);
|
|
17
|
+
// Length bounds for index entry descriptions. The numbers were chosen when
|
|
18
|
+
// summarizeMemoryBody was first introduced; locking them in as named
|
|
19
|
+
// constants is a doc-as-code move so the truncation rule is no longer
|
|
20
|
+
// "magic". Bump MAX_DESCRIPTION_LENGTH deliberately if downstream UIs grow.
|
|
21
|
+
const MIN_BODY_SENTENCE_LENGTH = 20; // skip fragments shorter than this when picking a leading sentence
|
|
22
|
+
const MAX_DESCRIPTION_LENGTH = 120; // hard cap on description length in the memory index entry
|
|
23
|
+
const ELLIPSIS_RESERVE = 3; // length of the trailing "..." when truncating with an ellipsis
|
|
24
|
+
function normalizeRoot(path) {
|
|
25
|
+
return resolveInputPath(path);
|
|
26
|
+
}
|
|
27
|
+
function normalizeRealRoot(path) {
|
|
28
|
+
return stableRealPath(path);
|
|
29
|
+
}
|
|
30
|
+
function realPathOrThrow(path, errorMessage) {
|
|
31
|
+
if (!existsSync(path)) {
|
|
32
|
+
throw new Error(errorMessage);
|
|
33
|
+
}
|
|
34
|
+
const stats = lstatSync(path);
|
|
35
|
+
if (stats.isSymbolicLink()) {
|
|
36
|
+
throw new Error(errorMessage);
|
|
37
|
+
}
|
|
38
|
+
return realpathSync(path);
|
|
39
|
+
}
|
|
40
|
+
function resolveProjectPath(path, projectRoot) {
|
|
41
|
+
if (isWindowsAbsolutePath(path))
|
|
42
|
+
return normalizePath(path);
|
|
43
|
+
if (isAbsolute(path))
|
|
44
|
+
return resolve(path);
|
|
45
|
+
const resolvedPath = join(projectRoot, path);
|
|
46
|
+
return isWindowsAbsolutePath(projectRoot) ? normalizePath(resolvedPath) : resolve(resolvedPath);
|
|
47
|
+
}
|
|
48
|
+
function assertInsideProject(path, projectRoot) {
|
|
49
|
+
const resolvedRoot = normalizeRoot(projectRoot);
|
|
50
|
+
const resolvedPath = resolveProjectPath(path, resolvedRoot);
|
|
51
|
+
const realProjectRoot = realPathOrThrow(resolvedRoot, 'Project root is not accessible');
|
|
52
|
+
const realArtifactPath = realPathOrThrow(resolvedPath, 'Artifact path must stay inside the project root');
|
|
53
|
+
if (!isInsidePath(realArtifactPath, realProjectRoot)) {
|
|
54
|
+
throw new Error('Artifact path must stay inside the project root');
|
|
55
|
+
}
|
|
56
|
+
return resolvedPath;
|
|
57
|
+
}
|
|
58
|
+
function assertSafeProjectMemoryDir(projectRoot) {
|
|
59
|
+
const resolvedRoot = normalizeRoot(projectRoot);
|
|
60
|
+
const realRoot = normalizeRealRoot(projectRoot);
|
|
61
|
+
const peaksDir = join(resolvedRoot, '.peaks');
|
|
62
|
+
if (existsSync(peaksDir) && lstatSync(peaksDir).isSymbolicLink()) {
|
|
63
|
+
throw new Error('Project memory directory must stay inside the project root');
|
|
64
|
+
}
|
|
65
|
+
const memoryDir = join(peaksDir, 'memory');
|
|
66
|
+
if (existsSync(memoryDir)) {
|
|
67
|
+
if (lstatSync(memoryDir).isSymbolicLink()) {
|
|
68
|
+
throw new Error('Project memory directory must stay inside the project root');
|
|
69
|
+
}
|
|
70
|
+
const realMemoryDir = realpathSync(memoryDir);
|
|
71
|
+
if (!isInsidePath(realMemoryDir, realRoot)) {
|
|
72
|
+
throw new Error('Project memory directory must stay inside the project root');
|
|
73
|
+
}
|
|
74
|
+
return memoryDir;
|
|
75
|
+
}
|
|
76
|
+
return memoryDir;
|
|
77
|
+
}
|
|
78
|
+
function slugify(title) {
|
|
79
|
+
const slug = title.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '');
|
|
80
|
+
return slug.length > 0 ? slug : 'project-memory';
|
|
81
|
+
}
|
|
82
|
+
function parseBlock(block, sourceArtifact) {
|
|
83
|
+
const normalizedBlock = block.replace(/\r\n/g, '\n');
|
|
84
|
+
const separatorIndex = normalizedBlock.indexOf('\n---\n');
|
|
85
|
+
if (separatorIndex < 0)
|
|
86
|
+
return null;
|
|
87
|
+
const header = normalizedBlock.slice(0, separatorIndex).trim();
|
|
88
|
+
const body = normalizedBlock.slice(separatorIndex + '\n---\n'.length).trim();
|
|
89
|
+
const fields = new Map();
|
|
90
|
+
for (const line of header.split('\n')) {
|
|
91
|
+
const [key, ...valueParts] = line.split(':');
|
|
92
|
+
const normalizedKey = key?.trim();
|
|
93
|
+
const value = valueParts.join(':').trim();
|
|
94
|
+
if (normalizedKey && value) {
|
|
95
|
+
fields.set(normalizedKey, value);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
const title = fields.get('title')?.trim();
|
|
99
|
+
const kind = fields.get('kind')?.trim();
|
|
100
|
+
if (!title || !kind || !VALID_MEMORY_KINDS.has(kind) || body.length === 0)
|
|
101
|
+
return null;
|
|
102
|
+
return { title, kind, body, sourceArtifact };
|
|
103
|
+
}
|
|
104
|
+
function hasSensitiveMemoryContent(content) {
|
|
105
|
+
return /(?:api[_-]?key|token|secret|password|credential|bearer)\s*[:=]/i.test(content)
|
|
106
|
+
|| /\bauthorization\s*:\s*bearer\s+\S+/i.test(content)
|
|
107
|
+
|| /\bbearer\s+[A-Za-z0-9._~+/=-]{12,}\b/i.test(content)
|
|
108
|
+
|| /\bsk-[A-Za-z0-9_-]{6,}\b/.test(content)
|
|
109
|
+
|| /\bgh[pousr]_[A-Za-z0-9_]{20,}\b/.test(content)
|
|
110
|
+
|| /\bgithub_pat_[A-Za-z0-9_]{20,}\b/.test(content)
|
|
111
|
+
|| /\bglpat-[A-Za-z0-9_-]{20,}\b/.test(content)
|
|
112
|
+
|| /\bAKIA[0-9A-Z]{16}\b/.test(content)
|
|
113
|
+
|| /-----BEGIN [A-Z ]*PRIVATE KEY-----/.test(content)
|
|
114
|
+
|| /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/.test(content);
|
|
115
|
+
}
|
|
116
|
+
function assertSafeMemory(memory) {
|
|
117
|
+
const content = `${memory.title}\n${memory.kind}\n${memory.body}`;
|
|
118
|
+
const metadata = { title: memory.title, kind: memory.kind, body: memory.body };
|
|
119
|
+
if (containsSensitiveConfigValue(metadata) || hasSensitiveMemoryContent(content)) {
|
|
120
|
+
throw new Error('Refusing to store sensitive memory content');
|
|
121
|
+
}
|
|
122
|
+
if (isSensitiveConfigPath(memory.title)) {
|
|
123
|
+
throw new Error('Refusing to store sensitive memory content');
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
function assertSafeMemoryFileContent(content) {
|
|
127
|
+
if (hasSensitiveMemoryContent(content)) {
|
|
128
|
+
throw new Error('Refusing to back up sensitive memory content');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
function writeNewFile(path, content) {
|
|
132
|
+
const fd = openSync(path, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, 0o600);
|
|
133
|
+
try {
|
|
134
|
+
writeFileSync(fd, content, 'utf8');
|
|
135
|
+
}
|
|
136
|
+
finally {
|
|
137
|
+
closeSync(fd);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function renderMemoryFile(memory) {
|
|
141
|
+
const name = slugify(memory.title);
|
|
142
|
+
return [
|
|
143
|
+
'---',
|
|
144
|
+
`name: ${name}`,
|
|
145
|
+
`description: ${memory.title}`,
|
|
146
|
+
'metadata:',
|
|
147
|
+
` type: ${memory.kind}`,
|
|
148
|
+
` sourceArtifact: ${memory.sourceArtifact}`,
|
|
149
|
+
'---',
|
|
150
|
+
'',
|
|
151
|
+
memory.body,
|
|
152
|
+
''
|
|
153
|
+
].join('\n');
|
|
154
|
+
}
|
|
155
|
+
function parseStoredMemoryFile(content, filePath) {
|
|
156
|
+
const normalized = content.replace(/\r\n/g, '\n');
|
|
157
|
+
if (!normalized.startsWith('---\n'))
|
|
158
|
+
return null;
|
|
159
|
+
const endIndex = normalized.indexOf('\n---\n', 4);
|
|
160
|
+
if (endIndex < 0)
|
|
161
|
+
return null;
|
|
162
|
+
const frontmatter = normalized.slice(4, endIndex);
|
|
163
|
+
const body = normalized.slice(endIndex + '\n---\n'.length).trim();
|
|
164
|
+
let name;
|
|
165
|
+
let description;
|
|
166
|
+
let kind;
|
|
167
|
+
let sourceArtifact;
|
|
168
|
+
for (const rawLine of frontmatter.split('\n')) {
|
|
169
|
+
const line = rawLine.trim();
|
|
170
|
+
if (line.startsWith('name:'))
|
|
171
|
+
name = line.slice('name:'.length).trim();
|
|
172
|
+
else if (line.startsWith('description:'))
|
|
173
|
+
description = line.slice('description:'.length).trim();
|
|
174
|
+
else if (line.startsWith('type:'))
|
|
175
|
+
kind = line.slice('type:'.length).trim();
|
|
176
|
+
else if (line.startsWith('sourceArtifact:'))
|
|
177
|
+
sourceArtifact = line.slice('sourceArtifact:'.length).trim();
|
|
178
|
+
}
|
|
179
|
+
if (!name || !kind || !VALID_MEMORY_KINDS.has(kind) || body.length === 0)
|
|
180
|
+
return null;
|
|
181
|
+
return {
|
|
182
|
+
name,
|
|
183
|
+
title: description ?? name,
|
|
184
|
+
kind: kind,
|
|
185
|
+
sourceArtifact: sourceArtifact && sourceArtifact !== 'undefined' ? sourceArtifact : null,
|
|
186
|
+
body,
|
|
187
|
+
filePath
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
function listMarkdownFiles(dirPath, options = {}) {
|
|
191
|
+
if (!existsSync(dirPath))
|
|
192
|
+
return [];
|
|
193
|
+
const { maxDepth = Infinity, skipDotfiles = true } = options;
|
|
194
|
+
const files = [];
|
|
195
|
+
const stack = [{ path: dirPath, depth: 0 }];
|
|
196
|
+
while (stack.length > 0) {
|
|
197
|
+
const frame = stack.pop();
|
|
198
|
+
if (frame.depth > maxDepth)
|
|
199
|
+
continue;
|
|
200
|
+
for (const entry of readdirSync(frame.path, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name))) {
|
|
201
|
+
if (skipDotfiles && entry.name.startsWith('.'))
|
|
202
|
+
continue;
|
|
203
|
+
const entryPath = join(frame.path, entry.name);
|
|
204
|
+
if (entry.isSymbolicLink()) {
|
|
205
|
+
continue;
|
|
206
|
+
}
|
|
207
|
+
if (entry.isDirectory()) {
|
|
208
|
+
stack.push({ path: entryPath, depth: frame.depth + 1 });
|
|
209
|
+
continue;
|
|
210
|
+
}
|
|
211
|
+
if (entry.isFile() && entry.name.endsWith('.md')) {
|
|
212
|
+
files.push(entryPath);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return files.sort((left, right) => left.localeCompare(right));
|
|
217
|
+
}
|
|
218
|
+
// ---------------------------------------------------------------------------
|
|
219
|
+
// Description summarization (deterministic, no LLM call)
|
|
220
|
+
// ---------------------------------------------------------------------------
|
|
221
|
+
function summarizeMemoryBody(body) {
|
|
222
|
+
const cleaned = body
|
|
223
|
+
.replace(/^#{1,6}\s+/gm, '')
|
|
224
|
+
.replace(/`{1,3}[^`]*`{1,3}/g, '')
|
|
225
|
+
.replace(/^\s*[-*+]\s+/gm, '')
|
|
226
|
+
.replace(/\n+/g, ' ')
|
|
227
|
+
.trim();
|
|
228
|
+
const sentences = cleaned.split(/(?<=[.!?])\s+/).filter((s) => s.length > MIN_BODY_SENTENCE_LENGTH && !/^\[.+\]$/.test(s));
|
|
229
|
+
if (sentences.length === 0) {
|
|
230
|
+
return cleaned.slice(0, MAX_DESCRIPTION_LENGTH) || 'Project memory';
|
|
231
|
+
}
|
|
232
|
+
const first = sentences[0];
|
|
233
|
+
if (first.length <= MAX_DESCRIPTION_LENGTH) {
|
|
234
|
+
return first;
|
|
235
|
+
}
|
|
236
|
+
return first.slice(0, MAX_DESCRIPTION_LENGTH - ELLIPSIS_RESERVE) + '...';
|
|
237
|
+
}
|
|
238
|
+
// ---------------------------------------------------------------------------
|
|
239
|
+
// Session memory extraction (new extract path)
|
|
240
|
+
// ---------------------------------------------------------------------------
|
|
241
|
+
function assertSafeSessionDir(projectRoot, sessionId) {
|
|
242
|
+
const normalizedRoot = normalizeRoot(projectRoot);
|
|
243
|
+
const realRoot = normalizeRealRoot(projectRoot);
|
|
244
|
+
const sessionDir = getSessionDir(normalizedRoot, sessionId);
|
|
245
|
+
if (!existsSync(sessionDir)) {
|
|
246
|
+
// Distinguish "not found" (caller will treat as no-op) from "escapes project
|
|
247
|
+
// root" (caller must surface a hard error). We probe by checking whether the
|
|
248
|
+
// joined path, after realpath, would still be inside the project root.
|
|
249
|
+
if (isAbsolute(getSessionDir(normalizedRoot, sessionId))) {
|
|
250
|
+
const realJoined = safeRealpath(getSessionDir(normalizedRoot, sessionId));
|
|
251
|
+
if (realJoined && !isInsidePath(realJoined, realRoot)) {
|
|
252
|
+
throw new Error('Session directory must stay inside the project root');
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
throw new Error('SESSION_DIR_NOT_FOUND');
|
|
256
|
+
}
|
|
257
|
+
const stats = lstatSync(sessionDir);
|
|
258
|
+
if (stats.isSymbolicLink()) {
|
|
259
|
+
throw new Error('Session directory must stay inside the project root');
|
|
260
|
+
}
|
|
261
|
+
const realSessionDir = realpathSync(sessionDir);
|
|
262
|
+
if (!isInsidePath(realSessionDir, realRoot)) {
|
|
263
|
+
throw new Error('Session directory must stay inside the project root');
|
|
264
|
+
}
|
|
265
|
+
return sessionDir;
|
|
266
|
+
}
|
|
267
|
+
function safeRealpath(path) {
|
|
268
|
+
try {
|
|
269
|
+
return realpathSync(path);
|
|
270
|
+
}
|
|
271
|
+
catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
function readMemoryFileMtime(filePath) {
|
|
276
|
+
try {
|
|
277
|
+
return statSync(filePath).mtime.toISOString().slice(0, 10);
|
|
278
|
+
}
|
|
279
|
+
catch {
|
|
280
|
+
return new Date().toISOString().slice(0, 10);
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
function readStoredMemoryNames(memoryDir) {
|
|
284
|
+
// Two source-of-truth fallbacks for the slug-collision check:
|
|
285
|
+
// 1. Parse frontmatter (the canonical form rendered by
|
|
286
|
+
// renderMemoryFile / written by both extract paths).
|
|
287
|
+
// 2. Fall back to the bare filename stem, so user-dropped files
|
|
288
|
+
// without frontmatter (e.g. hand-written memories, legacy
|
|
289
|
+
// content) still count as a collision and are not overwritten
|
|
290
|
+
// by an idempotent re-extract.
|
|
291
|
+
const names = new Set();
|
|
292
|
+
for (const filePath of listMarkdownFiles(memoryDir)) {
|
|
293
|
+
const stem = basename(filePath, '.md');
|
|
294
|
+
if (stem.length > 0 && stem !== 'index')
|
|
295
|
+
names.add(stem);
|
|
296
|
+
try {
|
|
297
|
+
const parsed = parseStoredMemoryFile(readFileSync(filePath, 'utf8'), filePath);
|
|
298
|
+
if (parsed)
|
|
299
|
+
names.add(parsed.name);
|
|
300
|
+
}
|
|
301
|
+
catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
302
|
+
// ignore unreadable files
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
return names;
|
|
306
|
+
}
|
|
307
|
+
function generateMemoryIndexFile(projectRoot, memoryDir, indexPath) {
|
|
308
|
+
const memories = readProjectMemories(projectRoot);
|
|
309
|
+
const hot = {
|
|
310
|
+
feedback: [], decision: [], rule: [], convention: [], module: [], lesson: []
|
|
311
|
+
};
|
|
312
|
+
const warm = {
|
|
313
|
+
project: [], reference: []
|
|
314
|
+
};
|
|
315
|
+
for (const memory of memories.memories) {
|
|
316
|
+
const entry = {
|
|
317
|
+
name: memory.name,
|
|
318
|
+
kind: memory.kind,
|
|
319
|
+
description: memory.body ? summarizeMemoryBody(memory.body) : memory.title,
|
|
320
|
+
sourcePath: memory.filePath,
|
|
321
|
+
sourceArtifact: memory.sourceArtifact,
|
|
322
|
+
updatedAt: readMemoryFileMtime(memory.filePath)
|
|
323
|
+
};
|
|
324
|
+
if (HOT_KINDS.has(memory.kind)) {
|
|
325
|
+
hot[memory.kind].push(entry);
|
|
326
|
+
}
|
|
327
|
+
else {
|
|
328
|
+
warm[memory.kind].push(entry);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
for (const kind of [...Object.keys(hot), ...Object.keys(warm)]) {
|
|
332
|
+
const arr = hot[kind] ?? warm[kind];
|
|
333
|
+
if (arr)
|
|
334
|
+
arr.sort((a, b) => a.name.localeCompare(b.name));
|
|
335
|
+
}
|
|
336
|
+
const index = {
|
|
337
|
+
version: 1,
|
|
338
|
+
updatedAt: new Date().toISOString(),
|
|
339
|
+
hot: hot,
|
|
340
|
+
warm: warm
|
|
341
|
+
};
|
|
342
|
+
const fd = openSync(indexPath, constants.O_WRONLY | constants.O_CREAT | constants.O_TRUNC, 0o644);
|
|
343
|
+
try {
|
|
344
|
+
writeFileSync(fd, JSON.stringify(index, null, 2), 'utf8');
|
|
345
|
+
}
|
|
346
|
+
finally {
|
|
347
|
+
closeSync(fd);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
function readExistingIndex(indexPath) {
|
|
351
|
+
if (!existsSync(indexPath))
|
|
352
|
+
return null;
|
|
353
|
+
try {
|
|
354
|
+
const raw = readFileSync(indexPath, 'utf8');
|
|
355
|
+
const parsed = JSON.parse(raw);
|
|
356
|
+
if (parsed.version === 1)
|
|
357
|
+
return parsed;
|
|
358
|
+
return null;
|
|
359
|
+
}
|
|
360
|
+
catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
361
|
+
return null;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
// Decide whether readMemoryIndex should rebuild the on-disk index.json.
|
|
365
|
+
// The rule is: rebuild iff index.json is missing OR any memory.md has an
|
|
366
|
+
// mtime strictly greater than index.json's mtime. Any statSync failure
|
|
367
|
+
// falls back to "rebuild" — a safe default that matches the prior
|
|
368
|
+
// always-rebuild behaviour and avoids serving a stale index from a
|
|
369
|
+
// partially-corrupt dir.
|
|
370
|
+
function shouldRegenerateIndex(indexPath, memoryFiles) {
|
|
371
|
+
let indexMtimeMs = 0;
|
|
372
|
+
try {
|
|
373
|
+
indexMtimeMs = statSync(indexPath).mtimeMs;
|
|
374
|
+
}
|
|
375
|
+
catch {
|
|
376
|
+
return true; // no index → must regenerate
|
|
377
|
+
}
|
|
378
|
+
for (const memoryPath of memoryFiles) {
|
|
379
|
+
try {
|
|
380
|
+
const memoryMtimeMs = statSync(memoryPath).mtimeMs;
|
|
381
|
+
if (memoryMtimeMs > indexMtimeMs)
|
|
382
|
+
return true;
|
|
383
|
+
}
|
|
384
|
+
catch {
|
|
385
|
+
return true; // unreadable file → safe default is regenerate
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
return false;
|
|
389
|
+
}
|
|
390
|
+
export function readMemoryIndex(projectRoot) {
|
|
391
|
+
const normalizedRoot = normalizeRoot(projectRoot);
|
|
392
|
+
const memoryDir = assertSafeProjectMemoryDir(normalizedRoot);
|
|
393
|
+
const indexPath = join(memoryDir, 'index.json');
|
|
394
|
+
// Read-side bootstrap: if the memory dir is missing entirely, build it and
|
|
395
|
+
// return whatever index is on disk (likely null on a fresh project). We
|
|
396
|
+
// deliberately do NOT pre-write an empty index here: the mtime-based
|
|
397
|
+
// regeneration guard below is the sole authority on whether index.json
|
|
398
|
+
// gets materialised, and pre-writing an empty index would race the guard
|
|
399
|
+
// (giving it a current-time mtime that defeats "memory older than index"
|
|
400
|
+
// detection on the first read).
|
|
401
|
+
if (!existsSync(memoryDir)) {
|
|
402
|
+
ensureMemoryBootstrap(normalizedRoot);
|
|
403
|
+
return readExistingIndex(indexPath);
|
|
404
|
+
}
|
|
405
|
+
const files = listMarkdownFiles(memoryDir);
|
|
406
|
+
if (files.length > 0 && shouldRegenerateIndex(indexPath, files)) {
|
|
407
|
+
try {
|
|
408
|
+
generateMemoryIndexFile(normalizedRoot, memoryDir, indexPath);
|
|
409
|
+
}
|
|
410
|
+
catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
411
|
+
// fall through to read existing
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
return readExistingIndex(indexPath);
|
|
415
|
+
}
|
|
416
|
+
export function extractSessionMemories(options) {
|
|
417
|
+
const projectRoot = normalizeRoot(options.projectRoot);
|
|
418
|
+
const apply = options.apply ?? false;
|
|
419
|
+
const primaryMemoryDir = assertSafeProjectMemoryDir(projectRoot);
|
|
420
|
+
const memoryIndexPath = join(primaryMemoryDir, 'index.json');
|
|
421
|
+
// Resolve sessionDir through realpath + inside-project guard so a hostile
|
|
422
|
+
// sessionId (`..`, abs path, symlink chain) cannot walk the scanner outside
|
|
423
|
+
// the project root. A sentinel "SESSION_DIR_NOT_FOUND" distinguishes a
|
|
424
|
+
// benign miss from an escape attempt.
|
|
425
|
+
let sessionDir;
|
|
426
|
+
try {
|
|
427
|
+
sessionDir = assertSafeSessionDir(projectRoot, options.sessionId);
|
|
428
|
+
}
|
|
429
|
+
catch (error) {
|
|
430
|
+
if (error instanceof Error && error.message === 'SESSION_DIR_NOT_FOUND') {
|
|
431
|
+
return {
|
|
432
|
+
apply,
|
|
433
|
+
projectRoot,
|
|
434
|
+
sessionId: options.sessionId,
|
|
435
|
+
primaryMemoryDir,
|
|
436
|
+
memoryIndexPath,
|
|
437
|
+
scannedFiles: 0,
|
|
438
|
+
extractedCount: 0,
|
|
439
|
+
writtenFiles: [],
|
|
440
|
+
updatedIndex: false
|
|
441
|
+
};
|
|
442
|
+
}
|
|
443
|
+
throw error;
|
|
444
|
+
}
|
|
445
|
+
const scannedFiles = listMarkdownFiles(sessionDir, { maxDepth: 6, skipDotfiles: true });
|
|
446
|
+
const allExtracted = [];
|
|
447
|
+
for (const filePath of scannedFiles) {
|
|
448
|
+
try {
|
|
449
|
+
const content = readFileSync(filePath, 'utf8');
|
|
450
|
+
const relativePath = relative(projectRoot, filePath).replaceAll('\\', '/');
|
|
451
|
+
const extracted = extractStableProjectMemories(content, relativePath);
|
|
452
|
+
allExtracted.push(...extracted);
|
|
453
|
+
}
|
|
454
|
+
catch { // TODO(g2): legacy silent catch — grace: 1 minor release (v2.14.0)
|
|
455
|
+
// skip unreadable files
|
|
456
|
+
}
|
|
457
|
+
}
|
|
458
|
+
if (allExtracted.length === 0) {
|
|
459
|
+
return {
|
|
460
|
+
apply,
|
|
461
|
+
projectRoot,
|
|
462
|
+
sessionId: options.sessionId,
|
|
463
|
+
primaryMemoryDir,
|
|
464
|
+
memoryIndexPath,
|
|
465
|
+
scannedFiles: scannedFiles.length,
|
|
466
|
+
extractedCount: 0,
|
|
467
|
+
writtenFiles: [],
|
|
468
|
+
updatedIndex: false
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
const slugCounts = new Map();
|
|
472
|
+
for (const memory of allExtracted) {
|
|
473
|
+
const slug = slugify(memory.title);
|
|
474
|
+
slugCounts.set(slug, (slugCounts.get(slug) ?? 0) + 1);
|
|
475
|
+
}
|
|
476
|
+
const duplicateTitles = [...slugCounts.entries()].filter(([, count]) => count > 1).map(([slug]) => slug);
|
|
477
|
+
if (duplicateTitles.length > 0) {
|
|
478
|
+
throw new Error(`Duplicate memory titles are not allowed: ${duplicateTitles.join(', ')}`);
|
|
479
|
+
}
|
|
480
|
+
// Idempotency: pre-read existing memory names so a re-run of the same
|
|
481
|
+
// session does not throw EEXIST. `writtenFiles` reports only the new
|
|
482
|
+
// writes so callers can still tell what the run actually produced.
|
|
483
|
+
const existingNames = apply ? readStoredMemoryNames(primaryMemoryDir) : new Set();
|
|
484
|
+
const writtenFiles = [];
|
|
485
|
+
if (apply) {
|
|
486
|
+
mkdirSync(primaryMemoryDir, { recursive: true });
|
|
487
|
+
for (const memory of allExtracted) {
|
|
488
|
+
const slug = slugify(memory.title);
|
|
489
|
+
if (existingNames.has(slug))
|
|
490
|
+
continue;
|
|
491
|
+
const targetPath = join(primaryMemoryDir, `${slug}.md`);
|
|
492
|
+
const safePath = resolveInputPath(targetPath);
|
|
493
|
+
const stableSafePath = stablePath(safePath);
|
|
494
|
+
if (!isInsidePath(stableSafePath, stableRealPath(primaryMemoryDir))) {
|
|
495
|
+
throw new Error('Project memory write target must stay inside the project memory directory');
|
|
496
|
+
}
|
|
497
|
+
writeNewFile(safePath, renderMemoryFile(memory));
|
|
498
|
+
writtenFiles.push(safePath);
|
|
499
|
+
}
|
|
500
|
+
generateMemoryIndexFile(projectRoot, primaryMemoryDir, memoryIndexPath);
|
|
501
|
+
}
|
|
502
|
+
return {
|
|
503
|
+
apply,
|
|
504
|
+
projectRoot,
|
|
505
|
+
sessionId: options.sessionId,
|
|
506
|
+
primaryMemoryDir,
|
|
507
|
+
memoryIndexPath,
|
|
508
|
+
scannedFiles: scannedFiles.length,
|
|
509
|
+
extractedCount: allExtracted.length,
|
|
510
|
+
writtenFiles,
|
|
511
|
+
updatedIndex: apply && writtenFiles.length > 0
|
|
512
|
+
};
|
|
513
|
+
}
|
|
514
|
+
// ---------------------------------------------------------------------------
|
|
515
|
+
// Old extract path (kept for core-artifact-commands.ts)
|
|
516
|
+
// ---------------------------------------------------------------------------
|
|
517
|
+
export function extractStableProjectMemories(content, sourceArtifact) {
|
|
518
|
+
const memories = [];
|
|
519
|
+
let searchStart = 0;
|
|
520
|
+
while (searchStart < content.length) {
|
|
521
|
+
const start = content.indexOf(START_MARKER, searchStart);
|
|
522
|
+
if (start < 0)
|
|
523
|
+
break;
|
|
524
|
+
const bodyStart = start + START_MARKER.length;
|
|
525
|
+
const end = content.indexOf(END_MARKER, bodyStart);
|
|
526
|
+
if (end < 0)
|
|
527
|
+
break;
|
|
528
|
+
const memory = parseBlock(content.slice(bodyStart, end).trim(), sourceArtifact);
|
|
529
|
+
if (memory) {
|
|
530
|
+
assertSafeMemory(memory);
|
|
531
|
+
memories.push(memory);
|
|
532
|
+
}
|
|
533
|
+
searchStart = end + END_MARKER.length;
|
|
534
|
+
}
|
|
535
|
+
return memories.sort((left, right) => slugify(left.title).localeCompare(slugify(right.title)));
|
|
536
|
+
}
|
|
537
|
+
function summarizeExtractResult(result) {
|
|
538
|
+
return {
|
|
539
|
+
apply: result.apply,
|
|
540
|
+
projectRoot: result.projectRoot,
|
|
541
|
+
primaryMemoryDir: result.primaryMemoryDir,
|
|
542
|
+
backupPolicy: result.backupPolicy,
|
|
543
|
+
extractedCount: result.extractedMemories.length,
|
|
544
|
+
plannedWrites: result.plannedWrites.map((write) => ({
|
|
545
|
+
filePath: write.filePath,
|
|
546
|
+
title: write.memory.title,
|
|
547
|
+
kind: write.memory.kind,
|
|
548
|
+
sourceArtifact: write.memory.sourceArtifact
|
|
549
|
+
})),
|
|
550
|
+
writtenFiles: result.writtenFiles
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
function summarizeBackupResult(result) {
|
|
554
|
+
return {
|
|
555
|
+
apply: result.apply,
|
|
556
|
+
projectRoot: result.projectRoot,
|
|
557
|
+
artifactWorkspacePath: result.artifactWorkspacePath,
|
|
558
|
+
primaryMemoryDir: result.primaryMemoryDir,
|
|
559
|
+
backupMemoryDir: result.backupMemoryDir,
|
|
560
|
+
plannedCopies: result.plannedCopies,
|
|
561
|
+
copiedFiles: result.copiedFiles
|
|
562
|
+
};
|
|
563
|
+
}
|
|
564
|
+
export function createProjectMemoryExtractPlan(options) {
|
|
565
|
+
const projectRoot = normalizeRoot(options.projectRoot);
|
|
566
|
+
const primaryMemoryDir = assertSafeProjectMemoryDir(projectRoot);
|
|
567
|
+
const extractedMemories = options.artifactPaths.flatMap((artifactPath) => {
|
|
568
|
+
const safeArtifactPath = assertInsideProject(artifactPath, projectRoot);
|
|
569
|
+
const relativeArtifactPath = relative(projectRoot, safeArtifactPath).replaceAll('\\', '/');
|
|
570
|
+
return extractStableProjectMemories(readFileSync(safeArtifactPath, 'utf8'), relativeArtifactPath);
|
|
571
|
+
}).sort((left, right) => slugify(left.title).localeCompare(slugify(right.title)));
|
|
572
|
+
const slugCounts = new Map();
|
|
573
|
+
for (const memory of extractedMemories) {
|
|
574
|
+
const slug = slugify(memory.title);
|
|
575
|
+
slugCounts.set(slug, (slugCounts.get(slug) ?? 0) + 1);
|
|
576
|
+
}
|
|
577
|
+
const duplicateTitles = [...slugCounts.entries()].filter(([, count]) => count > 1).map(([slug]) => slug);
|
|
578
|
+
if (duplicateTitles.length > 0) {
|
|
579
|
+
throw new Error(`Duplicate memory titles are not allowed: ${duplicateTitles.join(', ')}`);
|
|
580
|
+
}
|
|
581
|
+
const plannedWrites = extractedMemories.map((memory) => ({
|
|
582
|
+
memory,
|
|
583
|
+
filePath: join(primaryMemoryDir, `${slugify(memory.title)}.md`),
|
|
584
|
+
content: renderMemoryFile(memory)
|
|
585
|
+
}));
|
|
586
|
+
return {
|
|
587
|
+
apply: options.apply ?? false,
|
|
588
|
+
projectRoot,
|
|
589
|
+
primaryMemoryDir,
|
|
590
|
+
backupPolicy: 'project-memory-primary-artifact-backup',
|
|
591
|
+
extractedMemories,
|
|
592
|
+
plannedWrites
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
export function executeProjectMemoryExtract(options) {
|
|
596
|
+
const plan = createProjectMemoryExtractPlan(options);
|
|
597
|
+
const writtenFiles = [];
|
|
598
|
+
if (plan.apply) {
|
|
599
|
+
mkdirSync(plan.primaryMemoryDir, { recursive: true });
|
|
600
|
+
const safeMemoryDir = assertSafeProjectMemoryDir(plan.projectRoot);
|
|
601
|
+
// Idempotency: skip writes for memories whose slug already lives in
|
|
602
|
+
// .peaks/memory/. Re-running `peaks memory extract --apply` on the
|
|
603
|
+
// same handoff is a normal peaks-code / peaks-txt retry pattern (the
|
|
604
|
+
// skill prompt may invoke extract more than once when a handoff is
|
|
605
|
+
// edited and re-extracted). Without this, writeNewFile's O_EXCL
|
|
606
|
+
// throws EEXIST and aborts the whole batch. Symmetric with
|
|
607
|
+
// extractSessionMemories (line ~614) which does the same skip.
|
|
608
|
+
const existingNames = readStoredMemoryNames(plan.primaryMemoryDir);
|
|
609
|
+
for (const write of plan.plannedWrites) {
|
|
610
|
+
const slug = slugify(write.memory.title);
|
|
611
|
+
if (existingNames.has(slug))
|
|
612
|
+
continue;
|
|
613
|
+
const targetPath = resolveInputPath(write.filePath);
|
|
614
|
+
const stableTargetPath = stablePath(targetPath);
|
|
615
|
+
if (!isInsidePath(stableTargetPath, stableRealPath(safeMemoryDir))) {
|
|
616
|
+
throw new Error('Project memory write target must stay inside the project memory directory');
|
|
617
|
+
}
|
|
618
|
+
writeNewFile(targetPath, write.content);
|
|
619
|
+
writtenFiles.push(targetPath);
|
|
620
|
+
}
|
|
621
|
+
// After writing any markdown, regenerate the index so downstream
|
|
622
|
+
// readers (peaks project memory-index, peaks-txt re-runs, the next
|
|
623
|
+
// session's presence-set bootstrap) see the new memory. Without
|
|
624
|
+
// this, `peaks memory extract --apply` would leave the index stale
|
|
625
|
+
// and `readMemoryIndex` would either return the empty bootstrap or
|
|
626
|
+
// — pre-bootstrap-fix — return null. Symmetric with
|
|
627
|
+
// extractSessionMemories, which already regenerates the index on
|
|
628
|
+
// apply (see line ~626). We regen whenever --apply is set, even
|
|
629
|
+
// if every write was skipped by idempotency, so the index is
|
|
630
|
+
// always rebuilt against the current .peaks/memory/ directory.
|
|
631
|
+
const indexPath = join(plan.primaryMemoryDir, 'index.json');
|
|
632
|
+
generateMemoryIndexFile(plan.projectRoot, plan.primaryMemoryDir, indexPath);
|
|
633
|
+
}
|
|
634
|
+
return { ...plan, writtenFiles };
|
|
635
|
+
}
|
|
636
|
+
export function createProjectMemoryBackupPlan(options) {
|
|
637
|
+
const projectRoot = normalizeRoot(options.projectRoot);
|
|
638
|
+
const artifactWorkspacePath = normalizeRoot(options.artifactWorkspacePath);
|
|
639
|
+
if (isInsidePath(artifactWorkspacePath, projectRoot)) {
|
|
640
|
+
throw new Error('Artifact workspace must be outside the project root');
|
|
641
|
+
}
|
|
642
|
+
const primaryMemoryDir = assertSafeProjectMemoryDir(projectRoot);
|
|
643
|
+
const backupMemoryDir = join(artifactWorkspacePath, '.peaks', 'memory-backups', 'project-memory-primary');
|
|
644
|
+
const plannedCopies = listMarkdownFiles(primaryMemoryDir).map((sourcePath) => {
|
|
645
|
+
assertSafeMemoryFileContent(readFileSync(sourcePath, 'utf8'));
|
|
646
|
+
const relativeMemoryPath = relative(primaryMemoryDir, sourcePath);
|
|
647
|
+
return {
|
|
648
|
+
sourcePath,
|
|
649
|
+
targetPath: join(backupMemoryDir, relativeMemoryPath)
|
|
650
|
+
};
|
|
651
|
+
});
|
|
652
|
+
return {
|
|
653
|
+
apply: options.apply ?? false,
|
|
654
|
+
projectRoot,
|
|
655
|
+
artifactWorkspacePath,
|
|
656
|
+
primaryMemoryDir,
|
|
657
|
+
backupMemoryDir,
|
|
658
|
+
plannedCopies
|
|
659
|
+
};
|
|
660
|
+
}
|
|
661
|
+
export function executeProjectMemoryBackup(options) {
|
|
662
|
+
const plan = createProjectMemoryBackupPlan(options);
|
|
663
|
+
const copiedFiles = [];
|
|
664
|
+
if (plan.apply) {
|
|
665
|
+
const safeMemoryDir = assertSafeProjectMemoryDir(plan.projectRoot);
|
|
666
|
+
mkdirSync(plan.backupMemoryDir, { recursive: true });
|
|
667
|
+
for (const copy of plan.plannedCopies) {
|
|
668
|
+
const sourcePath = realPathOrThrow(copy.sourcePath, 'Project memory source must stay inside the project memory directory');
|
|
669
|
+
if (!isInsidePath(sourcePath, stableRealPath(safeMemoryDir))) {
|
|
670
|
+
throw new Error('Project memory source must stay inside the project memory directory');
|
|
671
|
+
}
|
|
672
|
+
mkdirSync(dirname(copy.targetPath), { recursive: true });
|
|
673
|
+
copyFileSync(sourcePath, copy.targetPath);
|
|
674
|
+
copiedFiles.push(copy.targetPath);
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
return { ...plan, copiedFiles };
|
|
678
|
+
}
|
|
679
|
+
export function summarizeProjectMemoryExtractResult(result) {
|
|
680
|
+
return summarizeExtractResult(result);
|
|
681
|
+
}
|
|
682
|
+
export function summarizeProjectMemoryBackupResult(result) {
|
|
683
|
+
return summarizeBackupResult(result);
|
|
684
|
+
}
|
|
685
|
+
function emptyByKind() {
|
|
686
|
+
return {
|
|
687
|
+
project: [],
|
|
688
|
+
rule: [],
|
|
689
|
+
decision: [],
|
|
690
|
+
reference: [],
|
|
691
|
+
feedback: [],
|
|
692
|
+
convention: [],
|
|
693
|
+
module: [],
|
|
694
|
+
lesson: []
|
|
695
|
+
};
|
|
696
|
+
}
|
|
697
|
+
function emptyIndex() {
|
|
698
|
+
// Cast through unknown: we *intend* the two halves to together cover the
|
|
699
|
+
// union `ProjectMemoryKind`, but TS does not know that. The `MemoryIndex`
|
|
700
|
+
// type's `hot` / `warm` fields together cover the union; we split the
|
|
701
|
+
// construction so the JSON output mirrors the hot/warm layout the reader
|
|
702
|
+
// expects.
|
|
703
|
+
return {
|
|
704
|
+
version: 1,
|
|
705
|
+
updatedAt: new Date().toISOString(),
|
|
706
|
+
hot: {
|
|
707
|
+
feedback: [],
|
|
708
|
+
decision: [],
|
|
709
|
+
rule: [],
|
|
710
|
+
convention: [],
|
|
711
|
+
module: [],
|
|
712
|
+
lesson: []
|
|
713
|
+
},
|
|
714
|
+
warm: {
|
|
715
|
+
project: [],
|
|
716
|
+
reference: []
|
|
717
|
+
}
|
|
718
|
+
};
|
|
719
|
+
}
|
|
720
|
+
function renderEmptyIndex() {
|
|
721
|
+
return JSON.stringify(emptyIndex(), null, 2) + '\n';
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* Ensure `.peaks/memory/` and its `index.json` exist for a project, with
|
|
725
|
+
* the same full-shape empty index the generator emits when there are zero
|
|
726
|
+
* memories. Idempotent — safe to call on every skill activation.
|
|
727
|
+
*
|
|
728
|
+
* Why this exists: before this helper, `.peaks/memory/` was only created
|
|
729
|
+
* by `extractSessionMemories` when at least one memory markdown was being
|
|
730
|
+
* written, and `index.json` was only emitted by the generator when at
|
|
731
|
+
* least one markdown was on disk. Stock projects therefore had no
|
|
732
|
+
* `.peaks/memory/` directory and no index, even after `peaks project
|
|
733
|
+
* memories` was read. Bootstrap closes that cold-start gap.
|
|
734
|
+
*
|
|
735
|
+
* This function is fail-open for the same reason the rest of the
|
|
736
|
+
* presence layer is fail-open: a failure here must NOT block skill
|
|
737
|
+
* activation. Any error is swallowed and surfaced only via the returned
|
|
738
|
+
* boolean. Callers that need the truth should check the result.
|
|
739
|
+
*/
|
|
740
|
+
export function ensureMemoryBootstrap(projectRoot) {
|
|
741
|
+
try {
|
|
742
|
+
const normalizedRoot = normalizeRoot(projectRoot);
|
|
743
|
+
const memoryDir = assertSafeProjectMemoryDir(normalizedRoot);
|
|
744
|
+
const indexPath = join(memoryDir, 'index.json');
|
|
745
|
+
mkdirSync(memoryDir, { recursive: true });
|
|
746
|
+
if (!existsSync(indexPath)) {
|
|
747
|
+
writeFileSync(indexPath, renderEmptyIndex(), { mode: 0o644 });
|
|
748
|
+
}
|
|
749
|
+
return true;
|
|
750
|
+
}
|
|
751
|
+
catch {
|
|
752
|
+
return false;
|
|
753
|
+
}
|
|
754
|
+
}
|
|
755
|
+
export function readProjectMemories(projectRoot) {
|
|
756
|
+
const normalizedRoot = normalizeRoot(projectRoot);
|
|
757
|
+
const memoryDir = assertSafeProjectMemoryDir(normalizedRoot);
|
|
758
|
+
// Read-side bootstrap: on a stock project the directory does not exist
|
|
759
|
+
// yet. Reading must not return an error, but we also want the directory
|
|
760
|
+
// to materialise (along with a full-shape empty index) so subsequent
|
|
761
|
+
// `peaks project memories` invocations, `readMemoryIndex`, and any
|
|
762
|
+
// extraction call find a stable target. The helper is fail-open.
|
|
763
|
+
if (!existsSync(memoryDir)) {
|
|
764
|
+
ensureMemoryBootstrap(normalizedRoot);
|
|
765
|
+
}
|
|
766
|
+
const memories = [];
|
|
767
|
+
for (const filePath of listMarkdownFiles(memoryDir)) {
|
|
768
|
+
const parsed = parseStoredMemoryFile(readFileSync(filePath, 'utf8'), filePath);
|
|
769
|
+
if (parsed)
|
|
770
|
+
memories.push(parsed);
|
|
771
|
+
}
|
|
772
|
+
memories.sort((left, right) => left.name.localeCompare(right.name));
|
|
773
|
+
const byKind = emptyByKind();
|
|
774
|
+
for (const memory of memories) {
|
|
775
|
+
byKind[memory.kind].push(memory);
|
|
776
|
+
}
|
|
777
|
+
return {
|
|
778
|
+
projectRoot: normalizedRoot,
|
|
779
|
+
memoryDir,
|
|
780
|
+
total: memories.length,
|
|
781
|
+
byKind,
|
|
782
|
+
memories
|
|
783
|
+
};
|
|
784
|
+
}
|
|
785
|
+
/**
|
|
786
|
+
* Read a single project memory's full body by name. Returns null when
|
|
787
|
+
* the memory does not exist. The on-disk body is returned verbatim
|
|
788
|
+
* (pretty). The CLI layer applies `formatMdCompact` when `format: 'compact'`
|
|
789
|
+
* is requested. Slice 023 (R3).
|
|
790
|
+
*/
|
|
791
|
+
export function readProjectMemoryBody(projectRoot, name) {
|
|
792
|
+
const normalizedRoot = normalizeRoot(projectRoot);
|
|
793
|
+
const memoryDir = assertSafeProjectMemoryDir(normalizedRoot);
|
|
794
|
+
if (!existsSync(memoryDir)) {
|
|
795
|
+
ensureMemoryBootstrap(normalizedRoot);
|
|
796
|
+
}
|
|
797
|
+
for (const filePath of listMarkdownFiles(memoryDir)) {
|
|
798
|
+
if (basename(filePath, '.md') !== name)
|
|
799
|
+
continue;
|
|
800
|
+
const parsed = parseStoredMemoryFile(readFileSync(filePath, 'utf8'), filePath);
|
|
801
|
+
if (parsed === null)
|
|
802
|
+
continue;
|
|
803
|
+
const updatedAt = readMemoryFileMtime(filePath);
|
|
804
|
+
return {
|
|
805
|
+
projectRoot: normalizedRoot,
|
|
806
|
+
memoryDir,
|
|
807
|
+
name: parsed.name,
|
|
808
|
+
body: parsed.body,
|
|
809
|
+
filePath,
|
|
810
|
+
updatedAt,
|
|
811
|
+
kind: parsed.kind,
|
|
812
|
+
title: parsed.title,
|
|
813
|
+
pretty: true
|
|
814
|
+
};
|
|
815
|
+
}
|
|
816
|
+
return null;
|
|
817
|
+
}
|