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,419 @@
|
|
|
1
|
+
# GENTYR Setup Guide
|
|
2
|
+
|
|
3
|
+
<!-- CREDENTIAL-PHASE-MAP
|
|
4
|
+
GITHUB_TOKEN: Phase 2: GitHub Token
|
|
5
|
+
GITHUB_PAT: Phase 2: GitHub Token
|
|
6
|
+
RENDER_API_KEY: Phase 3: Render API Key
|
|
7
|
+
VERCEL_TOKEN: Phase 4: Vercel Token
|
|
8
|
+
CLOUDFLARE_API_TOKEN: Phase 5: Cloudflare API Token
|
|
9
|
+
CLOUDFLARE_ZONE_ID: Phase 5: Cloudflare API Token
|
|
10
|
+
SUPABASE_SERVICE_ROLE_KEY: Phase 6: Supabase Credentials
|
|
11
|
+
SUPABASE_URL: Phase 6: Supabase Credentials
|
|
12
|
+
SUPABASE_ANON_KEY: Phase 6: Supabase Credentials
|
|
13
|
+
SUPABASE_ACCESS_TOKEN: Phase 6: Supabase Credentials
|
|
14
|
+
ELASTIC_API_KEY: Phase 7: Elastic Cloud Credentials
|
|
15
|
+
ELASTIC_CLOUD_ID: Phase 7: Elastic Cloud Credentials
|
|
16
|
+
RESEND_API_KEY: Phase 8: Resend API Key
|
|
17
|
+
CODECOV_TOKEN: Phase 9: Codecov Token
|
|
18
|
+
OP_CONNECT_TOKEN: Phase 1: 1Password Service Account
|
|
19
|
+
-->
|
|
20
|
+
|
|
21
|
+
This guide walks through setting up credentials for each service in the GENTYR stack.
|
|
22
|
+
|
|
23
|
+
## Prerequisites
|
|
24
|
+
|
|
25
|
+
- Node.js 20+
|
|
26
|
+
- pnpm 8+
|
|
27
|
+
- 1Password CLI (`op`) installed: `brew install --cask 1password-cli`
|
|
28
|
+
- Claude Code installed
|
|
29
|
+
|
|
30
|
+
## Browser Automation Notes
|
|
31
|
+
|
|
32
|
+
These instructions are frequently consumed by AI agents using browser automation (e.g., Claude Cowork). The tips below each phase help agents avoid common pitfalls.
|
|
33
|
+
|
|
34
|
+
**General patterns for all phases:**
|
|
35
|
+
- Prefer `form_input` over `click` + `type` for filling form fields — it's more reliable and handles special characters (e.g., `/`, `@`) that `type` may misinterpret as keyboard shortcuts.
|
|
36
|
+
- Use `read_page(filter="interactive")` to discover form elements and buttons before interacting with them.
|
|
37
|
+
- Use `zoom` tool to verify small UI elements (checkboxes, toggles, dropdown states) before and after interaction.
|
|
38
|
+
- Use `get_page_text` to extract values from the page (API keys, tokens, IDs) rather than trying to select/copy text via UI interactions.
|
|
39
|
+
- **Chrome Extension interference**: Browser extensions (especially 1Password) can inject errors like `Cannot access a chrome-extension:// URL` across unrelated sites. Recovery: call `navigate()` to the current URL to refresh the page, then retry. If errors persist on a specific page, try navigating away and back.
|
|
40
|
+
- When a page action triggers a new tab or popup, use `get_browser_state()` to check for the new tab, then `switch_tab()` to it.
|
|
41
|
+
|
|
42
|
+
## Phase 1: 1Password Service Account
|
|
43
|
+
|
|
44
|
+
1. Open 1Password Desktop app
|
|
45
|
+
2. Go to **Settings > Integrations > Service Accounts**
|
|
46
|
+
3. Click **Create Service Account**
|
|
47
|
+
4. Name it "Claude Code MCP"
|
|
48
|
+
5. Grant access to: Production, Staging, Preview vaults
|
|
49
|
+
6. Copy the service account token
|
|
50
|
+
7. The setup command will inject this into your MCP config
|
|
51
|
+
|
|
52
|
+
**Shell profile sync**: When you run `npx gentyr init --op-token <TOKEN>`, the installer writes a managed block to `~/.zshrc` (or `~/.bashrc`) so that subprocesses spawned from your shell inherit the token automatically:
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
# BEGIN GENTYR OP
|
|
56
|
+
# 1Password Service Account Token (managed by GENTYR — do not edit manually)
|
|
57
|
+
export OP_SERVICE_ACCOUNT_TOKEN="<token>"
|
|
58
|
+
# END GENTYR OP
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
This block is updated on reinstall and removed on uninstall. `.mcp.json` is always the source of truth. If they ever drift, `credential-health-check.js` warns at session start and `setup-validate.js` reports a `shellSync` failure.
|
|
62
|
+
|
|
63
|
+
## Phase 2: GitHub Token
|
|
64
|
+
|
|
65
|
+
1. Go to https://github.com/settings/tokens
|
|
66
|
+
2. Click **Generate new token (fine-grained)**
|
|
67
|
+
3. Name: "GENTYR - {project-name}"
|
|
68
|
+
4. Repository access: Select your repository
|
|
69
|
+
5. Permissions (all required for GENTYR MCP tools):
|
|
70
|
+
- **Actions**: Read and Write (workflow runs, re-runs, cancellation)
|
|
71
|
+
- **Contents**: Read and Write (file read/write via GitHub API)
|
|
72
|
+
- **Issues**: Read and Write (issue creation, comments)
|
|
73
|
+
- **Pull requests**: Read and Write (PR creation, merge, file listing)
|
|
74
|
+
- **Secrets**: Read and Write (repository and environment secrets)
|
|
75
|
+
- **Environments**: Read and Write (deployment environment management)
|
|
76
|
+
6. Copy the token
|
|
77
|
+
|
|
78
|
+
**Validation:** setup-validate probes each permission endpoint. Missing permissions appear as warnings with direct links to fix.
|
|
79
|
+
|
|
80
|
+
**1Password Storage:**
|
|
81
|
+
- Vault: **Production**
|
|
82
|
+
- Item title: **GitHub**
|
|
83
|
+
- Item type: Login
|
|
84
|
+
- Fields:
|
|
85
|
+
- `token` = [paste the token]
|
|
86
|
+
- Predefined path: `op://Production/GitHub/token`
|
|
87
|
+
|
|
88
|
+
> **Browser automation tip — GitHub:** Use `form_input` (not `type`) for the token name field, especially if the name contains `/` or other special characters that browsers interpret as shortcuts.
|
|
89
|
+
|
|
90
|
+
> **Browser automation tip — 1Password (applies to all phases):** When adding fields to a 1Password item, the `+ add another field` button and its dropdown chevron (`▼`) are **separate clickable controls**. Click the chevron first to select the field type (e.g., "password"), then click the `+` button to create the field. After creating the field, use `form_input` to set both the label and value. Verify the save completed by checking for a URL change or confirmation indicator — 1Password auto-saves on navigation but not always on field edit. Built-in template fields (e.g., "username", "password" on Login items) have pre-set names that may not match the required field name — always add a **new custom field** with the exact name specified (e.g., `token`, `api-key`).
|
|
91
|
+
|
|
92
|
+
## Phase 3: Render API Key
|
|
93
|
+
|
|
94
|
+
1. Go to https://dashboard.render.com/account/api-keys
|
|
95
|
+
2. Click **Create API Key**
|
|
96
|
+
3. Name: "GENTYR - {project-name}"
|
|
97
|
+
4. Copy the API key
|
|
98
|
+
|
|
99
|
+
**1Password Storage:**
|
|
100
|
+
- Vault: **Production**
|
|
101
|
+
- Item title: **Render**
|
|
102
|
+
- Item type: Login
|
|
103
|
+
- Fields:
|
|
104
|
+
- `api-key` = [paste the API key]
|
|
105
|
+
- Predefined path: `op://Production/Render/api-key`
|
|
106
|
+
|
|
107
|
+
> **Browser automation tip — Render:** The API key is displayed once after creation. Use `get_page_text` immediately to capture it before navigating away.
|
|
108
|
+
|
|
109
|
+
## Phase 4: Vercel Token
|
|
110
|
+
|
|
111
|
+
1. Go to https://vercel.com/account/tokens
|
|
112
|
+
2. Click **Create Token**
|
|
113
|
+
3. Name: "GENTYR - {project-name}"
|
|
114
|
+
4. Scope: **Full Account** (required for deployments, projects, env vars, domains)
|
|
115
|
+
5. Copy the token
|
|
116
|
+
|
|
117
|
+
**1Password Storage:**
|
|
118
|
+
- Vault: **Production**
|
|
119
|
+
- Item title: **Vercel**
|
|
120
|
+
- Item type: Login
|
|
121
|
+
- Fields:
|
|
122
|
+
- `token` = [paste the token]
|
|
123
|
+
- Predefined path: `op://Production/Vercel/token`
|
|
124
|
+
|
|
125
|
+
To find your Team ID:
|
|
126
|
+
1. Go to https://vercel.com/teams
|
|
127
|
+
2. Click your team
|
|
128
|
+
3. Go to **Settings > General**
|
|
129
|
+
4. Copy the Team ID
|
|
130
|
+
|
|
131
|
+
> **Browser automation tip — Vercel:** The token is displayed once after creation. Use `get_page_text` to capture it. The Team ID on the Settings page can also be extracted via `get_page_text` — look for the string labeled "Team ID".
|
|
132
|
+
|
|
133
|
+
## Phase 5: Cloudflare API Token
|
|
134
|
+
|
|
135
|
+
1. Go to https://dash.cloudflare.com/profile/api-tokens
|
|
136
|
+
2. Click **Create Token**
|
|
137
|
+
3. Use template: **Edit zone DNS** (required for DNS record management)
|
|
138
|
+
4. Zone Resources: Include > Specific zone > your domain
|
|
139
|
+
5. Copy the token
|
|
140
|
+
|
|
141
|
+
**1Password Storage:**
|
|
142
|
+
- Vault: **Production**
|
|
143
|
+
- Item title: **Cloudflare**
|
|
144
|
+
- Item type: Login
|
|
145
|
+
- Fields:
|
|
146
|
+
- `api-token` = [paste the API token]
|
|
147
|
+
- Predefined path: `op://Production/Cloudflare/api-token`
|
|
148
|
+
|
|
149
|
+
To find your Zone ID:
|
|
150
|
+
1. Go to your domain's overview page in Cloudflare
|
|
151
|
+
2. The Zone ID is in the right sidebar under **API**
|
|
152
|
+
|
|
153
|
+
**Non-secret (share in chat during /setup-gentyr):**
|
|
154
|
+
- Cloudflare Zone ID (32-character hex string)
|
|
155
|
+
- Find at: Cloudflare Dashboard > your domain > right sidebar under "API"
|
|
156
|
+
|
|
157
|
+
> **Browser automation tip — Cloudflare:** The Zone ID is visible on the domain overview page without clicking into any sub-menus. Use `get_page_text` to extract it — look for a 32-character hex string near "Zone ID" in the right sidebar. The token creation flow uses a multi-step wizard with dropdowns for zone selection; use `read_page(filter="interactive")` to find the correct selectors at each step.
|
|
158
|
+
|
|
159
|
+
## Phase 6: Supabase Credentials
|
|
160
|
+
|
|
161
|
+
### Service Role Key (secret)
|
|
162
|
+
1. Go to your Supabase project dashboard
|
|
163
|
+
2. Navigate to **Project Settings > API**
|
|
164
|
+
3. Copy the **service_role** key (secret — never expose in frontend)
|
|
165
|
+
|
|
166
|
+
**1Password Storage:**
|
|
167
|
+
- Vault: **Production**
|
|
168
|
+
- Item title: **Supabase**
|
|
169
|
+
- Item type: Login
|
|
170
|
+
- Fields:
|
|
171
|
+
- `service-role-key` = [paste service role key]
|
|
172
|
+
- Predefined path: `op://Production/Supabase/service-role-key`
|
|
173
|
+
|
|
174
|
+
### Non-secret identifiers (share in chat during /setup-gentyr)
|
|
175
|
+
- **Supabase URL** (e.g., `https://abcdefghijklmnop.supabase.co`)
|
|
176
|
+
- Find at: Supabase Dashboard > Project Settings > API > URL
|
|
177
|
+
- **Supabase Anon Key** (public API key, embedded in frontend code)
|
|
178
|
+
- Find at: Supabase Dashboard > Project Settings > API > anon (public)
|
|
179
|
+
|
|
180
|
+
### Management Access Token
|
|
181
|
+
1. Go to https://supabase.com/dashboard/account/tokens
|
|
182
|
+
2. Click **Generate new token**
|
|
183
|
+
3. Name: "GENTYR - {project-name}"
|
|
184
|
+
4. Copy the token
|
|
185
|
+
|
|
186
|
+
**1Password Storage:**
|
|
187
|
+
- Vault: **Production**
|
|
188
|
+
- Item: **Supabase** (same item as service-role-key)
|
|
189
|
+
- Fields:
|
|
190
|
+
- `access-token` = [paste management token]
|
|
191
|
+
- Predefined path: `op://Production/Supabase/access-token`
|
|
192
|
+
|
|
193
|
+
**What this enables:** `supabase_sql`, `supabase_push_migration`, `supabase_list_migrations`, `supabase_get_project` MCP tools. Without it, `supabase_list_tables` and `supabase_describe_table` use a PostgREST fallback with slightly less detail.
|
|
194
|
+
|
|
195
|
+
> **Browser automation tip — Supabase:** The API page shows the `anon` key, `service_role` key, and URL all on one page. Use `get_page_text` to extract all three at once. The `service_role` key is hidden behind a "Reveal" button — click it first, then extract. For the management access token at `supabase.com/dashboard/account/tokens`, the token is displayed once after generation — capture immediately with `get_page_text`.
|
|
196
|
+
|
|
197
|
+
## Phase 7: Elastic Cloud Credentials
|
|
198
|
+
|
|
199
|
+
### API Keys
|
|
200
|
+
|
|
201
|
+
#### For Hosted Deployments
|
|
202
|
+
1. Go to https://cloud.elastic.co
|
|
203
|
+
2. Open your deployment
|
|
204
|
+
3. Click **Manage** > **Security** > **Create API Key**
|
|
205
|
+
4. Create two keys:
|
|
206
|
+
- "Ingest" key (for backend logging): Index privileges on `logs-*`
|
|
207
|
+
- "Query" key (for Claude Code): Read privileges on `logs-*`
|
|
208
|
+
|
|
209
|
+
#### For Serverless Projects
|
|
210
|
+
1. Go to https://cloud.elastic.co/serverless
|
|
211
|
+
2. Open your project
|
|
212
|
+
3. Go to **Project Settings** > **Management** > **API Keys**
|
|
213
|
+
4. Create two keys:
|
|
214
|
+
- "Ingest" key (for backend logging): Index privileges on `logs-*`
|
|
215
|
+
- "Query" key (for Claude Code): Read privileges on `logs-*`
|
|
216
|
+
|
|
217
|
+
**1Password Storage:**
|
|
218
|
+
- Vault: **Production**
|
|
219
|
+
- Item title: **Elastic**
|
|
220
|
+
- Item type: Login
|
|
221
|
+
- Fields:
|
|
222
|
+
- `api-key` = [paste ingest API key]
|
|
223
|
+
- `api-key-query` = [paste query API key]
|
|
224
|
+
- Predefined paths:
|
|
225
|
+
- `op://Production/Elastic/api-key` (ingest — for backend logging, not used by GENTYR)
|
|
226
|
+
- `op://Production/Elastic/api-key-query` (query — **used by GENTYR MCP `elastic-logs` server**)
|
|
227
|
+
|
|
228
|
+
### Connection Identifier
|
|
229
|
+
|
|
230
|
+
Provide **one** of the following (not both):
|
|
231
|
+
|
|
232
|
+
**Non-secret (share in chat during /setup-gentyr):**
|
|
233
|
+
|
|
234
|
+
**Option A — Hosted Deployment (Cloud ID):**
|
|
235
|
+
- Elastic Cloud ID (e.g., `my-deployment:dXMtY2VudH...`)
|
|
236
|
+
- Find at: Elastic Cloud > Deployments > your deployment > Cloud ID
|
|
237
|
+
- Stored as: `ELASTIC_CLOUD_ID` in vault-mappings.json
|
|
238
|
+
|
|
239
|
+
**Option B — Serverless Project (Endpoint URL):**
|
|
240
|
+
- Elasticsearch endpoint URL (e.g., `https://my-project-abc123.es.us-central1.gcp.elastic.cloud`)
|
|
241
|
+
- Find at: Elastic Cloud > Serverless > your project > Endpoints
|
|
242
|
+
- Stored as: `ELASTIC_ENDPOINT` in vault-mappings.json
|
|
243
|
+
|
|
244
|
+
> **Browser automation tip — Elastic Cloud:** The "Create API Key" UI has toggles and role selectors that are unreliable with browser automation. **Strongly prefer using the Dev Tools Console** (REST API) instead:
|
|
245
|
+
>
|
|
246
|
+
> 1. Navigate to your project's Dev Tools Console: `https://cloud.elastic.co/.../app/dev_tools#/console/shell`
|
|
247
|
+
> 2. Run the following REST command to create each key:
|
|
248
|
+
> ```
|
|
249
|
+
> POST /_security/api_key
|
|
250
|
+
> {
|
|
251
|
+
> "name": "log-query-readonly",
|
|
252
|
+
> "role_descriptors": {
|
|
253
|
+
> "logs_reader": {
|
|
254
|
+
> "indices": [{ "names": ["logs-*"], "privileges": ["read"] }]
|
|
255
|
+
> }
|
|
256
|
+
> }
|
|
257
|
+
> }
|
|
258
|
+
> ```
|
|
259
|
+
> 3. Use `get_page_text` to extract the JSON response from the console output panel.
|
|
260
|
+
> 4. The response contains `id`, `api_key`, and `encoded` fields. **Store the `encoded` value** — this is the base64-encoded `id:api_key` string ready for use. A valid encoded key is ~60 characters. If it's ~36 characters or less, the key was likely truncated during copy.
|
|
261
|
+
> 5. For the ingest key, change `"privileges": ["read"]` to `"privileges": ["index", "create_index"]`.
|
|
262
|
+
>
|
|
263
|
+
> The Endpoint URL for Serverless projects can be found at the project's Endpoints page — use `get_page_text` to extract it.
|
|
264
|
+
|
|
265
|
+
## Phase 8: Resend API Key
|
|
266
|
+
|
|
267
|
+
1. Go to https://resend.com/api-keys
|
|
268
|
+
2. Click **Create API Key**
|
|
269
|
+
3. Name: "GENTYR - {project-name}"
|
|
270
|
+
4. Permission: **Full access** (recommended)
|
|
271
|
+
- "Full access" enables domain management, API key listing, and all MCP tools
|
|
272
|
+
- "Sending access" is sufficient if you only need email sending (setup-validate will warn about limited tools)
|
|
273
|
+
5. Domain: your domain (or leave blank for all domains)
|
|
274
|
+
6. Copy the API key
|
|
275
|
+
|
|
276
|
+
**1Password Storage:**
|
|
277
|
+
- Vault: **Production**
|
|
278
|
+
- Item title: **Resend**
|
|
279
|
+
- Item type: Login
|
|
280
|
+
- Fields:
|
|
281
|
+
- `api-key` = [paste the API key]
|
|
282
|
+
- Predefined path: `op://Production/Resend/api-key`
|
|
283
|
+
|
|
284
|
+
> **Browser automation tip — Resend:** The API key is displayed once after creation. Use `get_page_text` to capture it immediately. The permission dropdown ("Full access" vs "Sending access") should be selected before clicking "Create".
|
|
285
|
+
|
|
286
|
+
## Phase 9: Codecov Token
|
|
287
|
+
|
|
288
|
+
1. Go to https://app.codecov.io
|
|
289
|
+
2. Navigate to your repository settings
|
|
290
|
+
3. Copy the **Upload Token**
|
|
291
|
+
|
|
292
|
+
**1Password Storage:**
|
|
293
|
+
- Vault: **Production**
|
|
294
|
+
- Item title: **Codecov**
|
|
295
|
+
- Item type: Login
|
|
296
|
+
- Fields:
|
|
297
|
+
- `token` = [paste the upload token]
|
|
298
|
+
- Predefined path: `op://Production/Codecov/token`
|
|
299
|
+
|
|
300
|
+
> **Browser automation tip — Codecov:** Codecov uses GitHub OAuth for login, which can be disrupted by Chrome extensions. If the OAuth redirect fails or loops, ask the user to log in manually in the browser first, then navigate directly to the repository settings page. The Upload Token is visible on the settings page without any reveal/toggle interaction — use `get_page_text` to extract it.
|
|
301
|
+
|
|
302
|
+
## How Credentials Work
|
|
303
|
+
|
|
304
|
+
After creating each credential in your service provider, store it in 1Password:
|
|
305
|
+
|
|
306
|
+
1. Open 1Password Desktop app
|
|
307
|
+
2. Navigate to the **Production** vault
|
|
308
|
+
3. Create a new item with the exact title and field names specified in each phase above
|
|
309
|
+
4. Run `/setup-gentyr` — it verifies these exist and writes `op://` references to `.claude/vault-mappings.json`
|
|
310
|
+
5. The MCP launcher resolves these at server startup — credentials exist only in process memory
|
|
311
|
+
|
|
312
|
+
**Non-secret identifiers** (URLs, zone IDs, cloud IDs) don't need 1Password. Share them in chat during `/setup-gentyr` and they'll be written directly to `vault-mappings.json`.
|
|
313
|
+
|
|
314
|
+
## Phase 10: Branch Protection & Deployment Pipeline
|
|
315
|
+
|
|
316
|
+
GENTYR enforces a strict merge chain: `feature/* -> preview -> staging -> main (production)`.
|
|
317
|
+
|
|
318
|
+
### Why the Merge Chain Matters
|
|
319
|
+
|
|
320
|
+
- **Feature branches** can only merge into `preview` (no approval needed)
|
|
321
|
+
- **Preview** can only merge into `staging` (deputy-CTO approval)
|
|
322
|
+
- **Staging** can only merge into `main` (CTO approval)
|
|
323
|
+
- Direct merges from feature branches to staging/main are **forbidden**
|
|
324
|
+
|
|
325
|
+
### CI Enforcement
|
|
326
|
+
|
|
327
|
+
GitHub has no native rule to restrict which source branch a PR comes from. GENTYR includes a `merge-chain-check.yml` CI workflow that enforces this. It must be added as a **required status check** on all protected branches.
|
|
328
|
+
|
|
329
|
+
The workflow template is at: `node_modules/gentyr/templates/config/merge-chain-check.yml.template`
|
|
330
|
+
|
|
331
|
+
Copy it to `.github/workflows/merge-chain-check.yml` in your project.
|
|
332
|
+
|
|
333
|
+
### Branch Protection (GitHub Teams)
|
|
334
|
+
|
|
335
|
+
Go to: Repository > Settings > Branches > Add branch protection rule
|
|
336
|
+
|
|
337
|
+
**For each branch (`preview`, `staging`, `main`):**
|
|
338
|
+
1. Require a pull request before merging
|
|
339
|
+
2. Require status checks to pass (include `Validate Merge Chain`)
|
|
340
|
+
3. Block force pushes
|
|
341
|
+
4. Do not allow bypassing settings
|
|
342
|
+
|
|
343
|
+
**Additional for `staging`:** Require 1 approving review (deputy-CTO)
|
|
344
|
+
**Additional for `main`:** Require 1 approving review (CTO) + Security Scan check
|
|
345
|
+
|
|
346
|
+
See `node_modules/gentyr/docs/DEPLOYMENT-FLOW.md` for complete branch protection instructions.
|
|
347
|
+
|
|
348
|
+
### GitHub Enterprise Cloud
|
|
349
|
+
|
|
350
|
+
If on Enterprise Cloud, also configure:
|
|
351
|
+
- Organization Rulesets for cross-repo enforcement
|
|
352
|
+
- Deployment Protection Rules for staging/production environments
|
|
353
|
+
- Merge Queue for the `main` branch
|
|
354
|
+
|
|
355
|
+
### `gh` CLI Authentication
|
|
356
|
+
|
|
357
|
+
The automated promotion pipelines use `gh` CLI for PR operations. Ensure it's authenticated:
|
|
358
|
+
|
|
359
|
+
```bash
|
|
360
|
+
gh auth login
|
|
361
|
+
gh auth status
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
### Automated Promotion
|
|
365
|
+
|
|
366
|
+
Once branch protection is configured, GENTYR's hourly automation handles promotion:
|
|
367
|
+
|
|
368
|
+
- **Preview -> Staging**: Every 6 hours, reviews new commits and promotes if stable (24h or bug-fix)
|
|
369
|
+
- **Staging -> Main**: Nightly at midnight, promotes if staging is 24h+ stable (requires CTO approval)
|
|
370
|
+
|
|
371
|
+
### Health Monitoring
|
|
372
|
+
|
|
373
|
+
GENTYR monitors deployed environments:
|
|
374
|
+
|
|
375
|
+
- **Staging**: Every 3 hours -- checks Render, Vercel, Elasticsearch, Codecov
|
|
376
|
+
- **Production**: Every 1 hour -- same checks + CTO escalation for issues
|
|
377
|
+
|
|
378
|
+
Enable/disable via `.claude/autonomous-mode.json`:
|
|
379
|
+
```json
|
|
380
|
+
{
|
|
381
|
+
"previewPromotionEnabled": true,
|
|
382
|
+
"stagingPromotionEnabled": true,
|
|
383
|
+
"stagingHealthMonitorEnabled": true,
|
|
384
|
+
"productionHealthMonitorEnabled": true
|
|
385
|
+
}
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
## Permission Validation
|
|
389
|
+
|
|
390
|
+
After completing setup, run permission validation to verify all credentials work and have correct permissions:
|
|
391
|
+
|
|
392
|
+
```bash
|
|
393
|
+
node node_modules/gentyr/scripts/setup-validate.js
|
|
394
|
+
```
|
|
395
|
+
|
|
396
|
+
This makes **read-only** API calls to each service and reports:
|
|
397
|
+
|
|
398
|
+
| Status | Meaning |
|
|
399
|
+
|--------|---------|
|
|
400
|
+
| **pass** | Credential works with correct permissions |
|
|
401
|
+
| **warn** | Credential works but with limited permissions (some MCP tools may not function) |
|
|
402
|
+
| **fail** | Credential is invalid, expired, or lacks required permissions |
|
|
403
|
+
| **skip** | Credential not configured |
|
|
404
|
+
|
|
405
|
+
Each failure includes specific **remediation instructions** with URLs to fix the issue.
|
|
406
|
+
|
|
407
|
+
### Required API Permissions by Service
|
|
408
|
+
|
|
409
|
+
| Service | Required Permissions | Key Type |
|
|
410
|
+
|---------|---------------------|----------|
|
|
411
|
+
| **Vercel** | Full Account scope | Personal token |
|
|
412
|
+
| **Render** | Full API access | API key (not scoped) |
|
|
413
|
+
| **GitHub** | Actions R/W, Contents R/W, Issues R/W, PRs R/W, Secrets R/W, Environments R/W | Fine-grained PAT |
|
|
414
|
+
| **Cloudflare** | Zone DNS Edit (for specific zone) | API token (Edit zone DNS template) |
|
|
415
|
+
| **Supabase** | Service role key (admin), anon key (public) | Project API keys |
|
|
416
|
+
| **Resend** | Full access (recommended) or Sending access (limited) | API key |
|
|
417
|
+
| **Elastic** | Read-only on `logs-*` indices | API key |
|
|
418
|
+
| **Codecov** | Any valid token (read-only API) | Upload token |
|
|
419
|
+
| **1Password** | Service account with vault access | Service account token |
|
package/docs/STACK.md
ADDED
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# the stack
|
|
2
|
+
|
|
3
|
+
GENTYR chose managed services so every agent, hook, and server is purpose-built for exactly these tools. No abstraction layers. No configuration matrices. No "bring your own database."
|
|
4
|
+
|
|
5
|
+
Every technology below exists for one reason: it removes a decision that agents would otherwise need a human to make. Supabase provides auth, storage, and a database behind a single API. Vercel deploys frontend on push. Render deploys backend on push. 1Password resolves secrets without exposing values. The stack is not configurable because configurability is the enemy of autonomous operation.
|
|
6
|
+
|
|
7
|
+
Thirty MCP servers connect agents to these services. Each server speaks one protocol to one provider. When an agent needs to deploy, it talks to the Render server. When it needs a secret, it talks to the 1Password server. When it needs to query logs, it talks to the Elastic server. No adapters. No middleware. No indirection.
|
|
8
|
+
|
|
9
|
+
This is the stack. Learn it or choose a different framework.
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Application Layer
|
|
14
|
+
|
|
15
|
+
**TypeScript (strict, ESM)** is the only language. Strict mode catches type errors before agents write tests. ESM modules mean consistent import semantics across frontend, backend, and tooling. Every package in the monorepo shares the same language, the same compiler, the same rules.
|
|
16
|
+
|
|
17
|
+
**Next.js on Vercel** handles the frontend. Vercel's zero-config deployment means agents push code and it goes live. No Dockerfile, no build pipeline to maintain, no CDN to configure. The MCP server (`vercel`) manages deployments, environment variables, and project settings through Vercel's API.
|
|
18
|
+
|
|
19
|
+
**Hono on Render** runs the backend API. Hono is lightweight, TypeScript-native, and fast. Render provides persistent web services with health checks, auto-deploy from git, and managed TLS. The MCP server (`render`) handles service management, deploy triggers, and environment configuration.
|
|
20
|
+
|
|
21
|
+
**Supabase** provides PostgreSQL, authentication, file storage, and row-level security through a single dashboard and API. Agents interact through the MCP server (`supabase`) for schema management and through the Supabase client SDK for runtime queries. RLS policies are enforced at the database level, which means security doesn't depend on application code.
|
|
22
|
+
|
|
23
|
+
**Zod** handles runtime validation. Every API endpoint, every webhook handler, every configuration file gets a Zod schema. The compliance checker verifies this. Silent JSON parsing without validation is a spec violation.
|
|
24
|
+
|
|
25
|
+
## Infrastructure Layer
|
|
26
|
+
|
|
27
|
+
**pnpm monorepo** organizes the project. A single `pnpm-workspace.yaml` defines the package graph. Shared types live in `packages/shared`. The logger lives in `packages/logger`. Build and test commands run from the root.
|
|
28
|
+
|
|
29
|
+
**GitHub + Actions** handles source control and CI/CD. The merge chain (`feature -> preview -> staging -> main`) is enforced locally by hooks and remotely by branch protection rules. Actions run tests, lint, and type-checking on every push.
|
|
30
|
+
|
|
31
|
+
**1Password** is the single source of truth for secrets. Every credential is an `op://` reference. The MCP server (`onepassword`) resolves references at runtime. The secret-sync server pushes secrets to deployment platforms. Nothing is stored on disk. Nothing passes through agent context.
|
|
32
|
+
|
|
33
|
+
**Cloudflare** manages DNS. The MCP server (`cloudflare`) handles record creation and verification. Free tier is sufficient for most projects.
|
|
34
|
+
|
|
35
|
+
**Elastic Cloud** provides centralized logging. Application logs ship in ECS format from the structured logger (`packages/logger`). The MCP server (`elastic-logs`) queries Elasticsearch for error patterns, warning trends, and service health. The CTO dashboard aggregates log metrics from this source.
|
|
36
|
+
|
|
37
|
+
**Resend** handles transactional email. The MCP server (`resend`) sends emails and checks delivery status. Simple API, reliable delivery, no SMTP configuration.
|
|
38
|
+
|
|
39
|
+
**Codecov** reports test coverage. The MCP server (`codecov`) fetches coverage data for the CTO dashboard. Coverage trends are tracked over time and displayed in the testing section.
|
|
40
|
+
|
|
41
|
+
## Testing Layer
|
|
42
|
+
|
|
43
|
+
**Vitest** runs unit and integration tests. Fast, TypeScript-native, compatible with the monorepo structure. Test failures trigger automatic agent spawns via the test-failure-reporter hook.
|
|
44
|
+
|
|
45
|
+
**Playwright** runs end-to-end and browser tests. The MCP server (`playwright`) and feedback MCP servers (`playwright-feedback`, `programmatic-feedback`) enable AI personas to test the product as real users. No headless browser configuration needed.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## MCP Server Mappings
|
|
50
|
+
|
|
51
|
+
Each infrastructure service maps to one or more MCP servers that give agents programmatic access:
|
|
52
|
+
|
|
53
|
+
| Service | MCP Server(s) | Capabilities |
|
|
54
|
+
|---------|--------------|--------------|
|
|
55
|
+
| 1Password | `onepassword`, `secret-sync` | Resolve `op://` refs, sync to platforms, run with injected secrets |
|
|
56
|
+
| Render | `render` | Service management, deploys, environment variables, logs |
|
|
57
|
+
| Vercel | `vercel` | Project management, deploys, environment variables |
|
|
58
|
+
| Supabase | `supabase` | Schema management, migrations, RLS policies |
|
|
59
|
+
| GitHub | `github` | PRs, issues, Actions, branch management |
|
|
60
|
+
| Cloudflare | `cloudflare` | DNS records, zone management |
|
|
61
|
+
| Elastic Cloud | `elastic-logs` | Log queries, error analysis, volume metrics |
|
|
62
|
+
| Resend | `resend` | Email sending, delivery status |
|
|
63
|
+
| Codecov | `codecov` | Coverage data, trends |
|
|
64
|
+
| Chrome | `chrome-bridge` | Browser automation, page interaction, debugging |
|
|
65
|
+
|
|
66
|
+
Internal MCP servers (not tied to external providers):
|
|
67
|
+
|
|
68
|
+
| Server | Purpose |
|
|
69
|
+
|--------|---------|
|
|
70
|
+
| `todo-db` | Task database (SQLite) |
|
|
71
|
+
| `deputy-cto` | Triage pipeline, commit review, CTO questions |
|
|
72
|
+
| `agent-tracker` | Agent lifecycle, spawn/reap tracking |
|
|
73
|
+
| `agent-reports` | Report submission and query |
|
|
74
|
+
| `cto-reports`, `cto-report` | Dashboard data aggregation |
|
|
75
|
+
| `review-queue` | Commit review queue |
|
|
76
|
+
| `session-events` | Session lifecycle events |
|
|
77
|
+
| `feedback-reporter`, `feedback-explorer`, `user-feedback` | Feedback pipeline |
|
|
78
|
+
| `playwright-feedback`, `programmatic-feedback` | AI persona testing |
|
|
79
|
+
| `specs-browser` | Specification document access |
|
|
80
|
+
| `setup-helper` | Installation and configuration |
|
|
81
|
+
| `makerkit-docs` | MakerKit documentation reference |
|
|
82
|
+
| `shared` | Shared utilities across servers |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## Monorepo Structure
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
project-root/
|
|
90
|
+
├── node_modules/gentyr/ # GENTYR (npm package)
|
|
91
|
+
├── .claude/config/services.json # Project-specific service IDs
|
|
92
|
+
├── products/
|
|
93
|
+
│ └── {product-name}/
|
|
94
|
+
│ └── apps/
|
|
95
|
+
│ ├── backend/ # Hono on Render
|
|
96
|
+
│ ├── web/ # Next.js on Vercel (MakerKit)
|
|
97
|
+
│ └── extension/ # Browser extension (optional)
|
|
98
|
+
├── packages/
|
|
99
|
+
│ ├── shared/ # Shared types and utilities
|
|
100
|
+
│ └── logger/ # Structured logger (ECS format)
|
|
101
|
+
├── integrations/ # Platform connectors
|
|
102
|
+
├── specs/
|
|
103
|
+
│ ├── global/ # System-wide invariants
|
|
104
|
+
│ ├── local/ # Component specifications
|
|
105
|
+
│ └── reference/ # Development guides
|
|
106
|
+
├── render.yaml # Render blueprint
|
|
107
|
+
├── pnpm-workspace.yaml # Monorepo config
|
|
108
|
+
└── .github/workflows/ci.yml # CI pipeline
|
|
109
|
+
```
|