@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,647 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// Workflow Domain Tools
|
|
3
|
+
// ============================================================================
|
|
4
|
+
// High-level workflow tools that chain existing Decibel tools.
|
|
5
|
+
// These are the primary interface for AI assistants.
|
|
6
|
+
// ============================================================================
|
|
7
|
+
import path from 'path';
|
|
8
|
+
import { resolveProjectPaths } from '../projectRegistry.js';
|
|
9
|
+
import { listRepoIssues, listEpics, isProjectResolutionError } from './sentinel.js';
|
|
10
|
+
import { getRoadmapHealth } from './roadmap.js';
|
|
11
|
+
import { listFriction } from './friction.js';
|
|
12
|
+
import { nextActions, roadmapProgress, isOracleError } from './oracle.js';
|
|
13
|
+
import { listIssuesForProject } from '../sentinelIssues.js';
|
|
14
|
+
import { listProvenance } from './provenance.js';
|
|
15
|
+
import { listLearnings } from './learnings.js';
|
|
16
|
+
import { scanData } from './sentinel-scan-data.js';
|
|
17
|
+
import { auditorTriage, auditorLogHealth, auditorHealthHistory, isAuditorError } from './auditor.js';
|
|
18
|
+
import { gitLogRecent, gitStatus, isGitErrorResult, } from './git.js';
|
|
19
|
+
// ============================================================================
|
|
20
|
+
// Helpers
|
|
21
|
+
// ============================================================================
|
|
22
|
+
function makeError(message, details) {
|
|
23
|
+
return { error: message, details };
|
|
24
|
+
}
|
|
25
|
+
function isError(result) {
|
|
26
|
+
return typeof result === 'object' && result !== null && 'error' in result;
|
|
27
|
+
}
|
|
28
|
+
// Minimum interval between automatic health snapshots (4 hours in ms)
|
|
29
|
+
const HEALTH_SNAPSHOT_MIN_INTERVAL_MS = 4 * 60 * 60 * 1000;
|
|
30
|
+
/**
|
|
31
|
+
* Check if enough time has passed since the last health snapshot.
|
|
32
|
+
* Returns true if a new snapshot should be taken.
|
|
33
|
+
*/
|
|
34
|
+
async function shouldLogHealthSnapshot(projectId) {
|
|
35
|
+
try {
|
|
36
|
+
const historyResult = await auditorHealthHistory({ projectId, limit: 1 });
|
|
37
|
+
if ('error' in historyResult) {
|
|
38
|
+
// No history exists, should create first snapshot
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
if (historyResult.entries.length === 0) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
const lastTimestamp = new Date(historyResult.entries[historyResult.entries.length - 1].timestamp);
|
|
45
|
+
const now = new Date();
|
|
46
|
+
const elapsed = now.getTime() - lastTimestamp.getTime();
|
|
47
|
+
return elapsed >= HEALTH_SNAPSHOT_MIN_INTERVAL_MS;
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
// If we can't check, don't log (fail safe)
|
|
51
|
+
return false;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// ============================================================================
|
|
55
|
+
// workflow_status
|
|
56
|
+
// ============================================================================
|
|
57
|
+
export async function workflowStatus(input) {
|
|
58
|
+
let resolved;
|
|
59
|
+
try {
|
|
60
|
+
resolved = resolveProjectPaths(input.projectId);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return makeError('Failed to resolve project path');
|
|
64
|
+
}
|
|
65
|
+
const timestamp = new Date().toISOString();
|
|
66
|
+
const projectId = resolved.id || path.basename(resolved.projectPath);
|
|
67
|
+
// Git status
|
|
68
|
+
const gitResult = await gitStatus({ projectId: input.projectId });
|
|
69
|
+
const git = isGitErrorResult(gitResult)
|
|
70
|
+
? { branch: 'unknown', hasChanges: false, ahead: 0, behind: 0 }
|
|
71
|
+
: {
|
|
72
|
+
branch: gitResult.branch,
|
|
73
|
+
hasChanges: gitResult.hasChanges,
|
|
74
|
+
ahead: gitResult.ahead,
|
|
75
|
+
behind: gitResult.behind,
|
|
76
|
+
};
|
|
77
|
+
// Issues
|
|
78
|
+
const issuesResult = await listRepoIssues({ projectId: input.projectId });
|
|
79
|
+
const issues = {
|
|
80
|
+
open: 0,
|
|
81
|
+
inProgress: 0,
|
|
82
|
+
blocked: 0,
|
|
83
|
+
recentlyUpdated: [],
|
|
84
|
+
};
|
|
85
|
+
if (!('error' in issuesResult)) {
|
|
86
|
+
for (const issue of issuesResult.issues) {
|
|
87
|
+
if (issue.status === 'open')
|
|
88
|
+
issues.open++;
|
|
89
|
+
if (issue.status === 'in_progress')
|
|
90
|
+
issues.inProgress++;
|
|
91
|
+
if (issue.status === 'blocked')
|
|
92
|
+
issues.blocked++;
|
|
93
|
+
}
|
|
94
|
+
issues.recentlyUpdated = issuesResult.issues
|
|
95
|
+
.slice(0, 5)
|
|
96
|
+
.map(i => ({ id: i.id, title: i.title, status: i.status }));
|
|
97
|
+
}
|
|
98
|
+
// Health
|
|
99
|
+
const healthResult = await getRoadmapHealth({ projectId: input.projectId || projectId });
|
|
100
|
+
const health = {
|
|
101
|
+
score: 0,
|
|
102
|
+
atRisk: [],
|
|
103
|
+
behind: [],
|
|
104
|
+
};
|
|
105
|
+
if (!('error' in healthResult) && healthResult.epics) {
|
|
106
|
+
const epics = healthResult.epics;
|
|
107
|
+
const scores = epics
|
|
108
|
+
.filter((e) => e.health_score !== undefined)
|
|
109
|
+
.map((e) => e.health_score);
|
|
110
|
+
health.score = scores.length > 0
|
|
111
|
+
? Math.round(scores.reduce((a, b) => a + b, 0) / scores.length)
|
|
112
|
+
: 100;
|
|
113
|
+
health.atRisk = epics
|
|
114
|
+
.filter((e) => e.health_score !== undefined && e.health_score < 70)
|
|
115
|
+
.map((e) => e.epic_id);
|
|
116
|
+
}
|
|
117
|
+
// Friction
|
|
118
|
+
const frictionResult = await listFriction({ projectId: input.projectId });
|
|
119
|
+
const friction = {
|
|
120
|
+
total: 0,
|
|
121
|
+
topBySignal: [],
|
|
122
|
+
};
|
|
123
|
+
if (!('error' in frictionResult)) {
|
|
124
|
+
friction.total = frictionResult.friction.length;
|
|
125
|
+
friction.topBySignal = frictionResult.friction
|
|
126
|
+
.sort((a, b) => (b.signal_count || 0) - (a.signal_count || 0))
|
|
127
|
+
.slice(0, 3)
|
|
128
|
+
.map(f => ({ context: f.context, signal: f.signal_count || 1 }));
|
|
129
|
+
}
|
|
130
|
+
// Code Quality (via Auditor)
|
|
131
|
+
let codeQuality;
|
|
132
|
+
const auditResult = await auditorTriage({ projectId: input.projectId });
|
|
133
|
+
if (!isAuditorError(auditResult)) {
|
|
134
|
+
codeQuality = {
|
|
135
|
+
godFiles: auditResult.issues.filter(i => i.smell === 'god_file').length,
|
|
136
|
+
highSeverity: auditResult.summary.high,
|
|
137
|
+
mediumSeverity: auditResult.summary.medium,
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Recommendations
|
|
141
|
+
const oracleResult = await nextActions({ projectId: input.projectId });
|
|
142
|
+
const recommendations = !('error' in oracleResult)
|
|
143
|
+
? oracleResult.actions.slice(0, 3).map(a => a.description)
|
|
144
|
+
: [];
|
|
145
|
+
return {
|
|
146
|
+
project: projectId,
|
|
147
|
+
timestamp,
|
|
148
|
+
git,
|
|
149
|
+
issues,
|
|
150
|
+
health,
|
|
151
|
+
friction,
|
|
152
|
+
codeQuality,
|
|
153
|
+
recommendations,
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
// ============================================================================
|
|
157
|
+
// workflow_preflight
|
|
158
|
+
// ============================================================================
|
|
159
|
+
export async function workflowPreflight(input) {
|
|
160
|
+
let resolved;
|
|
161
|
+
try {
|
|
162
|
+
resolved = resolveProjectPaths(input.projectId);
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
return makeError('Failed to resolve project path');
|
|
166
|
+
}
|
|
167
|
+
const timestamp = new Date().toISOString();
|
|
168
|
+
const checks = [];
|
|
169
|
+
const strict = input.strict ?? false;
|
|
170
|
+
// Check 1: Git status (uncommitted changes)
|
|
171
|
+
const gitResult = await gitStatus({ projectId: input.projectId });
|
|
172
|
+
if (isGitErrorResult(gitResult)) {
|
|
173
|
+
checks.push({
|
|
174
|
+
name: 'Git Status',
|
|
175
|
+
status: 'warn',
|
|
176
|
+
message: 'Could not check git status',
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
else if (gitResult.hasChanges) {
|
|
180
|
+
checks.push({
|
|
181
|
+
name: 'Git Status',
|
|
182
|
+
status: 'warn',
|
|
183
|
+
message: `Uncommitted changes: ${gitResult.staged} staged, ${gitResult.modified} modified, ${gitResult.untracked} untracked`,
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
else {
|
|
187
|
+
checks.push({
|
|
188
|
+
name: 'Git Status',
|
|
189
|
+
status: 'pass',
|
|
190
|
+
message: 'Working directory clean',
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
// Check 2: Sentinel scan
|
|
194
|
+
const scanResult = await scanData({
|
|
195
|
+
projectId: input.projectId || resolved.id,
|
|
196
|
+
flags: ['orphans', 'stale', 'invalid'],
|
|
197
|
+
});
|
|
198
|
+
if ('error' in scanResult) {
|
|
199
|
+
checks.push({
|
|
200
|
+
name: 'Data Validation',
|
|
201
|
+
status: 'warn',
|
|
202
|
+
message: 'Could not run sentinel scan',
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
else {
|
|
206
|
+
const orphanCount = (scanResult.orphans?.epics?.length || 0) + (scanResult.orphans?.issues?.length || 0);
|
|
207
|
+
const staleCount = (scanResult.stale?.epics?.length || 0) + (scanResult.stale?.issues?.length || 0);
|
|
208
|
+
const hasIssues = orphanCount > 0 || staleCount > 0;
|
|
209
|
+
checks.push({
|
|
210
|
+
name: 'Data Validation',
|
|
211
|
+
status: hasIssues ? 'warn' : 'pass',
|
|
212
|
+
message: hasIssues
|
|
213
|
+
? `Found ${orphanCount} orphans, ${staleCount} stale items`
|
|
214
|
+
: 'All data validated',
|
|
215
|
+
details: [
|
|
216
|
+
...(scanResult.orphans?.epics || []).map((o) => `Orphan epic: ${o}`),
|
|
217
|
+
...(scanResult.orphans?.issues || []).map((o) => `Orphan issue: ${o}`),
|
|
218
|
+
...(scanResult.stale?.epics || []).map((s) => `Stale epic: ${s}`),
|
|
219
|
+
...(scanResult.stale?.issues || []).map((s) => `Stale issue: ${s}`),
|
|
220
|
+
],
|
|
221
|
+
});
|
|
222
|
+
}
|
|
223
|
+
// Check 3: Code Quality (via Auditor)
|
|
224
|
+
const auditResult = await auditorTriage({ projectId: input.projectId });
|
|
225
|
+
if (isAuditorError(auditResult)) {
|
|
226
|
+
checks.push({
|
|
227
|
+
name: 'Code Quality',
|
|
228
|
+
status: 'warn',
|
|
229
|
+
message: 'Could not run code audit',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
const godFiles = auditResult.issues.filter(i => i.smell === 'god_file');
|
|
234
|
+
const highSeverity = auditResult.summary.high;
|
|
235
|
+
if (highSeverity > 0) {
|
|
236
|
+
checks.push({
|
|
237
|
+
name: 'Code Quality',
|
|
238
|
+
status: 'warn',
|
|
239
|
+
message: `${highSeverity} high-severity code issues`,
|
|
240
|
+
details: auditResult.issues
|
|
241
|
+
.filter(i => i.severity === 'high')
|
|
242
|
+
.slice(0, 5)
|
|
243
|
+
.map(i => `${i.file}: ${i.message}`),
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
else if (godFiles.length > 0) {
|
|
247
|
+
checks.push({
|
|
248
|
+
name: 'Code Quality',
|
|
249
|
+
status: 'warn',
|
|
250
|
+
message: `${godFiles.length} files over 400 lines`,
|
|
251
|
+
details: godFiles.slice(0, 5).map(i => i.file),
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
else {
|
|
255
|
+
checks.push({
|
|
256
|
+
name: 'Code Quality',
|
|
257
|
+
status: 'pass',
|
|
258
|
+
message: 'No major code quality issues',
|
|
259
|
+
});
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
// Check 4: Blocked issues
|
|
263
|
+
const issuesResult = await listRepoIssues({ projectId: input.projectId, status: 'blocked' });
|
|
264
|
+
const blockedCount = !('error' in issuesResult) ? issuesResult.issues.length : 0;
|
|
265
|
+
checks.push({
|
|
266
|
+
name: 'Blocked Issues',
|
|
267
|
+
status: blockedCount > 0 ? 'warn' : 'pass',
|
|
268
|
+
message: blockedCount > 0
|
|
269
|
+
? `${blockedCount} blocked issues`
|
|
270
|
+
: 'No blocked issues',
|
|
271
|
+
});
|
|
272
|
+
// Calculate overall status
|
|
273
|
+
const hasFail = checks.some(c => c.status === 'fail');
|
|
274
|
+
const hasWarn = checks.some(c => c.status === 'warn');
|
|
275
|
+
const passed = !hasFail && (!strict || !hasWarn);
|
|
276
|
+
// Automatic health snapshot (if enough time has passed)
|
|
277
|
+
let healthSnapshot;
|
|
278
|
+
try {
|
|
279
|
+
const shouldLog = await shouldLogHealthSnapshot(input.projectId);
|
|
280
|
+
if (shouldLog) {
|
|
281
|
+
const logResult = await auditorLogHealth({ projectId: input.projectId });
|
|
282
|
+
if ('error' in logResult) {
|
|
283
|
+
healthSnapshot = { logged: false, reason: `skipped (${logResult.error})` };
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
healthSnapshot = { logged: true, reason: 'recorded' };
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
else {
|
|
290
|
+
healthSnapshot = { logged: false, reason: 'skipped (recent snapshot exists)' };
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
healthSnapshot = { logged: false, reason: 'skipped (error)' };
|
|
295
|
+
}
|
|
296
|
+
return {
|
|
297
|
+
passed,
|
|
298
|
+
timestamp,
|
|
299
|
+
checks,
|
|
300
|
+
summary: passed
|
|
301
|
+
? 'All checks passed'
|
|
302
|
+
: hasFail
|
|
303
|
+
? 'Preflight failed - fix issues before committing'
|
|
304
|
+
: 'Preflight passed with warnings',
|
|
305
|
+
healthSnapshot,
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
// ============================================================================
|
|
309
|
+
// workflow_ship
|
|
310
|
+
// ============================================================================
|
|
311
|
+
export async function workflowShip(input) {
|
|
312
|
+
let resolved;
|
|
313
|
+
try {
|
|
314
|
+
resolved = resolveProjectPaths(input.projectId);
|
|
315
|
+
}
|
|
316
|
+
catch {
|
|
317
|
+
return makeError('Failed to resolve project path');
|
|
318
|
+
}
|
|
319
|
+
const timestamp = new Date().toISOString();
|
|
320
|
+
const blockers = [];
|
|
321
|
+
const warnings = [];
|
|
322
|
+
const checklist = [];
|
|
323
|
+
// Run preflight first
|
|
324
|
+
const preflightResult = await workflowPreflight({ projectId: input.projectId, strict: true });
|
|
325
|
+
if (isError(preflightResult)) {
|
|
326
|
+
blockers.push('Preflight check failed to run');
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
for (const check of preflightResult.checks) {
|
|
330
|
+
if (check.status === 'fail') {
|
|
331
|
+
blockers.push(`${check.name}: ${check.message}`);
|
|
332
|
+
}
|
|
333
|
+
else if (check.status === 'warn') {
|
|
334
|
+
warnings.push(`${check.name}: ${check.message}`);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
checklist.push({
|
|
338
|
+
item: 'Preflight checks',
|
|
339
|
+
status: preflightResult.passed ? 'done' : 'blocked',
|
|
340
|
+
});
|
|
341
|
+
}
|
|
342
|
+
// Check roadmap health
|
|
343
|
+
const healthResult = await getRoadmapHealth({ projectId: input.projectId || resolved.id });
|
|
344
|
+
if (!('error' in healthResult)) {
|
|
345
|
+
const epics = (healthResult.epics || []);
|
|
346
|
+
const unhealthy = epics.filter((e) => e.health_score !== undefined && e.health_score < 50);
|
|
347
|
+
if (unhealthy.length > 0) {
|
|
348
|
+
warnings.push(`${unhealthy.length} epics with health < 50%`);
|
|
349
|
+
}
|
|
350
|
+
checklist.push({
|
|
351
|
+
item: 'Roadmap health review',
|
|
352
|
+
status: unhealthy.length === 0 ? 'done' : 'pending',
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
// Check for open blockers
|
|
356
|
+
const issuesResult = await listRepoIssues({ projectId: input.projectId, status: 'blocked' });
|
|
357
|
+
if (!('error' in issuesResult) && issuesResult.issues.length > 0) {
|
|
358
|
+
blockers.push(`${issuesResult.issues.length} blocked issues must be resolved`);
|
|
359
|
+
checklist.push({
|
|
360
|
+
item: 'Resolve blocked issues',
|
|
361
|
+
status: 'blocked',
|
|
362
|
+
});
|
|
363
|
+
}
|
|
364
|
+
else {
|
|
365
|
+
checklist.push({
|
|
366
|
+
item: 'No blocked issues',
|
|
367
|
+
status: 'done',
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
// Git status
|
|
371
|
+
const gitResult = await gitStatus({ projectId: input.projectId });
|
|
372
|
+
if (!isGitErrorResult(gitResult)) {
|
|
373
|
+
if (gitResult.hasChanges) {
|
|
374
|
+
warnings.push('Uncommitted changes in working directory');
|
|
375
|
+
checklist.push({
|
|
376
|
+
item: 'Commit all changes',
|
|
377
|
+
status: 'pending',
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
else {
|
|
381
|
+
checklist.push({
|
|
382
|
+
item: 'All changes committed',
|
|
383
|
+
status: 'done',
|
|
384
|
+
});
|
|
385
|
+
}
|
|
386
|
+
if (gitResult.ahead > 0) {
|
|
387
|
+
checklist.push({
|
|
388
|
+
item: `Push ${gitResult.ahead} commit(s)`,
|
|
389
|
+
status: 'pending',
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
const ready = blockers.length === 0;
|
|
394
|
+
const nextSteps = [];
|
|
395
|
+
if (ready) {
|
|
396
|
+
nextSteps.push('Run final tests: npm test');
|
|
397
|
+
nextSteps.push('Create release tag: git tag -a vX.Y.Z -m "Release X.Y.Z"');
|
|
398
|
+
nextSteps.push('Push with tags: git push origin main --tags');
|
|
399
|
+
}
|
|
400
|
+
else {
|
|
401
|
+
nextSteps.push('Fix blockers before shipping');
|
|
402
|
+
for (const blocker of blockers) {
|
|
403
|
+
nextSteps.push(`→ ${blocker}`);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
// Automatic health snapshot on ship (always log if ready, respects interval otherwise)
|
|
407
|
+
let healthSnapshot;
|
|
408
|
+
try {
|
|
409
|
+
// For ship, we always log if ready (this is a significant milestone)
|
|
410
|
+
// Otherwise, respect the minimum interval
|
|
411
|
+
const shouldLog = ready || await shouldLogHealthSnapshot(input.projectId);
|
|
412
|
+
if (shouldLog) {
|
|
413
|
+
const logResult = await auditorLogHealth({ projectId: input.projectId });
|
|
414
|
+
if ('error' in logResult) {
|
|
415
|
+
healthSnapshot = { logged: false, reason: `skipped (${logResult.error})` };
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
healthSnapshot = { logged: true, reason: ready ? 'recorded (ship milestone)' : 'recorded' };
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
healthSnapshot = { logged: false, reason: 'skipped (recent snapshot exists)' };
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch {
|
|
426
|
+
healthSnapshot = { logged: false, reason: 'skipped (error)' };
|
|
427
|
+
}
|
|
428
|
+
return {
|
|
429
|
+
ready,
|
|
430
|
+
timestamp,
|
|
431
|
+
blockers,
|
|
432
|
+
warnings,
|
|
433
|
+
checklist,
|
|
434
|
+
nextSteps,
|
|
435
|
+
healthSnapshot,
|
|
436
|
+
};
|
|
437
|
+
}
|
|
438
|
+
// ============================================================================
|
|
439
|
+
// workflow_investigate
|
|
440
|
+
// ============================================================================
|
|
441
|
+
export async function workflowInvestigate(input) {
|
|
442
|
+
let resolved;
|
|
443
|
+
try {
|
|
444
|
+
resolved = resolveProjectPaths(input.projectId);
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
return makeError('Failed to resolve project path');
|
|
448
|
+
}
|
|
449
|
+
const timestamp = new Date().toISOString();
|
|
450
|
+
// Recent commits
|
|
451
|
+
const gitLogResult = await gitLogRecent({
|
|
452
|
+
projectId: input.projectId,
|
|
453
|
+
count: 15,
|
|
454
|
+
grep: input.context, // If context provided, search commit messages
|
|
455
|
+
});
|
|
456
|
+
const recentCommits = isGitErrorResult(gitLogResult)
|
|
457
|
+
? []
|
|
458
|
+
: gitLogResult.commits;
|
|
459
|
+
// Recent issues (IssueSummary doesn't have timestamps, so just take first 10)
|
|
460
|
+
const issuesResult = await listRepoIssues({ projectId: input.projectId });
|
|
461
|
+
const recentIssues = ('error' in issuesResult)
|
|
462
|
+
? []
|
|
463
|
+
: issuesResult.issues
|
|
464
|
+
.slice(0, 10)
|
|
465
|
+
.map(i => ({
|
|
466
|
+
id: i.id,
|
|
467
|
+
title: i.title,
|
|
468
|
+
status: i.status,
|
|
469
|
+
updated: '', // Not available in IssueSummary
|
|
470
|
+
}));
|
|
471
|
+
// Related friction
|
|
472
|
+
const frictionResult = await listFriction({ projectId: input.projectId });
|
|
473
|
+
const relatedFriction = ('error' in frictionResult)
|
|
474
|
+
? []
|
|
475
|
+
: frictionResult.friction
|
|
476
|
+
.filter(f => !input.context ||
|
|
477
|
+
f.context.toLowerCase().includes(input.context.toLowerCase()) ||
|
|
478
|
+
f.description.toLowerCase().includes(input.context.toLowerCase()))
|
|
479
|
+
.slice(0, 5)
|
|
480
|
+
.map(f => ({ context: f.context, description: f.description }));
|
|
481
|
+
// Recent learnings
|
|
482
|
+
const learningsResult = await listLearnings({ projectId: input.projectId });
|
|
483
|
+
const recentLearnings = ('error' in learningsResult)
|
|
484
|
+
? []
|
|
485
|
+
: (learningsResult.entries || [])
|
|
486
|
+
.slice(0, 5)
|
|
487
|
+
.map((l) => ({
|
|
488
|
+
date: l.timestamp || '',
|
|
489
|
+
content: l.title || l.content || '',
|
|
490
|
+
}));
|
|
491
|
+
// Generate suggestions based on findings
|
|
492
|
+
const suggestions = [];
|
|
493
|
+
if (recentCommits.length > 0) {
|
|
494
|
+
suggestions.push(`Review recent commits - last change: "${recentCommits[0].message}"`);
|
|
495
|
+
}
|
|
496
|
+
if (relatedFriction.length > 0) {
|
|
497
|
+
suggestions.push(`Check friction points - ${relatedFriction.length} related issues found`);
|
|
498
|
+
}
|
|
499
|
+
if (recentIssues.some(i => i.status === 'blocked')) {
|
|
500
|
+
suggestions.push('Blocked issues may be related to the problem');
|
|
501
|
+
}
|
|
502
|
+
suggestions.push('Use git_find_removal to search for removed code');
|
|
503
|
+
suggestions.push('Use git_blame_context to check recent changes to specific files');
|
|
504
|
+
return {
|
|
505
|
+
timestamp,
|
|
506
|
+
recentCommits,
|
|
507
|
+
recentIssues,
|
|
508
|
+
relatedFriction,
|
|
509
|
+
recentLearnings,
|
|
510
|
+
suggestions,
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
export async function projectSnapshot(input) {
|
|
514
|
+
let resolved;
|
|
515
|
+
try {
|
|
516
|
+
resolved = resolveProjectPaths(input.projectId);
|
|
517
|
+
}
|
|
518
|
+
catch {
|
|
519
|
+
return makeError('Failed to resolve project path');
|
|
520
|
+
}
|
|
521
|
+
const projectId = resolved.id;
|
|
522
|
+
const depth = input.depth ?? 'full';
|
|
523
|
+
const lines = [];
|
|
524
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
525
|
+
lines.push(`## Briefing: ${projectId} (${today})`);
|
|
526
|
+
// ---- Issues ----
|
|
527
|
+
try {
|
|
528
|
+
const issues = await listIssuesForProject(projectId);
|
|
529
|
+
const open = issues.filter(i => i.status === 'open');
|
|
530
|
+
const inProgress = issues.filter(i => i.status === 'in_progress');
|
|
531
|
+
const blocked = issues.filter(i => i.status === 'blocked');
|
|
532
|
+
lines.push(`Issues: ${open.length} open, ${inProgress.length} in progress, ${blocked.length} blocked`);
|
|
533
|
+
// Show high priority and blocked issues
|
|
534
|
+
const urgent = [
|
|
535
|
+
...blocked,
|
|
536
|
+
...open.filter(i => i.priority === 'high'),
|
|
537
|
+
...inProgress.filter(i => i.priority === 'high'),
|
|
538
|
+
];
|
|
539
|
+
if (urgent.length > 0) {
|
|
540
|
+
lines.push('');
|
|
541
|
+
lines.push('### Priorities');
|
|
542
|
+
for (const issue of urgent.slice(0, 5)) {
|
|
543
|
+
const badge = issue.status === 'blocked' ? 'BLOCKED' : issue.priority ?? 'med';
|
|
544
|
+
lines.push(`- ${issue.id} [${badge}] ${issue.title}`);
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
catch {
|
|
549
|
+
lines.push('Issues: (unavailable)');
|
|
550
|
+
}
|
|
551
|
+
// ---- Epics ----
|
|
552
|
+
try {
|
|
553
|
+
const epicsResult = await listEpics({ projectId });
|
|
554
|
+
if (!isProjectResolutionError(epicsResult) && epicsResult.epics.length > 0) {
|
|
555
|
+
const active = epicsResult.epics.filter(e => e.status === 'in_progress');
|
|
556
|
+
const planned = epicsResult.epics.filter(e => e.status === 'planned');
|
|
557
|
+
const shipped = epicsResult.epics.filter(e => e.status === 'shipped');
|
|
558
|
+
lines.push('');
|
|
559
|
+
lines.push(`### Epics (${active.length} active, ${planned.length} planned, ${shipped.length} shipped)`);
|
|
560
|
+
for (const epic of active) {
|
|
561
|
+
lines.push(`- ${epic.id} "${epic.title}" — ${epic.status}`);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
catch { /* optional */ }
|
|
566
|
+
// ---- Roadmap Health ----
|
|
567
|
+
if (depth === 'full') {
|
|
568
|
+
try {
|
|
569
|
+
const roadmap = await roadmapProgress({ projectId, dryRun: true, noSignals: false });
|
|
570
|
+
if (!isOracleError(roadmap) && roadmap.milestones.length > 0) {
|
|
571
|
+
const atRisk = roadmap.milestones.filter(m => m.status === 'at_risk' || m.status === 'behind');
|
|
572
|
+
if (atRisk.length > 0) {
|
|
573
|
+
lines.push('');
|
|
574
|
+
lines.push('### Milestones at Risk');
|
|
575
|
+
for (const ms of atRisk) {
|
|
576
|
+
lines.push(`- ${ms.id} "${ms.label}" — ${ms.progress_percent}% (${ms.status.replace('_', ' ')})`);
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
if (roadmap.signals) {
|
|
580
|
+
const { blocking_issues, high_severity_issues, friction_points } = roadmap.signals;
|
|
581
|
+
if (blocking_issues > 0 || high_severity_issues > 0 || friction_points > 0) {
|
|
582
|
+
const parts = [];
|
|
583
|
+
if (blocking_issues > 0)
|
|
584
|
+
parts.push(`${blocking_issues} blocking`);
|
|
585
|
+
if (high_severity_issues > 0)
|
|
586
|
+
parts.push(`${high_severity_issues} high-severity`);
|
|
587
|
+
if (friction_points > 0)
|
|
588
|
+
parts.push(`${friction_points} friction`);
|
|
589
|
+
lines.push(`Signals: ${parts.join(', ')}`);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
catch { /* optional */ }
|
|
595
|
+
}
|
|
596
|
+
// ---- Friction ----
|
|
597
|
+
try {
|
|
598
|
+
const frictionResult = await listFriction({ projectId, status: 'open', limit: 3 });
|
|
599
|
+
if (!('error' in frictionResult) && frictionResult.friction.length > 0) {
|
|
600
|
+
lines.push('');
|
|
601
|
+
lines.push('### Friction');
|
|
602
|
+
for (const f of frictionResult.friction) {
|
|
603
|
+
lines.push(`- ${f.id} "${f.context}" (${f.impact}, ${f.signal_count}x)`);
|
|
604
|
+
}
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
catch { /* optional */ }
|
|
608
|
+
// ---- Next Actions ----
|
|
609
|
+
try {
|
|
610
|
+
const actionsResult = await nextActions({ projectId });
|
|
611
|
+
if (!('error' in actionsResult) && actionsResult.actions.length > 0) {
|
|
612
|
+
lines.push('');
|
|
613
|
+
lines.push('### Recommended Next');
|
|
614
|
+
for (const action of actionsResult.actions.slice(0, 3)) {
|
|
615
|
+
lines.push(`- ${action.description}`);
|
|
616
|
+
}
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
catch { /* optional */ }
|
|
620
|
+
// ---- Recent Activity (full depth only) ----
|
|
621
|
+
if (depth === 'full') {
|
|
622
|
+
try {
|
|
623
|
+
const provResult = await listProvenance({ projectId, limit: 5 });
|
|
624
|
+
if (!('error' in provResult) && provResult.events.length > 0) {
|
|
625
|
+
lines.push('');
|
|
626
|
+
lines.push('### Recent Activity');
|
|
627
|
+
for (const evt of provResult.events.slice(0, 5)) {
|
|
628
|
+
const ts = evt.timestamp.slice(0, 10);
|
|
629
|
+
lines.push(`- [${ts}] ${evt.action}: ${evt.summary || evt.artifact_refs.join(', ')}`);
|
|
630
|
+
}
|
|
631
|
+
}
|
|
632
|
+
}
|
|
633
|
+
catch { /* optional */ }
|
|
634
|
+
}
|
|
635
|
+
return {
|
|
636
|
+
briefing: lines.join('\n'),
|
|
637
|
+
project_id: projectId,
|
|
638
|
+
generated_at: new Date().toISOString(),
|
|
639
|
+
};
|
|
640
|
+
}
|
|
641
|
+
// ============================================================================
|
|
642
|
+
// Exports
|
|
643
|
+
// ============================================================================
|
|
644
|
+
export function isWorkflowError(result) {
|
|
645
|
+
return typeof result === 'object' && result !== null && 'error' in result;
|
|
646
|
+
}
|
|
647
|
+
//# sourceMappingURL=workflow.js.map
|