@planu/cli 4.12.3 → 4.14.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +35 -0
- package/README.md +29 -25
- package/dist/cli/commands/inspect.d.ts +4 -0
- package/dist/cli/commands/inspect.js +144 -0
- package/dist/cli/commands/install.d.ts +19 -1
- package/dist/cli/commands/install.js +145 -43
- package/dist/cli/commands/job.d.ts +3 -0
- package/dist/cli/commands/job.js +119 -0
- package/dist/cli/commands/offline.d.ts +15 -0
- package/dist/cli/commands/offline.js +132 -0
- package/dist/cli/commands/serve.js +4 -0
- package/dist/cli/commands/spec.js +1 -1
- package/dist/cli/commands/storage.d.ts +3 -0
- package/dist/cli/commands/storage.js +102 -0
- package/dist/cli/commands/uninstall.d.ts +10 -0
- package/dist/cli/commands/uninstall.js +93 -7
- package/dist/cli/commands/validate.js +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/router.js +9 -1
- package/dist/config/crash-shield-framework-rules.json +93 -0
- package/dist/config/environment-schema.json +149 -0
- package/dist/config/hardcode-exceptions.json +4 -0
- package/dist/config/license-plans.json +7 -0
- package/dist/config/native-release-public-key.pem +3 -0
- package/dist/config/native-targets.json +87 -0
- package/dist/config/product-public.d.ts +89 -0
- package/dist/config/product-public.js +140 -0
- package/dist/config/product-public.json +312 -0
- package/dist/config/product-public.ts +148 -0
- package/dist/config/release-compatibility.json +13 -0
- package/dist/config/release-policy.json +26 -0
- package/dist/config/runtime-policy.json +44 -0
- package/dist/config/skill-templates/planu-validate.md +7 -4
- package/dist/config/subagent-templates/planu-spec-implementer.md +7 -3
- package/dist/config/subagent-templates/planu-validator.md +10 -5
- package/dist/config/technology-registry.json +120 -0
- package/dist/config/version.js +7 -8
- package/dist/config/version.ts +10 -7
- package/dist/engine/abortable-process-runner.js +40 -9
- package/dist/engine/advanced-testing/accessibility-checker.js +12 -14
- package/dist/engine/advanced-testing/mutation-advisor.js +3 -4
- package/dist/engine/advanced-testing/property-based.js +2 -3
- package/dist/engine/advanced-testing/test-data-advisor.js +2 -3
- package/dist/engine/agent-generator.js +2 -1
- package/dist/engine/agent-handoff-store.js +2 -1
- package/dist/engine/agent-prompt-generator.js +7 -5
- package/dist/engine/agent-telemetry.js +2 -1
- package/dist/engine/ai-integration/gemini/extensions-advisor.js +41 -9
- package/dist/engine/ambiguity-detector.js +12 -11
- package/dist/engine/analyzer/db-engine.js +2 -3
- package/dist/engine/analyzer/detectors.js +13 -14
- package/dist/engine/analyzer/env-setup.js +9 -10
- package/dist/engine/analyzer-env-scanner/env-example.js +7 -8
- package/dist/engine/api-spec-generator/graphql-parser.js +2 -2
- package/dist/engine/api-validation/graphql-schema-validator.js +2 -1
- package/dist/engine/api-validation/openapi-impl-validator.js +6 -7
- package/dist/engine/architecture-detector.js +10 -8
- package/dist/engine/auth/config.d.ts +1 -1
- package/dist/engine/auth/config.js +4 -3
- package/dist/engine/auto-updater/atomic-upgrade.d.ts +8 -0
- package/dist/engine/auto-updater/atomic-upgrade.js +381 -0
- package/dist/engine/auto-updater/config-detector.js +9 -3
- package/dist/engine/auto-updater/config-patcher.d.ts +0 -4
- package/dist/engine/auto-updater/config-patcher.js +10 -15
- package/dist/engine/auto-updater/index.d.ts +3 -1
- package/dist/engine/auto-updater/index.js +44 -30
- package/dist/engine/auto-updater/npm-registry.js +10 -2
- package/dist/engine/auto-updater/release-verifier.d.ts +3 -0
- package/dist/engine/auto-updater/release-verifier.js +112 -0
- package/dist/engine/auto-updater/upgrade-lock.d.ts +6 -0
- package/dist/engine/auto-updater/upgrade-lock.js +28 -0
- package/dist/engine/auto-updater/upgrade-trust-state.d.ts +7 -0
- package/dist/engine/auto-updater/upgrade-trust-state.js +59 -0
- package/dist/engine/autopilot/audit-logger.js +2 -5
- package/dist/engine/best-practices-library.js +2 -1
- package/dist/engine/browser-validator.js +2 -1
- package/dist/engine/build-tool-detector.js +3 -2
- package/dist/engine/ci-generator/context-builders.js +7 -5
- package/dist/engine/ci-generator/stack-detector.js +0 -2
- package/dist/engine/ci-generator/yaml-builder.js +0 -2
- package/dist/engine/claude-config-auditor/rules-auditor.js +4 -3
- package/dist/engine/code-transforms/typescript/ast-utils.js +2 -3
- package/dist/engine/complexity-budget/trivial-detector.js +2 -1
- package/dist/engine/compliance-test-generator/index.js +7 -2
- package/dist/engine/compliance-test-generator/test-formatter.js +2 -2
- package/dist/engine/config-health/mcp-config-checker.js +2 -1
- package/dist/engine/config-health/ts-checker-scripts.js +4 -3
- package/dist/engine/config-health/ts-checker.js +3 -2
- package/dist/engine/convention-injector.js +5 -7
- package/dist/engine/convention-scanner/convention-parser.js +3 -2
- package/dist/engine/core-bridge-duplicate-blocks.d.ts +3 -0
- package/dist/engine/core-bridge-duplicate-blocks.js +57 -0
- package/dist/engine/core-bridge-gaps.d.ts +4 -0
- package/dist/engine/core-bridge-gaps.js +75 -0
- package/dist/engine/core-bridge.d.ts +9 -9
- package/dist/engine/core-bridge.js +196 -283
- package/dist/engine/cost-tracking/ledger.js +2 -5
- package/dist/engine/coverage-gap-analyzer.js +10 -1
- package/dist/engine/crash-shield/detectors/framework-detector.d.ts +2 -0
- package/dist/engine/crash-shield/detectors/framework-detector.js +110 -192
- package/dist/engine/crash-shield/detectors/typescript-detector.js +2 -1
- package/dist/engine/dashboard/data-loader.js +2 -1
- package/dist/engine/data-projects-gc/gc-runner.d.ts +7 -0
- package/dist/engine/data-projects-gc/gc-runner.js +113 -3
- package/dist/engine/data-projects-gc/scanner.js +5 -1
- package/dist/engine/decision-store.js +11 -14
- package/dist/engine/deleter/core.js +5 -5
- package/dist/engine/dep-auditor/abandonment-data.js +2 -1
- package/dist/engine/dep-auditor/abandonment-registry.js +3 -1
- package/dist/engine/dep-auditor/cve-fetcher.js +3 -0
- package/dist/engine/dep-auditor/dep-duplicates-detector.js +36 -4
- package/dist/engine/dep-auditor/license-registry.js +2 -0
- package/dist/engine/dependency-evaluator.d.ts +14 -0
- package/dist/engine/dependency-evaluator.js +81 -0
- package/dist/engine/deploy/providers/fly.js +7 -7
- package/dist/engine/deploy/providers/netlify.js +7 -7
- package/dist/engine/deploy/providers/railway.js +10 -12
- package/dist/engine/deploy/providers/vercel.js +7 -9
- package/dist/engine/deprecation-scanner/pattern-loader.js +0 -2
- package/dist/engine/desktop-detector.js +2 -3
- package/dist/engine/detect-duplication.js +2 -1
- package/dist/engine/detectors/advanced-framework-detector/css-state-detector.js +2 -1
- package/dist/engine/detectors/advanced-framework-detector/legacy-detector.js +2 -3
- package/dist/engine/detectors/advanced-framework-detector/modern-detector.js +3 -4
- package/dist/engine/detectors/agent-framework-detector.js +3 -2
- package/dist/engine/detectors/ai-native-detector.js +4 -6
- package/dist/engine/detectors/cache-db-detector.js +4 -3
- package/dist/engine/detectors/cicd-detector.js +4 -3
- package/dist/engine/detectors/deployment-detector.js +11 -12
- package/dist/engine/detectors/frontend-perf-detector.js +14 -9
- package/dist/engine/detectors/library-detector-multilang-a.js +16 -3
- package/dist/engine/detectors/library-detector-node.js +14 -4
- package/dist/engine/detectors/library-detector-python.js +7 -1
- package/dist/engine/detectors/library-detector.js +0 -2
- package/dist/engine/detectors/llm-detector/provider-maps.js +3 -2
- package/dist/engine/detectors/mcp-candidate-detector.js +12 -16
- package/dist/engine/detectors/mfe-detector.js +6 -7
- package/dist/engine/detectors/monitoring-detector.js +4 -3
- package/dist/engine/detectors/otel-detector.js +3 -2
- package/dist/engine/detectors/otel-ecosystem-detectors.d.ts +2 -2
- package/dist/engine/detectors/otel-ecosystem-detectors.js +4 -3
- package/dist/engine/detectors/platform-specialty-detector.js +3 -5
- package/dist/engine/detectors/template-engine-detector.js +3 -4
- package/dist/engine/doc-generator/builders.js +2 -3
- package/dist/engine/doc-generator/mobile-distribution-guide.js +13 -17
- package/dist/engine/doc-generator/portal/dirty-flag-map.d.ts +2 -2
- package/dist/engine/doc-generator/portal/portal-regenerator.js +3 -47
- package/dist/engine/domain-detector.js +3 -6
- package/dist/engine/dynamic-knowledge/knowledge-cache.js +3 -4
- package/dist/engine/dynamic-knowledge/knowledge-merger.js +17 -2
- package/dist/engine/dynamic-knowledge/web-researcher.js +15 -14
- package/dist/engine/dynamic-migration-detector/manifest-readers-extended.js +0 -2
- package/dist/engine/e2e-test-generator.js +4 -3
- package/dist/engine/ecosystem-absorber/knowledge-cache.js +2 -1
- package/dist/engine/ecosystem-absorber/platform-crawler.js +2 -2
- package/dist/engine/escalator/retry-counter.js +2 -1
- package/dist/engine/evidence-gates/artifact-reader.d.ts +6 -0
- package/dist/engine/evidence-gates/artifact-reader.js +105 -21
- package/dist/engine/evidence-gates/lifecycle-gate.d.ts +2 -1
- package/dist/engine/evidence-gates/lifecycle-gate.js +54 -0
- package/dist/engine/execution/context.d.ts +19 -0
- package/dist/engine/execution/context.js +127 -0
- package/dist/engine/execution/deadline-io.d.ts +21 -0
- package/dist/engine/execution/deadline-io.js +45 -0
- package/dist/engine/execution/job-executor.d.ts +16 -0
- package/dist/engine/execution/job-executor.js +140 -0
- package/dist/engine/execution/job-runtime.d.ts +78 -0
- package/dist/engine/execution/job-runtime.js +220 -0
- package/dist/engine/execution/native-relevance-scorer.d.ts +6 -0
- package/dist/engine/execution/native-relevance-scorer.js +64 -0
- package/dist/engine/execution/native-worker-dispatch.d.ts +3 -0
- package/dist/engine/execution/native-worker-dispatch.js +46 -0
- package/dist/engine/execution/native-worker-protocol.d.ts +6 -0
- package/dist/engine/execution/native-worker-protocol.js +33 -0
- package/dist/engine/execution/native-worker-runtime.d.ts +4 -0
- package/dist/engine/execution/native-worker-runtime.js +177 -0
- package/dist/engine/execution/native-worker-thread.d.ts +2 -0
- package/dist/engine/execution/native-worker-thread.js +66 -0
- package/dist/engine/execution/operation-journal.d.ts +66 -0
- package/dist/engine/execution/operation-journal.js +260 -0
- package/dist/engine/execution/outbox-worker.d.ts +31 -0
- package/dist/engine/execution/outbox-worker.js +192 -0
- package/dist/engine/execution/validate-job-executor.d.ts +24 -0
- package/dist/engine/execution/validate-job-executor.js +342 -0
- package/dist/engine/execution/validate-job-payload.d.ts +5 -0
- package/dist/engine/execution/validate-job-payload.js +87 -0
- package/dist/engine/execution/validate-job-recovery.d.ts +4 -0
- package/dist/engine/execution/validate-job-recovery.js +47 -0
- package/dist/engine/execution/validate-worker-runtime.d.ts +5 -0
- package/dist/engine/execution/validate-worker-runtime.js +100 -0
- package/dist/engine/execution/validate-worker-thread.d.ts +2 -0
- package/dist/engine/execution/validate-worker-thread.js +71 -0
- package/dist/engine/execution-plan/desktop-distribution.js +3 -7
- package/dist/engine/execution-plan/mobile-distribution.js +4 -9
- package/dist/engine/execution-plan/phases.js +4 -5
- package/dist/engine/execution-plan/plan-utils.js +8 -5
- package/dist/engine/facilitate/context-loader.js +3 -9
- package/dist/engine/figma/code-connect-fetcher.js +9 -8
- package/dist/engine/filesystem-watcher/index.d.ts +3 -3
- package/dist/engine/filesystem-watcher/index.js +5 -5
- package/dist/engine/framework-detector.js +14 -15
- package/dist/engine/git/planu-autocommit.js +8 -7
- package/dist/engine/git/repository-probe.d.ts +3 -0
- package/dist/engine/git/repository-probe.js +13 -0
- package/dist/engine/global-rules-manager.js +2 -2
- package/dist/engine/handoff-artifacts/io.js +2 -3
- package/dist/engine/handoff-artifacts/schemas/red-tests-handoff.js +8 -1
- package/dist/engine/handoff-artifacts/schemas.d.ts +4 -0
- package/dist/engine/handoff-artifacts/schemas.js +5 -0
- package/dist/engine/hook-generator/stack-hook-templates.js +4 -4
- package/dist/engine/hooks/config-loader.js +1 -1
- package/dist/engine/hooks/context-injector.js +4 -7
- package/dist/engine/hooks/file-watcher.js +1 -14
- package/dist/engine/hooks-reconciler.js +6 -4
- package/dist/engine/infrastructure/component-mapper.js +5 -7
- package/dist/engine/infrastructure/docker-compose-generator.js +8 -10
- package/dist/engine/infrastructure/index.js +6 -3
- package/dist/engine/infrastructure/kubernetes-generator.js +2 -2
- package/dist/engine/infrastructure/railway-generator.js +10 -8
- package/dist/engine/infrastructure/signal-detector.js +6 -8
- package/dist/engine/infrastructure/terraform-generator.js +6 -8
- package/dist/engine/legal-compliance/detector.js +3 -2
- package/dist/engine/local-first/storage-advisor.js +5 -6
- package/dist/engine/macos-keychain-native-port.d.ts +5 -0
- package/dist/engine/macos-keychain-native-port.js +26 -0
- package/dist/engine/marketplace-fetcher/cache.js +3 -1
- package/dist/engine/mcp-config/mcp-config-writer.d.ts +2 -2
- package/dist/engine/mcp-config/mcp-config-writer.js +10 -8
- package/dist/engine/migration/db-migrator.js +2 -5
- package/dist/engine/migration/equivalence-mapper.js +12 -13
- package/dist/engine/migration/service-catalogs.js +6 -7
- package/dist/engine/migration/service-migrator-catalogs.js +6 -7
- package/dist/engine/mobile-detector-ios.js +2 -3
- package/dist/engine/mobile-detector.js +16 -4
- package/dist/engine/model-router/complexity-analyzer.js +4 -7
- package/dist/engine/multi-agent-review/security-analyzer.js +3 -1
- package/dist/engine/multi-app-detector/app-type.js +26 -21
- package/dist/engine/multi-app-detector/core.js +3 -2
- package/dist/engine/multi-teammate-review/disagreement-counter.js +2 -1
- package/dist/engine/multi-teammate-review/panel-orchestrator.js +0 -2
- package/dist/engine/mutation-config-generator.js +10 -7
- package/dist/engine/native-capability-policy.d.ts +4 -0
- package/dist/engine/native-capability-policy.js +24 -0
- package/dist/engine/native-platform.d.ts +3 -0
- package/dist/engine/native-platform.js +44 -0
- package/dist/engine/native-runtime-handshake.d.ts +20 -0
- package/dist/engine/native-runtime-handshake.js +230 -0
- package/dist/engine/network-policy.d.ts +27 -0
- package/dist/engine/network-policy.js +174 -0
- package/dist/engine/next-spec-resolver/dependency-filter.js +2 -22
- package/dist/engine/nfr-profile-detector.js +12 -16
- package/dist/engine/nli-keywords.js +8 -9
- package/dist/engine/oauth/config-guard.js +4 -5
- package/dist/engine/observability/local-execution-spans.d.ts +15 -0
- package/dist/engine/observability/local-execution-spans.js +63 -0
- package/dist/engine/orchestrator/runtime.js +0 -1
- package/dist/engine/package-registry.js +2 -6
- package/dist/engine/performance-analyzer.js +2 -5
- package/dist/engine/permissions-merger/stack-detectors.js +5 -5
- package/dist/engine/planu-core.darwin-arm64.node.manifest.json +39 -0
- package/dist/engine/planu-core.darwin-arm64.node.sbom.json +1310 -0
- package/dist/engine/planu-core.darwin-x64.node.manifest.json +39 -0
- package/dist/engine/planu-core.darwin-x64.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-arm64-gnu.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-arm64-gnu.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-arm64-musl.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-arm64-musl.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-x64-gnu.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-x64-gnu.node.sbom.json +1310 -0
- package/dist/engine/planu-core.linux-x64-musl.node.manifest.json +38 -0
- package/dist/engine/planu-core.linux-x64-musl.node.sbom.json +1310 -0
- package/dist/engine/planu-core.win32-arm64-msvc.node.manifest.json +38 -0
- package/dist/engine/planu-core.win32-arm64-msvc.node.sbom.json +1310 -0
- package/dist/engine/planu-core.win32-x64-msvc.node.manifest.json +38 -0
- package/dist/engine/planu-core.win32-x64-msvc.node.sbom.json +1310 -0
- package/dist/engine/platform-detector/desktop.js +15 -2
- package/dist/engine/platform-detector/extensions.js +2 -1
- package/dist/engine/platform-detector/games.js +2 -1
- package/dist/engine/platform-detector.js +3 -2
- package/dist/engine/platform-engineering/idp-detector.js +2 -1
- package/dist/engine/plugin-installer/stack-matcher.js +9 -17
- package/dist/engine/plugins/lifecycle.js +6 -2
- package/dist/engine/prior-decisions/contradiction-detector.js +60 -30
- package/dist/engine/project-dna/stack-detector.js +15 -17
- package/dist/engine/project-graph/builder.js +11 -0
- package/dist/engine/project-graph/cache.js +1 -1
- package/dist/engine/project-graph/freshness-projection.d.ts +16 -0
- package/dist/engine/project-graph/freshness-projection.js +95 -0
- package/dist/engine/project-graph/index.d.ts +1 -0
- package/dist/engine/project-graph/index.js +1 -0
- package/dist/engine/project-graph/query.js +15 -25
- package/dist/engine/project-health-checker.js +3 -4
- package/dist/engine/project-scanner/stack-detector.js +17 -17
- package/dist/engine/property-test-generator.js +2 -3
- package/dist/engine/qa-gate.d.ts +1 -0
- package/dist/engine/qa-gate.js +6 -4
- package/dist/engine/quality-gates/gate-catalog.js +47 -46
- package/dist/engine/quality-gates/gate-injector.js +9 -4
- package/dist/engine/registry/core.js +0 -2
- package/dist/engine/registry/loader.js +9 -12
- package/dist/engine/registry/matcher.js +129 -24
- package/dist/engine/resilience-detector/concurrency-detector.js +4 -4
- package/dist/engine/resilience-detector/middleware-detector.js +11 -13
- package/dist/engine/resilience-detector/validation-detector.js +17 -4
- package/dist/engine/reverse-engineer/config-analyzer.js +9 -8
- package/dist/engine/reverse-engineer/orchestrator.js +5 -9
- package/dist/engine/reverse-engineer/test-file-parser.js +6 -3
- package/dist/engine/rules-generator/index.js +6 -5
- package/dist/engine/runtime-policy.d.ts +7 -0
- package/dist/engine/runtime-policy.js +101 -0
- package/dist/engine/runtime-security/checkers/content-security.js +21 -6
- package/dist/engine/runtime-security/checkers/file-permissions.js +0 -2
- package/dist/engine/safety/atomic-write-file.js +20 -9
- package/dist/engine/safety/atomic-writer.js +10 -3
- package/dist/engine/safety/cross-process-lock.d.ts +3 -40
- package/dist/engine/safety/cross-process-lock.js +268 -272
- package/dist/engine/safety/file-mutex.d.ts +2 -9
- package/dist/engine/safety/file-mutex.js +155 -87
- package/dist/engine/safety/health-monitor.js +15 -6
- package/dist/engine/safety/lock-lease-store.d.ts +79 -0
- package/dist/engine/safety/lock-lease-store.js +372 -0
- package/dist/engine/safety/lock-scavenger.d.ts +2 -5
- package/dist/engine/safety/lock-scavenger.js +158 -76
- package/dist/engine/safety/lock-staleness.js +4 -1
- package/dist/engine/safety/obsolete-lock-guard.d.ts +8 -0
- package/dist/engine/safety/obsolete-lock-guard.js +31 -0
- package/dist/engine/safety/transaction.js +3 -3
- package/dist/engine/sandbox/index.js +2 -1
- package/dist/engine/sandbox/runner-detect.js +3 -2
- package/dist/engine/sandbox/runner-docker.js +4 -3
- package/dist/engine/scan-project/module-discoverer.js +3 -2
- package/dist/engine/schema-generator.js +16 -9
- package/dist/engine/security-analyzer/criteria-generator.js +2 -3
- package/dist/engine/self-healing/healer.js +4 -4
- package/dist/engine/session-safeguard/learnings-buffer.d.ts +1 -2
- package/dist/engine/session-safeguard/learnings-buffer.js +42 -65
- package/dist/engine/shared-agent-memory.js +66 -74
- package/dist/engine/skill-adapter/command-rewriter.js +3 -2
- package/dist/engine/skill-adapter/index.js +3 -3
- package/dist/engine/skill-adapter/placeholder-map.js +3 -2
- package/dist/engine/skill-bootstrap/stack-matcher.js +47 -48
- package/dist/engine/skill-generation/stack-content-generator.js +0 -2
- package/dist/engine/skill-generator/workflow-skill-generator.js +2 -1
- package/dist/engine/skill-registry/ttl-refresh.js +3 -1
- package/dist/engine/skills/skills-fetcher.js +3 -6
- package/dist/engine/skills-reconciler.js +19 -39
- package/dist/engine/spec-coverage/test-finder.js +7 -6
- package/dist/engine/spec-diff-engine.js +3 -3
- package/dist/engine/spec-generator/api-key-resolver.d.ts +1 -1
- package/dist/engine/spec-generator/api-key-resolver.js +3 -24
- package/dist/engine/spec-generators/issue-extractor.js +9 -3
- package/dist/engine/spec-migrator/drift-detector.js +5 -13
- package/dist/engine/spec-migrator/filesystem-import.js +14 -10
- package/dist/engine/spec-migrator/planu-canonical-policy.js +10 -1
- package/dist/engine/spec-migrator/strict-planu-cleanup.js +24 -25
- package/dist/engine/spec-registry/adapter.d.ts +0 -5
- package/dist/engine/spec-registry/adapter.js +45 -46
- package/dist/engine/spec-registry/client.js +2 -0
- package/dist/engine/spec-source-sync.js +3 -2
- package/dist/engine/spec-templates/custom-loader.js +2 -3
- package/dist/engine/spec-templates/templates-domain-specific.js +8 -5
- package/dist/engine/spec-templates/templates-perf-integration.js +2 -3
- package/dist/engine/stack-auditor/manifest-reader.js +0 -2
- package/dist/engine/staleness/stale-implementing.js +7 -7
- package/dist/engine/tdd-scaffold-generator.js +24 -11
- package/dist/engine/teammate-router/green-phase-verifier.js +2 -1
- package/dist/engine/teammate-router/red-phase-verifier.js +2 -1
- package/dist/engine/technology-registry.d.ts +11 -0
- package/dist/engine/technology-registry.js +142 -0
- package/dist/engine/telemetry/error-reporter.d.ts +1 -2
- package/dist/engine/telemetry/error-reporter.js +11 -18
- package/dist/engine/telemetry/health-checker.js +5 -14
- package/dist/engine/telemetry/index.d.ts +0 -1
- package/dist/engine/telemetry/index.js +0 -1
- package/dist/engine/telemetry/stance.js +3 -2
- package/dist/engine/telemetry/telemetry-client.d.ts +1 -5
- package/dist/engine/telemetry/telemetry-client.js +45 -29
- package/dist/engine/telemetry/telemetry-store.d.ts +3 -3
- package/dist/engine/telemetry/telemetry-store.js +30 -23
- package/dist/engine/test-framework-detector/detectors.js +8 -8
- package/dist/engine/test-framework-detector/strategy.js +8 -9
- package/dist/engine/test-generators/agent-test-templates.js +2 -3
- package/dist/engine/test-generators/contract-test-generator.d.ts +1 -1
- package/dist/engine/test-generators/contract-test-generator.js +9 -202
- package/dist/engine/test-generators/platform-test-templates-b.js +2 -3
- package/dist/engine/test-generators/platform-test-templates.js +2 -5
- package/dist/engine/test-mocks-generator.js +4 -3
- package/dist/engine/test-plan-generator.js +30 -12
- package/dist/engine/test-scaffold-generator/advanced-scaffold.js +4 -5
- package/dist/engine/test-scaffold-generator/unit-scaffold.js +5 -6
- package/dist/engine/timing/budget.d.ts +6 -17
- package/dist/engine/timing/budget.js +80 -64
- package/dist/engine/tool-groups/group-manager.js +3 -3
- package/dist/engine/universal-rules/installer.js +1 -1
- package/dist/engine/universal-rules/rules/planu-modes.js +2 -0
- package/dist/engine/universal-rules/rules/planu-release-policy.js +1 -0
- package/dist/engine/update-notifier.js +8 -5
- package/dist/engine/validation/approved-spec-portability.d.ts +12 -0
- package/dist/engine/validation/approved-spec-portability.js +107 -0
- package/dist/engine/validation/durable-validation.d.ts +36 -0
- package/dist/engine/validation/durable-validation.js +335 -0
- package/dist/engine/validation/validation-freshness.d.ts +36 -0
- package/dist/engine/validation/validation-freshness.js +427 -0
- package/dist/engine/validation/validation-receipt-codec.d.ts +13 -0
- package/dist/engine/validation/validation-receipt-codec.js +182 -0
- package/dist/engine/validation/validation-receipt.d.ts +59 -0
- package/dist/engine/validation/validation-receipt.js +282 -0
- package/dist/engine/validation/validation-source-policy.d.ts +4 -0
- package/dist/engine/validation/validation-source-policy.js +16 -0
- package/dist/engine/validation/validation-submission.d.ts +36 -0
- package/dist/engine/validation/validation-submission.js +128 -0
- package/dist/engine/validation-evidence-ledger.js +41 -0
- package/dist/engine/validation-impact-planner.js +25 -9
- package/dist/engine/validator/spec-compliance-runner.d.ts +1 -1
- package/dist/engine/validator/spec-compliance-runner.js +17 -8
- package/dist/engine/validator/validation-report-writer.js +1 -1
- package/dist/engine/validator.js +2 -1
- package/dist/engine/verify-integrations/index.js +1 -1
- package/dist/engine/version-resolver.js +5 -6
- package/dist/engine/web-fetcher/stack-advisor.js +156 -92
- package/dist/engine/web-fetcher/stack-detector.js +114 -54
- package/dist/engine/workspace-manager.js +3 -2
- package/dist/errors/classified-degradation.d.ts +3 -0
- package/dist/errors/classified-degradation.js +10 -0
- package/dist/errors/degradation-sink.d.ts +3 -0
- package/dist/errors/degradation-sink.js +5 -0
- package/dist/errors/error-taxonomy.d.ts +12 -0
- package/dist/errors/error-taxonomy.js +62 -0
- package/dist/hosts/claude-code/ux/mcp-prompts.js +10 -4
- package/dist/hosts/claude-code/ux/mcp-resources.js +4 -2
- package/dist/hosts/codex/config-scaffold.js +4 -3
- package/dist/hosts/gemini/config-scaffold.js +2 -1
- package/dist/hosts/gemini/multimodal-spec-flow.js +7 -4
- package/dist/index.js +21 -6
- package/dist/resources/patterns.js +3 -1
- package/dist/resources/specs.js +3 -1
- package/dist/resources/templates.js +3 -1
- package/dist/security/adapters/environment.d.ts +12 -0
- package/dist/security/adapters/environment.js +25 -0
- package/dist/security/adapters/linux-secret-service.d.ts +8 -0
- package/dist/security/adapters/linux-secret-service.js +60 -0
- package/dist/security/adapters/macos-keychain.d.ts +18 -0
- package/dist/security/adapters/macos-keychain.js +90 -0
- package/dist/security/adapters/windows-credential-manager.d.ts +8 -0
- package/dist/security/adapters/windows-credential-manager.js +58 -0
- package/dist/security/redactor.d.ts +5 -0
- package/dist/security/redactor.js +58 -0
- package/dist/security/secret-field.d.ts +5 -0
- package/dist/security/secret-field.js +17 -0
- package/dist/security/secret-migration.d.ts +3 -0
- package/dist/security/secret-migration.js +123 -0
- package/dist/security/secret-provider.d.ts +23 -0
- package/dist/security/secret-provider.js +145 -0
- package/dist/security/secure-json.d.ts +3 -0
- package/dist/security/secure-json.js +29 -0
- package/dist/storage/api-surfaces-store.js +2 -2
- package/dist/storage/approval-operation-lock.d.ts +1 -1
- package/dist/storage/approval-operation-lock.js +5 -3
- package/dist/storage/audit-trail-store.d.ts +1 -1
- package/dist/storage/audit-trail-store.js +48 -62
- package/dist/storage/autopilot-log-store.js +12 -5
- package/dist/storage/base-store.d.ts +8 -8
- package/dist/storage/base-store.js +57 -20
- package/dist/storage/checkpoint-store.js +5 -2
- package/dist/storage/comments-store.js +2 -2
- package/dist/storage/compliance-audit-store.js +5 -2
- package/dist/storage/compliance-gate-config-store.js +7 -4
- package/dist/storage/compliance-store.js +2 -2
- package/dist/storage/context-profile-store.js +2 -2
- package/dist/storage/crash-shield-store.js +8 -4
- package/dist/storage/feedback-store.js +10 -6
- package/dist/storage/figma-store.js +8 -4
- package/dist/storage/file-mutex.js +9 -1
- package/dist/storage/gaps-log.js +7 -4
- package/dist/storage/global-projects-store.js +4 -2
- package/dist/storage/ideas-store.js +2 -2
- package/dist/storage/index.d.ts +5 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/knowledge-store/knowledge.js +27 -33
- package/dist/storage/lessons-store.js +2 -2
- package/dist/storage/license-store.js +13 -41
- package/dist/storage/migrations/canonical-storage.d.ts +15 -0
- package/dist/storage/migrations/canonical-storage.js +599 -0
- package/dist/storage/oauth-store.js +36 -8
- package/dist/storage/path-resolver.js +16 -3
- package/dist/storage/pr-store.js +2 -2
- package/dist/storage/project-drift-store.js +20 -8
- package/dist/storage/project-identity.d.ts +32 -0
- package/dist/storage/project-identity.js +194 -0
- package/dist/storage/project-resolver.js +14 -7
- package/dist/storage/release-notes-store.js +2 -6
- package/dist/storage/runtime-db.d.ts +186 -0
- package/dist/storage/runtime-db.js +1054 -0
- package/dist/storage/schema-registry.d.ts +5 -0
- package/dist/storage/schema-registry.js +74 -0
- package/dist/storage/sentry-store.js +20 -9
- package/dist/storage/session-state-store.js +12 -5
- package/dist/storage/session-store.js +12 -4
- package/dist/storage/skill-registry-storage.d.ts +1 -1
- package/dist/storage/skill-registry-storage.js +13 -11
- package/dist/storage/slack-store.js +10 -5
- package/dist/storage/spec-store.js +31 -24
- package/dist/storage/status-store/file-lock.js +31 -9
- package/dist/storage/status-store/self-healing.js +10 -5
- package/dist/storage/status-store/version-sync.js +8 -6
- package/dist/storage/steering-store.js +2 -2
- package/dist/storage/storage-bundle.d.ts +5 -0
- package/dist/storage/storage-bundle.js +117 -0
- package/dist/storage/storage-catalog-validation.d.ts +3 -0
- package/dist/storage/storage-catalog-validation.js +20 -0
- package/dist/storage/storage-catalog.d.ts +25 -0
- package/dist/storage/storage-catalog.js +390 -0
- package/dist/storage/storage-layout.d.ts +24 -0
- package/dist/storage/storage-layout.js +101 -0
- package/dist/storage/storybook-store.js +2 -2
- package/dist/storage/supabase-store.js +24 -6
- package/dist/storage/tdd-policy-store.js +8 -6
- package/dist/storage/tech-debt-store.js +3 -3
- package/dist/storage/technology-selection-store.d.ts +1 -1
- package/dist/storage/technology-selection-store.js +6 -3
- package/dist/storage/token-cache-store.js +3 -3
- package/dist/storage/token-ledger-store.js +13 -8
- package/dist/storage/transition-log.js +7 -4
- package/dist/storage/trash-store.js +15 -6
- package/dist/storage/vector-store/migrator.js +7 -2
- package/dist/storage/vector-store/sqlite-adapter.js +4 -1
- package/dist/storage/webhook-server-store.js +2 -2
- package/dist/tools/api-spec-generator-handler.js +3 -2
- package/dist/tools/auto-update-handler.d.ts +1 -1
- package/dist/tools/auto-update-handler.js +1 -1
- package/dist/tools/browser-validate-handler.js +2 -1
- package/dist/tools/challenge-spec/platform-challenge-scenarios-b.js +8 -5
- package/dist/tools/challenge-spec/scenarios-desktop.js +8 -3
- package/dist/tools/challenge-spec/scenarios-failure.js +7 -2
- package/dist/tools/challenge-spec/security-challenge-scenarios.js +3 -3
- package/dist/tools/clarify-requirements/multiple-choice.js +53 -41
- package/dist/tools/comments-handler.js +2 -3
- package/dist/tools/compliance-test-handler.js +2 -2
- package/dist/tools/configure-telemetry.js +11 -11
- package/dist/tools/create-spec/auto-pipeline.js +13 -1
- package/dist/tools/create-spec/autopilot-analyzer.d.ts +1 -1
- package/dist/tools/create-spec/autopilot-analyzer.js +2 -4
- package/dist/tools/create-spec/mcp-tool-contract.d.ts +10 -4
- package/dist/tools/create-spec/mcp-tool-contract.js +7 -36
- package/dist/tools/create-spec/post-creation.d.ts +2 -1
- package/dist/tools/create-spec/post-creation.js +56 -54
- package/dist/tools/create-spec/relevance-scorer.d.ts +1 -1
- package/dist/tools/create-spec/relevance-scorer.js +17 -1
- package/dist/tools/create-spec/spec-builder.js +2 -12
- package/dist/tools/create-spec/spec-created-outbox-consumer.d.ts +14 -0
- package/dist/tools/create-spec/spec-created-outbox-consumer.js +176 -0
- package/dist/tools/create-spec.js +385 -520
- package/dist/tools/define-ui-contract/agent-interaction-contract.js +2 -4
- package/dist/tools/define-ui-contract-desktop/desktop-contract.js +12 -4
- package/dist/tools/define-ui-contract-desktop/native-contract.js +7 -3
- package/dist/tools/define-ui-contract-extensions.js +2 -3
- package/dist/tools/define-ui-contract-mobile.js +5 -9
- package/dist/tools/define-ui-contract-web/component-tree.js +4 -3
- package/dist/tools/define-ui-contract.js +7 -4
- package/dist/tools/deploy/deploy-spec.js +2 -4
- package/dist/tools/deploy/deploy-status.js +2 -4
- package/dist/tools/design-schema/nosql-category-schemas.js +2 -3
- package/dist/tools/design-schema-sql/migrations.js +3 -2
- package/dist/tools/design-schema-sql/tables.js +4 -1
- package/dist/tools/design-schema.js +4 -3
- package/dist/tools/feedback-handler.js +2 -4
- package/dist/tools/gc-data-projects.js +5 -5
- package/dist/tools/generate-execution-plan.js +3 -4
- package/dist/tools/generate-sub-agent.js +2 -1
- package/dist/tools/generate-tests/generators/a11y-tests-generator.js +5 -4
- package/dist/tools/generate-tests/generators/advanced-testing-generator.js +5 -4
- package/dist/tools/generate-tests/generators/concurrency-test-generator/js-templates.js +9 -4
- package/dist/tools/generate-tests/generators/concurrency-test-generator.js +8 -4
- package/dist/tools/generate-tests/generators/database/detectors.js +9 -3
- package/dist/tools/generate-tests/generators/database/index.js +2 -4
- package/dist/tools/generate-tests/generators/event-test-generator.js +5 -4
- package/dist/tools/generate-tests/generators/game-tests-generator.js +2 -1
- package/dist/tools/generate-tests/generators/graphql-test-generator.js +11 -5
- package/dist/tools/generate-tests/generators/grpc-test-generator.js +2 -3
- package/dist/tools/generate-tests/generators/llm-security-test-generator.js +4 -3
- package/dist/tools/generate-tests/generators/local-first-test-generator.js +4 -3
- package/dist/tools/generate-tests/generators/mcp-tests-generator.js +11 -9
- package/dist/tools/generate-tests/generators/microservices/index.js +2 -3
- package/dist/tools/generate-tests/generators/otel-test-generator.js +6 -3
- package/dist/tools/generate-tests/generators/security/detectors.js +2 -5
- package/dist/tools/generate-tests/generators/security/index.js +2 -4
- package/dist/tools/generate-tests/generators/supply-chain-test-generator.js +2 -3
- package/dist/tools/generate-tests/generators/visual-regression-generator.js +14 -17
- package/dist/tools/generate-tests/generators/websocket-test-generator.js +2 -3
- package/dist/tools/generate-tests/test-helpers.js +11 -12
- package/dist/tools/generate-tests-content.js +4 -3
- package/dist/tools/generate-tests.js +7 -4
- package/dist/tools/git/git-helpers.d.ts +0 -2
- package/dist/tools/git/git-helpers.js +7 -7
- package/dist/tools/github-pr-handler.js +10 -3
- package/dist/tools/heal-spec-docs.js +6 -53
- package/dist/tools/hook-generator-handler.js +6 -6
- package/dist/tools/init-constitution/platform-principles.js +4 -2
- package/dist/tools/init-project/agents-md-writer.js +14 -5
- package/dist/tools/init-project/claude-md-generator.js +19 -12
- package/dist/tools/init-project/handler.js +165 -73
- package/dist/tools/init-project/host-assets-writer.d.ts +1 -1
- package/dist/tools/init-project/host-assets-writer.js +4 -2
- package/dist/tools/init-project/lifecycle-helpers.js +3 -5
- package/dist/tools/init-project/lint-scaffolder.js +6 -2
- package/dist/tools/init-project/migration-runner.d.ts +10 -1
- package/dist/tools/init-project/migration-runner.js +68 -3
- package/dist/tools/init-project/per-client-files-writer.js +14 -4
- package/dist/tools/init-project/rules-generator.js +10 -2
- package/dist/tools/init-project/scaffold-writer.d.ts +1 -1
- package/dist/tools/init-project/scaffold-writer.js +17 -15
- package/dist/tools/jobs/handlers.d.ts +15 -0
- package/dist/tools/jobs/handlers.js +126 -0
- package/dist/tools/list-specs.js +35 -34
- package/dist/tools/manage-plugins-handler.js +17 -9
- package/dist/tools/migrate-tech/advanced-handlers.js +3 -2
- package/dist/tools/migrate-tech/build-tool-handlers.js +3 -2
- package/dist/tools/migrate-tech/core-handlers.js +5 -2
- package/dist/tools/migrate-tech/data-handlers.js +6 -3
- package/dist/tools/migrate-tech-advanced/rollback-handlers.js +3 -2
- package/dist/tools/migrate-tech-advanced/service-handlers.js +5 -2
- package/dist/tools/oauth-handler.js +7 -1
- package/dist/tools/register-sdd-tools.d.ts +1 -1
- package/dist/tools/register-sdd-tools.js +5 -0
- package/dist/tools/register-spec-tools/core-spec-tools.js +31 -0
- package/dist/tools/registry/auth.js +13 -5
- package/dist/tools/registry/publish.js +7 -4
- package/dist/tools/resolve-project-path.d.ts +2 -2
- package/dist/tools/resolve-project-path.js +7 -7
- package/dist/tools/reverse-engineer/analyzer.js +14 -14
- package/dist/tools/rollback-release.js +3 -2
- package/dist/tools/safe-handler.js +295 -171
- package/dist/tools/schema-generator-handler.js +2 -1
- package/dist/tools/schemas/output-schemas.d.ts +88 -82
- package/dist/tools/schemas/output-schemas.js +12 -94
- package/dist/tools/schemas/plugins-schemas.js +0 -2
- package/dist/tools/schemas/registry.js +0 -2
- package/dist/tools/schemas/skill-registry-schemas.js +0 -2
- package/dist/tools/schemas/validate-output-schema.d.ts +256 -0
- package/dist/tools/schemas/validate-output-schema.js +212 -0
- package/dist/tools/sentry-handler.js +6 -1
- package/dist/tools/skill-bootstrap-handler.js +7 -4
- package/dist/tools/status-handler.js +4 -0
- package/dist/tools/storage-bundle-handler.d.ts +9 -0
- package/dist/tools/storage-bundle-handler.js +29 -0
- package/dist/tools/storage-paths-handler.d.ts +9 -0
- package/dist/tools/storage-paths-handler.js +17 -0
- package/dist/tools/suggest-mcp-server.js +11 -5
- package/dist/tools/suggest-mcps.js +29 -9
- package/dist/tools/suggest-tooling/advanced-testing-catalog.js +4 -5
- package/dist/tools/suggest-tooling/build-tool-catalog.js +2 -1
- package/dist/tools/suggest-tooling/css-framework-catalog.js +13 -7
- package/dist/tools/suggest-tooling/framework-catalog.js +3 -5
- package/dist/tools/suggest-tooling/frontend-perf-catalog.js +2 -6
- package/dist/tools/suggest-tooling/handler.js +10 -4
- package/dist/tools/suggest-tooling/hypermedia-catalog.js +11 -3
- package/dist/tools/suggest-tooling/linting-catalog.js +4 -7
- package/dist/tools/suggest-tooling/llm-security-catalog.js +2 -1
- package/dist/tools/suggest-tooling/local-first-catalog.js +7 -5
- package/dist/tools/suggest-tooling/observability-catalog.js +3 -4
- package/dist/tools/suggest-tooling/otel-catalog.js +4 -1
- package/dist/tools/suggest-tooling/resilience-catalog.js +16 -5
- package/dist/tools/suggest-tooling/skills-catalog.js +10 -9
- package/dist/tools/suggest-tooling/supply-chain-catalog.js +2 -3
- package/dist/tools/supabase-handler.js +2 -1
- package/dist/tools/token-intelligence-handler.js +2 -2
- package/dist/tools/token-recording.js +2 -2
- package/dist/tools/token-savings-handler.js +2 -2
- package/dist/tools/tool-registry/core-tools.js +131 -0
- package/dist/tools/tool-registry/group-infra.js +10 -12
- package/dist/tools/tool-registry/group-quality-compliance.js +5 -12
- package/dist/tools/update-status/approval-gates.d.ts +13 -0
- package/dist/tools/update-status/approval-gates.js +81 -0
- package/dist/tools/update-status/batch.js +4 -2
- package/dist/tools/update-status/dod-gates.d.ts +6 -24
- package/dist/tools/update-status/dod-gates.js +60 -135
- package/dist/tools/update-status/done-receipt-verifier.d.ts +15 -0
- package/dist/tools/update-status/done-receipt-verifier.js +145 -0
- package/dist/tools/update-status/evidence-gate.js +154 -2
- package/dist/tools/update-status/file-sync.js +23 -12
- package/dist/tools/update-status/gate-harness.d.ts +7 -0
- package/dist/tools/update-status/gate-harness.js +8 -0
- package/dist/tools/update-status/index.js +228 -325
- package/dist/tools/update-status/qa-gate.d.ts +1 -1
- package/dist/tools/update-status/qa-gate.js +2 -2
- package/dist/tools/update-status/side-effects.js +30 -37
- package/dist/tools/update-status/transition-guard.d.ts +4 -2
- package/dist/tools/update-status/transition-guard.js +57 -10
- package/dist/tools/update-status-convention-gate.js +24 -23
- package/dist/tools/update-status-reconcile.js +2 -2
- package/dist/tools/validate-api-contract-handler.js +3 -3
- package/dist/tools/validate-lint.js +20 -13
- package/dist/tools/validate.d.ts +3 -1
- package/dist/tools/validate.js +213 -5
- package/dist/transports/http-transport.js +84 -61
- package/dist/transports/middleware/with-telemetry.js +3 -2
- package/dist/types/abortable-process.d.ts +2 -0
- package/dist/types/advanced-framework.js +0 -2
- package/dist/types/atomic-upgrade.d.ts +71 -0
- package/dist/types/atomic-upgrade.js +2 -0
- package/dist/types/ci.js +0 -2
- package/dist/types/core-bridge.d.ts +78 -1
- package/dist/types/crash-shield-framework-rules.d.ts +24 -0
- package/dist/types/crash-shield-framework-rules.js +2 -0
- package/dist/types/data-gc.d.ts +16 -0
- package/dist/types/deploy.js +0 -2
- package/dist/types/durable-job.d.ts +78 -0
- package/dist/types/durable-job.js +2 -0
- package/dist/types/durable-validation.d.ts +60 -0
- package/dist/types/durable-validation.js +2 -0
- package/dist/types/estimation.d.ts +2 -0
- package/dist/types/evidence-gates.d.ts +9 -1
- package/dist/types/execution.d.ts +43 -0
- package/dist/types/handoff-artifacts.d.ts +2 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.js +2 -0
- package/dist/types/infrastructure.js +0 -2
- package/dist/types/lifecycle.js +0 -2
- package/dist/types/migration/canonical-storage.d.ts +37 -0
- package/dist/types/migration/canonical-storage.js +2 -0
- package/dist/types/migration/index.d.ts +1 -1
- package/dist/types/native-worker.d.ts +48 -0
- package/dist/types/native-worker.js +2 -0
- package/dist/types/network-policy.d.ts +12 -0
- package/dist/types/network-policy.js +2 -0
- package/dist/types/oauth.js +0 -2
- package/dist/types/observability.d.ts +32 -0
- package/dist/types/outbox-worker.d.ts +35 -0
- package/dist/types/outbox-worker.js +11 -0
- package/dist/types/permissions-config.d.ts +0 -27
- package/dist/types/permissions-config.js +0 -2
- package/dist/types/plugin-install.d.ts +0 -11
- package/dist/types/plugin-install.js +0 -2
- package/dist/types/portal.d.ts +1 -0
- package/dist/types/product-public.d.ts +75 -0
- package/dist/types/product-public.js +2 -0
- package/dist/types/project/inputs.d.ts +2 -0
- package/dist/types/project/mfe-detection.js +0 -2
- package/dist/types/project/platform-mobile.js +0 -2
- package/dist/types/project/platform-specialty.js +0 -2
- package/dist/types/project-knowledge-graph.d.ts +7 -0
- package/dist/types/runtime-database.d.ts +10 -0
- package/dist/types/runtime-database.js +2 -0
- package/dist/types/runtime-policy.d.ts +40 -0
- package/dist/types/runtime-policy.js +2 -0
- package/dist/types/safety.d.ts +4 -5
- package/dist/types/schema-registry.d.ts +12 -0
- package/dist/types/schema-registry.js +2 -0
- package/dist/types/security.d.ts +52 -0
- package/dist/types/skill-registry.js +0 -2
- package/dist/types/spec/inputs.d.ts +2 -0
- package/dist/types/spec-lock-v2.d.ts +13 -7
- package/dist/types/spec-lock-v2.js +1 -1
- package/dist/types/spec-registry.js +0 -2
- package/dist/types/storage-bundle.d.ts +13 -0
- package/dist/types/storage-bundle.js +2 -0
- package/dist/types/storage-catalog.d.ts +18 -0
- package/dist/types/storage-catalog.js +2 -0
- package/dist/types/team-planner.js +0 -2
- package/dist/types/technology-registry.d.ts +35 -0
- package/dist/types/technology-registry.js +2 -0
- package/dist/types/technology-symbols.generated.d.ts +117 -0
- package/dist/types/technology-symbols.generated.js +2 -0
- package/dist/types/telemetry.d.ts +3 -3
- package/dist/types/transport.d.ts +2 -0
- package/dist/types/validate-worker.d.ts +44 -0
- package/dist/types/validate-worker.js +2 -0
- package/dist/types/validation-evidence.d.ts +1 -1
- package/dist/types/validation-receipt.d.ts +104 -0
- package/dist/types/validation-receipt.js +2 -0
- package/package.json +31 -20
- package/planu-native.json +1 -1
- package/planu-plugin.json +1 -1
- package/dist/engine/telemetry/geo-resolver.d.ts +0 -9
- package/dist/engine/telemetry/geo-resolver.js +0 -43
- package/dist/storage/data-dir-discovery.d.ts +0 -31
- package/dist/storage/data-dir-discovery.js +0 -140
- package/dist/storage/migrations/cwd-to-absolute.d.ts +0 -25
- package/dist/storage/migrations/cwd-to-absolute.js +0 -281
- package/dist/tools/create-spec/adapters/prior-decisions-hint.d.ts +0 -14
- package/dist/tools/create-spec/adapters/prior-decisions-hint.js +0 -30
- package/dist/tools/init-project/ancestor-data-detector.d.ts +0 -22
- package/dist/tools/init-project/ancestor-data-detector.js +0 -81
- package/dist/tools/update-status/force-done-audit.d.ts +0 -2
- package/dist/tools/update-status/force-done-audit.js +0 -23
- package/dist/types/migration/cwd-to-absolute.d.ts +0 -8
- package/dist/types/migration/cwd-to-absolute.js +0 -3
|
@@ -17,16 +17,21 @@ async function pathIsDirectory(path) {
|
|
|
17
17
|
return false;
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
+
async function readDirectory(path) {
|
|
21
|
+
try {
|
|
22
|
+
return await readdir(path);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return [];
|
|
26
|
+
}
|
|
27
|
+
}
|
|
20
28
|
async function gitRmCached(projectPath, relPath) {
|
|
21
29
|
if (!existsSync(join(projectPath, '.git'))) {
|
|
22
30
|
return;
|
|
23
31
|
}
|
|
24
32
|
try {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
args.push('-r');
|
|
28
|
-
}
|
|
29
|
-
args.push(relPath);
|
|
33
|
+
// This helper is only called for directories from removePath.
|
|
34
|
+
const args = ['rm', '--cached', '--quiet', '--ignore-unmatch', '-r', relPath];
|
|
30
35
|
await execFileAsync('git', args, {
|
|
31
36
|
cwd: projectPath,
|
|
32
37
|
timeout: 5_000,
|
|
@@ -48,9 +53,6 @@ function appendSectionIfMissing(specContent, heading, body) {
|
|
|
48
53
|
async function mergeLegacySpecFile(projectPath, specDir, fileName) {
|
|
49
54
|
const specPath = join(specDir, 'spec.md');
|
|
50
55
|
const legacyPath = join(specDir, fileName);
|
|
51
|
-
if (!existsSync(legacyPath) || !existsSync(specPath)) {
|
|
52
|
-
return false;
|
|
53
|
-
}
|
|
54
56
|
const [specContent, legacyContent] = await Promise.all([
|
|
55
57
|
readFile(specPath, 'utf-8'),
|
|
56
58
|
readFile(legacyPath, 'utf-8'),
|
|
@@ -70,7 +72,6 @@ async function mergeLegacySpecFile(projectPath, specDir, fileName) {
|
|
|
70
72
|
});
|
|
71
73
|
}
|
|
72
74
|
await safeUnlink(projectPath, legacyPath);
|
|
73
|
-
return true;
|
|
74
75
|
}
|
|
75
76
|
async function removePath(projectPath, absolutePath) {
|
|
76
77
|
const rel = relative(projectPath, absolutePath);
|
|
@@ -116,13 +117,12 @@ async function updateGitignore(projectPath) {
|
|
|
116
117
|
return true;
|
|
117
118
|
}
|
|
118
119
|
async function walkSpecDirectory(projectPath, specDir, result) {
|
|
119
|
-
const entries = await
|
|
120
|
+
const entries = await readDirectory(specDir);
|
|
120
121
|
for (const entry of entries) {
|
|
121
122
|
const full = join(specDir, entry);
|
|
122
123
|
if (mustMergeBeforeDeleteSpecFile(entry)) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
}
|
|
124
|
+
await mergeLegacySpecFile(projectPath, specDir, entry);
|
|
125
|
+
result.merged.push(relative(projectPath, full));
|
|
126
126
|
continue;
|
|
127
127
|
}
|
|
128
128
|
const isDir = await pathIsDirectory(full);
|
|
@@ -134,11 +134,10 @@ async function walkSpecDirectory(projectPath, specDir, result) {
|
|
|
134
134
|
}
|
|
135
135
|
}
|
|
136
136
|
async function shouldDeleteOrphanSpecDir(specDir) {
|
|
137
|
-
const entries = await
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
return !entries.some((entry) => mustMergeBeforeDeleteSpecFile(entry));
|
|
137
|
+
const entries = await readDirectory(specDir);
|
|
138
|
+
// Legacy split files are only mergeable when the canonical destination exists.
|
|
139
|
+
// Keeping them without spec.md leaves a permanently non-canonical orphan behind.
|
|
140
|
+
return !entries.includes('spec.md');
|
|
142
141
|
}
|
|
143
142
|
export async function runStrictPlanuCleanup(projectPath) {
|
|
144
143
|
const result = { deleted: [], merged: [], gitignoreUpdated: false };
|
|
@@ -146,7 +145,7 @@ export async function runStrictPlanuCleanup(projectPath) {
|
|
|
146
145
|
if (!existsSync(planuDir)) {
|
|
147
146
|
return result;
|
|
148
147
|
}
|
|
149
|
-
const entries = await
|
|
148
|
+
const entries = await readDirectory(planuDir);
|
|
150
149
|
for (const entry of entries) {
|
|
151
150
|
const full = join(planuDir, entry);
|
|
152
151
|
const isDir = await pathIsDirectory(full);
|
|
@@ -161,7 +160,7 @@ export async function runStrictPlanuCleanup(projectPath) {
|
|
|
161
160
|
}
|
|
162
161
|
}
|
|
163
162
|
const releasesDir = join(planuDir, 'releases');
|
|
164
|
-
for (const entry of await
|
|
163
|
+
for (const entry of await readDirectory(releasesDir)) {
|
|
165
164
|
const rel = `releases/${entry}`;
|
|
166
165
|
if (!isCanonicalReleaseFile(rel)) {
|
|
167
166
|
const full = join(releasesDir, entry);
|
|
@@ -170,7 +169,7 @@ export async function runStrictPlanuCleanup(projectPath) {
|
|
|
170
169
|
}
|
|
171
170
|
}
|
|
172
171
|
const specsDir = join(planuDir, 'specs');
|
|
173
|
-
for (const entry of await
|
|
172
|
+
for (const entry of await readDirectory(specsDir)) {
|
|
174
173
|
const full = join(specsDir, entry);
|
|
175
174
|
if (!(await pathIsDirectory(full)) || entry === 'data') {
|
|
176
175
|
await removePath(projectPath, full);
|
|
@@ -198,7 +197,7 @@ export async function validateStrictPlanuLayout(projectPath, options = {}) {
|
|
|
198
197
|
const offenders = [];
|
|
199
198
|
const planuDir = join(projectPath, 'planu');
|
|
200
199
|
if (options.includeRoot !== false) {
|
|
201
|
-
const entries = await
|
|
200
|
+
const entries = await readDirectory(planuDir);
|
|
202
201
|
for (const entry of entries) {
|
|
203
202
|
const full = join(planuDir, entry);
|
|
204
203
|
const isDir = await pathIsDirectory(full);
|
|
@@ -207,7 +206,7 @@ export async function validateStrictPlanuLayout(projectPath, options = {}) {
|
|
|
207
206
|
offenders.push(relative(projectPath, full));
|
|
208
207
|
}
|
|
209
208
|
}
|
|
210
|
-
for (const entry of await
|
|
209
|
+
for (const entry of await readDirectory(join(planuDir, 'releases'))) {
|
|
211
210
|
const rel = `releases/${entry}`;
|
|
212
211
|
if (!isCanonicalReleaseFile(rel)) {
|
|
213
212
|
offenders.push(`planu/${rel}`);
|
|
@@ -215,7 +214,7 @@ export async function validateStrictPlanuLayout(projectPath, options = {}) {
|
|
|
215
214
|
}
|
|
216
215
|
}
|
|
217
216
|
const scopedSpecDirs = resolveSpecDirsForValidation(projectPath, options.specPath) ??
|
|
218
|
-
(await
|
|
217
|
+
(await readDirectory(join(planuDir, 'specs'))).map((specDir) => join(planuDir, 'specs', specDir));
|
|
219
218
|
for (const full of scopedSpecDirs) {
|
|
220
219
|
const specDir = relative(join(planuDir, 'specs'), full);
|
|
221
220
|
if (!(await pathIsDirectory(full)) || specDir === 'data') {
|
|
@@ -226,7 +225,7 @@ export async function validateStrictPlanuLayout(projectPath, options = {}) {
|
|
|
226
225
|
offenders.push(relative(projectPath, full));
|
|
227
226
|
continue;
|
|
228
227
|
}
|
|
229
|
-
for (const entry of await
|
|
228
|
+
for (const entry of await readDirectory(full)) {
|
|
230
229
|
const entryPath = join(full, entry);
|
|
231
230
|
const isDir = await pathIsDirectory(entryPath);
|
|
232
231
|
if (isDir ? !isCanonicalSpecDir(entry) : !isCanonicalSpecFile(entry)) {
|
|
@@ -1,8 +1,3 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Stack detection and spec adaptation for registry specs.
|
|
3
|
-
* Detects project technology stack from config files and applies
|
|
4
|
-
* framework-specific substitutions to spec content.
|
|
5
|
-
*/
|
|
6
1
|
import type { StackDetectionResult, StackAdaptation } from '../../types/index.js';
|
|
7
2
|
export declare function detectStack(projectPath: string): Promise<StackDetectionResult>;
|
|
8
3
|
export declare function adaptSpec(specDir: string, projectStack: StackDetectionResult, adaptableMap?: Record<string, Record<string, string>>): Promise<StackAdaptation[]>;
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// — must enumerate framework names by design; no detection logic to migrate.
|
|
1
|
+
import { technologyValue } from '../technology-registry.js';
|
|
3
2
|
/**
|
|
4
3
|
* Stack detection and spec adaptation for registry specs.
|
|
5
4
|
* Detects project technology stack from config files and applies
|
|
@@ -59,49 +58,49 @@ function textContains(text, keyword) {
|
|
|
59
58
|
// ---------------------------------------------------------------------------
|
|
60
59
|
function detectNodeFramework(pkg) {
|
|
61
60
|
if (hasDep(pkg, 'next')) {
|
|
62
|
-
return 'nextjs';
|
|
61
|
+
return technologyValue('technology-nextjs-c93379');
|
|
63
62
|
}
|
|
64
|
-
if (hasDep(pkg, 'nuxt')) {
|
|
65
|
-
return 'nuxt';
|
|
63
|
+
if (hasDep(pkg, technologyValue('technology-nuxt-22c407'))) {
|
|
64
|
+
return technologyValue('technology-nuxt-22c407');
|
|
66
65
|
}
|
|
67
|
-
if (hasDep(pkg, '@sveltejs/kit') || hasDep(pkg, 'svelte')) {
|
|
68
|
-
return 'sveltekit';
|
|
66
|
+
if (hasDep(pkg, '@sveltejs/kit') || hasDep(pkg, technologyValue('technology-svelte-c190ac'))) {
|
|
67
|
+
return technologyValue('technology-sveltekit-eefb03');
|
|
69
68
|
}
|
|
70
|
-
if (hasDep(pkg, '@remix-run/node') || hasDep(pkg, 'remix')) {
|
|
71
|
-
return 'remix';
|
|
69
|
+
if (hasDep(pkg, '@remix-run/node') || hasDep(pkg, technologyValue('technology-remix-0c5d96'))) {
|
|
70
|
+
return technologyValue('technology-remix-0c5d96');
|
|
72
71
|
}
|
|
73
|
-
if (hasDep(pkg, 'astro')) {
|
|
74
|
-
return 'astro';
|
|
72
|
+
if (hasDep(pkg, technologyValue('technology-astro-23661e'))) {
|
|
73
|
+
return technologyValue('technology-astro-23661e');
|
|
75
74
|
}
|
|
76
|
-
if (hasDep(pkg, 'fastify')) {
|
|
77
|
-
return 'fastify';
|
|
75
|
+
if (hasDep(pkg, technologyValue('technology-fastify-cbe57e'))) {
|
|
76
|
+
return technologyValue('technology-fastify-cbe57e');
|
|
78
77
|
}
|
|
79
|
-
if (hasDep(pkg, 'express')) {
|
|
80
|
-
return 'express';
|
|
78
|
+
if (hasDep(pkg, technologyValue('technology-express-008231'))) {
|
|
79
|
+
return technologyValue('technology-express-008231');
|
|
81
80
|
}
|
|
82
81
|
return 'unknown';
|
|
83
82
|
}
|
|
84
83
|
function detectNodeOrm(pkg) {
|
|
85
|
-
if (hasDep(pkg, '@prisma/client') || hasDep(pkg, 'prisma')) {
|
|
86
|
-
return 'prisma';
|
|
84
|
+
if (hasDep(pkg, '@prisma/client') || hasDep(pkg, technologyValue('technology-prisma-99497c'))) {
|
|
85
|
+
return technologyValue('technology-prisma-99497c');
|
|
87
86
|
}
|
|
88
87
|
if (hasDep(pkg, 'drizzle-orm')) {
|
|
89
|
-
return 'drizzle';
|
|
88
|
+
return technologyValue('technology-drizzle-424f22');
|
|
90
89
|
}
|
|
91
|
-
if (hasDep(pkg, 'sequelize')) {
|
|
92
|
-
return 'sequelize';
|
|
90
|
+
if (hasDep(pkg, technologyValue('technology-sequelize-d18291'))) {
|
|
91
|
+
return technologyValue('technology-sequelize-d18291');
|
|
93
92
|
}
|
|
94
|
-
if (hasDep(pkg, 'typeorm')) {
|
|
95
|
-
return 'typeorm';
|
|
93
|
+
if (hasDep(pkg, technologyValue('technology-typeorm-527d4d'))) {
|
|
94
|
+
return technologyValue('technology-typeorm-527d4d');
|
|
96
95
|
}
|
|
97
96
|
return undefined;
|
|
98
97
|
}
|
|
99
98
|
function detectNodeTestRunner(pkg) {
|
|
100
|
-
if (hasDevDep(pkg, 'vitest')) {
|
|
101
|
-
return 'vitest';
|
|
99
|
+
if (hasDevDep(pkg, technologyValue('technology-vitest-a9127f'))) {
|
|
100
|
+
return technologyValue('technology-vitest-a9127f');
|
|
102
101
|
}
|
|
103
|
-
if (hasDevDep(pkg, 'jest')) {
|
|
104
|
-
return 'jest';
|
|
102
|
+
if (hasDevDep(pkg, technologyValue('technology-jest-35e99f'))) {
|
|
103
|
+
return technologyValue('technology-jest-35e99f');
|
|
105
104
|
}
|
|
106
105
|
if (hasDevDep(pkg, 'mocha')) {
|
|
107
106
|
return 'mocha';
|
|
@@ -140,7 +139,7 @@ async function detectNodePackageManager(projectPath) {
|
|
|
140
139
|
async function detectNodeStack(projectPath, pkg) {
|
|
141
140
|
const result = { language: 'javascript', framework: 'unknown' };
|
|
142
141
|
if (await fileExists(join(projectPath, 'tsconfig.json'))) {
|
|
143
|
-
result.language = 'typescript';
|
|
142
|
+
result.language = technologyValue('technology-typescript-969545');
|
|
144
143
|
}
|
|
145
144
|
result.framework = detectNodeFramework(pkg);
|
|
146
145
|
result.orm = detectNodeOrm(pkg);
|
|
@@ -158,20 +157,20 @@ async function detectPythonStack(projectPath) {
|
|
|
158
157
|
const requirements = await readTextSafe(join(projectPath, 'requirements.txt'));
|
|
159
158
|
const combined = [pyproject, requirements].filter(Boolean).join('\n');
|
|
160
159
|
/* v8 ignore start -- Python framework detection branches */
|
|
161
|
-
if (textContains(combined, 'fastapi')) {
|
|
162
|
-
result.framework = 'fastapi';
|
|
160
|
+
if (textContains(combined, technologyValue('technology-fastapi-6aee0e'))) {
|
|
161
|
+
result.framework = technologyValue('technology-fastapi-6aee0e');
|
|
163
162
|
}
|
|
164
|
-
else if (textContains(combined, 'django')) {
|
|
165
|
-
result.framework = 'django';
|
|
163
|
+
else if (textContains(combined, technologyValue('technology-django-7d8a08'))) {
|
|
164
|
+
result.framework = technologyValue('technology-django-7d8a08');
|
|
166
165
|
}
|
|
167
|
-
else if (textContains(combined, 'flask')) {
|
|
168
|
-
result.framework = 'flask';
|
|
166
|
+
else if (textContains(combined, technologyValue('technology-flask-b87aa5'))) {
|
|
167
|
+
result.framework = technologyValue('technology-flask-b87aa5');
|
|
169
168
|
}
|
|
170
|
-
if (textContains(combined, 'sqlalchemy')) {
|
|
171
|
-
result.orm = 'sqlalchemy';
|
|
169
|
+
if (textContains(combined, technologyValue('technology-sqlalchemy-37f268'))) {
|
|
170
|
+
result.orm = technologyValue('technology-sqlalchemy-37f268');
|
|
172
171
|
}
|
|
173
|
-
if (textContains(combined, 'pytest')) {
|
|
174
|
-
result.testRunner = 'pytest';
|
|
172
|
+
if (textContains(combined, technologyValue('technology-pytest-2b0121'))) {
|
|
173
|
+
result.testRunner = technologyValue('technology-pytest-2b0121');
|
|
175
174
|
}
|
|
176
175
|
if (await fileExists(join(projectPath, 'poetry.lock'))) {
|
|
177
176
|
result.packageManager = 'poetry';
|
|
@@ -193,13 +192,13 @@ async function detectGoStack(projectPath) {
|
|
|
193
192
|
return result;
|
|
194
193
|
}
|
|
195
194
|
if (goMod.includes('github.com/gin-gonic/gin')) {
|
|
196
|
-
result.framework = 'gin';
|
|
195
|
+
result.framework = technologyValue('technology-gin-985adc');
|
|
197
196
|
}
|
|
198
197
|
else if (goMod.includes('github.com/gofiber/fiber')) {
|
|
199
|
-
result.framework = 'fiber';
|
|
198
|
+
result.framework = technologyValue('technology-fiber-77c3e6');
|
|
200
199
|
}
|
|
201
200
|
if (goMod.includes('gorm.io/gorm')) {
|
|
202
|
-
result.orm = 'gorm';
|
|
201
|
+
result.orm = technologyValue('technology-gorm-7f6614');
|
|
203
202
|
}
|
|
204
203
|
return result;
|
|
205
204
|
}
|
|
@@ -209,14 +208,14 @@ async function detectRustStack(projectPath) {
|
|
|
209
208
|
if (!cargo) {
|
|
210
209
|
return result;
|
|
211
210
|
}
|
|
212
|
-
if (textContains(cargo, 'actix-web')) {
|
|
213
|
-
result.framework = 'actix-web';
|
|
211
|
+
if (textContains(cargo, technologyValue('technology-actix-web-ab3e35'))) {
|
|
212
|
+
result.framework = technologyValue('technology-actix-web-ab3e35');
|
|
214
213
|
}
|
|
215
|
-
else if (textContains(cargo, 'axum')) {
|
|
216
|
-
result.framework = 'axum';
|
|
214
|
+
else if (textContains(cargo, technologyValue('technology-axum-af7119'))) {
|
|
215
|
+
result.framework = technologyValue('technology-axum-af7119');
|
|
217
216
|
}
|
|
218
|
-
if (textContains(cargo, 'diesel')) {
|
|
219
|
-
result.orm = 'diesel';
|
|
217
|
+
if (textContains(cargo, technologyValue('technology-diesel-f83cff'))) {
|
|
218
|
+
result.orm = technologyValue('technology-diesel-f83cff');
|
|
220
219
|
}
|
|
221
220
|
return result;
|
|
222
221
|
}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
// HTTP client for the Planu spec registry. Uses node:https/http only (no external deps).
|
|
3
3
|
import * as https from 'node:https';
|
|
4
4
|
import * as http from 'node:http';
|
|
5
|
+
import { assertNetworkAllowed } from '../network-policy.js';
|
|
5
6
|
const DEFAULT_BASE_URL = 'https://registry.planu.dev/api/v1';
|
|
6
7
|
const MAX_RETRIES = 3;
|
|
7
8
|
const BASE_DELAY_MS = 1000;
|
|
@@ -71,6 +72,7 @@ async function request(url, options, body) {
|
|
|
71
72
|
}
|
|
72
73
|
/** Execute a single HTTP request. */
|
|
73
74
|
function executeRequest(url, options, body) {
|
|
75
|
+
assertNetworkAllowed(url);
|
|
74
76
|
return new Promise((resolve, reject) => {
|
|
75
77
|
const transport = getTransport(url);
|
|
76
78
|
const req = transport.request(url, options, (res) => {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { technologyValue } from './technology-registry.js';
|
|
1
2
|
// engine/spec-source-sync.ts — Spec-as-Source sync logic (SPEC-349)
|
|
2
3
|
import { readFile } from 'node:fs/promises';
|
|
3
4
|
// ---------------------------------------------------------------------------
|
|
@@ -26,9 +27,9 @@ export function detectMarkers(content) {
|
|
|
26
27
|
export function detectLanguage(filePath) {
|
|
27
28
|
const ext = filePath.split('.').pop()?.toLowerCase() ?? '';
|
|
28
29
|
const MAP = {
|
|
29
|
-
ts: 'typescript',
|
|
30
|
+
ts: technologyValue('technology-typescript-969545'),
|
|
30
31
|
js: 'javascript',
|
|
31
|
-
tsx: 'typescript',
|
|
32
|
+
tsx: technologyValue('technology-typescript-969545'),
|
|
32
33
|
jsx: 'javascript',
|
|
33
34
|
py: 'python',
|
|
34
35
|
rb: 'ruby',
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
import { readdir, readFile } from 'node:fs/promises';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
6
|
import { z } from 'zod';
|
|
7
|
+
import { resolvedStorageArtifactPath } from '../../storage/storage-catalog.js';
|
|
7
8
|
/** Zod schema for validating custom template JSON files. */
|
|
8
9
|
const templateVariableSchema = z.object({
|
|
9
10
|
key: z.string().min(1),
|
|
@@ -53,14 +54,12 @@ const customTemplateSchema = z.object({
|
|
|
53
54
|
fichaTecnicaTemplate: z.string().min(1),
|
|
54
55
|
progressTemplate: z.string().min(1),
|
|
55
56
|
});
|
|
56
|
-
/** Default directory for custom user templates. */
|
|
57
|
-
const CUSTOM_TEMPLATES_DIR = 'data/global/spec-templates/custom';
|
|
58
57
|
/**
|
|
59
58
|
* Loads custom templates from a directory. Each .json file is validated.
|
|
60
59
|
* Malformed files generate warnings but do not block loading of other templates.
|
|
61
60
|
*/
|
|
62
61
|
export async function loadCustomTemplates(baseDir) {
|
|
63
|
-
const dir = baseDir ??
|
|
62
|
+
const dir = baseDir ?? resolvedStorageArtifactPath('custom-spec-templates');
|
|
64
63
|
const templates = [];
|
|
65
64
|
const warnings = [];
|
|
66
65
|
let files;
|
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// Auth login, auth OAuth, Stripe payment, and CRUD resource templates.
|
|
3
|
-
// Templates 5-8 (REST API integration, webhook, file upload, background job) are in
|
|
4
|
-
// templates-domain-specific-b.ts.
|
|
1
|
+
import { technologyValue } from '../technology-registry.js';
|
|
5
2
|
import { REST_API_INTEGRATION_TEMPLATE, WEBHOOK_CONSUMER_TEMPLATE, FILE_UPLOAD_TEMPLATE, BACKGROUND_JOB_TEMPLATE, } from './templates-domain-specific-b.js';
|
|
6
3
|
export { REST_API_INTEGRATION_TEMPLATE, WEBHOOK_CONSUMER_TEMPLATE, FILE_UPLOAD_TEMPLATE, BACKGROUND_JOB_TEMPLATE, };
|
|
7
4
|
/** Auth Login spec template — credential validation, session, rate limiting, lockout. */
|
|
@@ -223,7 +220,13 @@ export const STRIPE_PAYMENT_TEMPLATE = {
|
|
|
223
220
|
name: 'Stripe Payment',
|
|
224
221
|
category: 'integration',
|
|
225
222
|
description: 'Stripe checkout sessions, webhook signature verification, refunds, and failed payment retry.',
|
|
226
|
-
tags: [
|
|
223
|
+
tags: [
|
|
224
|
+
'payments',
|
|
225
|
+
technologyValue('technology-stripe-2bed20'),
|
|
226
|
+
'webhook',
|
|
227
|
+
'idempotency',
|
|
228
|
+
'backend',
|
|
229
|
+
],
|
|
227
230
|
complexityScore: 'M',
|
|
228
231
|
estimationBase: {
|
|
229
232
|
hoursMin: 20,
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
// Extracted from catalog-extra.ts to keep file sizes within limits.
|
|
1
|
+
import { technologyValue } from '../technology-registry.js';
|
|
3
2
|
/** Performance optimization spec template. */
|
|
4
3
|
export const PERFORMANCE_OPTIMIZATION_TEMPLATE = {
|
|
5
4
|
id: 'performance-optimization',
|
|
@@ -139,7 +138,7 @@ export const THIRD_PARTY_INTEGRATION_TEMPLATE = {
|
|
|
139
138
|
key: 'ServiceName',
|
|
140
139
|
label: 'Service name',
|
|
141
140
|
description: 'Name of the external service to integrate',
|
|
142
|
-
example: '
|
|
141
|
+
example: technologyValue('technology-stripe-961a60'),
|
|
143
142
|
required: true,
|
|
144
143
|
},
|
|
145
144
|
{
|
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
// SPEC-597-EXEMPT: canonical mapping (npm-package↔framework, keyword catalogue)
|
|
2
|
-
// — must enumerate framework names by design; no detection logic to migrate.
|
|
3
1
|
// manifest-reader.ts — Reads project manifest files (SPEC-041)
|
|
4
2
|
import { readFile } from 'node:fs/promises';
|
|
5
3
|
import { join } from 'node:path';
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
import { readFile, access, readdir } from 'node:fs/promises';
|
|
6
6
|
import { join } from 'node:path';
|
|
7
7
|
import { constants } from 'node:fs';
|
|
8
|
-
import { hashProjectPath } from '../../storage/base-store.js';
|
|
8
|
+
import { hashProjectPath, projectDataDir } from '../../storage/base-store.js';
|
|
9
9
|
// ---------------------------------------------------------------------------
|
|
10
10
|
// Helpers
|
|
11
11
|
// ---------------------------------------------------------------------------
|
|
@@ -18,8 +18,8 @@ async function fileExists(p) {
|
|
|
18
18
|
return false;
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
async function getLastTransitionForSpec(
|
|
22
|
-
const logPath = join(
|
|
21
|
+
async function getLastTransitionForSpec(projectId, specId) {
|
|
22
|
+
const logPath = join(projectDataDir(projectId), 'transition-log.jsonl');
|
|
23
23
|
try {
|
|
24
24
|
const raw = await readFile(logPath, 'utf-8');
|
|
25
25
|
const lines = raw.trim().split('\n').filter(Boolean);
|
|
@@ -47,8 +47,8 @@ async function getLastTransitionForSpec(projectPath, projectId, specId) {
|
|
|
47
47
|
return null;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
async function getDaysInImplementing(
|
|
51
|
-
const logPath = join(
|
|
50
|
+
async function getDaysInImplementing(projectId, specId) {
|
|
51
|
+
const logPath = join(projectDataDir(projectId), 'transition-log.jsonl');
|
|
52
52
|
try {
|
|
53
53
|
const raw = await readFile(logPath, 'utf-8');
|
|
54
54
|
const lines = raw.trim().split('\n').filter(Boolean);
|
|
@@ -120,8 +120,8 @@ export async function findStaleImplementing(params) {
|
|
|
120
120
|
// No specs dir
|
|
121
121
|
}
|
|
122
122
|
const hasProgress = specDir !== null && (await fileExists(join(specDir, 'progress.md')));
|
|
123
|
-
const daysInStatus = await getDaysInImplementing(
|
|
124
|
-
const lastTransition = await getLastTransitionForSpec(
|
|
123
|
+
const daysInStatus = await getDaysInImplementing(projectId, spec.id);
|
|
124
|
+
const lastTransition = await getLastTransitionForSpec(projectId, spec.id);
|
|
125
125
|
if (daysInStatus >= daysThreshold || daysInStatus === -1) {
|
|
126
126
|
results.push({
|
|
127
127
|
specId: spec.id,
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { technologyValue } from './technology-registry.js';
|
|
1
2
|
// engine/tdd-scaffold-generator.ts — SPEC-323
|
|
2
3
|
// Generates TDD scaffold (failing test stubs + impl skeleton) from spec ACs.
|
|
3
4
|
import { readFile } from 'node:fs/promises';
|
|
@@ -41,11 +42,11 @@ async function detectFramework(projectPath) {
|
|
|
41
42
|
...(pkg.dependencies ?? {}),
|
|
42
43
|
...(pkg.devDependencies ?? {}),
|
|
43
44
|
};
|
|
44
|
-
if ('vitest' in deps) {
|
|
45
|
-
return 'vitest';
|
|
45
|
+
if (technologyValue('technology-vitest-a9127f') in deps) {
|
|
46
|
+
return technologyValue('technology-vitest-a9127f');
|
|
46
47
|
}
|
|
47
|
-
if ('jest' in deps) {
|
|
48
|
-
return 'jest';
|
|
48
|
+
if (technologyValue('technology-jest-35e99f') in deps) {
|
|
49
|
+
return technologyValue('technology-jest-35e99f');
|
|
49
50
|
}
|
|
50
51
|
if ('mocha' in deps) {
|
|
51
52
|
return 'mocha';
|
|
@@ -56,7 +57,7 @@ async function detectFramework(projectPath) {
|
|
|
56
57
|
// Check for Python or Java markers
|
|
57
58
|
const setup = await readFile(join(projectPath, 'setup.py'), 'utf8').catch(() => null);
|
|
58
59
|
if (setup !== null) {
|
|
59
|
-
return 'pytest';
|
|
60
|
+
return technologyValue('technology-pytest-2b0121');
|
|
60
61
|
}
|
|
61
62
|
const pom = await readFile(join(projectPath, 'pom.xml'), 'utf8').catch(() => null);
|
|
62
63
|
if (pom !== null) {
|
|
@@ -174,13 +175,13 @@ function buildJunitContent(stubs) {
|
|
|
174
175
|
}
|
|
175
176
|
function buildTestContent(stubs, framework) {
|
|
176
177
|
switch (framework) {
|
|
177
|
-
case 'vitest':
|
|
178
|
+
case technologyValue('technology-vitest-a9127f'):
|
|
178
179
|
return buildVitestContent(stubs);
|
|
179
|
-
case 'jest':
|
|
180
|
+
case technologyValue('technology-jest-35e99f'):
|
|
180
181
|
return buildJestContent(stubs);
|
|
181
182
|
case 'mocha':
|
|
182
183
|
return buildMochaContent(stubs);
|
|
183
|
-
case 'pytest':
|
|
184
|
+
case technologyValue('technology-pytest-2b0121'):
|
|
184
185
|
return buildPytestContent(stubs);
|
|
185
186
|
case 'junit':
|
|
186
187
|
return buildJunitContent(stubs);
|
|
@@ -223,9 +224,21 @@ export async function generateTddScaffold(specPath, projectPath) {
|
|
|
223
224
|
testName: criterionToTestName(criterion),
|
|
224
225
|
framework,
|
|
225
226
|
}));
|
|
226
|
-
const ext = framework === 'pytest'
|
|
227
|
-
|
|
228
|
-
|
|
227
|
+
const ext = framework === technologyValue('technology-pytest-2b0121')
|
|
228
|
+
? 'py'
|
|
229
|
+
: framework === 'junit'
|
|
230
|
+
? 'java'
|
|
231
|
+
: 'ts';
|
|
232
|
+
const testExt = framework === technologyValue('technology-pytest-2b0121')
|
|
233
|
+
? '_test.py'
|
|
234
|
+
: framework === 'junit'
|
|
235
|
+
? 'Test.java'
|
|
236
|
+
: '.test.ts';
|
|
237
|
+
const testDir = framework === technologyValue('technology-pytest-2b0121')
|
|
238
|
+
? 'tests'
|
|
239
|
+
: framework === 'junit'
|
|
240
|
+
? 'src/test'
|
|
241
|
+
: 'tests';
|
|
229
242
|
const testFilePath = join(projectPath, testDir, `${slug}${testExt}`);
|
|
230
243
|
const implFilePath = join(projectPath, 'src', `${slug}.${ext}`);
|
|
231
244
|
const testContent = buildTestContent(stubs, framework);
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { technologyValue } from '../technology-registry.js';
|
|
1
2
|
// engine/teammate-router/green-phase-verifier.ts — SPEC-750
|
|
2
3
|
// Verifies green phase: tests pass AND none of the red tests were deleted.
|
|
3
4
|
import { execFile as execFileCb } from 'node:child_process';
|
|
@@ -24,7 +25,7 @@ export async function verifyGreenPhase(redHandoff, projectRoot) {
|
|
|
24
25
|
// Step 2: Run the tests and expect them to pass now
|
|
25
26
|
try {
|
|
26
27
|
const testArgs = ['--pool=forks', ...redHandoff.testFiles];
|
|
27
|
-
await execFile('npx', ['vitest', 'run', ...testArgs], {
|
|
28
|
+
await execFile('npx', [technologyValue('technology-vitest-a9127f'), 'run', ...testArgs], {
|
|
28
29
|
cwd: projectRoot,
|
|
29
30
|
timeout: 120_000,
|
|
30
31
|
});
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { technologyValue } from '../technology-registry.js';
|
|
1
2
|
// engine/teammate-router/red-phase-verifier.ts — SPEC-750
|
|
2
3
|
// Runs the test suite and confirms that all expected tests are failing (RED phase).
|
|
3
4
|
import { execFile as execFileCb } from 'node:child_process';
|
|
@@ -12,7 +13,7 @@ export async function verifyRedPhase(handoff, projectRoot) {
|
|
|
12
13
|
try {
|
|
13
14
|
// Run just the test files from the handoff
|
|
14
15
|
const testArgs = ['--pool=forks', ...handoff.testFiles];
|
|
15
|
-
await execFile('npx', ['vitest', 'run', ...testArgs], {
|
|
16
|
+
await execFile('npx', [technologyValue('technology-vitest-a9127f'), 'run', ...testArgs], {
|
|
16
17
|
cwd: projectRoot,
|
|
17
18
|
timeout: 120_000,
|
|
18
19
|
});
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { TechnologyRegistry } from '../types/technology-registry.js';
|
|
2
|
+
import type { TechnologySymbolMap } from '../types/technology-symbols.generated.js';
|
|
3
|
+
export declare function parseTechnologyRegistry(input: {
|
|
4
|
+
authority: unknown;
|
|
5
|
+
frameworkCatalog: unknown;
|
|
6
|
+
detectionCatalog: unknown;
|
|
7
|
+
}): TechnologyRegistry;
|
|
8
|
+
export declare function technologyValue<K extends keyof TechnologySymbolMap>(symbol: K): TechnologySymbolMap[K];
|
|
9
|
+
export declare function loadTechnologyRegistry(directory?: string): TechnologyRegistry;
|
|
10
|
+
export declare function resetTechnologyRegistryCache(): void;
|
|
11
|
+
//# sourceMappingURL=technology-registry.d.ts.map
|