gentyr 1.3.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/.claude/agents/antipattern-hunter.md +176 -0
- package/.claude/agents/code-reviewer.md +205 -0
- package/.claude/agents/code-writer.md +154 -0
- package/.claude/agents/deputy-cto.md +309 -0
- package/.claude/agents/feedback-agent.md +101 -0
- package/.claude/agents/investigator.md +136 -0
- package/.claude/agents/product-manager.md +97 -0
- package/.claude/agents/project-manager.md +116 -0
- package/.claude/agents/repo-hygiene-expert.md +626 -0
- package/.claude/agents/secret-manager.md +324 -0
- package/.claude/agents/test-writer.md +354 -0
- package/.claude/commands/configure-personas.md +144 -0
- package/.claude/commands/cto-report.md +36 -0
- package/.claude/commands/demo.md +89 -0
- package/.claude/commands/deputy-cto.md +345 -0
- package/.claude/commands/hotfix.md +31 -0
- package/.claude/commands/overdrive-gentyr.md +167 -0
- package/.claude/commands/product-manager.md +32 -0
- package/.claude/commands/push-migrations.md +86 -0
- package/.claude/commands/push-secrets.md +97 -0
- package/.claude/commands/services.json.example +30 -0
- package/.claude/commands/setup-gentyr.md +396 -0
- package/.claude/commands/show.md +42 -0
- package/.claude/commands/spawn-tasks.md +79 -0
- package/.claude/commands/toggle-automation-gentyr.md +75 -0
- package/.claude/commands/toggle-product-manager.md +19 -0
- package/.claude/commands/triage.md +69 -0
- package/.claude/hooks/README.md +686 -0
- package/.claude/hooks/__tests__/README.md +129 -0
- package/.claude/hooks/agent-tracker.js +434 -0
- package/.claude/hooks/antipattern-hunter-hook.js +401 -0
- package/.claude/hooks/api-key-watcher.js +289 -0
- package/.claude/hooks/block-no-verify.js +301 -0
- package/.claude/hooks/bypass-approval-hook.js +313 -0
- package/.claude/hooks/compliance-checker.js +1309 -0
- package/.claude/hooks/config-reader.js +143 -0
- package/.claude/hooks/credential-file-guard.js +1139 -0
- package/.claude/hooks/credential-health-check.js +168 -0
- package/.claude/hooks/credential-sync-hook.js +79 -0
- package/.claude/hooks/cto-notification-hook.js +656 -0
- package/.claude/hooks/feedback-launcher.js +424 -0
- package/.claude/hooks/feedback-orchestrator.js +367 -0
- package/.claude/hooks/gentyr-splash.js +47 -0
- package/.claude/hooks/gentyr-sync.js +389 -0
- package/.claude/hooks/hourly-automation.js +3340 -0
- package/.claude/hooks/key-sync.js +899 -0
- package/.claude/hooks/lib/approval-utils.js +731 -0
- package/.claude/hooks/lib/feature-branch-helper.js +102 -0
- package/.claude/hooks/lib/worktree-manager.js +330 -0
- package/.claude/hooks/mapping-validator.js +285 -0
- package/.claude/hooks/plan-executor.js +398 -0
- package/.claude/hooks/playwright-cli-guard.js +104 -0
- package/.claude/hooks/playwright-health-check.js +71 -0
- package/.claude/hooks/pre-commit-review.js +725 -0
- package/.claude/hooks/prompts/local-spec-enforcement.md +310 -0
- package/.claude/hooks/prompts/mapping-fix.md +92 -0
- package/.claude/hooks/prompts/mapping-review.md +140 -0
- package/.claude/hooks/prompts/schema-mapper.md +185 -0
- package/.claude/hooks/prompts/spec-enforcement.md +233 -0
- package/.claude/hooks/protected-action-approval-hook.js +336 -0
- package/.claude/hooks/protected-action-gate.js +562 -0
- package/.claude/hooks/protected-actions.json +208 -0
- package/.claude/hooks/protected-actions.json.template +122 -0
- package/.claude/hooks/quota-monitor.js +490 -0
- package/.claude/hooks/reporters/jest-failure-reporter.js +401 -0
- package/.claude/hooks/reporters/playwright-failure-reporter.js +446 -0
- package/.claude/hooks/reporters/vitest-failure-reporter.js +443 -0
- package/.claude/hooks/schema-mapper-hook.js +544 -0
- package/.claude/hooks/secret-leak-detector.js +216 -0
- package/.claude/hooks/session-reviver.js +514 -0
- package/.claude/hooks/slash-command-prefetch.js +1145 -0
- package/.claude/hooks/stale-work-detector.js +205 -0
- package/.claude/hooks/stop-continue-hook.js +414 -0
- package/.claude/hooks/todo-maintenance.js +522 -0
- package/.claude/hooks/todo-processing-prompt.md +75 -0
- package/.claude/hooks/usage-optimizer.js +791 -0
- package/.claude/mcp/README.md +246 -0
- package/.claude/settings.json.template +168 -0
- package/.mcp.json.template +207 -0
- package/CLAUDE.md +340 -0
- package/CLAUDE.md.gentyr-section +89 -0
- package/LICENSE +21 -0
- package/README.md +297 -0
- package/cli/commands/init.js +471 -0
- package/cli/commands/migrate.js +132 -0
- package/cli/commands/protect.js +271 -0
- package/cli/commands/scaffold.js +48 -0
- package/cli/commands/status.js +133 -0
- package/cli/commands/sync.js +101 -0
- package/cli/commands/uninstall.js +207 -0
- package/cli/index.js +111 -0
- package/cli/lib/config-gen.js +214 -0
- package/cli/lib/resolve-framework.js +97 -0
- package/cli/lib/state.js +140 -0
- package/cli/lib/symlinks.js +260 -0
- package/docs/AUTOMATION-SYSTEMS.md +484 -0
- package/docs/BINARY-PATCHING.md +212 -0
- package/docs/CHANGELOG.md +2830 -0
- package/docs/CREDENTIAL-DETECTION.md +151 -0
- package/docs/CTO-DASHBOARD.md +476 -0
- package/docs/DEPLOYMENT-FLOW.md +477 -0
- package/docs/DEVELOPER.md +116 -0
- package/docs/Executive.md +372 -0
- package/docs/SECRET-PATHS.md +77 -0
- package/docs/SETUP-GUIDE.md +419 -0
- package/docs/STACK.md +109 -0
- package/docs/TESTING.md +440 -0
- package/docs/assets/claude-logo.svg +3 -0
- package/docs/sessions/2026-01-24-spec-suite-implementation.md +190 -0
- package/docs/sessions/2026-02-15-feedback-e2e-audit.md +484 -0
- package/docs/sessions/2026-02-20-credential-rotation-experiments.md +340 -0
- package/docs/sessions/TEST-COVERAGE-REPORT-2026-02-20.md +168 -0
- package/docs/shared/EPHEMERAL-STATE-FILES.md +115 -0
- package/docs/shared/PROTECTION-SYSTEM.md +341 -0
- package/husky/post-commit +10 -0
- package/husky/pre-commit +40 -0
- package/husky/pre-push +94 -0
- package/package.json +43 -0
- package/packages/cto-dashboard/package-lock.json +3510 -0
- package/packages/cto-dashboard/package.json +41 -0
- package/packages/cto-dashboard/pnpm-lock.yaml +2168 -0
- package/packages/mcp-servers/dist/__testUtils__/fixtures.d.ts +220 -0
- package/packages/mcp-servers/dist/__testUtils__/fixtures.d.ts.map +1 -0
- package/packages/mcp-servers/dist/__testUtils__/fixtures.js +376 -0
- package/packages/mcp-servers/dist/__testUtils__/fixtures.js.map +1 -0
- package/packages/mcp-servers/dist/__testUtils__/index.d.ts +121 -0
- package/packages/mcp-servers/dist/__testUtils__/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/__testUtils__/index.js +180 -0
- package/packages/mcp-servers/dist/__testUtils__/index.js.map +1 -0
- package/packages/mcp-servers/dist/__testUtils__/schemas.d.ts +84 -0
- package/packages/mcp-servers/dist/__testUtils__/schemas.d.ts.map +1 -0
- package/packages/mcp-servers/dist/__testUtils__/schemas.js +309 -0
- package/packages/mcp-servers/dist/__testUtils__/schemas.js.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/index.d.ts +7 -0
- package/packages/mcp-servers/dist/agent-reports/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/index.js +8 -0
- package/packages/mcp-servers/dist/agent-reports/index.js.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/server.d.ts +22 -0
- package/packages/mcp-servers/dist/agent-reports/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/server.js +535 -0
- package/packages/mcp-servers/dist/agent-reports/server.js.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/types.d.ts +258 -0
- package/packages/mcp-servers/dist/agent-reports/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-reports/types.js +81 -0
- package/packages/mcp-servers/dist/agent-reports/types.js.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/index.d.ts +5 -0
- package/packages/mcp-servers/dist/agent-tracker/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/index.js +5 -0
- package/packages/mcp-servers/dist/agent-tracker/index.js.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/server.d.ts +12 -0
- package/packages/mcp-servers/dist/agent-tracker/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/server.js +919 -0
- package/packages/mcp-servers/dist/agent-tracker/server.js.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/types.d.ts +328 -0
- package/packages/mcp-servers/dist/agent-tracker/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/agent-tracker/types.js +128 -0
- package/packages/mcp-servers/dist/agent-tracker/types.js.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/browser-tips.d.ts +27 -0
- package/packages/mcp-servers/dist/chrome-bridge/browser-tips.d.ts.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/browser-tips.js +167 -0
- package/packages/mcp-servers/dist/chrome-bridge/browser-tips.js.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/index.d.ts +6 -0
- package/packages/mcp-servers/dist/chrome-bridge/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/index.js +6 -0
- package/packages/mcp-servers/dist/chrome-bridge/index.js.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/server.d.ts +13 -0
- package/packages/mcp-servers/dist/chrome-bridge/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/server.js +959 -0
- package/packages/mcp-servers/dist/chrome-bridge/server.js.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/types.d.ts +41 -0
- package/packages/mcp-servers/dist/chrome-bridge/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/chrome-bridge/types.js +8 -0
- package/packages/mcp-servers/dist/chrome-bridge/types.js.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/index.d.ts +8 -0
- package/packages/mcp-servers/dist/cloudflare/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/index.js +8 -0
- package/packages/mcp-servers/dist/cloudflare/index.js.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/server.d.ts +16 -0
- package/packages/mcp-servers/dist/cloudflare/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/server.js +253 -0
- package/packages/mcp-servers/dist/cloudflare/server.js.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/types.d.ts +141 -0
- package/packages/mcp-servers/dist/cloudflare/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cloudflare/types.js +53 -0
- package/packages/mcp-servers/dist/cloudflare/types.js.map +1 -0
- package/packages/mcp-servers/dist/codecov/index.d.ts +7 -0
- package/packages/mcp-servers/dist/codecov/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/codecov/index.js +7 -0
- package/packages/mcp-servers/dist/codecov/index.js.map +1 -0
- package/packages/mcp-servers/dist/codecov/server.d.ts +21 -0
- package/packages/mcp-servers/dist/codecov/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/codecov/server.js +376 -0
- package/packages/mcp-servers/dist/codecov/server.js.map +1 -0
- package/packages/mcp-servers/dist/codecov/types.d.ts +269 -0
- package/packages/mcp-servers/dist/codecov/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/codecov/types.js +128 -0
- package/packages/mcp-servers/dist/codecov/types.js.map +1 -0
- package/packages/mcp-servers/dist/cto-report/index.d.ts +9 -0
- package/packages/mcp-servers/dist/cto-report/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-report/index.js +9 -0
- package/packages/mcp-servers/dist/cto-report/index.js.map +1 -0
- package/packages/mcp-servers/dist/cto-report/server.d.ts +14 -0
- package/packages/mcp-servers/dist/cto-report/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-report/server.js +859 -0
- package/packages/mcp-servers/dist/cto-report/server.js.map +1 -0
- package/packages/mcp-servers/dist/cto-report/types.d.ts +213 -0
- package/packages/mcp-servers/dist/cto-report/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-report/types.js +29 -0
- package/packages/mcp-servers/dist/cto-report/types.js.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/index.d.ts +7 -0
- package/packages/mcp-servers/dist/cto-reports/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/index.js +8 -0
- package/packages/mcp-servers/dist/cto-reports/index.js.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/server.d.ts +20 -0
- package/packages/mcp-servers/dist/cto-reports/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/server.js +538 -0
- package/packages/mcp-servers/dist/cto-reports/server.js.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/types.d.ts +236 -0
- package/packages/mcp-servers/dist/cto-reports/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/cto-reports/types.js +77 -0
- package/packages/mcp-servers/dist/cto-reports/types.js.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/index.d.ts +7 -0
- package/packages/mcp-servers/dist/deputy-cto/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/index.js +8 -0
- package/packages/mcp-servers/dist/deputy-cto/index.js.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/server.d.ts +23 -0
- package/packages/mcp-servers/dist/deputy-cto/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/server.js +1700 -0
- package/packages/mcp-servers/dist/deputy-cto/server.js.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/types.d.ts +439 -0
- package/packages/mcp-servers/dist/deputy-cto/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/deputy-cto/types.js +102 -0
- package/packages/mcp-servers/dist/deputy-cto/types.js.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/index.d.ts +5 -0
- package/packages/mcp-servers/dist/elastic-logs/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/index.js +5 -0
- package/packages/mcp-servers/dist/elastic-logs/index.js.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/server.d.ts +18 -0
- package/packages/mcp-servers/dist/elastic-logs/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/server.js +259 -0
- package/packages/mcp-servers/dist/elastic-logs/server.js.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/types.d.ts +107 -0
- package/packages/mcp-servers/dist/elastic-logs/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/elastic-logs/types.js +31 -0
- package/packages/mcp-servers/dist/elastic-logs/types.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/index.d.ts +2 -0
- package/packages/mcp-servers/dist/feedback-explorer/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/index.js +2 -0
- package/packages/mcp-servers/dist/feedback-explorer/index.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/server.d.ts +21 -0
- package/packages/mcp-servers/dist/feedback-explorer/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/server.js +580 -0
- package/packages/mcp-servers/dist/feedback-explorer/server.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/types.d.ts +331 -0
- package/packages/mcp-servers/dist/feedback-explorer/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-explorer/types.js +40 -0
- package/packages/mcp-servers/dist/feedback-explorer/types.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/index.d.ts +9 -0
- package/packages/mcp-servers/dist/feedback-reporter/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/index.js +9 -0
- package/packages/mcp-servers/dist/feedback-reporter/index.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/server.d.ts +36 -0
- package/packages/mcp-servers/dist/feedback-reporter/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/server.js +392 -0
- package/packages/mcp-servers/dist/feedback-reporter/server.js.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/types.d.ts +152 -0
- package/packages/mcp-servers/dist/feedback-reporter/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/feedback-reporter/types.js +67 -0
- package/packages/mcp-servers/dist/feedback-reporter/types.js.map +1 -0
- package/packages/mcp-servers/dist/github/index.d.ts +7 -0
- package/packages/mcp-servers/dist/github/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/github/index.js +7 -0
- package/packages/mcp-servers/dist/github/index.js.map +1 -0
- package/packages/mcp-servers/dist/github/server.d.ts +15 -0
- package/packages/mcp-servers/dist/github/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/github/server.js +686 -0
- package/packages/mcp-servers/dist/github/server.js.map +1 -0
- package/packages/mcp-servers/dist/github/types.d.ts +660 -0
- package/packages/mcp-servers/dist/github/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/github/types.js +209 -0
- package/packages/mcp-servers/dist/github/types.js.map +1 -0
- package/packages/mcp-servers/dist/index.d.ts +30 -0
- package/packages/mcp-servers/dist/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/index.js +32 -0
- package/packages/mcp-servers/dist/index.js.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/index.d.ts +5 -0
- package/packages/mcp-servers/dist/makerkit-docs/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/index.js +5 -0
- package/packages/mcp-servers/dist/makerkit-docs/index.js.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/server.d.ts +15 -0
- package/packages/mcp-servers/dist/makerkit-docs/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/server.js +252 -0
- package/packages/mcp-servers/dist/makerkit-docs/server.js.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/types.d.ts +74 -0
- package/packages/mcp-servers/dist/makerkit-docs/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/makerkit-docs/types.js +20 -0
- package/packages/mcp-servers/dist/makerkit-docs/types.js.map +1 -0
- package/packages/mcp-servers/dist/onepassword/index.d.ts +2 -0
- package/packages/mcp-servers/dist/onepassword/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/onepassword/index.js +2 -0
- package/packages/mcp-servers/dist/onepassword/index.js.map +1 -0
- package/packages/mcp-servers/dist/onepassword/server.d.ts +2 -0
- package/packages/mcp-servers/dist/onepassword/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/onepassword/server.js +159 -0
- package/packages/mcp-servers/dist/onepassword/server.js.map +1 -0
- package/packages/mcp-servers/dist/onepassword/types.d.ts +55 -0
- package/packages/mcp-servers/dist/onepassword/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/onepassword/types.js +22 -0
- package/packages/mcp-servers/dist/onepassword/types.js.map +1 -0
- package/packages/mcp-servers/dist/playwright/helpers.d.ts +20 -0
- package/packages/mcp-servers/dist/playwright/helpers.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright/helpers.js +31 -0
- package/packages/mcp-servers/dist/playwright/helpers.js.map +1 -0
- package/packages/mcp-servers/dist/playwright/index.d.ts +5 -0
- package/packages/mcp-servers/dist/playwright/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright/index.js +5 -0
- package/packages/mcp-servers/dist/playwright/index.js.map +1 -0
- package/packages/mcp-servers/dist/playwright/server.d.ts +13 -0
- package/packages/mcp-servers/dist/playwright/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright/server.js +1201 -0
- package/packages/mcp-servers/dist/playwright/server.js.map +1 -0
- package/packages/mcp-servers/dist/playwright/types.d.ts +216 -0
- package/packages/mcp-servers/dist/playwright/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright/types.js +172 -0
- package/packages/mcp-servers/dist/playwright/types.js.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/browser-manager.d.ts +39 -0
- package/packages/mcp-servers/dist/playwright-feedback/browser-manager.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/browser-manager.js +71 -0
- package/packages/mcp-servers/dist/playwright-feedback/browser-manager.js.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/index.d.ts +5 -0
- package/packages/mcp-servers/dist/playwright-feedback/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/index.js +5 -0
- package/packages/mcp-servers/dist/playwright-feedback/index.js.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/server.d.ts +34 -0
- package/packages/mcp-servers/dist/playwright-feedback/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/server.js +538 -0
- package/packages/mcp-servers/dist/playwright-feedback/server.js.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/types.d.ts +305 -0
- package/packages/mcp-servers/dist/playwright-feedback/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/playwright-feedback/types.js +123 -0
- package/packages/mcp-servers/dist/playwright-feedback/types.js.map +1 -0
- package/packages/mcp-servers/dist/product-manager/server.d.ts +17 -0
- package/packages/mcp-servers/dist/product-manager/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/product-manager/server.js +690 -0
- package/packages/mcp-servers/dist/product-manager/server.js.map +1 -0
- package/packages/mcp-servers/dist/product-manager/types.d.ts +286 -0
- package/packages/mcp-servers/dist/product-manager/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/product-manager/types.js +99 -0
- package/packages/mcp-servers/dist/product-manager/types.js.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/index.d.ts +7 -0
- package/packages/mcp-servers/dist/programmatic-feedback/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/index.js +7 -0
- package/packages/mcp-servers/dist/programmatic-feedback/index.js.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/sandbox.d.ts +19 -0
- package/packages/mcp-servers/dist/programmatic-feedback/sandbox.d.ts.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/sandbox.js +174 -0
- package/packages/mcp-servers/dist/programmatic-feedback/sandbox.js.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/server.d.ts +35 -0
- package/packages/mcp-servers/dist/programmatic-feedback/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/server.js +465 -0
- package/packages/mcp-servers/dist/programmatic-feedback/server.js.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/types.d.ts +127 -0
- package/packages/mcp-servers/dist/programmatic-feedback/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/programmatic-feedback/types.js +80 -0
- package/packages/mcp-servers/dist/programmatic-feedback/types.js.map +1 -0
- package/packages/mcp-servers/dist/render/index.d.ts +8 -0
- package/packages/mcp-servers/dist/render/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/render/index.js +8 -0
- package/packages/mcp-servers/dist/render/index.js.map +1 -0
- package/packages/mcp-servers/dist/render/server.d.ts +15 -0
- package/packages/mcp-servers/dist/render/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/render/server.js +428 -0
- package/packages/mcp-servers/dist/render/server.js.map +1 -0
- package/packages/mcp-servers/dist/render/types.d.ts +273 -0
- package/packages/mcp-servers/dist/render/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/render/types.js +102 -0
- package/packages/mcp-servers/dist/render/types.js.map +1 -0
- package/packages/mcp-servers/dist/resend/index.d.ts +7 -0
- package/packages/mcp-servers/dist/resend/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/resend/index.js +7 -0
- package/packages/mcp-servers/dist/resend/index.js.map +1 -0
- package/packages/mcp-servers/dist/resend/server.d.ts +15 -0
- package/packages/mcp-servers/dist/resend/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/resend/server.js +298 -0
- package/packages/mcp-servers/dist/resend/server.js.map +1 -0
- package/packages/mcp-servers/dist/resend/types.d.ts +222 -0
- package/packages/mcp-servers/dist/resend/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/resend/types.js +58 -0
- package/packages/mcp-servers/dist/resend/types.js.map +1 -0
- package/packages/mcp-servers/dist/review-queue/index.d.ts +6 -0
- package/packages/mcp-servers/dist/review-queue/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/review-queue/index.js +6 -0
- package/packages/mcp-servers/dist/review-queue/index.js.map +1 -0
- package/packages/mcp-servers/dist/review-queue/server.d.ts +17 -0
- package/packages/mcp-servers/dist/review-queue/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/review-queue/server.js +348 -0
- package/packages/mcp-servers/dist/review-queue/server.js.map +1 -0
- package/packages/mcp-servers/dist/review-queue/types.d.ts +162 -0
- package/packages/mcp-servers/dist/review-queue/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/review-queue/types.js +56 -0
- package/packages/mcp-servers/dist/review-queue/types.js.map +1 -0
- package/packages/mcp-servers/dist/secret-sync/server.d.ts +19 -0
- package/packages/mcp-servers/dist/secret-sync/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/secret-sync/server.js +1139 -0
- package/packages/mcp-servers/dist/secret-sync/server.js.map +1 -0
- package/packages/mcp-servers/dist/secret-sync/types.d.ts +442 -0
- package/packages/mcp-servers/dist/secret-sync/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/secret-sync/types.js +113 -0
- package/packages/mcp-servers/dist/secret-sync/types.js.map +1 -0
- package/packages/mcp-servers/dist/session-events/index.d.ts +5 -0
- package/packages/mcp-servers/dist/session-events/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-events/index.js +5 -0
- package/packages/mcp-servers/dist/session-events/index.js.map +1 -0
- package/packages/mcp-servers/dist/session-events/server.d.ts +11 -0
- package/packages/mcp-servers/dist/session-events/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-events/server.js +290 -0
- package/packages/mcp-servers/dist/session-events/server.js.map +1 -0
- package/packages/mcp-servers/dist/session-events/types.d.ts +213 -0
- package/packages/mcp-servers/dist/session-events/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-events/types.js +69 -0
- package/packages/mcp-servers/dist/session-events/types.js.map +1 -0
- package/packages/mcp-servers/dist/session-restart/index.d.ts +9 -0
- package/packages/mcp-servers/dist/session-restart/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-restart/index.js +9 -0
- package/packages/mcp-servers/dist/session-restart/index.js.map +1 -0
- package/packages/mcp-servers/dist/session-restart/server.d.ts +20 -0
- package/packages/mcp-servers/dist/session-restart/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-restart/server.js +411 -0
- package/packages/mcp-servers/dist/session-restart/server.js.map +1 -0
- package/packages/mcp-servers/dist/session-restart/types.d.ts +26 -0
- package/packages/mcp-servers/dist/session-restart/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/session-restart/types.js +16 -0
- package/packages/mcp-servers/dist/session-restart/types.js.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/index.d.ts +5 -0
- package/packages/mcp-servers/dist/setup-helper/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/index.js +5 -0
- package/packages/mcp-servers/dist/setup-helper/index.js.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/server.d.ts +14 -0
- package/packages/mcp-servers/dist/setup-helper/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/server.js +454 -0
- package/packages/mcp-servers/dist/setup-helper/server.js.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/types.d.ts +81 -0
- package/packages/mcp-servers/dist/setup-helper/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/setup-helper/types.js +41 -0
- package/packages/mcp-servers/dist/setup-helper/types.js.map +1 -0
- package/packages/mcp-servers/dist/shared/audited-server.d.ts +31 -0
- package/packages/mcp-servers/dist/shared/audited-server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/audited-server.js +126 -0
- package/packages/mcp-servers/dist/shared/audited-server.js.map +1 -0
- package/packages/mcp-servers/dist/shared/constants.d.ts +26 -0
- package/packages/mcp-servers/dist/shared/constants.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/constants.js +41 -0
- package/packages/mcp-servers/dist/shared/constants.js.map +1 -0
- package/packages/mcp-servers/dist/shared/index.d.ts +6 -0
- package/packages/mcp-servers/dist/shared/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/index.js +6 -0
- package/packages/mcp-servers/dist/shared/index.js.map +1 -0
- package/packages/mcp-servers/dist/shared/readonly-db.d.ts +11 -0
- package/packages/mcp-servers/dist/shared/readonly-db.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/readonly-db.js +47 -0
- package/packages/mcp-servers/dist/shared/readonly-db.js.map +1 -0
- package/packages/mcp-servers/dist/shared/resolve-framework.d.ts +20 -0
- package/packages/mcp-servers/dist/shared/resolve-framework.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/resolve-framework.js +65 -0
- package/packages/mcp-servers/dist/shared/resolve-framework.js.map +1 -0
- package/packages/mcp-servers/dist/shared/server.d.ts +86 -0
- package/packages/mcp-servers/dist/shared/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/server.js +291 -0
- package/packages/mcp-servers/dist/shared/server.js.map +1 -0
- package/packages/mcp-servers/dist/shared/types.d.ts +113 -0
- package/packages/mcp-servers/dist/shared/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/shared/types.js +36 -0
- package/packages/mcp-servers/dist/shared/types.js.map +1 -0
- package/packages/mcp-servers/dist/show/server.d.ts +12 -0
- package/packages/mcp-servers/dist/show/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/show/server.js +97 -0
- package/packages/mcp-servers/dist/show/server.js.map +1 -0
- package/packages/mcp-servers/dist/show/types.d.ts +19 -0
- package/packages/mcp-servers/dist/show/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/show/types.js +32 -0
- package/packages/mcp-servers/dist/show/types.js.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/index.d.ts +5 -0
- package/packages/mcp-servers/dist/specs-browser/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/index.js +5 -0
- package/packages/mcp-servers/dist/specs-browser/index.js.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/server.d.ts +13 -0
- package/packages/mcp-servers/dist/specs-browser/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/server.js +692 -0
- package/packages/mcp-servers/dist/specs-browser/server.js.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/types.d.ts +337 -0
- package/packages/mcp-servers/dist/specs-browser/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/specs-browser/types.js +134 -0
- package/packages/mcp-servers/dist/specs-browser/types.js.map +1 -0
- package/packages/mcp-servers/dist/supabase/index.d.ts +10 -0
- package/packages/mcp-servers/dist/supabase/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/supabase/index.js +10 -0
- package/packages/mcp-servers/dist/supabase/index.js.map +1 -0
- package/packages/mcp-servers/dist/supabase/server.d.ts +20 -0
- package/packages/mcp-servers/dist/supabase/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/supabase/server.js +451 -0
- package/packages/mcp-servers/dist/supabase/server.js.map +1 -0
- package/packages/mcp-servers/dist/supabase/types.d.ts +196 -0
- package/packages/mcp-servers/dist/supabase/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/supabase/types.js +76 -0
- package/packages/mcp-servers/dist/supabase/types.js.map +1 -0
- package/packages/mcp-servers/dist/todo-db/index.d.ts +5 -0
- package/packages/mcp-servers/dist/todo-db/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/todo-db/index.js +5 -0
- package/packages/mcp-servers/dist/todo-db/index.js.map +1 -0
- package/packages/mcp-servers/dist/todo-db/server.d.ts +13 -0
- package/packages/mcp-servers/dist/todo-db/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/todo-db/server.js +649 -0
- package/packages/mcp-servers/dist/todo-db/server.js.map +1 -0
- package/packages/mcp-servers/dist/todo-db/types.d.ts +225 -0
- package/packages/mcp-servers/dist/todo-db/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/todo-db/types.js +69 -0
- package/packages/mcp-servers/dist/todo-db/types.js.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/index.d.ts +7 -0
- package/packages/mcp-servers/dist/user-feedback/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/index.js +8 -0
- package/packages/mcp-servers/dist/user-feedback/index.js.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/server.d.ts +25 -0
- package/packages/mcp-servers/dist/user-feedback/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/server.js +914 -0
- package/packages/mcp-servers/dist/user-feedback/server.js.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/types.d.ts +415 -0
- package/packages/mcp-servers/dist/user-feedback/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/user-feedback/types.js +132 -0
- package/packages/mcp-servers/dist/user-feedback/types.js.map +1 -0
- package/packages/mcp-servers/dist/vercel/index.d.ts +9 -0
- package/packages/mcp-servers/dist/vercel/index.d.ts.map +1 -0
- package/packages/mcp-servers/dist/vercel/index.js +9 -0
- package/packages/mcp-servers/dist/vercel/index.js.map +1 -0
- package/packages/mcp-servers/dist/vercel/server.d.ts +17 -0
- package/packages/mcp-servers/dist/vercel/server.d.ts.map +1 -0
- package/packages/mcp-servers/dist/vercel/server.js +265 -0
- package/packages/mcp-servers/dist/vercel/server.js.map +1 -0
- package/packages/mcp-servers/dist/vercel/types.d.ts +189 -0
- package/packages/mcp-servers/dist/vercel/types.d.ts.map +1 -0
- package/packages/mcp-servers/dist/vercel/types.js +65 -0
- package/packages/mcp-servers/dist/vercel/types.js.map +1 -0
- package/packages/mcp-servers/package-lock.json +3765 -0
- package/packages/mcp-servers/package.json +64 -0
- package/packages/mcp-servers/test/reporters/test-failure-reporter.ts +372 -0
- package/packages/mcp-servers/vitest.config.ts +27 -0
- package/scripts/__tests__/README.md +163 -0
- package/scripts/apply-credential-hardening.sh +271 -0
- package/scripts/credential-providers/manual.js +56 -0
- package/scripts/credential-providers/onepassword.js +85 -0
- package/scripts/credential-providers/provider-interface.js +104 -0
- package/scripts/encrypt-credential.js +337 -0
- package/scripts/feedback-launcher.js +338 -0
- package/scripts/feedback-orchestrator.js +373 -0
- package/scripts/fix-mcp-launcher-issues.sh +97 -0
- package/scripts/force-spawn-tasks.js +651 -0
- package/scripts/force-triage-reports.js +560 -0
- package/scripts/generate-protected-actions-spec.js +142 -0
- package/scripts/generate-proxy-certs.sh +158 -0
- package/scripts/grant-chrome-ext-permissions.sh +242 -0
- package/scripts/mcp-launcher.js +125 -0
- package/scripts/merge-settings.cjs +167 -0
- package/scripts/patch-clawd.py +844 -0
- package/scripts/patch-credential-cache.py +313 -0
- package/scripts/patches/credential-file-guard-patched.mjs +573 -0
- package/scripts/patches/credential-file-guard.js.patched +573 -0
- package/scripts/patches/verify-tokenizer.mjs +132 -0
- package/scripts/protect-framework.sh +478 -0
- package/scripts/readme-chrome.template +12 -0
- package/scripts/reap-completed-agents.js +439 -0
- package/scripts/reinstall.sh +86 -0
- package/scripts/resign-node.sh +185 -0
- package/scripts/rotation-proxy.js +656 -0
- package/scripts/rotation-stress-monitor.mjs +862 -0
- package/scripts/setup-automation-service.sh +648 -0
- package/scripts/setup-check.js +251 -0
- package/scripts/watch-claude-version.js +142 -0
- package/specs/framework/CORE-INVARIANTS.md +161 -0
- package/specs/patterns/AGENT-PATTERNS.md +223 -0
- package/specs/patterns/HOOK-PATTERNS.md +242 -0
- package/specs/patterns/MCP-SERVER-PATTERNS.md +144 -0
- package/templates/config/gitignore.template +14 -0
- package/templates/config/merge-chain-check.yml.template +51 -0
- package/templates/config/package.json.template +18 -0
- package/templates/config/pnpm-workspace.yaml +5 -0
- package/templates/config/services.json.template +18 -0
- package/templates/config/tsconfig.base.json +17 -0
- package/templates/scaffold/integrations/_template/.gitkeep +0 -0
- package/templates/scaffold/packages/logger/package.json +17 -0
- package/templates/scaffold/packages/logger/src/logger.ts +44 -0
- package/templates/scaffold/packages/shared/package.json +17 -0
- package/templates/scaffold/packages/shared/src/errors.ts +43 -0
- package/templates/scaffold/products/_product/apps/backend/package.json +21 -0
- package/templates/scaffold/products/_product/apps/backend/src/index.ts +17 -0
- package/templates/scaffold/products/_product/apps/extension/.gitkeep +0 -0
- package/templates/scaffold/products/_product/apps/web/.gitkeep +0 -0
- package/templates/scaffold/specs/global/.gitkeep +0 -0
- package/templates/scaffold/specs/local/.gitkeep +0 -0
- package/templates/scaffold/specs/reference/.gitkeep +0 -0
- package/version.json +15 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
# GENTYR Protection System
|
|
2
|
+
|
|
3
|
+
Multi-layered defense-in-depth architecture protecting the development pipeline from accidental and adversarial misuse by AI agents.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
GENTYR enforces a **fail-closed** security model (invariant G001): when any check encounters an error, ambiguity, or missing configuration, it **blocks** the action rather than allowing it through. Seven protection layers operate independently so that compromising one layer does not defeat the others.
|
|
8
|
+
|
|
9
|
+
## Threat Model
|
|
10
|
+
|
|
11
|
+
### What GENTYR Protects Against
|
|
12
|
+
|
|
13
|
+
| Threat | Description |
|
|
14
|
+
|--------|-------------|
|
|
15
|
+
| Hook tampering | Agent deleting or modifying git hooks or Claude Code hooks to remove safety checks |
|
|
16
|
+
| Credential access | Agent reading secrets from files, environment variables, or CLI tools |
|
|
17
|
+
| Unauthorized infra changes | Agent modifying production infrastructure (Render, Vercel, Supabase, etc.) without CTO approval |
|
|
18
|
+
| Git hook bypass | Agent using `--no-verify`, `-n`, or `core.hooksPath` to skip pre-commit review |
|
|
19
|
+
| Approval forgery | Agent writing fake approval tokens to bypass deputy-CTO commit review or protected action gates |
|
|
20
|
+
| MCP aliasing | Agent connecting to an unknown MCP server that shadows a protected server's tool names |
|
|
21
|
+
| Lint weakening | Agent suppressing ESLint warnings or errors via flags or config file changes |
|
|
22
|
+
| Secret leakage | User accidentally pasting credentials into chat, or agent extracting secrets from tool output |
|
|
23
|
+
|
|
24
|
+
### Trust Boundaries
|
|
25
|
+
|
|
26
|
+
| Principal | Trust Level | Capabilities |
|
|
27
|
+
|-----------|-------------|-------------|
|
|
28
|
+
| CTO (human) | Full trust | Approves protected actions, reviews commits, manages secrets |
|
|
29
|
+
| deputy-cto agent | Elevated trust | Reviews commits, triages reports, but cannot self-approve |
|
|
30
|
+
| Other agents | Restricted | Cannot access secrets, modify infrastructure, or bypass hooks |
|
|
31
|
+
| MCP servers | Scoped trust | Only allowlisted servers may be called; protected servers require approval |
|
|
32
|
+
|
|
33
|
+
## Layer 1: Root Ownership
|
|
34
|
+
|
|
35
|
+
**Command**: `sudo npx gentyr protect`
|
|
36
|
+
|
|
37
|
+
OS-level access control that prevents agents from modifying critical files, even with shell access.
|
|
38
|
+
|
|
39
|
+
### What Gets Protected
|
|
40
|
+
|
|
41
|
+
**Directories** (root-owned, sticky bit `1755`):
|
|
42
|
+
- `.husky/` -- git hook infrastructure
|
|
43
|
+
- `.claude/` -- framework configuration root
|
|
44
|
+
- Resolved hooks directory (symlink target)
|
|
45
|
+
|
|
46
|
+
The **sticky bit** (`chmod 1755`) prevents non-root users from deleting files within these directories, even if they have write permission on the parent.
|
|
47
|
+
|
|
48
|
+
**Files** (root-owned, `644`):
|
|
49
|
+
- Hook scripts: `pre-commit-review.js`, `bypass-approval-hook.js`, `block-no-verify.js`, `protected-action-gate.js`, `protected-action-approval-hook.js`, `credential-file-guard.js`, `secret-leak-detector.js`
|
|
50
|
+
- Configuration: `protected-actions.json`, `.claude/settings.json`, `.claude/protection-key`, `.mcp.json`, `eslint.config.js`, `package.json`
|
|
51
|
+
- Git hooks: `.husky/pre-commit` (`755`, executable)
|
|
52
|
+
|
|
53
|
+
### Attack Vectors Prevented
|
|
54
|
+
|
|
55
|
+
- Agent cannot `rm` or `Edit` hook files to disable safety checks
|
|
56
|
+
- Agent cannot modify `.mcp.json` to add unvetted MCP servers
|
|
57
|
+
- Agent cannot weaken ESLint config or package.json scripts
|
|
58
|
+
- Agent cannot tamper with the HMAC protection key used for approval verification
|
|
59
|
+
|
|
60
|
+
### Protection State
|
|
61
|
+
|
|
62
|
+
Written to `.claude/protection-state.json`:
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"protected": true,
|
|
66
|
+
"timestamp": "2026-02-20T12:00:00-08:00",
|
|
67
|
+
"modified_by": "original_user"
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
## Layer 2: Protected Action Gate
|
|
72
|
+
|
|
73
|
+
**File**: `.claude/hooks/protected-action-gate.js`
|
|
74
|
+
|
|
75
|
+
HMAC-signed approval codes that prevent agents from authorizing their own actions on protected MCP servers.
|
|
76
|
+
|
|
77
|
+
### Protected Servers
|
|
78
|
+
|
|
79
|
+
Configured in `.claude/hooks/protected-actions.json`. Each entry specifies:
|
|
80
|
+
- `tools`: `"*"` (all tools) or an array of specific tool names
|
|
81
|
+
- `phrase`: CTO approval phrase (e.g., `"APPROVE SYNC"`, `"APPROVE VAULT"`)
|
|
82
|
+
- `protection`: `"approval-only"` or `"deputy-cto-approval"`
|
|
83
|
+
- `credentialKeys`: environment variable names guarded by the credential file guard
|
|
84
|
+
|
|
85
|
+
Typical protected servers include Supabase (prod/staging), Render (prod/staging), Vercel, GitHub, Resend, 1Password, secret-sync, and deputy-cto.
|
|
86
|
+
|
|
87
|
+
### HMAC Mechanism
|
|
88
|
+
|
|
89
|
+
1. Agent calls a protected MCP tool
|
|
90
|
+
2. Gate generates a **6-character alphanumeric code** (charset excludes confusable characters: `0/O`, `1/I/L`)
|
|
91
|
+
3. Gate writes a pending approval with `pending_hmac` = HMAC-SHA256 over `code|server|tool|argsHash|expiry`
|
|
92
|
+
4. CTO types the approval phrase + code (e.g., `APPROVE SYNC A7KX3N`)
|
|
93
|
+
5. Approval hook verifies HMAC, writes `approved_hmac` adding `"approved"` to the binding
|
|
94
|
+
6. Gate verifies `approved_hmac`, consumes the approval (one-time use), allows the action
|
|
95
|
+
|
|
96
|
+
**Anti-forgery**: The `argsHash` (SHA256 of tool arguments) binds the approval to the exact call, preventing bait-and-switch where an agent requests approval for a safe call then substitutes dangerous arguments.
|
|
97
|
+
|
|
98
|
+
**Expiry**: Codes expire after 5 minutes.
|
|
99
|
+
|
|
100
|
+
### MCP Server Allowlist
|
|
101
|
+
|
|
102
|
+
To prevent **MCP aliasing attacks** (an unknown server registering tools with the same names as protected tools):
|
|
103
|
+
|
|
104
|
+
- **Known servers** listed in config → allowed
|
|
105
|
+
- **Framework servers** in `allowedUnprotectedServers` (e.g., `todo-db`, `agent-tracker`, `specs-browser`, `session-events`) → allowed
|
|
106
|
+
- **Unknown servers** → **BLOCKED** (exit 1)
|
|
107
|
+
|
|
108
|
+
### Fail-Closed Behaviors (G001)
|
|
109
|
+
|
|
110
|
+
| Condition | Result |
|
|
111
|
+
|-----------|--------|
|
|
112
|
+
| Config file missing | Block ALL MCP actions |
|
|
113
|
+
| Config file corrupted | Block ALL MCP actions |
|
|
114
|
+
| Protection key missing | Block protected actions |
|
|
115
|
+
| HMAC verification fails | Delete forged approval, continue checking |
|
|
116
|
+
| File lock timeout | Block action |
|
|
117
|
+
|
|
118
|
+
## Layer 3: Bash Command Blocking
|
|
119
|
+
|
|
120
|
+
**File**: `.claude/hooks/block-no-verify.js`
|
|
121
|
+
|
|
122
|
+
Pre-tool-use hook that intercepts Bash commands and blocks dangerous patterns.
|
|
123
|
+
|
|
124
|
+
### Blocked Categories
|
|
125
|
+
|
|
126
|
+
**Hook bypass attempts**:
|
|
127
|
+
- `--no-verify` flag (and `-n` shorthand)
|
|
128
|
+
- `--no-gpg-sign` / `--gpg-sign`
|
|
129
|
+
- `git config core.hooksPath` (redirecting hook directory)
|
|
130
|
+
- `rm -rf .husky` or `rm -rf .claude/hooks` (deleting hook infrastructure)
|
|
131
|
+
|
|
132
|
+
**Lint weakening attempts**:
|
|
133
|
+
- `eslint --quiet` (suppresses warnings)
|
|
134
|
+
- `eslint --max-warnings N` where N > 0 (violates zero-tolerance policy)
|
|
135
|
+
- `eslint --no-error-on-unmatched-pattern` (silently skips linting)
|
|
136
|
+
|
|
137
|
+
**Credential CLI access**:
|
|
138
|
+
- All 1Password CLI (`op`) subcommands: `run`, `read`, `item`, `inject`, `signin`, `signout`, `whoami`, `vault`, `document`, `connect`, `account`, `group`, `user`, `service-account`, `events-api`, `plugin`
|
|
139
|
+
- `op --*` global flags
|
|
140
|
+
|
|
141
|
+
### Bypass Mechanism
|
|
142
|
+
|
|
143
|
+
For legitimate emergencies:
|
|
144
|
+
1. Agent requests bypass via `mcp__deputy-cto__request_bypass({ reason, reporting_agent, blocked_by })`
|
|
145
|
+
2. CTO types `APPROVE BYPASS <CODE>` in chat
|
|
146
|
+
3. HMAC-signed token written to `.claude/bypass-approval-token.json`
|
|
147
|
+
4. Token verified, consumed (one-time use), expires after 5 minutes
|
|
148
|
+
|
|
149
|
+
## Layer 4: Deputy-CTO Commit Review
|
|
150
|
+
|
|
151
|
+
**File**: `.claude/hooks/pre-commit-review.js`
|
|
152
|
+
|
|
153
|
+
Mandatory code review by the deputy-cto agent before any commit reaches the repository.
|
|
154
|
+
|
|
155
|
+
### APPROVE / REJECT Flow
|
|
156
|
+
|
|
157
|
+
**First commit attempt**:
|
|
158
|
+
1. Hook computes `diffHash` = SHA256 of `git diff --cached` (first 16 chars)
|
|
159
|
+
2. Checks for a valid approval token matching this `diffHash`
|
|
160
|
+
3. No token found → spawns deputy-cto agent with the full diff for review
|
|
161
|
+
4. Exits with code 1 (commit blocked)
|
|
162
|
+
|
|
163
|
+
**Deputy-CTO review**:
|
|
164
|
+
- `mcp__deputy-cto__approve_commit({ rationale })` → writes approval token
|
|
165
|
+
- `mcp__deputy-cto__reject_commit({ title, description })` → creates blocking question in deputy-cto.db
|
|
166
|
+
|
|
167
|
+
**Second commit attempt**:
|
|
168
|
+
1. Reads approval token, verifies `diffHash` matches current staged changes
|
|
169
|
+
2. Verifies token not expired (5-minute window)
|
|
170
|
+
3. Consumes token (deletes file), exits with code 0 (commit allowed)
|
|
171
|
+
|
|
172
|
+
### Diff-Hash-Bound Tokens
|
|
173
|
+
|
|
174
|
+
Approval tokens in `.claude/commit-approval-token.json` are bound to the exact diff hash. If the staged changes are modified between approval and commit, the hash won't match and the commit is blocked. This prevents an agent from getting approval for a safe diff, then staging additional changes before committing.
|
|
175
|
+
|
|
176
|
+
### Pending Questions Block Commits
|
|
177
|
+
|
|
178
|
+
**G020 compliance**: Commits to `main` are blocked if ANY pending CTO items exist:
|
|
179
|
+
- Pending questions: `SELECT COUNT(*) FROM questions WHERE status = 'pending'`
|
|
180
|
+
- Pending triage reports: `SELECT COUNT(*) FROM reports WHERE triage_status = 'pending'`
|
|
181
|
+
|
|
182
|
+
Branch behavior:
|
|
183
|
+
- `main` or unknown → **hard block** (exit 1)
|
|
184
|
+
- `staging` or `develop` → warn only
|
|
185
|
+
- Feature branches → no check
|
|
186
|
+
|
|
187
|
+
**G001**: If the database read fails, the hook assumes pending items exist and blocks the commit.
|
|
188
|
+
|
|
189
|
+
### Unbypassable Checks
|
|
190
|
+
|
|
191
|
+
These run before any bypass logic and cannot be circumvented:
|
|
192
|
+
1. **Lint config integrity** -- blocks if forbidden files exist (`.eslintignore`, `.eslintrc.*`, `.lintstagedrc.*`, `.huskyrc.*`)
|
|
193
|
+
2. **Git hooksPath validation** -- blocks if `core.hooksPath` is not `.husky` or empty
|
|
194
|
+
3. **Strict ESLint** -- runs `eslint --max-warnings 0` on staged `.ts`/`.tsx` files
|
|
195
|
+
|
|
196
|
+
## Layer 5: Secret Isolation
|
|
197
|
+
|
|
198
|
+
**File**: `packages/mcp-servers/src/secret-sync/server.ts`
|
|
199
|
+
|
|
200
|
+
Architectural guarantee that secret values never enter agent context. All credential resolution happens inside the MCP server process.
|
|
201
|
+
|
|
202
|
+
### Data Flow
|
|
203
|
+
|
|
204
|
+
```
|
|
205
|
+
Agent MCP Server (secret-sync) 1Password
|
|
206
|
+
│ │ │
|
|
207
|
+
├─ sync_secrets ───────────►│ │
|
|
208
|
+
│ (key names only) ├─ op read op://vault/item ───►│
|
|
209
|
+
│ │◄─ actual secret value ───────┤
|
|
210
|
+
│ ├─ POST to Render/Vercel API ──►
|
|
211
|
+
│◄─ status: "synced" ──────┤ (value in request body)
|
|
212
|
+
│ (NO values returned) │
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
### Design Principles
|
|
216
|
+
|
|
217
|
+
- `opRead()` calls the 1Password CLI inside the server process; the return value stays in server memory
|
|
218
|
+
- `resolveLocalSecrets()` builds an env object for child process injection; values never serialized to agent
|
|
219
|
+
- `secret_sync_secrets` pushes to hosting providers and returns only sync status
|
|
220
|
+
- `secret_list_mappings` returns key names and `op://` references, never resolved values
|
|
221
|
+
- `secret_verify_secrets` returns existence booleans, never values
|
|
222
|
+
- `secret_dev_server_start` spawns a child process with resolved env vars and returns only PIDs/ports; infrastructure credentials (`OP_SERVICE_ACCOUNT_TOKEN`, `RENDER_API_KEY`, `VERCEL_TOKEN`, etc.) are excluded from the child env
|
|
223
|
+
|
|
224
|
+
### Why This Matters
|
|
225
|
+
|
|
226
|
+
Even if all other layers were compromised, an agent cannot extract secret values because:
|
|
227
|
+
1. The MCP protocol only returns what the server's tool handlers explicitly return
|
|
228
|
+
2. The server handlers are designed to return status information, never credential values
|
|
229
|
+
3. The 1Password CLI runs in the server's process space, not the agent's
|
|
230
|
+
|
|
231
|
+
## Layer 6: Credential Guards
|
|
232
|
+
|
|
233
|
+
Two complementary hooks that block credential access at different points.
|
|
234
|
+
|
|
235
|
+
### Credential File Guard
|
|
236
|
+
|
|
237
|
+
**File**: `.claude/hooks/credential-file-guard.js`
|
|
238
|
+
|
|
239
|
+
Blocks file access tools (Read, Write, Edit, Bash, Grep, Glob) from touching credential files. Uses tiered protection with HMAC-signed CTO approval for configuration files.
|
|
240
|
+
|
|
241
|
+
**Tiered Protection**:
|
|
242
|
+
|
|
243
|
+
1. **Always-blocked files** (no escape hatch):
|
|
244
|
+
- `.env`, `.env.local`, `.env.production`, `.env.staging`, `.env.development`, `.env.test`, `.credentials.json`
|
|
245
|
+
- `.claude/protection-key`
|
|
246
|
+
- `.claude/protected-action-approvals.json`
|
|
247
|
+
- `.claude/bypass-approval-token.json`
|
|
248
|
+
- `.claude/commit-approval-token.json`
|
|
249
|
+
|
|
250
|
+
2. **CTO-approvable files** (HMAC-signed approval):
|
|
251
|
+
- `.claude/config/services.json` (phrase: `APPROVE CONFIG`)
|
|
252
|
+
- `.mcp.json` (phrase: `APPROVE MCP`)
|
|
253
|
+
- `.claude/api-key-rotation.json` (phrase: `APPROVE ROTATION`)
|
|
254
|
+
- `.claude/credential-provider.json` (phrase: `APPROVE CREDENTIAL`)
|
|
255
|
+
- `.claude/vault-mappings.json` (phrase: `APPROVE VAULT MAP`)
|
|
256
|
+
|
|
257
|
+
**Approval flow**: When an agent attempts to access a CTO-approvable file, the hook creates an HMAC-signed request via `approval-utils.js`. The deputy-CTO generates a one-time code. The CTO types the phrase + code (e.g., `APPROVE CONFIG A7KX3N`). The hook validates HMAC + expiry and grants one-time access.
|
|
258
|
+
|
|
259
|
+
**Protected patterns**: `/\.env(\.[a-z]+)?$/i`
|
|
260
|
+
|
|
261
|
+
**Bash analysis**: Tokenizes commands respecting quotes, scans all arguments (not just known file-position args), checks redirection targets, performs raw substring scan for blocked path suffixes, and blocks environment variable references (`$KEY`, `${KEY}`, `printenv KEY`) for keys listed in `protected-actions.json`.
|
|
262
|
+
|
|
263
|
+
### Secret Leak Detector
|
|
264
|
+
|
|
265
|
+
**File**: `.claude/hooks/secret-leak-detector.js`
|
|
266
|
+
|
|
267
|
+
Scans user messages for accidentally pasted credentials.
|
|
268
|
+
|
|
269
|
+
**Detected patterns**: 1Password service account tokens (`ops_`), GitHub PATs (`ghp_`, `github_pat_`), Render API keys (`rnd_`), Resend keys (`re_`), Supabase/JWT tokens (`eyJ...`), AWS access keys (`AKIA`), private keys (`-----BEGIN`), Stripe keys (`sk_live_`/`sk_test_`), OpenAI keys (`sk-...T3BlbkFJ`), Anthropic keys (`sk-ant-`), Slack tokens (`xox[bporas]-`), and context-dependent patterns for Vercel, Elastic, and Cloudflare tokens.
|
|
270
|
+
|
|
271
|
+
**Behavior**: Emits a warning message with provider-specific rotation instructions. Does not block the message (the credential is already in context at detection time; the goal is to prompt immediate rotation).
|
|
272
|
+
|
|
273
|
+
## Layer 7: Agent Capability Restrictions
|
|
274
|
+
|
|
275
|
+
**File**: `.claude/agents/*.md`
|
|
276
|
+
|
|
277
|
+
Each agent definition can specify tool restrictions that limit what the agent can do.
|
|
278
|
+
|
|
279
|
+
### Enforcement Model
|
|
280
|
+
|
|
281
|
+
Agent tool restrictions operate at two levels:
|
|
282
|
+
|
|
283
|
+
1. **Agent-level** (`.claude/agents/*.md`): Instructions and `allowedTools`/`disallowedTools` fields tell the agent what it should and should not do. Examples:
|
|
284
|
+
- `secret-manager`: Cannot use Edit, Write, Bash, or Task -- restricted to read-only operations and MCP tools
|
|
285
|
+
- `investigator`: Investigation-only agent that must not edit code or write files
|
|
286
|
+
- `code-reviewer`: Cannot use deputy-cto MCP tools (reserved for the deputy-cto agent)
|
|
287
|
+
- `feedback-agent`: Cannot use Read, Write, Edit, Bash, Glob, Grep, WebFetch, WebSearch, or Task
|
|
288
|
+
|
|
289
|
+
2. **Hook-level** (Layers 2-6): Even if an agent attempts to exceed its restrictions, the pre-tool-use hooks enforce hard boundaries. An agent that tries to read `.env` files hits the credential file guard regardless of its declared capabilities.
|
|
290
|
+
|
|
291
|
+
The combination means agent restrictions are **defense-in-depth**: the agent definition is the first line of defense, and the hook system is the backstop.
|
|
292
|
+
|
|
293
|
+
## How Layers Interact
|
|
294
|
+
|
|
295
|
+
### Example 1: Agent Attempts to Read a Production Secret
|
|
296
|
+
|
|
297
|
+
1. **Layer 7** (Agent Restrictions): If the agent is `secret-manager`, it cannot use `Read` or `Bash` tools at all
|
|
298
|
+
2. **Layer 6** (Credential File Guard): If a general agent tries `Read` on `.env.production`, the hook blocks it
|
|
299
|
+
3. **Layer 1** (Root Ownership): If an agent tries to circumvent hooks by modifying `credential-file-guard.js`, the file is root-owned and cannot be changed
|
|
300
|
+
4. **Layer 3** (Bash Blocking): If an agent tries `op read op://vault/item/field`, the `op` command is blocked
|
|
301
|
+
5. **Layer 5** (Secret Isolation): Even through the secret-sync MCP server, values are resolved in-process and never returned to the agent
|
|
302
|
+
|
|
303
|
+
All five layers must be defeated to extract a secret value. Compromising any single layer is insufficient.
|
|
304
|
+
|
|
305
|
+
### Example 2: Agent Attempts to Self-Approve a Commit
|
|
306
|
+
|
|
307
|
+
1. **Layer 4** (Commit Review): Agent commits code; pre-commit hook requires deputy-cto approval
|
|
308
|
+
2. **Layer 2** (Protected Action Gate): Agent tries to call `mcp__deputy-cto__approve_commit` directly -- this is a protected action requiring CTO approval code
|
|
309
|
+
3. **Layer 2** (HMAC Verification): Agent tries to write a fake approval token to `.claude/commit-approval-token.json` -- the token requires a valid HMAC that only the protected-action-gate can produce
|
|
310
|
+
4. **Layer 6** (Credential File Guard): Agent tries to read `.claude/protection-key` to compute the HMAC -- the credential file guard blocks access
|
|
311
|
+
5. **Layer 1** (Root Ownership): Agent tries to modify the credential file guard to remove the block -- the hook file is root-owned
|
|
312
|
+
|
|
313
|
+
The approval chain is cryptographically bound: code → HMAC → protection key → root ownership. Breaking any link blocks the attack.
|
|
314
|
+
|
|
315
|
+
## Managing Protection
|
|
316
|
+
|
|
317
|
+
### Enable Protection
|
|
318
|
+
```bash
|
|
319
|
+
sudo npx gentyr protect
|
|
320
|
+
```
|
|
321
|
+
Sets root ownership and sticky bits on critical files and directories.
|
|
322
|
+
|
|
323
|
+
### Disable Protection
|
|
324
|
+
```bash
|
|
325
|
+
sudo npx gentyr unprotect
|
|
326
|
+
```
|
|
327
|
+
Removes root ownership. Use before making manual changes to protected files.
|
|
328
|
+
|
|
329
|
+
### Re-enable After Changes
|
|
330
|
+
```bash
|
|
331
|
+
sudo npx gentyr protect
|
|
332
|
+
```
|
|
333
|
+
Re-applies root ownership without reinstalling the framework.
|
|
334
|
+
|
|
335
|
+
### Verify Protection
|
|
336
|
+
```bash
|
|
337
|
+
ls -la /path/to/project/.claude/hooks/protected-action-gate.js
|
|
338
|
+
# Should show root:wheel ownership
|
|
339
|
+
stat -f '%p' /path/to/project/.claude/
|
|
340
|
+
# Should show 41755 (sticky bit set)
|
|
341
|
+
```
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
# Compliance checker runs after commit (rate limited, fire-and-forget)
|
|
3
|
+
# This doesn't block the commit - it runs in the background
|
|
4
|
+
node .claude/hooks/compliance-checker.js --post-commit &
|
|
5
|
+
|
|
6
|
+
# Antipattern hunter runs after commit (6-hour cooldown, fire-and-forget)
|
|
7
|
+
# Spawns Claude session to hunt for spec violations
|
|
8
|
+
node .claude/hooks/antipattern-hunter-hook.js &
|
|
9
|
+
|
|
10
|
+
exit 0
|
package/husky/pre-commit
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
echo "Running pre-commit checks..."
|
|
3
|
+
echo ""
|
|
4
|
+
|
|
5
|
+
# =============================================================================
|
|
6
|
+
# LINT STAGED FILES
|
|
7
|
+
# =============================================================================
|
|
8
|
+
|
|
9
|
+
echo "Running lint-staged..."
|
|
10
|
+
npm run lint-staged
|
|
11
|
+
LINT_EXIT=$?
|
|
12
|
+
if [ $LINT_EXIT -ne 0 ]; then
|
|
13
|
+
echo ""
|
|
14
|
+
echo "Lint-staged FAILED. Fix issues before committing."
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
echo "Lint-staged passed"
|
|
18
|
+
echo ""
|
|
19
|
+
|
|
20
|
+
# =============================================================================
|
|
21
|
+
# DEPUTY-CTO COMMIT REVIEW (G020)
|
|
22
|
+
# =============================================================================
|
|
23
|
+
# Spawns deputy-cto agent to review staged changes.
|
|
24
|
+
# Commits are blocked if:
|
|
25
|
+
# - There are pending CTO questions (any type, not just rejections)
|
|
26
|
+
# - There are untriaged agent reports
|
|
27
|
+
# - Deputy-CTO rejects the current changes
|
|
28
|
+
# =============================================================================
|
|
29
|
+
|
|
30
|
+
echo "Running deputy-cto review..."
|
|
31
|
+
node .claude/hooks/pre-commit-review.js
|
|
32
|
+
REVIEW_EXIT=$?
|
|
33
|
+
|
|
34
|
+
if [ $REVIEW_EXIT -ne 0 ]; then
|
|
35
|
+
exit $REVIEW_EXIT
|
|
36
|
+
fi
|
|
37
|
+
|
|
38
|
+
echo ""
|
|
39
|
+
echo "Pre-commit checks passed"
|
|
40
|
+
exit 0
|
package/husky/pre-push
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
echo "Running pre-push checks..."
|
|
3
|
+
echo ""
|
|
4
|
+
|
|
5
|
+
# =============================================================================
|
|
6
|
+
# FULL TEST SUITE ENFORCEMENT (Every Push)
|
|
7
|
+
# =============================================================================
|
|
8
|
+
# Per CLAUDE.md: "NEVER make tests easier to pass. Tests must validate actual
|
|
9
|
+
# behavior under real conditions."
|
|
10
|
+
#
|
|
11
|
+
# This hook runs the FULL test suite (unit + integration) on every push to
|
|
12
|
+
# ensure no broken code reaches the remote repository.
|
|
13
|
+
# =============================================================================
|
|
14
|
+
|
|
15
|
+
echo "=============================================="
|
|
16
|
+
echo "FULL TEST SUITE"
|
|
17
|
+
echo "=============================================="
|
|
18
|
+
echo ""
|
|
19
|
+
|
|
20
|
+
echo "Running unit tests..."
|
|
21
|
+
pnpm run test:unit
|
|
22
|
+
UNIT_EXIT=$?
|
|
23
|
+
|
|
24
|
+
if [ $UNIT_EXIT -ne 0 ]; then
|
|
25
|
+
echo ""
|
|
26
|
+
echo "Unit tests FAILED. Push blocked."
|
|
27
|
+
echo " Fix failing tests before pushing."
|
|
28
|
+
exit 1
|
|
29
|
+
fi
|
|
30
|
+
echo "Unit tests passed"
|
|
31
|
+
echo ""
|
|
32
|
+
|
|
33
|
+
echo "Running integration tests..."
|
|
34
|
+
pnpm run test:integration
|
|
35
|
+
INT_EXIT=$?
|
|
36
|
+
|
|
37
|
+
if [ $INT_EXIT -ne 0 ]; then
|
|
38
|
+
echo ""
|
|
39
|
+
echo "Integration tests FAILED. Push blocked."
|
|
40
|
+
echo " Fix failing tests before pushing."
|
|
41
|
+
exit 1
|
|
42
|
+
fi
|
|
43
|
+
echo "Integration tests passed"
|
|
44
|
+
echo ""
|
|
45
|
+
|
|
46
|
+
echo "=============================================="
|
|
47
|
+
echo "Full test suite passed"
|
|
48
|
+
echo "=============================================="
|
|
49
|
+
echo ""
|
|
50
|
+
|
|
51
|
+
# =============================================================================
|
|
52
|
+
# REPO HYGIENE CHECK (Fire-and-Forget)
|
|
53
|
+
# =============================================================================
|
|
54
|
+
# Spawns repo-hygiene-expert agent to quickly review project structure.
|
|
55
|
+
# This is non-blocking - runs in background after tests pass.
|
|
56
|
+
# =============================================================================
|
|
57
|
+
|
|
58
|
+
echo "Spawning repo-hygiene-expert for quick structure review..."
|
|
59
|
+
|
|
60
|
+
# Spawn Claude with repo-hygiene-expert agent (fire-and-forget, detached)
|
|
61
|
+
nohup claude --dangerously-skip-permissions -p "[Task] Use the repo-hygiene-expert sub-agent for a QUICK pre-push structure review.
|
|
62
|
+
|
|
63
|
+
## CRITICAL WORKFLOW REQUIREMENTS
|
|
64
|
+
|
|
65
|
+
This is a PRE-PUSH review. Be CONSERVATIVE and NOT trigger-happy with changes.
|
|
66
|
+
|
|
67
|
+
### Review Scope (QUICK - focus on critical issues only)
|
|
68
|
+
1. Check for obvious architectural violations (cross-product imports violating boundaries)
|
|
69
|
+
2. Check for committed build artifacts (dist/, node_modules/)
|
|
70
|
+
3. Check for obvious secrets in source files
|
|
71
|
+
4. Check root directory cleanliness
|
|
72
|
+
|
|
73
|
+
### If Issues Found
|
|
74
|
+
DO NOT implement fixes yourself. Instead:
|
|
75
|
+
1. Document the issues clearly
|
|
76
|
+
2. Spawn code-reviewer agent to review your proposed fixes BEFORE implementation
|
|
77
|
+
3. Only after code-reviewer approves, spawn code-writer to implement
|
|
78
|
+
4. After implementation, spawn code-reviewer AGAIN for final sign-off
|
|
79
|
+
5. Finally, spawn project-manager to sync documentation
|
|
80
|
+
|
|
81
|
+
### If No Issues Found
|
|
82
|
+
Simply report that the repository structure looks healthy.
|
|
83
|
+
|
|
84
|
+
### Remember
|
|
85
|
+
- You do NOT have Edit/Write permissions
|
|
86
|
+
- Be MEASURED - only flag real violations per your Core Beliefs
|
|
87
|
+
- This is a quick check, not a comprehensive audit
|
|
88
|
+
- Do not create tasks for minor style issues" > /dev/null 2>&1 &
|
|
89
|
+
|
|
90
|
+
echo "Repo hygiene check spawned (running in background)"
|
|
91
|
+
echo ""
|
|
92
|
+
|
|
93
|
+
echo "Pre-push checks complete"
|
|
94
|
+
exit 0
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "gentyr",
|
|
3
|
+
"version": "1.3.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Autonomous AI engineering team for Claude Code. Agents, hooks, MCP servers, and guards that write, test, review, and ship code.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"claude",
|
|
8
|
+
"claude-code",
|
|
9
|
+
"anthropic",
|
|
10
|
+
"ai-agent",
|
|
11
|
+
"automation",
|
|
12
|
+
"mcp",
|
|
13
|
+
"saas"
|
|
14
|
+
],
|
|
15
|
+
"homepage": "https://github.com/gentyr/gentyr#readme",
|
|
16
|
+
"repository": {
|
|
17
|
+
"type": "git",
|
|
18
|
+
"url": "git+https://github.com/gentyr/gentyr.git"
|
|
19
|
+
},
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=20"
|
|
23
|
+
},
|
|
24
|
+
"bin": {
|
|
25
|
+
"gentyr": "cli/index.js"
|
|
26
|
+
},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build:mcp": "cd packages/mcp-servers && npm install --no-fund --no-audit && npm run build",
|
|
29
|
+
"prepare": "npm run build:mcp",
|
|
30
|
+
"test:feedback-agents": "vitest run --config tests/e2e/vitest.config.ts",
|
|
31
|
+
"generate:readme": "node scripts/generate-readme.js"
|
|
32
|
+
},
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"ajv": "^8.12.0",
|
|
35
|
+
"ajv-formats": "^2.1.1",
|
|
36
|
+
"better-sqlite3": "^12.6.2",
|
|
37
|
+
"zod": "^3.22.4"
|
|
38
|
+
},
|
|
39
|
+
"devDependencies": {
|
|
40
|
+
"typescript": "^5.9.3",
|
|
41
|
+
"vitest": "^4.0.18"
|
|
42
|
+
}
|
|
43
|
+
}
|