@decibelsystems/tools 2.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/LICENSE +21 -0
- package/README.md +342 -0
- package/dist/agentic/compiler.d.ts +21 -0
- package/dist/agentic/compiler.d.ts.map +1 -0
- package/dist/agentic/compiler.js +267 -0
- package/dist/agentic/compiler.js.map +1 -0
- package/dist/agentic/golden.d.ts +25 -0
- package/dist/agentic/golden.d.ts.map +1 -0
- package/dist/agentic/golden.js +255 -0
- package/dist/agentic/golden.js.map +1 -0
- package/dist/agentic/index.d.ts +17 -0
- package/dist/agentic/index.d.ts.map +1 -0
- package/dist/agentic/index.js +153 -0
- package/dist/agentic/index.js.map +1 -0
- package/dist/agentic/linter.d.ts +20 -0
- package/dist/agentic/linter.d.ts.map +1 -0
- package/dist/agentic/linter.js +340 -0
- package/dist/agentic/linter.js.map +1 -0
- package/dist/agentic/renderer.d.ts +17 -0
- package/dist/agentic/renderer.d.ts.map +1 -0
- package/dist/agentic/renderer.js +277 -0
- package/dist/agentic/renderer.js.map +1 -0
- package/dist/agentic/types.d.ts +199 -0
- package/dist/agentic/types.d.ts.map +1 -0
- package/dist/agentic/types.js +8 -0
- package/dist/agentic/types.js.map +1 -0
- package/dist/architectAdrs.d.ts +32 -0
- package/dist/architectAdrs.d.ts.map +1 -0
- package/dist/architectAdrs.js +162 -0
- package/dist/architectAdrs.js.map +1 -0
- package/dist/client/facade-client.d.ts +41 -0
- package/dist/client/facade-client.d.ts.map +1 -0
- package/dist/client/facade-client.js +243 -0
- package/dist/client/facade-client.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +18 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/transports.d.ts +78 -0
- package/dist/client/transports.d.ts.map +1 -0
- package/dist/client/transports.js +258 -0
- package/dist/client/transports.js.map +1 -0
- package/dist/client/types.d.ts +49 -0
- package/dist/client/types.d.ts.map +1 -0
- package/dist/client/types.js +8 -0
- package/dist/client/types.js.map +1 -0
- package/dist/config.d.ts +8 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +19 -0
- package/dist/config.js.map +1 -0
- package/dist/daemon.d.ts +77 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +374 -0
- package/dist/daemon.js.map +1 -0
- package/dist/daemonConfig.d.ts +43 -0
- package/dist/daemonConfig.d.ts.map +1 -0
- package/dist/daemonConfig.js +113 -0
- package/dist/daemonConfig.js.map +1 -0
- package/dist/dataRoot.d.ts +5 -0
- package/dist/dataRoot.d.ts.map +1 -0
- package/dist/dataRoot.js +23 -0
- package/dist/dataRoot.js.map +1 -0
- package/dist/decibelPaths.d.ts +42 -0
- package/dist/decibelPaths.d.ts.map +1 -0
- package/dist/decibelPaths.js +150 -0
- package/dist/decibelPaths.js.map +1 -0
- package/dist/facades/definitions.d.ts +6 -0
- package/dist/facades/definitions.d.ts.map +1 -0
- package/dist/facades/definitions.js +450 -0
- package/dist/facades/definitions.js.map +1 -0
- package/dist/facades/index.d.ts +27 -0
- package/dist/facades/index.d.ts.map +1 -0
- package/dist/facades/index.js +124 -0
- package/dist/facades/index.js.map +1 -0
- package/dist/facades/types.d.ts +38 -0
- package/dist/facades/types.d.ts.map +1 -0
- package/dist/facades/types.js +8 -0
- package/dist/facades/types.js.map +1 -0
- package/dist/httpServer.d.ts +66 -0
- package/dist/httpServer.d.ts.map +1 -0
- package/dist/httpServer.js +1723 -0
- package/dist/httpServer.js.map +1 -0
- package/dist/kernel.d.ts +87 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +256 -0
- package/dist/kernel.js.map +1 -0
- package/dist/lib/agent-services/assumptions.d.ts +16 -0
- package/dist/lib/agent-services/assumptions.d.ts.map +1 -0
- package/dist/lib/agent-services/assumptions.js +284 -0
- package/dist/lib/agent-services/assumptions.js.map +1 -0
- package/dist/lib/agent-services/context-pack.d.ts +6 -0
- package/dist/lib/agent-services/context-pack.d.ts.map +1 -0
- package/dist/lib/agent-services/context-pack.js +354 -0
- package/dist/lib/agent-services/context-pack.js.map +1 -0
- package/dist/lib/agent-services/drift-guard.d.ts +14 -0
- package/dist/lib/agent-services/drift-guard.d.ts.map +1 -0
- package/dist/lib/agent-services/drift-guard.js +355 -0
- package/dist/lib/agent-services/drift-guard.js.map +1 -0
- package/dist/lib/agent-services/index.d.ts +5 -0
- package/dist/lib/agent-services/index.d.ts.map +1 -0
- package/dist/lib/agent-services/index.js +10 -0
- package/dist/lib/agent-services/index.js.map +1 -0
- package/dist/lib/benchmark.d.ts +110 -0
- package/dist/lib/benchmark.d.ts.map +1 -0
- package/dist/lib/benchmark.js +338 -0
- package/dist/lib/benchmark.js.map +1 -0
- package/dist/lib/supabase.d.ts +123 -0
- package/dist/lib/supabase.d.ts.map +1 -0
- package/dist/lib/supabase.js +91 -0
- package/dist/lib/supabase.js.map +1 -0
- package/dist/license.d.ts +30 -0
- package/dist/license.d.ts.map +1 -0
- package/dist/license.js +131 -0
- package/dist/license.js.map +1 -0
- package/dist/projectPaths.d.ts +27 -0
- package/dist/projectPaths.d.ts.map +1 -0
- package/dist/projectPaths.js +86 -0
- package/dist/projectPaths.js.map +1 -0
- package/dist/projectRegistry.d.ts +97 -0
- package/dist/projectRegistry.d.ts.map +1 -0
- package/dist/projectRegistry.js +374 -0
- package/dist/projectRegistry.js.map +1 -0
- package/dist/sentinelIssues.d.ts +65 -0
- package/dist/sentinelIssues.d.ts.map +1 -0
- package/dist/sentinelIssues.js +297 -0
- package/dist/sentinelIssues.js.map +1 -0
- package/dist/server.d.ts +3 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +195 -0
- package/dist/server.js.map +1 -0
- package/dist/test.d.ts +7 -0
- package/dist/test.d.ts.map +1 -0
- package/dist/test.js +77 -0
- package/dist/test.js.map +1 -0
- package/dist/tools/agentic/index.d.ts +7 -0
- package/dist/tools/agentic/index.d.ts.map +1 -0
- package/dist/tools/agentic/index.js +203 -0
- package/dist/tools/agentic/index.js.map +1 -0
- package/dist/tools/architect/index.d.ts +11 -0
- package/dist/tools/architect/index.d.ts.map +1 -0
- package/dist/tools/architect/index.js +506 -0
- package/dist/tools/architect/index.js.map +1 -0
- package/dist/tools/architect.d.ts +19 -0
- package/dist/tools/architect.d.ts.map +1 -0
- package/dist/tools/architect.js +88 -0
- package/dist/tools/architect.js.map +1 -0
- package/dist/tools/auditor/index.d.ts +10 -0
- package/dist/tools/auditor/index.d.ts.map +1 -0
- package/dist/tools/auditor/index.js +310 -0
- package/dist/tools/auditor/index.js.map +1 -0
- package/dist/tools/auditor.d.ts +149 -0
- package/dist/tools/auditor.d.ts.map +1 -0
- package/dist/tools/auditor.js +775 -0
- package/dist/tools/auditor.js.map +1 -0
- package/dist/tools/bench/index.d.ts +3 -0
- package/dist/tools/bench/index.d.ts.map +1 -0
- package/dist/tools/bench/index.js +220 -0
- package/dist/tools/bench/index.js.map +1 -0
- package/dist/tools/bench.d.ts +89 -0
- package/dist/tools/bench.d.ts.map +1 -0
- package/dist/tools/bench.js +826 -0
- package/dist/tools/bench.js.map +1 -0
- package/dist/tools/context/index.d.ts +11 -0
- package/dist/tools/context/index.d.ts.map +1 -0
- package/dist/tools/context/index.js +482 -0
- package/dist/tools/context/index.js.map +1 -0
- package/dist/tools/context.d.ts +146 -0
- package/dist/tools/context.d.ts.map +1 -0
- package/dist/tools/context.js +481 -0
- package/dist/tools/context.js.map +1 -0
- package/dist/tools/coordinator/coordinator.d.ts +168 -0
- package/dist/tools/coordinator/coordinator.d.ts.map +1 -0
- package/dist/tools/coordinator/coordinator.js +535 -0
- package/dist/tools/coordinator/coordinator.js.map +1 -0
- package/dist/tools/coordinator/index.d.ts +12 -0
- package/dist/tools/coordinator/index.d.ts.map +1 -0
- package/dist/tools/coordinator/index.js +381 -0
- package/dist/tools/coordinator/index.js.map +1 -0
- package/dist/tools/corpus/index.d.ts +5 -0
- package/dist/tools/corpus/index.d.ts.map +1 -0
- package/dist/tools/corpus/index.js +105 -0
- package/dist/tools/corpus/index.js.map +1 -0
- package/dist/tools/corpus.d.ts +33 -0
- package/dist/tools/corpus.d.ts.map +1 -0
- package/dist/tools/corpus.js +180 -0
- package/dist/tools/corpus.js.map +1 -0
- package/dist/tools/crit.d.ts +63 -0
- package/dist/tools/crit.d.ts.map +1 -0
- package/dist/tools/crit.js +159 -0
- package/dist/tools/crit.js.map +1 -0
- package/dist/tools/data-inspector.d.ts +189 -0
- package/dist/tools/data-inspector.d.ts.map +1 -0
- package/dist/tools/data-inspector.js +669 -0
- package/dist/tools/data-inspector.js.map +1 -0
- package/dist/tools/deck.d.ts +11 -0
- package/dist/tools/deck.d.ts.map +1 -0
- package/dist/tools/deck.js +188 -0
- package/dist/tools/deck.js.map +1 -0
- package/dist/tools/designer/index.d.ts +11 -0
- package/dist/tools/designer/index.d.ts.map +1 -0
- package/dist/tools/designer/index.js +442 -0
- package/dist/tools/designer/index.js.map +1 -0
- package/dist/tools/designer/lateral-tools.d.ts +6 -0
- package/dist/tools/designer/lateral-tools.d.ts.map +1 -0
- package/dist/tools/designer/lateral-tools.js +190 -0
- package/dist/tools/designer/lateral-tools.js.map +1 -0
- package/dist/tools/designer.d.ts +122 -0
- package/dist/tools/designer.d.ts.map +1 -0
- package/dist/tools/designer.js +495 -0
- package/dist/tools/designer.js.map +1 -0
- package/dist/tools/dojo/index.d.ts +13 -0
- package/dist/tools/dojo/index.d.ts.map +1 -0
- package/dist/tools/dojo/index.js +613 -0
- package/dist/tools/dojo/index.js.map +1 -0
- package/dist/tools/dojo.d.ts +254 -0
- package/dist/tools/dojo.d.ts.map +1 -0
- package/dist/tools/dojo.js +933 -0
- package/dist/tools/dojo.js.map +1 -0
- package/dist/tools/dojoBench.d.ts +49 -0
- package/dist/tools/dojoBench.d.ts.map +1 -0
- package/dist/tools/dojoBench.js +205 -0
- package/dist/tools/dojoBench.js.map +1 -0
- package/dist/tools/dojoGraduated.d.ts +50 -0
- package/dist/tools/dojoGraduated.d.ts.map +1 -0
- package/dist/tools/dojoGraduated.js +174 -0
- package/dist/tools/dojoGraduated.js.map +1 -0
- package/dist/tools/dojoPolicy.d.ts +65 -0
- package/dist/tools/dojoPolicy.d.ts.map +1 -0
- package/dist/tools/dojoPolicy.js +263 -0
- package/dist/tools/dojoPolicy.js.map +1 -0
- package/dist/tools/feedback/index.d.ts +5 -0
- package/dist/tools/feedback/index.d.ts.map +1 -0
- package/dist/tools/feedback/index.js +153 -0
- package/dist/tools/feedback/index.js.map +1 -0
- package/dist/tools/feedback.d.ts +61 -0
- package/dist/tools/feedback.d.ts.map +1 -0
- package/dist/tools/feedback.js +209 -0
- package/dist/tools/feedback.js.map +1 -0
- package/dist/tools/forecast/index.d.ts +8 -0
- package/dist/tools/forecast/index.d.ts.map +1 -0
- package/dist/tools/forecast/index.js +283 -0
- package/dist/tools/forecast/index.js.map +1 -0
- package/dist/tools/forecast.d.ts +147 -0
- package/dist/tools/forecast.d.ts.map +1 -0
- package/dist/tools/forecast.js +417 -0
- package/dist/tools/forecast.js.map +1 -0
- package/dist/tools/friction/index.d.ts +7 -0
- package/dist/tools/friction/index.d.ts.map +1 -0
- package/dist/tools/friction/index.js +265 -0
- package/dist/tools/friction/index.js.map +1 -0
- package/dist/tools/friction.d.ts +82 -0
- package/dist/tools/friction.d.ts.map +1 -0
- package/dist/tools/friction.js +331 -0
- package/dist/tools/friction.js.map +1 -0
- package/dist/tools/git/index.d.ts +9 -0
- package/dist/tools/git/index.d.ts.map +1 -0
- package/dist/tools/git/index.js +237 -0
- package/dist/tools/git/index.js.map +1 -0
- package/dist/tools/git-sentinel/index.d.ts +7 -0
- package/dist/tools/git-sentinel/index.d.ts.map +1 -0
- package/dist/tools/git-sentinel/index.js +178 -0
- package/dist/tools/git-sentinel/index.js.map +1 -0
- package/dist/tools/git-sentinel.d.ts +78 -0
- package/dist/tools/git-sentinel.d.ts.map +1 -0
- package/dist/tools/git-sentinel.js +391 -0
- package/dist/tools/git-sentinel.js.map +1 -0
- package/dist/tools/git.d.ts +134 -0
- package/dist/tools/git.d.ts.map +1 -0
- package/dist/tools/git.js +374 -0
- package/dist/tools/git.js.map +1 -0
- package/dist/tools/guardian/index.d.ts +8 -0
- package/dist/tools/guardian/index.d.ts.map +1 -0
- package/dist/tools/guardian/index.js +171 -0
- package/dist/tools/guardian/index.js.map +1 -0
- package/dist/tools/guardian.d.ts +62 -0
- package/dist/tools/guardian.d.ts.map +1 -0
- package/dist/tools/guardian.js +332 -0
- package/dist/tools/guardian.js.map +1 -0
- package/dist/tools/hygiene/codebase-scanner.d.ts +38 -0
- package/dist/tools/hygiene/codebase-scanner.d.ts.map +1 -0
- package/dist/tools/hygiene/codebase-scanner.js +411 -0
- package/dist/tools/hygiene/codebase-scanner.js.map +1 -0
- package/dist/tools/hygiene/config-scanner.d.ts +33 -0
- package/dist/tools/hygiene/config-scanner.d.ts.map +1 -0
- package/dist/tools/hygiene/config-scanner.js +482 -0
- package/dist/tools/hygiene/config-scanner.js.map +1 -0
- package/dist/tools/hygiene/coverage-scanner.d.ts +41 -0
- package/dist/tools/hygiene/coverage-scanner.d.ts.map +1 -0
- package/dist/tools/hygiene/coverage-scanner.js +331 -0
- package/dist/tools/hygiene/coverage-scanner.js.map +1 -0
- package/dist/tools/hygiene/index.d.ts +7 -0
- package/dist/tools/hygiene/index.d.ts.map +1 -0
- package/dist/tools/hygiene/index.js +291 -0
- package/dist/tools/hygiene/index.js.map +1 -0
- package/dist/tools/hygiene/oracle-hygiene.d.ts +68 -0
- package/dist/tools/hygiene/oracle-hygiene.d.ts.map +1 -0
- package/dist/tools/hygiene/oracle-hygiene.js +324 -0
- package/dist/tools/hygiene/oracle-hygiene.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +130 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/lateral.d.ts +114 -0
- package/dist/tools/lateral.d.ts.map +1 -0
- package/dist/tools/lateral.js +536 -0
- package/dist/tools/lateral.js.map +1 -0
- package/dist/tools/learnings/index.d.ts +5 -0
- package/dist/tools/learnings/index.d.ts.map +1 -0
- package/dist/tools/learnings/index.js +138 -0
- package/dist/tools/learnings/index.js.map +1 -0
- package/dist/tools/learnings.d.ts +41 -0
- package/dist/tools/learnings.d.ts.map +1 -0
- package/dist/tools/learnings.js +149 -0
- package/dist/tools/learnings.js.map +1 -0
- package/dist/tools/oracle/index.d.ts +6 -0
- package/dist/tools/oracle/index.d.ts.map +1 -0
- package/dist/tools/oracle/index.js +217 -0
- package/dist/tools/oracle/index.js.map +1 -0
- package/dist/tools/oracle.d.ts +90 -0
- package/dist/tools/oracle.d.ts.map +1 -0
- package/dist/tools/oracle.js +529 -0
- package/dist/tools/oracle.js.map +1 -0
- package/dist/tools/policy.d.ts +119 -0
- package/dist/tools/policy.d.ts.map +1 -0
- package/dist/tools/policy.js +406 -0
- package/dist/tools/policy.js.map +1 -0
- package/dist/tools/provenance/index.d.ts +4 -0
- package/dist/tools/provenance/index.d.ts.map +1 -0
- package/dist/tools/provenance/index.js +63 -0
- package/dist/tools/provenance/index.js.map +1 -0
- package/dist/tools/provenance.d.ts +75 -0
- package/dist/tools/provenance.d.ts.map +1 -0
- package/dist/tools/provenance.js +224 -0
- package/dist/tools/provenance.js.map +1 -0
- package/dist/tools/rateLimiter.d.ts +45 -0
- package/dist/tools/rateLimiter.d.ts.map +1 -0
- package/dist/tools/rateLimiter.js +91 -0
- package/dist/tools/rateLimiter.js.map +1 -0
- package/dist/tools/registry/index.d.ts +10 -0
- package/dist/tools/registry/index.d.ts.map +1 -0
- package/dist/tools/registry/index.js +506 -0
- package/dist/tools/registry/index.js.map +1 -0
- package/dist/tools/registry.d.ts +3 -0
- package/dist/tools/registry.d.ts.map +1 -0
- package/dist/tools/registry.js +189 -0
- package/dist/tools/registry.js.map +1 -0
- package/dist/tools/roadmap/index.d.ts +11 -0
- package/dist/tools/roadmap/index.d.ts.map +1 -0
- package/dist/tools/roadmap/index.js +364 -0
- package/dist/tools/roadmap/index.js.map +1 -0
- package/dist/tools/roadmap.d.ts +103 -0
- package/dist/tools/roadmap.d.ts.map +1 -0
- package/dist/tools/roadmap.js +407 -0
- package/dist/tools/roadmap.js.map +1 -0
- package/dist/tools/senken.d.ts +11 -0
- package/dist/tools/senken.d.ts.map +1 -0
- package/dist/tools/senken.js +482 -0
- package/dist/tools/senken.js.map +1 -0
- package/dist/tools/sentinel/index.d.ts +21 -0
- package/dist/tools/sentinel/index.d.ts.map +1 -0
- package/dist/tools/sentinel/index.js +1067 -0
- package/dist/tools/sentinel/index.js.map +1 -0
- package/dist/tools/sentinel-scan-data.d.ts +90 -0
- package/dist/tools/sentinel-scan-data.d.ts.map +1 -0
- package/dist/tools/sentinel-scan-data.js +122 -0
- package/dist/tools/sentinel-scan-data.js.map +1 -0
- package/dist/tools/sentinel.d.ts +156 -0
- package/dist/tools/sentinel.d.ts.map +1 -0
- package/dist/tools/sentinel.js +603 -0
- package/dist/tools/sentinel.js.map +1 -0
- package/dist/tools/shared/index.d.ts +5 -0
- package/dist/tools/shared/index.d.ts.map +1 -0
- package/dist/tools/shared/index.js +8 -0
- package/dist/tools/shared/index.js.map +1 -0
- package/dist/tools/shared/project.d.ts +17 -0
- package/dist/tools/shared/project.d.ts.map +1 -0
- package/dist/tools/shared/project.js +36 -0
- package/dist/tools/shared/project.js.map +1 -0
- package/dist/tools/shared/response.d.ts +15 -0
- package/dist/tools/shared/response.d.ts.map +1 -0
- package/dist/tools/shared/response.js +77 -0
- package/dist/tools/shared/response.js.map +1 -0
- package/dist/tools/shared/runTracker.d.ts +87 -0
- package/dist/tools/shared/runTracker.d.ts.map +1 -0
- package/dist/tools/shared/runTracker.js +225 -0
- package/dist/tools/shared/runTracker.js.map +1 -0
- package/dist/tools/shared/validation.d.ts +10 -0
- package/dist/tools/shared/validation.d.ts.map +1 -0
- package/dist/tools/shared/validation.js +26 -0
- package/dist/tools/shared/validation.js.map +1 -0
- package/dist/tools/studio/cloud-spine.d.ts +27 -0
- package/dist/tools/studio/cloud-spine.d.ts.map +1 -0
- package/dist/tools/studio/cloud-spine.js +845 -0
- package/dist/tools/studio/cloud-spine.js.map +1 -0
- package/dist/tools/studio/index.d.ts +154 -0
- package/dist/tools/studio/index.d.ts.map +1 -0
- package/dist/tools/studio/index.js +541 -0
- package/dist/tools/studio/index.js.map +1 -0
- package/dist/tools/testSpec.d.ts +122 -0
- package/dist/tools/testSpec.d.ts.map +1 -0
- package/dist/tools/testSpec.js +525 -0
- package/dist/tools/testSpec.js.map +1 -0
- package/dist/tools/toolsIndex.d.ts +5 -0
- package/dist/tools/toolsIndex.d.ts.map +1 -0
- package/dist/tools/toolsIndex.js +37 -0
- package/dist/tools/toolsIndex.js.map +1 -0
- package/dist/tools/types.d.ts +47 -0
- package/dist/tools/types.d.ts.map +1 -0
- package/dist/tools/types.js +7 -0
- package/dist/tools/types.js.map +1 -0
- package/dist/tools/vector/index.d.ts +13 -0
- package/dist/tools/vector/index.d.ts.map +1 -0
- package/dist/tools/vector/index.js +592 -0
- package/dist/tools/vector/index.js.map +1 -0
- package/dist/tools/vector.d.ts +189 -0
- package/dist/tools/vector.d.ts.map +1 -0
- package/dist/tools/vector.js +570 -0
- package/dist/tools/vector.js.map +1 -0
- package/dist/tools/velocity/index.d.ts +9 -0
- package/dist/tools/velocity/index.d.ts.map +1 -0
- package/dist/tools/velocity/index.js +306 -0
- package/dist/tools/velocity/index.js.map +1 -0
- package/dist/tools/velocity.d.ts +143 -0
- package/dist/tools/velocity.d.ts.map +1 -0
- package/dist/tools/velocity.js +628 -0
- package/dist/tools/velocity.js.map +1 -0
- package/dist/tools/voice/index.d.ts +8 -0
- package/dist/tools/voice/index.d.ts.map +1 -0
- package/dist/tools/voice/index.js +203 -0
- package/dist/tools/voice/index.js.map +1 -0
- package/dist/tools/voice.d.ts +291 -0
- package/dist/tools/voice.d.ts.map +1 -0
- package/dist/tools/voice.js +734 -0
- package/dist/tools/voice.js.map +1 -0
- package/dist/tools/workflow/index.d.ts +8 -0
- package/dist/tools/workflow/index.d.ts.map +1 -0
- package/dist/tools/workflow/index.js +199 -0
- package/dist/tools/workflow/index.js.map +1 -0
- package/dist/tools/workflow.d.ts +123 -0
- package/dist/tools/workflow.d.ts.map +1 -0
- package/dist/tools/workflow.js +647 -0
- package/dist/tools/workflow.js.map +1 -0
- package/dist/transports/bridge.d.ts +22 -0
- package/dist/transports/bridge.d.ts.map +1 -0
- package/dist/transports/bridge.js +177 -0
- package/dist/transports/bridge.js.map +1 -0
- package/dist/transports/http.d.ts +9 -0
- package/dist/transports/http.d.ts.map +1 -0
- package/dist/transports/http.js +35 -0
- package/dist/transports/http.js.map +1 -0
- package/dist/transports/index.d.ts +6 -0
- package/dist/transports/index.d.ts.map +1 -0
- package/dist/transports/index.js +8 -0
- package/dist/transports/index.js.map +1 -0
- package/dist/transports/mcp.d.ts +9 -0
- package/dist/transports/mcp.d.ts.map +1 -0
- package/dist/transports/mcp.js +51 -0
- package/dist/transports/mcp.js.map +1 -0
- package/dist/transports/stdio.d.ts +9 -0
- package/dist/transports/stdio.d.ts.map +1 -0
- package/dist/transports/stdio.js +26 -0
- package/dist/transports/stdio.js.map +1 -0
- package/dist/transports/types.d.ts +27 -0
- package/dist/transports/types.d.ts.map +1 -0
- package/dist/transports/types.js +8 -0
- package/dist/transports/types.js.map +1 -0
- package/dist/types/agent-services.d.ts +193 -0
- package/dist/types/agent-services.d.ts.map +1 -0
- package/dist/types/agent-services.js +8 -0
- package/dist/types/agent-services.js.map +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/package.json +72 -0
- package/templates/AGENT.md +87 -0
- package/templates/com.decibel.daemon.plist +47 -0
- package/templates/sentinel/ISSUE_TEMPLATE.md +20 -0
|
@@ -0,0 +1,1067 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Sentinel Domain Tools
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// Tools for issue tracking, epic management, data inspection, and test specs.
|
|
5
|
+
// ============================================================================
|
|
6
|
+
import { toolSuccess, toolError, requireFields, requireOneOf, withRunTracking, summaryGenerators } from '../shared/index.js';
|
|
7
|
+
import { createIssue, closeIssue, listRepoIssues, logEpic, listEpics, getEpic, getEpicIssues, resolveEpic, isProjectResolutionError, } from '../sentinel.js';
|
|
8
|
+
import { scanData as scanDataTS, } from '../data-inspector.js';
|
|
9
|
+
import { listIssuesForProject, getIssueById, createIssue as createSentinelIssue, updateIssue as updateSentinelIssue, filterByStatus, filterByEpicId, } from '../../sentinelIssues.js';
|
|
10
|
+
import { resolveProjectPaths } from '../../projectRegistry.js';
|
|
11
|
+
import { createTestSpec, listTestSpecs, compileTests, auditPolicies, isTestSpecError, } from '../testSpec.js';
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Issue Tools (Markdown-based)
|
|
14
|
+
// ============================================================================
|
|
15
|
+
export const sentinelCreateIssueTool = {
|
|
16
|
+
definition: {
|
|
17
|
+
name: 'sentinel_create_issue',
|
|
18
|
+
description: 'Create a new issue for a project. Automatically saves a markdown file to .decibel/sentinel/issues/ with severity and status tracking. Can optionally link to an epic. No separate file writing needed.',
|
|
19
|
+
annotations: {
|
|
20
|
+
title: 'Create Issue',
|
|
21
|
+
readOnlyHint: false,
|
|
22
|
+
destructiveHint: false,
|
|
23
|
+
idempotentHint: false,
|
|
24
|
+
},
|
|
25
|
+
inputSchema: {
|
|
26
|
+
type: 'object',
|
|
27
|
+
properties: {
|
|
28
|
+
projectId: {
|
|
29
|
+
type: 'string',
|
|
30
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
31
|
+
},
|
|
32
|
+
severity: {
|
|
33
|
+
type: 'string',
|
|
34
|
+
enum: ['low', 'med', 'high', 'critical'],
|
|
35
|
+
description: 'The severity level of the issue',
|
|
36
|
+
},
|
|
37
|
+
title: {
|
|
38
|
+
type: 'string',
|
|
39
|
+
description: 'The issue title',
|
|
40
|
+
},
|
|
41
|
+
details: {
|
|
42
|
+
type: 'string',
|
|
43
|
+
description: 'Detailed description of the issue',
|
|
44
|
+
},
|
|
45
|
+
epic_id: {
|
|
46
|
+
type: 'string',
|
|
47
|
+
description: 'Optional parent epic ID (e.g., "EPIC-0001")',
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
required: ['severity', 'title', 'details'],
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
handler: withRunTracking(async (args) => {
|
|
54
|
+
try {
|
|
55
|
+
requireFields(args, 'severity', 'title', 'details');
|
|
56
|
+
const validSeverities = ['low', 'med', 'high', 'critical'];
|
|
57
|
+
requireOneOf(args.severity, 'severity', validSeverities);
|
|
58
|
+
const result = await createIssue(args);
|
|
59
|
+
if ('error' in result && result.error === 'EPIC_NOT_FOUND') {
|
|
60
|
+
return toolError(JSON.stringify(result));
|
|
61
|
+
}
|
|
62
|
+
return toolSuccess(result);
|
|
63
|
+
}
|
|
64
|
+
catch (err) {
|
|
65
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
66
|
+
}
|
|
67
|
+
}, {
|
|
68
|
+
toolName: 'sentinel_create_issue',
|
|
69
|
+
getSummary: summaryGenerators.issue,
|
|
70
|
+
}),
|
|
71
|
+
};
|
|
72
|
+
export const sentinelCloseIssueTool = {
|
|
73
|
+
definition: {
|
|
74
|
+
name: 'sentinel_close_issue',
|
|
75
|
+
description: 'Close an existing issue. Updates the status to closed and adds a closed_at timestamp. Can optionally add a resolution note.',
|
|
76
|
+
annotations: {
|
|
77
|
+
title: 'Close Issue',
|
|
78
|
+
readOnlyHint: false,
|
|
79
|
+
destructiveHint: false,
|
|
80
|
+
idempotentHint: true,
|
|
81
|
+
},
|
|
82
|
+
inputSchema: {
|
|
83
|
+
type: 'object',
|
|
84
|
+
properties: {
|
|
85
|
+
projectId: {
|
|
86
|
+
type: 'string',
|
|
87
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
88
|
+
},
|
|
89
|
+
issue_id: {
|
|
90
|
+
type: 'string',
|
|
91
|
+
description: 'The issue filename or partial match (e.g., "update-readme" or full filename)',
|
|
92
|
+
},
|
|
93
|
+
resolution: {
|
|
94
|
+
type: 'string',
|
|
95
|
+
description: 'Optional resolution note explaining how/why the issue was closed',
|
|
96
|
+
},
|
|
97
|
+
status: {
|
|
98
|
+
type: 'string',
|
|
99
|
+
enum: ['closed', 'wontfix'],
|
|
100
|
+
description: 'The closing status (default: closed)',
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
required: ['issue_id'],
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
handler: withRunTracking(async (args) => {
|
|
107
|
+
try {
|
|
108
|
+
requireFields(args, 'issue_id');
|
|
109
|
+
if (args.status) {
|
|
110
|
+
const validStatuses = ['closed', 'wontfix'];
|
|
111
|
+
requireOneOf(args.status, 'status', validStatuses);
|
|
112
|
+
}
|
|
113
|
+
const result = await closeIssue(args);
|
|
114
|
+
if ('error' in result && result.error === 'ISSUE_NOT_FOUND') {
|
|
115
|
+
return toolError(JSON.stringify(result));
|
|
116
|
+
}
|
|
117
|
+
return toolSuccess(result);
|
|
118
|
+
}
|
|
119
|
+
catch (err) {
|
|
120
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
121
|
+
}
|
|
122
|
+
}, {
|
|
123
|
+
toolName: 'sentinel_close_issue',
|
|
124
|
+
getSummary: summaryGenerators.closeIssue,
|
|
125
|
+
}),
|
|
126
|
+
};
|
|
127
|
+
export const sentinelListRepoIssuesTool = {
|
|
128
|
+
definition: {
|
|
129
|
+
name: 'sentinel_list_repo_issues',
|
|
130
|
+
description: 'List all issues for a specific project, optionally filtered by status.',
|
|
131
|
+
annotations: {
|
|
132
|
+
title: 'List Issues',
|
|
133
|
+
readOnlyHint: true,
|
|
134
|
+
destructiveHint: false,
|
|
135
|
+
},
|
|
136
|
+
inputSchema: {
|
|
137
|
+
type: 'object',
|
|
138
|
+
properties: {
|
|
139
|
+
projectId: {
|
|
140
|
+
type: 'string',
|
|
141
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
142
|
+
},
|
|
143
|
+
status: {
|
|
144
|
+
type: 'string',
|
|
145
|
+
enum: ['open', 'closed', 'wontfix'],
|
|
146
|
+
description: 'Optional status filter',
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
},
|
|
150
|
+
},
|
|
151
|
+
handler: async (args) => {
|
|
152
|
+
try {
|
|
153
|
+
if (args.status) {
|
|
154
|
+
const validStatuses = ['open', 'closed', 'wontfix'];
|
|
155
|
+
requireOneOf(args.status, 'status', validStatuses);
|
|
156
|
+
}
|
|
157
|
+
const result = await listRepoIssues(args);
|
|
158
|
+
return toolSuccess(result);
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
162
|
+
}
|
|
163
|
+
},
|
|
164
|
+
};
|
|
165
|
+
// ============================================================================
|
|
166
|
+
// Epic Tools
|
|
167
|
+
// ============================================================================
|
|
168
|
+
export const sentinelLogEpicTool = {
|
|
169
|
+
definition: {
|
|
170
|
+
name: 'sentinel_log_epic',
|
|
171
|
+
description: 'Create a new Sentinel epic (large feature) record. Automatically saves to .decibel/sentinel/epics/. Returns the epic_id and file path. No separate file writing needed.',
|
|
172
|
+
annotations: {
|
|
173
|
+
title: 'Log Epic',
|
|
174
|
+
readOnlyHint: false,
|
|
175
|
+
destructiveHint: false,
|
|
176
|
+
idempotentHint: false,
|
|
177
|
+
},
|
|
178
|
+
inputSchema: {
|
|
179
|
+
type: 'object',
|
|
180
|
+
properties: {
|
|
181
|
+
projectId: {
|
|
182
|
+
type: 'string',
|
|
183
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
184
|
+
},
|
|
185
|
+
title: {
|
|
186
|
+
type: 'string',
|
|
187
|
+
description: 'Epic title (e.g., "MCP Server: Sentinel Epic Support")',
|
|
188
|
+
},
|
|
189
|
+
summary: {
|
|
190
|
+
type: 'string',
|
|
191
|
+
description: 'Brief summary of what this epic is about',
|
|
192
|
+
},
|
|
193
|
+
motivation: {
|
|
194
|
+
type: 'array',
|
|
195
|
+
items: { type: 'string' },
|
|
196
|
+
description: 'List of motivation statements (why this epic exists)',
|
|
197
|
+
},
|
|
198
|
+
outcomes: {
|
|
199
|
+
type: 'array',
|
|
200
|
+
items: { type: 'string' },
|
|
201
|
+
description: 'List of desired outcomes',
|
|
202
|
+
},
|
|
203
|
+
acceptance_criteria: {
|
|
204
|
+
type: 'array',
|
|
205
|
+
items: { type: 'string' },
|
|
206
|
+
description: 'List of acceptance criteria for "done"',
|
|
207
|
+
},
|
|
208
|
+
priority: {
|
|
209
|
+
type: 'string',
|
|
210
|
+
enum: ['low', 'medium', 'high', 'critical'],
|
|
211
|
+
default: 'medium',
|
|
212
|
+
description: 'Priority level',
|
|
213
|
+
},
|
|
214
|
+
tags: {
|
|
215
|
+
type: 'array',
|
|
216
|
+
items: { type: 'string' },
|
|
217
|
+
description: 'Tags for categorization',
|
|
218
|
+
},
|
|
219
|
+
owner: {
|
|
220
|
+
type: 'string',
|
|
221
|
+
description: 'Owner of the epic',
|
|
222
|
+
},
|
|
223
|
+
squad: {
|
|
224
|
+
type: 'string',
|
|
225
|
+
description: 'Squad/team responsible',
|
|
226
|
+
},
|
|
227
|
+
},
|
|
228
|
+
required: ['title', 'summary'],
|
|
229
|
+
},
|
|
230
|
+
},
|
|
231
|
+
handler: withRunTracking(async (args) => {
|
|
232
|
+
try {
|
|
233
|
+
requireFields(args, 'title', 'summary');
|
|
234
|
+
if (args.priority) {
|
|
235
|
+
const validPriorities = ['low', 'medium', 'high', 'critical'];
|
|
236
|
+
requireOneOf(args.priority, 'priority', validPriorities);
|
|
237
|
+
}
|
|
238
|
+
const result = await logEpic(args);
|
|
239
|
+
return toolSuccess(result);
|
|
240
|
+
}
|
|
241
|
+
catch (err) {
|
|
242
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
243
|
+
}
|
|
244
|
+
}, {
|
|
245
|
+
toolName: 'sentinel_log_epic',
|
|
246
|
+
getSummary: summaryGenerators.epic,
|
|
247
|
+
}),
|
|
248
|
+
};
|
|
249
|
+
export const sentinelListEpicsTool = {
|
|
250
|
+
definition: {
|
|
251
|
+
name: 'sentinel_list_epics',
|
|
252
|
+
description: 'List all epics, optionally filtered by status, priority, or tags.',
|
|
253
|
+
annotations: {
|
|
254
|
+
title: 'List Epics',
|
|
255
|
+
readOnlyHint: true,
|
|
256
|
+
destructiveHint: false,
|
|
257
|
+
},
|
|
258
|
+
inputSchema: {
|
|
259
|
+
type: 'object',
|
|
260
|
+
properties: {
|
|
261
|
+
projectId: {
|
|
262
|
+
type: 'string',
|
|
263
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
264
|
+
},
|
|
265
|
+
status: {
|
|
266
|
+
type: 'string',
|
|
267
|
+
enum: ['planned', 'in_progress', 'shipped', 'on_hold', 'cancelled'],
|
|
268
|
+
description: 'Filter by status',
|
|
269
|
+
},
|
|
270
|
+
priority: {
|
|
271
|
+
type: 'string',
|
|
272
|
+
enum: ['low', 'medium', 'high', 'critical'],
|
|
273
|
+
description: 'Filter by priority',
|
|
274
|
+
},
|
|
275
|
+
tags: {
|
|
276
|
+
type: 'array',
|
|
277
|
+
items: { type: 'string' },
|
|
278
|
+
description: 'Filter by tags (matches any)',
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
},
|
|
282
|
+
},
|
|
283
|
+
handler: async (args) => {
|
|
284
|
+
try {
|
|
285
|
+
if (args.status) {
|
|
286
|
+
const validStatuses = ['planned', 'in_progress', 'shipped', 'on_hold', 'cancelled'];
|
|
287
|
+
requireOneOf(args.status, 'status', validStatuses);
|
|
288
|
+
}
|
|
289
|
+
if (args.priority) {
|
|
290
|
+
const validPriorities = ['low', 'medium', 'high', 'critical'];
|
|
291
|
+
requireOneOf(args.priority, 'priority', validPriorities);
|
|
292
|
+
}
|
|
293
|
+
const result = await listEpics(args);
|
|
294
|
+
return toolSuccess(result);
|
|
295
|
+
}
|
|
296
|
+
catch (err) {
|
|
297
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
298
|
+
}
|
|
299
|
+
},
|
|
300
|
+
};
|
|
301
|
+
export const sentinelReadEpicTool = {
|
|
302
|
+
definition: {
|
|
303
|
+
name: 'sentinel_read_epic',
|
|
304
|
+
description: 'Read details of a specific epic by ID.',
|
|
305
|
+
annotations: {
|
|
306
|
+
title: 'Read Epic',
|
|
307
|
+
readOnlyHint: true,
|
|
308
|
+
destructiveHint: false,
|
|
309
|
+
},
|
|
310
|
+
inputSchema: {
|
|
311
|
+
type: 'object',
|
|
312
|
+
properties: {
|
|
313
|
+
projectId: {
|
|
314
|
+
type: 'string',
|
|
315
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
316
|
+
},
|
|
317
|
+
epic_id: {
|
|
318
|
+
type: 'string',
|
|
319
|
+
description: 'Epic ID (e.g., "EPIC-0001")',
|
|
320
|
+
},
|
|
321
|
+
},
|
|
322
|
+
required: ['epic_id'],
|
|
323
|
+
},
|
|
324
|
+
},
|
|
325
|
+
handler: async (args) => {
|
|
326
|
+
try {
|
|
327
|
+
requireFields(args, 'epic_id');
|
|
328
|
+
const result = await getEpic(args);
|
|
329
|
+
if (isProjectResolutionError(result)) {
|
|
330
|
+
return toolError(JSON.stringify(result));
|
|
331
|
+
}
|
|
332
|
+
if (result.error) {
|
|
333
|
+
return toolError(result.error);
|
|
334
|
+
}
|
|
335
|
+
return toolSuccess(result.epic);
|
|
336
|
+
}
|
|
337
|
+
catch (err) {
|
|
338
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
};
|
|
342
|
+
export const sentinelListEpicIssuesTool = {
|
|
343
|
+
definition: {
|
|
344
|
+
name: 'sentinel_list_epic_issues',
|
|
345
|
+
description: 'List all issues linked to a specific epic.',
|
|
346
|
+
annotations: {
|
|
347
|
+
title: 'List Epic Issues',
|
|
348
|
+
readOnlyHint: true,
|
|
349
|
+
destructiveHint: false,
|
|
350
|
+
},
|
|
351
|
+
inputSchema: {
|
|
352
|
+
type: 'object',
|
|
353
|
+
properties: {
|
|
354
|
+
projectId: {
|
|
355
|
+
type: 'string',
|
|
356
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
357
|
+
},
|
|
358
|
+
epic_id: {
|
|
359
|
+
type: 'string',
|
|
360
|
+
description: 'Epic ID (e.g., "EPIC-0001")',
|
|
361
|
+
},
|
|
362
|
+
},
|
|
363
|
+
required: ['epic_id'],
|
|
364
|
+
},
|
|
365
|
+
},
|
|
366
|
+
handler: async (args) => {
|
|
367
|
+
try {
|
|
368
|
+
requireFields(args, 'epic_id');
|
|
369
|
+
const result = await getEpicIssues(args);
|
|
370
|
+
return toolSuccess(result);
|
|
371
|
+
}
|
|
372
|
+
catch (err) {
|
|
373
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
374
|
+
}
|
|
375
|
+
},
|
|
376
|
+
};
|
|
377
|
+
export const sentinelResolveEpicTool = {
|
|
378
|
+
definition: {
|
|
379
|
+
name: 'sentinel_resolve_epic',
|
|
380
|
+
description: 'Resolve a fuzzy epic name/keyword into one or more matching epics. Use this to find the correct epic_id before creating issues.',
|
|
381
|
+
annotations: {
|
|
382
|
+
title: 'Resolve Epic',
|
|
383
|
+
readOnlyHint: true,
|
|
384
|
+
destructiveHint: false,
|
|
385
|
+
},
|
|
386
|
+
inputSchema: {
|
|
387
|
+
type: 'object',
|
|
388
|
+
properties: {
|
|
389
|
+
projectId: {
|
|
390
|
+
type: 'string',
|
|
391
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
392
|
+
},
|
|
393
|
+
query: {
|
|
394
|
+
type: 'string',
|
|
395
|
+
description: 'Search query (epic ID, title, or keywords)',
|
|
396
|
+
},
|
|
397
|
+
limit: {
|
|
398
|
+
type: 'integer',
|
|
399
|
+
default: 5,
|
|
400
|
+
description: 'Maximum number of matches to return',
|
|
401
|
+
},
|
|
402
|
+
},
|
|
403
|
+
required: ['query'],
|
|
404
|
+
},
|
|
405
|
+
},
|
|
406
|
+
handler: async (args) => {
|
|
407
|
+
try {
|
|
408
|
+
requireFields(args, 'query');
|
|
409
|
+
const result = await resolveEpic(args);
|
|
410
|
+
return toolSuccess(result);
|
|
411
|
+
}
|
|
412
|
+
catch (err) {
|
|
413
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
414
|
+
}
|
|
415
|
+
},
|
|
416
|
+
};
|
|
417
|
+
// ============================================================================
|
|
418
|
+
// Data Inspector Tools
|
|
419
|
+
// ============================================================================
|
|
420
|
+
export const sentinelScanTool = {
|
|
421
|
+
definition: {
|
|
422
|
+
name: 'sentinel_scan',
|
|
423
|
+
description: 'Scan project data (issues, epics, ADRs) for validation, orphans, and stale items. Use scope "data" for data inspection, "runtime" for runtime health (not yet implemented), or "all" for both.',
|
|
424
|
+
annotations: {
|
|
425
|
+
title: 'Scan Project Data',
|
|
426
|
+
readOnlyHint: true,
|
|
427
|
+
destructiveHint: false,
|
|
428
|
+
},
|
|
429
|
+
inputSchema: {
|
|
430
|
+
type: 'object',
|
|
431
|
+
properties: {
|
|
432
|
+
projectId: {
|
|
433
|
+
type: 'string',
|
|
434
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
435
|
+
},
|
|
436
|
+
scope: {
|
|
437
|
+
type: 'string',
|
|
438
|
+
enum: ['runtime', 'data', 'all'],
|
|
439
|
+
default: 'data',
|
|
440
|
+
description: 'Scan scope: "runtime" for runtime/log/health, "data" for .decibel project data, "all" for both',
|
|
441
|
+
},
|
|
442
|
+
validate: {
|
|
443
|
+
type: 'boolean',
|
|
444
|
+
default: false,
|
|
445
|
+
description: 'Run schema and referential integrity validation',
|
|
446
|
+
},
|
|
447
|
+
flag: {
|
|
448
|
+
type: 'array',
|
|
449
|
+
items: {
|
|
450
|
+
type: 'string',
|
|
451
|
+
enum: ['orphans', 'stale', 'invalid', 'packages'],
|
|
452
|
+
},
|
|
453
|
+
description: 'Categories to flag in output: orphans (broken references), stale (old items), invalid (schema errors), packages (package health)',
|
|
454
|
+
},
|
|
455
|
+
days: {
|
|
456
|
+
type: 'integer',
|
|
457
|
+
default: 21,
|
|
458
|
+
description: 'Threshold in days for stale detection (default: 21)',
|
|
459
|
+
},
|
|
460
|
+
},
|
|
461
|
+
},
|
|
462
|
+
},
|
|
463
|
+
handler: async (args) => {
|
|
464
|
+
try {
|
|
465
|
+
const validScopes = ['runtime', 'data', 'all'];
|
|
466
|
+
const scope = (args.scope || 'data');
|
|
467
|
+
requireOneOf(scope, 'scope', validScopes);
|
|
468
|
+
// Resolve projectId — falls back to default project if not specified
|
|
469
|
+
let projectId = args.projectId;
|
|
470
|
+
if (!projectId) {
|
|
471
|
+
try {
|
|
472
|
+
const resolved = resolveProjectPaths();
|
|
473
|
+
projectId = resolved.id;
|
|
474
|
+
}
|
|
475
|
+
catch {
|
|
476
|
+
// Let scanDataTS handle it — it has its own cwd fallback
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
// Use TypeScript backend
|
|
480
|
+
const result = await scanDataTS({
|
|
481
|
+
projectId,
|
|
482
|
+
scope,
|
|
483
|
+
validate: args.validate ?? false,
|
|
484
|
+
flag: args.flag || ['orphans', 'stale', 'invalid'],
|
|
485
|
+
days: args.days || 21,
|
|
486
|
+
});
|
|
487
|
+
if (result.error) {
|
|
488
|
+
return toolError(result.error);
|
|
489
|
+
}
|
|
490
|
+
return toolSuccess(result);
|
|
491
|
+
}
|
|
492
|
+
catch (err) {
|
|
493
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
};
|
|
497
|
+
export const sentinelScanDataTool = {
|
|
498
|
+
definition: {
|
|
499
|
+
name: 'sentinel_scanData',
|
|
500
|
+
description: 'Scan project data using the Python Sentinel Data Inspector. Resolves project by ID and shells out to Python for inspection logic.',
|
|
501
|
+
annotations: {
|
|
502
|
+
title: 'Scan Data (Python)',
|
|
503
|
+
readOnlyHint: true,
|
|
504
|
+
destructiveHint: false,
|
|
505
|
+
},
|
|
506
|
+
inputSchema: {
|
|
507
|
+
type: 'object',
|
|
508
|
+
properties: {
|
|
509
|
+
projectId: {
|
|
510
|
+
type: 'string',
|
|
511
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
512
|
+
},
|
|
513
|
+
validate: {
|
|
514
|
+
type: 'boolean',
|
|
515
|
+
default: false,
|
|
516
|
+
description: 'Run schema and referential integrity validation',
|
|
517
|
+
},
|
|
518
|
+
flags: {
|
|
519
|
+
type: 'array',
|
|
520
|
+
items: {
|
|
521
|
+
type: 'string',
|
|
522
|
+
enum: ['orphans', 'stale', 'invalid', 'packages'],
|
|
523
|
+
},
|
|
524
|
+
default: [],
|
|
525
|
+
description: 'Categories to flag: orphans (broken references), stale (old items), invalid (schema errors), packages (package health)',
|
|
526
|
+
},
|
|
527
|
+
days: {
|
|
528
|
+
type: 'integer',
|
|
529
|
+
default: 21,
|
|
530
|
+
description: 'Threshold in days for stale detection (default: 21)',
|
|
531
|
+
},
|
|
532
|
+
},
|
|
533
|
+
},
|
|
534
|
+
},
|
|
535
|
+
handler: async (args) => {
|
|
536
|
+
try {
|
|
537
|
+
// Resolve projectId — falls back to default project if not specified
|
|
538
|
+
let projectId = args.projectId;
|
|
539
|
+
if (!projectId) {
|
|
540
|
+
try {
|
|
541
|
+
const resolved = resolveProjectPaths();
|
|
542
|
+
projectId = resolved.id;
|
|
543
|
+
}
|
|
544
|
+
catch {
|
|
545
|
+
// Let scanDataTS handle it — it has its own cwd fallback
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
// Validate flag categories if provided
|
|
549
|
+
if (args.flags && args.flags.length > 0) {
|
|
550
|
+
const validFlags = ['orphans', 'stale', 'invalid'];
|
|
551
|
+
for (const f of args.flags) {
|
|
552
|
+
requireOneOf(f, 'flag', validFlags);
|
|
553
|
+
}
|
|
554
|
+
}
|
|
555
|
+
const result = await scanDataTS({
|
|
556
|
+
projectId,
|
|
557
|
+
scope: 'data',
|
|
558
|
+
validate: args.validate ?? false,
|
|
559
|
+
flag: args.flags ?? [],
|
|
560
|
+
days: args.days ?? 21,
|
|
561
|
+
});
|
|
562
|
+
if (result.error) {
|
|
563
|
+
return toolError(result.error);
|
|
564
|
+
}
|
|
565
|
+
return toolSuccess(result);
|
|
566
|
+
}
|
|
567
|
+
catch (err) {
|
|
568
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
569
|
+
}
|
|
570
|
+
},
|
|
571
|
+
};
|
|
572
|
+
// ============================================================================
|
|
573
|
+
// YAML Issue Tools (projectId-based)
|
|
574
|
+
// ============================================================================
|
|
575
|
+
export const sentinelListIssuesTool = {
|
|
576
|
+
definition: {
|
|
577
|
+
name: 'sentinel_listIssues',
|
|
578
|
+
description: 'List issues for a project from .decibel/sentinel/issues/*.yml files. Returns issue metadata including id, title, status, priority, epicId, and tags.',
|
|
579
|
+
annotations: {
|
|
580
|
+
title: 'List Issues (YAML)',
|
|
581
|
+
readOnlyHint: true,
|
|
582
|
+
destructiveHint: false,
|
|
583
|
+
},
|
|
584
|
+
inputSchema: {
|
|
585
|
+
type: 'object',
|
|
586
|
+
properties: {
|
|
587
|
+
projectId: {
|
|
588
|
+
type: 'string',
|
|
589
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
590
|
+
},
|
|
591
|
+
status: {
|
|
592
|
+
type: 'string',
|
|
593
|
+
enum: ['open', 'in_progress', 'done', 'blocked'],
|
|
594
|
+
description: 'Optional filter by issue status',
|
|
595
|
+
},
|
|
596
|
+
epicId: {
|
|
597
|
+
type: 'string',
|
|
598
|
+
description: 'Optional filter by epic ID (e.g., "EPIC-0001")',
|
|
599
|
+
},
|
|
600
|
+
},
|
|
601
|
+
},
|
|
602
|
+
},
|
|
603
|
+
handler: async (args) => {
|
|
604
|
+
try {
|
|
605
|
+
// Resolve projectId — falls back to default project if not specified
|
|
606
|
+
const resolved = resolveProjectPaths(args.projectId);
|
|
607
|
+
const projectId = resolved.id;
|
|
608
|
+
if (args.status) {
|
|
609
|
+
const validStatuses = ['open', 'in_progress', 'done', 'blocked'];
|
|
610
|
+
requireOneOf(args.status, 'status', validStatuses);
|
|
611
|
+
}
|
|
612
|
+
let issues = await listIssuesForProject(projectId);
|
|
613
|
+
// Apply filters
|
|
614
|
+
if (args.status) {
|
|
615
|
+
issues = filterByStatus(issues, args.status);
|
|
616
|
+
}
|
|
617
|
+
if (args.epicId) {
|
|
618
|
+
issues = filterByEpicId(issues, args.epicId);
|
|
619
|
+
}
|
|
620
|
+
// Return simplified issue list
|
|
621
|
+
const result = issues.map((issue) => ({
|
|
622
|
+
id: issue.id,
|
|
623
|
+
title: issue.title,
|
|
624
|
+
status: issue.status,
|
|
625
|
+
priority: issue.priority,
|
|
626
|
+
epicId: issue.epicId,
|
|
627
|
+
tags: issue.tags,
|
|
628
|
+
created_at: issue.created_at,
|
|
629
|
+
updated_at: issue.updated_at,
|
|
630
|
+
}));
|
|
631
|
+
return toolSuccess(result);
|
|
632
|
+
}
|
|
633
|
+
catch (err) {
|
|
634
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
635
|
+
}
|
|
636
|
+
},
|
|
637
|
+
};
|
|
638
|
+
export const sentinelCreateIssueTool2 = {
|
|
639
|
+
definition: {
|
|
640
|
+
name: 'sentinel_createIssue',
|
|
641
|
+
description: 'Create a new issue for a project. Writes a YAML file to .decibel/sentinel/issues/ with auto-generated ID (ISS-NNNN).',
|
|
642
|
+
annotations: {
|
|
643
|
+
title: 'Create Issue (YAML)',
|
|
644
|
+
readOnlyHint: false,
|
|
645
|
+
destructiveHint: false,
|
|
646
|
+
idempotentHint: false,
|
|
647
|
+
},
|
|
648
|
+
inputSchema: {
|
|
649
|
+
type: 'object',
|
|
650
|
+
properties: {
|
|
651
|
+
projectId: {
|
|
652
|
+
type: 'string',
|
|
653
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
654
|
+
},
|
|
655
|
+
title: {
|
|
656
|
+
type: 'string',
|
|
657
|
+
description: 'Issue title',
|
|
658
|
+
},
|
|
659
|
+
description: {
|
|
660
|
+
type: 'string',
|
|
661
|
+
description: 'Detailed description of the issue',
|
|
662
|
+
},
|
|
663
|
+
epicId: {
|
|
664
|
+
type: 'string',
|
|
665
|
+
description: 'Optional parent epic ID (e.g., "EPIC-0001")',
|
|
666
|
+
},
|
|
667
|
+
priority: {
|
|
668
|
+
type: 'string',
|
|
669
|
+
enum: ['low', 'medium', 'high'],
|
|
670
|
+
default: 'medium',
|
|
671
|
+
description: 'Issue priority level',
|
|
672
|
+
},
|
|
673
|
+
tags: {
|
|
674
|
+
type: 'array',
|
|
675
|
+
items: { type: 'string' },
|
|
676
|
+
description: 'Tags for categorization',
|
|
677
|
+
},
|
|
678
|
+
},
|
|
679
|
+
required: ['title'],
|
|
680
|
+
},
|
|
681
|
+
},
|
|
682
|
+
handler: withRunTracking(async (args) => {
|
|
683
|
+
try {
|
|
684
|
+
requireFields(args, 'title');
|
|
685
|
+
// Resolve projectId — falls back to default project if not specified
|
|
686
|
+
const resolved = resolveProjectPaths(args.projectId);
|
|
687
|
+
if (args.priority) {
|
|
688
|
+
const validPriorities = ['low', 'medium', 'high'];
|
|
689
|
+
requireOneOf(args.priority, 'priority', validPriorities);
|
|
690
|
+
}
|
|
691
|
+
const result = await createSentinelIssue({ ...args, projectId: resolved.id });
|
|
692
|
+
return toolSuccess(result);
|
|
693
|
+
}
|
|
694
|
+
catch (err) {
|
|
695
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
696
|
+
}
|
|
697
|
+
}, {
|
|
698
|
+
toolName: 'sentinel_createIssue',
|
|
699
|
+
getSummary: summaryGenerators.issue,
|
|
700
|
+
}),
|
|
701
|
+
};
|
|
702
|
+
// ============================================================================
|
|
703
|
+
// Get Issue Tool (YAML-based)
|
|
704
|
+
// ============================================================================
|
|
705
|
+
export const sentinelReadIssueTool = {
|
|
706
|
+
definition: {
|
|
707
|
+
name: 'sentinel_read_issue',
|
|
708
|
+
description: 'Read a single issue by ID (e.g., "ISS-0005") with full content including description, tags, and metadata.',
|
|
709
|
+
annotations: {
|
|
710
|
+
title: 'Read Issue',
|
|
711
|
+
readOnlyHint: true,
|
|
712
|
+
destructiveHint: false,
|
|
713
|
+
},
|
|
714
|
+
inputSchema: {
|
|
715
|
+
type: 'object',
|
|
716
|
+
properties: {
|
|
717
|
+
projectId: {
|
|
718
|
+
type: 'string',
|
|
719
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
720
|
+
},
|
|
721
|
+
issue_id: {
|
|
722
|
+
type: 'string',
|
|
723
|
+
description: 'Issue ID (e.g., "ISS-0005")',
|
|
724
|
+
},
|
|
725
|
+
},
|
|
726
|
+
required: ['issue_id'],
|
|
727
|
+
},
|
|
728
|
+
},
|
|
729
|
+
handler: async (args) => {
|
|
730
|
+
try {
|
|
731
|
+
requireFields(args, 'issue_id');
|
|
732
|
+
// Resolve projectId — falls back to default project if not specified
|
|
733
|
+
const resolved = resolveProjectPaths(args.projectId);
|
|
734
|
+
const projectId = resolved.id;
|
|
735
|
+
const issue = await getIssueById(projectId, args.issue_id);
|
|
736
|
+
if (!issue) {
|
|
737
|
+
return toolError(`Issue ${args.issue_id} not found in project ${projectId}`);
|
|
738
|
+
}
|
|
739
|
+
return toolSuccess(issue);
|
|
740
|
+
}
|
|
741
|
+
catch (err) {
|
|
742
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
743
|
+
}
|
|
744
|
+
},
|
|
745
|
+
};
|
|
746
|
+
// ============================================================================
|
|
747
|
+
// Update Issue Tool (YAML-based)
|
|
748
|
+
// ============================================================================
|
|
749
|
+
export const sentinelUpdateIssueTool = {
|
|
750
|
+
definition: {
|
|
751
|
+
name: 'sentinel_updateIssue',
|
|
752
|
+
description: 'Update an existing issue. Can change status (open/in_progress/done/blocked), priority (low/medium/high), add tags, and append timestamped notes. Returns the updated issue with a list of changes made.',
|
|
753
|
+
annotations: {
|
|
754
|
+
title: 'Update Issue',
|
|
755
|
+
readOnlyHint: false,
|
|
756
|
+
destructiveHint: false,
|
|
757
|
+
idempotentHint: false,
|
|
758
|
+
},
|
|
759
|
+
inputSchema: {
|
|
760
|
+
type: 'object',
|
|
761
|
+
properties: {
|
|
762
|
+
projectId: {
|
|
763
|
+
type: 'string',
|
|
764
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
765
|
+
},
|
|
766
|
+
issue_id: {
|
|
767
|
+
type: 'string',
|
|
768
|
+
description: 'Issue ID (e.g., "ISS-0048")',
|
|
769
|
+
},
|
|
770
|
+
status: {
|
|
771
|
+
type: 'string',
|
|
772
|
+
enum: ['open', 'in_progress', 'done', 'blocked'],
|
|
773
|
+
description: 'New status for the issue',
|
|
774
|
+
},
|
|
775
|
+
priority: {
|
|
776
|
+
type: 'string',
|
|
777
|
+
enum: ['low', 'medium', 'high'],
|
|
778
|
+
description: 'New priority for the issue',
|
|
779
|
+
},
|
|
780
|
+
tags: {
|
|
781
|
+
type: 'array',
|
|
782
|
+
items: { type: 'string' },
|
|
783
|
+
description: 'Tags to add (merged with existing, not replaced)',
|
|
784
|
+
},
|
|
785
|
+
note: {
|
|
786
|
+
type: 'string',
|
|
787
|
+
description: 'Note to append to the description (auto-timestamped)',
|
|
788
|
+
},
|
|
789
|
+
},
|
|
790
|
+
required: ['issue_id'],
|
|
791
|
+
},
|
|
792
|
+
},
|
|
793
|
+
handler: async (args) => {
|
|
794
|
+
try {
|
|
795
|
+
const rawInput = args;
|
|
796
|
+
const issueId = (rawInput.issue_id ?? rawInput.issueId);
|
|
797
|
+
requireFields({ issue_id: issueId }, 'issue_id');
|
|
798
|
+
// Resolve projectId — falls back to default project if not specified
|
|
799
|
+
const rawProjectId = (rawInput.projectId ?? rawInput.project_id);
|
|
800
|
+
const resolved = resolveProjectPaths(rawProjectId || undefined);
|
|
801
|
+
const projectId = resolved.id;
|
|
802
|
+
const result = await updateSentinelIssue({
|
|
803
|
+
projectId,
|
|
804
|
+
issueId,
|
|
805
|
+
status: rawInput.status,
|
|
806
|
+
priority: rawInput.priority,
|
|
807
|
+
tags: rawInput.tags,
|
|
808
|
+
note: rawInput.note,
|
|
809
|
+
});
|
|
810
|
+
return toolSuccess(result);
|
|
811
|
+
}
|
|
812
|
+
catch (err) {
|
|
813
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
814
|
+
}
|
|
815
|
+
},
|
|
816
|
+
};
|
|
817
|
+
// ============================================================================
|
|
818
|
+
// Test Spec Tools
|
|
819
|
+
// ============================================================================
|
|
820
|
+
export const sentinelCreateTestSpecTool = {
|
|
821
|
+
definition: {
|
|
822
|
+
name: 'sentinel_createTestSpec',
|
|
823
|
+
description: 'Create a new test specification atom. Test specs define test cases and requirements.',
|
|
824
|
+
annotations: {
|
|
825
|
+
title: 'Create Test Spec',
|
|
826
|
+
readOnlyHint: false,
|
|
827
|
+
destructiveHint: false,
|
|
828
|
+
idempotentHint: false,
|
|
829
|
+
},
|
|
830
|
+
inputSchema: {
|
|
831
|
+
type: 'object',
|
|
832
|
+
properties: {
|
|
833
|
+
projectId: {
|
|
834
|
+
type: 'string',
|
|
835
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
836
|
+
},
|
|
837
|
+
title: {
|
|
838
|
+
type: 'string',
|
|
839
|
+
description: 'Test spec title (e.g., "User Authentication Flow")',
|
|
840
|
+
},
|
|
841
|
+
description: {
|
|
842
|
+
type: 'string',
|
|
843
|
+
description: 'What this test spec covers',
|
|
844
|
+
},
|
|
845
|
+
type: {
|
|
846
|
+
type: 'string',
|
|
847
|
+
enum: ['unit', 'integration', 'e2e', 'contract', 'property', 'manual'],
|
|
848
|
+
description: 'Type of test',
|
|
849
|
+
},
|
|
850
|
+
priority: {
|
|
851
|
+
type: 'string',
|
|
852
|
+
enum: ['critical', 'high', 'medium', 'low'],
|
|
853
|
+
description: 'Test priority (default: medium)',
|
|
854
|
+
},
|
|
855
|
+
policy_refs: {
|
|
856
|
+
type: 'array',
|
|
857
|
+
items: { type: 'string' },
|
|
858
|
+
description: 'Policy IDs this test verifies (e.g., ["POL-0001"])',
|
|
859
|
+
},
|
|
860
|
+
test_cases: {
|
|
861
|
+
type: 'array',
|
|
862
|
+
items: {
|
|
863
|
+
type: 'object',
|
|
864
|
+
properties: {
|
|
865
|
+
name: { type: 'string', description: 'Test case name' },
|
|
866
|
+
description: { type: 'string' },
|
|
867
|
+
steps: { type: 'array', items: { type: 'string' } },
|
|
868
|
+
expected: { type: 'string', description: 'Expected outcome' },
|
|
869
|
+
tags: { type: 'array', items: { type: 'string' } },
|
|
870
|
+
},
|
|
871
|
+
required: ['name', 'expected'],
|
|
872
|
+
},
|
|
873
|
+
description: 'Test cases in this spec',
|
|
874
|
+
},
|
|
875
|
+
setup: {
|
|
876
|
+
type: 'string',
|
|
877
|
+
description: 'Setup instructions for the tests',
|
|
878
|
+
},
|
|
879
|
+
teardown: {
|
|
880
|
+
type: 'string',
|
|
881
|
+
description: 'Teardown instructions for the tests',
|
|
882
|
+
},
|
|
883
|
+
tags: {
|
|
884
|
+
type: 'array',
|
|
885
|
+
items: { type: 'string' },
|
|
886
|
+
description: 'Tags for categorization',
|
|
887
|
+
},
|
|
888
|
+
},
|
|
889
|
+
required: ['title', 'description', 'type', 'test_cases'],
|
|
890
|
+
},
|
|
891
|
+
},
|
|
892
|
+
handler: async (args) => {
|
|
893
|
+
try {
|
|
894
|
+
requireFields(args, 'title', 'description', 'type', 'test_cases');
|
|
895
|
+
const result = await createTestSpec(args);
|
|
896
|
+
return {
|
|
897
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
898
|
+
isError: isTestSpecError(result),
|
|
899
|
+
};
|
|
900
|
+
}
|
|
901
|
+
catch (err) {
|
|
902
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
903
|
+
}
|
|
904
|
+
},
|
|
905
|
+
};
|
|
906
|
+
export const sentinelListTestSpecsTool = {
|
|
907
|
+
definition: {
|
|
908
|
+
name: 'sentinel_listTestSpecs',
|
|
909
|
+
description: 'List all test specifications for a project.',
|
|
910
|
+
annotations: {
|
|
911
|
+
title: 'List Test Specs',
|
|
912
|
+
readOnlyHint: true,
|
|
913
|
+
destructiveHint: false,
|
|
914
|
+
},
|
|
915
|
+
inputSchema: {
|
|
916
|
+
type: 'object',
|
|
917
|
+
properties: {
|
|
918
|
+
projectId: {
|
|
919
|
+
type: 'string',
|
|
920
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
921
|
+
},
|
|
922
|
+
type: {
|
|
923
|
+
type: 'string',
|
|
924
|
+
enum: ['unit', 'integration', 'e2e', 'contract', 'property', 'manual'],
|
|
925
|
+
description: 'Filter by test type',
|
|
926
|
+
},
|
|
927
|
+
priority: {
|
|
928
|
+
type: 'string',
|
|
929
|
+
enum: ['critical', 'high', 'medium', 'low'],
|
|
930
|
+
description: 'Filter by priority',
|
|
931
|
+
},
|
|
932
|
+
policy_ref: {
|
|
933
|
+
type: 'string',
|
|
934
|
+
description: 'Filter by policy reference',
|
|
935
|
+
},
|
|
936
|
+
tags: {
|
|
937
|
+
type: 'array',
|
|
938
|
+
items: { type: 'string' },
|
|
939
|
+
description: 'Filter by tags (matches any)',
|
|
940
|
+
},
|
|
941
|
+
},
|
|
942
|
+
},
|
|
943
|
+
},
|
|
944
|
+
handler: async (args) => {
|
|
945
|
+
try {
|
|
946
|
+
const result = await listTestSpecs(args);
|
|
947
|
+
return {
|
|
948
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
949
|
+
isError: isTestSpecError(result),
|
|
950
|
+
};
|
|
951
|
+
}
|
|
952
|
+
catch (err) {
|
|
953
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
954
|
+
}
|
|
955
|
+
},
|
|
956
|
+
};
|
|
957
|
+
export const sentinelCompileTestsTool = {
|
|
958
|
+
definition: {
|
|
959
|
+
name: 'sentinel_compileTests',
|
|
960
|
+
description: 'Compile all test specifications into documentation (manifest.md and/or manifest.json).',
|
|
961
|
+
annotations: {
|
|
962
|
+
title: 'Compile Tests',
|
|
963
|
+
readOnlyHint: false,
|
|
964
|
+
destructiveHint: false,
|
|
965
|
+
idempotentHint: true,
|
|
966
|
+
},
|
|
967
|
+
inputSchema: {
|
|
968
|
+
type: 'object',
|
|
969
|
+
properties: {
|
|
970
|
+
projectId: {
|
|
971
|
+
type: 'string',
|
|
972
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
973
|
+
},
|
|
974
|
+
output_format: {
|
|
975
|
+
type: 'string',
|
|
976
|
+
enum: ['markdown', 'json', 'both'],
|
|
977
|
+
description: 'Output format (default: markdown)',
|
|
978
|
+
},
|
|
979
|
+
include_deprecated: {
|
|
980
|
+
type: 'boolean',
|
|
981
|
+
description: 'Include deprecated test specs',
|
|
982
|
+
},
|
|
983
|
+
},
|
|
984
|
+
},
|
|
985
|
+
},
|
|
986
|
+
handler: async (args) => {
|
|
987
|
+
try {
|
|
988
|
+
const result = await compileTests(args);
|
|
989
|
+
return {
|
|
990
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
991
|
+
isError: isTestSpecError(result),
|
|
992
|
+
};
|
|
993
|
+
}
|
|
994
|
+
catch (err) {
|
|
995
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
996
|
+
}
|
|
997
|
+
},
|
|
998
|
+
};
|
|
999
|
+
export const sentinelAuditPoliciesTool = {
|
|
1000
|
+
definition: {
|
|
1001
|
+
name: 'sentinel_auditPolicies',
|
|
1002
|
+
description: 'Audit policy compliance. Checks documentation freshness and runs enforcement checks.',
|
|
1003
|
+
annotations: {
|
|
1004
|
+
title: 'Audit Policies',
|
|
1005
|
+
readOnlyHint: true,
|
|
1006
|
+
destructiveHint: false,
|
|
1007
|
+
},
|
|
1008
|
+
inputSchema: {
|
|
1009
|
+
type: 'object',
|
|
1010
|
+
properties: {
|
|
1011
|
+
projectId: {
|
|
1012
|
+
type: 'string',
|
|
1013
|
+
description: 'Optional project identifier. Uses default project if not specified.',
|
|
1014
|
+
},
|
|
1015
|
+
check_freshness: {
|
|
1016
|
+
type: 'boolean',
|
|
1017
|
+
description: 'Check if compiled docs are stale (default: true)',
|
|
1018
|
+
},
|
|
1019
|
+
run_enforcement: {
|
|
1020
|
+
type: 'boolean',
|
|
1021
|
+
description: 'Run enforcement checks (future feature)',
|
|
1022
|
+
},
|
|
1023
|
+
},
|
|
1024
|
+
},
|
|
1025
|
+
},
|
|
1026
|
+
handler: async (args) => {
|
|
1027
|
+
try {
|
|
1028
|
+
const result = await auditPolicies(args);
|
|
1029
|
+
return {
|
|
1030
|
+
content: [{ type: 'text', text: JSON.stringify(result, null, 2) }],
|
|
1031
|
+
isError: isTestSpecError(result),
|
|
1032
|
+
};
|
|
1033
|
+
}
|
|
1034
|
+
catch (err) {
|
|
1035
|
+
return toolError(err instanceof Error ? err.message : String(err));
|
|
1036
|
+
}
|
|
1037
|
+
},
|
|
1038
|
+
};
|
|
1039
|
+
// ============================================================================
|
|
1040
|
+
// Domain Export
|
|
1041
|
+
// ============================================================================
|
|
1042
|
+
export const sentinelTools = [
|
|
1043
|
+
// Issue tools (markdown-based)
|
|
1044
|
+
sentinelCreateIssueTool,
|
|
1045
|
+
sentinelCloseIssueTool,
|
|
1046
|
+
sentinelListRepoIssuesTool,
|
|
1047
|
+
// Epic tools
|
|
1048
|
+
sentinelLogEpicTool,
|
|
1049
|
+
sentinelListEpicsTool,
|
|
1050
|
+
sentinelReadEpicTool,
|
|
1051
|
+
sentinelListEpicIssuesTool,
|
|
1052
|
+
sentinelResolveEpicTool,
|
|
1053
|
+
// Data inspector tools
|
|
1054
|
+
sentinelScanTool,
|
|
1055
|
+
sentinelScanDataTool,
|
|
1056
|
+
// YAML issue tools
|
|
1057
|
+
sentinelListIssuesTool,
|
|
1058
|
+
sentinelCreateIssueTool2,
|
|
1059
|
+
sentinelReadIssueTool,
|
|
1060
|
+
sentinelUpdateIssueTool,
|
|
1061
|
+
// Test spec tools
|
|
1062
|
+
sentinelCreateTestSpecTool,
|
|
1063
|
+
sentinelListTestSpecsTool,
|
|
1064
|
+
sentinelCompileTestsTool,
|
|
1065
|
+
sentinelAuditPoliciesTool,
|
|
1066
|
+
];
|
|
1067
|
+
//# sourceMappingURL=index.js.map
|