aw-ecc 1.4.21
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/.agents/skills/api-design/SKILL.md +523 -0
- package/.agents/skills/api-design/agents/openai.yaml +7 -0
- package/.agents/skills/article-writing/SKILL.md +85 -0
- package/.agents/skills/article-writing/agents/openai.yaml +7 -0
- package/.agents/skills/backend-patterns/SKILL.md +598 -0
- package/.agents/skills/backend-patterns/agents/openai.yaml +7 -0
- package/.agents/skills/bun-runtime/SKILL.md +84 -0
- package/.agents/skills/bun-runtime/agents/openai.yaml +7 -0
- package/.agents/skills/claude-api/SKILL.md +337 -0
- package/.agents/skills/claude-api/agents/openai.yaml +7 -0
- package/.agents/skills/coding-standards/SKILL.md +530 -0
- package/.agents/skills/coding-standards/agents/openai.yaml +7 -0
- package/.agents/skills/content-engine/SKILL.md +88 -0
- package/.agents/skills/content-engine/agents/openai.yaml +7 -0
- package/.agents/skills/crosspost/SKILL.md +188 -0
- package/.agents/skills/crosspost/agents/openai.yaml +7 -0
- package/.agents/skills/deep-research/SKILL.md +155 -0
- package/.agents/skills/deep-research/agents/openai.yaml +7 -0
- package/.agents/skills/dmux-workflows/SKILL.md +144 -0
- package/.agents/skills/dmux-workflows/agents/openai.yaml +7 -0
- package/.agents/skills/documentation-lookup/SKILL.md +90 -0
- package/.agents/skills/documentation-lookup/agents/openai.yaml +7 -0
- package/.agents/skills/e2e-testing/SKILL.md +326 -0
- package/.agents/skills/e2e-testing/agents/openai.yaml +7 -0
- package/.agents/skills/eval-harness/SKILL.md +236 -0
- package/.agents/skills/eval-harness/agents/openai.yaml +7 -0
- package/.agents/skills/everything-claude-code/SKILL.md +442 -0
- package/.agents/skills/everything-claude-code/agents/openai.yaml +6 -0
- package/.agents/skills/exa-search/SKILL.md +170 -0
- package/.agents/skills/exa-search/agents/openai.yaml +7 -0
- package/.agents/skills/fal-ai-media/SKILL.md +277 -0
- package/.agents/skills/fal-ai-media/agents/openai.yaml +7 -0
- package/.agents/skills/frontend-patterns/SKILL.md +642 -0
- package/.agents/skills/frontend-patterns/agents/openai.yaml +7 -0
- package/.agents/skills/frontend-slides/SKILL.md +184 -0
- package/.agents/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/.agents/skills/frontend-slides/agents/openai.yaml +7 -0
- package/.agents/skills/investor-materials/SKILL.md +96 -0
- package/.agents/skills/investor-materials/agents/openai.yaml +7 -0
- package/.agents/skills/investor-outreach/SKILL.md +76 -0
- package/.agents/skills/investor-outreach/agents/openai.yaml +7 -0
- package/.agents/skills/market-research/SKILL.md +75 -0
- package/.agents/skills/market-research/agents/openai.yaml +7 -0
- package/.agents/skills/mcp-server-patterns/SKILL.md +67 -0
- package/.agents/skills/nextjs-turbopack/SKILL.md +44 -0
- package/.agents/skills/nextjs-turbopack/agents/openai.yaml +7 -0
- package/.agents/skills/security-review/SKILL.md +495 -0
- package/.agents/skills/security-review/agents/openai.yaml +7 -0
- package/.agents/skills/strategic-compact/SKILL.md +103 -0
- package/.agents/skills/strategic-compact/agents/openai.yaml +7 -0
- package/.agents/skills/tdd-workflow/SKILL.md +410 -0
- package/.agents/skills/tdd-workflow/agents/openai.yaml +7 -0
- package/.agents/skills/verification-loop/SKILL.md +126 -0
- package/.agents/skills/verification-loop/agents/openai.yaml +7 -0
- package/.agents/skills/video-editing/SKILL.md +308 -0
- package/.agents/skills/video-editing/agents/openai.yaml +7 -0
- package/.agents/skills/x-api/SKILL.md +214 -0
- package/.agents/skills/x-api/agents/openai.yaml +7 -0
- package/.claude-plugin/README.md +17 -0
- package/.claude-plugin/plugin.json +24 -0
- package/.codex/AGENTS.md +93 -0
- package/.codex/INSTALL.md +64 -0
- package/.codex/agents/docs-researcher.toml +9 -0
- package/.codex/agents/explorer.toml +9 -0
- package/.codex/agents/reviewer.toml +9 -0
- package/.codex/config.toml +108 -0
- package/.codex/hooks/aw-post-tool-use.sh +5 -0
- package/.codex/hooks/aw-pre-tool-use.sh +5 -0
- package/.codex/hooks/aw-session-start.sh +21 -0
- package/.codex/hooks/aw-stop.sh +5 -0
- package/.codex/hooks/aw-user-prompt-submit.sh +9 -0
- package/.codex/hooks.json +62 -0
- package/.cursor/INSTALL.md +40 -0
- package/.cursor/hooks/adapter.js +120 -0
- package/.cursor/hooks/after-file-edit.js +11 -0
- package/.cursor/hooks/after-mcp-execution.js +11 -0
- package/.cursor/hooks/after-shell-execution.js +11 -0
- package/.cursor/hooks/after-tab-file-edit.js +12 -0
- package/.cursor/hooks/aw-phase-adapter.js +43 -0
- package/.cursor/hooks/before-mcp-execution.js +11 -0
- package/.cursor/hooks/before-read-file.js +13 -0
- package/.cursor/hooks/before-shell-execution.js +11 -0
- package/.cursor/hooks/before-submit-prompt.js +41 -0
- package/.cursor/hooks/before-tab-file-read.js +13 -0
- package/.cursor/hooks/pre-compact.js +11 -0
- package/.cursor/hooks/session-end.js +11 -0
- package/.cursor/hooks/session-start.js +11 -0
- package/.cursor/hooks/shared/aw-phase-definitions.js +190 -0
- package/.cursor/hooks/shared/aw-phase-runner.js +61 -0
- package/.cursor/hooks/shared/session-start.sh +20 -0
- package/.cursor/hooks/shared/user-prompt-submit.sh +155 -0
- package/.cursor/hooks/stop.js +11 -0
- package/.cursor/hooks/subagent-start.js +10 -0
- package/.cursor/hooks/subagent-stop.js +10 -0
- package/.cursor/hooks.json +115 -0
- package/.cursor/rules/common-agents.md +53 -0
- package/.cursor/rules/common-coding-style.md +52 -0
- package/.cursor/rules/common-development-workflow.md +33 -0
- package/.cursor/rules/common-git-workflow.md +28 -0
- package/.cursor/rules/common-hooks.md +34 -0
- package/.cursor/rules/common-patterns.md +35 -0
- package/.cursor/rules/common-performance.md +59 -0
- package/.cursor/rules/common-security.md +33 -0
- package/.cursor/rules/common-testing.md +33 -0
- package/.cursor/rules/golang-coding-style.md +31 -0
- package/.cursor/rules/golang-hooks.md +16 -0
- package/.cursor/rules/golang-patterns.md +44 -0
- package/.cursor/rules/golang-security.md +33 -0
- package/.cursor/rules/golang-testing.md +30 -0
- package/.cursor/rules/kotlin-coding-style.md +39 -0
- package/.cursor/rules/kotlin-hooks.md +16 -0
- package/.cursor/rules/kotlin-patterns.md +50 -0
- package/.cursor/rules/kotlin-security.md +58 -0
- package/.cursor/rules/kotlin-testing.md +38 -0
- package/.cursor/rules/php-coding-style.md +25 -0
- package/.cursor/rules/php-hooks.md +21 -0
- package/.cursor/rules/php-patterns.md +23 -0
- package/.cursor/rules/php-security.md +24 -0
- package/.cursor/rules/php-testing.md +26 -0
- package/.cursor/rules/python-coding-style.md +42 -0
- package/.cursor/rules/python-hooks.md +19 -0
- package/.cursor/rules/python-patterns.md +39 -0
- package/.cursor/rules/python-security.md +30 -0
- package/.cursor/rules/python-testing.md +38 -0
- package/.cursor/rules/swift-coding-style.md +47 -0
- package/.cursor/rules/swift-hooks.md +20 -0
- package/.cursor/rules/swift-patterns.md +66 -0
- package/.cursor/rules/swift-security.md +33 -0
- package/.cursor/rules/swift-testing.md +45 -0
- package/.cursor/rules/typescript-coding-style.md +63 -0
- package/.cursor/rules/typescript-hooks.md +20 -0
- package/.cursor/rules/typescript-patterns.md +50 -0
- package/.cursor/rules/typescript-security.md +26 -0
- package/.cursor/rules/typescript-testing.md +16 -0
- package/.cursor/skills/article-writing/SKILL.md +85 -0
- package/.cursor/skills/bun-runtime/SKILL.md +84 -0
- package/.cursor/skills/content-engine/SKILL.md +88 -0
- package/.cursor/skills/documentation-lookup/SKILL.md +90 -0
- package/.cursor/skills/frontend-slides/SKILL.md +184 -0
- package/.cursor/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/.cursor/skills/investor-materials/SKILL.md +96 -0
- package/.cursor/skills/investor-outreach/SKILL.md +76 -0
- package/.cursor/skills/market-research/SKILL.md +75 -0
- package/.cursor/skills/mcp-server-patterns/SKILL.md +67 -0
- package/.cursor/skills/nextjs-turbopack/SKILL.md +44 -0
- package/.opencode/MIGRATION.md +368 -0
- package/.opencode/README.md +204 -0
- package/.opencode/commands/build-fix.md +56 -0
- package/.opencode/commands/checkpoint.md +67 -0
- package/.opencode/commands/code-review.md +68 -0
- package/.opencode/commands/e2e.md +105 -0
- package/.opencode/commands/eval.md +88 -0
- package/.opencode/commands/evolve.md +36 -0
- package/.opencode/commands/go-build.md +87 -0
- package/.opencode/commands/go-review.md +71 -0
- package/.opencode/commands/go-test.md +131 -0
- package/.opencode/commands/harness-audit.md +71 -0
- package/.opencode/commands/instinct-export.md +93 -0
- package/.opencode/commands/instinct-import.md +88 -0
- package/.opencode/commands/instinct-status.md +29 -0
- package/.opencode/commands/learn.md +61 -0
- package/.opencode/commands/loop-start.md +32 -0
- package/.opencode/commands/loop-status.md +24 -0
- package/.opencode/commands/model-route.md +26 -0
- package/.opencode/commands/orchestrate.md +88 -0
- package/.opencode/commands/plan.md +49 -0
- package/.opencode/commands/projects.md +23 -0
- package/.opencode/commands/promote.md +23 -0
- package/.opencode/commands/quality-gate.md +29 -0
- package/.opencode/commands/refactor-clean.md +102 -0
- package/.opencode/commands/rust-build.md +78 -0
- package/.opencode/commands/rust-review.md +65 -0
- package/.opencode/commands/rust-test.md +104 -0
- package/.opencode/commands/security.md +89 -0
- package/.opencode/commands/setup-pm.md +67 -0
- package/.opencode/commands/skill-create.md +117 -0
- package/.opencode/commands/tdd.md +66 -0
- package/.opencode/commands/test-coverage.md +80 -0
- package/.opencode/commands/update-codemaps.md +81 -0
- package/.opencode/commands/update-docs.md +67 -0
- package/.opencode/commands/verify.md +67 -0
- package/.opencode/index.ts +79 -0
- package/.opencode/instructions/INSTRUCTIONS.md +337 -0
- package/.opencode/opencode.json +319 -0
- package/.opencode/package.json +70 -0
- package/.opencode/plugins/ecc-hooks.ts +455 -0
- package/.opencode/plugins/index.ts +12 -0
- package/.opencode/prompts/agents/architect.txt +175 -0
- package/.opencode/prompts/agents/build-error-resolver.txt +233 -0
- package/.opencode/prompts/agents/code-reviewer.txt +103 -0
- package/.opencode/prompts/agents/database-reviewer.txt +247 -0
- package/.opencode/prompts/agents/doc-updater.txt +192 -0
- package/.opencode/prompts/agents/e2e-runner.txt +305 -0
- package/.opencode/prompts/agents/go-build-resolver.txt +325 -0
- package/.opencode/prompts/agents/go-reviewer.txt +241 -0
- package/.opencode/prompts/agents/planner.txt +112 -0
- package/.opencode/prompts/agents/refactor-cleaner.txt +241 -0
- package/.opencode/prompts/agents/rust-build-resolver.txt +93 -0
- package/.opencode/prompts/agents/rust-reviewer.txt +61 -0
- package/.opencode/prompts/agents/security-reviewer.txt +207 -0
- package/.opencode/prompts/agents/tdd-guide.txt +211 -0
- package/.opencode/tools/check-coverage.ts +170 -0
- package/.opencode/tools/format-code.ts +68 -0
- package/.opencode/tools/git-summary.ts +54 -0
- package/.opencode/tools/index.ts +13 -0
- package/.opencode/tools/lint-check.ts +85 -0
- package/.opencode/tools/run-tests.ts +139 -0
- package/.opencode/tools/security-audit.ts +277 -0
- package/.opencode/tsconfig.json +29 -0
- package/AGENTS.md +124 -0
- package/LICENSE +21 -0
- package/README.md +146 -0
- package/README.zh-CN.md +552 -0
- package/agents/architect.md +211 -0
- package/agents/build-error-resolver.md +114 -0
- package/agents/chief-of-staff.md +151 -0
- package/agents/code-reviewer.md +237 -0
- package/agents/cpp-build-resolver.md +90 -0
- package/agents/cpp-reviewer.md +72 -0
- package/agents/database-reviewer.md +91 -0
- package/agents/doc-updater.md +107 -0
- package/agents/docs-lookup.md +68 -0
- package/agents/e2e-runner.md +107 -0
- package/agents/evals/code-reviewer-scenarios.json +23 -0
- package/agents/flutter-reviewer.md +243 -0
- package/agents/go-build-resolver.md +94 -0
- package/agents/go-reviewer.md +76 -0
- package/agents/harness-optimizer.md +35 -0
- package/agents/java-build-resolver.md +153 -0
- package/agents/java-reviewer.md +92 -0
- package/agents/kotlin-build-resolver.md +118 -0
- package/agents/kotlin-reviewer.md +159 -0
- package/agents/loop-operator.md +36 -0
- package/agents/planner.md +212 -0
- package/agents/python-reviewer.md +98 -0
- package/agents/pytorch-build-resolver.md +120 -0
- package/agents/refactor-cleaner.md +85 -0
- package/agents/rust-build-resolver.md +148 -0
- package/agents/rust-reviewer.md +94 -0
- package/agents/security-reviewer.md +108 -0
- package/agents/tdd-guide.md +91 -0
- package/agents/typescript-reviewer.md +112 -0
- package/commands/aside.md +164 -0
- package/commands/brainstorm.md +16 -0
- package/commands/build-fix.md +70 -0
- package/commands/build.md +91 -0
- package/commands/checkpoint.md +74 -0
- package/commands/claw.md +51 -0
- package/commands/code-review.md +24 -0
- package/commands/context-budget.md +29 -0
- package/commands/cpp-build.md +174 -0
- package/commands/cpp-review.md +132 -0
- package/commands/cpp-test.md +252 -0
- package/commands/deploy.md +75 -0
- package/commands/devfleet.md +92 -0
- package/commands/docs.md +31 -0
- package/commands/e2e.md +373 -0
- package/commands/eval.md +120 -0
- package/commands/evolve.md +178 -0
- package/commands/execute.md +51 -0
- package/commands/finish.md +22 -0
- package/commands/go-build.md +184 -0
- package/commands/go-review.md +148 -0
- package/commands/go-test.md +269 -0
- package/commands/gradle-build.md +70 -0
- package/commands/harness-audit.md +71 -0
- package/commands/instinct-export.md +66 -0
- package/commands/instinct-import.md +114 -0
- package/commands/instinct-status.md +59 -0
- package/commands/investigate.md +63 -0
- package/commands/kotlin-build.md +175 -0
- package/commands/kotlin-review.md +140 -0
- package/commands/kotlin-test.md +313 -0
- package/commands/learn-eval.md +116 -0
- package/commands/learn.md +70 -0
- package/commands/loop-start.md +32 -0
- package/commands/loop-status.md +24 -0
- package/commands/model-route.md +26 -0
- package/commands/multi-backend.md +166 -0
- package/commands/multi-execute.md +324 -0
- package/commands/multi-frontend.md +165 -0
- package/commands/multi-plan.md +277 -0
- package/commands/multi-workflow.md +200 -0
- package/commands/orchestrate.md +240 -0
- package/commands/plan.md +130 -0
- package/commands/pm2.md +272 -0
- package/commands/projects.md +39 -0
- package/commands/promote.md +41 -0
- package/commands/prompt-optimize.md +38 -0
- package/commands/prune.md +31 -0
- package/commands/python-review.md +297 -0
- package/commands/quality-gate.md +29 -0
- package/commands/refactor-clean.md +89 -0
- package/commands/resume-session.md +155 -0
- package/commands/review.md +64 -0
- package/commands/rules-distill.md +11 -0
- package/commands/rust-build.md +188 -0
- package/commands/rust-review.md +142 -0
- package/commands/rust-test.md +309 -0
- package/commands/save-session.md +275 -0
- package/commands/sessions.md +333 -0
- package/commands/setup-pm.md +80 -0
- package/commands/ship.md +77 -0
- package/commands/skill-create.md +174 -0
- package/commands/skill-health.md +54 -0
- package/commands/tdd.md +20 -0
- package/commands/test-coverage.md +77 -0
- package/commands/test.md +64 -0
- package/commands/update-codemaps.md +72 -0
- package/commands/update-docs.md +84 -0
- package/commands/verify.md +55 -0
- package/contexts/dev.md +20 -0
- package/contexts/research.md +26 -0
- package/contexts/review.md +22 -0
- package/examples/CLAUDE.md +100 -0
- package/examples/statusline.json +19 -0
- package/examples/user-CLAUDE.md +109 -0
- package/hooks/README.md +219 -0
- package/hooks/hooks.json +320 -0
- package/hooks/run-hook.cmd +31 -0
- package/hooks/session-start +6 -0
- package/install.ps1 +38 -0
- package/install.sh +17 -0
- package/manifests/install-components.json +415 -0
- package/manifests/install-modules.json +500 -0
- package/manifests/install-profiles.json +80 -0
- package/mcp-configs/mcp-servers.json +153 -0
- package/package.json +131 -0
- package/plugins/README.md +85 -0
- package/rules/README.md +106 -0
- package/rules/common/agents.md +50 -0
- package/rules/common/coding-style.md +48 -0
- package/rules/common/development-workflow.md +38 -0
- package/rules/common/git-workflow.md +24 -0
- package/rules/common/hooks.md +30 -0
- package/rules/common/patterns.md +31 -0
- package/rules/common/performance.md +55 -0
- package/rules/common/security.md +29 -0
- package/rules/common/testing.md +29 -0
- package/rules/cpp/coding-style.md +44 -0
- package/rules/cpp/hooks.md +39 -0
- package/rules/cpp/patterns.md +51 -0
- package/rules/cpp/security.md +51 -0
- package/rules/cpp/testing.md +44 -0
- package/rules/csharp/coding-style.md +72 -0
- package/rules/csharp/hooks.md +25 -0
- package/rules/csharp/patterns.md +50 -0
- package/rules/csharp/security.md +58 -0
- package/rules/csharp/testing.md +46 -0
- package/rules/golang/coding-style.md +32 -0
- package/rules/golang/hooks.md +17 -0
- package/rules/golang/patterns.md +45 -0
- package/rules/golang/security.md +34 -0
- package/rules/golang/testing.md +31 -0
- package/rules/java/coding-style.md +114 -0
- package/rules/java/hooks.md +18 -0
- package/rules/java/patterns.md +146 -0
- package/rules/java/security.md +100 -0
- package/rules/java/testing.md +131 -0
- package/rules/kotlin/coding-style.md +86 -0
- package/rules/kotlin/hooks.md +17 -0
- package/rules/kotlin/patterns.md +146 -0
- package/rules/kotlin/security.md +82 -0
- package/rules/kotlin/testing.md +128 -0
- package/rules/perl/coding-style.md +46 -0
- package/rules/perl/hooks.md +22 -0
- package/rules/perl/patterns.md +76 -0
- package/rules/perl/security.md +69 -0
- package/rules/perl/testing.md +54 -0
- package/rules/php/coding-style.md +40 -0
- package/rules/php/hooks.md +24 -0
- package/rules/php/patterns.md +33 -0
- package/rules/php/security.md +37 -0
- package/rules/php/testing.md +39 -0
- package/rules/python/coding-style.md +42 -0
- package/rules/python/hooks.md +19 -0
- package/rules/python/patterns.md +39 -0
- package/rules/python/security.md +30 -0
- package/rules/python/testing.md +38 -0
- package/rules/rust/coding-style.md +151 -0
- package/rules/rust/hooks.md +16 -0
- package/rules/rust/patterns.md +168 -0
- package/rules/rust/security.md +141 -0
- package/rules/rust/testing.md +154 -0
- package/rules/swift/coding-style.md +47 -0
- package/rules/swift/hooks.md +20 -0
- package/rules/swift/patterns.md +66 -0
- package/rules/swift/security.md +33 -0
- package/rules/swift/testing.md +45 -0
- package/rules/typescript/coding-style.md +199 -0
- package/rules/typescript/hooks.md +22 -0
- package/rules/typescript/patterns.md +52 -0
- package/rules/typescript/security.md +28 -0
- package/rules/typescript/testing.md +18 -0
- package/schemas/ecc-install-config.schema.json +58 -0
- package/schemas/hooks.schema.json +197 -0
- package/schemas/install-components.schema.json +58 -0
- package/schemas/install-modules.schema.json +105 -0
- package/schemas/install-profiles.schema.json +45 -0
- package/schemas/install-state.schema.json +210 -0
- package/schemas/package-manager.schema.json +23 -0
- package/schemas/plugin.schema.json +58 -0
- package/schemas/provenance.schema.json +31 -0
- package/schemas/state-store.schema.json +316 -0
- package/scripts/ci/catalog.js +245 -0
- package/scripts/ci/validate-agents.js +81 -0
- package/scripts/ci/validate-commands.js +136 -0
- package/scripts/ci/validate-hooks.js +239 -0
- package/scripts/ci/validate-install-manifests.js +214 -0
- package/scripts/ci/validate-no-personal-paths.js +63 -0
- package/scripts/ci/validate-rules.js +81 -0
- package/scripts/ci/validate-skills.js +56 -0
- package/scripts/claw.js +473 -0
- package/scripts/codex/merge-mcp-config.js +304 -0
- package/scripts/cursor-aw-home/hooks.json +115 -0
- package/scripts/cursor-aw-hooks/adapter.js +120 -0
- package/scripts/cursor-aw-hooks/after-file-edit.js +11 -0
- package/scripts/cursor-aw-hooks/after-mcp-execution.js +11 -0
- package/scripts/cursor-aw-hooks/after-shell-execution.js +11 -0
- package/scripts/cursor-aw-hooks/aw-phase-adapter.js +43 -0
- package/scripts/cursor-aw-hooks/before-mcp-execution.js +11 -0
- package/scripts/cursor-aw-hooks/before-shell-execution.js +11 -0
- package/scripts/cursor-aw-hooks/before-submit-prompt.js +41 -0
- package/scripts/cursor-aw-hooks/pre-compact.js +11 -0
- package/scripts/cursor-aw-hooks/session-end.js +11 -0
- package/scripts/cursor-aw-hooks/session-start.js +11 -0
- package/scripts/cursor-aw-hooks/stop.js +11 -0
- package/scripts/doctor.js +110 -0
- package/scripts/ecc.js +208 -0
- package/scripts/generate-aw-hooks.js +110 -0
- package/scripts/harness-audit.js +512 -0
- package/scripts/hooks/auto-tmux-dev.js +88 -0
- package/scripts/hooks/check-console-log.js +71 -0
- package/scripts/hooks/check-hook-enabled.js +12 -0
- package/scripts/hooks/config-protection.js +125 -0
- package/scripts/hooks/cost-tracker.js +78 -0
- package/scripts/hooks/doc-file-warning.js +63 -0
- package/scripts/hooks/evaluate-session.js +100 -0
- package/scripts/hooks/governance-capture.js +280 -0
- package/scripts/hooks/insaits-security-monitor.py +269 -0
- package/scripts/hooks/insaits-security-wrapper.js +88 -0
- package/scripts/hooks/mcp-health-check.js +588 -0
- package/scripts/hooks/post-bash-build-complete.js +27 -0
- package/scripts/hooks/post-bash-pr-created.js +37 -0
- package/scripts/hooks/post-edit-console-warn.js +54 -0
- package/scripts/hooks/post-edit-format.js +109 -0
- package/scripts/hooks/post-edit-typecheck.js +96 -0
- package/scripts/hooks/post-mcp-log.js +27 -0
- package/scripts/hooks/pre-bash-dev-server-block.js +187 -0
- package/scripts/hooks/pre-bash-git-push-reminder.js +28 -0
- package/scripts/hooks/pre-bash-tmux-reminder.js +33 -0
- package/scripts/hooks/pre-compact.js +48 -0
- package/scripts/hooks/pre-mcp-log.js +26 -0
- package/scripts/hooks/pre-write-doc-warn.js +9 -0
- package/scripts/hooks/quality-gate.js +168 -0
- package/scripts/hooks/run-with-flags-shell.sh +32 -0
- package/scripts/hooks/run-with-flags.js +120 -0
- package/scripts/hooks/session-end-marker.js +29 -0
- package/scripts/hooks/session-end.js +301 -0
- package/scripts/hooks/session-start-rules-context.sh +5 -0
- package/scripts/hooks/session-start.js +98 -0
- package/scripts/hooks/shared/aw-phase-definitions.js +190 -0
- package/scripts/hooks/shared/aw-phase-runner.js +61 -0
- package/scripts/hooks/shared/session-start.sh +20 -0
- package/scripts/hooks/shared/user-prompt-submit.sh +155 -0
- package/scripts/hooks/suggest-compact.js +80 -0
- package/scripts/install-apply.js +140 -0
- package/scripts/install-plan.js +254 -0
- package/scripts/lib/agent-compress.js +244 -0
- package/scripts/lib/aw-harness-registry.js +122 -0
- package/scripts/lib/aw-hook-contract.js +86 -0
- package/scripts/lib/claude-aw-hook-files.js +28 -0
- package/scripts/lib/claude-hook-config.js +76 -0
- package/scripts/lib/codex-aw-hook-files.js +38 -0
- package/scripts/lib/codex-hook-config.js +88 -0
- package/scripts/lib/cursor-aw-hook-files.js +62 -0
- package/scripts/lib/cursor-hook-config.js +148 -0
- package/scripts/lib/hook-flags.js +74 -0
- package/scripts/lib/inspection.js +212 -0
- package/scripts/lib/install/apply.js +23 -0
- package/scripts/lib/install/config.js +82 -0
- package/scripts/lib/install/request.js +120 -0
- package/scripts/lib/install/runtime.js +54 -0
- package/scripts/lib/install-executor.js +778 -0
- package/scripts/lib/install-lifecycle.js +1311 -0
- package/scripts/lib/install-manifests.js +448 -0
- package/scripts/lib/install-state.js +313 -0
- package/scripts/lib/install-targets/antigravity-project.js +69 -0
- package/scripts/lib/install-targets/claude-home.js +54 -0
- package/scripts/lib/install-targets/codex-home.js +62 -0
- package/scripts/lib/install-targets/cursor-project.js +80 -0
- package/scripts/lib/install-targets/helpers.js +307 -0
- package/scripts/lib/install-targets/opencode-home.js +10 -0
- package/scripts/lib/install-targets/registry.js +66 -0
- package/scripts/lib/orchestration-session.js +299 -0
- package/scripts/lib/package-manager.d.ts +119 -0
- package/scripts/lib/package-manager.js +431 -0
- package/scripts/lib/project-detect.js +428 -0
- package/scripts/lib/resolve-ecc-root.js +89 -0
- package/scripts/lib/resolve-formatter.js +185 -0
- package/scripts/lib/session-adapters/canonical-session.js +531 -0
- package/scripts/lib/session-adapters/claude-history.js +160 -0
- package/scripts/lib/session-adapters/dmux-tmux.js +90 -0
- package/scripts/lib/session-adapters/registry.js +127 -0
- package/scripts/lib/session-aliases.d.ts +136 -0
- package/scripts/lib/session-aliases.js +481 -0
- package/scripts/lib/session-manager.d.ts +131 -0
- package/scripts/lib/session-manager.js +464 -0
- package/scripts/lib/shell-split.js +86 -0
- package/scripts/lib/skill-evolution/dashboard.js +401 -0
- package/scripts/lib/skill-evolution/health.js +263 -0
- package/scripts/lib/skill-evolution/index.js +20 -0
- package/scripts/lib/skill-evolution/provenance.js +187 -0
- package/scripts/lib/skill-evolution/tracker.js +146 -0
- package/scripts/lib/skill-evolution/versioning.js +237 -0
- package/scripts/lib/skill-improvement/amendify.js +89 -0
- package/scripts/lib/skill-improvement/evaluate.js +59 -0
- package/scripts/lib/skill-improvement/health.js +118 -0
- package/scripts/lib/skill-improvement/observations.js +108 -0
- package/scripts/lib/state-store/index.js +191 -0
- package/scripts/lib/state-store/migrations.js +178 -0
- package/scripts/lib/state-store/queries.js +697 -0
- package/scripts/lib/state-store/schema.js +92 -0
- package/scripts/lib/tmux-worktree-orchestrator.js +475 -0
- package/scripts/lib/utils.d.ts +183 -0
- package/scripts/lib/utils.js +564 -0
- package/scripts/list-installed.js +90 -0
- package/scripts/orchestrate-codex-worker.sh +107 -0
- package/scripts/orchestrate-worktrees.js +40 -0
- package/scripts/orchestration-status.js +82 -0
- package/scripts/repair.js +97 -0
- package/scripts/session-inspect.js +150 -0
- package/scripts/sessions-cli.js +177 -0
- package/scripts/setup-package-manager.js +204 -0
- package/scripts/skill-create-output.js +244 -0
- package/scripts/status.js +176 -0
- package/scripts/uninstall.js +96 -0
- package/skills/agent-eval/SKILL.md +145 -0
- package/skills/agent-harness-construction/SKILL.md +73 -0
- package/skills/agentic-engineering/SKILL.md +63 -0
- package/skills/ai-first-engineering/SKILL.md +51 -0
- package/skills/ai-regression-testing/SKILL.md +385 -0
- package/skills/android-clean-architecture/SKILL.md +339 -0
- package/skills/api-and-interface-design/SKILL.md +75 -0
- package/skills/api-design/SKILL.md +523 -0
- package/skills/architecture-decision-records/SKILL.md +179 -0
- package/skills/article-writing/SKILL.md +85 -0
- package/skills/autonomous-loops/SKILL.md +610 -0
- package/skills/aw-brainstorm/SKILL.md +115 -0
- package/skills/aw-build/SKILL.md +189 -0
- package/skills/aw-build/evals/build-stage-cases.json +28 -0
- package/skills/aw-debug/SKILL.md +49 -0
- package/skills/aw-deploy/SKILL.md +101 -0
- package/skills/aw-deploy/evals/deploy-stage-cases.json +32 -0
- package/skills/aw-execute/SKILL.md +47 -0
- package/skills/aw-execute/references/mode-code.md +47 -0
- package/skills/aw-execute/references/mode-docs.md +28 -0
- package/skills/aw-execute/references/mode-infra.md +44 -0
- package/skills/aw-execute/references/mode-migration.md +58 -0
- package/skills/aw-execute/references/worker-implementer.md +26 -0
- package/skills/aw-execute/references/worker-parallel-worker.md +23 -0
- package/skills/aw-execute/references/worker-quality-reviewer.md +23 -0
- package/skills/aw-execute/references/worker-spec-reviewer.md +23 -0
- package/skills/aw-execute/scripts/build-worker-bundle.js +229 -0
- package/skills/aw-finish/SKILL.md +111 -0
- package/skills/aw-investigate/SKILL.md +109 -0
- package/skills/aw-plan/SKILL.md +399 -0
- package/skills/aw-prepare/SKILL.md +118 -0
- package/skills/aw-review/SKILL.md +123 -0
- package/skills/aw-rules/SKILL.md +129 -0
- package/skills/aw-rules/references/known-hallucinations.md +43 -0
- package/skills/aw-rules/references/verification-sources.md +50 -0
- package/skills/aw-ship/SKILL.md +115 -0
- package/skills/aw-spec/SKILL.md +128 -0
- package/skills/aw-tasks/SKILL.md +155 -0
- package/skills/aw-test/SKILL.md +118 -0
- package/skills/aw-verify/SKILL.md +51 -0
- package/skills/aw-yolo/SKILL.md +111 -0
- package/skills/backend-patterns/SKILL.md +598 -0
- package/skills/benchmark/SKILL.md +87 -0
- package/skills/blueprint/SKILL.md +105 -0
- package/skills/browser-qa/SKILL.md +81 -0
- package/skills/browser-testing-with-devtools/SKILL.md +81 -0
- package/skills/bun-runtime/SKILL.md +84 -0
- package/skills/canary-watch/SKILL.md +93 -0
- package/skills/carrier-relationship-management/SKILL.md +212 -0
- package/skills/ci-cd-and-automation/SKILL.md +71 -0
- package/skills/claude-api/SKILL.md +337 -0
- package/skills/claude-devfleet/SKILL.md +103 -0
- package/skills/click-path-audit/SKILL.md +244 -0
- package/skills/clickhouse-io/SKILL.md +439 -0
- package/skills/code-simplification/SKILL.md +74 -0
- package/skills/codebase-onboarding/SKILL.md +233 -0
- package/skills/coding-standards/SKILL.md +530 -0
- package/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/skills/configure-ecc/SKILL.md +367 -0
- package/skills/content-engine/SKILL.md +88 -0
- package/skills/content-hash-cache-pattern/SKILL.md +161 -0
- package/skills/context-budget/SKILL.md +135 -0
- package/skills/context-engineering/SKILL.md +74 -0
- package/skills/continuous-agent-loop/SKILL.md +45 -0
- package/skills/continuous-learning/SKILL.md +119 -0
- package/skills/continuous-learning/config.json +18 -0
- package/skills/continuous-learning/evaluate-session.sh +69 -0
- package/skills/continuous-learning-v2/SKILL.md +365 -0
- package/skills/continuous-learning-v2/agents/observer-loop.sh +191 -0
- package/skills/continuous-learning-v2/agents/observer.md +198 -0
- package/skills/continuous-learning-v2/agents/session-guardian.sh +150 -0
- package/skills/continuous-learning-v2/agents/start-observer.sh +240 -0
- package/skills/continuous-learning-v2/config.json +8 -0
- package/skills/continuous-learning-v2/hooks/observe.sh +412 -0
- package/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
- package/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
- package/skills/continuous-learning-v2/scripts/test_parse_instinct.py +984 -0
- package/skills/cost-aware-llm-pipeline/SKILL.md +183 -0
- package/skills/cpp-coding-standards/SKILL.md +723 -0
- package/skills/cpp-testing/SKILL.md +324 -0
- package/skills/crosspost/SKILL.md +190 -0
- package/skills/customs-trade-compliance/SKILL.md +263 -0
- package/skills/data-scraper-agent/SKILL.md +764 -0
- package/skills/database-migrations/SKILL.md +429 -0
- package/skills/deep-research/SKILL.md +155 -0
- package/skills/deployment-patterns/SKILL.md +427 -0
- package/skills/deprecation-and-migration/SKILL.md +75 -0
- package/skills/design-system/SKILL.md +76 -0
- package/skills/django-patterns/SKILL.md +734 -0
- package/skills/django-security/SKILL.md +593 -0
- package/skills/django-tdd/SKILL.md +729 -0
- package/skills/django-verification/SKILL.md +469 -0
- package/skills/dmux-workflows/SKILL.md +191 -0
- package/skills/docker-patterns/SKILL.md +364 -0
- package/skills/documentation-and-adrs/SKILL.md +75 -0
- package/skills/documentation-lookup/SKILL.md +90 -0
- package/skills/e2e-testing/SKILL.md +326 -0
- package/skills/energy-procurement/SKILL.md +228 -0
- package/skills/enterprise-agent-ops/SKILL.md +50 -0
- package/skills/eval-harness/SKILL.md +270 -0
- package/skills/exa-search/SKILL.md +103 -0
- package/skills/fal-ai-media/SKILL.md +284 -0
- package/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/skills/foundation-models-on-device/SKILL.md +243 -0
- package/skills/frontend-patterns/SKILL.md +642 -0
- package/skills/frontend-slides/SKILL.md +184 -0
- package/skills/frontend-slides/STYLE_PRESETS.md +330 -0
- package/skills/frontend-ui-engineering/SKILL.md +68 -0
- package/skills/git-workflow-and-versioning/SKILL.md +75 -0
- package/skills/golang-patterns/SKILL.md +674 -0
- package/skills/golang-testing/SKILL.md +720 -0
- package/skills/idea-refine/SKILL.md +84 -0
- package/skills/incremental-implementation/SKILL.md +86 -0
- package/skills/inventory-demand-planning/SKILL.md +247 -0
- package/skills/investor-materials/SKILL.md +96 -0
- package/skills/investor-outreach/SKILL.md +76 -0
- package/skills/iterative-retrieval/SKILL.md +211 -0
- package/skills/java-coding-standards/SKILL.md +147 -0
- package/skills/jpa-patterns/SKILL.md +151 -0
- package/skills/kotlin-coroutines-flows/SKILL.md +284 -0
- package/skills/kotlin-exposed-patterns/SKILL.md +719 -0
- package/skills/kotlin-ktor-patterns/SKILL.md +689 -0
- package/skills/kotlin-patterns/SKILL.md +711 -0
- package/skills/kotlin-testing/SKILL.md +824 -0
- package/skills/laravel-patterns/SKILL.md +415 -0
- package/skills/laravel-security/SKILL.md +285 -0
- package/skills/laravel-tdd/SKILL.md +283 -0
- package/skills/laravel-verification/SKILL.md +179 -0
- package/skills/liquid-glass-design/SKILL.md +279 -0
- package/skills/logistics-exception-management/SKILL.md +222 -0
- package/skills/market-research/SKILL.md +75 -0
- package/skills/mcp-server-patterns/SKILL.md +67 -0
- package/skills/nanoclaw-repl/SKILL.md +33 -0
- package/skills/nextjs-turbopack/SKILL.md +44 -0
- package/skills/nutrient-document-processing/SKILL.md +167 -0
- package/skills/nuxt4-patterns/SKILL.md +100 -0
- package/skills/performance-optimization/SKILL.md +77 -0
- package/skills/perl-patterns/SKILL.md +504 -0
- package/skills/perl-security/SKILL.md +503 -0
- package/skills/perl-testing/SKILL.md +475 -0
- package/skills/plankton-code-quality/SKILL.md +236 -0
- package/skills/postgres-patterns/SKILL.md +147 -0
- package/skills/product-lens/SKILL.md +79 -0
- package/skills/production-scheduling/SKILL.md +238 -0
- package/skills/project-guidelines-example/SKILL.md +349 -0
- package/skills/prompt-optimizer/SKILL.md +397 -0
- package/skills/python-patterns/SKILL.md +750 -0
- package/skills/python-testing/SKILL.md +816 -0
- package/skills/pytorch-patterns/SKILL.md +396 -0
- package/skills/quality-nonconformance/SKILL.md +260 -0
- package/skills/ralphinho-rfc-pipeline/SKILL.md +67 -0
- package/skills/regex-vs-llm-structured-text/SKILL.md +220 -0
- package/skills/returns-reverse-logistics/SKILL.md +240 -0
- package/skills/rules-distill/SKILL.md +264 -0
- package/skills/rules-distill/scripts/scan-rules.sh +58 -0
- package/skills/rules-distill/scripts/scan-skills.sh +129 -0
- package/skills/rust-patterns/SKILL.md +499 -0
- package/skills/rust-testing/SKILL.md +500 -0
- package/skills/safety-guard/SKILL.md +69 -0
- package/skills/santa-method/SKILL.md +306 -0
- package/skills/search-first/SKILL.md +161 -0
- package/skills/security-and-hardening/SKILL.md +70 -0
- package/skills/security-review/SKILL.md +495 -0
- package/skills/security-review/cloud-infrastructure-security.md +361 -0
- package/skills/security-scan/SKILL.md +165 -0
- package/skills/skill-comply/SKILL.md +58 -0
- package/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -0
- package/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -0
- package/skills/skill-comply/fixtures/tdd_spec.yaml +44 -0
- package/skills/skill-comply/prompts/classifier.md +24 -0
- package/skills/skill-comply/prompts/scenario_generator.md +62 -0
- package/skills/skill-comply/prompts/spec_generator.md +42 -0
- package/skills/skill-comply/pyproject.toml +15 -0
- package/skills/skill-comply/scripts/__init__.py +0 -0
- package/skills/skill-comply/scripts/classifier.py +85 -0
- package/skills/skill-comply/scripts/grader.py +122 -0
- package/skills/skill-comply/scripts/parser.py +107 -0
- package/skills/skill-comply/scripts/report.py +170 -0
- package/skills/skill-comply/scripts/run.py +127 -0
- package/skills/skill-comply/scripts/runner.py +161 -0
- package/skills/skill-comply/scripts/scenario_generator.py +70 -0
- package/skills/skill-comply/scripts/spec_generator.py +72 -0
- package/skills/skill-comply/scripts/utils.py +13 -0
- package/skills/skill-comply/tests/test_grader.py +137 -0
- package/skills/skill-comply/tests/test_parser.py +90 -0
- package/skills/skill-quality-review/SKILL.md +102 -0
- package/skills/skill-quality-review/references/review-rubric.md +112 -0
- package/skills/skill-stocktake/SKILL.md +197 -0
- package/skills/skill-stocktake/scripts/quick-diff.sh +87 -0
- package/skills/skill-stocktake/scripts/save-results.sh +56 -0
- package/skills/skill-stocktake/scripts/scan.sh +170 -0
- package/skills/springboot-patterns/SKILL.md +314 -0
- package/skills/springboot-security/SKILL.md +272 -0
- package/skills/springboot-tdd/SKILL.md +158 -0
- package/skills/springboot-verification/SKILL.md +231 -0
- package/skills/strategic-compact/SKILL.md +131 -0
- package/skills/strategic-compact/suggest-compact.sh +54 -0
- package/skills/swift-actor-persistence/SKILL.md +143 -0
- package/skills/swift-concurrency-6-2/SKILL.md +216 -0
- package/skills/swift-protocol-di-testing/SKILL.md +190 -0
- package/skills/swiftui-patterns/SKILL.md +259 -0
- package/skills/tdd-workflow/SKILL.md +145 -0
- package/skills/team-builder/SKILL.md +161 -0
- package/skills/using-aw-skills/SKILL.md +290 -0
- package/skills/using-aw-skills/evals/skill-trigger-cases.tsv +25 -0
- package/skills/using-aw-skills/evals/test-skill-triggers.sh +171 -0
- package/skills/using-aw-skills/hooks/hooks.json +9 -0
- package/skills/using-aw-skills/hooks/session-start.sh +188 -0
- package/skills/using-platform-skills/SKILL.md +163 -0
- package/skills/using-platform-skills/evals/platform-selection-cases.json +52 -0
- package/skills/verification-loop/SKILL.md +126 -0
- package/skills/video-editing/SKILL.md +310 -0
- package/skills/videodb/SKILL.md +374 -0
- package/skills/videodb/reference/api-reference.md +550 -0
- package/skills/videodb/reference/capture-reference.md +407 -0
- package/skills/videodb/reference/capture.md +101 -0
- package/skills/videodb/reference/editor.md +443 -0
- package/skills/videodb/reference/generative.md +331 -0
- package/skills/videodb/reference/rtstream-reference.md +564 -0
- package/skills/videodb/reference/rtstream.md +65 -0
- package/skills/videodb/reference/search.md +230 -0
- package/skills/videodb/reference/streaming.md +406 -0
- package/skills/videodb/reference/use-cases.md +118 -0
- package/skills/videodb/scripts/ws_listener.py +282 -0
- package/skills/visa-doc-translate/README.md +86 -0
- package/skills/visa-doc-translate/SKILL.md +117 -0
- package/skills/x-api/SKILL.md +208 -0
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
|
|
6
|
+
const REPO_ROOT = path.join(__dirname, '..');
|
|
7
|
+
|
|
8
|
+
const CATEGORIES = [
|
|
9
|
+
'Tool Coverage',
|
|
10
|
+
'Context Efficiency',
|
|
11
|
+
'Quality Gates',
|
|
12
|
+
'Memory Persistence',
|
|
13
|
+
'Eval Coverage',
|
|
14
|
+
'Security Guardrails',
|
|
15
|
+
'Cost Efficiency',
|
|
16
|
+
];
|
|
17
|
+
|
|
18
|
+
function normalizeScope(scope) {
|
|
19
|
+
const value = (scope || 'repo').toLowerCase();
|
|
20
|
+
if (!['repo', 'hooks', 'skills', 'commands', 'agents'].includes(value)) {
|
|
21
|
+
throw new Error(`Invalid scope: ${scope}`);
|
|
22
|
+
}
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
function parseArgs(argv) {
|
|
27
|
+
const args = argv.slice(2);
|
|
28
|
+
const parsed = {
|
|
29
|
+
scope: 'repo',
|
|
30
|
+
format: 'text',
|
|
31
|
+
help: false,
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
for (let index = 0; index < args.length; index += 1) {
|
|
35
|
+
const arg = args[index];
|
|
36
|
+
|
|
37
|
+
if (arg === '--help' || arg === '-h') {
|
|
38
|
+
parsed.help = true;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (arg === '--format') {
|
|
43
|
+
parsed.format = (args[index + 1] || '').toLowerCase();
|
|
44
|
+
index += 1;
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
if (arg === '--scope') {
|
|
49
|
+
parsed.scope = normalizeScope(args[index + 1]);
|
|
50
|
+
index += 1;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (arg.startsWith('--format=')) {
|
|
55
|
+
parsed.format = arg.split('=')[1].toLowerCase();
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (arg.startsWith('--scope=')) {
|
|
60
|
+
parsed.scope = normalizeScope(arg.split('=')[1]);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (arg.startsWith('-')) {
|
|
65
|
+
throw new Error(`Unknown argument: ${arg}`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
parsed.scope = normalizeScope(arg);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (!['text', 'json'].includes(parsed.format)) {
|
|
72
|
+
throw new Error(`Invalid format: ${parsed.format}. Use text or json.`);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return parsed;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function fileExists(relativePath) {
|
|
79
|
+
return fs.existsSync(path.join(REPO_ROOT, relativePath));
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
function readText(relativePath) {
|
|
83
|
+
return fs.readFileSync(path.join(REPO_ROOT, relativePath), 'utf8');
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function countFiles(relativeDir, extension) {
|
|
87
|
+
const dirPath = path.join(REPO_ROOT, relativeDir);
|
|
88
|
+
if (!fs.existsSync(dirPath)) {
|
|
89
|
+
return 0;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const stack = [dirPath];
|
|
93
|
+
let count = 0;
|
|
94
|
+
|
|
95
|
+
while (stack.length > 0) {
|
|
96
|
+
const current = stack.pop();
|
|
97
|
+
const entries = fs.readdirSync(current, { withFileTypes: true });
|
|
98
|
+
|
|
99
|
+
for (const entry of entries) {
|
|
100
|
+
const nextPath = path.join(current, entry.name);
|
|
101
|
+
if (entry.isDirectory()) {
|
|
102
|
+
stack.push(nextPath);
|
|
103
|
+
} else if (!extension || entry.name.endsWith(extension)) {
|
|
104
|
+
count += 1;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return count;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
function safeRead(relativePath) {
|
|
113
|
+
try {
|
|
114
|
+
return readText(relativePath);
|
|
115
|
+
} catch (_error) {
|
|
116
|
+
return '';
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function getChecks() {
|
|
121
|
+
const packageJson = JSON.parse(readText('package.json'));
|
|
122
|
+
const commandPrimary = safeRead('commands/harness-audit.md').trim();
|
|
123
|
+
const commandParity = safeRead('.opencode/commands/harness-audit.md').trim();
|
|
124
|
+
const hooksJson = safeRead('hooks/hooks.json');
|
|
125
|
+
|
|
126
|
+
return [
|
|
127
|
+
{
|
|
128
|
+
id: 'tool-hooks-config',
|
|
129
|
+
category: 'Tool Coverage',
|
|
130
|
+
points: 2,
|
|
131
|
+
scopes: ['repo', 'hooks'],
|
|
132
|
+
path: 'hooks/hooks.json',
|
|
133
|
+
description: 'Hook configuration file exists',
|
|
134
|
+
pass: fileExists('hooks/hooks.json'),
|
|
135
|
+
fix: 'Create hooks/hooks.json and define baseline hook events.',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
id: 'tool-hooks-impl-count',
|
|
139
|
+
category: 'Tool Coverage',
|
|
140
|
+
points: 2,
|
|
141
|
+
scopes: ['repo', 'hooks'],
|
|
142
|
+
path: 'scripts/hooks/',
|
|
143
|
+
description: 'At least 8 hook implementation scripts exist',
|
|
144
|
+
pass: countFiles('scripts/hooks', '.js') >= 8,
|
|
145
|
+
fix: 'Add missing hook implementations in scripts/hooks/.',
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
id: 'tool-agent-count',
|
|
149
|
+
category: 'Tool Coverage',
|
|
150
|
+
points: 2,
|
|
151
|
+
scopes: ['repo', 'agents'],
|
|
152
|
+
path: 'agents/',
|
|
153
|
+
description: 'At least 10 agent definitions exist',
|
|
154
|
+
pass: countFiles('agents', '.md') >= 10,
|
|
155
|
+
fix: 'Add or restore agent definitions under agents/.',
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
id: 'tool-skill-count',
|
|
159
|
+
category: 'Tool Coverage',
|
|
160
|
+
points: 2,
|
|
161
|
+
scopes: ['repo', 'skills'],
|
|
162
|
+
path: 'skills/',
|
|
163
|
+
description: 'At least 20 skill definitions exist',
|
|
164
|
+
pass: countFiles('skills', 'SKILL.md') >= 20,
|
|
165
|
+
fix: 'Add missing skill directories with SKILL.md definitions.',
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
id: 'tool-command-parity',
|
|
169
|
+
category: 'Tool Coverage',
|
|
170
|
+
points: 2,
|
|
171
|
+
scopes: ['repo', 'commands'],
|
|
172
|
+
path: '.opencode/commands/harness-audit.md',
|
|
173
|
+
description: 'Harness-audit command parity exists between primary and OpenCode command docs',
|
|
174
|
+
pass: commandPrimary.length > 0 && commandPrimary === commandParity,
|
|
175
|
+
fix: 'Sync commands/harness-audit.md and .opencode/commands/harness-audit.md.',
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
id: 'context-strategic-compact',
|
|
179
|
+
category: 'Context Efficiency',
|
|
180
|
+
points: 3,
|
|
181
|
+
scopes: ['repo', 'skills'],
|
|
182
|
+
path: 'skills/strategic-compact/SKILL.md',
|
|
183
|
+
description: 'Strategic compaction guidance is present',
|
|
184
|
+
pass: fileExists('skills/strategic-compact/SKILL.md'),
|
|
185
|
+
fix: 'Add strategic context compaction guidance at skills/strategic-compact/SKILL.md.',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
id: 'context-suggest-compact-hook',
|
|
189
|
+
category: 'Context Efficiency',
|
|
190
|
+
points: 3,
|
|
191
|
+
scopes: ['repo', 'hooks'],
|
|
192
|
+
path: 'scripts/hooks/suggest-compact.js',
|
|
193
|
+
description: 'Suggest-compact automation hook exists',
|
|
194
|
+
pass: fileExists('scripts/hooks/suggest-compact.js'),
|
|
195
|
+
fix: 'Implement scripts/hooks/suggest-compact.js for context pressure hints.',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
id: 'context-model-route',
|
|
199
|
+
category: 'Context Efficiency',
|
|
200
|
+
points: 2,
|
|
201
|
+
scopes: ['repo', 'commands'],
|
|
202
|
+
path: 'commands/model-route.md',
|
|
203
|
+
description: 'Model routing command exists',
|
|
204
|
+
pass: fileExists('commands/model-route.md'),
|
|
205
|
+
fix: 'Add model-route command guidance in commands/model-route.md.',
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
id: 'context-token-doc',
|
|
209
|
+
category: 'Context Efficiency',
|
|
210
|
+
points: 2,
|
|
211
|
+
scopes: ['repo'],
|
|
212
|
+
path: 'docs/token-optimization.md',
|
|
213
|
+
description: 'Token optimization documentation exists',
|
|
214
|
+
pass: fileExists('docs/token-optimization.md'),
|
|
215
|
+
fix: 'Add docs/token-optimization.md with concrete context-cost controls.',
|
|
216
|
+
},
|
|
217
|
+
{
|
|
218
|
+
id: 'quality-test-runner',
|
|
219
|
+
category: 'Quality Gates',
|
|
220
|
+
points: 3,
|
|
221
|
+
scopes: ['repo'],
|
|
222
|
+
path: 'tests/run-all.js',
|
|
223
|
+
description: 'Central test runner exists',
|
|
224
|
+
pass: fileExists('tests/run-all.js'),
|
|
225
|
+
fix: 'Add tests/run-all.js to enforce complete suite execution.',
|
|
226
|
+
},
|
|
227
|
+
{
|
|
228
|
+
id: 'quality-ci-validations',
|
|
229
|
+
category: 'Quality Gates',
|
|
230
|
+
points: 3,
|
|
231
|
+
scopes: ['repo'],
|
|
232
|
+
path: 'package.json',
|
|
233
|
+
description: 'Test script runs validator chain before tests',
|
|
234
|
+
pass: typeof packageJson.scripts?.test === 'string' && packageJson.scripts.test.includes('validate-commands.js') && packageJson.scripts.test.includes('tests/run-all.js'),
|
|
235
|
+
fix: 'Update package.json test script to run validators plus tests/run-all.js.',
|
|
236
|
+
},
|
|
237
|
+
{
|
|
238
|
+
id: 'quality-hook-tests',
|
|
239
|
+
category: 'Quality Gates',
|
|
240
|
+
points: 2,
|
|
241
|
+
scopes: ['repo', 'hooks'],
|
|
242
|
+
path: 'tests/hooks/hooks.test.js',
|
|
243
|
+
description: 'Hook coverage test file exists',
|
|
244
|
+
pass: fileExists('tests/hooks/hooks.test.js'),
|
|
245
|
+
fix: 'Add tests/hooks/hooks.test.js for hook behavior validation.',
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
id: 'quality-doctor-script',
|
|
249
|
+
category: 'Quality Gates',
|
|
250
|
+
points: 2,
|
|
251
|
+
scopes: ['repo'],
|
|
252
|
+
path: 'scripts/doctor.js',
|
|
253
|
+
description: 'Installation drift doctor script exists',
|
|
254
|
+
pass: fileExists('scripts/doctor.js'),
|
|
255
|
+
fix: 'Add scripts/doctor.js for install-state integrity checks.',
|
|
256
|
+
},
|
|
257
|
+
{
|
|
258
|
+
id: 'memory-hooks-dir',
|
|
259
|
+
category: 'Memory Persistence',
|
|
260
|
+
points: 4,
|
|
261
|
+
scopes: ['repo', 'hooks'],
|
|
262
|
+
path: 'hooks/memory-persistence/',
|
|
263
|
+
description: 'Memory persistence hooks directory exists',
|
|
264
|
+
pass: fileExists('hooks/memory-persistence'),
|
|
265
|
+
fix: 'Add hooks/memory-persistence with lifecycle hook definitions.',
|
|
266
|
+
},
|
|
267
|
+
{
|
|
268
|
+
id: 'memory-session-hooks',
|
|
269
|
+
category: 'Memory Persistence',
|
|
270
|
+
points: 4,
|
|
271
|
+
scopes: ['repo', 'hooks'],
|
|
272
|
+
path: 'scripts/hooks/session-start.js',
|
|
273
|
+
description: 'Session start/end persistence scripts exist',
|
|
274
|
+
pass: fileExists('scripts/hooks/session-start.js') && fileExists('scripts/hooks/session-end.js'),
|
|
275
|
+
fix: 'Implement scripts/hooks/session-start.js and scripts/hooks/session-end.js.',
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
id: 'memory-learning-skill',
|
|
279
|
+
category: 'Memory Persistence',
|
|
280
|
+
points: 2,
|
|
281
|
+
scopes: ['repo', 'skills'],
|
|
282
|
+
path: 'skills/continuous-learning-v2/SKILL.md',
|
|
283
|
+
description: 'Continuous learning v2 skill exists',
|
|
284
|
+
pass: fileExists('skills/continuous-learning-v2/SKILL.md'),
|
|
285
|
+
fix: 'Add skills/continuous-learning-v2/SKILL.md for memory evolution flow.',
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
id: 'eval-skill',
|
|
289
|
+
category: 'Eval Coverage',
|
|
290
|
+
points: 4,
|
|
291
|
+
scopes: ['repo', 'skills'],
|
|
292
|
+
path: 'skills/eval-harness/SKILL.md',
|
|
293
|
+
description: 'Eval harness skill exists',
|
|
294
|
+
pass: fileExists('skills/eval-harness/SKILL.md'),
|
|
295
|
+
fix: 'Add skills/eval-harness/SKILL.md for pass/fail regression evaluation.',
|
|
296
|
+
},
|
|
297
|
+
{
|
|
298
|
+
id: 'eval-commands',
|
|
299
|
+
category: 'Eval Coverage',
|
|
300
|
+
points: 4,
|
|
301
|
+
scopes: ['repo', 'commands'],
|
|
302
|
+
path: 'commands/eval.md',
|
|
303
|
+
description: 'Eval and verification commands exist',
|
|
304
|
+
pass: fileExists('commands/eval.md') && fileExists('commands/verify.md') && fileExists('commands/checkpoint.md'),
|
|
305
|
+
fix: 'Add eval/checkpoint/verify commands to standardize verification loops.',
|
|
306
|
+
},
|
|
307
|
+
{
|
|
308
|
+
id: 'eval-tests-presence',
|
|
309
|
+
category: 'Eval Coverage',
|
|
310
|
+
points: 2,
|
|
311
|
+
scopes: ['repo'],
|
|
312
|
+
path: 'tests/',
|
|
313
|
+
description: 'At least 10 test files exist',
|
|
314
|
+
pass: countFiles('tests', '.test.js') >= 10,
|
|
315
|
+
fix: 'Increase automated test coverage across scripts/hooks/lib.',
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
id: 'security-review-skill',
|
|
319
|
+
category: 'Security Guardrails',
|
|
320
|
+
points: 3,
|
|
321
|
+
scopes: ['repo', 'skills'],
|
|
322
|
+
path: 'skills/security-review/SKILL.md',
|
|
323
|
+
description: 'Security review skill exists',
|
|
324
|
+
pass: fileExists('skills/security-review/SKILL.md'),
|
|
325
|
+
fix: 'Add skills/security-review/SKILL.md for security checklist coverage.',
|
|
326
|
+
},
|
|
327
|
+
{
|
|
328
|
+
id: 'security-agent',
|
|
329
|
+
category: 'Security Guardrails',
|
|
330
|
+
points: 3,
|
|
331
|
+
scopes: ['repo', 'agents'],
|
|
332
|
+
path: 'agents/security-reviewer.md',
|
|
333
|
+
description: 'Security reviewer agent exists',
|
|
334
|
+
pass: fileExists('agents/security-reviewer.md'),
|
|
335
|
+
fix: 'Add agents/security-reviewer.md for delegated security audits.',
|
|
336
|
+
},
|
|
337
|
+
{
|
|
338
|
+
id: 'security-prompt-hook',
|
|
339
|
+
category: 'Security Guardrails',
|
|
340
|
+
points: 2,
|
|
341
|
+
scopes: ['repo', 'hooks'],
|
|
342
|
+
path: 'hooks/hooks.json',
|
|
343
|
+
description: 'Hooks include prompt submission guardrail event references',
|
|
344
|
+
pass: hooksJson.includes('beforeSubmitPrompt') || hooksJson.includes('PreToolUse'),
|
|
345
|
+
fix: 'Add prompt/tool preflight security guards in hooks/hooks.json.',
|
|
346
|
+
},
|
|
347
|
+
{
|
|
348
|
+
id: 'security-scan-command',
|
|
349
|
+
category: 'Security Guardrails',
|
|
350
|
+
points: 2,
|
|
351
|
+
scopes: ['repo', 'commands'],
|
|
352
|
+
path: 'commands/security-scan.md',
|
|
353
|
+
description: 'Security scan command exists',
|
|
354
|
+
pass: fileExists('commands/security-scan.md'),
|
|
355
|
+
fix: 'Add commands/security-scan.md with scan and remediation workflow.',
|
|
356
|
+
},
|
|
357
|
+
{
|
|
358
|
+
id: 'cost-skill',
|
|
359
|
+
category: 'Cost Efficiency',
|
|
360
|
+
points: 4,
|
|
361
|
+
scopes: ['repo', 'skills'],
|
|
362
|
+
path: 'skills/cost-aware-llm-pipeline/SKILL.md',
|
|
363
|
+
description: 'Cost-aware LLM skill exists',
|
|
364
|
+
pass: fileExists('skills/cost-aware-llm-pipeline/SKILL.md'),
|
|
365
|
+
fix: 'Add skills/cost-aware-llm-pipeline/SKILL.md for budget-aware routing.',
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
id: 'cost-doc',
|
|
369
|
+
category: 'Cost Efficiency',
|
|
370
|
+
points: 3,
|
|
371
|
+
scopes: ['repo'],
|
|
372
|
+
path: 'docs/token-optimization.md',
|
|
373
|
+
description: 'Cost optimization documentation exists',
|
|
374
|
+
pass: fileExists('docs/token-optimization.md'),
|
|
375
|
+
fix: 'Create docs/token-optimization.md with target settings and tradeoffs.',
|
|
376
|
+
},
|
|
377
|
+
{
|
|
378
|
+
id: 'cost-model-route-command',
|
|
379
|
+
category: 'Cost Efficiency',
|
|
380
|
+
points: 3,
|
|
381
|
+
scopes: ['repo', 'commands'],
|
|
382
|
+
path: 'commands/model-route.md',
|
|
383
|
+
description: 'Model route command exists for complexity-aware routing',
|
|
384
|
+
pass: fileExists('commands/model-route.md'),
|
|
385
|
+
fix: 'Add commands/model-route.md and route policies for cheap-default execution.',
|
|
386
|
+
},
|
|
387
|
+
];
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function summarizeCategoryScores(checks) {
|
|
391
|
+
const scores = {};
|
|
392
|
+
for (const category of CATEGORIES) {
|
|
393
|
+
const inCategory = checks.filter(check => check.category === category);
|
|
394
|
+
const max = inCategory.reduce((sum, check) => sum + check.points, 0);
|
|
395
|
+
const earned = inCategory
|
|
396
|
+
.filter(check => check.pass)
|
|
397
|
+
.reduce((sum, check) => sum + check.points, 0);
|
|
398
|
+
|
|
399
|
+
const normalized = max === 0 ? 0 : Math.round((earned / max) * 10);
|
|
400
|
+
scores[category] = {
|
|
401
|
+
score: normalized,
|
|
402
|
+
earned,
|
|
403
|
+
max,
|
|
404
|
+
};
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
return scores;
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
function buildReport(scope) {
|
|
411
|
+
const checks = getChecks().filter(check => check.scopes.includes(scope));
|
|
412
|
+
const categoryScores = summarizeCategoryScores(checks);
|
|
413
|
+
const maxScore = checks.reduce((sum, check) => sum + check.points, 0);
|
|
414
|
+
const overallScore = checks
|
|
415
|
+
.filter(check => check.pass)
|
|
416
|
+
.reduce((sum, check) => sum + check.points, 0);
|
|
417
|
+
|
|
418
|
+
const failedChecks = checks.filter(check => !check.pass);
|
|
419
|
+
const topActions = failedChecks
|
|
420
|
+
.sort((left, right) => right.points - left.points)
|
|
421
|
+
.slice(0, 3)
|
|
422
|
+
.map(check => ({
|
|
423
|
+
action: check.fix,
|
|
424
|
+
path: check.path,
|
|
425
|
+
category: check.category,
|
|
426
|
+
points: check.points,
|
|
427
|
+
}));
|
|
428
|
+
|
|
429
|
+
return {
|
|
430
|
+
scope,
|
|
431
|
+
deterministic: true,
|
|
432
|
+
rubric_version: '2026-03-16',
|
|
433
|
+
overall_score: overallScore,
|
|
434
|
+
max_score: maxScore,
|
|
435
|
+
categories: categoryScores,
|
|
436
|
+
checks: checks.map(check => ({
|
|
437
|
+
id: check.id,
|
|
438
|
+
category: check.category,
|
|
439
|
+
points: check.points,
|
|
440
|
+
path: check.path,
|
|
441
|
+
description: check.description,
|
|
442
|
+
pass: check.pass,
|
|
443
|
+
})),
|
|
444
|
+
top_actions: topActions,
|
|
445
|
+
};
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
function printText(report) {
|
|
449
|
+
console.log(`Harness Audit (${report.scope}): ${report.overall_score}/${report.max_score}`);
|
|
450
|
+
console.log('');
|
|
451
|
+
|
|
452
|
+
for (const category of CATEGORIES) {
|
|
453
|
+
const data = report.categories[category];
|
|
454
|
+
if (!data || data.max === 0) {
|
|
455
|
+
continue;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
console.log(`- ${category}: ${data.score}/10 (${data.earned}/${data.max} pts)`);
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
const failed = report.checks.filter(check => !check.pass);
|
|
462
|
+
console.log('');
|
|
463
|
+
console.log(`Checks: ${report.checks.length} total, ${failed.length} failing`);
|
|
464
|
+
|
|
465
|
+
if (failed.length > 0) {
|
|
466
|
+
console.log('');
|
|
467
|
+
console.log('Top 3 Actions:');
|
|
468
|
+
report.top_actions.forEach((action, index) => {
|
|
469
|
+
console.log(`${index + 1}) [${action.category}] ${action.action} (${action.path})`);
|
|
470
|
+
});
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
function showHelp(exitCode = 0) {
|
|
475
|
+
console.log(`
|
|
476
|
+
Usage: node scripts/harness-audit.js [scope] [--scope <repo|hooks|skills|commands|agents>] [--format <text|json>]
|
|
477
|
+
|
|
478
|
+
Deterministic harness audit based on explicit file/rule checks.
|
|
479
|
+
`);
|
|
480
|
+
process.exit(exitCode);
|
|
481
|
+
}
|
|
482
|
+
|
|
483
|
+
function main() {
|
|
484
|
+
try {
|
|
485
|
+
const args = parseArgs(process.argv);
|
|
486
|
+
|
|
487
|
+
if (args.help) {
|
|
488
|
+
showHelp(0);
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
const report = buildReport(args.scope);
|
|
493
|
+
|
|
494
|
+
if (args.format === 'json') {
|
|
495
|
+
console.log(JSON.stringify(report, null, 2));
|
|
496
|
+
} else {
|
|
497
|
+
printText(report);
|
|
498
|
+
}
|
|
499
|
+
} catch (error) {
|
|
500
|
+
console.error(`Error: ${error.message}`);
|
|
501
|
+
process.exit(1);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
if (require.main === module) {
|
|
506
|
+
main();
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
module.exports = {
|
|
510
|
+
buildReport,
|
|
511
|
+
parseArgs,
|
|
512
|
+
};
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Auto-Tmux Dev Hook - Start dev servers in tmux/cmd automatically
|
|
4
|
+
*
|
|
5
|
+
* macOS/Linux: Runs dev server in a named tmux session (non-blocking).
|
|
6
|
+
* Falls back to original command if tmux is not installed.
|
|
7
|
+
* Windows: Opens dev server in a new cmd window (non-blocking).
|
|
8
|
+
*
|
|
9
|
+
* Runs before Bash tool use. If command is a dev server (npm run dev, pnpm dev, yarn dev, bun run dev),
|
|
10
|
+
* transforms it to run in a detached session.
|
|
11
|
+
*
|
|
12
|
+
* Benefits:
|
|
13
|
+
* - Dev server runs detached (doesn't block Claude Code)
|
|
14
|
+
* - Session persists (can run `tmux capture-pane -t <session> -p` to see logs on Unix)
|
|
15
|
+
* - Session name matches project directory (allows multiple projects simultaneously)
|
|
16
|
+
*
|
|
17
|
+
* Session management (Unix):
|
|
18
|
+
* - Checks tmux availability before transforming
|
|
19
|
+
* - Kills any existing session with the same name (clean restart)
|
|
20
|
+
* - Creates new detached session
|
|
21
|
+
* - Reports session name and how to view logs
|
|
22
|
+
*
|
|
23
|
+
* Session management (Windows):
|
|
24
|
+
* - Opens new cmd window with descriptive title
|
|
25
|
+
* - Allows multiple dev servers to run simultaneously
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
const path = require('path');
|
|
29
|
+
const { spawnSync } = require('child_process');
|
|
30
|
+
|
|
31
|
+
const MAX_STDIN = 1024 * 1024; // 1MB limit
|
|
32
|
+
let data = '';
|
|
33
|
+
process.stdin.setEncoding('utf8');
|
|
34
|
+
|
|
35
|
+
process.stdin.on('data', chunk => {
|
|
36
|
+
if (data.length < MAX_STDIN) {
|
|
37
|
+
const remaining = MAX_STDIN - data.length;
|
|
38
|
+
data += chunk.substring(0, remaining);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
process.stdin.on('end', () => {
|
|
43
|
+
let input;
|
|
44
|
+
try {
|
|
45
|
+
input = JSON.parse(data);
|
|
46
|
+
const cmd = input.tool_input?.command || '';
|
|
47
|
+
|
|
48
|
+
// Detect dev server commands: npm run dev, pnpm dev, yarn dev, bun run dev
|
|
49
|
+
// Use word boundary (\b) to avoid matching partial commands
|
|
50
|
+
const devServerRegex = /(npm run dev\b|pnpm( run)? dev\b|yarn dev\b|bun run dev\b)/;
|
|
51
|
+
|
|
52
|
+
if (devServerRegex.test(cmd)) {
|
|
53
|
+
// Get session name from current directory basename, sanitize for shell safety
|
|
54
|
+
// e.g., /home/user/Portfolio → "Portfolio", /home/user/my-app-v2 → "my-app-v2"
|
|
55
|
+
const rawName = path.basename(process.cwd());
|
|
56
|
+
// Replace non-alphanumeric characters (except - and _) with underscore to prevent shell injection
|
|
57
|
+
const sessionName = rawName.replace(/[^a-zA-Z0-9_-]/g, '_') || 'dev';
|
|
58
|
+
|
|
59
|
+
if (process.platform === 'win32') {
|
|
60
|
+
// Windows: open in a new cmd window (non-blocking)
|
|
61
|
+
// Escape double quotes in cmd for cmd /k syntax
|
|
62
|
+
const escapedCmd = cmd.replace(/"/g, '""');
|
|
63
|
+
input.tool_input.command = `start "DevServer-${sessionName}" cmd /k "${escapedCmd}"`;
|
|
64
|
+
} else {
|
|
65
|
+
// Unix (macOS/Linux): Check tmux is available before transforming
|
|
66
|
+
const tmuxCheck = spawnSync('which', ['tmux'], { encoding: 'utf8' });
|
|
67
|
+
if (tmuxCheck.status === 0) {
|
|
68
|
+
// Escape single quotes for shell safety: 'text' -> 'text'\''text'
|
|
69
|
+
const escapedCmd = cmd.replace(/'/g, "'\\''");
|
|
70
|
+
|
|
71
|
+
// Build the transformed command:
|
|
72
|
+
// 1. Kill existing session (silent if doesn't exist)
|
|
73
|
+
// 2. Create new detached session with the dev command
|
|
74
|
+
// 3. Echo confirmation message with instructions for viewing logs
|
|
75
|
+
const transformedCmd = `SESSION="${sessionName}"; tmux kill-session -t "$SESSION" 2>/dev/null || true; tmux new-session -d -s "$SESSION" '${escapedCmd}' && echo "[Hook] Dev server started in tmux session '${sessionName}'. View logs: tmux capture-pane -t ${sessionName} -p -S -100"`;
|
|
76
|
+
|
|
77
|
+
input.tool_input.command = transformedCmd;
|
|
78
|
+
}
|
|
79
|
+
// else: tmux not found, pass through original command unchanged
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
process.stdout.write(JSON.stringify(input));
|
|
83
|
+
} catch {
|
|
84
|
+
// Invalid input — pass through original data unchanged
|
|
85
|
+
process.stdout.write(data);
|
|
86
|
+
}
|
|
87
|
+
process.exit(0);
|
|
88
|
+
});
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Stop Hook: Check for console.log statements in modified files
|
|
5
|
+
*
|
|
6
|
+
* Cross-platform (Windows, macOS, Linux)
|
|
7
|
+
*
|
|
8
|
+
* Runs after each response and checks if any modified JavaScript/TypeScript
|
|
9
|
+
* files contain console.log statements. Provides warnings to help developers
|
|
10
|
+
* remember to remove debug statements before committing.
|
|
11
|
+
*
|
|
12
|
+
* Exclusions: test files, config files, and scripts/ directory (where
|
|
13
|
+
* console.log is often intentional).
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
const fs = require('fs');
|
|
17
|
+
const { isGitRepo, getGitModifiedFiles, readFile, log } = require('../lib/utils');
|
|
18
|
+
|
|
19
|
+
// Files where console.log is expected and should not trigger warnings
|
|
20
|
+
const EXCLUDED_PATTERNS = [
|
|
21
|
+
/\.test\.[jt]sx?$/,
|
|
22
|
+
/\.spec\.[jt]sx?$/,
|
|
23
|
+
/\.config\.[jt]s$/,
|
|
24
|
+
/scripts\//,
|
|
25
|
+
/__tests__\//,
|
|
26
|
+
/__mocks__\//,
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
const MAX_STDIN = 1024 * 1024; // 1MB limit
|
|
30
|
+
let data = '';
|
|
31
|
+
process.stdin.setEncoding('utf8');
|
|
32
|
+
|
|
33
|
+
process.stdin.on('data', chunk => {
|
|
34
|
+
if (data.length < MAX_STDIN) {
|
|
35
|
+
const remaining = MAX_STDIN - data.length;
|
|
36
|
+
data += chunk.substring(0, remaining);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
process.stdin.on('end', () => {
|
|
41
|
+
try {
|
|
42
|
+
if (!isGitRepo()) {
|
|
43
|
+
process.stdout.write(data);
|
|
44
|
+
process.exit(0);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const files = getGitModifiedFiles(['\\.tsx?$', '\\.jsx?$'])
|
|
48
|
+
.filter(f => fs.existsSync(f))
|
|
49
|
+
.filter(f => !EXCLUDED_PATTERNS.some(pattern => pattern.test(f)));
|
|
50
|
+
|
|
51
|
+
let hasConsole = false;
|
|
52
|
+
|
|
53
|
+
for (const file of files) {
|
|
54
|
+
const content = readFile(file);
|
|
55
|
+
if (content && content.includes('console.log')) {
|
|
56
|
+
log(`[Hook] WARNING: console.log found in ${file}`);
|
|
57
|
+
hasConsole = true;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
if (hasConsole) {
|
|
62
|
+
log('[Hook] Remove console.log statements before committing');
|
|
63
|
+
}
|
|
64
|
+
} catch (err) {
|
|
65
|
+
log(`[Hook] check-console-log error: ${err.message}`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Always output the original data
|
|
69
|
+
process.stdout.write(data);
|
|
70
|
+
process.exit(0);
|
|
71
|
+
});
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
const { isHookEnabled } = require('../lib/hook-flags');
|
|
5
|
+
|
|
6
|
+
const [, , hookId, profilesCsv] = process.argv;
|
|
7
|
+
if (!hookId) {
|
|
8
|
+
process.stdout.write('yes');
|
|
9
|
+
process.exit(0);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
process.stdout.write(isHookEnabled(hookId, { profiles: profilesCsv }) ? 'yes' : 'no');
|