kodelyth-ecc 1.2.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/.agent/rules/README.md +108 -0
- package/.agent/rules/agents.md +94 -0
- package/.agent/rules/code-review.md +124 -0
- package/.agent/rules/coding-style.md +122 -0
- package/.agent/rules/design-quality.md +63 -0
- package/.agent/rules/development-workflow.md +44 -0
- package/.agent/rules/git-mastery.md +366 -0
- package/.agent/rules/git-workflow.md +24 -0
- package/.agent/rules/hooks.md +25 -0
- package/.agent/rules/kodelyth-always-on.md +63 -0
- package/.agent/rules/kodelyth-quickstart.md +207 -0
- package/.agent/rules/observability.md +390 -0
- package/.agent/rules/patterns.md +50 -0
- package/.agent/rules/performance.md +178 -0
- package/.agent/rules/security.md +58 -0
- package/.agent/rules/smart-debug.md +241 -0
- package/.agent/rules/soul.md +32 -0
- package/.agent/rules/testing.md +46 -0
- package/.agent/skills/api-guardian.md +279 -0
- package/.agent/skills/architect.md +211 -0
- package/.agent/skills/build-error-resolver.md +114 -0
- package/.agent/skills/chief-of-staff.md +151 -0
- package/.agent/skills/code-architect.md +71 -0
- package/.agent/skills/code-explorer.md +69 -0
- package/.agent/skills/code-reviewer.md +237 -0
- package/.agent/skills/code-simplifier.md +47 -0
- package/.agent/skills/comment-analyzer.md +45 -0
- package/.agent/skills/conversation-analyzer.md +52 -0
- package/.agent/skills/cpp-build-resolver.md +90 -0
- package/.agent/skills/cpp-reviewer.md +72 -0
- package/.agent/skills/csharp-reviewer.md +101 -0
- package/.agent/skills/dart-build-resolver.md +201 -0
- package/.agent/skills/database-reviewer.md +91 -0
- package/.agent/skills/debug-detective.md +409 -0
- package/.agent/skills/doc-updater.md +107 -0
- package/.agent/skills/docs-lookup.md +68 -0
- package/.agent/skills/e2e-runner.md +107 -0
- package/.agent/skills/flutter-reviewer.md +243 -0
- package/.agent/skills/gan-evaluator.md +209 -0
- package/.agent/skills/gan-generator.md +131 -0
- package/.agent/skills/gan-planner.md +99 -0
- package/.agent/skills/go-build-resolver.md +94 -0
- package/.agent/skills/go-reviewer.md +76 -0
- package/.agent/skills/harness-optimizer.md +35 -0
- package/.agent/skills/healthcare-reviewer.md +83 -0
- package/.agent/skills/java-build-resolver.md +153 -0
- package/.agent/skills/java-reviewer.md +92 -0
- package/.agent/skills/kodelyth-advisor.md +172 -0
- package/.agent/skills/kotlin-build-resolver.md +118 -0
- package/.agent/skills/kotlin-reviewer.md +159 -0
- package/.agent/skills/loop-operator.md +36 -0
- package/.agent/skills/migration-guide.md +368 -0
- package/.agent/skills/opensource-forker.md +198 -0
- package/.agent/skills/opensource-packager.md +249 -0
- package/.agent/skills/opensource-sanitizer.md +188 -0
- package/.agent/skills/pair-programmer.md +260 -0
- package/.agent/skills/performance-optimizer.md +446 -0
- package/.agent/skills/planner.md +212 -0
- package/.agent/skills/pr-test-analyzer.md +45 -0
- package/.agent/skills/python-reviewer.md +98 -0
- package/.agent/skills/pytorch-build-resolver.md +120 -0
- package/.agent/skills/refactor-cleaner.md +85 -0
- package/.agent/skills/rust-build-resolver.md +148 -0
- package/.agent/skills/rust-reviewer.md +94 -0
- package/.agent/skills/security-reviewer.md +108 -0
- package/.agent/skills/seo-specialist.md +62 -0
- package/.agent/skills/silent-failure-hunter.md +50 -0
- package/.agent/skills/tdd-guide.md +91 -0
- package/.agent/skills/type-design-analyzer.md +41 -0
- package/.agent/skills/typescript-reviewer.md +112 -0
- package/.agent/skills/ux-reviewer.md +483 -0
- package/.agent/workflows/agent-sort.md +23 -0
- package/.agent/workflows/aside.md +164 -0
- package/.agent/workflows/build-fix.md +62 -0
- package/.agent/workflows/checkpoint.md +74 -0
- package/.agent/workflows/claw.md +23 -0
- package/.agent/workflows/code-review.md +289 -0
- package/.agent/workflows/context-budget.md +23 -0
- package/.agent/workflows/cpp-build.md +173 -0
- package/.agent/workflows/cpp-review.md +132 -0
- package/.agent/workflows/cpp-test.md +251 -0
- package/.agent/workflows/devfleet.md +23 -0
- package/.agent/workflows/docs.md +23 -0
- package/.agent/workflows/e2e.md +268 -0
- package/.agent/workflows/eval.md +23 -0
- package/.agent/workflows/evolve.md +178 -0
- package/.agent/workflows/feature-dev.md +49 -0
- package/.agent/workflows/flutter-build.md +164 -0
- package/.agent/workflows/flutter-review.md +116 -0
- package/.agent/workflows/flutter-test.md +144 -0
- package/.agent/workflows/gan-build.md +99 -0
- package/.agent/workflows/gan-design.md +35 -0
- package/.agent/workflows/go-build.md +183 -0
- package/.agent/workflows/go-review.md +148 -0
- package/.agent/workflows/go-test.md +268 -0
- package/.agent/workflows/gradle-build.md +70 -0
- package/.agent/workflows/harness-audit.md +73 -0
- package/.agent/workflows/hookify-configure.md +14 -0
- package/.agent/workflows/hookify-help.md +46 -0
- package/.agent/workflows/hookify-list.md +21 -0
- package/.agent/workflows/hookify.md +50 -0
- package/.agent/workflows/instinct-export.md +66 -0
- package/.agent/workflows/instinct-import.md +114 -0
- package/.agent/workflows/instinct-status.md +59 -0
- package/.agent/workflows/jira.md +106 -0
- package/.agent/workflows/kotlin-build.md +174 -0
- package/.agent/workflows/kotlin-review.md +140 -0
- package/.agent/workflows/kotlin-test.md +312 -0
- package/.agent/workflows/learn-eval.md +116 -0
- package/.agent/workflows/learn.md +70 -0
- package/.agent/workflows/loop-start.md +32 -0
- package/.agent/workflows/loop-status.md +24 -0
- package/.agent/workflows/model-route.md +26 -0
- package/.agent/workflows/multi-backend.md +158 -0
- package/.agent/workflows/multi-execute.md +315 -0
- package/.agent/workflows/multi-frontend.md +158 -0
- package/.agent/workflows/multi-plan.md +268 -0
- package/.agent/workflows/multi-workflow.md +191 -0
- package/.agent/workflows/orchestrate.md +135 -0
- package/.agent/workflows/plan.md +117 -0
- package/.agent/workflows/pm2.md +272 -0
- package/.agent/workflows/projects.md +39 -0
- package/.agent/workflows/promote.md +41 -0
- package/.agent/workflows/prompt-optimize.md +23 -0
- package/.agent/workflows/prp-commit.md +112 -0
- package/.agent/workflows/prp-implement.md +385 -0
- package/.agent/workflows/prp-plan.md +502 -0
- package/.agent/workflows/prp-pr.md +184 -0
- package/.agent/workflows/prp-prd.md +447 -0
- package/.agent/workflows/prune.md +31 -0
- package/.agent/workflows/python-review.md +297 -0
- package/.agent/workflows/quality-gate.md +29 -0
- package/.agent/workflows/refactor-clean.md +80 -0
- package/.agent/workflows/resume-session.md +156 -0
- package/.agent/workflows/review-pr.md +37 -0
- package/.agent/workflows/rules-distill.md +20 -0
- package/.agent/workflows/rust-build.md +187 -0
- package/.agent/workflows/rust-review.md +142 -0
- package/.agent/workflows/rust-test.md +308 -0
- package/.agent/workflows/santa-loop.md +175 -0
- package/.agent/workflows/save-session.md +275 -0
- package/.agent/workflows/sessions.md +333 -0
- package/.agent/workflows/setup-pm.md +80 -0
- package/.agent/workflows/skill-create.md +174 -0
- package/.agent/workflows/skill-health.md +54 -0
- package/.agent/workflows/tdd.md +231 -0
- package/.agent/workflows/test-coverage.md +69 -0
- package/.agent/workflows/update-codemaps.md +72 -0
- package/.agent/workflows/update-docs.md +84 -0
- package/.agent/workflows/verify.md +23 -0
- package/.github/workflows/ci.yml +46 -0
- package/.github/workflows/publish.yml +41 -0
- package/AGENTS.md +209 -0
- package/CHANGELOG.md +236 -0
- package/CLAUDE.md +90 -0
- package/CONTRIBUTING.md +255 -0
- package/KODELYTH.md +74 -0
- package/LICENSE +21 -0
- package/README.md +414 -0
- package/SECURITY.md +77 -0
- package/SOUL.md +32 -0
- package/VERSION +1 -0
- package/agents/api-guardian.md +279 -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-architect.md +71 -0
- package/agents/code-explorer.md +69 -0
- package/agents/code-reviewer.md +237 -0
- package/agents/code-simplifier.md +47 -0
- package/agents/comment-analyzer.md +45 -0
- package/agents/conversation-analyzer.md +52 -0
- package/agents/cpp-build-resolver.md +90 -0
- package/agents/cpp-reviewer.md +72 -0
- package/agents/csharp-reviewer.md +101 -0
- package/agents/dart-build-resolver.md +201 -0
- package/agents/database-reviewer.md +91 -0
- package/agents/debug-detective.md +409 -0
- package/agents/doc-updater.md +107 -0
- package/agents/docs-lookup.md +68 -0
- package/agents/e2e-runner.md +107 -0
- package/agents/flutter-reviewer.md +243 -0
- package/agents/gan-evaluator.md +209 -0
- package/agents/gan-generator.md +131 -0
- package/agents/gan-planner.md +99 -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/healthcare-reviewer.md +83 -0
- package/agents/java-build-resolver.md +153 -0
- package/agents/java-reviewer.md +92 -0
- package/agents/kodelyth-advisor.md +172 -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/migration-guide.md +368 -0
- package/agents/opensource-forker.md +198 -0
- package/agents/opensource-packager.md +249 -0
- package/agents/opensource-sanitizer.md +188 -0
- package/agents/pair-programmer.md +260 -0
- package/agents/performance-optimizer.md +446 -0
- package/agents/planner.md +212 -0
- package/agents/pr-test-analyzer.md +45 -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/seo-specialist.md +62 -0
- package/agents/silent-failure-hunter.md +50 -0
- package/agents/tdd-guide.md +91 -0
- package/agents/type-design-analyzer.md +41 -0
- package/agents/typescript-reviewer.md +112 -0
- package/agents/ux-reviewer.md +483 -0
- package/bin/kodelyth-ecc.js +87 -0
- package/commands/agent-sort.md +23 -0
- package/commands/aside.md +164 -0
- package/commands/build-fix.md +62 -0
- package/commands/checkpoint.md +74 -0
- package/commands/claw.md +23 -0
- package/commands/code-review.md +289 -0
- package/commands/context-budget.md +23 -0
- package/commands/cpp-build.md +173 -0
- package/commands/cpp-review.md +132 -0
- package/commands/cpp-test.md +251 -0
- package/commands/devfleet.md +23 -0
- package/commands/docs.md +23 -0
- package/commands/e2e.md +268 -0
- package/commands/eval.md +23 -0
- package/commands/evolve.md +178 -0
- package/commands/feature-dev.md +49 -0
- package/commands/flutter-build.md +164 -0
- package/commands/flutter-review.md +116 -0
- package/commands/flutter-test.md +144 -0
- package/commands/gan-build.md +99 -0
- package/commands/gan-design.md +35 -0
- package/commands/go-build.md +183 -0
- package/commands/go-review.md +148 -0
- package/commands/go-test.md +268 -0
- package/commands/gradle-build.md +70 -0
- package/commands/harness-audit.md +73 -0
- package/commands/hookify-configure.md +14 -0
- package/commands/hookify-help.md +46 -0
- package/commands/hookify-list.md +21 -0
- package/commands/hookify.md +50 -0
- package/commands/instinct-export.md +66 -0
- package/commands/instinct-import.md +114 -0
- package/commands/instinct-status.md +59 -0
- package/commands/jira.md +106 -0
- package/commands/kotlin-build.md +174 -0
- package/commands/kotlin-review.md +140 -0
- package/commands/kotlin-test.md +312 -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 +158 -0
- package/commands/multi-execute.md +315 -0
- package/commands/multi-frontend.md +158 -0
- package/commands/multi-plan.md +268 -0
- package/commands/multi-workflow.md +191 -0
- package/commands/orchestrate.md +135 -0
- package/commands/plan.md +117 -0
- package/commands/pm2.md +272 -0
- package/commands/projects.md +39 -0
- package/commands/promote.md +41 -0
- package/commands/prompt-optimize.md +23 -0
- package/commands/prp-commit.md +112 -0
- package/commands/prp-implement.md +385 -0
- package/commands/prp-plan.md +502 -0
- package/commands/prp-pr.md +184 -0
- package/commands/prp-prd.md +447 -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 +80 -0
- package/commands/resume-session.md +156 -0
- package/commands/review-pr.md +37 -0
- package/commands/rules-distill.md +20 -0
- package/commands/rust-build.md +187 -0
- package/commands/rust-review.md +142 -0
- package/commands/rust-test.md +308 -0
- package/commands/santa-loop.md +175 -0
- package/commands/save-session.md +275 -0
- package/commands/sessions.md +333 -0
- package/commands/setup-pm.md +80 -0
- package/commands/skill-create.md +174 -0
- package/commands/skill-health.md +54 -0
- package/commands/tdd.md +231 -0
- package/commands/test-coverage.md +69 -0
- package/commands/update-codemaps.md +72 -0
- package/commands/update-docs.md +84 -0
- package/commands/verify.md +23 -0
- package/contexts/dev.md +20 -0
- package/contexts/research.md +26 -0
- package/contexts/review.md +22 -0
- package/dashboard/lib/agent-tracker.js +366 -0
- package/dashboard/lib/aggregator.js +118 -0
- package/dashboard/lib/cost-calculator.js +50 -0
- package/dashboard/lib/platform-detector.js +89 -0
- package/dashboard/lib/readers/antigravity-reader.js +113 -0
- package/dashboard/lib/readers/claude-reader.js +135 -0
- package/dashboard/lib/readers/codex-reader.js +192 -0
- package/dashboard/lib/readers/cursor-reader.js +135 -0
- package/dashboard/lib/readers/opencode-reader.js +201 -0
- package/dashboard/lib/readers/windsurf-reader.js +126 -0
- package/dashboard/package.json +24 -0
- package/dashboard/public/index.html +1147 -0
- package/dashboard/server.js +119 -0
- package/hooks/README.md +220 -0
- package/hooks/hooks.json +420 -0
- package/install.ps1 +190 -0
- package/install.sh +583 -0
- package/package.json +33 -0
- package/rules/README.md +111 -0
- package/rules/common/agents.md +50 -0
- package/rules/common/code-review.md +124 -0
- package/rules/common/coding-style.md +122 -0
- package/rules/common/development-workflow.md +44 -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 +178 -0
- package/rules/common/security.md +29 -0
- package/rules/common/testing.md +57 -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/dart/coding-style.md +159 -0
- package/rules/dart/hooks.md +66 -0
- package/rules/dart/patterns.md +261 -0
- package/rules/dart/security.md +135 -0
- package/rules/dart/testing.md +215 -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/rules/web/coding-style.md +96 -0
- package/rules/web/design-quality.md +63 -0
- package/rules/web/hooks.md +120 -0
- package/rules/web/patterns.md +79 -0
- package/rules/web/performance.md +64 -0
- package/rules/web/security.md +57 -0
- package/rules/web/testing.md +55 -0
- package/rules/zh/README.md +108 -0
- package/rules/zh/agents.md +50 -0
- package/rules/zh/code-review.md +124 -0
- package/rules/zh/coding-style.md +48 -0
- package/rules/zh/development-workflow.md +44 -0
- package/rules/zh/git-workflow.md +24 -0
- package/rules/zh/hooks.md +30 -0
- package/rules/zh/patterns.md +31 -0
- package/rules/zh/performance.md +55 -0
- package/rules/zh/security.md +29 -0
- package/rules/zh/testing.md +29 -0
- package/scripts/agent-tracker-hook.js +81 -0
- package/scripts/build-opencode.js +26 -0
- package/scripts/catalog.js +186 -0
- package/scripts/ci/catalog.js +648 -0
- package/scripts/ci/check-unicode-safety.js +246 -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 +468 -0
- package/scripts/codemaps/generate.ts +330 -0
- package/scripts/codex/check-codex-global-state.sh +250 -0
- package/scripts/codex/install-global-git-hooks.sh +65 -0
- package/scripts/codex/merge-codex-config.js +317 -0
- package/scripts/codex/merge-mcp-config.js +335 -0
- package/scripts/codex-git-hooks/pre-commit +77 -0
- package/scripts/codex-git-hooks/pre-push +124 -0
- package/scripts/doctor.js +111 -0
- package/scripts/ecc.js +216 -0
- package/scripts/gan-harness.sh +299 -0
- package/scripts/harness-audit.js +735 -0
- package/scripts/hooks/auto-tmux-dev.js +88 -0
- package/scripts/hooks/branch-name-check.js +163 -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 +140 -0
- package/scripts/hooks/cost-tracker.js +78 -0
- package/scripts/hooks/design-quality-check.js +131 -0
- package/scripts/hooks/desktop-notify.js +168 -0
- package/scripts/hooks/doc-file-warning.js +90 -0
- package/scripts/hooks/evaluate-session.js +100 -0
- package/scripts/hooks/governance-capture.js +334 -0
- package/scripts/hooks/mcp-health-check.js +619 -0
- package/scripts/hooks/post-bash-build-complete.js +27 -0
- package/scripts/hooks/post-bash-command-log.js +73 -0
- package/scripts/hooks/post-bash-pr-created.js +36 -0
- package/scripts/hooks/post-edit-accumulator.js +78 -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/pre-bash-commit-quality.js +405 -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-write-doc-warn.js +9 -0
- package/scripts/hooks/quality-gate.js +168 -0
- package/scripts/hooks/run-with-flags-shell.sh +36 -0
- package/scripts/hooks/run-with-flags.js +181 -0
- package/scripts/hooks/session-end-marker.js +67 -0
- package/scripts/hooks/session-end.js +301 -0
- package/scripts/hooks/session-start-bootstrap.js +161 -0
- package/scripts/hooks/session-start.js +492 -0
- package/scripts/hooks/smart-suggest.js +138 -0
- package/scripts/hooks/stop-format-typecheck.js +209 -0
- package/scripts/hooks/suggest-compact.js +80 -0
- package/scripts/hooks/test-reminder.js +128 -0
- package/scripts/install-apply.js +150 -0
- package/scripts/install-plan.js +266 -0
- package/scripts/lib/agent-compress.js +244 -0
- package/scripts/lib/hook-flags.js +74 -0
- package/scripts/lib/inspection.js +212 -0
- package/scripts/lib/install/apply.js +265 -0
- package/scripts/lib/install/config.js +89 -0
- package/scripts/lib/install/request.js +120 -0
- package/scripts/lib/install/runtime.js +54 -0
- package/scripts/lib/install-executor.js +672 -0
- package/scripts/lib/install-lifecycle.js +1226 -0
- package/scripts/lib/install-manifests.js +551 -0
- package/scripts/lib/install-state.js +313 -0
- package/scripts/lib/install-targets/antigravity-project.js +85 -0
- package/scripts/lib/install-targets/claude-home.js +10 -0
- package/scripts/lib/install-targets/codebuddy-project.js +50 -0
- package/scripts/lib/install-targets/codex-home.js +10 -0
- package/scripts/lib/install-targets/cursor-project.js +50 -0
- package/scripts/lib/install-targets/gemini-project.js +10 -0
- package/scripts/lib/install-targets/helpers.js +340 -0
- package/scripts/lib/install-targets/opencode-home.js +10 -0
- package/scripts/lib/install-targets/registry.js +70 -0
- package/scripts/lib/mcp-config.js +56 -0
- package/scripts/lib/observer-sessions.js +175 -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 +118 -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 +132 -0
- package/scripts/lib/session-manager.js +533 -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 +598 -0
- package/scripts/lib/utils.d.ts +196 -0
- package/scripts/lib/utils.js +629 -0
- package/scripts/list-installed.js +91 -0
- package/scripts/orchestrate-codex-worker.sh +107 -0
- package/scripts/orchestrate-worktrees.js +108 -0
- package/scripts/orchestration-status.js +62 -0
- package/scripts/release.sh +83 -0
- package/scripts/repair.js +98 -0
- package/scripts/session-inspect.js +150 -0
- package/scripts/sessions-cli.js +178 -0
- package/scripts/setup-package-manager.js +204 -0
- package/scripts/skill-create-output.js +244 -0
- package/scripts/skills-health.js +132 -0
- package/scripts/status.js +177 -0
- package/scripts/sync-ecc-to-codex.sh +534 -0
- package/scripts/uninstall.js +97 -0
- package/skills/agent-eval/SKILL.md +145 -0
- package/skills/agent-harness-construction/SKILL.md +73 -0
- package/skills/agent-introspection-debugging/SKILL.md +153 -0
- package/skills/agent-payment-x402/SKILL.md +178 -0
- package/skills/agent-sort/SKILL.md +215 -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-connector-builder/SKILL.md +121 -0
- package/skills/api-design/SKILL.md +523 -0
- package/skills/architecture-decision-records/SKILL.md +179 -0
- package/skills/article-writing/SKILL.md +79 -0
- package/skills/automation-audit-ops/SKILL.md +142 -0
- package/skills/autonomous-agent-harness/SKILL.md +267 -0
- package/skills/autonomous-loops/SKILL.md +610 -0
- package/skills/backend-patterns/SKILL.md +598 -0
- package/skills/benchmark/SKILL.md +93 -0
- package/skills/blueprint/SKILL.md +105 -0
- package/skills/brand-voice/SKILL.md +97 -0
- package/skills/brand-voice/references/voice-profile-schema.md +55 -0
- package/skills/browser-qa/SKILL.md +87 -0
- package/skills/bun-runtime/SKILL.md +84 -0
- package/skills/canary-watch/SKILL.md +99 -0
- package/skills/carrier-relationship-management/SKILL.md +212 -0
- package/skills/ck/SKILL.md +147 -0
- package/skills/ck/commands/forget.mjs +44 -0
- package/skills/ck/commands/info.mjs +24 -0
- package/skills/ck/commands/init.mjs +143 -0
- package/skills/ck/commands/list.mjs +40 -0
- package/skills/ck/commands/migrate.mjs +202 -0
- package/skills/ck/commands/resume.mjs +36 -0
- package/skills/ck/commands/save.mjs +210 -0
- package/skills/ck/commands/shared.mjs +387 -0
- package/skills/ck/hooks/session-start.mjs +224 -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-tour/SKILL.md +236 -0
- package/skills/codebase-onboarding/SKILL.md +233 -0
- package/skills/coding-standards/SKILL.md +549 -0
- package/skills/compose-multiplatform-patterns/SKILL.md +299 -0
- package/skills/configure-ecc/SKILL.md +367 -0
- package/skills/connections-optimizer/SKILL.md +189 -0
- package/skills/content-engine/SKILL.md +131 -0
- package/skills/content-hash-cache-pattern/SKILL.md +161 -0
- package/skills/context-budget/SKILL.md +135 -0
- package/skills/continuous-agent-loop/SKILL.md +45 -0
- package/skills/continuous-learning/SKILL.md +123 -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 +271 -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 +244 -0
- package/skills/continuous-learning-v2/config.json +8 -0
- package/skills/continuous-learning-v2/hooks/observe.sh +428 -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/council/SKILL.md +203 -0
- package/skills/cpp-coding-standards/SKILL.md +723 -0
- package/skills/cpp-testing/SKILL.md +324 -0
- package/skills/crosspost/SKILL.md +111 -0
- package/skills/csharp-testing/SKILL.md +321 -0
- package/skills/customer-billing-ops/SKILL.md +140 -0
- package/skills/customs-trade-compliance/SKILL.md +263 -0
- package/skills/dart-flutter-patterns/SKILL.md +563 -0
- package/skills/dashboard-builder/SKILL.md +109 -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/defi-amm-security/SKILL.md +160 -0
- package/skills/deployment-patterns/SKILL.md +427 -0
- package/skills/design-system/SKILL.md +82 -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-lookup/SKILL.md +90 -0
- package/skills/dotnet-patterns/SKILL.md +321 -0
- package/skills/e2e-testing/SKILL.md +326 -0
- package/skills/ecc-tools-cost-audit/SKILL.md +160 -0
- package/skills/email-ops/SKILL.md +121 -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/evm-token-decimals/SKILL.md +130 -0
- package/skills/exa-search/SKILL.md +103 -0
- package/skills/fal-ai-media/SKILL.md +284 -0
- package/skills/finance-billing-ops/SKILL.md +127 -0
- package/skills/flutter-dart-code-review/SKILL.md +435 -0
- package/skills/foundation-models-on-device/SKILL.md +243 -0
- package/skills/frontend-design/SKILL.md +145 -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/gan-style-harness/SKILL.md +278 -0
- package/skills/git-mastery/SKILL.md +366 -0
- package/skills/git-workflow/SKILL.md +715 -0
- package/skills/github-ops/SKILL.md +144 -0
- package/skills/golang-patterns/SKILL.md +674 -0
- package/skills/golang-testing/SKILL.md +720 -0
- package/skills/google-workspace-ops/SKILL.md +95 -0
- package/skills/healthcare-cdss-patterns/SKILL.md +245 -0
- package/skills/healthcare-emr-patterns/SKILL.md +159 -0
- package/skills/healthcare-eval-harness/SKILL.md +207 -0
- package/skills/healthcare-phi-compliance/SKILL.md +145 -0
- package/skills/hexagonal-architecture/SKILL.md +276 -0
- package/skills/hipaa-compliance/SKILL.md +78 -0
- package/skills/hookify-rules/SKILL.md +128 -0
- package/skills/inventory-demand-planning/SKILL.md +247 -0
- package/skills/investor-materials/SKILL.md +96 -0
- package/skills/investor-outreach/SKILL.md +91 -0
- package/skills/iterative-retrieval/SKILL.md +211 -0
- package/skills/java-coding-standards/SKILL.md +147 -0
- package/skills/jira-integration/SKILL.md +293 -0
- package/skills/jpa-patterns/SKILL.md +151 -0
- package/skills/knowledge-ops/SKILL.md +154 -0
- package/skills/kodelyth-quickstart/SKILL.md +207 -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-plugin-discovery/SKILL.md +229 -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/lead-intelligence/SKILL.md +321 -0
- package/skills/lead-intelligence/agents/enrichment-agent.md +85 -0
- package/skills/lead-intelligence/agents/mutual-mapper.md +75 -0
- package/skills/lead-intelligence/agents/outreach-drafter.md +98 -0
- package/skills/lead-intelligence/agents/signal-scorer.md +60 -0
- package/skills/liquid-glass-design/SKILL.md +279 -0
- package/skills/llm-trading-agent-security/SKILL.md +146 -0
- package/skills/logistics-exception-management/SKILL.md +222 -0
- package/skills/manim-video/SKILL.md +89 -0
- package/skills/manim-video/assets/network_graph_scene.py +52 -0
- package/skills/market-research/SKILL.md +75 -0
- package/skills/mcp-server-patterns/SKILL.md +67 -0
- package/skills/messages-ops/SKILL.md +104 -0
- package/skills/nanoclaw-repl/SKILL.md +33 -0
- package/skills/nestjs-patterns/SKILL.md +230 -0
- package/skills/nextjs-turbopack/SKILL.md +44 -0
- package/skills/nodejs-keccak256/SKILL.md +102 -0
- package/skills/nutrient-document-processing/SKILL.md +167 -0
- package/skills/nuxt4-patterns/SKILL.md +100 -0
- package/skills/observability/SKILL.md +390 -0
- package/skills/openclaw-persona-forge/SKILL.md +296 -0
- package/skills/openclaw-persona-forge/gacha.py +224 -0
- package/skills/openclaw-persona-forge/gacha.sh +5 -0
- package/skills/openclaw-persona-forge/references/avatar-style.md +124 -0
- package/skills/openclaw-persona-forge/references/boundary-rules.md +53 -0
- package/skills/openclaw-persona-forge/references/error-handling.md +53 -0
- package/skills/openclaw-persona-forge/references/identity-tension.md +48 -0
- package/skills/openclaw-persona-forge/references/naming-system.md +39 -0
- package/skills/openclaw-persona-forge/references/output-template.md +166 -0
- package/skills/opensource-pipeline/SKILL.md +255 -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-capability/SKILL.md +141 -0
- package/skills/product-lens/SKILL.md +92 -0
- package/skills/production-scheduling/SKILL.md +238 -0
- package/skills/project-flow-ops/SKILL.md +111 -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/remotion-video-creation/SKILL.md +43 -0
- package/skills/remotion-video-creation/rules/3d.md +86 -0
- package/skills/remotion-video-creation/rules/animations.md +29 -0
- package/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -0
- package/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -0
- package/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -0
- package/skills/remotion-video-creation/rules/assets.md +78 -0
- package/skills/remotion-video-creation/rules/audio.md +172 -0
- package/skills/remotion-video-creation/rules/calculate-metadata.md +104 -0
- package/skills/remotion-video-creation/rules/can-decode.md +75 -0
- package/skills/remotion-video-creation/rules/charts.md +58 -0
- package/skills/remotion-video-creation/rules/compositions.md +146 -0
- package/skills/remotion-video-creation/rules/display-captions.md +126 -0
- package/skills/remotion-video-creation/rules/extract-frames.md +229 -0
- package/skills/remotion-video-creation/rules/fonts.md +152 -0
- package/skills/remotion-video-creation/rules/get-audio-duration.md +58 -0
- package/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -0
- package/skills/remotion-video-creation/rules/get-video-duration.md +58 -0
- package/skills/remotion-video-creation/rules/gifs.md +138 -0
- package/skills/remotion-video-creation/rules/images.md +130 -0
- package/skills/remotion-video-creation/rules/import-srt-captions.md +67 -0
- package/skills/remotion-video-creation/rules/lottie.md +67 -0
- package/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -0
- package/skills/remotion-video-creation/rules/measuring-text.md +143 -0
- package/skills/remotion-video-creation/rules/sequencing.md +106 -0
- package/skills/remotion-video-creation/rules/tailwind.md +11 -0
- package/skills/remotion-video-creation/rules/text-animations.md +20 -0
- package/skills/remotion-video-creation/rules/timing.md +179 -0
- package/skills/remotion-video-creation/rules/transcribe-captions.md +19 -0
- package/skills/remotion-video-creation/rules/transitions.md +122 -0
- package/skills/remotion-video-creation/rules/trimming.md +52 -0
- package/skills/remotion-video-creation/rules/videos.md +171 -0
- package/skills/repo-scan/SKILL.md +78 -0
- package/skills/research-ops/SKILL.md +112 -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 +75 -0
- package/skills/santa-method/SKILL.md +306 -0
- package/skills/search-first/SKILL.md +161 -0
- package/skills/security-bounty-hunter/SKILL.md +99 -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/seo/SKILL.md +154 -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-stocktake/SKILL.md +193 -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/smart-debug/SKILL.md +241 -0
- package/skills/social-graph-ranker/SKILL.md +154 -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 +463 -0
- package/skills/team-builder/SKILL.md +168 -0
- package/skills/terminal-ops/SKILL.md +109 -0
- package/skills/token-budget-advisor/SKILL.md +133 -0
- package/skills/ui-demo/SKILL.md +465 -0
- package/skills/unified-notifications-ops/SKILL.md +187 -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/workspace-surface-audit/SKILL.md +125 -0
- package/skills/x-api/SKILL.md +230 -0
- package/social/card-agents.svg +96 -0
- package/social/card-install.svg +99 -0
- package/social/card-main.svg +133 -0
- package/social/github-social-preview.svg +147 -0
- package/social/readme-agents.svg +139 -0
- package/social/readme-hero.svg +131 -0
- package/social/readme-lens.svg +140 -0
- package/social/readme-savings.svg +56 -0
- package/social/x-card-agents-grid.svg +94 -0
- package/social/x-card-free.svg +95 -0
- package/social/x-card-hook.svg +77 -0
- package/tests/hooks/branch-name-check.test.js +184 -0
- package/tests/hooks/smart-suggest.test.js +149 -0
- package/tests/hooks/test-reminder.test.js +181 -0
- package/tests/run-all.js +55 -0
- package/wiki/Agent-Reference.md +199 -0
- package/wiki/FAQ.md +142 -0
- package/wiki/Home.md +50 -0
- package/wiki/Hook-Reference.md +101 -0
- package/wiki/Installation-Guide.md +126 -0
- package/wiki/Platform-Support.md +106 -0
- package/wiki/Skill-Reference.md +103 -0
|
@@ -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,163 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Kodelyth ECC — Branch Name Check Hook
|
|
4
|
+
* PreToolUse: Bash
|
|
5
|
+
*
|
|
6
|
+
* Intercepts `git checkout -b` and `git switch -c` commands.
|
|
7
|
+
* Validates the branch name follows conventional patterns.
|
|
8
|
+
* Blocks invalid names with a clear explanation.
|
|
9
|
+
*
|
|
10
|
+
* Valid patterns:
|
|
11
|
+
* feat/description
|
|
12
|
+
* fix/description
|
|
13
|
+
* chore/description
|
|
14
|
+
* docs/description
|
|
15
|
+
* refactor/description
|
|
16
|
+
* test/description
|
|
17
|
+
* perf/description
|
|
18
|
+
* ci/description
|
|
19
|
+
* hotfix/description
|
|
20
|
+
* release/1.2.0
|
|
21
|
+
*
|
|
22
|
+
* Respects ECC_DISABLED_HOOKS env var.
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
'use strict'
|
|
26
|
+
|
|
27
|
+
const VALID_PREFIXES = [
|
|
28
|
+
'feat',
|
|
29
|
+
'fix',
|
|
30
|
+
'chore',
|
|
31
|
+
'docs',
|
|
32
|
+
'refactor',
|
|
33
|
+
'test',
|
|
34
|
+
'perf',
|
|
35
|
+
'ci',
|
|
36
|
+
'hotfix',
|
|
37
|
+
'release',
|
|
38
|
+
'experiment',
|
|
39
|
+
'spike',
|
|
40
|
+
'wip',
|
|
41
|
+
]
|
|
42
|
+
|
|
43
|
+
const BRANCH_REGEX = new RegExp(
|
|
44
|
+
`^(${VALID_PREFIXES.join('|')})\\/[a-z0-9][a-z0-9-._/]{1,60}$`
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
// Protected branches — never block these
|
|
48
|
+
const PROTECTED_BRANCHES = ['main', 'master', 'develop', 'staging', 'production']
|
|
49
|
+
|
|
50
|
+
// Extract branch name from git command
|
|
51
|
+
function extractBranchName (command) {
|
|
52
|
+
// git checkout -b branch-name
|
|
53
|
+
const checkoutMatch = command.match(/git\s+checkout\s+(?:-b|-B)\s+([^\s]+)/)
|
|
54
|
+
if (checkoutMatch) return checkoutMatch[1]
|
|
55
|
+
|
|
56
|
+
// git switch -c branch-name
|
|
57
|
+
const switchMatch = command.match(/git\s+switch\s+(?:-c|-C)\s+([^\s]+)/)
|
|
58
|
+
if (switchMatch) return switchMatch[1]
|
|
59
|
+
|
|
60
|
+
return null
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function isDisabled () {
|
|
64
|
+
const disabled = (process.env.ECC_DISABLED_HOOKS || '').split(',')
|
|
65
|
+
return disabled.includes('kodelyth:branch-name')
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function isProtected (name) {
|
|
69
|
+
return PROTECTED_BRANCHES.includes(name)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function isValid (name) {
|
|
73
|
+
return BRANCH_REGEX.test(name)
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
function buildError (branchName) {
|
|
77
|
+
return {
|
|
78
|
+
type: 'user_prompt_submit',
|
|
79
|
+
content: [
|
|
80
|
+
{
|
|
81
|
+
type: 'text',
|
|
82
|
+
text: [
|
|
83
|
+
`Branch name "${branchName}" doesn't follow the Kodelyth convention.`,
|
|
84
|
+
'',
|
|
85
|
+
'Valid format: <type>/<description>',
|
|
86
|
+
'',
|
|
87
|
+
'Types: ' + VALID_PREFIXES.join(', '),
|
|
88
|
+
'',
|
|
89
|
+
'Examples:',
|
|
90
|
+
' feat/add-user-authentication',
|
|
91
|
+
' fix/null-pointer-in-checkout',
|
|
92
|
+
' chore/upgrade-typescript-5',
|
|
93
|
+
' hotfix/payment-double-charge',
|
|
94
|
+
' release/2.1.0',
|
|
95
|
+
'',
|
|
96
|
+
'Rules:',
|
|
97
|
+
' - lowercase letters, numbers, hyphens only',
|
|
98
|
+
' - must have a type prefix',
|
|
99
|
+
' - description must be meaningful (not just "fix" or "test")',
|
|
100
|
+
].join('\n'),
|
|
101
|
+
},
|
|
102
|
+
],
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async function main () {
|
|
107
|
+
const raw = await readStdin()
|
|
108
|
+
|
|
109
|
+
if (isDisabled()) {
|
|
110
|
+
process.stdout.write(raw)
|
|
111
|
+
return
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
let input
|
|
115
|
+
|
|
116
|
+
try {
|
|
117
|
+
input = JSON.parse(raw)
|
|
118
|
+
} catch {
|
|
119
|
+
process.stdout.write(raw)
|
|
120
|
+
return
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
const command = input?.tool_input?.command || ''
|
|
124
|
+
|
|
125
|
+
const branchName = extractBranchName(command)
|
|
126
|
+
|
|
127
|
+
if (!branchName) {
|
|
128
|
+
// Not a branch creation command — pass through
|
|
129
|
+
process.stdout.write(raw)
|
|
130
|
+
return
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
if (isProtected(branchName)) {
|
|
134
|
+
// Protected branches are fine
|
|
135
|
+
process.stdout.write(raw)
|
|
136
|
+
return
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (isValid(branchName)) {
|
|
140
|
+
// Valid name — pass through silently
|
|
141
|
+
process.stdout.write(raw)
|
|
142
|
+
return
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Invalid — block with explanation
|
|
146
|
+
process.stdout.write(JSON.stringify(buildError(branchName)))
|
|
147
|
+
process.exit(2) // exit code 2 = block the tool call
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function readStdin () {
|
|
151
|
+
return new Promise((resolve) => {
|
|
152
|
+
let data = ''
|
|
153
|
+
process.stdin.setEncoding('utf8')
|
|
154
|
+
process.stdin.on('data', chunk => { data += chunk })
|
|
155
|
+
process.stdin.on('end', () => resolve(data))
|
|
156
|
+
process.stdin.on('error', () => resolve(data))
|
|
157
|
+
setTimeout(() => resolve(data), 3000)
|
|
158
|
+
})
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
main().catch(() => {
|
|
162
|
+
process.exit(0) // never hard-fail — just pass through
|
|
163
|
+
})
|
|
@@ -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');
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Config Protection Hook
|
|
4
|
+
*
|
|
5
|
+
* Blocks modifications to linter/formatter config files.
|
|
6
|
+
* Agents frequently modify these to make checks pass instead of fixing
|
|
7
|
+
* the actual code. This hook steers the agent back to fixing the source.
|
|
8
|
+
*
|
|
9
|
+
* Exit codes:
|
|
10
|
+
* 0 = allow (not a config file)
|
|
11
|
+
* 2 = block (config file modification attempted)
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
'use strict';
|
|
15
|
+
|
|
16
|
+
const path = require('path');
|
|
17
|
+
|
|
18
|
+
const MAX_STDIN = 1024 * 1024;
|
|
19
|
+
let raw = '';
|
|
20
|
+
|
|
21
|
+
const PROTECTED_FILES = new Set([
|
|
22
|
+
// ESLint (legacy + v9 flat config, JS/TS/MJS/CJS)
|
|
23
|
+
'.eslintrc',
|
|
24
|
+
'.eslintrc.js',
|
|
25
|
+
'.eslintrc.cjs',
|
|
26
|
+
'.eslintrc.json',
|
|
27
|
+
'.eslintrc.yml',
|
|
28
|
+
'.eslintrc.yaml',
|
|
29
|
+
'eslint.config.js',
|
|
30
|
+
'eslint.config.mjs',
|
|
31
|
+
'eslint.config.cjs',
|
|
32
|
+
'eslint.config.ts',
|
|
33
|
+
'eslint.config.mts',
|
|
34
|
+
'eslint.config.cts',
|
|
35
|
+
// Prettier (all config variants including ESM)
|
|
36
|
+
'.prettierrc',
|
|
37
|
+
'.prettierrc.js',
|
|
38
|
+
'.prettierrc.cjs',
|
|
39
|
+
'.prettierrc.json',
|
|
40
|
+
'.prettierrc.yml',
|
|
41
|
+
'.prettierrc.yaml',
|
|
42
|
+
'prettier.config.js',
|
|
43
|
+
'prettier.config.cjs',
|
|
44
|
+
'prettier.config.mjs',
|
|
45
|
+
// Biome
|
|
46
|
+
'biome.json',
|
|
47
|
+
'biome.jsonc',
|
|
48
|
+
// Ruff (Python)
|
|
49
|
+
'.ruff.toml',
|
|
50
|
+
'ruff.toml',
|
|
51
|
+
// Note: pyproject.toml is intentionally NOT included here because it
|
|
52
|
+
// contains project metadata alongside linter config. Blocking all edits
|
|
53
|
+
// to pyproject.toml would prevent legitimate dependency changes.
|
|
54
|
+
// Shell / Style / Markdown
|
|
55
|
+
'.shellcheckrc',
|
|
56
|
+
'.stylelintrc',
|
|
57
|
+
'.stylelintrc.json',
|
|
58
|
+
'.stylelintrc.yml',
|
|
59
|
+
'.markdownlint.json',
|
|
60
|
+
'.markdownlint.yaml',
|
|
61
|
+
'.markdownlintrc',
|
|
62
|
+
]);
|
|
63
|
+
|
|
64
|
+
function parseInput(inputOrRaw) {
|
|
65
|
+
if (typeof inputOrRaw === 'string') {
|
|
66
|
+
try {
|
|
67
|
+
return inputOrRaw.trim() ? JSON.parse(inputOrRaw) : {};
|
|
68
|
+
} catch {
|
|
69
|
+
return {};
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return inputOrRaw && typeof inputOrRaw === 'object' ? inputOrRaw : {};
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Exportable run() for in-process execution via run-with-flags.js.
|
|
78
|
+
* Avoids the ~50-100ms spawnSync overhead when available.
|
|
79
|
+
*/
|
|
80
|
+
function run(inputOrRaw, options = {}) {
|
|
81
|
+
if (options.truncated) {
|
|
82
|
+
return {
|
|
83
|
+
exitCode: 2,
|
|
84
|
+
stderr:
|
|
85
|
+
`BLOCKED: Hook input exceeded ${options.maxStdin || MAX_STDIN} bytes. ` +
|
|
86
|
+
'Refusing to bypass config-protection on a truncated payload. ' +
|
|
87
|
+
'Retry with a smaller edit or disable the config-protection hook temporarily.'
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
const input = parseInput(inputOrRaw);
|
|
92
|
+
const filePath = input?.tool_input?.file_path || input?.tool_input?.file || '';
|
|
93
|
+
if (!filePath) return { exitCode: 0 };
|
|
94
|
+
|
|
95
|
+
const basename = path.basename(filePath);
|
|
96
|
+
if (PROTECTED_FILES.has(basename)) {
|
|
97
|
+
return {
|
|
98
|
+
exitCode: 2,
|
|
99
|
+
stderr:
|
|
100
|
+
`BLOCKED: Modifying ${basename} is not allowed. ` +
|
|
101
|
+
'Fix the source code to satisfy linter/formatter rules instead of ' +
|
|
102
|
+
'weakening the config. If this is a legitimate config change, ' +
|
|
103
|
+
'disable the config-protection hook temporarily.',
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return { exitCode: 0 };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
module.exports = { run };
|
|
111
|
+
|
|
112
|
+
// Stdin fallback for spawnSync execution
|
|
113
|
+
let truncated = /^(1|true|yes)$/i.test(String(process.env.ECC_HOOK_INPUT_TRUNCATED || ''));
|
|
114
|
+
process.stdin.setEncoding('utf8');
|
|
115
|
+
process.stdin.on('data', chunk => {
|
|
116
|
+
if (raw.length < MAX_STDIN) {
|
|
117
|
+
const remaining = MAX_STDIN - raw.length;
|
|
118
|
+
raw += chunk.substring(0, remaining);
|
|
119
|
+
if (chunk.length > remaining) truncated = true;
|
|
120
|
+
} else {
|
|
121
|
+
truncated = true;
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
|
|
125
|
+
process.stdin.on('end', () => {
|
|
126
|
+
const result = run(raw, {
|
|
127
|
+
truncated,
|
|
128
|
+
maxStdin: Number(process.env.ECC_HOOK_INPUT_MAX_BYTES) || MAX_STDIN,
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
if (result.stderr) {
|
|
132
|
+
process.stderr.write(result.stderr + '\n');
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (result.exitCode === 2) {
|
|
136
|
+
process.exit(2);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
process.stdout.write(raw);
|
|
140
|
+
});
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Cost Tracker Hook
|
|
4
|
+
*
|
|
5
|
+
* Appends lightweight session usage metrics to ~/.claude/metrics/costs.jsonl.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
'use strict';
|
|
9
|
+
|
|
10
|
+
const path = require('path');
|
|
11
|
+
const {
|
|
12
|
+
ensureDir,
|
|
13
|
+
appendFile,
|
|
14
|
+
getClaudeDir,
|
|
15
|
+
} = require('../lib/utils');
|
|
16
|
+
|
|
17
|
+
const MAX_STDIN = 1024 * 1024;
|
|
18
|
+
let raw = '';
|
|
19
|
+
|
|
20
|
+
function toNumber(value) {
|
|
21
|
+
const n = Number(value);
|
|
22
|
+
return Number.isFinite(n) ? n : 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function estimateCost(model, inputTokens, outputTokens) {
|
|
26
|
+
// Approximate per-1M-token blended rates. Conservative defaults.
|
|
27
|
+
const table = {
|
|
28
|
+
'haiku': { in: 0.8, out: 4.0 },
|
|
29
|
+
'sonnet': { in: 3.0, out: 15.0 },
|
|
30
|
+
'opus': { in: 15.0, out: 75.0 },
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const normalized = String(model || '').toLowerCase();
|
|
34
|
+
let rates = table.sonnet;
|
|
35
|
+
if (normalized.includes('haiku')) rates = table.haiku;
|
|
36
|
+
if (normalized.includes('opus')) rates = table.opus;
|
|
37
|
+
|
|
38
|
+
const cost = (inputTokens / 1_000_000) * rates.in + (outputTokens / 1_000_000) * rates.out;
|
|
39
|
+
return Math.round(cost * 1e6) / 1e6;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
process.stdin.setEncoding('utf8');
|
|
43
|
+
process.stdin.on('data', chunk => {
|
|
44
|
+
if (raw.length < MAX_STDIN) {
|
|
45
|
+
const remaining = MAX_STDIN - raw.length;
|
|
46
|
+
raw += chunk.substring(0, remaining);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
process.stdin.on('end', () => {
|
|
51
|
+
try {
|
|
52
|
+
const input = raw.trim() ? JSON.parse(raw) : {};
|
|
53
|
+
const usage = input.usage || input.token_usage || {};
|
|
54
|
+
const inputTokens = toNumber(usage.input_tokens || usage.prompt_tokens || 0);
|
|
55
|
+
const outputTokens = toNumber(usage.output_tokens || usage.completion_tokens || 0);
|
|
56
|
+
|
|
57
|
+
const model = String(input.model || input._cursor?.model || process.env.CLAUDE_MODEL || 'unknown');
|
|
58
|
+
const sessionId = String(process.env.CLAUDE_SESSION_ID || 'default');
|
|
59
|
+
|
|
60
|
+
const metricsDir = path.join(getClaudeDir(), 'metrics');
|
|
61
|
+
ensureDir(metricsDir);
|
|
62
|
+
|
|
63
|
+
const row = {
|
|
64
|
+
timestamp: new Date().toISOString(),
|
|
65
|
+
session_id: sessionId,
|
|
66
|
+
model,
|
|
67
|
+
input_tokens: inputTokens,
|
|
68
|
+
output_tokens: outputTokens,
|
|
69
|
+
estimated_cost_usd: estimateCost(model, inputTokens, outputTokens),
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
appendFile(path.join(metricsDir, 'costs.jsonl'), `${JSON.stringify(row)}\n`);
|
|
73
|
+
} catch {
|
|
74
|
+
// Keep hook non-blocking.
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
process.stdout.write(raw);
|
|
78
|
+
});
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* PostToolUse hook: lightweight frontend design-quality reminder.
|
|
4
|
+
*
|
|
5
|
+
* This stays self-contained inside ECC. It does not call remote models or
|
|
6
|
+
* install packages. The goal is to catch obviously generic UI drift and keep
|
|
7
|
+
* frontend edits aligned with ECC's stronger design standards.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
'use strict';
|
|
11
|
+
|
|
12
|
+
const fs = require('fs');
|
|
13
|
+
const path = require('path');
|
|
14
|
+
|
|
15
|
+
const FRONTEND_EXTENSIONS = /\.(astro|css|html|jsx|scss|svelte|tsx|vue)$/i;
|
|
16
|
+
const MAX_STDIN = 1024 * 1024;
|
|
17
|
+
|
|
18
|
+
const GENERIC_SIGNALS = [
|
|
19
|
+
{ pattern: /\bget started\b/i, label: '"Get Started" CTA copy' },
|
|
20
|
+
{ pattern: /\blearn more\b/i, label: '"Learn more" CTA copy' },
|
|
21
|
+
{ pattern: /\bgrid-cols-(3|4)\b/, label: 'uniform multi-card grid' },
|
|
22
|
+
{ pattern: /\bbg-gradient-to-[trbl]/, label: 'stock gradient utility usage' },
|
|
23
|
+
{ pattern: /\btext-center\b/, label: 'centered default layout cues' },
|
|
24
|
+
{ pattern: /\bfont-(sans|inter)\b/i, label: 'default font utility' },
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const CHECKLIST = [
|
|
28
|
+
'visual hierarchy with real contrast',
|
|
29
|
+
'intentional spacing rhythm',
|
|
30
|
+
'depth, layering, or overlap',
|
|
31
|
+
'purposeful hover and focus states',
|
|
32
|
+
'color and typography that feel specific',
|
|
33
|
+
];
|
|
34
|
+
|
|
35
|
+
function getFilePaths(input) {
|
|
36
|
+
const toolInput = input?.tool_input || {};
|
|
37
|
+
if (toolInput.file_path) {
|
|
38
|
+
return [String(toolInput.file_path)];
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (Array.isArray(toolInput.edits)) {
|
|
42
|
+
return toolInput.edits
|
|
43
|
+
.map(edit => String(edit?.file_path || ''))
|
|
44
|
+
.filter(Boolean);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function readContent(filePath) {
|
|
51
|
+
try {
|
|
52
|
+
return fs.readFileSync(path.resolve(filePath), 'utf8');
|
|
53
|
+
} catch {
|
|
54
|
+
return '';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function detectSignals(content) {
|
|
59
|
+
return GENERIC_SIGNALS.filter(signal => signal.pattern.test(content)).map(signal => signal.label);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function buildWarning(frontendPaths, findings) {
|
|
63
|
+
const pathLines = frontendPaths.map(fp => ` - ${fp}`).join('\n');
|
|
64
|
+
const signalLines = findings.length > 0
|
|
65
|
+
? findings.map(item => ` - ${item}`).join('\n')
|
|
66
|
+
: ' - no obvious canned-template strings detected';
|
|
67
|
+
|
|
68
|
+
return [
|
|
69
|
+
'[Hook] DESIGN CHECK: frontend file(s) modified:',
|
|
70
|
+
pathLines,
|
|
71
|
+
'[Hook] Review for generic/template drift. Frontend should have:',
|
|
72
|
+
CHECKLIST.map(item => ` - ${item}`).join('\n'),
|
|
73
|
+
'[Hook] Heuristic signals:',
|
|
74
|
+
signalLines,
|
|
75
|
+
].join('\n');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function run(inputOrRaw) {
|
|
79
|
+
let input;
|
|
80
|
+
let rawInput = inputOrRaw;
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
if (typeof inputOrRaw === 'string') {
|
|
84
|
+
rawInput = inputOrRaw;
|
|
85
|
+
input = inputOrRaw.trim() ? JSON.parse(inputOrRaw) : {};
|
|
86
|
+
} else {
|
|
87
|
+
input = inputOrRaw || {};
|
|
88
|
+
rawInput = JSON.stringify(inputOrRaw ?? {});
|
|
89
|
+
}
|
|
90
|
+
} catch {
|
|
91
|
+
return { exitCode: 0, stdout: typeof rawInput === 'string' ? rawInput : '' };
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const filePaths = getFilePaths(input);
|
|
95
|
+
const frontendPaths = filePaths.filter(filePath => FRONTEND_EXTENSIONS.test(filePath));
|
|
96
|
+
|
|
97
|
+
if (frontendPaths.length === 0) {
|
|
98
|
+
return { exitCode: 0, stdout: typeof rawInput === 'string' ? rawInput : '' };
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const findings = [];
|
|
102
|
+
for (const filePath of frontendPaths) {
|
|
103
|
+
const content = readContent(filePath);
|
|
104
|
+
findings.push(...detectSignals(content));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
exitCode: 0,
|
|
109
|
+
stdout: typeof rawInput === 'string' ? rawInput : '',
|
|
110
|
+
stderr: buildWarning(frontendPaths, findings),
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
module.exports = { run };
|
|
115
|
+
|
|
116
|
+
if (require.main === module) {
|
|
117
|
+
let raw = '';
|
|
118
|
+
process.stdin.setEncoding('utf8');
|
|
119
|
+
process.stdin.on('data', chunk => {
|
|
120
|
+
if (raw.length < MAX_STDIN) {
|
|
121
|
+
const remaining = MAX_STDIN - raw.length;
|
|
122
|
+
raw += chunk.substring(0, remaining);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
process.stdin.on('end', () => {
|
|
126
|
+
const result = run(raw);
|
|
127
|
+
if (result.stderr) process.stderr.write(`${result.stderr}\n`);
|
|
128
|
+
process.stdout.write(typeof result.stdout === 'string' ? result.stdout : raw);
|
|
129
|
+
process.exit(Number.isInteger(result.exitCode) ? result.exitCode : 0);
|
|
130
|
+
});
|
|
131
|
+
}
|