@paths.design/caws-cli 10.2.0 → 11.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +125 -374
- package/dist/index.js +43 -785
- package/dist/shell/binding/resolve-binding.d.ts +4 -0
- package/dist/shell/binding/resolve-binding.d.ts.map +1 -0
- package/dist/shell/binding/resolve-binding.js +228 -0
- package/dist/shell/binding/resolve-binding.js.map +1 -0
- package/dist/shell/binding/types.d.ts +42 -0
- package/dist/shell/binding/types.d.ts.map +1 -0
- package/dist/shell/binding/types.js +21 -0
- package/dist/shell/binding/types.js.map +1 -0
- package/dist/shell/commands/claim.d.ts +14 -0
- package/dist/shell/commands/claim.d.ts.map +1 -0
- package/dist/shell/commands/claim.js +197 -0
- package/dist/shell/commands/claim.js.map +1 -0
- package/dist/shell/commands/doctor.d.ts +13 -0
- package/dist/shell/commands/doctor.d.ts.map +1 -0
- package/dist/shell/commands/doctor.js +97 -0
- package/dist/shell/commands/doctor.js.map +1 -0
- package/dist/shell/commands/evidence.d.ts +28 -0
- package/dist/shell/commands/evidence.d.ts.map +1 -0
- package/dist/shell/commands/evidence.js +166 -0
- package/dist/shell/commands/evidence.js.map +1 -0
- package/dist/shell/commands/gates.d.ts +19 -0
- package/dist/shell/commands/gates.d.ts.map +1 -0
- package/dist/shell/commands/gates.js +181 -0
- package/dist/shell/commands/gates.js.map +1 -0
- package/dist/shell/commands/init.d.ts +8 -0
- package/dist/shell/commands/init.d.ts.map +1 -0
- package/dist/shell/commands/init.js +64 -0
- package/dist/shell/commands/init.js.map +1 -0
- package/dist/shell/commands/scope.d.ts +11 -0
- package/dist/shell/commands/scope.d.ts.map +1 -0
- package/dist/shell/commands/scope.js +92 -0
- package/dist/shell/commands/scope.js.map +1 -0
- package/dist/shell/commands/status.d.ts +15 -0
- package/dist/shell/commands/status.d.ts.map +1 -0
- package/dist/shell/commands/status.js +106 -0
- package/dist/shell/commands/status.js.map +1 -0
- package/dist/shell/commands/waiver.d.ts +38 -0
- package/dist/shell/commands/waiver.d.ts.map +1 -0
- package/dist/shell/commands/waiver.js +240 -0
- package/dist/shell/commands/waiver.js.map +1 -0
- package/dist/shell/gates/disposition.d.ts +23 -0
- package/dist/shell/gates/disposition.d.ts.map +1 -0
- package/dist/shell/gates/disposition.js +87 -0
- package/dist/shell/gates/disposition.js.map +1 -0
- package/dist/shell/gates/gate-result-contract.d.ts +39 -0
- package/dist/shell/gates/gate-result-contract.d.ts.map +1 -0
- package/dist/shell/gates/gate-result-contract.js +150 -0
- package/dist/shell/gates/gate-result-contract.js.map +1 -0
- package/dist/shell/gates/quality-gates-adapter.d.ts +55 -0
- package/dist/shell/gates/quality-gates-adapter.d.ts.map +1 -0
- package/dist/shell/gates/quality-gates-adapter.js +161 -0
- package/dist/shell/gates/quality-gates-adapter.js.map +1 -0
- package/dist/shell/gates/waiver-filter.d.ts +58 -0
- package/dist/shell/gates/waiver-filter.d.ts.map +1 -0
- package/dist/shell/gates/waiver-filter.js +119 -0
- package/dist/shell/gates/waiver-filter.js.map +1 -0
- package/dist/shell/index.d.ts +50 -0
- package/dist/shell/index.d.ts.map +1 -0
- package/dist/shell/index.js +73 -0
- package/dist/shell/index.js.map +1 -0
- package/dist/shell/register.d.ts +11 -0
- package/dist/shell/register.d.ts.map +1 -0
- package/dist/shell/register.js +274 -0
- package/dist/shell/register.js.map +1 -0
- package/dist/shell/render/claim.d.ts +22 -0
- package/dist/shell/render/claim.d.ts.map +1 -0
- package/dist/shell/render/claim.js +75 -0
- package/dist/shell/render/claim.js.map +1 -0
- package/dist/shell/render/decision.d.ts +15 -0
- package/dist/shell/render/decision.d.ts.map +1 -0
- package/dist/shell/render/decision.js +66 -0
- package/dist/shell/render/decision.js.map +1 -0
- package/dist/shell/render/diagnostic.d.ts +19 -0
- package/dist/shell/render/diagnostic.d.ts.map +1 -0
- package/dist/shell/render/diagnostic.js +76 -0
- package/dist/shell/render/diagnostic.js.map +1 -0
- package/dist/shell/render/finding.d.ts +15 -0
- package/dist/shell/render/finding.d.ts.map +1 -0
- package/dist/shell/render/finding.js +57 -0
- package/dist/shell/render/finding.js.map +1 -0
- package/dist/shell/render/gates.d.ts +3 -0
- package/dist/shell/render/gates.d.ts.map +1 -0
- package/dist/shell/render/gates.js +56 -0
- package/dist/shell/render/gates.js.map +1 -0
- package/dist/shell/render/init.d.ts +11 -0
- package/dist/shell/render/init.d.ts.map +1 -0
- package/dist/shell/render/init.js +32 -0
- package/dist/shell/render/init.js.map +1 -0
- package/dist/shell/render/status.d.ts +26 -0
- package/dist/shell/render/status.d.ts.map +1 -0
- package/dist/shell/render/status.js +143 -0
- package/dist/shell/render/status.js.map +1 -0
- package/dist/shell/render/waiver.d.ts +21 -0
- package/dist/shell/render/waiver.d.ts.map +1 -0
- package/dist/shell/render/waiver.js +94 -0
- package/dist/shell/render/waiver.js.map +1 -0
- package/dist/shell/rules.d.ts +37 -0
- package/dist/shell/rules.d.ts.map +1 -0
- package/dist/shell/rules.js +51 -0
- package/dist/shell/rules.js.map +1 -0
- package/dist/shell/session/actor.d.ts +14 -0
- package/dist/shell/session/actor.d.ts.map +1 -0
- package/dist/shell/session/actor.js +34 -0
- package/dist/shell/session/actor.js.map +1 -0
- package/dist/shell/session/resolve-session.d.ts +5 -0
- package/dist/shell/session/resolve-session.d.ts.map +1 -0
- package/dist/shell/session/resolve-session.js +239 -0
- package/dist/shell/session/resolve-session.js.map +1 -0
- package/dist/shell/session/types.d.ts +56 -0
- package/dist/shell/session/types.d.ts.map +1 -0
- package/dist/shell/session/types.js +15 -0
- package/dist/shell/session/types.js.map +1 -0
- package/dist/store/agents-store.d.ts +3 -0
- package/dist/store/agents-store.d.ts.map +1 -0
- package/dist/store/agents-store.js +63 -0
- package/dist/store/agents-store.js.map +1 -0
- package/dist/store/apply-patch.d.ts +16 -0
- package/dist/store/apply-patch.d.ts.map +1 -0
- package/dist/store/apply-patch.js +191 -0
- package/dist/store/apply-patch.js.map +1 -0
- package/dist/store/atomic-write.d.ts +16 -0
- package/dist/store/atomic-write.d.ts.map +1 -0
- package/dist/store/atomic-write.js +132 -0
- package/dist/store/atomic-write.js.map +1 -0
- package/dist/store/doctor-snapshot.d.ts +20 -0
- package/dist/store/doctor-snapshot.d.ts.map +1 -0
- package/dist/store/doctor-snapshot.js +176 -0
- package/dist/store/doctor-snapshot.js.map +1 -0
- package/dist/store/events-store.d.ts +33 -0
- package/dist/store/events-store.d.ts.map +1 -0
- package/dist/store/events-store.js +297 -0
- package/dist/store/events-store.js.map +1 -0
- package/dist/store/index.d.ts +21 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/index.js +47 -0
- package/dist/store/index.js.map +1 -0
- package/dist/store/init-store.d.ts +21 -0
- package/dist/store/init-store.d.ts.map +1 -0
- package/dist/store/init-store.js +295 -0
- package/dist/store/init-store.js.map +1 -0
- package/dist/store/json-store.d.ts +3 -0
- package/dist/store/json-store.d.ts.map +1 -0
- package/dist/store/json-store.js +65 -0
- package/dist/store/json-store.js.map +1 -0
- package/dist/store/policy-store.d.ts +3 -0
- package/dist/store/policy-store.d.ts.map +1 -0
- package/dist/store/policy-store.js +65 -0
- package/dist/store/policy-store.js.map +1 -0
- package/dist/store/repo-root.d.ts +46 -0
- package/dist/store/repo-root.d.ts.map +1 -0
- package/dist/store/repo-root.js +145 -0
- package/dist/store/repo-root.js.map +1 -0
- package/dist/store/rules.d.ts +53 -0
- package/dist/store/rules.d.ts.map +1 -0
- package/dist/store/rules.js +78 -0
- package/dist/store/rules.js.map +1 -0
- package/dist/store/specs-store.d.ts +3 -0
- package/dist/store/specs-store.d.ts.map +1 -0
- package/dist/store/specs-store.js +131 -0
- package/dist/store/specs-store.js.map +1 -0
- package/dist/store/types.d.ts +84 -0
- package/dist/store/types.d.ts.map +1 -0
- package/dist/store/types.js +14 -0
- package/dist/store/types.js.map +1 -0
- package/dist/store/waivers-store.d.ts +25 -0
- package/dist/store/waivers-store.d.ts.map +1 -0
- package/dist/store/waivers-store.js +232 -0
- package/dist/store/waivers-store.js.map +1 -0
- package/dist/store/worktrees-store.d.ts +3 -0
- package/dist/store/worktrees-store.d.ts.map +1 -0
- package/dist/store/worktrees-store.js +62 -0
- package/dist/store/worktrees-store.js.map +1 -0
- package/dist/store/yaml-store.d.ts +9 -0
- package/dist/store/yaml-store.d.ts.map +1 -0
- package/dist/store/yaml-store.js +121 -0
- package/dist/store/yaml-store.js.map +1 -0
- package/package.json +15 -13
- package/dist/budget-derivation.js +0 -751
- package/dist/cicd-optimizer.js +0 -504
- package/dist/commands/agents.js +0 -124
- package/dist/commands/archive.js +0 -500
- package/dist/commands/burnup.js +0 -198
- package/dist/commands/diagnose.js +0 -525
- package/dist/commands/evaluate.js +0 -314
- package/dist/commands/gates.js +0 -149
- package/dist/commands/init.js +0 -857
- package/dist/commands/iterate.js +0 -417
- package/dist/commands/mode.js +0 -269
- package/dist/commands/parallel.js +0 -242
- package/dist/commands/plan.js +0 -438
- package/dist/commands/provenance.js +0 -1143
- package/dist/commands/quality-monitor.js +0 -284
- package/dist/commands/scope.js +0 -264
- package/dist/commands/session.js +0 -312
- package/dist/commands/sidecar.js +0 -74
- package/dist/commands/specs.js +0 -1656
- package/dist/commands/status.js +0 -1172
- package/dist/commands/templates.js +0 -237
- package/dist/commands/tool.js +0 -136
- package/dist/commands/tutorial.js +0 -480
- package/dist/commands/validate.js +0 -357
- package/dist/commands/verify-acs.js +0 -443
- package/dist/commands/waivers.js +0 -599
- package/dist/commands/workflow.js +0 -243
- package/dist/commands/worktree.js +0 -502
- package/dist/config/lite-scope.js +0 -158
- package/dist/config/modes.js +0 -347
- package/dist/constants/spec-types.js +0 -65
- package/dist/gates/budget-limit.js +0 -121
- package/dist/gates/feedback.js +0 -260
- package/dist/gates/format.js +0 -179
- package/dist/gates/god-object.js +0 -117
- package/dist/gates/pipeline.js +0 -167
- package/dist/gates/scope-boundary.js +0 -112
- package/dist/gates/spec-completeness.js +0 -109
- package/dist/gates/todo-detection.js +0 -205
- package/dist/generators/jest-config-generator.js +0 -242
- package/dist/generators/working-spec.js +0 -237
- package/dist/minimal-cli.js +0 -88
- package/dist/parallel/parallel-manager.js +0 -433
- package/dist/policy/PolicyManager.js +0 -470
- package/dist/scaffold/claude-hooks.js +0 -443
- package/dist/scaffold/cursor-hooks.js +0 -177
- package/dist/scaffold/git-hooks.js +0 -928
- package/dist/scaffold/index.js +0 -794
- package/dist/session/session-manager.js +0 -653
- package/dist/sidecars/index.js +0 -33
- package/dist/sidecars/listeners.js +0 -40
- package/dist/sidecars/provenance-summary.js +0 -238
- package/dist/sidecars/quality-gaps.js +0 -258
- package/dist/sidecars/schema.js +0 -149
- package/dist/sidecars/spec-drift.js +0 -151
- package/dist/sidecars/waiver-draft.js +0 -176
- package/dist/spec/SpecFileManager.js +0 -419
- package/dist/templates/.caws/schemas/policy.schema.json +0 -117
- package/dist/templates/.caws/schemas/scope.schema.json +0 -52
- package/dist/templates/.caws/schemas/waivers.schema.json +0 -106
- package/dist/templates/.caws/schemas/working-spec.schema.json +0 -340
- package/dist/templates/.caws/schemas/worktrees.schema.json +0 -38
- package/dist/templates/.caws/templates/working-spec.template.yml +0 -80
- package/dist/templates/.caws/tools/README.md +0 -18
- package/dist/templates/.caws/tools/scope-guard.js +0 -203
- package/dist/templates/.caws/tools-allow.json +0 -331
- package/dist/templates/.caws/waivers.yml +0 -19
- package/dist/templates/.claude/README.md +0 -190
- package/dist/templates/.claude/hooks/audit.sh +0 -121
- package/dist/templates/.claude/hooks/block-dangerous.sh +0 -203
- package/dist/templates/.claude/hooks/classify_command.py +0 -592
- package/dist/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
- package/dist/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
- package/dist/templates/.claude/hooks/naming-check.sh +0 -100
- package/dist/templates/.claude/hooks/protected-paths.sh +0 -39
- package/dist/templates/.claude/hooks/quality-check.sh +0 -81
- package/dist/templates/.claude/hooks/scan-secrets.sh +0 -85
- package/dist/templates/.claude/hooks/scope-guard.sh +0 -381
- package/dist/templates/.claude/hooks/session-caws-status.sh +0 -117
- package/dist/templates/.claude/hooks/session-log.sh +0 -634
- package/dist/templates/.claude/hooks/simplification-guard.sh +0 -92
- package/dist/templates/.claude/hooks/stop-worktree-check.sh +0 -46
- package/dist/templates/.claude/hooks/test_classify_command.py +0 -370
- package/dist/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
- package/dist/templates/.claude/hooks/validate-spec.sh +0 -76
- package/dist/templates/.claude/hooks/worktree-guard.sh +0 -220
- package/dist/templates/.claude/hooks/worktree-write-guard.sh +0 -190
- package/dist/templates/.claude/rules/git-safety.md +0 -26
- package/dist/templates/.claude/rules/worktree-isolation.md +0 -101
- package/dist/templates/.claude/settings.json +0 -141
- package/dist/templates/.cursor/README.md +0 -299
- package/dist/templates/.cursor/hooks/audit.sh +0 -55
- package/dist/templates/.cursor/hooks/block-dangerous.sh +0 -84
- package/dist/templates/.cursor/hooks/caws-quality-check.sh +0 -52
- package/dist/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
- package/dist/templates/.cursor/hooks/format.sh +0 -38
- package/dist/templates/.cursor/hooks/naming-check.sh +0 -64
- package/dist/templates/.cursor/hooks/scan-secrets.sh +0 -51
- package/dist/templates/.cursor/hooks/scope-guard.sh +0 -52
- package/dist/templates/.cursor/hooks/session-log.sh +0 -924
- package/dist/templates/.cursor/hooks/validate-spec.sh +0 -83
- package/dist/templates/.cursor/hooks.json +0 -76
- package/dist/templates/.cursor/rules/00-claims-verification.mdc +0 -144
- package/dist/templates/.cursor/rules/01-working-style.mdc +0 -50
- package/dist/templates/.cursor/rules/02-quality-gates.mdc +0 -368
- package/dist/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
- package/dist/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
- package/dist/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
- package/dist/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
- package/dist/templates/.cursor/rules/07-process-ops.mdc +0 -20
- package/dist/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
- package/dist/templates/.cursor/rules/09-docstrings.mdc +0 -89
- package/dist/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
- package/dist/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
- package/dist/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
- package/dist/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
- package/dist/templates/.cursor/rules/README.md +0 -148
- package/dist/templates/.github/copilot-instructions.md +0 -82
- package/dist/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
- package/dist/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
- package/dist/templates/.junie/guidelines.md +0 -73
- package/dist/templates/.vscode/launch.json +0 -17
- package/dist/templates/.vscode/settings.json +0 -95
- package/dist/templates/.windsurf/rules/caws-quality-standards.md +0 -54
- package/dist/templates/.windsurf/workflows/caws-guided-development.md +0 -92
- package/dist/templates/CLAUDE.md +0 -196
- package/dist/templates/COMMIT_CONVENTIONS.md +0 -86
- package/dist/templates/OIDC_SETUP.md +0 -300
- package/dist/templates/agents.md +0 -171
- package/dist/templates/codemod/README.md +0 -1
- package/dist/templates/codemod/test.js +0 -93
- package/dist/templates/docs/README.md +0 -151
- package/dist/templates/scripts/new_feature.sh +0 -80
- package/dist/templates/scripts/quality-gates/check-god-objects.js +0 -146
- package/dist/templates/scripts/quality-gates/run-quality-gates.js +0 -50
- package/dist/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
- package/dist/test-analysis.js +0 -786
- package/dist/tool-interface.js +0 -314
- package/dist/tool-loader.js +0 -303
- package/dist/tool-validator.js +0 -393
- package/dist/utils/agent-display.js +0 -210
- package/dist/utils/agent-session.js +0 -344
- package/dist/utils/async-utils.js +0 -188
- package/dist/utils/command-wrapper.js +0 -200
- package/dist/utils/event-log.js +0 -584
- package/dist/utils/event-renderer.js +0 -521
- package/dist/utils/finalization.js +0 -230
- package/dist/utils/git-lock.js +0 -119
- package/dist/utils/gitignore-updater.js +0 -158
- package/dist/utils/ide-detection.js +0 -133
- package/dist/utils/lifecycle-events.js +0 -94
- package/dist/utils/project-analysis.js +0 -367
- package/dist/utils/promise-utils.js +0 -72
- package/dist/utils/quality-gates-errors.js +0 -520
- package/dist/utils/quality-gates-utils.js +0 -387
- package/dist/utils/schema-validator.js +0 -50
- package/dist/utils/spec-resolver.js +0 -711
- package/dist/utils/typescript-detector.js +0 -369
- package/dist/utils/working-state.js +0 -530
- package/dist/utils/yaml-validation.js +0 -156
- package/dist/validation/spec-validation.js +0 -924
- package/dist/waivers-manager.js +0 -732
- package/dist/worktree/worktree-manager.js +0 -1735
- package/templates/.caws/schemas/policy.schema.json +0 -117
- package/templates/.caws/schemas/scope.schema.json +0 -52
- package/templates/.caws/schemas/waivers.schema.json +0 -106
- package/templates/.caws/schemas/working-spec.schema.json +0 -340
- package/templates/.caws/schemas/worktrees.schema.json +0 -38
- package/templates/.caws/templates/working-spec.template.yml +0 -80
- package/templates/.caws/tools/README.md +0 -18
- package/templates/.caws/tools/scope-guard.js +0 -203
- package/templates/.caws/tools-allow.json +0 -331
- package/templates/.caws/waivers.yml +0 -19
- package/templates/.claude/README.md +0 -190
- package/templates/.claude/hooks/audit.sh +0 -121
- package/templates/.claude/hooks/block-dangerous.sh +0 -203
- package/templates/.claude/hooks/classify_command.py +0 -592
- package/templates/.claude/hooks/doc-frontmatter-check.sh +0 -173
- package/templates/.claude/hooks/lite-sprawl-check.sh +0 -145
- package/templates/.claude/hooks/naming-check.sh +0 -100
- package/templates/.claude/hooks/protected-paths.sh +0 -39
- package/templates/.claude/hooks/quality-check.sh +0 -81
- package/templates/.claude/hooks/scan-secrets.sh +0 -85
- package/templates/.claude/hooks/scope-guard.sh +0 -381
- package/templates/.claude/hooks/session-caws-status.sh +0 -117
- package/templates/.claude/hooks/session-log.sh +0 -634
- package/templates/.claude/hooks/simplification-guard.sh +0 -92
- package/templates/.claude/hooks/stop-worktree-check.sh +0 -46
- package/templates/.claude/hooks/test_classify_command.py +0 -370
- package/templates/.claude/hooks/test_wrapper_smoke.sh +0 -96
- package/templates/.claude/hooks/validate-spec.sh +0 -76
- package/templates/.claude/hooks/worktree-guard.sh +0 -220
- package/templates/.claude/hooks/worktree-write-guard.sh +0 -190
- package/templates/.claude/rules/git-safety.md +0 -26
- package/templates/.claude/rules/worktree-isolation.md +0 -101
- package/templates/.claude/settings.json +0 -141
- package/templates/.cursor/README.md +0 -299
- package/templates/.cursor/hooks/audit.sh +0 -55
- package/templates/.cursor/hooks/block-dangerous.sh +0 -84
- package/templates/.cursor/hooks/caws-quality-check.sh +0 -52
- package/templates/.cursor/hooks/caws-scope-guard.sh +0 -130
- package/templates/.cursor/hooks/format.sh +0 -38
- package/templates/.cursor/hooks/naming-check.sh +0 -64
- package/templates/.cursor/hooks/scan-secrets.sh +0 -51
- package/templates/.cursor/hooks/scope-guard.sh +0 -52
- package/templates/.cursor/hooks/session-log.sh +0 -924
- package/templates/.cursor/hooks/validate-spec.sh +0 -83
- package/templates/.cursor/hooks.json +0 -76
- package/templates/.cursor/rules/00-claims-verification.mdc +0 -144
- package/templates/.cursor/rules/01-working-style.mdc +0 -50
- package/templates/.cursor/rules/02-quality-gates.mdc +0 -368
- package/templates/.cursor/rules/03-naming-and-refactor.mdc +0 -33
- package/templates/.cursor/rules/04-logging-language-style.mdc +0 -23
- package/templates/.cursor/rules/05-safe-defaults-guards.mdc +0 -23
- package/templates/.cursor/rules/06-typescript-conventions.mdc +0 -36
- package/templates/.cursor/rules/07-process-ops.mdc +0 -20
- package/templates/.cursor/rules/08-solid-and-architecture.mdc +0 -16
- package/templates/.cursor/rules/09-docstrings.mdc +0 -89
- package/templates/.cursor/rules/10-documentation-quality-standards.mdc +0 -385
- package/templates/.cursor/rules/11-scope-management-waivers.mdc +0 -381
- package/templates/.cursor/rules/12-implementation-completeness.mdc +0 -516
- package/templates/.cursor/rules/13-language-agnostic-standards.mdc +0 -578
- package/templates/.cursor/rules/README.md +0 -148
- package/templates/.github/copilot-instructions.md +0 -82
- package/templates/.idea/runConfigurations/CAWS_Evaluate.xml +0 -5
- package/templates/.idea/runConfigurations/CAWS_Validate.xml +0 -5
- package/templates/.junie/guidelines.md +0 -73
- package/templates/.vscode/launch.json +0 -17
- package/templates/.vscode/settings.json +0 -95
- package/templates/.windsurf/rules/caws-quality-standards.md +0 -54
- package/templates/.windsurf/workflows/caws-guided-development.md +0 -92
- package/templates/CLAUDE.md +0 -196
- package/templates/COMMIT_CONVENTIONS.md +0 -86
- package/templates/OIDC_SETUP.md +0 -300
- package/templates/agents.md +0 -171
- package/templates/codemod/README.md +0 -1
- package/templates/codemod/test.js +0 -93
- package/templates/docs/README.md +0 -151
- package/templates/scripts/new_feature.sh +0 -80
- package/templates/scripts/quality-gates/check-god-objects.js +0 -146
- package/templates/scripts/quality-gates/run-quality-gates.js +0 -50
- package/templates/scripts/v3/analysis/todo_analyzer.py +0 -1997
package/dist/tool-interface.js
DELETED
|
@@ -1,314 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @fileoverview CAWS Tool Interface - Base classes and contracts for tool implementation
|
|
5
|
-
* Defines the standard interface that all CAWS tools must implement
|
|
6
|
-
* @author @darianrosebrook
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Standard tool execution result
|
|
11
|
-
* @typedef {Object} ToolExecutionResult
|
|
12
|
-
* @property {boolean} success - Whether execution succeeded
|
|
13
|
-
* @property {number} duration - Execution duration in milliseconds
|
|
14
|
-
* @property {Object} output - Tool-specific output data
|
|
15
|
-
* @property {Array<string>} errors - Error messages if execution failed
|
|
16
|
-
* @property {Object} metadata - Additional execution metadata
|
|
17
|
-
*/
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Tool metadata structure
|
|
21
|
-
* @typedef {Object} ToolMetadata
|
|
22
|
-
* @property {string} id - Unique tool identifier
|
|
23
|
-
* @property {string} name - Human-readable tool name
|
|
24
|
-
* @property {string} version - Tool version (semver)
|
|
25
|
-
* @property {string} description - Tool description
|
|
26
|
-
* @property {Array<string>} capabilities - Tool capabilities (e.g., ['validation', 'security'])
|
|
27
|
-
* @property {string} author - Tool author
|
|
28
|
-
* @property {string} license - Tool license
|
|
29
|
-
* @property {Array<string>} dependencies - Required Node.js dependencies
|
|
30
|
-
*/
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Tool execution context
|
|
34
|
-
* @typedef {Object} ToolExecutionContext
|
|
35
|
-
* @property {string} workingDirectory - Current working directory
|
|
36
|
-
* @property {Object} environment - Environment variables
|
|
37
|
-
* @property {Object} config - CAWS configuration
|
|
38
|
-
* @property {Object} workingSpec - Current working specification
|
|
39
|
-
* @property {number} timeout - Execution timeout in milliseconds
|
|
40
|
-
*/
|
|
41
|
-
|
|
42
|
-
/**
|
|
43
|
-
* Base Tool class - All CAWS tools should extend this class
|
|
44
|
-
*/
|
|
45
|
-
class BaseTool {
|
|
46
|
-
constructor() {
|
|
47
|
-
this.metadata = this.getMetadata();
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
/**
|
|
51
|
-
* Execute the tool with given parameters
|
|
52
|
-
* @param {Object} parameters - Tool-specific execution parameters
|
|
53
|
-
* @param {ToolExecutionContext} context - Execution context
|
|
54
|
-
* @returns {Promise<ToolExecutionResult>} Execution result
|
|
55
|
-
*/
|
|
56
|
-
async execute(parameters = {}, context = {}) {
|
|
57
|
-
const startTime = Date.now();
|
|
58
|
-
|
|
59
|
-
try {
|
|
60
|
-
// Validate parameters
|
|
61
|
-
this.validateParameters(parameters);
|
|
62
|
-
|
|
63
|
-
// Execute tool logic
|
|
64
|
-
const result = await this.executeImpl(parameters, context);
|
|
65
|
-
|
|
66
|
-
// Ensure result conforms to interface
|
|
67
|
-
const executionResult = this.normalizeResult(result, Date.now() - startTime);
|
|
68
|
-
|
|
69
|
-
return executionResult;
|
|
70
|
-
} catch (error) {
|
|
71
|
-
return this.createErrorResult(error, Date.now() - startTime);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
/**
|
|
76
|
-
* Get tool metadata
|
|
77
|
-
* @returns {ToolMetadata} Tool metadata
|
|
78
|
-
*/
|
|
79
|
-
getMetadata() {
|
|
80
|
-
throw new Error('Tool must implement getMetadata() method');
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/**
|
|
84
|
-
* Validate tool parameters
|
|
85
|
-
* @param {Object} _parameters - Parameters to validate
|
|
86
|
-
* @throws {Error} If parameters are invalid
|
|
87
|
-
*/
|
|
88
|
-
validateParameters(_parameters) {
|
|
89
|
-
// Default implementation - override in subclasses
|
|
90
|
-
return true;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Execute tool implementation (must be overridden by subclasses)
|
|
95
|
-
* @param {Object} _parameters - Tool parameters
|
|
96
|
-
* @param {ToolExecutionContext} _context - Execution context
|
|
97
|
-
* @returns {Promise<Object>} Tool-specific result
|
|
98
|
-
*/
|
|
99
|
-
async executeImpl(_parameters, _context) {
|
|
100
|
-
throw new Error('Tool must implement executeImpl() method');
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
/**
|
|
104
|
-
* Normalize execution result to standard format
|
|
105
|
-
* @private
|
|
106
|
-
* @param {Object} result - Raw tool result
|
|
107
|
-
* @param {number} duration - Execution duration
|
|
108
|
-
* @returns {ToolExecutionResult} Normalized result
|
|
109
|
-
*/
|
|
110
|
-
normalizeResult(result, duration) {
|
|
111
|
-
return {
|
|
112
|
-
success: result.success !== false,
|
|
113
|
-
duration,
|
|
114
|
-
output: result.output || result,
|
|
115
|
-
errors: Array.isArray(result.errors) ? result.errors : [],
|
|
116
|
-
metadata: result.metadata || {},
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
/**
|
|
121
|
-
* Create error result
|
|
122
|
-
* @private
|
|
123
|
-
* @param {Error} error - Execution error
|
|
124
|
-
* @param {number} duration - Execution duration
|
|
125
|
-
* @returns {ToolExecutionResult} Error result
|
|
126
|
-
*/
|
|
127
|
-
createErrorResult(error, duration) {
|
|
128
|
-
return {
|
|
129
|
-
success: false,
|
|
130
|
-
duration,
|
|
131
|
-
output: null,
|
|
132
|
-
errors: [error.message],
|
|
133
|
-
metadata: {
|
|
134
|
-
errorType: error.constructor.name,
|
|
135
|
-
stack: error.stack,
|
|
136
|
-
},
|
|
137
|
-
};
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
/**
|
|
142
|
-
* Validation Tool base class - For tools that perform validation checks
|
|
143
|
-
*/
|
|
144
|
-
class ValidationTool extends BaseTool {
|
|
145
|
-
constructor() {
|
|
146
|
-
super();
|
|
147
|
-
this.capabilities = ['validation'];
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
/**
|
|
151
|
-
* Execute validation
|
|
152
|
-
* @param {Object} parameters - Validation parameters
|
|
153
|
-
* @param {ToolExecutionContext} context - Execution context
|
|
154
|
-
* @returns {Promise<ToolExecutionResult>} Validation result
|
|
155
|
-
*/
|
|
156
|
-
async executeImpl(parameters, context) {
|
|
157
|
-
const validationResult = await this.validate(parameters, context);
|
|
158
|
-
|
|
159
|
-
return {
|
|
160
|
-
success: validationResult.valid,
|
|
161
|
-
output: validationResult,
|
|
162
|
-
errors: validationResult.errors || [],
|
|
163
|
-
metadata: {
|
|
164
|
-
checksRun: validationResult.checks?.length || 0,
|
|
165
|
-
score: validationResult.score || 0,
|
|
166
|
-
},
|
|
167
|
-
};
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Perform validation (must be implemented by subclasses)
|
|
172
|
-
* @param {Object} parameters - Validation parameters
|
|
173
|
-
* @param {ToolExecutionContext} context - Execution context
|
|
174
|
-
* @returns {Promise<Object>} Validation result
|
|
175
|
-
*/
|
|
176
|
-
async validate(_parameters, _context) {
|
|
177
|
-
throw new Error('ValidationTool must implement validate() method');
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
/**
|
|
182
|
-
* Quality Gate Tool base class - For tools that enforce quality standards
|
|
183
|
-
*/
|
|
184
|
-
class QualityGateTool extends ValidationTool {
|
|
185
|
-
constructor() {
|
|
186
|
-
super();
|
|
187
|
-
this.capabilities = ['validation', 'quality-gates'];
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Get quality gate thresholds for current tier
|
|
192
|
-
* @param {number} tier - Risk tier (1-3)
|
|
193
|
-
* @returns {Object} Threshold configuration
|
|
194
|
-
*/
|
|
195
|
-
getTierThresholds(tier) {
|
|
196
|
-
const thresholds = {
|
|
197
|
-
1: {
|
|
198
|
-
// Tier 1 - Highest rigor
|
|
199
|
-
coverage: 0.9,
|
|
200
|
-
mutation: 0.7,
|
|
201
|
-
contracts: true,
|
|
202
|
-
manualReview: true,
|
|
203
|
-
},
|
|
204
|
-
2: {
|
|
205
|
-
// Tier 2 - Standard rigor
|
|
206
|
-
coverage: 0.8,
|
|
207
|
-
mutation: 0.5,
|
|
208
|
-
contracts: true,
|
|
209
|
-
manualReview: false,
|
|
210
|
-
},
|
|
211
|
-
3: {
|
|
212
|
-
// Tier 3 - Low rigor
|
|
213
|
-
coverage: 0.7,
|
|
214
|
-
mutation: 0.3,
|
|
215
|
-
contracts: false,
|
|
216
|
-
manualReview: false,
|
|
217
|
-
},
|
|
218
|
-
};
|
|
219
|
-
|
|
220
|
-
return thresholds[tier] || thresholds[2];
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* Security Tool base class - For tools that perform security checks
|
|
226
|
-
*/
|
|
227
|
-
class SecurityTool extends ValidationTool {
|
|
228
|
-
constructor() {
|
|
229
|
-
super();
|
|
230
|
-
this.capabilities = ['validation', 'security'];
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
/**
|
|
234
|
-
* Check for security violations
|
|
235
|
-
* @param {Object} target - Target to check (file, code, etc.)
|
|
236
|
-
* @returns {Promise<Array<Object>>} Array of security violations
|
|
237
|
-
*/
|
|
238
|
-
async checkSecurityViolations(target) {
|
|
239
|
-
const violations = [];
|
|
240
|
-
|
|
241
|
-
// Check for common security patterns
|
|
242
|
-
const patterns = [
|
|
243
|
-
{ name: 'hardcoded_secrets', pattern: /password|token|key|secret/i, severity: 'high' },
|
|
244
|
-
{ name: 'unsafe_eval', pattern: /eval\(|Function\(/, severity: 'high' },
|
|
245
|
-
{ name: 'dangerous_modules', pattern: /child_process|fs-extra/, severity: 'medium' },
|
|
246
|
-
];
|
|
247
|
-
|
|
248
|
-
for (const { name, pattern, severity } of patterns) {
|
|
249
|
-
if (pattern.test(target)) {
|
|
250
|
-
violations.push({ name, severity, message: `${name} pattern detected` });
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
return violations;
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
/**
|
|
259
|
-
* Utility functions for tool development
|
|
260
|
-
*/
|
|
261
|
-
const ToolUtils = {
|
|
262
|
-
/**
|
|
263
|
-
* Create standardized success result
|
|
264
|
-
* @param {Object} output - Tool output
|
|
265
|
-
* @param {Object} metadata - Additional metadata
|
|
266
|
-
* @returns {ToolExecutionResult} Success result
|
|
267
|
-
*/
|
|
268
|
-
createSuccessResult(output = {}, metadata = {}) {
|
|
269
|
-
return {
|
|
270
|
-
success: true,
|
|
271
|
-
duration: 0, // Will be set by BaseTool
|
|
272
|
-
output,
|
|
273
|
-
errors: [],
|
|
274
|
-
metadata,
|
|
275
|
-
};
|
|
276
|
-
},
|
|
277
|
-
|
|
278
|
-
/**
|
|
279
|
-
* Create standardized error result
|
|
280
|
-
* @param {string} message - Error message
|
|
281
|
-
* @param {string} errorType - Error type
|
|
282
|
-
* @returns {ToolExecutionResult} Error result
|
|
283
|
-
*/
|
|
284
|
-
createErrorResult(message, errorType = 'ToolError') {
|
|
285
|
-
return {
|
|
286
|
-
success: false,
|
|
287
|
-
duration: 0, // Will be set by BaseTool
|
|
288
|
-
output: null,
|
|
289
|
-
errors: [message],
|
|
290
|
-
metadata: { errorType },
|
|
291
|
-
};
|
|
292
|
-
},
|
|
293
|
-
|
|
294
|
-
/**
|
|
295
|
-
* Validate required parameters
|
|
296
|
-
* @param {Object} _params - Parameters object
|
|
297
|
-
* @param {Array<string>} _required - Required parameter names
|
|
298
|
-
* @throws {Error} If required parameters are missing
|
|
299
|
-
*/
|
|
300
|
-
validateRequired(_params, _required) {
|
|
301
|
-
const missing = _required.filter((key) => !_params[key]);
|
|
302
|
-
if (missing.length > 0) {
|
|
303
|
-
throw new Error(`Missing required parameters: ${missing.join(', ')}`);
|
|
304
|
-
}
|
|
305
|
-
},
|
|
306
|
-
};
|
|
307
|
-
|
|
308
|
-
module.exports = {
|
|
309
|
-
BaseTool,
|
|
310
|
-
ValidationTool,
|
|
311
|
-
QualityGateTool,
|
|
312
|
-
SecurityTool,
|
|
313
|
-
ToolUtils,
|
|
314
|
-
};
|
package/dist/tool-loader.js
DELETED
|
@@ -1,303 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @fileoverview CAWS Tool Loader - Dynamic tool discovery and loading system
|
|
5
|
-
* Provides secure, sandboxed loading of tools from apps/tools/caws/ directory
|
|
6
|
-
* @author @darianrosebrook
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
const fs = require('fs');
|
|
10
|
-
const path = require('path');
|
|
11
|
-
const { EventEmitter } = require('events');
|
|
12
|
-
const { setTimeout, clearTimeout } = require('timers');
|
|
13
|
-
const { safeAsync } = require('./error-handler');
|
|
14
|
-
|
|
15
|
-
/**
|
|
16
|
-
* Tool Loader - Discovers, validates, and loads CAWS tools dynamically
|
|
17
|
-
* @extends EventEmitter
|
|
18
|
-
*/
|
|
19
|
-
class ToolLoader extends EventEmitter {
|
|
20
|
-
constructor(options = {}) {
|
|
21
|
-
super();
|
|
22
|
-
// Check new location first, fall back to legacy location
|
|
23
|
-
const newToolsDir = path.join(process.cwd(), '.caws/tools');
|
|
24
|
-
const legacyToolsDir = path.join(process.cwd(), 'apps/tools/caws');
|
|
25
|
-
const defaultToolsDir = fs.existsSync(newToolsDir) ? newToolsDir : legacyToolsDir;
|
|
26
|
-
|
|
27
|
-
this.options = {
|
|
28
|
-
toolsDir: options.toolsDir || defaultToolsDir,
|
|
29
|
-
cacheEnabled: options.cacheEnabled !== false,
|
|
30
|
-
timeout: options.timeout || 10000,
|
|
31
|
-
maxTools: options.maxTools || 50,
|
|
32
|
-
...options,
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
this.loadedTools = new Map();
|
|
36
|
-
this.discoveredTools = new Set();
|
|
37
|
-
this.loadingState = 'idle'; // idle, discovering, loading, ready, error
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Discover available tools in the tools directory
|
|
42
|
-
* @returns {Promise<Array<string>>} Array of tool file paths
|
|
43
|
-
*/
|
|
44
|
-
async discoverTools() {
|
|
45
|
-
return safeAsync(async () => {
|
|
46
|
-
this.loadingState = 'discovering';
|
|
47
|
-
this.emit('discovery:start');
|
|
48
|
-
|
|
49
|
-
// Check if tools directory exists
|
|
50
|
-
if (!fs.existsSync(this.options.toolsDir)) {
|
|
51
|
-
this.emit('discovery:complete', { tools: [], reason: 'directory_not_found' });
|
|
52
|
-
this.loadingState = 'ready';
|
|
53
|
-
return [];
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
// Read directory contents
|
|
57
|
-
const files = await fs.promises.readdir(this.options.toolsDir);
|
|
58
|
-
|
|
59
|
-
// Filter for valid tool files
|
|
60
|
-
const toolFiles = files
|
|
61
|
-
.filter((file) => {
|
|
62
|
-
// Must be .js file
|
|
63
|
-
if (!file.endsWith('.js')) return false;
|
|
64
|
-
|
|
65
|
-
// Must not be hidden or backup file
|
|
66
|
-
if (file.startsWith('.') || file.includes('.backup')) return false;
|
|
67
|
-
|
|
68
|
-
// Must not be test file (unless explicitly allowed)
|
|
69
|
-
if (file.includes('.test.') && !this.options.includeTests) return false;
|
|
70
|
-
|
|
71
|
-
return true;
|
|
72
|
-
})
|
|
73
|
-
.map((file) => path.join(this.options.toolsDir, file))
|
|
74
|
-
.filter((filePath) => {
|
|
75
|
-
// Validate file exists and is readable
|
|
76
|
-
try {
|
|
77
|
-
const stats = fs.statSync(filePath);
|
|
78
|
-
return stats.isFile() && stats.size > 0 && stats.size < 1024 * 1024; // < 1MB
|
|
79
|
-
} catch (error) {
|
|
80
|
-
this.emit('discovery:warning', { file: filePath, error: error.message });
|
|
81
|
-
return false;
|
|
82
|
-
}
|
|
83
|
-
})
|
|
84
|
-
.slice(0, this.options.maxTools); // Limit number of tools
|
|
85
|
-
|
|
86
|
-
this.discoveredTools = new Set(toolFiles);
|
|
87
|
-
this.emit('discovery:complete', { tools: toolFiles, count: toolFiles.length });
|
|
88
|
-
this.loadingState = 'idle';
|
|
89
|
-
|
|
90
|
-
return toolFiles;
|
|
91
|
-
}, 'Tool discovery failed');
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* Load a specific tool module
|
|
96
|
-
* @param {string} toolPath - Path to tool file
|
|
97
|
-
* @returns {Promise<Object>} Loaded tool module
|
|
98
|
-
*/
|
|
99
|
-
async loadTool(toolPath) {
|
|
100
|
-
return safeAsync(async () => {
|
|
101
|
-
const toolId = path.basename(toolPath, '.js');
|
|
102
|
-
|
|
103
|
-
// Check cache first
|
|
104
|
-
if (this.loadedTools.has(toolId) && this.options.cacheEnabled) {
|
|
105
|
-
return this.loadedTools.get(toolId);
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
this.emit('tool:loading', { id: toolId, path: toolPath });
|
|
109
|
-
|
|
110
|
-
// Validate tool file before loading
|
|
111
|
-
await this.validateToolFile(toolPath);
|
|
112
|
-
|
|
113
|
-
// Load the module with timeout
|
|
114
|
-
const toolModule = await this.loadModuleWithTimeout(toolPath);
|
|
115
|
-
|
|
116
|
-
// Validate tool interface
|
|
117
|
-
await this.validateToolInterface(toolModule, toolId);
|
|
118
|
-
|
|
119
|
-
// Cache the loaded tool
|
|
120
|
-
const tool = {
|
|
121
|
-
module: toolModule,
|
|
122
|
-
path: toolPath,
|
|
123
|
-
loadedAt: new Date(),
|
|
124
|
-
metadata: toolModule.getMetadata ? toolModule.getMetadata() : {},
|
|
125
|
-
};
|
|
126
|
-
|
|
127
|
-
this.loadedTools.set(toolId, tool);
|
|
128
|
-
this.emit('tool:loaded', { id: toolId, metadata: tool.metadata });
|
|
129
|
-
|
|
130
|
-
return tool;
|
|
131
|
-
}, 'Tool loading failed');
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
/**
|
|
135
|
-
* Load all discovered tools
|
|
136
|
-
* @returns {Promise<Map<string, Object>>} Map of loaded tools
|
|
137
|
-
*/
|
|
138
|
-
async loadAllTools() {
|
|
139
|
-
this.loadingState = 'loading';
|
|
140
|
-
this.emit('loading:start');
|
|
141
|
-
|
|
142
|
-
const toolPaths = await this.discoverTools();
|
|
143
|
-
const results = new Map();
|
|
144
|
-
|
|
145
|
-
for (const toolPath of toolPaths) {
|
|
146
|
-
try {
|
|
147
|
-
const tool = await this.loadTool(toolPath);
|
|
148
|
-
results.set(path.basename(toolPath, '.js'), tool);
|
|
149
|
-
} catch (error) {
|
|
150
|
-
// Log error but continue loading other tools
|
|
151
|
-
this.emit('loading:warning', { path: toolPath, error: error.message });
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
this.loadingState = 'ready';
|
|
156
|
-
this.emit('loading:complete', { loaded: results.size, total: toolPaths.length });
|
|
157
|
-
|
|
158
|
-
return results;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* Get a loaded tool by ID
|
|
163
|
-
* @param {string} toolId - Tool identifier
|
|
164
|
-
* @returns {Object|null} Tool object or null if not found
|
|
165
|
-
*/
|
|
166
|
-
getTool(toolId) {
|
|
167
|
-
return this.loadedTools.get(toolId) || null;
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/**
|
|
171
|
-
* Get all loaded tools
|
|
172
|
-
* @returns {Map<string, Object>} Map of loaded tools
|
|
173
|
-
*/
|
|
174
|
-
getAllTools() {
|
|
175
|
-
return new Map(this.loadedTools);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
/**
|
|
179
|
-
* Unload a tool (remove from cache)
|
|
180
|
-
* @param {string} toolId - Tool identifier
|
|
181
|
-
* @returns {boolean} True if tool was unloaded
|
|
182
|
-
*/
|
|
183
|
-
unloadTool(toolId) {
|
|
184
|
-
const unloaded = this.loadedTools.delete(toolId);
|
|
185
|
-
if (unloaded) {
|
|
186
|
-
this.emit('tool:unloaded', { id: toolId });
|
|
187
|
-
}
|
|
188
|
-
return unloaded;
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
/**
|
|
192
|
-
* Validate tool file before loading
|
|
193
|
-
* @private
|
|
194
|
-
* @param {string} toolPath - Path to tool file
|
|
195
|
-
*/
|
|
196
|
-
async validateToolFile(toolPath) {
|
|
197
|
-
// Basic file validation
|
|
198
|
-
const stats = await fs.promises.stat(toolPath);
|
|
199
|
-
if (stats.size === 0) {
|
|
200
|
-
throw new Error('Tool file is empty');
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
if (stats.size > 1024 * 1024) {
|
|
204
|
-
// 1MB limit
|
|
205
|
-
throw new Error('Tool file too large (>1MB)');
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
// Read first few lines to check for shebang and basic structure
|
|
209
|
-
const fd = await fs.promises.open(toolPath, 'r');
|
|
210
|
-
try {
|
|
211
|
-
const buffer = Buffer.alloc(512);
|
|
212
|
-
const { bytesRead } = await fd.read(buffer, 0, 512, 0);
|
|
213
|
-
const content = buffer.toString('utf8', 0, bytesRead);
|
|
214
|
-
|
|
215
|
-
// Check for shebang
|
|
216
|
-
if (!content.startsWith('#!/usr/bin/env node') && !content.startsWith('#!')) {
|
|
217
|
-
throw new Error('Tool file missing shebang');
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
// Basic syntax check - look for module.exports or ES modules
|
|
221
|
-
const hasExports = content.includes('module.exports') || content.includes('export ');
|
|
222
|
-
if (!hasExports) {
|
|
223
|
-
throw new Error('Tool file does not export anything');
|
|
224
|
-
}
|
|
225
|
-
} finally {
|
|
226
|
-
await fd.close();
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
/**
|
|
231
|
-
* Load module with timeout protection
|
|
232
|
-
* @private
|
|
233
|
-
* @param {string} toolPath - Path to tool file
|
|
234
|
-
*/
|
|
235
|
-
async loadModuleWithTimeout(toolPath) {
|
|
236
|
-
return new Promise((resolve, reject) => {
|
|
237
|
-
const timeout = setTimeout(() => {
|
|
238
|
-
reject(new Error(`Tool loading timeout after ${this.options.timeout}ms`));
|
|
239
|
-
}, this.options.timeout);
|
|
240
|
-
|
|
241
|
-
try {
|
|
242
|
-
// Clear require cache to ensure fresh load
|
|
243
|
-
delete require.cache[require.resolve(toolPath)];
|
|
244
|
-
|
|
245
|
-
const module = require(toolPath);
|
|
246
|
-
clearTimeout(timeout);
|
|
247
|
-
resolve(module);
|
|
248
|
-
} catch (error) {
|
|
249
|
-
clearTimeout(timeout);
|
|
250
|
-
reject(error);
|
|
251
|
-
}
|
|
252
|
-
});
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
/**
|
|
256
|
-
* Validate tool interface compliance
|
|
257
|
-
* @private
|
|
258
|
-
* @param {Object} toolModule - Loaded tool module
|
|
259
|
-
* @param {string} toolId - Tool identifier
|
|
260
|
-
*/
|
|
261
|
-
async validateToolInterface(toolModule, toolId) {
|
|
262
|
-
const requiredMethods = ['execute', 'getMetadata'];
|
|
263
|
-
|
|
264
|
-
for (const method of requiredMethods) {
|
|
265
|
-
if (typeof toolModule[method] !== 'function') {
|
|
266
|
-
throw new Error(`Tool ${toolId} missing required method: ${method}`);
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
// Validate metadata structure
|
|
271
|
-
if (toolModule.getMetadata) {
|
|
272
|
-
const metadata = toolModule.getMetadata();
|
|
273
|
-
const requiredFields = ['id', 'name', 'version'];
|
|
274
|
-
|
|
275
|
-
for (const field of requiredFields) {
|
|
276
|
-
if (!metadata[field]) {
|
|
277
|
-
throw new Error(`Tool ${toolId} metadata missing required field: ${field}`);
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// Validate metadata types
|
|
282
|
-
if (typeof metadata.id !== 'string' || typeof metadata.name !== 'string') {
|
|
283
|
-
throw new Error(`Tool ${toolId} metadata has invalid types`);
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
}
|
|
287
|
-
|
|
288
|
-
/**
|
|
289
|
-
* Get loader statistics
|
|
290
|
-
* @returns {Object} Statistics object
|
|
291
|
-
*/
|
|
292
|
-
getStats() {
|
|
293
|
-
return {
|
|
294
|
-
discovered: this.discoveredTools.size,
|
|
295
|
-
loaded: this.loadedTools.size,
|
|
296
|
-
state: this.loadingState,
|
|
297
|
-
cacheEnabled: this.options.cacheEnabled,
|
|
298
|
-
toolsDir: this.options.toolsDir,
|
|
299
|
-
};
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
module.exports = ToolLoader;
|