opencode-telos 1.0.0
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/README.md +927 -0
- package/dist/code-intelligence/analyzer.d.ts +9 -0
- package/dist/code-intelligence/analyzer.d.ts.map +1 -0
- package/dist/code-intelligence/analyzer.js +321 -0
- package/dist/code-intelligence/analyzer.js.map +1 -0
- package/dist/code-intelligence/ast/cache.d.ts +16 -0
- package/dist/code-intelligence/ast/cache.d.ts.map +1 -0
- package/dist/code-intelligence/ast/cache.js +44 -0
- package/dist/code-intelligence/ast/cache.js.map +1 -0
- package/dist/code-intelligence/ast/common.d.ts +8 -0
- package/dist/code-intelligence/ast/common.d.ts.map +1 -0
- package/dist/code-intelligence/ast/common.js +42 -0
- package/dist/code-intelligence/ast/common.js.map +1 -0
- package/dist/code-intelligence/ast/component.d.ts +10 -0
- package/dist/code-intelligence/ast/component.d.ts.map +1 -0
- package/dist/code-intelligence/ast/component.js +38 -0
- package/dist/code-intelligence/ast/component.js.map +1 -0
- package/dist/code-intelligence/ast/fallback.d.ts +9 -0
- package/dist/code-intelligence/ast/fallback.d.ts.map +1 -0
- package/dist/code-intelligence/ast/fallback.js +38 -0
- package/dist/code-intelligence/ast/fallback.js.map +1 -0
- package/dist/code-intelligence/ast/index.d.ts +5 -0
- package/dist/code-intelligence/ast/index.d.ts.map +1 -0
- package/dist/code-intelligence/ast/index.js +5 -0
- package/dist/code-intelligence/ast/index.js.map +1 -0
- package/dist/code-intelligence/ast/ir.d.ts +72 -0
- package/dist/code-intelligence/ast/ir.d.ts.map +1 -0
- package/dist/code-intelligence/ast/ir.js +2 -0
- package/dist/code-intelligence/ast/ir.js.map +1 -0
- package/dist/code-intelligence/ast/metrics.d.ts +25 -0
- package/dist/code-intelligence/ast/metrics.d.ts.map +1 -0
- package/dist/code-intelligence/ast/metrics.js +38 -0
- package/dist/code-intelligence/ast/metrics.js.map +1 -0
- package/dist/code-intelligence/ast/registry.d.ts +5 -0
- package/dist/code-intelligence/ast/registry.d.ts.map +1 -0
- package/dist/code-intelligence/ast/registry.js +22 -0
- package/dist/code-intelligence/ast/registry.js.map +1 -0
- package/dist/code-intelligence/ast/tree-sitter.d.ts +8 -0
- package/dist/code-intelligence/ast/tree-sitter.d.ts.map +1 -0
- package/dist/code-intelligence/ast/tree-sitter.js +247 -0
- package/dist/code-intelligence/ast/tree-sitter.js.map +1 -0
- package/dist/code-intelligence/ast/typescript.d.ts +8 -0
- package/dist/code-intelligence/ast/typescript.d.ts.map +1 -0
- package/dist/code-intelligence/ast/typescript.js +147 -0
- package/dist/code-intelligence/ast/typescript.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp/server.d.ts +27 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +67 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/opencode/hooks.d.ts +9 -0
- package/dist/opencode/hooks.d.ts.map +1 -0
- package/dist/opencode/hooks.js +583 -0
- package/dist/opencode/hooks.js.map +1 -0
- package/dist/opencode/router/categories.d.ts +31 -0
- package/dist/opencode/router/categories.d.ts.map +1 -0
- package/dist/opencode/router/categories.js +165 -0
- package/dist/opencode/router/categories.js.map +1 -0
- package/dist/opencode/router/embeddings.d.ts +41 -0
- package/dist/opencode/router/embeddings.d.ts.map +1 -0
- package/dist/opencode/router/embeddings.js +136 -0
- package/dist/opencode/router/embeddings.js.map +1 -0
- package/dist/opencode/router/graph-state-snapshot.d.ts +35 -0
- package/dist/opencode/router/graph-state-snapshot.d.ts.map +1 -0
- package/dist/opencode/router/graph-state-snapshot.js +129 -0
- package/dist/opencode/router/graph-state-snapshot.js.map +1 -0
- package/dist/opencode/router/index.d.ts +21 -0
- package/dist/opencode/router/index.d.ts.map +1 -0
- package/dist/opencode/router/index.js +23 -0
- package/dist/opencode/router/index.js.map +1 -0
- package/dist/opencode/router/intent-classifier.d.ts +35 -0
- package/dist/opencode/router/intent-classifier.d.ts.map +1 -0
- package/dist/opencode/router/intent-classifier.js +108 -0
- package/dist/opencode/router/intent-classifier.js.map +1 -0
- package/dist/opencode/router/semantic-nudge.d.ts +42 -0
- package/dist/opencode/router/semantic-nudge.d.ts.map +1 -0
- package/dist/opencode/router/semantic-nudge.js +73 -0
- package/dist/opencode/router/semantic-nudge.js.map +1 -0
- package/dist/opencode/router/state-gate.d.ts +25 -0
- package/dist/opencode/router/state-gate.d.ts.map +1 -0
- package/dist/opencode/router/state-gate.js +178 -0
- package/dist/opencode/router/state-gate.js.map +1 -0
- package/dist/opencode/router/tool-embeddings.d.ts +36 -0
- package/dist/opencode/router/tool-embeddings.d.ts.map +1 -0
- package/dist/opencode/router/tool-embeddings.js +140 -0
- package/dist/opencode/router/tool-embeddings.js.map +1 -0
- package/dist/opencode/router/tool-registry.d.ts +45 -0
- package/dist/opencode/router/tool-registry.d.ts.map +1 -0
- package/dist/opencode/router/tool-registry.js +103 -0
- package/dist/opencode/router/tool-registry.js.map +1 -0
- package/dist/opencode/router/tool-taxonomy.d.ts +51 -0
- package/dist/opencode/router/tool-taxonomy.d.ts.map +1 -0
- package/dist/opencode/router/tool-taxonomy.js +250 -0
- package/dist/opencode/router/tool-taxonomy.js.map +1 -0
- package/dist/opencode/router/tools-composite.d.ts +21 -0
- package/dist/opencode/router/tools-composite.d.ts.map +1 -0
- package/dist/opencode/router/tools-composite.js +684 -0
- package/dist/opencode/router/tools-composite.js.map +1 -0
- package/dist/opencode/shell-hooks.d.ts +7 -0
- package/dist/opencode/shell-hooks.d.ts.map +1 -0
- package/dist/opencode/shell-hooks.js +96 -0
- package/dist/opencode/shell-hooks.js.map +1 -0
- package/dist/opencode/system-prompt.d.ts +10 -0
- package/dist/opencode/system-prompt.d.ts.map +1 -0
- package/dist/opencode/system-prompt.js +600 -0
- package/dist/opencode/system-prompt.js.map +1 -0
- package/dist/opencode/tools.d.ts +8 -0
- package/dist/opencode/tools.d.ts.map +1 -0
- package/dist/opencode/tools.js +3731 -0
- package/dist/opencode/tools.js.map +1 -0
- package/dist/opencode/workflows/chains.d.ts +52 -0
- package/dist/opencode/workflows/chains.d.ts.map +1 -0
- package/dist/opencode/workflows/chains.js +170 -0
- package/dist/opencode/workflows/chains.js.map +1 -0
- package/dist/opencode/workflows/executor.d.ts +52 -0
- package/dist/opencode/workflows/executor.d.ts.map +1 -0
- package/dist/opencode/workflows/executor.js +130 -0
- package/dist/opencode/workflows/executor.js.map +1 -0
- package/dist/opencode/workflows/index.d.ts +14 -0
- package/dist/opencode/workflows/index.d.ts.map +1 -0
- package/dist/opencode/workflows/index.js +15 -0
- package/dist/opencode/workflows/index.js.map +1 -0
- package/dist/opencode/workflows/tools-workflow.d.ts +24 -0
- package/dist/opencode/workflows/tools-workflow.d.ts.map +1 -0
- package/dist/opencode/workflows/tools-workflow.js +85 -0
- package/dist/opencode/workflows/tools-workflow.js.map +1 -0
- package/dist/opencode/workflows/types.d.ts +32 -0
- package/dist/opencode/workflows/types.d.ts.map +1 -0
- package/dist/opencode/workflows/types.js +13 -0
- package/dist/opencode/workflows/types.js.map +1 -0
- package/dist/sdd/analysis/compliance.d.ts +30 -0
- package/dist/sdd/analysis/compliance.d.ts.map +1 -0
- package/dist/sdd/analysis/compliance.js +251 -0
- package/dist/sdd/analysis/compliance.js.map +1 -0
- package/dist/sdd/analysis/scalability.d.ts +15 -0
- package/dist/sdd/analysis/scalability.d.ts.map +1 -0
- package/dist/sdd/analysis/scalability.js +72 -0
- package/dist/sdd/analysis/scalability.js.map +1 -0
- package/dist/sdd/analysis/security.d.ts +25 -0
- package/dist/sdd/analysis/security.d.ts.map +1 -0
- package/dist/sdd/analysis/security.js +94 -0
- package/dist/sdd/analysis/security.js.map +1 -0
- package/dist/sdd/brownfield/scanner.d.ts +31 -0
- package/dist/sdd/brownfield/scanner.d.ts.map +1 -0
- package/dist/sdd/brownfield/scanner.js +228 -0
- package/dist/sdd/brownfield/scanner.js.map +1 -0
- package/dist/sdd/cache/manager.d.ts +237 -0
- package/dist/sdd/cache/manager.d.ts.map +1 -0
- package/dist/sdd/cache/manager.js +770 -0
- package/dist/sdd/cache/manager.js.map +1 -0
- package/dist/sdd/cache/snapshot-store.d.ts +39 -0
- package/dist/sdd/cache/snapshot-store.d.ts.map +1 -0
- package/dist/sdd/cache/snapshot-store.js +156 -0
- package/dist/sdd/cache/snapshot-store.js.map +1 -0
- package/dist/sdd/changes/manager.d.ts +58 -0
- package/dist/sdd/changes/manager.d.ts.map +1 -0
- package/dist/sdd/changes/manager.js +235 -0
- package/dist/sdd/changes/manager.js.map +1 -0
- package/dist/sdd/cicd/generators.d.ts +16 -0
- package/dist/sdd/cicd/generators.d.ts.map +1 -0
- package/dist/sdd/cicd/generators.js +1042 -0
- package/dist/sdd/cicd/generators.js.map +1 -0
- package/dist/sdd/code-quality/complexity.d.ts +38 -0
- package/dist/sdd/code-quality/complexity.d.ts.map +1 -0
- package/dist/sdd/code-quality/complexity.js +161 -0
- package/dist/sdd/code-quality/complexity.js.map +1 -0
- package/dist/sdd/code-quality/conventions.d.ts +33 -0
- package/dist/sdd/code-quality/conventions.d.ts.map +1 -0
- package/dist/sdd/code-quality/conventions.js +193 -0
- package/dist/sdd/code-quality/conventions.js.map +1 -0
- package/dist/sdd/code-quality/dependencies.d.ts +27 -0
- package/dist/sdd/code-quality/dependencies.d.ts.map +1 -0
- package/dist/sdd/code-quality/dependencies.js +142 -0
- package/dist/sdd/code-quality/dependencies.js.map +1 -0
- package/dist/sdd/code-quality/import-analyzer.d.ts +49 -0
- package/dist/sdd/code-quality/import-analyzer.d.ts.map +1 -0
- package/dist/sdd/code-quality/import-analyzer.js +213 -0
- package/dist/sdd/code-quality/import-analyzer.js.map +1 -0
- package/dist/sdd/code-quality/metrics.d.ts +35 -0
- package/dist/sdd/code-quality/metrics.d.ts.map +1 -0
- package/dist/sdd/code-quality/metrics.js +172 -0
- package/dist/sdd/code-quality/metrics.js.map +1 -0
- package/dist/sdd/code-quality/smells.d.ts +38 -0
- package/dist/sdd/code-quality/smells.d.ts.map +1 -0
- package/dist/sdd/code-quality/smells.js +319 -0
- package/dist/sdd/code-quality/smells.js.map +1 -0
- package/dist/sdd/code-quality/symbol-parser.d.ts +28 -0
- package/dist/sdd/code-quality/symbol-parser.d.ts.map +1 -0
- package/dist/sdd/code-quality/symbol-parser.js +230 -0
- package/dist/sdd/code-quality/symbol-parser.js.map +1 -0
- package/dist/sdd/code-quality/usage-tracker.d.ts +59 -0
- package/dist/sdd/code-quality/usage-tracker.d.ts.map +1 -0
- package/dist/sdd/code-quality/usage-tracker.js +402 -0
- package/dist/sdd/code-quality/usage-tracker.js.map +1 -0
- package/dist/sdd/code-quality/utils.d.ts +6 -0
- package/dist/sdd/code-quality/utils.d.ts.map +1 -0
- package/dist/sdd/code-quality/utils.js +14 -0
- package/dist/sdd/code-quality/utils.js.map +1 -0
- package/dist/sdd/codegen/generator.d.ts +42 -0
- package/dist/sdd/codegen/generator.d.ts.map +1 -0
- package/dist/sdd/codegen/generator.js +1023 -0
- package/dist/sdd/codegen/generator.js.map +1 -0
- package/dist/sdd/constitution/validator.d.ts +37 -0
- package/dist/sdd/constitution/validator.d.ts.map +1 -0
- package/dist/sdd/constitution/validator.js +192 -0
- package/dist/sdd/constitution/validator.js.map +1 -0
- package/dist/sdd/cost/estimator.d.ts +31 -0
- package/dist/sdd/cost/estimator.d.ts.map +1 -0
- package/dist/sdd/cost/estimator.js +92 -0
- package/dist/sdd/cost/estimator.js.map +1 -0
- package/dist/sdd/coverage/tracker.d.ts +47 -0
- package/dist/sdd/coverage/tracker.d.ts.map +1 -0
- package/dist/sdd/coverage/tracker.js +251 -0
- package/dist/sdd/coverage/tracker.js.map +1 -0
- package/dist/sdd/disaster/recovery.d.ts +11 -0
- package/dist/sdd/disaster/recovery.d.ts.map +1 -0
- package/dist/sdd/disaster/recovery.js +55 -0
- package/dist/sdd/disaster/recovery.js.map +1 -0
- package/dist/sdd/discovery/adaptive.d.ts +14 -0
- package/dist/sdd/discovery/adaptive.d.ts.map +1 -0
- package/dist/sdd/discovery/adaptive.js +145 -0
- package/dist/sdd/discovery/adaptive.js.map +1 -0
- package/dist/sdd/discovery/briefing-analyzer.d.ts +66 -0
- package/dist/sdd/discovery/briefing-analyzer.d.ts.map +1 -0
- package/dist/sdd/discovery/briefing-analyzer.js +672 -0
- package/dist/sdd/discovery/briefing-analyzer.js.map +1 -0
- package/dist/sdd/discovery/briefing.d.ts +109 -0
- package/dist/sdd/discovery/briefing.d.ts.map +1 -0
- package/dist/sdd/discovery/briefing.js +617 -0
- package/dist/sdd/discovery/briefing.js.map +1 -0
- package/dist/sdd/discovery/graph-builder.d.ts +10 -0
- package/dist/sdd/discovery/graph-builder.d.ts.map +1 -0
- package/dist/sdd/discovery/graph-builder.js +510 -0
- package/dist/sdd/discovery/graph-builder.js.map +1 -0
- package/dist/sdd/documentation/generator.d.ts +7 -0
- package/dist/sdd/documentation/generator.d.ts.map +1 -0
- package/dist/sdd/documentation/generator.js +119 -0
- package/dist/sdd/documentation/generator.js.map +1 -0
- package/dist/sdd/domain/types.d.ts +460 -0
- package/dist/sdd/domain/types.d.ts.map +1 -0
- package/dist/sdd/domain/types.js +25 -0
- package/dist/sdd/domain/types.js.map +1 -0
- package/dist/sdd/drift/detector.d.ts +28 -0
- package/dist/sdd/drift/detector.d.ts.map +1 -0
- package/dist/sdd/drift/detector.js +379 -0
- package/dist/sdd/drift/detector.js.map +1 -0
- package/dist/sdd/drift/exclusion.d.ts +54 -0
- package/dist/sdd/drift/exclusion.d.ts.map +1 -0
- package/dist/sdd/drift/exclusion.js +179 -0
- package/dist/sdd/drift/exclusion.js.map +1 -0
- package/dist/sdd/drift/signals.d.ts +52 -0
- package/dist/sdd/drift/signals.d.ts.map +1 -0
- package/dist/sdd/drift/signals.js +470 -0
- package/dist/sdd/drift/signals.js.map +1 -0
- package/dist/sdd/enforcement/interceptor.d.ts +47 -0
- package/dist/sdd/enforcement/interceptor.d.ts.map +1 -0
- package/dist/sdd/enforcement/interceptor.js +365 -0
- package/dist/sdd/enforcement/interceptor.js.map +1 -0
- package/dist/sdd/enforcement/workflow-tracker.d.ts +66 -0
- package/dist/sdd/enforcement/workflow-tracker.d.ts.map +1 -0
- package/dist/sdd/enforcement/workflow-tracker.js +229 -0
- package/dist/sdd/enforcement/workflow-tracker.js.map +1 -0
- package/dist/sdd/graph/engine.d.ts +44 -0
- package/dist/sdd/graph/engine.d.ts.map +1 -0
- package/dist/sdd/graph/engine.js +203 -0
- package/dist/sdd/graph/engine.js.map +1 -0
- package/dist/sdd/graph/index.d.ts +160 -0
- package/dist/sdd/graph/index.d.ts.map +1 -0
- package/dist/sdd/graph/index.js +624 -0
- package/dist/sdd/graph/index.js.map +1 -0
- package/dist/sdd/graph/integrity-guard.d.ts +129 -0
- package/dist/sdd/graph/integrity-guard.d.ts.map +1 -0
- package/dist/sdd/graph/integrity-guard.js +263 -0
- package/dist/sdd/graph/integrity-guard.js.map +1 -0
- package/dist/sdd/graph/integrity.d.ts +79 -0
- package/dist/sdd/graph/integrity.d.ts.map +1 -0
- package/dist/sdd/graph/integrity.js +462 -0
- package/dist/sdd/graph/integrity.js.map +1 -0
- package/dist/sdd/graph/pruner.d.ts +27 -0
- package/dist/sdd/graph/pruner.d.ts.map +1 -0
- package/dist/sdd/graph/pruner.js +203 -0
- package/dist/sdd/graph/pruner.js.map +1 -0
- package/dist/sdd/graph/traverse.d.ts +43 -0
- package/dist/sdd/graph/traverse.d.ts.map +1 -0
- package/dist/sdd/graph/traverse.js +265 -0
- package/dist/sdd/graph/traverse.js.map +1 -0
- package/dist/sdd/incidents/manager.d.ts +10 -0
- package/dist/sdd/incidents/manager.d.ts.map +1 -0
- package/dist/sdd/incidents/manager.js +63 -0
- package/dist/sdd/incidents/manager.js.map +1 -0
- package/dist/sdd/knowledge/transfer.d.ts +24 -0
- package/dist/sdd/knowledge/transfer.d.ts.map +1 -0
- package/dist/sdd/knowledge/transfer.js +94 -0
- package/dist/sdd/knowledge/transfer.js.map +1 -0
- package/dist/sdd/migrations/fixes.d.ts +2 -0
- package/dist/sdd/migrations/fixes.d.ts.map +1 -0
- package/dist/sdd/migrations/fixes.js +159 -0
- package/dist/sdd/migrations/fixes.js.map +1 -0
- package/dist/sdd/migrations/index.d.ts +2 -0
- package/dist/sdd/migrations/index.d.ts.map +1 -0
- package/dist/sdd/migrations/index.js +5 -0
- package/dist/sdd/migrations/index.js.map +1 -0
- package/dist/sdd/migrations/migration-runner.d.ts +41 -0
- package/dist/sdd/migrations/migration-runner.d.ts.map +1 -0
- package/dist/sdd/migrations/migration-runner.js +91 -0
- package/dist/sdd/migrations/migration-runner.js.map +1 -0
- package/dist/sdd/monitoring/setup.d.ts +40 -0
- package/dist/sdd/monitoring/setup.d.ts.map +1 -0
- package/dist/sdd/monitoring/setup.js +177 -0
- package/dist/sdd/monitoring/setup.js.map +1 -0
- package/dist/sdd/monitoring/telemetry.d.ts +18 -0
- package/dist/sdd/monitoring/telemetry.d.ts.map +1 -0
- package/dist/sdd/monitoring/telemetry.js +37 -0
- package/dist/sdd/monitoring/telemetry.js.map +1 -0
- package/dist/sdd/patterns/anti-patterns.d.ts +21 -0
- package/dist/sdd/patterns/anti-patterns.d.ts.map +1 -0
- package/dist/sdd/patterns/anti-patterns.js +286 -0
- package/dist/sdd/patterns/anti-patterns.js.map +1 -0
- package/dist/sdd/patterns/ast-clones.d.ts +23 -0
- package/dist/sdd/patterns/ast-clones.d.ts.map +1 -0
- package/dist/sdd/patterns/ast-clones.js +171 -0
- package/dist/sdd/patterns/ast-clones.js.map +1 -0
- package/dist/sdd/patterns/config-drift.d.ts +16 -0
- package/dist/sdd/patterns/config-drift.d.ts.map +1 -0
- package/dist/sdd/patterns/config-drift.js +322 -0
- package/dist/sdd/patterns/config-drift.js.map +1 -0
- package/dist/sdd/patterns/contradictions.d.ts +38 -0
- package/dist/sdd/patterns/contradictions.d.ts.map +1 -0
- package/dist/sdd/patterns/contradictions.js +237 -0
- package/dist/sdd/patterns/contradictions.js.map +1 -0
- package/dist/sdd/patterns/learner.d.ts +49 -0
- package/dist/sdd/patterns/learner.d.ts.map +1 -0
- package/dist/sdd/patterns/learner.js +226 -0
- package/dist/sdd/patterns/learner.js.map +1 -0
- package/dist/sdd/permissions/access.d.ts +69 -0
- package/dist/sdd/permissions/access.d.ts.map +1 -0
- package/dist/sdd/permissions/access.js +333 -0
- package/dist/sdd/permissions/access.js.map +1 -0
- package/dist/sdd/persistence/repository.d.ts +60 -0
- package/dist/sdd/persistence/repository.d.ts.map +1 -0
- package/dist/sdd/persistence/repository.js +96 -0
- package/dist/sdd/persistence/repository.js.map +1 -0
- package/dist/sdd/persistence/sqlite.d.ts +122 -0
- package/dist/sdd/persistence/sqlite.d.ts.map +1 -0
- package/dist/sdd/persistence/sqlite.js +602 -0
- package/dist/sdd/persistence/sqlite.js.map +1 -0
- package/dist/sdd/persistence/yaml.d.ts +41 -0
- package/dist/sdd/persistence/yaml.d.ts.map +1 -0
- package/dist/sdd/persistence/yaml.js +382 -0
- package/dist/sdd/persistence/yaml.js.map +1 -0
- package/dist/sdd/promises/classifier.d.ts +48 -0
- package/dist/sdd/promises/classifier.d.ts.map +1 -0
- package/dist/sdd/promises/classifier.js +215 -0
- package/dist/sdd/promises/classifier.js.map +1 -0
- package/dist/sdd/promises/tracker.d.ts +20 -0
- package/dist/sdd/promises/tracker.d.ts.map +1 -0
- package/dist/sdd/promises/tracker.js +204 -0
- package/dist/sdd/promises/tracker.js.map +1 -0
- package/dist/sdd/quality/scorer.d.ts +44 -0
- package/dist/sdd/quality/scorer.d.ts.map +1 -0
- package/dist/sdd/quality/scorer.js +216 -0
- package/dist/sdd/quality/scorer.js.map +1 -0
- package/dist/sdd/rollback/manager.d.ts +45 -0
- package/dist/sdd/rollback/manager.d.ts.map +1 -0
- package/dist/sdd/rollback/manager.js +266 -0
- package/dist/sdd/rollback/manager.js.map +1 -0
- package/dist/sdd/session/handoff.d.ts +52 -0
- package/dist/sdd/session/handoff.d.ts.map +1 -0
- package/dist/sdd/session/handoff.js +264 -0
- package/dist/sdd/session/handoff.js.map +1 -0
- package/dist/sdd/sla/tracker.d.ts +11 -0
- package/dist/sdd/sla/tracker.d.ts.map +1 -0
- package/dist/sdd/sla/tracker.js +52 -0
- package/dist/sdd/sla/tracker.js.map +1 -0
- package/dist/sdd/sync/git-sync.d.ts +61 -0
- package/dist/sdd/sync/git-sync.d.ts.map +1 -0
- package/dist/sdd/sync/git-sync.js +297 -0
- package/dist/sdd/sync/git-sync.js.map +1 -0
- package/dist/sdd/toggle/state.d.ts +8 -0
- package/dist/sdd/toggle/state.d.ts.map +1 -0
- package/dist/sdd/toggle/state.js +32 -0
- package/dist/sdd/toggle/state.js.map +1 -0
- package/dist/sdd/transactions/manager.d.ts +12 -0
- package/dist/sdd/transactions/manager.d.ts.map +1 -0
- package/dist/sdd/transactions/manager.js +80 -0
- package/dist/sdd/transactions/manager.js.map +1 -0
- package/dist/sdd/validation/coverage-index.d.ts +117 -0
- package/dist/sdd/validation/coverage-index.d.ts.map +1 -0
- package/dist/sdd/validation/coverage-index.js +251 -0
- package/dist/sdd/validation/coverage-index.js.map +1 -0
- package/dist/sdd/validation/executable.d.ts +26 -0
- package/dist/sdd/validation/executable.d.ts.map +1 -0
- package/dist/sdd/validation/executable.js +122 -0
- package/dist/sdd/validation/executable.js.map +1 -0
- package/dist/sdd/validation/smart-validator.d.ts +53 -0
- package/dist/sdd/validation/smart-validator.d.ts.map +1 -0
- package/dist/sdd/validation/smart-validator.js +347 -0
- package/dist/sdd/validation/smart-validator.js.map +1 -0
- package/dist/sdd/validation/validator.d.ts +39 -0
- package/dist/sdd/validation/validator.d.ts.map +1 -0
- package/dist/sdd/validation/validator.js +512 -0
- package/dist/sdd/validation/validator.js.map +1 -0
- package/dist/sdd/workflow/exporter.d.ts +36 -0
- package/dist/sdd/workflow/exporter.d.ts.map +1 -0
- package/dist/sdd/workflow/exporter.js +112 -0
- package/dist/sdd/workflow/exporter.js.map +1 -0
- package/dist/sdd/workflows/ab-testing.d.ts +18 -0
- package/dist/sdd/workflows/ab-testing.d.ts.map +1 -0
- package/dist/sdd/workflows/ab-testing.js +67 -0
- package/dist/sdd/workflows/ab-testing.js.map +1 -0
- package/dist/sdd/workflows/bug-fix.d.ts +13 -0
- package/dist/sdd/workflows/bug-fix.d.ts.map +1 -0
- package/dist/sdd/workflows/bug-fix.js +65 -0
- package/dist/sdd/workflows/bug-fix.js.map +1 -0
- package/dist/sdd/workflows/data-migration.d.ts +14 -0
- package/dist/sdd/workflows/data-migration.d.ts.map +1 -0
- package/dist/sdd/workflows/data-migration.js +68 -0
- package/dist/sdd/workflows/data-migration.js.map +1 -0
- package/dist/sdd/workflows/deprecation.d.ts +15 -0
- package/dist/sdd/workflows/deprecation.d.ts.map +1 -0
- package/dist/sdd/workflows/deprecation.js +68 -0
- package/dist/sdd/workflows/deprecation.js.map +1 -0
- package/dist/sdd/workflows/feature-flags.d.ts +14 -0
- package/dist/sdd/workflows/feature-flags.d.ts.map +1 -0
- package/dist/sdd/workflows/feature-flags.js +73 -0
- package/dist/sdd/workflows/feature-flags.js.map +1 -0
- package/dist/sdd/workflows/hotfix.d.ts +13 -0
- package/dist/sdd/workflows/hotfix.d.ts.map +1 -0
- package/dist/sdd/workflows/hotfix.js +67 -0
- package/dist/sdd/workflows/hotfix.js.map +1 -0
- package/dist/sdd/workflows/multi-tenancy.d.ts +13 -0
- package/dist/sdd/workflows/multi-tenancy.d.ts.map +1 -0
- package/dist/sdd/workflows/multi-tenancy.js +68 -0
- package/dist/sdd/workflows/multi-tenancy.js.map +1 -0
- package/dist/sdd/workflows/onboarding.d.ts +7 -0
- package/dist/sdd/workflows/onboarding.d.ts.map +1 -0
- package/dist/sdd/workflows/onboarding.js +43 -0
- package/dist/sdd/workflows/onboarding.js.map +1 -0
- package/dist/sdd/workflows/refactoring.d.ts +14 -0
- package/dist/sdd/workflows/refactoring.d.ts.map +1 -0
- package/dist/sdd/workflows/refactoring.js +73 -0
- package/dist/sdd/workflows/refactoring.js.map +1 -0
- package/dist/server/events.d.ts +64 -0
- package/dist/server/events.d.ts.map +1 -0
- package/dist/server/events.js +149 -0
- package/dist/server/events.js.map +1 -0
- package/dist/server/server.d.ts +33 -0
- package/dist/server/server.d.ts.map +1 -0
- package/dist/server/server.js +1019 -0
- package/dist/server/server.js.map +1 -0
- package/marketplace.json +39 -0
- package/package.json +65 -0
- package/src/code-intelligence/analyzer.ts +350 -0
- package/src/code-intelligence/ast/cache.ts +61 -0
- package/src/code-intelligence/ast/common.ts +62 -0
- package/src/code-intelligence/ast/component.ts +39 -0
- package/src/code-intelligence/ast/fallback.ts +44 -0
- package/src/code-intelligence/ast/index.ts +4 -0
- package/src/code-intelligence/ast/ir.ts +91 -0
- package/src/code-intelligence/ast/metrics.ts +65 -0
- package/src/code-intelligence/ast/registry.ts +28 -0
- package/src/code-intelligence/ast/tree-sitter.ts +226 -0
- package/src/code-intelligence/ast/typescript.ts +140 -0
- package/src/index.ts +22 -0
- package/src/mcp/server.ts +77 -0
- package/src/opencode/hooks.ts +728 -0
- package/src/opencode/router/categories.ts +192 -0
- package/src/opencode/router/embeddings.ts +149 -0
- package/src/opencode/router/graph-state-snapshot.ts +163 -0
- package/src/opencode/router/index.ts +44 -0
- package/src/opencode/router/intent-classifier.ts +140 -0
- package/src/opencode/router/semantic-nudge.ts +89 -0
- package/src/opencode/router/state-gate.ts +192 -0
- package/src/opencode/router/tool-embeddings.ts +162 -0
- package/src/opencode/router/tool-registry.ts +135 -0
- package/src/opencode/router/tool-taxonomy.ts +284 -0
- package/src/opencode/router/tools-composite.ts +685 -0
- package/src/opencode/shell-hooks.ts +115 -0
- package/src/opencode/system-prompt.ts +617 -0
- package/src/opencode/tools.ts +4102 -0
- package/src/opencode/workflows/chains.ts +205 -0
- package/src/opencode/workflows/executor.ts +172 -0
- package/src/opencode/workflows/index.ts +21 -0
- package/src/opencode/workflows/tools-workflow.ts +91 -0
- package/src/opencode/workflows/types.ts +42 -0
- package/src/sdd/analysis/compliance.ts +279 -0
- package/src/sdd/analysis/scalability.ts +97 -0
- package/src/sdd/analysis/security.ts +135 -0
- package/src/sdd/brownfield/scanner.ts +276 -0
- package/src/sdd/cache/manager.ts +899 -0
- package/src/sdd/cache/snapshot-store.ts +185 -0
- package/src/sdd/changes/manager.ts +326 -0
- package/src/sdd/cicd/generators.ts +1095 -0
- package/src/sdd/code-quality/complexity.ts +235 -0
- package/src/sdd/code-quality/conventions.ts +220 -0
- package/src/sdd/code-quality/dependencies.ts +203 -0
- package/src/sdd/code-quality/import-analyzer.ts +294 -0
- package/src/sdd/code-quality/metrics.ts +232 -0
- package/src/sdd/code-quality/smells.ts +415 -0
- package/src/sdd/code-quality/symbol-parser.ts +335 -0
- package/src/sdd/code-quality/usage-tracker.ts +527 -0
- package/src/sdd/code-quality/utils.ts +13 -0
- package/src/sdd/codegen/generator.ts +1181 -0
- package/src/sdd/constitution/validator.ts +253 -0
- package/src/sdd/cost/estimator.ts +147 -0
- package/src/sdd/coverage/tracker.ts +342 -0
- package/src/sdd/disaster/recovery.ts +79 -0
- package/src/sdd/discovery/adaptive.ts +167 -0
- package/src/sdd/discovery/briefing-analyzer.ts +802 -0
- package/src/sdd/discovery/briefing.ts +770 -0
- package/src/sdd/discovery/graph-builder.ts +598 -0
- package/src/sdd/documentation/generator.ts +158 -0
- package/src/sdd/domain/types.ts +658 -0
- package/src/sdd/drift/detector.ts +465 -0
- package/src/sdd/drift/exclusion.ts +223 -0
- package/src/sdd/drift/signals.ts +577 -0
- package/src/sdd/enforcement/interceptor.ts +444 -0
- package/src/sdd/enforcement/workflow-tracker.ts +263 -0
- package/src/sdd/graph/engine.ts +277 -0
- package/src/sdd/graph/index.ts +700 -0
- package/src/sdd/graph/integrity-guard.ts +348 -0
- package/src/sdd/graph/integrity.ts +628 -0
- package/src/sdd/graph/pruner.ts +221 -0
- package/src/sdd/graph/traverse.ts +331 -0
- package/src/sdd/incidents/manager.ts +87 -0
- package/src/sdd/knowledge/transfer.ts +140 -0
- package/src/sdd/migrations/fixes.ts +154 -0
- package/src/sdd/migrations/index.ts +14 -0
- package/src/sdd/migrations/migration-runner.ts +118 -0
- package/src/sdd/monitoring/setup.ts +237 -0
- package/src/sdd/monitoring/telemetry.ts +44 -0
- package/src/sdd/patterns/anti-patterns.ts +333 -0
- package/src/sdd/patterns/ast-clones.ts +214 -0
- package/src/sdd/patterns/config-drift.ts +346 -0
- package/src/sdd/patterns/contradictions.ts +323 -0
- package/src/sdd/patterns/learner.ts +266 -0
- package/src/sdd/permissions/access.ts +478 -0
- package/src/sdd/persistence/repository.ts +166 -0
- package/src/sdd/persistence/sqlite.ts +703 -0
- package/src/sdd/persistence/yaml.ts +409 -0
- package/src/sdd/promises/classifier.ts +253 -0
- package/src/sdd/promises/tracker.ts +258 -0
- package/src/sdd/quality/scorer.ts +263 -0
- package/src/sdd/rollback/manager.ts +361 -0
- package/src/sdd/session/handoff.ts +354 -0
- package/src/sdd/sla/tracker.ts +68 -0
- package/src/sdd/sync/git-sync.ts +401 -0
- package/src/sdd/toggle/state.ts +38 -0
- package/src/sdd/transactions/manager.ts +93 -0
- package/src/sdd/validation/coverage-index.ts +339 -0
- package/src/sdd/validation/executable.ts +127 -0
- package/src/sdd/validation/smart-validator.ts +470 -0
- package/src/sdd/validation/validator.ts +641 -0
- package/src/sdd/workflow/exporter.ts +169 -0
- package/src/sdd/workflows/ab-testing.ts +90 -0
- package/src/sdd/workflows/bug-fix.ts +81 -0
- package/src/sdd/workflows/data-migration.ts +86 -0
- package/src/sdd/workflows/deprecation.ts +87 -0
- package/src/sdd/workflows/feature-flags.ts +91 -0
- package/src/sdd/workflows/hotfix.ts +83 -0
- package/src/sdd/workflows/multi-tenancy.ts +84 -0
- package/src/sdd/workflows/onboarding.ts +82 -0
- package/src/sdd/workflows/refactoring.ts +90 -0
- package/src/server/events.ts +184 -0
- package/src/server/server.ts +1088 -0
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
import { updateNode, getNodesByType } from "../graph/engine.js";
|
|
2
|
+
import { computeImpact } from "../graph/traverse.js";
|
|
3
|
+
import { createChange, classifyApprovalLevel } from "../changes/manager.js";
|
|
4
|
+
import { validateGraph } from "../validation/validator.js";
|
|
5
|
+
export function classifyChangeRequest(description) {
|
|
6
|
+
const lower = description.toLowerCase();
|
|
7
|
+
if (/adicionar|add|criar|create|nov[oa]/.test(lower)) {
|
|
8
|
+
return { type: "add_functionality", description };
|
|
9
|
+
}
|
|
10
|
+
if (/modificar|modify|alterar|change|atualizar|update|editar|edit/.test(lower)) {
|
|
11
|
+
return { type: "modify_functionality", description };
|
|
12
|
+
}
|
|
13
|
+
if (/deletar|delete|remover|remove|excluir|exclui/.test(lower)) {
|
|
14
|
+
return { type: "delete_functionality", description };
|
|
15
|
+
}
|
|
16
|
+
if (/corrigir|fix|bug|erro|error/.test(lower)) {
|
|
17
|
+
return { type: "bug_fix", description };
|
|
18
|
+
}
|
|
19
|
+
if (/refatorar|refactor|reorganizar|reorganize/.test(lower)) {
|
|
20
|
+
return { type: "refactor", description };
|
|
21
|
+
}
|
|
22
|
+
if (/migrar|migrate|trocar|replace|substituir|banco|database|auth|autenticação/.test(lower)) {
|
|
23
|
+
return { type: "architecture_change", description };
|
|
24
|
+
}
|
|
25
|
+
return { type: "modify_functionality", description };
|
|
26
|
+
}
|
|
27
|
+
export function enforceSddFirst(graph, request, options) {
|
|
28
|
+
const result = {
|
|
29
|
+
allowed: false,
|
|
30
|
+
reason: "",
|
|
31
|
+
validation_passed: false,
|
|
32
|
+
sdd_updated: false,
|
|
33
|
+
blocking_reasons: [],
|
|
34
|
+
};
|
|
35
|
+
// Step 1: Check if SDD is initialized
|
|
36
|
+
if (!graph.nodes.some((n) => n.type === "project")) {
|
|
37
|
+
result.reason = "SDD not initialized. Run sdd.initialize first.";
|
|
38
|
+
result.blocking_reasons = ["No project node in graph"];
|
|
39
|
+
return result;
|
|
40
|
+
}
|
|
41
|
+
// Step 2: Check if graph has enough specification
|
|
42
|
+
const entities = getNodesByType(graph, "entity");
|
|
43
|
+
const features = getNodesByType(graph, "feature");
|
|
44
|
+
if (entities.length === 0 && features.length === 0) {
|
|
45
|
+
result.reason = "SDD has no specification. Create features and entities before implementing.";
|
|
46
|
+
result.blocking_reasons = ["No entities or features defined"];
|
|
47
|
+
return result;
|
|
48
|
+
}
|
|
49
|
+
// Step 3: For delete/modify, check if target exists
|
|
50
|
+
if (request.type === "delete_functionality" || request.type === "modify_functionality") {
|
|
51
|
+
const found = graph.nodes.filter((n) => {
|
|
52
|
+
const nameMatch = request.description.toLowerCase().includes(n.name.toLowerCase());
|
|
53
|
+
const idMatch = request.description.toLowerCase().includes(n.id.toLowerCase());
|
|
54
|
+
return nameMatch || idMatch;
|
|
55
|
+
});
|
|
56
|
+
if (found.length === 0 && request.type === "delete_functionality") {
|
|
57
|
+
result.reason = `Cannot delete: no matching node found for "${request.description}". Specify the exact entity/feature name.`;
|
|
58
|
+
result.blocking_reasons = ["Target not found in SDD"];
|
|
59
|
+
return result;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Step 4: Classify approval level
|
|
63
|
+
const proposal = {
|
|
64
|
+
title: request.description,
|
|
65
|
+
reason: request.description,
|
|
66
|
+
affected_node_ids: request.affected_entities || [],
|
|
67
|
+
new_nodes: [],
|
|
68
|
+
modified_nodes: [],
|
|
69
|
+
removed_node_ids: [],
|
|
70
|
+
affected_files: request.affected_files || [],
|
|
71
|
+
affected_tests: [],
|
|
72
|
+
implementation_tasks: [],
|
|
73
|
+
};
|
|
74
|
+
let approvalLevel = options?.forceApprovalLevel || classifyApprovalLevel(proposal, graph);
|
|
75
|
+
// Step 4b: Upgrade approval for cross-layer changes
|
|
76
|
+
if (approvalLevel !== "BLOCKED" && !options?.forceApprovalLevel && request.affected_files && request.affected_files.length > 0) {
|
|
77
|
+
const crossLayerDetected = detectCrossLayerChange(request.affected_files, graph);
|
|
78
|
+
if (crossLayerDetected) {
|
|
79
|
+
if (approvalLevel === "AUTO")
|
|
80
|
+
approvalLevel = "REVIEW";
|
|
81
|
+
else if (approvalLevel === "REVIEW")
|
|
82
|
+
approvalLevel = "APPROVAL";
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
// Step 5: Architecture changes need explicit approval
|
|
86
|
+
if (request.type === "architecture_change" || approvalLevel === "BLOCKED") {
|
|
87
|
+
result.reason = `This change requires explicit approval. Level: ${approvalLevel}. Description: ${request.description}`;
|
|
88
|
+
result.blocking_reasons = [
|
|
89
|
+
`Approval level: ${approvalLevel}`,
|
|
90
|
+
"Architecture changes require human confirmation",
|
|
91
|
+
];
|
|
92
|
+
return result;
|
|
93
|
+
}
|
|
94
|
+
// Step 6: Create the change node
|
|
95
|
+
let changeNode;
|
|
96
|
+
try {
|
|
97
|
+
changeNode = createChange(graph, proposal);
|
|
98
|
+
result.change_id = changeNode.id;
|
|
99
|
+
}
|
|
100
|
+
catch (e) {
|
|
101
|
+
result.reason = `Failed to create change: ${e}`;
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
// Step 7: Validate SDD
|
|
105
|
+
if (options?.skipValidation) {
|
|
106
|
+
result.validation_passed = true; // Assume valid if skipped
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// Check validation cache
|
|
110
|
+
let validation;
|
|
111
|
+
const graphVersion = graph.metadata.updated_at;
|
|
112
|
+
const cachedValidation = options?.validationCache?.get(graphVersion);
|
|
113
|
+
const cacheMaxAge = 60000; // 1 minute
|
|
114
|
+
if (cachedValidation && (Date.now() - cachedValidation.timestamp) < cacheMaxAge) {
|
|
115
|
+
validation = cachedValidation;
|
|
116
|
+
}
|
|
117
|
+
else {
|
|
118
|
+
validation = validateGraph(graph);
|
|
119
|
+
if (options?.validationCache) {
|
|
120
|
+
options.validationCache.set(graphVersion, { ...validation, timestamp: Date.now() });
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
result.validation_passed = validation.valid;
|
|
124
|
+
if (!validation.valid) {
|
|
125
|
+
result.reason = `SDD validation failed with ${validation.errors.length} errors. Fix specification before implementing.`;
|
|
126
|
+
result.blocking_reasons = validation.errors.map((e) => `[${e.code}] ${e.message}`);
|
|
127
|
+
updateNode(graph, changeNode.id, { status: "BLOCKED" });
|
|
128
|
+
return result;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
// Step 7b: Test-before-merge check for APPROVAL-level changes
|
|
132
|
+
if (approvalLevel === "APPROVAL") {
|
|
133
|
+
const affectedReqs = request.affected_entities || [];
|
|
134
|
+
const hasTestCoverage = checkTestCoverageForAffected(graph, affectedReqs);
|
|
135
|
+
if (!hasTestCoverage && affectedReqs.length > 0) {
|
|
136
|
+
result.blocking_reasons = result.blocking_reasons || [];
|
|
137
|
+
result.blocking_reasons.push(`APPROVAL-level change affects ${affectedReqs.length} entity(ies) but none have test coverage. ` +
|
|
138
|
+
`Add test nodes and link them with 'tested_by' relationships before proceeding.`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Step 8: Compute impact
|
|
142
|
+
if (!options?.skipImpactAnalysis && request.affected_entities && request.affected_entities.length > 0) {
|
|
143
|
+
const impactNodes = new Set();
|
|
144
|
+
const maxDepth = options?.maxImpactDepth ?? 3;
|
|
145
|
+
for (const entityId of request.affected_entities) {
|
|
146
|
+
const impact = computeImpact(graph, entityId, maxDepth);
|
|
147
|
+
for (const n of impact.direct)
|
|
148
|
+
impactNodes.add(n.id);
|
|
149
|
+
for (const n of impact.indirect)
|
|
150
|
+
impactNodes.add(n.id);
|
|
151
|
+
}
|
|
152
|
+
result.impact_summary = `Impact: ${impactNodes.size} nodes affected`;
|
|
153
|
+
}
|
|
154
|
+
else if (options?.skipImpactAnalysis) {
|
|
155
|
+
result.impact_summary = "Impact analysis skipped";
|
|
156
|
+
}
|
|
157
|
+
// Step 9: All checks passed
|
|
158
|
+
result.allowed = true;
|
|
159
|
+
result.reason = `SDD-first workflow: Change ${changeNode.id} created and validated. Proceed with implementation.`;
|
|
160
|
+
result.sdd_updated = true;
|
|
161
|
+
updateNode(graph, changeNode.id, { status: "APPROVED" });
|
|
162
|
+
return result;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Detect if a change affects files across different architecture layers
|
|
166
|
+
* (e.g., frontend files + backend files).
|
|
167
|
+
*/
|
|
168
|
+
function detectCrossLayerChange(files, graph) {
|
|
169
|
+
let hasFrontend = false;
|
|
170
|
+
let hasBackend = false;
|
|
171
|
+
let hasDatabase = false;
|
|
172
|
+
for (const file of files) {
|
|
173
|
+
const path = file.toLowerCase();
|
|
174
|
+
if (path.includes("client") || path.includes("frontend") || path.includes("pages/") || path.includes("components/")) {
|
|
175
|
+
hasFrontend = true;
|
|
176
|
+
}
|
|
177
|
+
else if (path.includes("server") || path.includes("backend") || path.includes("routes/") || path.includes("controllers/") || path.includes("services/") || path.includes("repositories/")) {
|
|
178
|
+
hasBackend = true;
|
|
179
|
+
}
|
|
180
|
+
else if (path.includes("database") || path.includes("migrations/") || path.includes("schema")) {
|
|
181
|
+
hasDatabase = true;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Cross-layer if frontend+backend or frontend+database
|
|
185
|
+
return (hasFrontend && hasBackend) || (hasFrontend && hasDatabase) || (hasBackend && hasDatabase);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check if affected entities have test coverage.
|
|
189
|
+
* Returns true if at least one entity has a test linked via 'tested_by'.
|
|
190
|
+
*/
|
|
191
|
+
function checkTestCoverageForAffected(graph, affectedEntities) {
|
|
192
|
+
if (affectedEntities.length === 0)
|
|
193
|
+
return true;
|
|
194
|
+
for (const entityName of affectedEntities) {
|
|
195
|
+
// Find entity node by name or ID
|
|
196
|
+
const entity = graph.nodes.find((n) => (n.type === "entity" || n.type === "requirement" || n.type === "feature") &&
|
|
197
|
+
(n.id === entityName || n.name.toLowerCase() === entityName.toLowerCase()));
|
|
198
|
+
if (!entity)
|
|
199
|
+
continue;
|
|
200
|
+
// Check if this entity has any test linked
|
|
201
|
+
const hasTest = graph.relationships.some((r) => r.from === entity.id && r.type === "tested_by");
|
|
202
|
+
if (!hasTest)
|
|
203
|
+
return false;
|
|
204
|
+
}
|
|
205
|
+
return true;
|
|
206
|
+
}
|
|
207
|
+
export function buildEnforcementPrompt(request, result) {
|
|
208
|
+
const lines = [
|
|
209
|
+
"## SDD Enforcement Status\n",
|
|
210
|
+
`**Request Type:** ${request.type}`,
|
|
211
|
+
`**Description:** ${request.description}`,
|
|
212
|
+
`**Allowed:** ${result.allowed ? "YES" : "NO"}`,
|
|
213
|
+
`**Change ID:** ${result.change_id || "N/A"}`,
|
|
214
|
+
`**Validation:** ${result.validation_passed ? "PASSED" : "FAILED"}`,
|
|
215
|
+
`**SDD Updated:** ${result.sdd_updated ? "YES" : "NO"}`,
|
|
216
|
+
];
|
|
217
|
+
if (result.impact_summary) {
|
|
218
|
+
lines.push(`\n**Impact:** ${result.impact_summary}`);
|
|
219
|
+
}
|
|
220
|
+
if (result.blocking_reasons && result.blocking_reasons.length > 0) {
|
|
221
|
+
lines.push("\n### Blocking Reasons");
|
|
222
|
+
for (const reason of result.blocking_reasons) {
|
|
223
|
+
lines.push(`- ${reason}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
if (result.allowed) {
|
|
227
|
+
lines.push("\n### Next Steps");
|
|
228
|
+
lines.push("1. Update the SDD specification with the changes");
|
|
229
|
+
lines.push("2. Validate the updated SDD");
|
|
230
|
+
lines.push("3. Implement the code changes");
|
|
231
|
+
lines.push("4. Run tests");
|
|
232
|
+
lines.push("5. Verify implementation against SDD");
|
|
233
|
+
lines.push("6. Update the Knowledge Graph");
|
|
234
|
+
lines.push(`7. Complete change ${result.change_id}`);
|
|
235
|
+
}
|
|
236
|
+
else {
|
|
237
|
+
lines.push("\n### Action Required");
|
|
238
|
+
lines.push("The SDD must be updated before code changes can proceed.");
|
|
239
|
+
lines.push("Use the discovery process to gather missing information.");
|
|
240
|
+
}
|
|
241
|
+
return lines.join("\n");
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Smart batch enforcement: for AUTO-level changes, execute the full cycle
|
|
245
|
+
* (create change → validate → approve) in one call without user interaction.
|
|
246
|
+
*/
|
|
247
|
+
export function enforceSmartBatch(graph, request, affectedEntities = [], affectedFiles = [], options) {
|
|
248
|
+
// Share validation cache between enforceSddFirst and the post-check
|
|
249
|
+
// to avoid running validateGraph() twice
|
|
250
|
+
const sharedValidationCache = options?.validationCache ?? new Map();
|
|
251
|
+
const sharedOptions = { ...options, validationCache: sharedValidationCache };
|
|
252
|
+
const result = enforceSddFirst(graph, {
|
|
253
|
+
...request,
|
|
254
|
+
affected_entities: affectedEntities,
|
|
255
|
+
affected_files: affectedFiles,
|
|
256
|
+
}, sharedOptions);
|
|
257
|
+
// If the change was auto-approved, reuse the cached validation result
|
|
258
|
+
if (result.allowed && result.change_id) {
|
|
259
|
+
const graphVersion = graph.metadata.updated_at;
|
|
260
|
+
const cachedValidation = sharedValidationCache.get(graphVersion);
|
|
261
|
+
const validation = cachedValidation || validateGraph(graph);
|
|
262
|
+
if (validation.valid) {
|
|
263
|
+
return { ...result, auto_completed: true };
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
return {
|
|
267
|
+
...result,
|
|
268
|
+
auto_completed: false,
|
|
269
|
+
reason: `Change created but validation failed: ${validation.errors.length} error(s). Fix spec before implementing.`,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return { ...result, auto_completed: false };
|
|
274
|
+
}
|
|
275
|
+
export function getSddEnforcementRules() {
|
|
276
|
+
return `
|
|
277
|
+
## SDD-FIRST ENFORCEMENT RULES (MANDATORY)
|
|
278
|
+
|
|
279
|
+
You are operating under STRICT Spec-Driven Development enforcement.
|
|
280
|
+
|
|
281
|
+
### Rule 1: SDD is always first
|
|
282
|
+
Before ANY code modification:
|
|
283
|
+
- If SDD is not initialized: run sdd.initialize
|
|
284
|
+
- If specification is incomplete: run sdd.discover and complete it
|
|
285
|
+
- If specification exists: validate it with sdd.validate
|
|
286
|
+
|
|
287
|
+
### Rule 2: Every change must go through SDD
|
|
288
|
+
When the user requests ANY change:
|
|
289
|
+
1. Classify the change (add/modify/delete/bug_fix/refactor/architecture)
|
|
290
|
+
2. Create a Change node with sdd.create_change
|
|
291
|
+
3. Perform impact analysis with sdd.analyze_impact
|
|
292
|
+
4. Update the specification BEFORE writing code
|
|
293
|
+
5. Validate the updated specification
|
|
294
|
+
6. Only THEN implement the code
|
|
295
|
+
7. After implementation, validate again
|
|
296
|
+
8. Complete the change with sdd.complete_change
|
|
297
|
+
|
|
298
|
+
### Rule 3: Never skip SDD for "simple" changes
|
|
299
|
+
Even small changes must update the specification.
|
|
300
|
+
A "typo fix" in a field name is a specification change.
|
|
301
|
+
Renaming a variable that appears in the API is a specification change.
|
|
302
|
+
|
|
303
|
+
### Rule 4: Specification validation is mandatory
|
|
304
|
+
After EVERY specification update:
|
|
305
|
+
- Run sdd.validate
|
|
306
|
+
- If validation fails: fix the specification
|
|
307
|
+
- Only proceed to implementation after validation passes
|
|
308
|
+
|
|
309
|
+
### Rule 5: Code must match specification
|
|
310
|
+
After implementation:
|
|
311
|
+
- Run sdd.detect_drift
|
|
312
|
+
- If drift detected: reconcile specification and code
|
|
313
|
+
- The specification is always the source of truth
|
|
314
|
+
|
|
315
|
+
### Rule 6: Changes must be traceable
|
|
316
|
+
Every change must have:
|
|
317
|
+
- A Change node in the graph
|
|
318
|
+
- Affected nodes identified
|
|
319
|
+
- Impact analysis performed
|
|
320
|
+
- Validation before and after implementation
|
|
321
|
+
|
|
322
|
+
### Rule 7: Architecture changes need approval
|
|
323
|
+
Any change to:
|
|
324
|
+
- Database engine
|
|
325
|
+
- Authentication mechanism
|
|
326
|
+
- Multi-tenancy model
|
|
327
|
+
- API public contract
|
|
328
|
+
- Core business rules
|
|
329
|
+
Requires explicit user approval before implementation.
|
|
330
|
+
|
|
331
|
+
### Rule 8: Discovery is mandatory for new areas
|
|
332
|
+
When the user requests a new feature/area:
|
|
333
|
+
- Check if SDD has enough information
|
|
334
|
+
- If not: run sdd.discover
|
|
335
|
+
- Never assume implementation details
|
|
336
|
+
- Ask for missing information
|
|
337
|
+
- Update SDD before implementing
|
|
338
|
+
|
|
339
|
+
### Rule 9: Shell commands cannot bypass enforcement
|
|
340
|
+
Using shell commands to write source files is PROHIBITED without SDD approval:
|
|
341
|
+
- python3 heredocs (python3 - <<'EOF' ... open('file','w') ... EOF)
|
|
342
|
+
- python3 -c with open().write()
|
|
343
|
+
- node -e with fs.writeFileSync()
|
|
344
|
+
- Shell redirects (> file.ts, >> file.ts)
|
|
345
|
+
- cat >, tee, sed -i on source files
|
|
346
|
+
- ANY command that creates or modifies .ts, .tsx, .js, .py, .go, .rs files
|
|
347
|
+
|
|
348
|
+
All shell commands are monitored. The ONLY acceptable way to write code:
|
|
349
|
+
sdd.enforce → sdd.update_from_answers → sdd.approve_change → Write/Edit tools
|
|
350
|
+
|
|
351
|
+
### Enforcement Summary
|
|
352
|
+
The workflow is ALWAYS:
|
|
353
|
+
UNDERSTAND → MODEL → SPECIFY → ANALYZE IMPACT → APPROVE → PLAN → IMPLEMENT → TEST → VERIFY → SYNC
|
|
354
|
+
|
|
355
|
+
NEVER: IMPLEMENT → DOCUMENT
|
|
356
|
+
NEVER: Use shell commands to bypass SDD
|
|
357
|
+
|
|
358
|
+
### Shell Command Monitoring
|
|
359
|
+
All run_terminal_command calls are analyzed. Commands writing source files:
|
|
360
|
+
- BLOCKED if no SDD Change node covers the target files
|
|
361
|
+
- ALLOWED only after sdd.enforce → sdd.approve_change
|
|
362
|
+
- Logged in audit trail regardless of outcome
|
|
363
|
+
`;
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=interceptor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"interceptor.js","sourceRoot":"","sources":["../../../src/sdd/enforcement/interceptor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDD Workflow State Tracker (FEAT-087/FEAT-100)
|
|
3
|
+
*
|
|
4
|
+
* Tracks whether the current agent session is inside a valid SDD workflow.
|
|
5
|
+
* Graph mutation tools (add_node, update_node, etc.) are blocked unless
|
|
6
|
+
* the session has passed through sdd.enforce or an approved Change exists.
|
|
7
|
+
*
|
|
8
|
+
* Uses module-level state (not AsyncLocalStorage) because OpenCode tools
|
|
9
|
+
* execute synchronously within a single tool-call boundary.
|
|
10
|
+
*/
|
|
11
|
+
export interface WorkflowState {
|
|
12
|
+
/** Whether sdd.enforce has been called in this session */
|
|
13
|
+
enforced: boolean;
|
|
14
|
+
/** Change node ID created by sdd.enforce */
|
|
15
|
+
changeId: string | null;
|
|
16
|
+
/** Whether the current change has been approved */
|
|
17
|
+
approved: boolean;
|
|
18
|
+
/** Whether sdd.validate has passed since last enforce */
|
|
19
|
+
validated: boolean;
|
|
20
|
+
/** Timestamp of last enforce call */
|
|
21
|
+
enforcedAt: number;
|
|
22
|
+
/** Whether discovery is in progress (sdd.discover was called) */
|
|
23
|
+
discovering: boolean;
|
|
24
|
+
/** Whether the SDD spec has been updated since last enforce (add_node, update_node, update_from_answers) */
|
|
25
|
+
specUpdated: boolean;
|
|
26
|
+
}
|
|
27
|
+
/** Reset workflow state (called on session start or /sdd off) */
|
|
28
|
+
export declare function resetWorkflowState(): void;
|
|
29
|
+
/** Mark that sdd.enforce was called */
|
|
30
|
+
export declare function markEnforced(changeId: string): void;
|
|
31
|
+
/** Mark that the change was approved */
|
|
32
|
+
export declare function markApproved(): void;
|
|
33
|
+
/** Mark that sdd.validate passed */
|
|
34
|
+
export declare function markValidated(): void;
|
|
35
|
+
/** Mark that discovery is in progress */
|
|
36
|
+
export declare function markDiscovering(discovering: boolean): void;
|
|
37
|
+
/** Mark that the SDD spec has been updated (add_node, update_node, update_from_answers) */
|
|
38
|
+
export declare function markSpecUpdated(): void;
|
|
39
|
+
/** Mark that the change was completed (resets state) */
|
|
40
|
+
export declare function markCompleted(): void;
|
|
41
|
+
/** Check if workflow is in a valid state for graph mutations */
|
|
42
|
+
export declare function isWorkflowValid(): {
|
|
43
|
+
valid: boolean;
|
|
44
|
+
reason?: string;
|
|
45
|
+
};
|
|
46
|
+
/** Get current workflow state (read-only) */
|
|
47
|
+
export declare function getWorkflowState(): Readonly<WorkflowState>;
|
|
48
|
+
/**
|
|
49
|
+
* Tools that are ALLOWED without workflow context.
|
|
50
|
+
* These are read-only or workflow-entry tools.
|
|
51
|
+
*/
|
|
52
|
+
export declare const WORKFLOW_EXEMPT_TOOLS: Set<string>;
|
|
53
|
+
/**
|
|
54
|
+
* Tools that REQUIRE workflow context (graph mutations).
|
|
55
|
+
* These modify the SDD graph and must go through the workflow.
|
|
56
|
+
*/
|
|
57
|
+
export declare const WORKFLOW_REQUIRED_TOOLS: Set<string>;
|
|
58
|
+
/**
|
|
59
|
+
* Check if a tool requires workflow context.
|
|
60
|
+
* Returns null if the tool is allowed, or an error message if blocked.
|
|
61
|
+
*/
|
|
62
|
+
export declare function checkToolAccess(toolName: string): {
|
|
63
|
+
allowed: boolean;
|
|
64
|
+
reason?: string;
|
|
65
|
+
};
|
|
66
|
+
//# sourceMappingURL=workflow-tracker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-tracker.d.ts","sourceRoot":"","sources":["../../../src/sdd/enforcement/workflow-tracker.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,aAAa;IAC5B,0DAA0D;IAC1D,QAAQ,EAAE,OAAO,CAAA;IACjB,4CAA4C;IAC5C,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,mDAAmD;IACnD,QAAQ,EAAE,OAAO,CAAA;IACjB,yDAAyD;IACzD,SAAS,EAAE,OAAO,CAAA;IAClB,qCAAqC;IACrC,UAAU,EAAE,MAAM,CAAA;IAClB,iEAAiE;IACjE,WAAW,EAAE,OAAO,CAAA;IACpB,4GAA4G;IAC5G,WAAW,EAAE,OAAO,CAAA;CACrB;AAYD,iEAAiE;AACjE,wBAAgB,kBAAkB,IAAI,IAAI,CAQzC;AAED,uCAAuC;AACvC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAOnD;AAED,wCAAwC;AACxC,wBAAgB,YAAY,IAAI,IAAI,CAEnC;AAED,oCAAoC;AACpC,wBAAgB,aAAa,IAAI,IAAI,CAEpC;AAED,yCAAyC;AACzC,wBAAgB,eAAe,CAAC,WAAW,EAAE,OAAO,GAAG,IAAI,CAE1D;AAED,2FAA2F;AAC3F,wBAAgB,eAAe,IAAI,IAAI,CAEtC;AAED,wDAAwD;AACxD,wBAAgB,aAAa,IAAI,IAAI,CAOpC;AAED,gEAAgE;AAChE,wBAAgB,eAAe,IAAI;IAAE,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAkBrE;AAED,6CAA6C;AAC7C,wBAAgB,gBAAgB,IAAI,QAAQ,CAAC,aAAa,CAAC,CAE1D;AAED;;;GAGG;AACH,eAAO,MAAM,qBAAqB,aAkGhC,CAAA;AAEF;;;GAGG;AACH,eAAO,MAAM,uBAAuB,aAQlC,CAAA;AAEF;;;GAGG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAyBvF"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SDD Workflow State Tracker (FEAT-087/FEAT-100)
|
|
3
|
+
*
|
|
4
|
+
* Tracks whether the current agent session is inside a valid SDD workflow.
|
|
5
|
+
* Graph mutation tools (add_node, update_node, etc.) are blocked unless
|
|
6
|
+
* the session has passed through sdd.enforce or an approved Change exists.
|
|
7
|
+
*
|
|
8
|
+
* Uses module-level state (not AsyncLocalStorage) because OpenCode tools
|
|
9
|
+
* execute synchronously within a single tool-call boundary.
|
|
10
|
+
*/
|
|
11
|
+
const state = {
|
|
12
|
+
enforced: false,
|
|
13
|
+
changeId: null,
|
|
14
|
+
approved: false,
|
|
15
|
+
validated: false,
|
|
16
|
+
enforcedAt: 0,
|
|
17
|
+
discovering: false,
|
|
18
|
+
specUpdated: false,
|
|
19
|
+
};
|
|
20
|
+
/** Reset workflow state (called on session start or /sdd off) */
|
|
21
|
+
export function resetWorkflowState() {
|
|
22
|
+
state.enforced = false;
|
|
23
|
+
state.changeId = null;
|
|
24
|
+
state.approved = false;
|
|
25
|
+
state.validated = false;
|
|
26
|
+
state.enforcedAt = 0;
|
|
27
|
+
state.discovering = false;
|
|
28
|
+
state.specUpdated = false;
|
|
29
|
+
}
|
|
30
|
+
/** Mark that sdd.enforce was called */
|
|
31
|
+
export function markEnforced(changeId) {
|
|
32
|
+
state.enforced = true;
|
|
33
|
+
state.changeId = changeId;
|
|
34
|
+
state.approved = false;
|
|
35
|
+
state.validated = false;
|
|
36
|
+
state.enforcedAt = Date.now();
|
|
37
|
+
state.specUpdated = false;
|
|
38
|
+
}
|
|
39
|
+
/** Mark that the change was approved */
|
|
40
|
+
export function markApproved() {
|
|
41
|
+
state.approved = true;
|
|
42
|
+
}
|
|
43
|
+
/** Mark that sdd.validate passed */
|
|
44
|
+
export function markValidated() {
|
|
45
|
+
state.validated = true;
|
|
46
|
+
}
|
|
47
|
+
/** Mark that discovery is in progress */
|
|
48
|
+
export function markDiscovering(discovering) {
|
|
49
|
+
state.discovering = discovering;
|
|
50
|
+
}
|
|
51
|
+
/** Mark that the SDD spec has been updated (add_node, update_node, update_from_answers) */
|
|
52
|
+
export function markSpecUpdated() {
|
|
53
|
+
state.specUpdated = true;
|
|
54
|
+
}
|
|
55
|
+
/** Mark that the change was completed (resets state) */
|
|
56
|
+
export function markCompleted() {
|
|
57
|
+
state.enforced = false;
|
|
58
|
+
state.changeId = null;
|
|
59
|
+
state.approved = false;
|
|
60
|
+
state.validated = false;
|
|
61
|
+
state.enforcedAt = 0;
|
|
62
|
+
state.specUpdated = false;
|
|
63
|
+
}
|
|
64
|
+
/** Check if workflow is in a valid state for graph mutations */
|
|
65
|
+
export function isWorkflowValid() {
|
|
66
|
+
if (!state.enforced) {
|
|
67
|
+
return {
|
|
68
|
+
valid: false,
|
|
69
|
+
reason: "No SDD workflow active. Call sdd.enforce first to classify the change and create a Change node.",
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
// Allow a 30-minute window for workflow completion
|
|
73
|
+
const maxAge = 30 * 60 * 1000;
|
|
74
|
+
if (Date.now() - state.enforcedAt > maxAge) {
|
|
75
|
+
return {
|
|
76
|
+
valid: false,
|
|
77
|
+
reason: "SDD workflow expired (>30 min). Call sdd.enforce again.",
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
return { valid: true };
|
|
81
|
+
}
|
|
82
|
+
/** Get current workflow state (read-only) */
|
|
83
|
+
export function getWorkflowState() {
|
|
84
|
+
return { ...state };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Tools that are ALLOWED without workflow context.
|
|
88
|
+
* These are read-only or workflow-entry tools.
|
|
89
|
+
*/
|
|
90
|
+
export const WORKFLOW_EXEMPT_TOOLS = new Set([
|
|
91
|
+
"sdd.initialize",
|
|
92
|
+
"sdd.inspect",
|
|
93
|
+
"sdd.query_graph",
|
|
94
|
+
"sdd.list_nodes",
|
|
95
|
+
"sdd.count_nodes",
|
|
96
|
+
"sdd.get_nodes_by_status",
|
|
97
|
+
"sdd.get_context",
|
|
98
|
+
"sdd.find_path",
|
|
99
|
+
"sdd.analyze_impact",
|
|
100
|
+
"sdd.validate",
|
|
101
|
+
"sdd.detect_drift",
|
|
102
|
+
"sdd.config_drift",
|
|
103
|
+
"sdd.detect_sync_conflicts",
|
|
104
|
+
"sdd.quality",
|
|
105
|
+
"sdd.contradictions",
|
|
106
|
+
"sdd.verify_usage",
|
|
107
|
+
"sdd.find_dead_code",
|
|
108
|
+
"sdd.parse_symbols",
|
|
109
|
+
"sdd.analyze_complexity",
|
|
110
|
+
"sdd.code_metrics",
|
|
111
|
+
"sdd.detect_smells",
|
|
112
|
+
"sdd.analyze_dependencies",
|
|
113
|
+
"sdd.anti_patterns",
|
|
114
|
+
"sdd.clone_detection",
|
|
115
|
+
"sdd.promises",
|
|
116
|
+
"sdd.coverage",
|
|
117
|
+
"sdd.check_compliance",
|
|
118
|
+
"sdd.security_audit",
|
|
119
|
+
"sdd.analyze_scalability",
|
|
120
|
+
"sdd.traverse_outgoing",
|
|
121
|
+
"sdd.traverse_incoming",
|
|
122
|
+
"sdd.traverse_both",
|
|
123
|
+
"sdd.get_subgraph",
|
|
124
|
+
"sdd.pending_changes",
|
|
125
|
+
"sdd.list_snapshots",
|
|
126
|
+
"sdd.sync_status",
|
|
127
|
+
"sdd.remote_status",
|
|
128
|
+
"sdd.mcp_server_info",
|
|
129
|
+
"sdd.handle_mcp_tool",
|
|
130
|
+
// Workflow entry points (start the workflow)
|
|
131
|
+
"sdd.enforce",
|
|
132
|
+
"sdd.enforce_rules",
|
|
133
|
+
"sdd.discover",
|
|
134
|
+
"sdd.update_from_answers",
|
|
135
|
+
"sdd.create_change",
|
|
136
|
+
"sdd.approve_change",
|
|
137
|
+
"sdd.complete_change",
|
|
138
|
+
"sdd.verify_implementation",
|
|
139
|
+
// Enterprise workflows (they manage their own enforcement)
|
|
140
|
+
"sdd.bug_fix",
|
|
141
|
+
"sdd.hotfix",
|
|
142
|
+
"sdd.refactoring",
|
|
143
|
+
"sdd.deprecate",
|
|
144
|
+
"sdd.create_migration",
|
|
145
|
+
"sdd.create_experiment",
|
|
146
|
+
"sdd.create_flag",
|
|
147
|
+
"sdd.create_tenant",
|
|
148
|
+
"sdd.onboard_developer",
|
|
149
|
+
"sdd.report_incident",
|
|
150
|
+
"sdd.create_sla",
|
|
151
|
+
"sdd.estimate_cost",
|
|
152
|
+
"sdd.generate_docs",
|
|
153
|
+
"sdd.knowledge_transfer",
|
|
154
|
+
"sdd.disaster_recovery_plan",
|
|
155
|
+
"sdd.setup_monitoring",
|
|
156
|
+
"sdd.generate_dashboard",
|
|
157
|
+
// Toggle and config
|
|
158
|
+
"sdd.toggle",
|
|
159
|
+
"sdd.toggle_status",
|
|
160
|
+
"sdd.constitution",
|
|
161
|
+
// Session and export
|
|
162
|
+
"sdd.session_handoff",
|
|
163
|
+
"sdd.workflow_export",
|
|
164
|
+
// Permissions
|
|
165
|
+
"sdd.load_permissions_config",
|
|
166
|
+
"sdd.save_permissions_config",
|
|
167
|
+
"sdd.check_permission",
|
|
168
|
+
"sdd.check_change_approval",
|
|
169
|
+
"sdd.set_role",
|
|
170
|
+
"sdd.get_user_role",
|
|
171
|
+
"sdd.audit_log",
|
|
172
|
+
"sdd.detect_remote",
|
|
173
|
+
// Infrastructure
|
|
174
|
+
"sdd.install_hooks",
|
|
175
|
+
"sdd.brownfield_scan",
|
|
176
|
+
"sdd.start_dashboard",
|
|
177
|
+
"sdd.generate_cicd",
|
|
178
|
+
// Sync
|
|
179
|
+
"sdd.sync_pull",
|
|
180
|
+
"sdd.sync_push",
|
|
181
|
+
"sdd.merge_graphs",
|
|
182
|
+
// Rollback
|
|
183
|
+
"sdd.rollback",
|
|
184
|
+
"sdd.rollback_history",
|
|
185
|
+
"sdd.create_snapshot",
|
|
186
|
+
// Graph build
|
|
187
|
+
"sdd.build_graph",
|
|
188
|
+
]);
|
|
189
|
+
/**
|
|
190
|
+
* Tools that REQUIRE workflow context (graph mutations).
|
|
191
|
+
* These modify the SDD graph and must go through the workflow.
|
|
192
|
+
*/
|
|
193
|
+
export const WORKFLOW_REQUIRED_TOOLS = new Set([
|
|
194
|
+
"sdd.add_node",
|
|
195
|
+
"sdd.update_node",
|
|
196
|
+
"sdd.remove_node",
|
|
197
|
+
"sdd.add_relationship",
|
|
198
|
+
"sdd.remove_relationship",
|
|
199
|
+
"sdd.generate_code",
|
|
200
|
+
"sdd.remove_dead_code",
|
|
201
|
+
]);
|
|
202
|
+
/**
|
|
203
|
+
* Check if a tool requires workflow context.
|
|
204
|
+
* Returns null if the tool is allowed, or an error message if blocked.
|
|
205
|
+
*/
|
|
206
|
+
export function checkToolAccess(toolName) {
|
|
207
|
+
// SDD tools only
|
|
208
|
+
if (!toolName.startsWith("sdd.")) {
|
|
209
|
+
return { allowed: true };
|
|
210
|
+
}
|
|
211
|
+
// Exempt tools are always allowed
|
|
212
|
+
if (WORKFLOW_EXEMPT_TOOLS.has(toolName)) {
|
|
213
|
+
return { allowed: true };
|
|
214
|
+
}
|
|
215
|
+
// Required tools need workflow context
|
|
216
|
+
if (WORKFLOW_REQUIRED_TOOLS.has(toolName)) {
|
|
217
|
+
const workflow = isWorkflowValid();
|
|
218
|
+
if (!workflow.valid) {
|
|
219
|
+
return {
|
|
220
|
+
allowed: false,
|
|
221
|
+
reason: `[SDD BLOCKED] Tool "${toolName}" requires an active SDD workflow.\n\n${workflow.reason}\n\nWorkflow: sdd.enforce → sdd.update_from_answers → sdd.approve_change → THEN use ${toolName}`,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
return { allowed: true };
|
|
225
|
+
}
|
|
226
|
+
// Unknown SDD tools are allowed (future tools)
|
|
227
|
+
return { allowed: true };
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=workflow-tracker.js.map
|