Showing preview only (6,912K chars total). Download the full file or copy to clipboard to get everything.
Repository: affaan-m/everything-claude-code
Branch: main
Commit: 1b21e082fa9f
Files: 1181
Total size: 6.4 MB
Directory structure:
gitextract_4n75nwkk/
├── .agents/
│ └── skills/
│ ├── api-design/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── article-writing/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── backend-patterns/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── bun-runtime/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── claude-api/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── coding-standards/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── content-engine/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── crosspost/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── deep-research/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── dmux-workflows/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── documentation-lookup/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── e2e-testing/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── eval-harness/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── exa-search/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── fal-ai-media/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── frontend-patterns/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── frontend-slides/
│ │ ├── SKILL.md
│ │ ├── STYLE_PRESETS.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── investor-materials/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── investor-outreach/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── market-research/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── mcp-server-patterns/
│ │ └── SKILL.md
│ ├── nextjs-turbopack/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── security-review/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── strategic-compact/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── tdd-workflow/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── verification-loop/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ ├── video-editing/
│ │ ├── SKILL.md
│ │ └── agents/
│ │ └── openai.yaml
│ └── x-api/
│ ├── SKILL.md
│ └── agents/
│ └── openai.yaml
├── .claude/
│ ├── homunculus/
│ │ └── instincts/
│ │ └── inherited/
│ │ └── everything-claude-code-instincts.yaml
│ ├── package-manager.json
│ └── skills/
│ └── everything-claude-code/
│ └── SKILL.md
├── .claude-plugin/
│ ├── PLUGIN_SCHEMA_NOTES.md
│ ├── README.md
│ ├── marketplace.json
│ └── plugin.json
├── .codex/
│ ├── AGENTS.md
│ ├── agents/
│ │ ├── docs-researcher.toml
│ │ ├── explorer.toml
│ │ └── reviewer.toml
│ └── config.toml
├── .cursor/
│ ├── hooks/
│ │ ├── adapter.js
│ │ ├── after-file-edit.js
│ │ ├── after-mcp-execution.js
│ │ ├── after-shell-execution.js
│ │ ├── after-tab-file-edit.js
│ │ ├── before-mcp-execution.js
│ │ ├── before-read-file.js
│ │ ├── before-shell-execution.js
│ │ ├── before-submit-prompt.js
│ │ ├── before-tab-file-read.js
│ │ ├── pre-compact.js
│ │ ├── session-end.js
│ │ ├── session-start.js
│ │ ├── stop.js
│ │ ├── subagent-start.js
│ │ └── subagent-stop.js
│ ├── hooks.json
│ ├── rules/
│ │ ├── common-agents.md
│ │ ├── common-coding-style.md
│ │ ├── common-development-workflow.md
│ │ ├── common-git-workflow.md
│ │ ├── common-hooks.md
│ │ ├── common-patterns.md
│ │ ├── common-performance.md
│ │ ├── common-security.md
│ │ ├── common-testing.md
│ │ ├── golang-coding-style.md
│ │ ├── golang-hooks.md
│ │ ├── golang-patterns.md
│ │ ├── golang-security.md
│ │ ├── golang-testing.md
│ │ ├── kotlin-coding-style.md
│ │ ├── kotlin-hooks.md
│ │ ├── kotlin-patterns.md
│ │ ├── kotlin-security.md
│ │ ├── kotlin-testing.md
│ │ ├── php-coding-style.md
│ │ ├── php-hooks.md
│ │ ├── php-patterns.md
│ │ ├── php-security.md
│ │ ├── php-testing.md
│ │ ├── python-coding-style.md
│ │ ├── python-hooks.md
│ │ ├── python-patterns.md
│ │ ├── python-security.md
│ │ ├── python-testing.md
│ │ ├── swift-coding-style.md
│ │ ├── swift-hooks.md
│ │ ├── swift-patterns.md
│ │ ├── swift-security.md
│ │ ├── swift-testing.md
│ │ ├── typescript-coding-style.md
│ │ ├── typescript-hooks.md
│ │ ├── typescript-patterns.md
│ │ ├── typescript-security.md
│ │ └── typescript-testing.md
│ └── skills/
│ ├── article-writing/
│ │ └── SKILL.md
│ ├── bun-runtime/
│ │ └── SKILL.md
│ ├── content-engine/
│ │ └── SKILL.md
│ ├── documentation-lookup/
│ │ └── SKILL.md
│ ├── frontend-slides/
│ │ ├── SKILL.md
│ │ └── STYLE_PRESETS.md
│ ├── investor-materials/
│ │ └── SKILL.md
│ ├── investor-outreach/
│ │ └── SKILL.md
│ ├── market-research/
│ │ └── SKILL.md
│ ├── mcp-server-patterns/
│ │ └── SKILL.md
│ └── nextjs-turbopack/
│ └── SKILL.md
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ └── copilot-task.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ ├── release.yml
│ └── workflows/
│ ├── ci.yml
│ ├── maintenance.yml
│ ├── monthly-metrics.yml
│ ├── release.yml
│ ├── reusable-release.yml
│ ├── reusable-test.yml
│ └── reusable-validate.yml
├── .gitignore
├── .markdownlint.json
├── .npmignore
├── .opencode/
│ ├── MIGRATION.md
│ ├── README.md
│ ├── commands/
│ │ ├── build-fix.md
│ │ ├── checkpoint.md
│ │ ├── code-review.md
│ │ ├── e2e.md
│ │ ├── eval.md
│ │ ├── evolve.md
│ │ ├── go-build.md
│ │ ├── go-review.md
│ │ ├── go-test.md
│ │ ├── harness-audit.md
│ │ ├── instinct-export.md
│ │ ├── instinct-import.md
│ │ ├── instinct-status.md
│ │ ├── learn.md
│ │ ├── loop-start.md
│ │ ├── loop-status.md
│ │ ├── model-route.md
│ │ ├── orchestrate.md
│ │ ├── plan.md
│ │ ├── projects.md
│ │ ├── promote.md
│ │ ├── quality-gate.md
│ │ ├── refactor-clean.md
│ │ ├── rust-build.md
│ │ ├── rust-review.md
│ │ ├── rust-test.md
│ │ ├── security.md
│ │ ├── setup-pm.md
│ │ ├── skill-create.md
│ │ ├── tdd.md
│ │ ├── test-coverage.md
│ │ ├── update-codemaps.md
│ │ ├── update-docs.md
│ │ └── verify.md
│ ├── index.ts
│ ├── instructions/
│ │ └── INSTRUCTIONS.md
│ ├── opencode.json
│ ├── package.json
│ ├── plugins/
│ │ ├── ecc-hooks.ts
│ │ └── index.ts
│ ├── prompts/
│ │ └── agents/
│ │ ├── architect.txt
│ │ ├── build-error-resolver.txt
│ │ ├── code-reviewer.txt
│ │ ├── database-reviewer.txt
│ │ ├── doc-updater.txt
│ │ ├── e2e-runner.txt
│ │ ├── go-build-resolver.txt
│ │ ├── go-reviewer.txt
│ │ ├── planner.txt
│ │ ├── refactor-cleaner.txt
│ │ ├── rust-build-resolver.txt
│ │ ├── rust-reviewer.txt
│ │ ├── security-reviewer.txt
│ │ └── tdd-guide.txt
│ ├── tools/
│ │ ├── check-coverage.ts
│ │ ├── format-code.ts
│ │ ├── git-summary.ts
│ │ ├── index.ts
│ │ ├── lint-check.ts
│ │ ├── run-tests.ts
│ │ └── security-audit.ts
│ └── tsconfig.json
├── .prettierrc
├── .tool-versions
├── AGENTS.md
├── CHANGELOG.md
├── CLAUDE.md
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── README.zh-CN.md
├── SPONSORING.md
├── SPONSORS.md
├── TROUBLESHOOTING.md
├── VERSION
├── agents/
│ ├── architect.md
│ ├── build-error-resolver.md
│ ├── chief-of-staff.md
│ ├── code-reviewer.md
│ ├── cpp-build-resolver.md
│ ├── cpp-reviewer.md
│ ├── database-reviewer.md
│ ├── doc-updater.md
│ ├── docs-lookup.md
│ ├── e2e-runner.md
│ ├── go-build-resolver.md
│ ├── go-reviewer.md
│ ├── harness-optimizer.md
│ ├── java-build-resolver.md
│ ├── java-reviewer.md
│ ├── kotlin-build-resolver.md
│ ├── kotlin-reviewer.md
│ ├── loop-operator.md
│ ├── planner.md
│ ├── python-reviewer.md
│ ├── pytorch-build-resolver.md
│ ├── refactor-cleaner.md
│ ├── rust-build-resolver.md
│ ├── rust-reviewer.md
│ ├── security-reviewer.md
│ ├── tdd-guide.md
│ └── typescript-reviewer.md
├── commands/
│ ├── aside.md
│ ├── build-fix.md
│ ├── checkpoint.md
│ ├── claw.md
│ ├── code-review.md
│ ├── cpp-build.md
│ ├── cpp-review.md
│ ├── cpp-test.md
│ ├── devfleet.md
│ ├── docs.md
│ ├── e2e.md
│ ├── eval.md
│ ├── evolve.md
│ ├── go-build.md
│ ├── go-review.md
│ ├── go-test.md
│ ├── gradle-build.md
│ ├── harness-audit.md
│ ├── instinct-export.md
│ ├── instinct-import.md
│ ├── instinct-status.md
│ ├── kotlin-build.md
│ ├── kotlin-review.md
│ ├── kotlin-test.md
│ ├── learn-eval.md
│ ├── learn.md
│ ├── loop-start.md
│ ├── loop-status.md
│ ├── model-route.md
│ ├── multi-backend.md
│ ├── multi-execute.md
│ ├── multi-frontend.md
│ ├── multi-plan.md
│ ├── multi-workflow.md
│ ├── orchestrate.md
│ ├── plan.md
│ ├── pm2.md
│ ├── projects.md
│ ├── promote.md
│ ├── prompt-optimize.md
│ ├── python-review.md
│ ├── quality-gate.md
│ ├── refactor-clean.md
│ ├── resume-session.md
│ ├── rust-build.md
│ ├── rust-review.md
│ ├── rust-test.md
│ ├── save-session.md
│ ├── sessions.md
│ ├── setup-pm.md
│ ├── skill-create.md
│ ├── skill-health.md
│ ├── tdd.md
│ ├── test-coverage.md
│ ├── update-codemaps.md
│ ├── update-docs.md
│ └── verify.md
├── commitlint.config.js
├── contexts/
│ ├── dev.md
│ ├── research.md
│ └── review.md
├── docs/
│ ├── ARCHITECTURE-IMPROVEMENTS.md
│ ├── COMMAND-AGENT-MAP.md
│ ├── ECC-2.0-SESSION-ADAPTER-DISCOVERY.md
│ ├── MEGA-PLAN-REPO-PROMPTS-2026-03-12.md
│ ├── PHASE1-ISSUE-BUNDLE-2026-03-12.md
│ ├── PR-399-REVIEW-2026-03-12.md
│ ├── PR-QUEUE-TRIAGE-2026-03-13.md
│ ├── SELECTIVE-INSTALL-ARCHITECTURE.md
│ ├── SELECTIVE-INSTALL-DESIGN.md
│ ├── SESSION-ADAPTER-CONTRACT.md
│ ├── business/
│ │ ├── metrics-and-sponsorship.md
│ │ └── social-launch-copy.md
│ ├── continuous-learning-v2-spec.md
│ ├── ja-JP/
│ │ ├── CONTRIBUTING.md
│ │ ├── README.md
│ │ ├── agents/
│ │ │ ├── architect.md
│ │ │ ├── build-error-resolver.md
│ │ │ ├── code-reviewer.md
│ │ │ ├── database-reviewer.md
│ │ │ ├── doc-updater.md
│ │ │ ├── e2e-runner.md
│ │ │ ├── go-build-resolver.md
│ │ │ ├── go-reviewer.md
│ │ │ ├── planner.md
│ │ │ ├── python-reviewer.md
│ │ │ ├── refactor-cleaner.md
│ │ │ ├── security-reviewer.md
│ │ │ └── tdd-guide.md
│ │ ├── commands/
│ │ │ ├── README.md
│ │ │ ├── build-fix.md
│ │ │ ├── checkpoint.md
│ │ │ ├── code-review.md
│ │ │ ├── e2e.md
│ │ │ ├── eval.md
│ │ │ ├── evolve.md
│ │ │ ├── go-build.md
│ │ │ ├── go-review.md
│ │ │ ├── go-test.md
│ │ │ ├── instinct-export.md
│ │ │ ├── instinct-import.md
│ │ │ ├── instinct-status.md
│ │ │ ├── learn.md
│ │ │ ├── multi-backend.md
│ │ │ ├── multi-execute.md
│ │ │ ├── multi-frontend.md
│ │ │ ├── multi-plan.md
│ │ │ ├── multi-workflow.md
│ │ │ ├── orchestrate.md
│ │ │ ├── pm2.md
│ │ │ ├── python-review.md
│ │ │ ├── refactor-clean.md
│ │ │ ├── sessions.md
│ │ │ ├── setup-pm.md
│ │ │ ├── skill-create.md
│ │ │ ├── tdd.md
│ │ │ ├── test-coverage.md
│ │ │ ├── update-codemaps.md
│ │ │ ├── update-docs.md
│ │ │ └── verify.md
│ │ ├── contexts/
│ │ │ ├── dev.md
│ │ │ ├── research.md
│ │ │ └── review.md
│ │ ├── examples/
│ │ │ ├── CLAUDE.md
│ │ │ └── user-CLAUDE.md
│ │ ├── plugins/
│ │ │ └── README.md
│ │ ├── rules/
│ │ │ ├── README.md
│ │ │ ├── agents.md
│ │ │ ├── coding-style.md
│ │ │ ├── git-workflow.md
│ │ │ ├── hooks.md
│ │ │ ├── patterns.md
│ │ │ ├── performance.md
│ │ │ ├── security.md
│ │ │ └── testing.md
│ │ └── skills/
│ │ ├── README.md
│ │ ├── backend-patterns/
│ │ │ └── SKILL.md
│ │ ├── clickhouse-io/
│ │ │ └── SKILL.md
│ │ ├── coding-standards/
│ │ │ └── SKILL.md
│ │ ├── configure-ecc/
│ │ │ └── SKILL.md
│ │ ├── continuous-learning/
│ │ │ └── SKILL.md
│ │ ├── continuous-learning-v2/
│ │ │ ├── SKILL.md
│ │ │ └── agents/
│ │ │ └── observer.md
│ │ ├── cpp-testing/
│ │ │ └── SKILL.md
│ │ ├── django-patterns/
│ │ │ └── SKILL.md
│ │ ├── django-security/
│ │ │ └── SKILL.md
│ │ ├── django-tdd/
│ │ │ └── SKILL.md
│ │ ├── django-verification/
│ │ │ └── SKILL.md
│ │ ├── eval-harness/
│ │ │ └── SKILL.md
│ │ ├── frontend-patterns/
│ │ │ └── SKILL.md
│ │ ├── golang-patterns/
│ │ │ └── SKILL.md
│ │ ├── golang-testing/
│ │ │ └── SKILL.md
│ │ ├── iterative-retrieval/
│ │ │ └── SKILL.md
│ │ ├── java-coding-standards/
│ │ │ └── SKILL.md
│ │ ├── jpa-patterns/
│ │ │ └── SKILL.md
│ │ ├── nutrient-document-processing/
│ │ │ └── SKILL.md
│ │ ├── postgres-patterns/
│ │ │ └── SKILL.md
│ │ ├── project-guidelines-example/
│ │ │ └── SKILL.md
│ │ ├── python-patterns/
│ │ │ └── SKILL.md
│ │ ├── python-testing/
│ │ │ └── SKILL.md
│ │ ├── security-review/
│ │ │ ├── SKILL.md
│ │ │ └── cloud-infrastructure-security.md
│ │ ├── security-scan/
│ │ │ └── SKILL.md
│ │ ├── springboot-patterns/
│ │ │ └── SKILL.md
│ │ ├── springboot-security/
│ │ │ └── SKILL.md
│ │ ├── springboot-tdd/
│ │ │ └── SKILL.md
│ │ ├── springboot-verification/
│ │ │ └── SKILL.md
│ │ ├── strategic-compact/
│ │ │ └── SKILL.md
│ │ ├── tdd-workflow/
│ │ │ └── SKILL.md
│ │ └── verification-loop/
│ │ └── SKILL.md
│ ├── ko-KR/
│ │ ├── CONTRIBUTING.md
│ │ ├── README.md
│ │ ├── TERMINOLOGY.md
│ │ ├── agents/
│ │ │ ├── architect.md
│ │ │ ├── build-error-resolver.md
│ │ │ ├── code-reviewer.md
│ │ │ ├── database-reviewer.md
│ │ │ ├── doc-updater.md
│ │ │ ├── e2e-runner.md
│ │ │ ├── go-build-resolver.md
│ │ │ ├── go-reviewer.md
│ │ │ ├── planner.md
│ │ │ ├── refactor-cleaner.md
│ │ │ ├── security-reviewer.md
│ │ │ └── tdd-guide.md
│ │ ├── commands/
│ │ │ ├── build-fix.md
│ │ │ ├── checkpoint.md
│ │ │ ├── code-review.md
│ │ │ ├── e2e.md
│ │ │ ├── eval.md
│ │ │ ├── go-build.md
│ │ │ ├── go-review.md
│ │ │ ├── go-test.md
│ │ │ ├── learn.md
│ │ │ ├── orchestrate.md
│ │ │ ├── plan.md
│ │ │ ├── refactor-clean.md
│ │ │ ├── setup-pm.md
│ │ │ ├── tdd.md
│ │ │ ├── test-coverage.md
│ │ │ ├── update-codemaps.md
│ │ │ ├── update-docs.md
│ │ │ └── verify.md
│ │ ├── examples/
│ │ │ ├── CLAUDE.md
│ │ │ ├── django-api-CLAUDE.md
│ │ │ ├── go-microservice-CLAUDE.md
│ │ │ ├── rust-api-CLAUDE.md
│ │ │ ├── saas-nextjs-CLAUDE.md
│ │ │ ├── statusline.json
│ │ │ └── user-CLAUDE.md
│ │ ├── rules/
│ │ │ ├── agents.md
│ │ │ ├── coding-style.md
│ │ │ ├── git-workflow.md
│ │ │ ├── hooks.md
│ │ │ ├── patterns.md
│ │ │ ├── performance.md
│ │ │ ├── security.md
│ │ │ └── testing.md
│ │ └── skills/
│ │ ├── backend-patterns/
│ │ │ └── SKILL.md
│ │ ├── clickhouse-io/
│ │ │ └── SKILL.md
│ │ ├── coding-standards/
│ │ │ └── SKILL.md
│ │ ├── continuous-learning/
│ │ │ └── SKILL.md
│ │ ├── continuous-learning-v2/
│ │ │ └── SKILL.md
│ │ ├── eval-harness/
│ │ │ └── SKILL.md
│ │ ├── frontend-patterns/
│ │ │ └── SKILL.md
│ │ ├── golang-patterns/
│ │ │ └── SKILL.md
│ │ ├── golang-testing/
│ │ │ └── SKILL.md
│ │ ├── iterative-retrieval/
│ │ │ └── SKILL.md
│ │ ├── postgres-patterns/
│ │ │ └── SKILL.md
│ │ ├── project-guidelines-example/
│ │ │ └── SKILL.md
│ │ ├── security-review/
│ │ │ ├── SKILL.md
│ │ │ └── cloud-infrastructure-security.md
│ │ ├── strategic-compact/
│ │ │ └── SKILL.md
│ │ ├── tdd-workflow/
│ │ │ └── SKILL.md
│ │ └── verification-loop/
│ │ └── SKILL.md
│ ├── releases/
│ │ └── 1.8.0/
│ │ ├── linkedin-post.md
│ │ ├── reference-attribution.md
│ │ ├── release-notes.md
│ │ ├── x-quote-eval-skills.md
│ │ ├── x-quote-plankton-deslop.md
│ │ └── x-thread.md
│ ├── token-optimization.md
│ ├── zh-CN/
│ │ ├── AGENTS.md
│ │ ├── CHANGELOG.md
│ │ ├── CLAUDE.md
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── README.md
│ │ ├── SPONSORING.md
│ │ ├── SPONSORS.md
│ │ ├── TROUBLESHOOTING.md
│ │ ├── agents/
│ │ │ ├── architect.md
│ │ │ ├── build-error-resolver.md
│ │ │ ├── chief-of-staff.md
│ │ │ ├── code-reviewer.md
│ │ │ ├── database-reviewer.md
│ │ │ ├── doc-updater.md
│ │ │ ├── e2e-runner.md
│ │ │ ├── go-build-resolver.md
│ │ │ ├── go-reviewer.md
│ │ │ ├── harness-optimizer.md
│ │ │ ├── kotlin-build-resolver.md
│ │ │ ├── kotlin-reviewer.md
│ │ │ ├── loop-operator.md
│ │ │ ├── planner.md
│ │ │ ├── python-reviewer.md
│ │ │ ├── refactor-cleaner.md
│ │ │ ├── security-reviewer.md
│ │ │ └── tdd-guide.md
│ │ ├── commands/
│ │ │ ├── aside.md
│ │ │ ├── build-fix.md
│ │ │ ├── checkpoint.md
│ │ │ ├── claw.md
│ │ │ ├── code-review.md
│ │ │ ├── e2e.md
│ │ │ ├── eval.md
│ │ │ ├── evolve.md
│ │ │ ├── go-build.md
│ │ │ ├── go-review.md
│ │ │ ├── go-test.md
│ │ │ ├── gradle-build.md
│ │ │ ├── harness-audit.md
│ │ │ ├── instinct-export.md
│ │ │ ├── instinct-import.md
│ │ │ ├── instinct-status.md
│ │ │ ├── kotlin-build.md
│ │ │ ├── kotlin-review.md
│ │ │ ├── kotlin-test.md
│ │ │ ├── learn-eval.md
│ │ │ ├── learn.md
│ │ │ ├── loop-start.md
│ │ │ ├── loop-status.md
│ │ │ ├── model-route.md
│ │ │ ├── multi-backend.md
│ │ │ ├── multi-execute.md
│ │ │ ├── multi-frontend.md
│ │ │ ├── multi-plan.md
│ │ │ ├── multi-workflow.md
│ │ │ ├── orchestrate.md
│ │ │ ├── plan.md
│ │ │ ├── pm2.md
│ │ │ ├── projects.md
│ │ │ ├── promote.md
│ │ │ ├── prompt-optimize.md
│ │ │ ├── python-review.md
│ │ │ ├── quality-gate.md
│ │ │ ├── refactor-clean.md
│ │ │ ├── resume-session.md
│ │ │ ├── save-session.md
│ │ │ ├── sessions.md
│ │ │ ├── setup-pm.md
│ │ │ ├── skill-create.md
│ │ │ ├── tdd.md
│ │ │ ├── test-coverage.md
│ │ │ ├── update-codemaps.md
│ │ │ ├── update-docs.md
│ │ │ └── verify.md
│ │ ├── contexts/
│ │ │ ├── dev.md
│ │ │ ├── research.md
│ │ │ └── review.md
│ │ ├── examples/
│ │ │ ├── CLAUDE.md
│ │ │ ├── django-api-CLAUDE.md
│ │ │ ├── go-microservice-CLAUDE.md
│ │ │ ├── rust-api-CLAUDE.md
│ │ │ ├── saas-nextjs-CLAUDE.md
│ │ │ └── user-CLAUDE.md
│ │ ├── hooks/
│ │ │ └── README.md
│ │ ├── plugins/
│ │ │ └── README.md
│ │ ├── rules/
│ │ │ ├── README.md
│ │ │ ├── common/
│ │ │ │ ├── agents.md
│ │ │ │ ├── coding-style.md
│ │ │ │ ├── development-workflow.md
│ │ │ │ ├── git-workflow.md
│ │ │ │ ├── hooks.md
│ │ │ │ ├── patterns.md
│ │ │ │ ├── performance.md
│ │ │ │ ├── security.md
│ │ │ │ └── testing.md
│ │ │ ├── golang/
│ │ │ │ ├── coding-style.md
│ │ │ │ ├── hooks.md
│ │ │ │ ├── patterns.md
│ │ │ │ ├── security.md
│ │ │ │ └── testing.md
│ │ │ ├── kotlin/
│ │ │ │ ├── coding-style.md
│ │ │ │ ├── hooks.md
│ │ │ │ ├── patterns.md
│ │ │ │ ├── security.md
│ │ │ │ └── testing.md
│ │ │ ├── perl/
│ │ │ │ ├── coding-style.md
│ │ │ │ ├── hooks.md
│ │ │ │ ├── patterns.md
│ │ │ │ ├── security.md
│ │ │ │ └── testing.md
│ │ │ ├── php/
│ │ │ │ ├── coding-style.md
│ │ │ │ ├── hooks.md
│ │ │ │ ├── patterns.md
│ │ │ │ ├── security.md
│ │ │ │ └── testing.md
│ │ │ ├── python/
│ │ │ │ ├── coding-style.md
│ │ │ │ ├── hooks.md
│ │ │ │ ├── patterns.md
│ │ │ │ ├── security.md
│ │ │ │ └── testing.md
│ │ │ ├── swift/
│ │ │ │ ├── coding-style.md
│ │ │ │ ├── hooks.md
│ │ │ │ ├── patterns.md
│ │ │ │ ├── security.md
│ │ │ │ └── testing.md
│ │ │ └── typescript/
│ │ │ ├── coding-style.md
│ │ │ ├── hooks.md
│ │ │ ├── patterns.md
│ │ │ ├── security.md
│ │ │ └── testing.md
│ │ ├── skills/
│ │ │ ├── agent-harness-construction/
│ │ │ │ └── SKILL.md
│ │ │ ├── agentic-engineering/
│ │ │ │ └── SKILL.md
│ │ │ ├── ai-first-engineering/
│ │ │ │ └── SKILL.md
│ │ │ ├── android-clean-architecture/
│ │ │ │ └── SKILL.md
│ │ │ ├── api-design/
│ │ │ │ └── SKILL.md
│ │ │ ├── article-writing/
│ │ │ │ └── SKILL.md
│ │ │ ├── autonomous-loops/
│ │ │ │ └── SKILL.md
│ │ │ ├── backend-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── blueprint/
│ │ │ │ └── SKILL.md
│ │ │ ├── carrier-relationship-management/
│ │ │ │ └── SKILL.md
│ │ │ ├── claude-api/
│ │ │ │ └── SKILL.md
│ │ │ ├── clickhouse-io/
│ │ │ │ └── SKILL.md
│ │ │ ├── coding-standards/
│ │ │ │ └── SKILL.md
│ │ │ ├── compose-multiplatform-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── configure-ecc/
│ │ │ │ └── SKILL.md
│ │ │ ├── content-engine/
│ │ │ │ └── SKILL.md
│ │ │ ├── content-hash-cache-pattern/
│ │ │ │ └── SKILL.md
│ │ │ ├── continuous-agent-loop/
│ │ │ │ └── SKILL.md
│ │ │ ├── continuous-learning/
│ │ │ │ └── SKILL.md
│ │ │ ├── continuous-learning-v2/
│ │ │ │ ├── SKILL.md
│ │ │ │ └── agents/
│ │ │ │ └── observer.md
│ │ │ ├── cost-aware-llm-pipeline/
│ │ │ │ └── SKILL.md
│ │ │ ├── cpp-coding-standards/
│ │ │ │ └── SKILL.md
│ │ │ ├── cpp-testing/
│ │ │ │ └── SKILL.md
│ │ │ ├── crosspost/
│ │ │ │ └── SKILL.md
│ │ │ ├── customs-trade-compliance/
│ │ │ │ └── SKILL.md
│ │ │ ├── database-migrations/
│ │ │ │ └── SKILL.md
│ │ │ ├── deep-research/
│ │ │ │ └── SKILL.md
│ │ │ ├── deployment-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── django-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── django-security/
│ │ │ │ └── SKILL.md
│ │ │ ├── django-tdd/
│ │ │ │ └── SKILL.md
│ │ │ ├── django-verification/
│ │ │ │ └── SKILL.md
│ │ │ ├── dmux-workflows/
│ │ │ │ └── SKILL.md
│ │ │ ├── docker-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── e2e-testing/
│ │ │ │ └── SKILL.md
│ │ │ ├── energy-procurement/
│ │ │ │ └── SKILL.md
│ │ │ ├── enterprise-agent-ops/
│ │ │ │ └── SKILL.md
│ │ │ ├── eval-harness/
│ │ │ │ └── SKILL.md
│ │ │ ├── exa-search/
│ │ │ │ └── SKILL.md
│ │ │ ├── fal-ai-media/
│ │ │ │ └── SKILL.md
│ │ │ ├── foundation-models-on-device/
│ │ │ │ └── SKILL.md
│ │ │ ├── frontend-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── frontend-slides/
│ │ │ │ ├── SKILL.md
│ │ │ │ └── STYLE_PRESETS.md
│ │ │ ├── golang-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── golang-testing/
│ │ │ │ └── SKILL.md
│ │ │ ├── inventory-demand-planning/
│ │ │ │ └── SKILL.md
│ │ │ ├── investor-materials/
│ │ │ │ └── SKILL.md
│ │ │ ├── investor-outreach/
│ │ │ │ └── SKILL.md
│ │ │ ├── iterative-retrieval/
│ │ │ │ └── SKILL.md
│ │ │ ├── java-coding-standards/
│ │ │ │ └── SKILL.md
│ │ │ ├── jpa-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── kotlin-coroutines-flows/
│ │ │ │ └── SKILL.md
│ │ │ ├── kotlin-exposed-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── kotlin-ktor-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── kotlin-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── kotlin-testing/
│ │ │ │ └── SKILL.md
│ │ │ ├── liquid-glass-design/
│ │ │ │ └── SKILL.md
│ │ │ ├── logistics-exception-management/
│ │ │ │ └── SKILL.md
│ │ │ ├── market-research/
│ │ │ │ └── SKILL.md
│ │ │ ├── nanoclaw-repl/
│ │ │ │ └── SKILL.md
│ │ │ ├── nutrient-document-processing/
│ │ │ │ └── SKILL.md
│ │ │ ├── perl-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── perl-security/
│ │ │ │ └── SKILL.md
│ │ │ ├── perl-testing/
│ │ │ │ └── SKILL.md
│ │ │ ├── plankton-code-quality/
│ │ │ │ └── SKILL.md
│ │ │ ├── postgres-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── production-scheduling/
│ │ │ │ └── SKILL.md
│ │ │ ├── project-guidelines-example/
│ │ │ │ └── SKILL.md
│ │ │ ├── prompt-optimizer/
│ │ │ │ └── SKILL.md
│ │ │ ├── python-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── python-testing/
│ │ │ │ └── SKILL.md
│ │ │ ├── quality-nonconformance/
│ │ │ │ └── SKILL.md
│ │ │ ├── ralphinho-rfc-pipeline/
│ │ │ │ └── SKILL.md
│ │ │ ├── regex-vs-llm-structured-text/
│ │ │ │ └── SKILL.md
│ │ │ ├── returns-reverse-logistics/
│ │ │ │ └── SKILL.md
│ │ │ ├── search-first/
│ │ │ │ └── SKILL.md
│ │ │ ├── security-review/
│ │ │ │ ├── SKILL.md
│ │ │ │ └── cloud-infrastructure-security.md
│ │ │ ├── security-scan/
│ │ │ │ └── SKILL.md
│ │ │ ├── skill-stocktake/
│ │ │ │ └── SKILL.md
│ │ │ ├── springboot-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── springboot-security/
│ │ │ │ └── SKILL.md
│ │ │ ├── springboot-tdd/
│ │ │ │ └── SKILL.md
│ │ │ ├── springboot-verification/
│ │ │ │ └── SKILL.md
│ │ │ ├── strategic-compact/
│ │ │ │ └── SKILL.md
│ │ │ ├── swift-actor-persistence/
│ │ │ │ └── SKILL.md
│ │ │ ├── swift-concurrency-6-2/
│ │ │ │ └── SKILL.md
│ │ │ ├── swift-protocol-di-testing/
│ │ │ │ └── SKILL.md
│ │ │ ├── swiftui-patterns/
│ │ │ │ └── SKILL.md
│ │ │ ├── tdd-workflow/
│ │ │ │ └── SKILL.md
│ │ │ ├── verification-loop/
│ │ │ │ └── SKILL.md
│ │ │ ├── video-editing/
│ │ │ │ └── SKILL.md
│ │ │ ├── videodb/
│ │ │ │ ├── SKILL.md
│ │ │ │ └── reference/
│ │ │ │ ├── api-reference.md
│ │ │ │ ├── capture-reference.md
│ │ │ │ ├── capture.md
│ │ │ │ ├── editor.md
│ │ │ │ ├── generative.md
│ │ │ │ ├── rtstream-reference.md
│ │ │ │ ├── rtstream.md
│ │ │ │ ├── search.md
│ │ │ │ ├── streaming.md
│ │ │ │ └── use-cases.md
│ │ │ ├── visa-doc-translate/
│ │ │ │ ├── README.md
│ │ │ │ └── SKILL.md
│ │ │ └── x-api/
│ │ │ └── SKILL.md
│ │ ├── the-longform-guide.md
│ │ ├── the-openclaw-guide.md
│ │ ├── the-security-guide.md
│ │ └── the-shortform-guide.md
│ └── zh-TW/
│ ├── CONTRIBUTING.md
│ ├── README.md
│ ├── TERMINOLOGY.md
│ ├── agents/
│ │ ├── architect.md
│ │ ├── build-error-resolver.md
│ │ ├── code-reviewer.md
│ │ ├── database-reviewer.md
│ │ ├── doc-updater.md
│ │ ├── e2e-runner.md
│ │ ├── go-build-resolver.md
│ │ ├── go-reviewer.md
│ │ ├── planner.md
│ │ ├── refactor-cleaner.md
│ │ ├── security-reviewer.md
│ │ └── tdd-guide.md
│ ├── commands/
│ │ ├── build-fix.md
│ │ ├── checkpoint.md
│ │ ├── code-review.md
│ │ ├── e2e.md
│ │ ├── eval.md
│ │ ├── go-build.md
│ │ ├── go-review.md
│ │ ├── go-test.md
│ │ ├── learn.md
│ │ ├── orchestrate.md
│ │ ├── plan.md
│ │ ├── refactor-clean.md
│ │ ├── setup-pm.md
│ │ ├── tdd.md
│ │ ├── test-coverage.md
│ │ ├── update-codemaps.md
│ │ ├── update-docs.md
│ │ └── verify.md
│ ├── rules/
│ │ ├── agents.md
│ │ ├── coding-style.md
│ │ ├── git-workflow.md
│ │ ├── hooks.md
│ │ ├── patterns.md
│ │ ├── performance.md
│ │ ├── security.md
│ │ └── testing.md
│ └── skills/
│ ├── backend-patterns/
│ │ └── SKILL.md
│ ├── clickhouse-io/
│ │ └── SKILL.md
│ ├── coding-standards/
│ │ └── SKILL.md
│ ├── continuous-learning/
│ │ └── SKILL.md
│ ├── continuous-learning-v2/
│ │ └── SKILL.md
│ ├── eval-harness/
│ │ └── SKILL.md
│ ├── frontend-patterns/
│ │ └── SKILL.md
│ ├── golang-patterns/
│ │ └── SKILL.md
│ ├── golang-testing/
│ │ └── SKILL.md
│ ├── iterative-retrieval/
│ │ └── SKILL.md
│ ├── postgres-patterns/
│ │ └── SKILL.md
│ ├── project-guidelines-example/
│ │ └── SKILL.md
│ ├── security-review/
│ │ ├── SKILL.md
│ │ └── cloud-infrastructure-security.md
│ ├── strategic-compact/
│ │ └── SKILL.md
│ ├── tdd-workflow/
│ │ └── SKILL.md
│ └── verification-loop/
│ └── SKILL.md
├── eslint.config.js
├── examples/
│ ├── CLAUDE.md
│ ├── django-api-CLAUDE.md
│ ├── go-microservice-CLAUDE.md
│ ├── laravel-api-CLAUDE.md
│ ├── rust-api-CLAUDE.md
│ ├── saas-nextjs-CLAUDE.md
│ ├── statusline.json
│ └── user-CLAUDE.md
├── hooks/
│ ├── README.md
│ └── hooks.json
├── install.ps1
├── install.sh
├── manifests/
│ ├── install-components.json
│ ├── install-modules.json
│ └── install-profiles.json
├── mcp-configs/
│ └── mcp-servers.json
├── package.json
├── plugins/
│ └── README.md
├── rules/
│ ├── README.md
│ ├── common/
│ │ ├── agents.md
│ │ ├── coding-style.md
│ │ ├── development-workflow.md
│ │ ├── git-workflow.md
│ │ ├── hooks.md
│ │ ├── patterns.md
│ │ ├── performance.md
│ │ ├── security.md
│ │ └── testing.md
│ ├── cpp/
│ │ ├── coding-style.md
│ │ ├── hooks.md
│ │ ├── patterns.md
│ │ ├── security.md
│ │ └── testing.md
│ ├── golang/
│ │ ├── coding-style.md
│ │ ├── hooks.md
│ │ ├── patterns.md
│ │ ├── security.md
│ │ └── testing.md
│ ├── java/
│ │ ├── coding-style.md
│ │ ├── hooks.md
│ │ ├── patterns.md
│ │ ├── security.md
│ │ └── testing.md
│ ├── kotlin/
│ │ ├── coding-style.md
│ │ ├── hooks.md
│ │ ├── patterns.md
│ │ ├── security.md
│ │ └── testing.md
│ ├── perl/
│ │ ├── coding-style.md
│ │ ├── hooks.md
│ │ ├── patterns.md
│ │ ├── security.md
│ │ └── testing.md
│ ├── php/
│ │ ├── coding-style.md
│ │ ├── hooks.md
│ │ ├── patterns.md
│ │ ├── security.md
│ │ └── testing.md
│ ├── python/
│ │ ├── coding-style.md
│ │ ├── hooks.md
│ │ ├── patterns.md
│ │ ├── security.md
│ │ └── testing.md
│ ├── swift/
│ │ ├── coding-style.md
│ │ ├── hooks.md
│ │ ├── patterns.md
│ │ ├── security.md
│ │ └── testing.md
│ └── typescript/
│ ├── coding-style.md
│ ├── hooks.md
│ ├── patterns.md
│ ├── security.md
│ └── testing.md
├── schemas/
│ ├── ecc-install-config.schema.json
│ ├── hooks.schema.json
│ ├── install-components.schema.json
│ ├── install-modules.schema.json
│ ├── install-profiles.schema.json
│ ├── install-state.schema.json
│ ├── package-manager.schema.json
│ ├── plugin.schema.json
│ └── state-store.schema.json
├── scripts/
│ ├── ci/
│ │ ├── catalog.js
│ │ ├── validate-agents.js
│ │ ├── validate-commands.js
│ │ ├── validate-hooks.js
│ │ ├── validate-install-manifests.js
│ │ ├── validate-no-personal-paths.js
│ │ ├── validate-rules.js
│ │ └── validate-skills.js
│ ├── claw.js
│ ├── codemaps/
│ │ └── generate.ts
│ ├── codex/
│ │ ├── check-codex-global-state.sh
│ │ └── install-global-git-hooks.sh
│ ├── codex-git-hooks/
│ │ ├── pre-commit
│ │ └── pre-push
│ ├── doctor.js
│ ├── ecc.js
│ ├── harness-audit.js
│ ├── hooks/
│ │ ├── auto-tmux-dev.js
│ │ ├── check-console-log.js
│ │ ├── check-hook-enabled.js
│ │ ├── cost-tracker.js
│ │ ├── doc-file-warning.js
│ │ ├── evaluate-session.js
│ │ ├── insaits-security-monitor.py
│ │ ├── insaits-security-wrapper.js
│ │ ├── post-bash-build-complete.js
│ │ ├── post-bash-pr-created.js
│ │ ├── post-edit-console-warn.js
│ │ ├── post-edit-format.js
│ │ ├── post-edit-typecheck.js
│ │ ├── pre-bash-dev-server-block.js
│ │ ├── pre-bash-git-push-reminder.js
│ │ ├── pre-bash-tmux-reminder.js
│ │ ├── pre-compact.js
│ │ ├── pre-write-doc-warn.js
│ │ ├── quality-gate.js
│ │ ├── run-with-flags-shell.sh
│ │ ├── run-with-flags.js
│ │ ├── session-end-marker.js
│ │ ├── session-end.js
│ │ ├── session-start.js
│ │ └── suggest-compact.js
│ ├── install-apply.js
│ ├── install-plan.js
│ ├── lib/
│ │ ├── hook-flags.js
│ │ ├── install/
│ │ │ ├── apply.js
│ │ │ ├── config.js
│ │ │ ├── request.js
│ │ │ └── runtime.js
│ │ ├── install-executor.js
│ │ ├── install-lifecycle.js
│ │ ├── install-manifests.js
│ │ ├── install-state.js
│ │ ├── install-targets/
│ │ │ ├── antigravity-project.js
│ │ │ ├── claude-home.js
│ │ │ ├── codex-home.js
│ │ │ ├── cursor-project.js
│ │ │ ├── helpers.js
│ │ │ ├── opencode-home.js
│ │ │ └── registry.js
│ │ ├── orchestration-session.js
│ │ ├── package-manager.d.ts
│ │ ├── package-manager.js
│ │ ├── project-detect.js
│ │ ├── resolve-formatter.js
│ │ ├── session-adapters/
│ │ │ ├── canonical-session.js
│ │ │ ├── claude-history.js
│ │ │ ├── dmux-tmux.js
│ │ │ └── registry.js
│ │ ├── session-aliases.d.ts
│ │ ├── session-aliases.js
│ │ ├── session-manager.d.ts
│ │ ├── session-manager.js
│ │ ├── shell-split.js
│ │ ├── skill-evolution/
│ │ │ ├── dashboard.js
│ │ │ ├── health.js
│ │ │ ├── index.js
│ │ │ ├── provenance.js
│ │ │ ├── tracker.js
│ │ │ └── versioning.js
│ │ ├── skill-improvement/
│ │ │ ├── amendify.js
│ │ │ ├── evaluate.js
│ │ │ ├── health.js
│ │ │ └── observations.js
│ │ ├── state-store/
│ │ │ ├── index.js
│ │ │ ├── migrations.js
│ │ │ ├── queries.js
│ │ │ └── schema.js
│ │ ├── tmux-worktree-orchestrator.js
│ │ ├── utils.d.ts
│ │ └── utils.js
│ ├── list-installed.js
│ ├── orchestrate-codex-worker.sh
│ ├── orchestrate-worktrees.js
│ ├── orchestration-status.js
│ ├── release.sh
│ ├── repair.js
│ ├── session-inspect.js
│ ├── sessions-cli.js
│ ├── setup-package-manager.js
│ ├── skill-create-output.js
│ ├── skills-health.js
│ ├── status.js
│ ├── sync-ecc-to-codex.sh
│ └── uninstall.js
├── skills/
│ ├── agent-harness-construction/
│ │ └── SKILL.md
│ ├── agentic-engineering/
│ │ └── SKILL.md
│ ├── ai-first-engineering/
│ │ └── SKILL.md
│ ├── ai-regression-testing/
│ │ └── SKILL.md
│ ├── android-clean-architecture/
│ │ └── SKILL.md
│ ├── api-design/
│ │ └── SKILL.md
│ ├── article-writing/
│ │ └── SKILL.md
│ ├── autonomous-loops/
│ │ └── SKILL.md
│ ├── backend-patterns/
│ │ └── SKILL.md
│ ├── blueprint/
│ │ └── SKILL.md
│ ├── bun-runtime/
│ │ └── SKILL.md
│ ├── carrier-relationship-management/
│ │ └── SKILL.md
│ ├── claude-api/
│ │ └── SKILL.md
│ ├── claude-devfleet/
│ │ └── SKILL.md
│ ├── clickhouse-io/
│ │ └── SKILL.md
│ ├── coding-standards/
│ │ └── SKILL.md
│ ├── compose-multiplatform-patterns/
│ │ └── SKILL.md
│ ├── configure-ecc/
│ │ └── SKILL.md
│ ├── content-engine/
│ │ └── SKILL.md
│ ├── content-hash-cache-pattern/
│ │ └── SKILL.md
│ ├── continuous-agent-loop/
│ │ └── SKILL.md
│ ├── continuous-learning/
│ │ ├── SKILL.md
│ │ ├── config.json
│ │ └── evaluate-session.sh
│ ├── continuous-learning-v2/
│ │ ├── SKILL.md
│ │ ├── agents/
│ │ │ ├── observer-loop.sh
│ │ │ ├── observer.md
│ │ │ ├── session-guardian.sh
│ │ │ └── start-observer.sh
│ │ ├── config.json
│ │ ├── hooks/
│ │ │ └── observe.sh
│ │ └── scripts/
│ │ ├── detect-project.sh
│ │ ├── instinct-cli.py
│ │ └── test_parse_instinct.py
│ ├── cost-aware-llm-pipeline/
│ │ └── SKILL.md
│ ├── cpp-coding-standards/
│ │ └── SKILL.md
│ ├── cpp-testing/
│ │ └── SKILL.md
│ ├── crosspost/
│ │ └── SKILL.md
│ ├── customs-trade-compliance/
│ │ └── SKILL.md
│ ├── data-scraper-agent/
│ │ └── SKILL.md
│ ├── database-migrations/
│ │ └── SKILL.md
│ ├── deep-research/
│ │ └── SKILL.md
│ ├── deployment-patterns/
│ │ └── SKILL.md
│ ├── django-patterns/
│ │ └── SKILL.md
│ ├── django-security/
│ │ └── SKILL.md
│ ├── django-tdd/
│ │ └── SKILL.md
│ ├── django-verification/
│ │ └── SKILL.md
│ ├── dmux-workflows/
│ │ └── SKILL.md
│ ├── docker-patterns/
│ │ └── SKILL.md
│ ├── documentation-lookup/
│ │ └── SKILL.md
│ ├── e2e-testing/
│ │ └── SKILL.md
│ ├── energy-procurement/
│ │ └── SKILL.md
│ ├── enterprise-agent-ops/
│ │ └── SKILL.md
│ ├── eval-harness/
│ │ └── SKILL.md
│ ├── exa-search/
│ │ └── SKILL.md
│ ├── fal-ai-media/
│ │ └── SKILL.md
│ ├── foundation-models-on-device/
│ │ └── SKILL.md
│ ├── frontend-patterns/
│ │ └── SKILL.md
│ ├── frontend-slides/
│ │ ├── SKILL.md
│ │ └── STYLE_PRESETS.md
│ ├── golang-patterns/
│ │ └── SKILL.md
│ ├── golang-testing/
│ │ └── SKILL.md
│ ├── inventory-demand-planning/
│ │ └── SKILL.md
│ ├── investor-materials/
│ │ └── SKILL.md
│ ├── investor-outreach/
│ │ └── SKILL.md
│ ├── iterative-retrieval/
│ │ └── SKILL.md
│ ├── java-coding-standards/
│ │ └── SKILL.md
│ ├── jpa-patterns/
│ │ └── SKILL.md
│ ├── kotlin-coroutines-flows/
│ │ └── SKILL.md
│ ├── kotlin-exposed-patterns/
│ │ └── SKILL.md
│ ├── kotlin-ktor-patterns/
│ │ └── SKILL.md
│ ├── kotlin-patterns/
│ │ └── SKILL.md
│ ├── kotlin-testing/
│ │ └── SKILL.md
│ ├── laravel-patterns/
│ │ └── SKILL.md
│ ├── laravel-security/
│ │ └── SKILL.md
│ ├── laravel-tdd/
│ │ └── SKILL.md
│ ├── laravel-verification/
│ │ └── SKILL.md
│ ├── liquid-glass-design/
│ │ └── SKILL.md
│ ├── logistics-exception-management/
│ │ └── SKILL.md
│ ├── market-research/
│ │ └── SKILL.md
│ ├── mcp-server-patterns/
│ │ └── SKILL.md
│ ├── nanoclaw-repl/
│ │ └── SKILL.md
│ ├── nextjs-turbopack/
│ │ └── SKILL.md
│ ├── nutrient-document-processing/
│ │ └── SKILL.md
│ ├── perl-patterns/
│ │ └── SKILL.md
│ ├── perl-security/
│ │ └── SKILL.md
│ ├── perl-testing/
│ │ └── SKILL.md
│ ├── plankton-code-quality/
│ │ └── SKILL.md
│ ├── postgres-patterns/
│ │ └── SKILL.md
│ ├── production-scheduling/
│ │ └── SKILL.md
│ ├── project-guidelines-example/
│ │ └── SKILL.md
│ ├── prompt-optimizer/
│ │ └── SKILL.md
│ ├── python-patterns/
│ │ └── SKILL.md
│ ├── python-testing/
│ │ └── SKILL.md
│ ├── pytorch-patterns/
│ │ └── SKILL.md
│ ├── quality-nonconformance/
│ │ └── SKILL.md
│ ├── ralphinho-rfc-pipeline/
│ │ └── SKILL.md
│ ├── regex-vs-llm-structured-text/
│ │ └── SKILL.md
│ ├── returns-reverse-logistics/
│ │ └── SKILL.md
│ ├── rust-patterns/
│ │ └── SKILL.md
│ ├── rust-testing/
│ │ └── SKILL.md
│ ├── search-first/
│ │ └── SKILL.md
│ ├── security-review/
│ │ ├── SKILL.md
│ │ └── cloud-infrastructure-security.md
│ ├── security-scan/
│ │ └── SKILL.md
│ ├── skill-stocktake/
│ │ ├── SKILL.md
│ │ └── scripts/
│ │ ├── quick-diff.sh
│ │ ├── save-results.sh
│ │ └── scan.sh
│ ├── springboot-patterns/
│ │ └── SKILL.md
│ ├── springboot-security/
│ │ └── SKILL.md
│ ├── springboot-tdd/
│ │ └── SKILL.md
│ ├── springboot-verification/
│ │ └── SKILL.md
│ ├── strategic-compact/
│ │ ├── SKILL.md
│ │ └── suggest-compact.sh
│ ├── swift-actor-persistence/
│ │ └── SKILL.md
│ ├── swift-concurrency-6-2/
│ │ └── SKILL.md
│ ├── swift-protocol-di-testing/
│ │ └── SKILL.md
│ ├── swiftui-patterns/
│ │ └── SKILL.md
│ ├── tdd-workflow/
│ │ └── SKILL.md
│ ├── team-builder/
│ │ └── SKILL.md
│ ├── verification-loop/
│ │ └── SKILL.md
│ ├── video-editing/
│ │ └── SKILL.md
│ ├── videodb/
│ │ ├── SKILL.md
│ │ ├── reference/
│ │ │ ├── api-reference.md
│ │ │ ├── capture-reference.md
│ │ │ ├── capture.md
│ │ │ ├── editor.md
│ │ │ ├── generative.md
│ │ │ ├── rtstream-reference.md
│ │ │ ├── rtstream.md
│ │ │ ├── search.md
│ │ │ ├── streaming.md
│ │ │ └── use-cases.md
│ │ └── scripts/
│ │ └── ws_listener.py
│ ├── visa-doc-translate/
│ │ ├── README.md
│ │ └── SKILL.md
│ └── x-api/
│ └── SKILL.md
├── tests/
│ ├── ci/
│ │ └── validators.test.js
│ ├── codex-config.test.js
│ ├── hooks/
│ │ ├── auto-tmux-dev.test.js
│ │ ├── check-hook-enabled.test.js
│ │ ├── cost-tracker.test.js
│ │ ├── doc-file-warning.test.js
│ │ ├── evaluate-session.test.js
│ │ ├── hook-flags.test.js
│ │ ├── hooks.test.js
│ │ ├── observer-memory.test.js
│ │ ├── post-bash-hooks.test.js
│ │ ├── pre-bash-dev-server-block.test.js
│ │ ├── pre-bash-reminders.test.js
│ │ ├── quality-gate.test.js
│ │ └── suggest-compact.test.js
│ ├── integration/
│ │ └── hooks.test.js
│ ├── lib/
│ │ ├── install-config.test.js
│ │ ├── install-lifecycle.test.js
│ │ ├── install-manifests.test.js
│ │ ├── install-request.test.js
│ │ ├── install-state.test.js
│ │ ├── install-targets.test.js
│ │ ├── orchestration-session.test.js
│ │ ├── package-manager.test.js
│ │ ├── project-detect.test.js
│ │ ├── resolve-formatter.test.js
│ │ ├── session-adapters.test.js
│ │ ├── session-aliases.test.js
│ │ ├── session-manager.test.js
│ │ ├── shell-split.test.js
│ │ ├── skill-dashboard.test.js
│ │ ├── skill-evolution.test.js
│ │ ├── skill-improvement.test.js
│ │ ├── state-store.test.js
│ │ ├── tmux-worktree-orchestrator.test.js
│ │ └── utils.test.js
│ ├── opencode-config.test.js
│ ├── run-all.js
│ └── scripts/
│ ├── claw.test.js
│ ├── doctor.test.js
│ ├── ecc.test.js
│ ├── harness-audit.test.js
│ ├── install-apply.test.js
│ ├── install-plan.test.js
│ ├── install-ps1.test.js
│ ├── install-sh.test.js
│ ├── list-installed.test.js
│ ├── orchestrate-codex-worker.test.js
│ ├── orchestration-status.test.js
│ ├── repair.test.js
│ ├── session-inspect.test.js
│ ├── setup-package-manager.test.js
│ ├── skill-create-output.test.js
│ └── uninstall.test.js
├── the-longform-guide.md
├── the-openclaw-guide.md
├── the-security-guide.md
└── the-shortform-guide.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .agents/skills/api-design/SKILL.md
================================================
---
name: api-design
description: REST API design patterns including resource naming, status codes, pagination, filtering, error responses, versioning, and rate limiting for production APIs.
origin: ECC
---
# API Design Patterns
Conventions and best practices for designing consistent, developer-friendly REST APIs.
## When to Activate
- Designing new API endpoints
- Reviewing existing API contracts
- Adding pagination, filtering, or sorting
- Implementing error handling for APIs
- Planning API versioning strategy
- Building public or partner-facing APIs
## Resource Design
### URL Structure
```
# Resources are nouns, plural, lowercase, kebab-case
GET /api/v1/users
GET /api/v1/users/:id
POST /api/v1/users
PUT /api/v1/users/:id
PATCH /api/v1/users/:id
DELETE /api/v1/users/:id
# Sub-resources for relationships
GET /api/v1/users/:id/orders
POST /api/v1/users/:id/orders
# Actions that don't map to CRUD (use verbs sparingly)
POST /api/v1/orders/:id/cancel
POST /api/v1/auth/login
POST /api/v1/auth/refresh
```
### Naming Rules
```
# GOOD
/api/v1/team-members # kebab-case for multi-word resources
/api/v1/orders?status=active # query params for filtering
/api/v1/users/123/orders # nested resources for ownership
# BAD
/api/v1/getUsers # verb in URL
/api/v1/user # singular (use plural)
/api/v1/team_members # snake_case in URLs
/api/v1/users/123/getOrders # verb in nested resource
```
## HTTP Methods and Status Codes
### Method Semantics
| Method | Idempotent | Safe | Use For |
|--------|-----------|------|---------|
| GET | Yes | Yes | Retrieve resources |
| POST | No | No | Create resources, trigger actions |
| PUT | Yes | No | Full replacement of a resource |
| PATCH | No* | No | Partial update of a resource |
| DELETE | Yes | No | Remove a resource |
*PATCH can be made idempotent with proper implementation
### Status Code Reference
```
# Success
200 OK — GET, PUT, PATCH (with response body)
201 Created — POST (include Location header)
204 No Content — DELETE, PUT (no response body)
# Client Errors
400 Bad Request — Validation failure, malformed JSON
401 Unauthorized — Missing or invalid authentication
403 Forbidden — Authenticated but not authorized
404 Not Found — Resource doesn't exist
409 Conflict — Duplicate entry, state conflict
422 Unprocessable Entity — Semantically invalid (valid JSON, bad data)
429 Too Many Requests — Rate limit exceeded
# Server Errors
500 Internal Server Error — Unexpected failure (never expose details)
502 Bad Gateway — Upstream service failed
503 Service Unavailable — Temporary overload, include Retry-After
```
### Common Mistakes
```
# BAD: 200 for everything
{ "status": 200, "success": false, "error": "Not found" }
# GOOD: Use HTTP status codes semantically
HTTP/1.1 404 Not Found
{ "error": { "code": "not_found", "message": "User not found" } }
# BAD: 500 for validation errors
# GOOD: 400 or 422 with field-level details
# BAD: 200 for created resources
# GOOD: 201 with Location header
HTTP/1.1 201 Created
Location: /api/v1/users/abc-123
```
## Response Format
### Success Response
```json
{
"data": {
"id": "abc-123",
"email": "alice@example.com",
"name": "Alice",
"created_at": "2025-01-15T10:30:00Z"
}
}
```
### Collection Response (with Pagination)
```json
{
"data": [
{ "id": "abc-123", "name": "Alice" },
{ "id": "def-456", "name": "Bob" }
],
"meta": {
"total": 142,
"page": 1,
"per_page": 20,
"total_pages": 8
},
"links": {
"self": "/api/v1/users?page=1&per_page=20",
"next": "/api/v1/users?page=2&per_page=20",
"last": "/api/v1/users?page=8&per_page=20"
}
}
```
### Error Response
```json
{
"error": {
"code": "validation_error",
"message": "Request validation failed",
"details": [
{
"field": "email",
"message": "Must be a valid email address",
"code": "invalid_format"
},
{
"field": "age",
"message": "Must be between 0 and 150",
"code": "out_of_range"
}
]
}
}
```
### Response Envelope Variants
```typescript
// Option A: Envelope with data wrapper (recommended for public APIs)
interface ApiResponse<T> {
data: T;
meta?: PaginationMeta;
links?: PaginationLinks;
}
interface ApiError {
error: {
code: string;
message: string;
details?: FieldError[];
};
}
// Option B: Flat response (simpler, common for internal APIs)
// Success: just return the resource directly
// Error: return error object
// Distinguish by HTTP status code
```
## Pagination
### Offset-Based (Simple)
```
GET /api/v1/users?page=2&per_page=20
# Implementation
SELECT * FROM users
ORDER BY created_at DESC
LIMIT 20 OFFSET 20;
```
**Pros:** Easy to implement, supports "jump to page N"
**Cons:** Slow on large offsets (OFFSET 100000), inconsistent with concurrent inserts
### Cursor-Based (Scalable)
```
GET /api/v1/users?cursor=eyJpZCI6MTIzfQ&limit=20
# Implementation
SELECT * FROM users
WHERE id > :cursor_id
ORDER BY id ASC
LIMIT 21; -- fetch one extra to determine has_next
```
```json
{
"data": [...],
"meta": {
"has_next": true,
"next_cursor": "eyJpZCI6MTQzfQ"
}
}
```
**Pros:** Consistent performance regardless of position, stable with concurrent inserts
**Cons:** Cannot jump to arbitrary page, cursor is opaque
### When to Use Which
| Use Case | Pagination Type |
|----------|----------------|
| Admin dashboards, small datasets (<10K) | Offset |
| Infinite scroll, feeds, large datasets | Cursor |
| Public APIs | Cursor (default) with offset (optional) |
| Search results | Offset (users expect page numbers) |
## Filtering, Sorting, and Search
### Filtering
```
# Simple equality
GET /api/v1/orders?status=active&customer_id=abc-123
# Comparison operators (use bracket notation)
GET /api/v1/products?price[gte]=10&price[lte]=100
GET /api/v1/orders?created_at[after]=2025-01-01
# Multiple values (comma-separated)
GET /api/v1/products?category=electronics,clothing
# Nested fields (dot notation)
GET /api/v1/orders?customer.country=US
```
### Sorting
```
# Single field (prefix - for descending)
GET /api/v1/products?sort=-created_at
# Multiple fields (comma-separated)
GET /api/v1/products?sort=-featured,price,-created_at
```
### Full-Text Search
```
# Search query parameter
GET /api/v1/products?q=wireless+headphones
# Field-specific search
GET /api/v1/users?email=alice
```
### Sparse Fieldsets
```
# Return only specified fields (reduces payload)
GET /api/v1/users?fields=id,name,email
GET /api/v1/orders?fields=id,total,status&include=customer.name
```
## Authentication and Authorization
### Token-Based Auth
```
# Bearer token in Authorization header
GET /api/v1/users
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
# API key (for server-to-server)
GET /api/v1/data
X-API-Key: sk_live_abc123
```
### Authorization Patterns
```typescript
// Resource-level: check ownership
app.get("/api/v1/orders/:id", async (req, res) => {
const order = await Order.findById(req.params.id);
if (!order) return res.status(404).json({ error: { code: "not_found" } });
if (order.userId !== req.user.id) return res.status(403).json({ error: { code: "forbidden" } });
return res.json({ data: order });
});
// Role-based: check permissions
app.delete("/api/v1/users/:id", requireRole("admin"), async (req, res) => {
await User.delete(req.params.id);
return res.status(204).send();
});
```
## Rate Limiting
### Headers
```
HTTP/1.1 200 OK
X-RateLimit-Limit: 100
X-RateLimit-Remaining: 95
X-RateLimit-Reset: 1640000000
# When exceeded
HTTP/1.1 429 Too Many Requests
Retry-After: 60
{
"error": {
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Try again in 60 seconds."
}
}
```
### Rate Limit Tiers
| Tier | Limit | Window | Use Case |
|------|-------|--------|----------|
| Anonymous | 30/min | Per IP | Public endpoints |
| Authenticated | 100/min | Per user | Standard API access |
| Premium | 1000/min | Per API key | Paid API plans |
| Internal | 10000/min | Per service | Service-to-service |
## Versioning
### URL Path Versioning (Recommended)
```
/api/v1/users
/api/v2/users
```
**Pros:** Explicit, easy to route, cacheable
**Cons:** URL changes between versions
### Header Versioning
```
GET /api/users
Accept: application/vnd.myapp.v2+json
```
**Pros:** Clean URLs
**Cons:** Harder to test, easy to forget
### Versioning Strategy
```
1. Start with /api/v1/ — don't version until you need to
2. Maintain at most 2 active versions (current + previous)
3. Deprecation timeline:
- Announce deprecation (6 months notice for public APIs)
- Add Sunset header: Sunset: Sat, 01 Jan 2026 00:00:00 GMT
- Return 410 Gone after sunset date
4. Non-breaking changes don't need a new version:
- Adding new fields to responses
- Adding new optional query parameters
- Adding new endpoints
5. Breaking changes require a new version:
- Removing or renaming fields
- Changing field types
- Changing URL structure
- Changing authentication method
```
## Implementation Patterns
### TypeScript (Next.js API Route)
```typescript
import { z } from "zod";
import { NextRequest, NextResponse } from "next/server";
const createUserSchema = z.object({
email: z.string().email(),
name: z.string().min(1).max(100),
});
export async function POST(req: NextRequest) {
const body = await req.json();
const parsed = createUserSchema.safeParse(body);
if (!parsed.success) {
return NextResponse.json({
error: {
code: "validation_error",
message: "Request validation failed",
details: parsed.error.issues.map(i => ({
field: i.path.join("."),
message: i.message,
code: i.code,
})),
},
}, { status: 422 });
}
const user = await createUser(parsed.data);
return NextResponse.json(
{ data: user },
{
status: 201,
headers: { Location: `/api/v1/users/${user.id}` },
},
);
}
```
### Python (Django REST Framework)
```python
from rest_framework import serializers, viewsets, status
from rest_framework.response import Response
class CreateUserSerializer(serializers.Serializer):
email = serializers.EmailField()
name = serializers.CharField(max_length=100)
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ["id", "email", "name", "created_at"]
class UserViewSet(viewsets.ModelViewSet):
serializer_class = UserSerializer
permission_classes = [IsAuthenticated]
def get_serializer_class(self):
if self.action == "create":
return CreateUserSerializer
return UserSerializer
def create(self, request):
serializer = CreateUserSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
user = UserService.create(**serializer.validated_data)
return Response(
{"data": UserSerializer(user).data},
status=status.HTTP_201_CREATED,
headers={"Location": f"/api/v1/users/{user.id}"},
)
```
### Go (net/http)
```go
func (h *UserHandler) CreateUser(w http.ResponseWriter, r *http.Request) {
var req CreateUserRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
writeError(w, http.StatusBadRequest, "invalid_json", "Invalid request body")
return
}
if err := req.Validate(); err != nil {
writeError(w, http.StatusUnprocessableEntity, "validation_error", err.Error())
return
}
user, err := h.service.Create(r.Context(), req)
if err != nil {
switch {
case errors.Is(err, domain.ErrEmailTaken):
writeError(w, http.StatusConflict, "email_taken", "Email already registered")
default:
writeError(w, http.StatusInternalServerError, "internal_error", "Internal error")
}
return
}
w.Header().Set("Location", fmt.Sprintf("/api/v1/users/%s", user.ID))
writeJSON(w, http.StatusCreated, map[string]any{"data": user})
}
```
## API Design Checklist
Before shipping a new endpoint:
- [ ] Resource URL follows naming conventions (plural, kebab-case, no verbs)
- [ ] Correct HTTP method used (GET for reads, POST for creates, etc.)
- [ ] Appropriate status codes returned (not 200 for everything)
- [ ] Input validated with schema (Zod, Pydantic, Bean Validation)
- [ ] Error responses follow standard format with codes and messages
- [ ] Pagination implemented for list endpoints (cursor or offset)
- [ ] Authentication required (or explicitly marked as public)
- [ ] Authorization checked (user can only access their own resources)
- [ ] Rate limiting configured
- [ ] Response does not leak internal details (stack traces, SQL errors)
- [ ] Consistent naming with existing endpoints (camelCase vs snake_case)
- [ ] Documented (OpenAPI/Swagger spec updated)
================================================
FILE: .agents/skills/api-design/agents/openai.yaml
================================================
interface:
display_name: "API Design"
short_description: "REST API design patterns and best practices"
brand_color: "#F97316"
default_prompt: "Design REST API: resources, status codes, pagination"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/article-writing/SKILL.md
================================================
---
name: article-writing
description: Write articles, guides, blog posts, tutorials, newsletter issues, and other long-form content in a distinctive voice derived from supplied examples or brand guidance. Use when the user wants polished written content longer than a paragraph, especially when voice consistency, structure, and credibility matter.
origin: ECC
---
# Article Writing
Write long-form content that sounds like a real person or brand, not generic AI output.
## When to Activate
- drafting blog posts, essays, launch posts, guides, tutorials, or newsletter issues
- turning notes, transcripts, or research into polished articles
- matching an existing founder, operator, or brand voice from examples
- tightening structure, pacing, and evidence in already-written long-form copy
## Core Rules
1. Lead with the concrete thing: example, output, anecdote, number, screenshot description, or code block.
2. Explain after the example, not before.
3. Prefer short, direct sentences over padded ones.
4. Use specific numbers when available and sourced.
5. Never invent biographical facts, company metrics, or customer evidence.
## Voice Capture Workflow
If the user wants a specific voice, collect one or more of:
- published articles
- newsletters
- X / LinkedIn posts
- docs or memos
- a short style guide
Then extract:
- sentence length and rhythm
- whether the voice is formal, conversational, or sharp
- favored rhetorical devices such as parentheses, lists, fragments, or questions
- tolerance for humor, opinion, and contrarian framing
- formatting habits such as headers, bullets, code blocks, and pull quotes
If no voice references are given, default to a direct, operator-style voice: concrete, practical, and low on hype.
## Banned Patterns
Delete and rewrite any of these:
- generic openings like "In today's rapidly evolving landscape"
- filler transitions such as "Moreover" and "Furthermore"
- hype phrases like "game-changer", "cutting-edge", or "revolutionary"
- vague claims without evidence
- biography or credibility claims not backed by provided context
## Writing Process
1. Clarify the audience and purpose.
2. Build a skeletal outline with one purpose per section.
3. Start each section with evidence, example, or scene.
4. Expand only where the next sentence earns its place.
5. Remove anything that sounds templated or self-congratulatory.
## Structure Guidance
### Technical Guides
- open with what the reader gets
- use code or terminal examples in every major section
- end with concrete takeaways, not a soft summary
### Essays / Opinion Pieces
- start with tension, contradiction, or a sharp observation
- keep one argument thread per section
- use examples that earn the opinion
### Newsletters
- keep the first screen strong
- mix insight with updates, not diary filler
- use clear section labels and easy skim structure
## Quality Gate
Before delivering:
- verify factual claims against provided sources
- remove filler and corporate language
- confirm the voice matches the supplied examples
- ensure every section adds new information
- check formatting for the intended platform
================================================
FILE: .agents/skills/article-writing/agents/openai.yaml
================================================
interface:
display_name: "Article Writing"
short_description: "Write long-form content in a supplied voice without sounding templated"
brand_color: "#B45309"
default_prompt: "Draft a sharp long-form article from these notes and examples"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/backend-patterns/SKILL.md
================================================
---
name: backend-patterns
description: Backend architecture patterns, API design, database optimization, and server-side best practices for Node.js, Express, and Next.js API routes.
origin: ECC
---
# Backend Development Patterns
Backend architecture patterns and best practices for scalable server-side applications.
## When to Activate
- Designing REST or GraphQL API endpoints
- Implementing repository, service, or controller layers
- Optimizing database queries (N+1, indexing, connection pooling)
- Adding caching (Redis, in-memory, HTTP cache headers)
- Setting up background jobs or async processing
- Structuring error handling and validation for APIs
- Building middleware (auth, logging, rate limiting)
## API Design Patterns
### RESTful API Structure
```typescript
// ✅ Resource-based URLs
GET /api/markets # List resources
GET /api/markets/:id # Get single resource
POST /api/markets # Create resource
PUT /api/markets/:id # Replace resource
PATCH /api/markets/:id # Update resource
DELETE /api/markets/:id # Delete resource
// ✅ Query parameters for filtering, sorting, pagination
GET /api/markets?status=active&sort=volume&limit=20&offset=0
```
### Repository Pattern
```typescript
// Abstract data access logic
interface MarketRepository {
findAll(filters?: MarketFilters): Promise<Market[]>
findById(id: string): Promise<Market | null>
create(data: CreateMarketDto): Promise<Market>
update(id: string, data: UpdateMarketDto): Promise<Market>
delete(id: string): Promise<void>
}
class SupabaseMarketRepository implements MarketRepository {
async findAll(filters?: MarketFilters): Promise<Market[]> {
let query = supabase.from('markets').select('*')
if (filters?.status) {
query = query.eq('status', filters.status)
}
if (filters?.limit) {
query = query.limit(filters.limit)
}
const { data, error } = await query
if (error) throw new Error(error.message)
return data
}
// Other methods...
}
```
### Service Layer Pattern
```typescript
// Business logic separated from data access
class MarketService {
constructor(private marketRepo: MarketRepository) {}
async searchMarkets(query: string, limit: number = 10): Promise<Market[]> {
// Business logic
const embedding = await generateEmbedding(query)
const results = await this.vectorSearch(embedding, limit)
// Fetch full data
const markets = await this.marketRepo.findByIds(results.map(r => r.id))
// Sort by similarity
return markets.sort((a, b) => {
const scoreA = results.find(r => r.id === a.id)?.score || 0
const scoreB = results.find(r => r.id === b.id)?.score || 0
return scoreA - scoreB
})
}
private async vectorSearch(embedding: number[], limit: number) {
// Vector search implementation
}
}
```
### Middleware Pattern
```typescript
// Request/response processing pipeline
export function withAuth(handler: NextApiHandler): NextApiHandler {
return async (req, res) => {
const token = req.headers.authorization?.replace('Bearer ', '')
if (!token) {
return res.status(401).json({ error: 'Unauthorized' })
}
try {
const user = await verifyToken(token)
req.user = user
return handler(req, res)
} catch (error) {
return res.status(401).json({ error: 'Invalid token' })
}
}
}
// Usage
export default withAuth(async (req, res) => {
// Handler has access to req.user
})
```
## Database Patterns
### Query Optimization
```typescript
// ✅ GOOD: Select only needed columns
const { data } = await supabase
.from('markets')
.select('id, name, status, volume')
.eq('status', 'active')
.order('volume', { ascending: false })
.limit(10)
// ❌ BAD: Select everything
const { data } = await supabase
.from('markets')
.select('*')
```
### N+1 Query Prevention
```typescript
// ❌ BAD: N+1 query problem
const markets = await getMarkets()
for (const market of markets) {
market.creator = await getUser(market.creator_id) // N queries
}
// ✅ GOOD: Batch fetch
const markets = await getMarkets()
const creatorIds = markets.map(m => m.creator_id)
const creators = await getUsers(creatorIds) // 1 query
const creatorMap = new Map(creators.map(c => [c.id, c]))
markets.forEach(market => {
market.creator = creatorMap.get(market.creator_id)
})
```
### Transaction Pattern
```typescript
async function createMarketWithPosition(
marketData: CreateMarketDto,
positionData: CreatePositionDto
) {
// Use Supabase transaction
const { data, error } = await supabase.rpc('create_market_with_position', {
market_data: marketData,
position_data: positionData
})
if (error) throw new Error('Transaction failed')
return data
}
// SQL function in Supabase
CREATE OR REPLACE FUNCTION create_market_with_position(
market_data jsonb,
position_data jsonb
)
RETURNS jsonb
LANGUAGE plpgsql
AS $$
BEGIN
-- Start transaction automatically
INSERT INTO markets VALUES (market_data);
INSERT INTO positions VALUES (position_data);
RETURN jsonb_build_object('success', true);
EXCEPTION
WHEN OTHERS THEN
-- Rollback happens automatically
RETURN jsonb_build_object('success', false, 'error', SQLERRM);
END;
$$;
```
## Caching Strategies
### Redis Caching Layer
```typescript
class CachedMarketRepository implements MarketRepository {
constructor(
private baseRepo: MarketRepository,
private redis: RedisClient
) {}
async findById(id: string): Promise<Market | null> {
// Check cache first
const cached = await this.redis.get(`market:${id}`)
if (cached) {
return JSON.parse(cached)
}
// Cache miss - fetch from database
const market = await this.baseRepo.findById(id)
if (market) {
// Cache for 5 minutes
await this.redis.setex(`market:${id}`, 300, JSON.stringify(market))
}
return market
}
async invalidateCache(id: string): Promise<void> {
await this.redis.del(`market:${id}`)
}
}
```
### Cache-Aside Pattern
```typescript
async function getMarketWithCache(id: string): Promise<Market> {
const cacheKey = `market:${id}`
// Try cache
const cached = await redis.get(cacheKey)
if (cached) return JSON.parse(cached)
// Cache miss - fetch from DB
const market = await db.markets.findUnique({ where: { id } })
if (!market) throw new Error('Market not found')
// Update cache
await redis.setex(cacheKey, 300, JSON.stringify(market))
return market
}
```
## Error Handling Patterns
### Centralized Error Handler
```typescript
class ApiError extends Error {
constructor(
public statusCode: number,
public message: string,
public isOperational = true
) {
super(message)
Object.setPrototypeOf(this, ApiError.prototype)
}
}
export function errorHandler(error: unknown, req: Request): Response {
if (error instanceof ApiError) {
return NextResponse.json({
success: false,
error: error.message
}, { status: error.statusCode })
}
if (error instanceof z.ZodError) {
return NextResponse.json({
success: false,
error: 'Validation failed',
details: error.errors
}, { status: 400 })
}
// Log unexpected errors
console.error('Unexpected error:', error)
return NextResponse.json({
success: false,
error: 'Internal server error'
}, { status: 500 })
}
// Usage
export async function GET(request: Request) {
try {
const data = await fetchData()
return NextResponse.json({ success: true, data })
} catch (error) {
return errorHandler(error, request)
}
}
```
### Retry with Exponential Backoff
```typescript
async function fetchWithRetry<T>(
fn: () => Promise<T>,
maxRetries = 3
): Promise<T> {
let lastError: Error
for (let i = 0; i < maxRetries; i++) {
try {
return await fn()
} catch (error) {
lastError = error as Error
if (i < maxRetries - 1) {
// Exponential backoff: 1s, 2s, 4s
const delay = Math.pow(2, i) * 1000
await new Promise(resolve => setTimeout(resolve, delay))
}
}
}
throw lastError!
}
// Usage
const data = await fetchWithRetry(() => fetchFromAPI())
```
## Authentication & Authorization
### JWT Token Validation
```typescript
import jwt from 'jsonwebtoken'
interface JWTPayload {
userId: string
email: string
role: 'admin' | 'user'
}
export function verifyToken(token: string): JWTPayload {
try {
const payload = jwt.verify(token, process.env.JWT_SECRET!) as JWTPayload
return payload
} catch (error) {
throw new ApiError(401, 'Invalid token')
}
}
export async function requireAuth(request: Request) {
const token = request.headers.get('authorization')?.replace('Bearer ', '')
if (!token) {
throw new ApiError(401, 'Missing authorization token')
}
return verifyToken(token)
}
// Usage in API route
export async function GET(request: Request) {
const user = await requireAuth(request)
const data = await getDataForUser(user.userId)
return NextResponse.json({ success: true, data })
}
```
### Role-Based Access Control
```typescript
type Permission = 'read' | 'write' | 'delete' | 'admin'
interface User {
id: string
role: 'admin' | 'moderator' | 'user'
}
const rolePermissions: Record<User['role'], Permission[]> = {
admin: ['read', 'write', 'delete', 'admin'],
moderator: ['read', 'write', 'delete'],
user: ['read', 'write']
}
export function hasPermission(user: User, permission: Permission): boolean {
return rolePermissions[user.role].includes(permission)
}
export function requirePermission(permission: Permission) {
return (handler: (request: Request, user: User) => Promise<Response>) => {
return async (request: Request) => {
const user = await requireAuth(request)
if (!hasPermission(user, permission)) {
throw new ApiError(403, 'Insufficient permissions')
}
return handler(request, user)
}
}
}
// Usage - HOF wraps the handler
export const DELETE = requirePermission('delete')(
async (request: Request, user: User) => {
// Handler receives authenticated user with verified permission
return new Response('Deleted', { status: 200 })
}
)
```
## Rate Limiting
### Simple In-Memory Rate Limiter
```typescript
class RateLimiter {
private requests = new Map<string, number[]>()
async checkLimit(
identifier: string,
maxRequests: number,
windowMs: number
): Promise<boolean> {
const now = Date.now()
const requests = this.requests.get(identifier) || []
// Remove old requests outside window
const recentRequests = requests.filter(time => now - time < windowMs)
if (recentRequests.length >= maxRequests) {
return false // Rate limit exceeded
}
// Add current request
recentRequests.push(now)
this.requests.set(identifier, recentRequests)
return true
}
}
const limiter = new RateLimiter()
export async function GET(request: Request) {
const ip = request.headers.get('x-forwarded-for') || 'unknown'
const allowed = await limiter.checkLimit(ip, 100, 60000) // 100 req/min
if (!allowed) {
return NextResponse.json({
error: 'Rate limit exceeded'
}, { status: 429 })
}
// Continue with request
}
```
## Background Jobs & Queues
### Simple Queue Pattern
```typescript
class JobQueue<T> {
private queue: T[] = []
private processing = false
async add(job: T): Promise<void> {
this.queue.push(job)
if (!this.processing) {
this.process()
}
}
private async process(): Promise<void> {
this.processing = true
while (this.queue.length > 0) {
const job = this.queue.shift()!
try {
await this.execute(job)
} catch (error) {
console.error('Job failed:', error)
}
}
this.processing = false
}
private async execute(job: T): Promise<void> {
// Job execution logic
}
}
// Usage for indexing markets
interface IndexJob {
marketId: string
}
const indexQueue = new JobQueue<IndexJob>()
export async function POST(request: Request) {
const { marketId } = await request.json()
// Add to queue instead of blocking
await indexQueue.add({ marketId })
return NextResponse.json({ success: true, message: 'Job queued' })
}
```
## Logging & Monitoring
### Structured Logging
```typescript
interface LogContext {
userId?: string
requestId?: string
method?: string
path?: string
[key: string]: unknown
}
class Logger {
log(level: 'info' | 'warn' | 'error', message: string, context?: LogContext) {
const entry = {
timestamp: new Date().toISOString(),
level,
message,
...context
}
console.log(JSON.stringify(entry))
}
info(message: string, context?: LogContext) {
this.log('info', message, context)
}
warn(message: string, context?: LogContext) {
this.log('warn', message, context)
}
error(message: string, error: Error, context?: LogContext) {
this.log('error', message, {
...context,
error: error.message,
stack: error.stack
})
}
}
const logger = new Logger()
// Usage
export async function GET(request: Request) {
const requestId = crypto.randomUUID()
logger.info('Fetching markets', {
requestId,
method: 'GET',
path: '/api/markets'
})
try {
const markets = await fetchMarkets()
return NextResponse.json({ success: true, data: markets })
} catch (error) {
logger.error('Failed to fetch markets', error as Error, { requestId })
return NextResponse.json({ error: 'Internal error' }, { status: 500 })
}
}
```
**Remember**: Backend patterns enable scalable, maintainable server-side applications. Choose patterns that fit your complexity level.
================================================
FILE: .agents/skills/backend-patterns/agents/openai.yaml
================================================
interface:
display_name: "Backend Patterns"
short_description: "API design, database, and server-side patterns"
brand_color: "#F59E0B"
default_prompt: "Apply backend patterns: API design, repository, caching"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/bun-runtime/SKILL.md
================================================
---
name: bun-runtime
description: Bun as runtime, package manager, bundler, and test runner. When to choose Bun vs Node, migration notes, and Vercel support.
origin: ECC
---
# Bun Runtime
Bun is a fast all-in-one JavaScript runtime and toolkit: runtime, package manager, bundler, and test runner.
## When to Use
- **Prefer Bun** for: new JS/TS projects, scripts where install/run speed matters, Vercel deployments with Bun runtime, and when you want a single toolchain (run + install + test + build).
- **Prefer Node** for: maximum ecosystem compatibility, legacy tooling that assumes Node, or when a dependency has known Bun issues.
Use when: adopting Bun, migrating from Node, writing or debugging Bun scripts/tests, or configuring Bun on Vercel or other platforms.
## How It Works
- **Runtime**: Drop-in Node-compatible runtime (built on JavaScriptCore, implemented in Zig).
- **Package manager**: `bun install` is significantly faster than npm/yarn. Lockfile is `bun.lock` (text) by default in current Bun; older versions used `bun.lockb` (binary).
- **Bundler**: Built-in bundler and transpiler for apps and libraries.
- **Test runner**: Built-in `bun test` with Jest-like API.
**Migration from Node**: Replace `node script.js` with `bun run script.js` or `bun script.js`. Run `bun install` in place of `npm install`; most packages work. Use `bun run` for npm scripts; `bun x` for npx-style one-off runs. Node built-ins are supported; prefer Bun APIs where they exist for better performance.
**Vercel**: Set runtime to Bun in project settings. Build: `bun run build` or `bun build ./src/index.ts --outdir=dist`. Install: `bun install --frozen-lockfile` for reproducible deploys.
## Examples
### Run and install
```bash
# Install dependencies (creates/updates bun.lock or bun.lockb)
bun install
# Run a script or file
bun run dev
bun run src/index.ts
bun src/index.ts
```
### Scripts and env
```bash
bun run --env-file=.env dev
FOO=bar bun run script.ts
```
### Testing
```bash
bun test
bun test --watch
```
```typescript
// test/example.test.ts
import { expect, test } from "bun:test";
test("add", () => {
expect(1 + 2).toBe(3);
});
```
### Runtime API
```typescript
const file = Bun.file("package.json");
const json = await file.json();
Bun.serve({
port: 3000,
fetch(req) {
return new Response("Hello");
},
});
```
## Best Practices
- Commit the lockfile (`bun.lock` or `bun.lockb`) for reproducible installs.
- Prefer `bun run` for scripts. For TypeScript, Bun runs `.ts` natively.
- Keep dependencies up to date; Bun and the ecosystem evolve quickly.
================================================
FILE: .agents/skills/bun-runtime/agents/openai.yaml
================================================
interface:
display_name: "Bun Runtime"
short_description: "Bun as runtime, package manager, bundler, and test runner"
brand_color: "#FBF0DF"
default_prompt: "Use Bun for scripts, install, or run"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/claude-api/SKILL.md
================================================
---
name: claude-api
description: Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.
origin: ECC
---
# Claude API
Build applications with the Anthropic Claude API and SDKs.
## When to Activate
- Building applications that call the Claude API
- Code imports `anthropic` (Python) or `@anthropic-ai/sdk` (TypeScript)
- User asks about Claude API patterns, tool use, streaming, or vision
- Implementing agent workflows with Claude Agent SDK
- Optimizing API costs, token usage, or latency
## Model Selection
| Model | ID | Best For |
|-------|-----|----------|
| Opus 4.6 | `claude-opus-4-6` | Complex reasoning, architecture, research |
| Sonnet 4.6 | `claude-sonnet-4-6` | Balanced coding, most development tasks |
| Haiku 4.5 | `claude-haiku-4-5-20251001` | Fast responses, high-volume, cost-sensitive |
Default to Sonnet 4.6 unless the task requires deep reasoning (Opus) or speed/cost optimization (Haiku).
## Python SDK
### Installation
```bash
pip install anthropic
```
### Basic Message
```python
import anthropic
client = anthropic.Anthropic() # reads ANTHROPIC_API_KEY from env
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[
{"role": "user", "content": "Explain async/await in Python"}
]
)
print(message.content[0].text)
```
### Streaming
```python
with client.messages.stream(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{"role": "user", "content": "Write a haiku about coding"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
```
### System Prompt
```python
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system="You are a senior Python developer. Be concise.",
messages=[{"role": "user", "content": "Review this function"}]
)
```
## TypeScript SDK
### Installation
```bash
npm install @anthropic-ai/sdk
```
### Basic Message
```typescript
import Anthropic from "@anthropic-ai/sdk";
const client = new Anthropic(); // reads ANTHROPIC_API_KEY from env
const message = await client.messages.create({
model: "claude-sonnet-4-6",
max_tokens: 1024,
messages: [
{ role: "user", content: "Explain async/await in TypeScript" }
],
});
console.log(message.content[0].text);
```
### Streaming
```typescript
const stream = client.messages.stream({
model: "claude-sonnet-4-6",
max_tokens: 1024,
messages: [{ role: "user", content: "Write a haiku" }],
});
for await (const event of stream) {
if (event.type === "content_block_delta" && event.delta.type === "text_delta") {
process.stdout.write(event.delta.text);
}
}
```
## Tool Use
Define tools and let Claude call them:
```python
tools = [
{
"name": "get_weather",
"description": "Get current weather for a location",
"input_schema": {
"type": "object",
"properties": {
"location": {"type": "string", "description": "City name"},
"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]}
},
"required": ["location"]
}
}
]
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=[{"role": "user", "content": "What's the weather in SF?"}]
)
# Handle tool use response
for block in message.content:
if block.type == "tool_use":
# Execute the tool with block.input
result = get_weather(**block.input)
# Send result back
follow_up = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
tools=tools,
messages=[
{"role": "user", "content": "What's the weather in SF?"},
{"role": "assistant", "content": message.content},
{"role": "user", "content": [
{"type": "tool_result", "tool_use_id": block.id, "content": str(result)}
]}
]
)
```
## Vision
Send images for analysis:
```python
import base64
with open("diagram.png", "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": image_data}},
{"type": "text", "text": "Describe this diagram"}
]
}]
)
```
## Extended Thinking
For complex reasoning tasks:
```python
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=16000,
thinking={
"type": "enabled",
"budget_tokens": 10000
},
messages=[{"role": "user", "content": "Solve this math problem step by step..."}]
)
for block in message.content:
if block.type == "thinking":
print(f"Thinking: {block.thinking}")
elif block.type == "text":
print(f"Answer: {block.text}")
```
## Prompt Caching
Cache large system prompts or context to reduce costs:
```python
message = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=1024,
system=[
{"type": "text", "text": large_system_prompt, "cache_control": {"type": "ephemeral"}}
],
messages=[{"role": "user", "content": "Question about the cached context"}]
)
# Check cache usage
print(f"Cache read: {message.usage.cache_read_input_tokens}")
print(f"Cache creation: {message.usage.cache_creation_input_tokens}")
```
## Batches API
Process large volumes asynchronously at 50% cost reduction:
```python
import time
batch = client.messages.batches.create(
requests=[
{
"custom_id": f"request-{i}",
"params": {
"model": "claude-sonnet-4-6",
"max_tokens": 1024,
"messages": [{"role": "user", "content": prompt}]
}
}
for i, prompt in enumerate(prompts)
]
)
# Poll for completion
while True:
status = client.messages.batches.retrieve(batch.id)
if status.processing_status == "ended":
break
time.sleep(30)
# Get results
for result in client.messages.batches.results(batch.id):
print(result.result.message.content[0].text)
```
## Claude Agent SDK
Build multi-step agents:
```python
# Note: Agent SDK API surface may change — check official docs
import anthropic
# Define tools as functions
tools = [{
"name": "search_codebase",
"description": "Search the codebase for relevant code",
"input_schema": {
"type": "object",
"properties": {"query": {"type": "string"}},
"required": ["query"]
}
}]
# Run an agentic loop with tool use
client = anthropic.Anthropic()
messages = [{"role": "user", "content": "Review the auth module for security issues"}]
while True:
response = client.messages.create(
model="claude-sonnet-4-6",
max_tokens=4096,
tools=tools,
messages=messages,
)
if response.stop_reason == "end_turn":
break
# Handle tool calls and continue the loop
messages.append({"role": "assistant", "content": response.content})
# ... execute tools and append tool_result messages
```
## Cost Optimization
| Strategy | Savings | When to Use |
|----------|---------|-------------|
| Prompt caching | Up to 90% on cached tokens | Repeated system prompts or context |
| Batches API | 50% | Non-time-sensitive bulk processing |
| Haiku instead of Sonnet | ~75% | Simple tasks, classification, extraction |
| Shorter max_tokens | Variable | When you know output will be short |
| Streaming | None (same cost) | Better UX, same price |
## Error Handling
```python
import time
from anthropic import APIError, RateLimitError, APIConnectionError
try:
message = client.messages.create(...)
except RateLimitError:
# Back off and retry
time.sleep(60)
except APIConnectionError:
# Network issue, retry with backoff
pass
except APIError as e:
print(f"API error {e.status_code}: {e.message}")
```
## Environment Setup
```bash
# Required
export ANTHROPIC_API_KEY="your-api-key-here"
# Optional: set default model
export ANTHROPIC_MODEL="claude-sonnet-4-6"
```
Never hardcode API keys. Always use environment variables.
================================================
FILE: .agents/skills/claude-api/agents/openai.yaml
================================================
interface:
display_name: "Claude API"
short_description: "Anthropic Claude API patterns and SDKs"
brand_color: "#D97706"
default_prompt: "Build applications with the Claude API using Messages, tool use, streaming, and Agent SDK"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/coding-standards/SKILL.md
================================================
---
name: coding-standards
description: Universal coding standards, best practices, and patterns for TypeScript, JavaScript, React, and Node.js development.
origin: ECC
---
# Coding Standards & Best Practices
Universal coding standards applicable across all projects.
## When to Activate
- Starting a new project or module
- Reviewing code for quality and maintainability
- Refactoring existing code to follow conventions
- Enforcing naming, formatting, or structural consistency
- Setting up linting, formatting, or type-checking rules
- Onboarding new contributors to coding conventions
## Code Quality Principles
### 1. Readability First
- Code is read more than written
- Clear variable and function names
- Self-documenting code preferred over comments
- Consistent formatting
### 2. KISS (Keep It Simple, Stupid)
- Simplest solution that works
- Avoid over-engineering
- No premature optimization
- Easy to understand > clever code
### 3. DRY (Don't Repeat Yourself)
- Extract common logic into functions
- Create reusable components
- Share utilities across modules
- Avoid copy-paste programming
### 4. YAGNI (You Aren't Gonna Need It)
- Don't build features before they're needed
- Avoid speculative generality
- Add complexity only when required
- Start simple, refactor when needed
## TypeScript/JavaScript Standards
### Variable Naming
```typescript
// ✅ GOOD: Descriptive names
const marketSearchQuery = 'election'
const isUserAuthenticated = true
const totalRevenue = 1000
// ❌ BAD: Unclear names
const q = 'election'
const flag = true
const x = 1000
```
### Function Naming
```typescript
// ✅ GOOD: Verb-noun pattern
async function fetchMarketData(marketId: string) { }
function calculateSimilarity(a: number[], b: number[]) { }
function isValidEmail(email: string): boolean { }
// ❌ BAD: Unclear or noun-only
async function market(id: string) { }
function similarity(a, b) { }
function email(e) { }
```
### Immutability Pattern (CRITICAL)
```typescript
// ✅ ALWAYS use spread operator
const updatedUser = {
...user,
name: 'New Name'
}
const updatedArray = [...items, newItem]
// ❌ NEVER mutate directly
user.name = 'New Name' // BAD
items.push(newItem) // BAD
```
### Error Handling
```typescript
// ✅ GOOD: Comprehensive error handling
async function fetchData(url: string) {
try {
const response = await fetch(url)
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`)
}
return await response.json()
} catch (error) {
console.error('Fetch failed:', error)
throw new Error('Failed to fetch data')
}
}
// ❌ BAD: No error handling
async function fetchData(url) {
const response = await fetch(url)
return response.json()
}
```
### Async/Await Best Practices
```typescript
// ✅ GOOD: Parallel execution when possible
const [users, markets, stats] = await Promise.all([
fetchUsers(),
fetchMarkets(),
fetchStats()
])
// ❌ BAD: Sequential when unnecessary
const users = await fetchUsers()
const markets = await fetchMarkets()
const stats = await fetchStats()
```
### Type Safety
```typescript
// ✅ GOOD: Proper types
interface Market {
id: string
name: string
status: 'active' | 'resolved' | 'closed'
created_at: Date
}
function getMarket(id: string): Promise<Market> {
// Implementation
}
// ❌ BAD: Using 'any'
function getMarket(id: any): Promise<any> {
// Implementation
}
```
## React Best Practices
### Component Structure
```typescript
// ✅ GOOD: Functional component with types
interface ButtonProps {
children: React.ReactNode
onClick: () => void
disabled?: boolean
variant?: 'primary' | 'secondary'
}
export function Button({
children,
onClick,
disabled = false,
variant = 'primary'
}: ButtonProps) {
return (
<button
onClick={onClick}
disabled={disabled}
className={`btn btn-${variant}`}
>
{children}
</button>
)
}
// ❌ BAD: No types, unclear structure
export function Button(props) {
return <button onClick={props.onClick}>{props.children}</button>
}
```
### Custom Hooks
```typescript
// ✅ GOOD: Reusable custom hook
export function useDebounce<T>(value: T, delay: number): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value)
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value)
}, delay)
return () => clearTimeout(handler)
}, [value, delay])
return debouncedValue
}
// Usage
const debouncedQuery = useDebounce(searchQuery, 500)
```
### State Management
```typescript
// ✅ GOOD: Proper state updates
const [count, setCount] = useState(0)
// Functional update for state based on previous state
setCount(prev => prev + 1)
// ❌ BAD: Direct state reference
setCount(count + 1) // Can be stale in async scenarios
```
### Conditional Rendering
```typescript
// ✅ GOOD: Clear conditional rendering
{isLoading && <Spinner />}
{error && <ErrorMessage error={error} />}
{data && <DataDisplay data={data} />}
// ❌ BAD: Ternary hell
{isLoading ? <Spinner /> : error ? <ErrorMessage error={error} /> : data ? <DataDisplay data={data} /> : null}
```
## API Design Standards
### REST API Conventions
```
GET /api/markets # List all markets
GET /api/markets/:id # Get specific market
POST /api/markets # Create new market
PUT /api/markets/:id # Update market (full)
PATCH /api/markets/:id # Update market (partial)
DELETE /api/markets/:id # Delete market
# Query parameters for filtering
GET /api/markets?status=active&limit=10&offset=0
```
### Response Format
```typescript
// ✅ GOOD: Consistent response structure
interface ApiResponse<T> {
success: boolean
data?: T
error?: string
meta?: {
total: number
page: number
limit: number
}
}
// Success response
return NextResponse.json({
success: true,
data: markets,
meta: { total: 100, page: 1, limit: 10 }
})
// Error response
return NextResponse.json({
success: false,
error: 'Invalid request'
}, { status: 400 })
```
### Input Validation
```typescript
import { z } from 'zod'
// ✅ GOOD: Schema validation
const CreateMarketSchema = z.object({
name: z.string().min(1).max(200),
description: z.string().min(1).max(2000),
endDate: z.string().datetime(),
categories: z.array(z.string()).min(1)
})
export async function POST(request: Request) {
const body = await request.json()
try {
const validated = CreateMarketSchema.parse(body)
// Proceed with validated data
} catch (error) {
if (error instanceof z.ZodError) {
return NextResponse.json({
success: false,
error: 'Validation failed',
details: error.errors
}, { status: 400 })
}
}
}
```
## File Organization
### Project Structure
```
src/
├── app/ # Next.js App Router
│ ├── api/ # API routes
│ ├── markets/ # Market pages
│ └── (auth)/ # Auth pages (route groups)
├── components/ # React components
│ ├── ui/ # Generic UI components
│ ├── forms/ # Form components
│ └── layouts/ # Layout components
├── hooks/ # Custom React hooks
├── lib/ # Utilities and configs
│ ├── api/ # API clients
│ ├── utils/ # Helper functions
│ └── constants/ # Constants
├── types/ # TypeScript types
└── styles/ # Global styles
```
### File Naming
```
components/Button.tsx # PascalCase for components
hooks/useAuth.ts # camelCase with 'use' prefix
lib/formatDate.ts # camelCase for utilities
types/market.types.ts # camelCase with .types suffix
```
## Comments & Documentation
### When to Comment
```typescript
// ✅ GOOD: Explain WHY, not WHAT
// Use exponential backoff to avoid overwhelming the API during outages
const delay = Math.min(1000 * Math.pow(2, retryCount), 30000)
// Deliberately using mutation here for performance with large arrays
items.push(newItem)
// ❌ BAD: Stating the obvious
// Increment counter by 1
count++
// Set name to user's name
name = user.name
```
### JSDoc for Public APIs
```typescript
/**
* Searches markets using semantic similarity.
*
* @param query - Natural language search query
* @param limit - Maximum number of results (default: 10)
* @returns Array of markets sorted by similarity score
* @throws {Error} If OpenAI API fails or Redis unavailable
*
* @example
* ```typescript
* const results = await searchMarkets('election', 5)
* console.log(results[0].name) // "Trump vs Biden"
* ```
*/
export async function searchMarkets(
query: string,
limit: number = 10
): Promise<Market[]> {
// Implementation
}
```
## Performance Best Practices
### Memoization
```typescript
import { useMemo, useCallback } from 'react'
// ✅ GOOD: Memoize expensive computations
const sortedMarkets = useMemo(() => {
return markets.sort((a, b) => b.volume - a.volume)
}, [markets])
// ✅ GOOD: Memoize callbacks
const handleSearch = useCallback((query: string) => {
setSearchQuery(query)
}, [])
```
### Lazy Loading
```typescript
import { lazy, Suspense } from 'react'
// ✅ GOOD: Lazy load heavy components
const HeavyChart = lazy(() => import('./HeavyChart'))
export function Dashboard() {
return (
<Suspense fallback={<Spinner />}>
<HeavyChart />
</Suspense>
)
}
```
### Database Queries
```typescript
// ✅ GOOD: Select only needed columns
const { data } = await supabase
.from('markets')
.select('id, name, status')
.limit(10)
// ❌ BAD: Select everything
const { data } = await supabase
.from('markets')
.select('*')
```
## Testing Standards
### Test Structure (AAA Pattern)
```typescript
test('calculates similarity correctly', () => {
// Arrange
const vector1 = [1, 0, 0]
const vector2 = [0, 1, 0]
// Act
const similarity = calculateCosineSimilarity(vector1, vector2)
// Assert
expect(similarity).toBe(0)
})
```
### Test Naming
```typescript
// ✅ GOOD: Descriptive test names
test('returns empty array when no markets match query', () => { })
test('throws error when OpenAI API key is missing', () => { })
test('falls back to substring search when Redis unavailable', () => { })
// ❌ BAD: Vague test names
test('works', () => { })
test('test search', () => { })
```
## Code Smell Detection
Watch for these anti-patterns:
### 1. Long Functions
```typescript
// ❌ BAD: Function > 50 lines
function processMarketData() {
// 100 lines of code
}
// ✅ GOOD: Split into smaller functions
function processMarketData() {
const validated = validateData()
const transformed = transformData(validated)
return saveData(transformed)
}
```
### 2. Deep Nesting
```typescript
// ❌ BAD: 5+ levels of nesting
if (user) {
if (user.isAdmin) {
if (market) {
if (market.isActive) {
if (hasPermission) {
// Do something
}
}
}
}
}
// ✅ GOOD: Early returns
if (!user) return
if (!user.isAdmin) return
if (!market) return
if (!market.isActive) return
if (!hasPermission) return
// Do something
```
### 3. Magic Numbers
```typescript
// ❌ BAD: Unexplained numbers
if (retryCount > 3) { }
setTimeout(callback, 500)
// ✅ GOOD: Named constants
const MAX_RETRIES = 3
const DEBOUNCE_DELAY_MS = 500
if (retryCount > MAX_RETRIES) { }
setTimeout(callback, DEBOUNCE_DELAY_MS)
```
**Remember**: Code quality is not negotiable. Clear, maintainable code enables rapid development and confident refactoring.
================================================
FILE: .agents/skills/coding-standards/agents/openai.yaml
================================================
interface:
display_name: "Coding Standards"
short_description: "Universal coding standards and best practices"
brand_color: "#3B82F6"
default_prompt: "Apply standards: immutability, error handling, type safety"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/content-engine/SKILL.md
================================================
---
name: content-engine
description: Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.
origin: ECC
---
# Content Engine
Turn one idea into strong, platform-native content instead of posting the same thing everywhere.
## When to Activate
- writing X posts or threads
- drafting LinkedIn posts or launch updates
- scripting short-form video or YouTube explainers
- repurposing articles, podcasts, demos, or docs into social content
- building a lightweight content plan around a launch, milestone, or theme
## First Questions
Clarify:
- source asset: what are we adapting from
- audience: builders, investors, customers, operators, or general audience
- platform: X, LinkedIn, TikTok, YouTube, newsletter, or multi-platform
- goal: awareness, conversion, recruiting, authority, launch support, or engagement
## Core Rules
1. Adapt for the platform. Do not cross-post the same copy.
2. Hooks matter more than summaries.
3. Every post should carry one clear idea.
4. Use specifics over slogans.
5. Keep the ask small and clear.
## Platform Guidance
### X
- open fast
- one idea per post or per tweet in a thread
- keep links out of the main body unless necessary
- avoid hashtag spam
### LinkedIn
- strong first line
- short paragraphs
- more explicit framing around lessons, results, and takeaways
### TikTok / Short Video
- first 3 seconds must interrupt attention
- script around visuals, not just narration
- one demo, one claim, one CTA
### YouTube
- show the result early
- structure by chapter
- refresh the visual every 20-30 seconds
### Newsletter
- deliver one clear lens, not a bundle of unrelated items
- make section titles skimmable
- keep the opening paragraph doing real work
## Repurposing Flow
Default cascade:
1. anchor asset: article, video, demo, memo, or launch doc
2. extract 3-7 atomic ideas
3. write platform-native variants
4. trim repetition across outputs
5. align CTAs with platform intent
## Deliverables
When asked for a campaign, return:
- the core angle
- platform-specific drafts
- optional posting order
- optional CTA variants
- any missing inputs needed before publishing
## Quality Gate
Before delivering:
- each draft reads natively for its platform
- hooks are strong and specific
- no generic hype language
- no duplicated copy across platforms unless requested
- the CTA matches the content and audience
================================================
FILE: .agents/skills/content-engine/agents/openai.yaml
================================================
interface:
display_name: "Content Engine"
short_description: "Turn one idea into platform-native social and content outputs"
brand_color: "#DC2626"
default_prompt: "Turn this source asset into strong multi-platform content"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/crosspost/SKILL.md
================================================
---
name: crosspost
description: Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.
origin: ECC
---
# Crosspost
Distribute content across multiple social platforms with platform-native adaptation.
## When to Activate
- User wants to post content to multiple platforms
- Publishing announcements, launches, or updates across social media
- Repurposing a post from one platform to others
- User says "crosspost", "post everywhere", "share on all platforms", or "distribute this"
## Core Rules
1. **Never post identical content cross-platform.** Each platform gets a native adaptation.
2. **Primary platform first.** Post to the main platform, then adapt for others.
3. **Respect platform conventions.** Length limits, formatting, link handling all differ.
4. **One idea per post.** If the source content has multiple ideas, split across posts.
5. **Attribution matters.** If crossposting someone else's content, credit the source.
## Platform Specifications
| Platform | Max Length | Link Handling | Hashtags | Media |
|----------|-----------|---------------|----------|-------|
| X | 280 chars (4000 for Premium) | Counted in length | Minimal (1-2 max) | Images, video, GIFs |
| LinkedIn | 3000 chars | Not counted in length | 3-5 relevant | Images, video, docs, carousels |
| Threads | 500 chars | Separate link attachment | None typical | Images, video |
| Bluesky | 300 chars | Via facets (rich text) | None (use feeds) | Images |
## Workflow
### Step 1: Create Source Content
Start with the core idea. Use `content-engine` skill for high-quality drafts:
- Identify the single core message
- Determine the primary platform (where the audience is biggest)
- Draft the primary platform version first
### Step 2: Identify Target Platforms
Ask the user or determine from context:
- Which platforms to target
- Priority order (primary gets the best version)
- Any platform-specific requirements (e.g., LinkedIn needs professional tone)
### Step 3: Adapt Per Platform
For each target platform, transform the content:
**X adaptation:**
- Open with a hook, not a summary
- Cut to the core insight fast
- Keep links out of main body when possible
- Use thread format for longer content
**LinkedIn adaptation:**
- Strong first line (visible before "see more")
- Short paragraphs with line breaks
- Frame around lessons, results, or professional takeaways
- More explicit context than X (LinkedIn audience needs framing)
**Threads adaptation:**
- Conversational, casual tone
- Shorter than LinkedIn, less compressed than X
- Visual-first if possible
**Bluesky adaptation:**
- Direct and concise (300 char limit)
- Community-oriented tone
- Use feeds/lists for topic targeting instead of hashtags
### Step 4: Post Primary Platform
Post to the primary platform first:
- Use `x-api` skill for X
- Use platform-specific APIs or tools for others
- Capture the post URL for cross-referencing
### Step 5: Post to Secondary Platforms
Post adapted versions to remaining platforms:
- Stagger timing (not all at once — 30-60 min gaps)
- Include cross-platform references where appropriate ("longer thread on X" etc.)
## Content Adaptation Examples
### Source: Product Launch
**X version:**
```
We just shipped [feature].
[One specific thing it does that's impressive]
[Link]
```
**LinkedIn version:**
```
Excited to share: we just launched [feature] at [Company].
Here's why it matters:
[2-3 short paragraphs with context]
[Takeaway for the audience]
[Link]
```
**Threads version:**
```
just shipped something cool — [feature]
[casual explanation of what it does]
link in bio
```
### Source: Technical Insight
**X version:**
```
TIL: [specific technical insight]
[Why it matters in one sentence]
```
**LinkedIn version:**
```
A pattern I've been using that's made a real difference:
[Technical insight with professional framing]
[How it applies to teams/orgs]
#relevantHashtag
```
## API Integration
### Batch Crossposting Service (Example Pattern)
If using a crossposting service (e.g., Postbridge, Buffer, or a custom API), the pattern looks like:
```python
import os
import requests
resp = requests.post(
"https://api.postbridge.io/v1/posts",
headers={"Authorization": f"Bearer {os.environ['POSTBRIDGE_API_KEY']}"},
json={
"platforms": ["twitter", "linkedin", "threads"],
"content": {
"twitter": {"text": x_version},
"linkedin": {"text": linkedin_version},
"threads": {"text": threads_version}
}
}
)
```
### Manual Posting
Without Postbridge, post to each platform using its native API:
- X: Use `x-api` skill patterns
- LinkedIn: LinkedIn API v2 with OAuth 2.0
- Threads: Threads API (Meta)
- Bluesky: AT Protocol API
## Quality Gate
Before posting:
- [ ] Each platform version reads naturally for that platform
- [ ] No identical content across platforms
- [ ] Length limits respected
- [ ] Links work and are placed appropriately
- [ ] Tone matches platform conventions
- [ ] Media is sized correctly for each platform
## Related Skills
- `content-engine` — Generate platform-native content
- `x-api` — X/Twitter API integration
================================================
FILE: .agents/skills/crosspost/agents/openai.yaml
================================================
interface:
display_name: "Crosspost"
short_description: "Multi-platform content distribution with native adaptation"
brand_color: "#EC4899"
default_prompt: "Distribute content across X, LinkedIn, Threads, and Bluesky with platform-native adaptation"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/deep-research/SKILL.md
================================================
---
name: deep-research
description: Multi-source deep research using firecrawl and exa MCPs. Searches the web, synthesizes findings, and delivers cited reports with source attribution. Use when the user wants thorough research on any topic with evidence and citations.
origin: ECC
---
# Deep Research
Produce thorough, cited research reports from multiple web sources using firecrawl and exa MCP tools.
## When to Activate
- User asks to research any topic in depth
- Competitive analysis, technology evaluation, or market sizing
- Due diligence on companies, investors, or technologies
- Any question requiring synthesis from multiple sources
- User says "research", "deep dive", "investigate", or "what's the current state of"
## MCP Requirements
At least one of:
- **firecrawl** — `firecrawl_search`, `firecrawl_scrape`, `firecrawl_crawl`
- **exa** — `web_search_exa`, `web_search_advanced_exa`, `crawling_exa`
Both together give the best coverage. Configure in `~/.claude.json` or `~/.codex/config.toml`.
## Workflow
### Step 1: Understand the Goal
Ask 1-2 quick clarifying questions:
- "What's your goal — learning, making a decision, or writing something?"
- "Any specific angle or depth you want?"
If the user says "just research it" — skip ahead with reasonable defaults.
### Step 2: Plan the Research
Break the topic into 3-5 research sub-questions. Example:
- Topic: "Impact of AI on healthcare"
- What are the main AI applications in healthcare today?
- What clinical outcomes have been measured?
- What are the regulatory challenges?
- What companies are leading this space?
- What's the market size and growth trajectory?
### Step 3: Execute Multi-Source Search
For EACH sub-question, search using available MCP tools:
**With firecrawl:**
```
firecrawl_search(query: "<sub-question keywords>", limit: 8)
```
**With exa:**
```
web_search_exa(query: "<sub-question keywords>", numResults: 8)
web_search_advanced_exa(query: "<keywords>", numResults: 5, startPublishedDate: "2025-01-01")
```
**Search strategy:**
- Use 2-3 different keyword variations per sub-question
- Mix general and news-focused queries
- Aim for 15-30 unique sources total
- Prioritize: academic, official, reputable news > blogs > forums
### Step 4: Deep-Read Key Sources
For the most promising URLs, fetch full content:
**With firecrawl:**
```
firecrawl_scrape(url: "<url>")
```
**With exa:**
```
crawling_exa(url: "<url>", tokensNum: 5000)
```
Read 3-5 key sources in full for depth. Do not rely only on search snippets.
### Step 5: Synthesize and Write Report
Structure the report:
```markdown
# [Topic]: Research Report
*Generated: [date] | Sources: [N] | Confidence: [High/Medium/Low]*
## Executive Summary
[3-5 sentence overview of key findings]
## 1. [First Major Theme]
[Findings with inline citations]
- Key point ([Source Name](url))
- Supporting data ([Source Name](url))
## 2. [Second Major Theme]
...
## 3. [Third Major Theme]
...
## Key Takeaways
- [Actionable insight 1]
- [Actionable insight 2]
- [Actionable insight 3]
## Sources
1. [Title](url) — [one-line summary]
2. ...
## Methodology
Searched [N] queries across web and news. Analyzed [M] sources.
Sub-questions investigated: [list]
```
### Step 6: Deliver
- **Short topics**: Post the full report in chat
- **Long reports**: Post the executive summary + key takeaways, save full report to a file
## Parallel Research with Subagents
For broad topics, use Claude Code's Task tool to parallelize:
```
Launch 3 research agents in parallel:
1. Agent 1: Research sub-questions 1-2
2. Agent 2: Research sub-questions 3-4
3. Agent 3: Research sub-question 5 + cross-cutting themes
```
Each agent searches, reads sources, and returns findings. The main session synthesizes into the final report.
## Quality Rules
1. **Every claim needs a source.** No unsourced assertions.
2. **Cross-reference.** If only one source says it, flag it as unverified.
3. **Recency matters.** Prefer sources from the last 12 months.
4. **Acknowledge gaps.** If you couldn't find good info on a sub-question, say so.
5. **No hallucination.** If you don't know, say "insufficient data found."
6. **Separate fact from inference.** Label estimates, projections, and opinions clearly.
## Examples
```
"Research the current state of nuclear fusion energy"
"Deep dive into Rust vs Go for backend services in 2026"
"Research the best strategies for bootstrapping a SaaS business"
"What's happening with the US housing market right now?"
"Investigate the competitive landscape for AI code editors"
```
================================================
FILE: .agents/skills/deep-research/agents/openai.yaml
================================================
interface:
display_name: "Deep Research"
short_description: "Multi-source deep research with firecrawl and exa MCPs"
brand_color: "#6366F1"
default_prompt: "Research the given topic using firecrawl and exa, produce a cited report"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/dmux-workflows/SKILL.md
================================================
---
name: dmux-workflows
description: Multi-agent orchestration using dmux (tmux pane manager for AI agents). Patterns for parallel agent workflows across Claude Code, Codex, OpenCode, and other harnesses. Use when running multiple agent sessions in parallel or coordinating multi-agent development workflows.
origin: ECC
---
# dmux Workflows
Orchestrate parallel AI agent sessions using dmux, a tmux pane manager for agent harnesses.
## When to Activate
- Running multiple agent sessions in parallel
- Coordinating work across Claude Code, Codex, and other harnesses
- Complex tasks that benefit from divide-and-conquer parallelism
- User says "run in parallel", "split this work", "use dmux", or "multi-agent"
## What is dmux
dmux is a tmux-based orchestration tool that manages AI agent panes:
- Press `n` to create a new pane with a prompt
- Press `m` to merge pane output back to the main session
- Supports: Claude Code, Codex, OpenCode, Cline, Gemini, Qwen
**Install:** `npm install -g dmux` or see [github.com/standardagents/dmux](https://github.com/standardagents/dmux)
## Quick Start
```bash
# Start dmux session
dmux
# Create agent panes (press 'n' in dmux, then type prompt)
# Pane 1: "Implement the auth middleware in src/auth/"
# Pane 2: "Write tests for the user service"
# Pane 3: "Update API documentation"
# Each pane runs its own agent session
# Press 'm' to merge results back
```
## Workflow Patterns
### Pattern 1: Research + Implement
Split research and implementation into parallel tracks:
```
Pane 1 (Research): "Research best practices for rate limiting in Node.js.
Check current libraries, compare approaches, and write findings to
/tmp/rate-limit-research.md"
Pane 2 (Implement): "Implement rate limiting middleware for our Express API.
Start with a basic token bucket, we'll refine after research completes."
# After Pane 1 completes, merge findings into Pane 2's context
```
### Pattern 2: Multi-File Feature
Parallelize work across independent files:
```
Pane 1: "Create the database schema and migrations for the billing feature"
Pane 2: "Build the billing API endpoints in src/api/billing/"
Pane 3: "Create the billing dashboard UI components"
# Merge all, then do integration in main pane
```
### Pattern 3: Test + Fix Loop
Run tests in one pane, fix in another:
```
Pane 1 (Watcher): "Run the test suite in watch mode. When tests fail,
summarize the failures."
Pane 2 (Fixer): "Fix failing tests based on the error output from pane 1"
```
### Pattern 4: Cross-Harness
Use different AI tools for different tasks:
```
Pane 1 (Claude Code): "Review the security of the auth module"
Pane 2 (Codex): "Refactor the utility functions for performance"
Pane 3 (Claude Code): "Write E2E tests for the checkout flow"
```
### Pattern 5: Code Review Pipeline
Parallel review perspectives:
```
Pane 1: "Review src/api/ for security vulnerabilities"
Pane 2: "Review src/api/ for performance issues"
Pane 3: "Review src/api/ for test coverage gaps"
# Merge all reviews into a single report
```
## Best Practices
1. **Independent tasks only.** Don't parallelize tasks that depend on each other's output.
2. **Clear boundaries.** Each pane should work on distinct files or concerns.
3. **Merge strategically.** Review pane output before merging to avoid conflicts.
4. **Use git worktrees.** For file-conflict-prone work, use separate worktrees per pane.
5. **Resource awareness.** Each pane uses API tokens — keep total panes under 5-6.
## Git Worktree Integration
For tasks that touch overlapping files:
```bash
# Create worktrees for isolation
git worktree add ../feature-auth feat/auth
git worktree add ../feature-billing feat/billing
# Run agents in separate worktrees
# Pane 1: cd ../feature-auth && claude
# Pane 2: cd ../feature-billing && claude
# Merge branches when done
git merge feat/auth
git merge feat/billing
```
## Complementary Tools
| Tool | What It Does | When to Use |
|------|-------------|-------------|
| **dmux** | tmux pane management for agents | Parallel agent sessions |
| **Superset** | Terminal IDE for 10+ parallel agents | Large-scale orchestration |
| **Claude Code Task tool** | In-process subagent spawning | Programmatic parallelism within a session |
| **Codex multi-agent** | Built-in agent roles | Codex-specific parallel work |
## Troubleshooting
- **Pane not responding:** Check if the agent session is waiting for input. Use `m` to read output.
- **Merge conflicts:** Use git worktrees to isolate file changes per pane.
- **High token usage:** Reduce number of parallel panes. Each pane is a full agent session.
- **tmux not found:** Install with `brew install tmux` (macOS) or `apt install tmux` (Linux).
================================================
FILE: .agents/skills/dmux-workflows/agents/openai.yaml
================================================
interface:
display_name: "dmux Workflows"
short_description: "Multi-agent orchestration with dmux"
brand_color: "#14B8A6"
default_prompt: "Orchestrate parallel agent sessions using dmux pane manager"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/documentation-lookup/SKILL.md
================================================
---
name: documentation-lookup
description: Use up-to-date library and framework docs via Context7 MCP instead of training data. Activates for setup questions, API references, code examples, or when the user names a framework (e.g. React, Next.js, Prisma).
origin: ECC
---
# Documentation Lookup (Context7)
When the user asks about libraries, frameworks, or APIs, fetch current documentation via the Context7 MCP (tools `resolve-library-id` and `query-docs`) instead of relying on training data.
## Core Concepts
- **Context7**: MCP server that exposes live documentation; use it instead of training data for libraries and APIs.
- **resolve-library-id**: Returns Context7-compatible library IDs (e.g. `/vercel/next.js`) from a library name and query.
- **query-docs**: Fetches documentation and code snippets for a given library ID and question. Always call resolve-library-id first to get a valid library ID.
## When to use
Activate when the user:
- Asks setup or configuration questions (e.g. "How do I configure Next.js middleware?")
- Requests code that depends on a library ("Write a Prisma query for...")
- Needs API or reference information ("What are the Supabase auth methods?")
- Mentions specific frameworks or libraries (React, Vue, Svelte, Express, Tailwind, Prisma, Supabase, etc.)
Use this skill whenever the request depends on accurate, up-to-date behavior of a library, framework, or API. Applies across harnesses that have the Context7 MCP configured (e.g. Claude Code, Cursor, Codex).
## How it works
### Step 1: Resolve the Library ID
Call the **resolve-library-id** MCP tool with:
- **libraryName**: The library or product name taken from the user's question (e.g. `Next.js`, `Prisma`, `Supabase`).
- **query**: The user's full question. This improves relevance ranking of results.
You must obtain a Context7-compatible library ID (format `/org/project` or `/org/project/version`) before querying docs. Do not call query-docs without a valid library ID from this step.
### Step 2: Select the Best Match
From the resolution results, choose one result using:
- **Name match**: Prefer exact or closest match to what the user asked for.
- **Benchmark score**: Higher scores indicate better documentation quality (100 is highest).
- **Source reputation**: Prefer High or Medium reputation when available.
- **Version**: If the user specified a version (e.g. "React 19", "Next.js 15"), prefer a version-specific library ID if listed (e.g. `/org/project/v1.2.0`).
### Step 3: Fetch the Documentation
Call the **query-docs** MCP tool with:
- **libraryId**: The selected Context7 library ID from Step 2 (e.g. `/vercel/next.js`).
- **query**: The user's specific question or task. Be specific to get relevant snippets.
Limit: do not call query-docs (or resolve-library-id) more than 3 times per question. If the answer is unclear after 3 calls, state the uncertainty and use the best information you have rather than guessing.
### Step 4: Use the Documentation
- Answer the user's question using the fetched, current information.
- Include relevant code examples from the docs when helpful.
- Cite the library or version when it matters (e.g. "In Next.js 15...").
## Examples
### Example: Next.js middleware
1. Call **resolve-library-id** with `libraryName: "Next.js"`, `query: "How do I set up Next.js middleware?"`.
2. From results, pick the best match (e.g. `/vercel/next.js`) by name and benchmark score.
3. Call **query-docs** with `libraryId: "/vercel/next.js"`, `query: "How do I set up Next.js middleware?"`.
4. Use the returned snippets and text to answer; include a minimal `middleware.ts` example from the docs if relevant.
### Example: Prisma query
1. Call **resolve-library-id** with `libraryName: "Prisma"`, `query: "How do I query with relations?"`.
2. Select the official Prisma library ID (e.g. `/prisma/prisma`).
3. Call **query-docs** with that `libraryId` and the query.
4. Return the Prisma Client pattern (e.g. `include` or `select`) with a short code snippet from the docs.
### Example: Supabase auth methods
1. Call **resolve-library-id** with `libraryName: "Supabase"`, `query: "What are the auth methods?"`.
2. Pick the Supabase docs library ID.
3. Call **query-docs**; summarize the auth methods and show minimal examples from the fetched docs.
## Best Practices
- **Be specific**: Use the user's full question as the query where possible for better relevance.
- **Version awareness**: When users mention versions, use version-specific library IDs from the resolve step when available.
- **Prefer official sources**: When multiple matches exist, prefer official or primary packages over community forks.
- **No sensitive data**: Redact API keys, passwords, tokens, and other secrets from any query sent to Context7. Treat the user's question as potentially containing secrets before passing it to resolve-library-id or query-docs.
================================================
FILE: .agents/skills/documentation-lookup/agents/openai.yaml
================================================
interface:
display_name: "Documentation Lookup"
short_description: "Fetch up-to-date library docs via Context7 MCP"
brand_color: "#6366F1"
default_prompt: "Look up docs for a library or API"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/e2e-testing/SKILL.md
================================================
---
name: e2e-testing
description: Playwright E2E testing patterns, Page Object Model, configuration, CI/CD integration, artifact management, and flaky test strategies.
origin: ECC
---
# E2E Testing Patterns
Comprehensive Playwright patterns for building stable, fast, and maintainable E2E test suites.
## Test File Organization
```
tests/
├── e2e/
│ ├── auth/
│ │ ├── login.spec.ts
│ │ ├── logout.spec.ts
│ │ └── register.spec.ts
│ ├── features/
│ │ ├── browse.spec.ts
│ │ ├── search.spec.ts
│ │ └── create.spec.ts
│ └── api/
│ └── endpoints.spec.ts
├── fixtures/
│ ├── auth.ts
│ └── data.ts
└── playwright.config.ts
```
## Page Object Model (POM)
```typescript
import { Page, Locator } from '@playwright/test'
export class ItemsPage {
readonly page: Page
readonly searchInput: Locator
readonly itemCards: Locator
readonly createButton: Locator
constructor(page: Page) {
this.page = page
this.searchInput = page.locator('[data-testid="search-input"]')
this.itemCards = page.locator('[data-testid="item-card"]')
this.createButton = page.locator('[data-testid="create-btn"]')
}
async goto() {
await this.page.goto('/items')
await this.page.waitForLoadState('networkidle')
}
async search(query: string) {
await this.searchInput.fill(query)
await this.page.waitForResponse(resp => resp.url().includes('/api/search'))
await this.page.waitForLoadState('networkidle')
}
async getItemCount() {
return await this.itemCards.count()
}
}
```
## Test Structure
```typescript
import { test, expect } from '@playwright/test'
import { ItemsPage } from '../../pages/ItemsPage'
test.describe('Item Search', () => {
let itemsPage: ItemsPage
test.beforeEach(async ({ page }) => {
itemsPage = new ItemsPage(page)
await itemsPage.goto()
})
test('should search by keyword', async ({ page }) => {
await itemsPage.search('test')
const count = await itemsPage.getItemCount()
expect(count).toBeGreaterThan(0)
await expect(itemsPage.itemCards.first()).toContainText(/test/i)
await page.screenshot({ path: 'artifacts/search-results.png' })
})
test('should handle no results', async ({ page }) => {
await itemsPage.search('xyznonexistent123')
await expect(page.locator('[data-testid="no-results"]')).toBeVisible()
expect(await itemsPage.getItemCount()).toBe(0)
})
})
```
## Playwright Configuration
```typescript
import { defineConfig, devices } from '@playwright/test'
export default defineConfig({
testDir: './tests/e2e',
fullyParallel: true,
forbidOnly: !!process.env.CI,
retries: process.env.CI ? 2 : 0,
workers: process.env.CI ? 1 : undefined,
reporter: [
['html', { outputFolder: 'playwright-report' }],
['junit', { outputFile: 'playwright-results.xml' }],
['json', { outputFile: 'playwright-results.json' }]
],
use: {
baseURL: process.env.BASE_URL || 'http://localhost:3000',
trace: 'on-first-retry',
screenshot: 'only-on-failure',
video: 'retain-on-failure',
actionTimeout: 10000,
navigationTimeout: 30000,
},
projects: [
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } },
{ name: 'webkit', use: { ...devices['Desktop Safari'] } },
{ name: 'mobile-chrome', use: { ...devices['Pixel 5'] } },
],
webServer: {
command: 'npm run dev',
url: 'http://localhost:3000',
reuseExistingServer: !process.env.CI,
timeout: 120000,
},
})
```
## Flaky Test Patterns
### Quarantine
```typescript
test('flaky: complex search', async ({ page }) => {
test.fixme(true, 'Flaky - Issue #123')
// test code...
})
test('conditional skip', async ({ page }) => {
test.skip(process.env.CI, 'Flaky in CI - Issue #123')
// test code...
})
```
### Identify Flakiness
```bash
npx playwright test tests/search.spec.ts --repeat-each=10
npx playwright test tests/search.spec.ts --retries=3
```
### Common Causes & Fixes
**Race conditions:**
```typescript
// Bad: assumes element is ready
await page.click('[data-testid="button"]')
// Good: auto-wait locator
await page.locator('[data-testid="button"]').click()
```
**Network timing:**
```typescript
// Bad: arbitrary timeout
await page.waitForTimeout(5000)
// Good: wait for specific condition
await page.waitForResponse(resp => resp.url().includes('/api/data'))
```
**Animation timing:**
```typescript
// Bad: click during animation
await page.click('[data-testid="menu-item"]')
// Good: wait for stability
await page.locator('[data-testid="menu-item"]').waitFor({ state: 'visible' })
await page.waitForLoadState('networkidle')
await page.locator('[data-testid="menu-item"]').click()
```
## Artifact Management
### Screenshots
```typescript
await page.screenshot({ path: 'artifacts/after-login.png' })
await page.screenshot({ path: 'artifacts/full-page.png', fullPage: true })
await page.locator('[data-testid="chart"]').screenshot({ path: 'artifacts/chart.png' })
```
### Traces
```typescript
await browser.startTracing(page, {
path: 'artifacts/trace.json',
screenshots: true,
snapshots: true,
})
// ... test actions ...
await browser.stopTracing()
```
### Video
```typescript
// In playwright.config.ts
use: {
video: 'retain-on-failure',
videosPath: 'artifacts/videos/'
}
```
## CI/CD Integration
```yaml
# .github/workflows/e2e.yml
name: E2E Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
- run: npm ci
- run: npx playwright install --with-deps
- run: npx playwright test
env:
BASE_URL: ${{ vars.STAGING_URL }}
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
path: playwright-report/
retention-days: 30
```
## Test Report Template
```markdown
# E2E Test Report
**Date:** YYYY-MM-DD HH:MM
**Duration:** Xm Ys
**Status:** PASSING / FAILING
## Summary
- Total: X | Passed: Y (Z%) | Failed: A | Flaky: B | Skipped: C
## Failed Tests
### test-name
**File:** `tests/e2e/feature.spec.ts:45`
**Error:** Expected element to be visible
**Screenshot:** artifacts/failed.png
**Recommended Fix:** [description]
## Artifacts
- HTML Report: playwright-report/index.html
- Screenshots: artifacts/*.png
- Videos: artifacts/videos/*.webm
- Traces: artifacts/*.zip
```
## Wallet / Web3 Testing
```typescript
test('wallet connection', async ({ page, context }) => {
// Mock wallet provider
await context.addInitScript(() => {
window.ethereum = {
isMetaMask: true,
request: async ({ method }) => {
if (method === 'eth_requestAccounts')
return ['0x1234567890123456789012345678901234567890']
if (method === 'eth_chainId') return '0x1'
}
}
})
await page.goto('/')
await page.locator('[data-testid="connect-wallet"]').click()
await expect(page.locator('[data-testid="wallet-address"]')).toContainText('0x1234')
})
```
## Financial / Critical Flow Testing
```typescript
test('trade execution', async ({ page }) => {
// Skip on production — real money
test.skip(process.env.NODE_ENV === 'production', 'Skip on production')
await page.goto('/markets/test-market')
await page.locator('[data-testid="position-yes"]').click()
await page.locator('[data-testid="trade-amount"]').fill('1.0')
// Verify preview
const preview = page.locator('[data-testid="trade-preview"]')
await expect(preview).toContainText('1.0')
// Confirm and wait for blockchain
await page.locator('[data-testid="confirm-trade"]').click()
await page.waitForResponse(
resp => resp.url().includes('/api/trade') && resp.status() === 200,
{ timeout: 30000 }
)
await expect(page.locator('[data-testid="trade-success"]')).toBeVisible()
})
```
================================================
FILE: .agents/skills/e2e-testing/agents/openai.yaml
================================================
interface:
display_name: "E2E Testing"
short_description: "Playwright end-to-end testing"
brand_color: "#06B6D4"
default_prompt: "Generate Playwright E2E tests with Page Object Model"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/eval-harness/SKILL.md
================================================
---
name: eval-harness
description: Formal evaluation framework for Claude Code sessions implementing eval-driven development (EDD) principles
origin: ECC
tools: Read, Write, Edit, Bash, Grep, Glob
---
# Eval Harness Skill
A formal evaluation framework for Claude Code sessions, implementing eval-driven development (EDD) principles.
## When to Activate
- Setting up eval-driven development (EDD) for AI-assisted workflows
- Defining pass/fail criteria for Claude Code task completion
- Measuring agent reliability with pass@k metrics
- Creating regression test suites for prompt or agent changes
- Benchmarking agent performance across model versions
## Philosophy
Eval-Driven Development treats evals as the "unit tests of AI development":
- Define expected behavior BEFORE implementation
- Run evals continuously during development
- Track regressions with each change
- Use pass@k metrics for reliability measurement
## Eval Types
### Capability Evals
Test if Claude can do something it couldn't before:
```markdown
[CAPABILITY EVAL: feature-name]
Task: Description of what Claude should accomplish
Success Criteria:
- [ ] Criterion 1
- [ ] Criterion 2
- [ ] Criterion 3
Expected Output: Description of expected result
```
### Regression Evals
Ensure changes don't break existing functionality:
```markdown
[REGRESSION EVAL: feature-name]
Baseline: SHA or checkpoint name
Tests:
- existing-test-1: PASS/FAIL
- existing-test-2: PASS/FAIL
- existing-test-3: PASS/FAIL
Result: X/Y passed (previously Y/Y)
```
## Grader Types
### 1. Code-Based Grader
Deterministic checks using code:
```bash
# Check if file contains expected pattern
grep -q "export function handleAuth" src/auth.ts && echo "PASS" || echo "FAIL"
# Check if tests pass
npm test -- --testPathPattern="auth" && echo "PASS" || echo "FAIL"
# Check if build succeeds
npm run build && echo "PASS" || echo "FAIL"
```
### 2. Model-Based Grader
Use Claude to evaluate open-ended outputs:
```markdown
[MODEL GRADER PROMPT]
Evaluate the following code change:
1. Does it solve the stated problem?
2. Is it well-structured?
3. Are edge cases handled?
4. Is error handling appropriate?
Score: 1-5 (1=poor, 5=excellent)
Reasoning: [explanation]
```
### 3. Human Grader
Flag for manual review:
```markdown
[HUMAN REVIEW REQUIRED]
Change: Description of what changed
Reason: Why human review is needed
Risk Level: LOW/MEDIUM/HIGH
```
## Metrics
### pass@k
"At least one success in k attempts"
- pass@1: First attempt success rate
- pass@3: Success within 3 attempts
- Typical target: pass@3 > 90%
### pass^k
"All k trials succeed"
- Higher bar for reliability
- pass^3: 3 consecutive successes
- Use for critical paths
## Eval Workflow
### 1. Define (Before Coding)
```markdown
## EVAL DEFINITION: feature-xyz
### Capability Evals
1. Can create new user account
2. Can validate email format
3. Can hash password securely
### Regression Evals
1. Existing login still works
2. Session management unchanged
3. Logout flow intact
### Success Metrics
- pass@3 > 90% for capability evals
- pass^3 = 100% for regression evals
```
### 2. Implement
Write code to pass the defined evals.
### 3. Evaluate
```bash
# Run capability evals
[Run each capability eval, record PASS/FAIL]
# Run regression evals
npm test -- --testPathPattern="existing"
# Generate report
```
### 4. Report
```markdown
EVAL REPORT: feature-xyz
========================
Capability Evals:
create-user: PASS (pass@1)
validate-email: PASS (pass@2)
hash-password: PASS (pass@1)
Overall: 3/3 passed
Regression Evals:
login-flow: PASS
session-mgmt: PASS
logout-flow: PASS
Overall: 3/3 passed
Metrics:
pass@1: 67% (2/3)
pass@3: 100% (3/3)
Status: READY FOR REVIEW
```
## Integration Patterns
### Pre-Implementation
```
/eval define feature-name
```
Creates eval definition file at `.claude/evals/feature-name.md`
### During Implementation
```
/eval check feature-name
```
Runs current evals and reports status
### Post-Implementation
```
/eval report feature-name
```
Generates full eval report
## Eval Storage
Store evals in project:
```
.claude/
evals/
feature-xyz.md # Eval definition
feature-xyz.log # Eval run history
baseline.json # Regression baselines
```
## Best Practices
1. **Define evals BEFORE coding** - Forces clear thinking about success criteria
2. **Run evals frequently** - Catch regressions early
3. **Track pass@k over time** - Monitor reliability trends
4. **Use code graders when possible** - Deterministic > probabilistic
5. **Human review for security** - Never fully automate security checks
6. **Keep evals fast** - Slow evals don't get run
7. **Version evals with code** - Evals are first-class artifacts
## Example: Adding Authentication
```markdown
## EVAL: add-authentication
### Phase 1: Define (10 min)
Capability Evals:
- [ ] User can register with email/password
- [ ] User can login with valid credentials
- [ ] Invalid credentials rejected with proper error
- [ ] Sessions persist across page reloads
- [ ] Logout clears session
Regression Evals:
- [ ] Public routes still accessible
- [ ] API responses unchanged
- [ ] Database schema compatible
### Phase 2: Implement (varies)
[Write code]
### Phase 3: Evaluate
Run: /eval check add-authentication
### Phase 4: Report
EVAL REPORT: add-authentication
==============================
Capability: 5/5 passed (pass@3: 100%)
Regression: 3/3 passed (pass^3: 100%)
Status: SHIP IT
```
================================================
FILE: .agents/skills/eval-harness/agents/openai.yaml
================================================
interface:
display_name: "Eval Harness"
short_description: "Eval-driven development with pass/fail criteria"
brand_color: "#EC4899"
default_prompt: "Set up eval-driven development with pass/fail criteria"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/exa-search/SKILL.md
================================================
---
name: exa-search
description: Neural search via Exa MCP for web, code, and company research. Use when the user needs web search, code examples, company intel, people lookup, or AI-powered deep research with Exa's neural search engine.
origin: ECC
---
# Exa Search
Neural search for web content, code, companies, and people via the Exa MCP server.
## When to Activate
- User needs current web information or news
- Searching for code examples, API docs, or technical references
- Researching companies, competitors, or market players
- Finding professional profiles or people in a domain
- Running background research for any development task
- User says "search for", "look up", "find", or "what's the latest on"
## MCP Requirement
Exa MCP server must be configured. Add to `~/.claude.json`:
```json
"exa-web-search": {
"command": "npx",
"args": ["-y", "exa-mcp-server"],
"env": { "EXA_API_KEY": "YOUR_EXA_API_KEY_HERE" }
}
```
Get an API key at [exa.ai](https://exa.ai).
## Core Tools
### web_search_exa
General web search for current information, news, or facts.
```
web_search_exa(query: "latest AI developments 2026", numResults: 5)
```
**Parameters:**
| Param | Type | Default | Notes |
|-------|------|---------|-------|
| `query` | string | required | Search query |
| `numResults` | number | 8 | Number of results |
### web_search_advanced_exa
Filtered search with domain and date constraints.
```
web_search_advanced_exa(
query: "React Server Components best practices",
numResults: 5,
includeDomains: ["github.com", "react.dev"],
startPublishedDate: "2025-01-01"
)
```
**Parameters:**
| Param | Type | Default | Notes |
|-------|------|---------|-------|
| `query` | string | required | Search query |
| `numResults` | number | 8 | Number of results |
| `includeDomains` | string[] | none | Limit to specific domains |
| `excludeDomains` | string[] | none | Exclude specific domains |
| `startPublishedDate` | string | none | ISO date filter (start) |
| `endPublishedDate` | string | none | ISO date filter (end) |
### get_code_context_exa
Find code examples and documentation from GitHub, Stack Overflow, and docs sites.
```
get_code_context_exa(query: "Python asyncio patterns", tokensNum: 3000)
```
**Parameters:**
| Param | Type | Default | Notes |
|-------|------|---------|-------|
| `query` | string | required | Code or API search query |
| `tokensNum` | number | 5000 | Content tokens (1000-50000) |
### company_research_exa
Research companies for business intelligence and news.
```
company_research_exa(companyName: "Anthropic", numResults: 5)
```
**Parameters:**
| Param | Type | Default | Notes |
|-------|------|---------|-------|
| `companyName` | string | required | Company name |
| `numResults` | number | 5 | Number of results |
### people_search_exa
Find professional profiles and bios.
```
people_search_exa(query: "AI safety researchers at Anthropic", numResults: 5)
```
### crawling_exa
Extract full page content from a URL.
```
crawling_exa(url: "https://example.com/article", tokensNum: 5000)
```
**Parameters:**
| Param | Type | Default | Notes |
|-------|------|---------|-------|
| `url` | string | required | URL to extract |
| `tokensNum` | number | 5000 | Content tokens |
### deep_researcher_start / deep_researcher_check
Start an AI research agent that runs asynchronously.
```
# Start research
deep_researcher_start(query: "comprehensive analysis of AI code editors in 2026")
# Check status (returns results when complete)
deep_researcher_check(researchId: "<id from start>")
```
## Usage Patterns
### Quick Lookup
```
web_search_exa(query: "Node.js 22 new features", numResults: 3)
```
### Code Research
```
get_code_context_exa(query: "Rust error handling patterns Result type", tokensNum: 3000)
```
### Company Due Diligence
```
company_research_exa(companyName: "Vercel", numResults: 5)
web_search_advanced_exa(query: "Vercel funding valuation 2026", numResults: 3)
```
### Technical Deep Dive
```
# Start async research
deep_researcher_start(query: "WebAssembly component model status and adoption")
# ... do other work ...
deep_researcher_check(researchId: "<id>")
```
## Tips
- Use `web_search_exa` for broad queries, `web_search_advanced_exa` for filtered results
- Lower `tokensNum` (1000-2000) for focused code snippets, higher (5000+) for comprehensive context
- Combine `company_research_exa` with `web_search_advanced_exa` for thorough company analysis
- Use `crawling_exa` to get full content from specific URLs found in search results
- `deep_researcher_start` is best for comprehensive topics that benefit from AI synthesis
## Related Skills
- `deep-research` — Full research workflow using firecrawl + exa together
- `market-research` — Business-oriented research with decision frameworks
================================================
FILE: .agents/skills/exa-search/agents/openai.yaml
================================================
interface:
display_name: "Exa Search"
short_description: "Neural search via Exa MCP for web, code, and companies"
brand_color: "#8B5CF6"
default_prompt: "Search using Exa MCP tools for web content, code, or company research"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/fal-ai-media/SKILL.md
================================================
---
name: fal-ai-media
description: Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.
origin: ECC
---
# fal.ai Media Generation
Generate images, videos, and audio using fal.ai models via MCP.
## When to Activate
- User wants to generate images from text prompts
- Creating videos from text or images
- Generating speech, music, or sound effects
- Any media generation task
- User says "generate image", "create video", "text to speech", "make a thumbnail", or similar
## MCP Requirement
fal.ai MCP server must be configured. Add to `~/.claude.json`:
```json
"fal-ai": {
"command": "npx",
"args": ["-y", "fal-ai-mcp-server"],
"env": { "FAL_KEY": "YOUR_FAL_KEY_HERE" }
}
```
Get an API key at [fal.ai](https://fal.ai).
## MCP Tools
The fal.ai MCP provides these tools:
- `search` — Find available models by keyword
- `find` — Get model details and parameters
- `generate` — Run a model with parameters
- `result` — Check async generation status
- `status` — Check job status
- `cancel` — Cancel a running job
- `estimate_cost` — Estimate generation cost
- `models` — List popular models
- `upload` — Upload files for use as inputs
---
## Image Generation
### Nano Banana 2 (Fast)
Best for: quick iterations, drafts, text-to-image, image editing.
```
generate(
model_name: "fal-ai/nano-banana-2",
input: {
"prompt": "a futuristic cityscape at sunset, cyberpunk style",
"image_size": "landscape_16_9",
"num_images": 1,
"seed": 42
}
)
```
### Nano Banana Pro (High Fidelity)
Best for: production images, realism, typography, detailed prompts.
```
generate(
model_name: "fal-ai/nano-banana-pro",
input: {
"prompt": "professional product photo of wireless headphones on marble surface, studio lighting",
"image_size": "square",
"num_images": 1,
"guidance_scale": 7.5
}
)
```
### Common Image Parameters
| Param | Type | Options | Notes |
|-------|------|---------|-------|
| `prompt` | string | required | Describe what you want |
| `image_size` | string | `square`, `portrait_4_3`, `landscape_16_9`, `portrait_16_9`, `landscape_4_3` | Aspect ratio |
| `num_images` | number | 1-4 | How many to generate |
| `seed` | number | any integer | Reproducibility |
| `guidance_scale` | number | 1-20 | How closely to follow the prompt (higher = more literal) |
### Image Editing
Use Nano Banana 2 with an input image for inpainting, outpainting, or style transfer:
```
# First upload the source image
upload(file_path: "/path/to/image.png")
# Then generate with image input
generate(
model_name: "fal-ai/nano-banana-2",
input: {
"prompt": "same scene but in watercolor style",
"image_url": "<uploaded_url>",
"image_size": "landscape_16_9"
}
)
```
---
## Video Generation
### Seedance 1.0 Pro (ByteDance)
Best for: text-to-video, image-to-video with high motion quality.
```
generate(
model_name: "fal-ai/seedance-1-0-pro",
input: {
"prompt": "a drone flyover of a mountain lake at golden hour, cinematic",
"duration": "5s",
"aspect_ratio": "16:9",
"seed": 42
}
)
```
### Kling Video v3 Pro
Best for: text/image-to-video with native audio generation.
```
generate(
model_name: "fal-ai/kling-video/v3/pro",
input: {
"prompt": "ocean waves crashing on a rocky coast, dramatic clouds",
"duration": "5s",
"aspect_ratio": "16:9"
}
)
```
### Veo 3 (Google DeepMind)
Best for: video with generated sound, high visual quality.
```
generate(
model_name: "fal-ai/veo-3",
input: {
"prompt": "a bustling Tokyo street market at night, neon signs, crowd noise",
"aspect_ratio": "16:9"
}
)
```
### Image-to-Video
Start from an existing image:
```
generate(
model_name: "fal-ai/seedance-1-0-pro",
input: {
"prompt": "camera slowly zooms out, gentle wind moves the trees",
"image_url": "<uploaded_image_url>",
"duration": "5s"
}
)
```
### Video Parameters
| Param | Type | Options | Notes |
|-------|------|---------|-------|
| `prompt` | string | required | Describe the video |
| `duration` | string | `"5s"`, `"10s"` | Video length |
| `aspect_ratio` | string | `"16:9"`, `"9:16"`, `"1:1"` | Frame ratio |
| `seed` | number | any integer | Reproducibility |
| `image_url` | string | URL | Source image for image-to-video |
---
## Audio Generation
### CSM-1B (Conversational Speech)
Text-to-speech with natural, conversational quality.
```
generate(
model_name: "fal-ai/csm-1b",
input: {
"text": "Hello, welcome to the demo. Let me show you how this works.",
"speaker_id": 0
}
)
```
### ThinkSound (Video-to-Audio)
Generate matching audio from video content.
```
generate(
model_name: "fal-ai/thinksound",
input: {
"video_url": "<video_url>",
"prompt": "ambient forest sounds with birds chirping"
}
)
```
### ElevenLabs (via API, no MCP)
For professional voice synthesis, use ElevenLabs directly:
```python
import os
import requests
resp = requests.post(
"https://api.elevenlabs.io/v1/text-to-speech/<voice_id>",
headers={
"xi-api-key": os.environ["ELEVENLABS_API_KEY"],
"Content-Type": "application/json"
},
json={
"text": "Your text here",
"model_id": "eleven_turbo_v2_5",
"voice_settings": {"stability": 0.5, "similarity_boost": 0.75}
}
)
with open("output.mp3", "wb") as f:
f.write(resp.content)
```
### VideoDB Generative Audio
If VideoDB is configured, use its generative audio:
```python
# Voice generation
audio = coll.generate_voice(text="Your narration here", voice="alloy")
# Music generation
music = coll.generate_music(prompt="upbeat electronic background music", duration=30)
# Sound effects
sfx = coll.generate_sound_effect(prompt="thunder crack followed by rain")
```
---
## Cost Estimation
Before generating, check estimated cost:
```
estimate_cost(model_name: "fal-ai/nano-banana-pro", input: {...})
```
## Model Discovery
Find models for specific tasks:
```
search(query: "text to video")
find(model_name: "fal-ai/seedance-1-0-pro")
models()
```
## Tips
- Use `seed` for reproducible results when iterating on prompts
- Start with lower-cost models (Nano Banana 2) for prompt iteration, then switch to Pro for finals
- For video, keep prompts descriptive but concise — focus on motion and scene
- Image-to-video produces more controlled results than pure text-to-video
- Check `estimate_cost` before running expensive video generations
## Related Skills
- `videodb` — Video processing, editing, and streaming
- `video-editing` — AI-powered video editing workflows
- `content-engine` — Content creation for social platforms
================================================
FILE: .agents/skills/fal-ai-media/agents/openai.yaml
================================================
interface:
display_name: "fal.ai Media"
short_description: "AI image, video, and audio generation via fal.ai"
brand_color: "#F43F5E"
default_prompt: "Generate images, videos, or audio using fal.ai models"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/frontend-patterns/SKILL.md
================================================
---
name: frontend-patterns
description: Frontend development patterns for React, Next.js, state management, performance optimization, and UI best practices.
origin: ECC
---
# Frontend Development Patterns
Modern frontend patterns for React, Next.js, and performant user interfaces.
## When to Activate
- Building React components (composition, props, rendering)
- Managing state (useState, useReducer, Zustand, Context)
- Implementing data fetching (SWR, React Query, server components)
- Optimizing performance (memoization, virtualization, code splitting)
- Working with forms (validation, controlled inputs, Zod schemas)
- Handling client-side routing and navigation
- Building accessible, responsive UI patterns
## Component Patterns
### Composition Over Inheritance
```typescript
// ✅ GOOD: Component composition
interface CardProps {
children: React.ReactNode
variant?: 'default' | 'outlined'
}
export function Card({ children, variant = 'default' }: CardProps) {
return <div className={`card card-${variant}`}>{children}</div>
}
export function CardHeader({ children }: { children: React.ReactNode }) {
return <div className="card-header">{children}</div>
}
export function CardBody({ children }: { children: React.ReactNode }) {
return <div className="card-body">{children}</div>
}
// Usage
<Card>
<CardHeader>Title</CardHeader>
<CardBody>Content</CardBody>
</Card>
```
### Compound Components
```typescript
interface TabsContextValue {
activeTab: string
setActiveTab: (tab: string) => void
}
const TabsContext = createContext<TabsContextValue | undefined>(undefined)
export function Tabs({ children, defaultTab }: {
children: React.ReactNode
defaultTab: string
}) {
const [activeTab, setActiveTab] = useState(defaultTab)
return (
<TabsContext.Provider value={{ activeTab, setActiveTab }}>
{children}
</TabsContext.Provider>
)
}
export function TabList({ children }: { children: React.ReactNode }) {
return <div className="tab-list">{children}</div>
}
export function Tab({ id, children }: { id: string, children: React.ReactNode }) {
const context = useContext(TabsContext)
if (!context) throw new Error('Tab must be used within Tabs')
return (
<button
className={context.activeTab === id ? 'active' : ''}
onClick={() => context.setActiveTab(id)}
>
{children}
</button>
)
}
// Usage
<Tabs defaultTab="overview">
<TabList>
<Tab id="overview">Overview</Tab>
<Tab id="details">Details</Tab>
</TabList>
</Tabs>
```
### Render Props Pattern
```typescript
interface DataLoaderProps<T> {
url: string
children: (data: T | null, loading: boolean, error: Error | null) => React.ReactNode
}
export function DataLoader<T>({ url, children }: DataLoaderProps<T>) {
const [data, setData] = useState<T | null>(null)
const [loading, setLoading] = useState(true)
const [error, setError] = useState<Error | null>(null)
useEffect(() => {
fetch(url)
.then(res => res.json())
.then(setData)
.catch(setError)
.finally(() => setLoading(false))
}, [url])
return <>{children(data, loading, error)}</>
}
// Usage
<DataLoader<Market[]> url="/api/markets">
{(markets, loading, error) => {
if (loading) return <Spinner />
if (error) return <Error error={error} />
return <MarketList markets={markets!} />
}}
</DataLoader>
```
## Custom Hooks Patterns
### State Management Hook
```typescript
export function useToggle(initialValue = false): [boolean, () => void] {
const [value, setValue] = useState(initialValue)
const toggle = useCallback(() => {
setValue(v => !v)
}, [])
return [value, toggle]
}
// Usage
const [isOpen, toggleOpen] = useToggle()
```
### Async Data Fetching Hook
```typescript
interface UseQueryOptions<T> {
onSuccess?: (data: T) => void
onError?: (error: Error) => void
enabled?: boolean
}
export function useQuery<T>(
key: string,
fetcher: () => Promise<T>,
options?: UseQueryOptions<T>
) {
const [data, setData] = useState<T | null>(null)
const [error, setError] = useState<Error | null>(null)
const [loading, setLoading] = useState(false)
const refetch = useCallback(async () => {
setLoading(true)
setError(null)
try {
const result = await fetcher()
setData(result)
options?.onSuccess?.(result)
} catch (err) {
const error = err as Error
setError(error)
options?.onError?.(error)
} finally {
setLoading(false)
}
}, [fetcher, options])
useEffect(() => {
if (options?.enabled !== false) {
refetch()
}
}, [key, refetch, options?.enabled])
return { data, error, loading, refetch }
}
// Usage
const { data: markets, loading, error, refetch } = useQuery(
'markets',
() => fetch('/api/markets').then(r => r.json()),
{
onSuccess: data => console.log('Fetched', data.length, 'markets'),
onError: err => console.error('Failed:', err)
}
)
```
### Debounce Hook
```typescript
export function useDebounce<T>(value: T, delay: number): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value)
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value)
}, delay)
return () => clearTimeout(handler)
}, [value, delay])
return debouncedValue
}
// Usage
const [searchQuery, setSearchQuery] = useState('')
const debouncedQuery = useDebounce(searchQuery, 500)
useEffect(() => {
if (debouncedQuery) {
performSearch(debouncedQuery)
}
}, [debouncedQuery])
```
## State Management Patterns
### Context + Reducer Pattern
```typescript
interface State {
markets: Market[]
selectedMarket: Market | null
loading: boolean
}
type Action =
| { type: 'SET_MARKETS'; payload: Market[] }
| { type: 'SELECT_MARKET'; payload: Market }
| { type: 'SET_LOADING'; payload: boolean }
function reducer(state: State, action: Action): State {
switch (action.type) {
case 'SET_MARKETS':
return { ...state, markets: action.payload }
case 'SELECT_MARKET':
return { ...state, selectedMarket: action.payload }
case 'SET_LOADING':
return { ...state, loading: action.payload }
default:
return state
}
}
const MarketContext = createContext<{
state: State
dispatch: Dispatch<Action>
} | undefined>(undefined)
export function MarketProvider({ children }: { children: React.ReactNode }) {
const [state, dispatch] = useReducer(reducer, {
markets: [],
selectedMarket: null,
loading: false
})
return (
<MarketContext.Provider value={{ state, dispatch }}>
{children}
</MarketContext.Provider>
)
}
export function useMarkets() {
const context = useContext(MarketContext)
if (!context) throw new Error('useMarkets must be used within MarketProvider')
return context
}
```
## Performance Optimization
### Memoization
```typescript
// ✅ useMemo for expensive computations
const sortedMarkets = useMemo(() => {
return markets.sort((a, b) => b.volume - a.volume)
}, [markets])
// ✅ useCallback for functions passed to children
const handleSearch = useCallback((query: string) => {
setSearchQuery(query)
}, [])
// ✅ React.memo for pure components
export const MarketCard = React.memo<MarketCardProps>(({ market }) => {
return (
<div className="market-card">
<h3>{market.name}</h3>
<p>{market.description}</p>
</div>
)
})
```
### Code Splitting & Lazy Loading
```typescript
import { lazy, Suspense } from 'react'
// ✅ Lazy load heavy components
const HeavyChart = lazy(() => import('./HeavyChart'))
const ThreeJsBackground = lazy(() => import('./ThreeJsBackground'))
export function Dashboard() {
return (
<div>
<Suspense fallback={<ChartSkeleton />}>
<HeavyChart data={data} />
</Suspense>
<Suspense fallback={null}>
<ThreeJsBackground />
</Suspense>
</div>
)
}
```
### Virtualization for Long Lists
```typescript
import { useVirtualizer } from '@tanstack/react-virtual'
export function VirtualMarketList({ markets }: { markets: Market[] }) {
const parentRef = useRef<HTMLDivElement>(null)
const virtualizer = useVirtualizer({
count: markets.length,
getScrollElement: () => parentRef.current,
estimateSize: () => 100, // Estimated row height
overscan: 5 // Extra items to render
})
return (
<div ref={parentRef} style={{ height: '600px', overflow: 'auto' }}>
<div
style={{
height: `${virtualizer.getTotalSize()}px`,
position: 'relative'
}}
>
{virtualizer.getVirtualItems().map(virtualRow => (
<div
key={virtualRow.index}
style={{
position: 'absolute',
top: 0,
left: 0,
width: '100%',
height: `${virtualRow.size}px`,
transform: `translateY(${virtualRow.start}px)`
}}
>
<MarketCard market={markets[virtualRow.index]} />
</div>
))}
</div>
</div>
)
}
```
## Form Handling Patterns
### Controlled Form with Validation
```typescript
interface FormData {
name: string
description: string
endDate: string
}
interface FormErrors {
name?: string
description?: string
endDate?: string
}
export function CreateMarketForm() {
const [formData, setFormData] = useState<FormData>({
name: '',
description: '',
endDate: ''
})
const [errors, setErrors] = useState<FormErrors>({})
const validate = (): boolean => {
const newErrors: FormErrors = {}
if (!formData.name.trim()) {
newErrors.name = 'Name is required'
} else if (formData.name.length > 200) {
newErrors.name = 'Name must be under 200 characters'
}
if (!formData.description.trim()) {
newErrors.description = 'Description is required'
}
if (!formData.endDate) {
newErrors.endDate = 'End date is required'
}
setErrors(newErrors)
return Object.keys(newErrors).length === 0
}
const handleSubmit = async (e: React.FormEvent) => {
e.preventDefault()
if (!validate()) return
try {
await createMarket(formData)
// Success handling
} catch (error) {
// Error handling
}
}
return (
<form onSubmit={handleSubmit}>
<input
value={formData.name}
onChange={e => setFormData(prev => ({ ...prev, name: e.target.value }))}
placeholder="Market name"
/>
{errors.name && <span className="error">{errors.name}</span>}
{/* Other fields */}
<button type="submit">Create Market</button>
</form>
)
}
```
## Error Boundary Pattern
```typescript
interface ErrorBoundaryState {
hasError: boolean
error: Error | null
}
export class ErrorBoundary extends React.Component<
{ children: React.ReactNode },
ErrorBoundaryState
> {
state: ErrorBoundaryState = {
hasError: false,
error: null
}
static getDerivedStateFromError(error: Error): ErrorBoundaryState {
return { hasError: true, error }
}
componentDidCatch(error: Error, errorInfo: React.ErrorInfo) {
console.error('Error boundary caught:', error, errorInfo)
}
render() {
if (this.state.hasError) {
return (
<div className="error-fallback">
<h2>Something went wrong</h2>
<p>{this.state.error?.message}</p>
<button onClick={() => this.setState({ hasError: false })}>
Try again
</button>
</div>
)
}
return this.props.children
}
}
// Usage
<ErrorBoundary>
<App />
</ErrorBoundary>
```
## Animation Patterns
### Framer Motion Animations
```typescript
import { motion, AnimatePresence } from 'framer-motion'
// ✅ List animations
export function AnimatedMarketList({ markets }: { markets: Market[] }) {
return (
<AnimatePresence>
{markets.map(market => (
<motion.div
key={market.id}
initial={{ opacity: 0, y: 20 }}
animate={{ opacity: 1, y: 0 }}
exit={{ opacity: 0, y: -20 }}
transition={{ duration: 0.3 }}
>
<MarketCard market={market} />
</motion.div>
))}
</AnimatePresence>
)
}
// ✅ Modal animations
export function Modal({ isOpen, onClose, children }: ModalProps) {
return (
<AnimatePresence>
{isOpen && (
<>
<motion.div
className="modal-overlay"
initial={{ opacity: 0 }}
animate={{ opacity: 1 }}
exit={{ opacity: 0 }}
onClick={onClose}
/>
<motion.div
className="modal-content"
initial={{ opacity: 0, scale: 0.9, y: 20 }}
animate={{ opacity: 1, scale: 1, y: 0 }}
exit={{ opacity: 0, scale: 0.9, y: 20 }}
>
{children}
</motion.div>
</>
)}
</AnimatePresence>
)
}
```
## Accessibility Patterns
### Keyboard Navigation
```typescript
export function Dropdown({ options, onSelect }: DropdownProps) {
const [isOpen, setIsOpen] = useState(false)
const [activeIndex, setActiveIndex] = useState(0)
const handleKeyDown = (e: React.KeyboardEvent) => {
switch (e.key) {
case 'ArrowDown':
e.preventDefault()
setActiveIndex(i => Math.min(i + 1, options.length - 1))
break
case 'ArrowUp':
e.preventDefault()
setActiveIndex(i => Math.max(i - 1, 0))
break
case 'Enter':
e.preventDefault()
onSelect(options[activeIndex])
setIsOpen(false)
break
case 'Escape':
setIsOpen(false)
break
}
}
return (
<div
role="combobox"
aria-expanded={isOpen}
aria-haspopup="listbox"
onKeyDown={handleKeyDown}
>
{/* Dropdown implementation */}
</div>
)
}
```
### Focus Management
```typescript
export function Modal({ isOpen, onClose, children }: ModalProps) {
const modalRef = useRef<HTMLDivElement>(null)
const previousFocusRef = useRef<HTMLElement | null>(null)
useEffect(() => {
if (isOpen) {
// Save currently focused element
previousFocusRef.current = document.activeElement as HTMLElement
// Focus modal
modalRef.current?.focus()
} else {
// Restore focus when closing
previousFocusRef.current?.focus()
}
}, [isOpen])
return isOpen ? (
<div
ref={modalRef}
role="dialog"
aria-modal="true"
tabIndex={-1}
onKeyDown={e => e.key === 'Escape' && onClose()}
>
{children}
</div>
) : null
}
```
**Remember**: Modern frontend patterns enable maintainable, performant user interfaces. Choose patterns that fit your project complexity.
================================================
FILE: .agents/skills/frontend-patterns/agents/openai.yaml
================================================
interface:
display_name: "Frontend Patterns"
short_description: "React and Next.js patterns and best practices"
brand_color: "#8B5CF6"
default_prompt: "Apply React/Next.js patterns and best practices"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/frontend-slides/SKILL.md
================================================
---
name: frontend-slides
description: Create stunning, animation-rich HTML presentations from scratch or by converting PowerPoint files. Use when the user wants to build a presentation, convert a PPT/PPTX to web, or create slides for a talk/pitch. Helps non-designers discover their aesthetic through visual exploration rather than abstract choices.
origin: ECC
---
# Frontend Slides
Create zero-dependency, animation-rich HTML presentations that run entirely in the browser.
Inspired by the visual exploration approach showcased in work by [zarazhangrui](https://github.com/zarazhangrui).
## When to Activate
- Creating a talk deck, pitch deck, workshop deck, or internal presentation
- Converting `.ppt` or `.pptx` slides into an HTML presentation
- Improving an existing HTML presentation's layout, motion, or typography
- Exploring presentation styles with a user who does not know their design preference yet
## Non-Negotiables
1. **Zero dependencies**: default to one self-contained HTML file with inline CSS and JS.
2. **Viewport fit is mandatory**: every slide must fit inside one viewport with no internal scrolling.
3. **Show, don't tell**: use visual previews instead of abstract style questionnaires.
4. **Distinctive design**: avoid generic purple-gradient, Inter-on-white, template-looking decks.
5. **Production quality**: keep code commented, accessible, responsive, and performant.
Before generating, read `STYLE_PRESETS.md` for the viewport-safe CSS base, density limits, preset catalog, and CSS gotchas.
## Workflow
### 1. Detect Mode
Choose one path:
- **New presentation**: user has a topic, notes, or full draft
- **PPT conversion**: user has `.ppt` or `.pptx`
- **Enhancement**: user already has HTML slides and wants improvements
### 2. Discover Content
Ask only the minimum needed:
- purpose: pitch, teaching, conference talk, internal update
- length: short (5-10), medium (10-20), long (20+)
- content state: finished copy, rough notes, topic only
If the user has content, ask them to paste it before styling.
### 3. Discover Style
Default to visual exploration.
If the user already knows the desired preset, skip previews and use it directly.
Otherwise:
1. Ask what feeling the deck should create: impressed, energized, focused, inspired.
2. Generate **3 single-slide preview files** in `.ecc-design/slide-previews/`.
3. Each preview must be self-contained, show typography/color/motion clearly, and stay under roughly 100 lines of slide content.
4. Ask the user which preview to keep or what elements to mix.
Use the preset guide in `STYLE_PRESETS.md` when mapping mood to style.
### 4. Build the Presentation
Output either:
- `presentation.html`
- `[presentation-name].html`
Use an `assets/` folder only when the deck contains extracted or user-supplied images.
Required structure:
- semantic slide sections
- a viewport-safe CSS base from `STYLE_PRESETS.md`
- CSS custom properties for theme values
- a presentation controller class for keyboard, wheel, and touch navigation
- Intersection Observer for reveal animations
- reduced-motion support
### 5. Enforce Viewport Fit
Treat this as a hard gate.
Rules:
- every `.slide` must use `height: 100vh; height: 100dvh; overflow: hidden;`
- all type and spacing must scale with `clamp()`
- when content does not fit, split into multiple slides
- never solve overflow by shrinking text below readable sizes
- never allow scrollbars inside a slide
Use the density limits and mandatory CSS block in `STYLE_PRESETS.md`.
### 6. Validate
Check the finished deck at these sizes:
- 1920x1080
- 1280x720
- 768x1024
- 375x667
- 667x375
If browser automation is available, use it to verify no slide overflows and that keyboard navigation works.
### 7. Deliver
At handoff:
- delete temporary preview files unless the user wants to keep them
- open the deck with the platform-appropriate opener when useful
- summarize file path, preset used, slide count, and easy theme customization points
Use the correct opener for the current OS:
- macOS: `open file.html`
- Linux: `xdg-open file.html`
- Windows: `start "" file.html`
## PPT / PPTX Conversion
For PowerPoint conversion:
1. Prefer `python3` with `python-pptx` to extract text, images, and notes.
2. If `python-pptx` is unavailable, ask whether to install it or fall back to a manual/export-based workflow.
3. Preserve slide order, speaker notes, and extracted assets.
4. After extraction, run the same style-selection workflow as a new presentation.
Keep conversion cross-platform. Do not rely on macOS-only tools when Python can do the job.
## Implementation Requirements
### HTML / CSS
- Use inline CSS and JS unless the user explicitly wants a multi-file project.
- Fonts may come from Google Fonts or Fontshare.
- Prefer atmospheric backgrounds, strong type hierarchy, and a clear visual direction.
- Use abstract shapes, gradients, grids, noise, and geometry rather than illustrations.
### JavaScript
Include:
- keyboard navigation
- touch / swipe navigation
- mouse wheel navigation
- progress indicator or slide index
- reveal-on-enter animation triggers
### Accessibility
- use semantic structure (`main`, `section`, `nav`)
- keep contrast readable
- support keyboard-only navigation
- respect `prefers-reduced-motion`
## Content Density Limits
Use these maxima unless the user explicitly asks for denser slides and readability still holds:
| Slide type | Limit |
|------------|-------|
| Title | 1 heading + 1 subtitle + optional tagline |
| Content | 1 heading + 4-6 bullets or 2 short paragraphs |
| Feature grid | 6 cards max |
| Code | 8-10 lines max |
| Quote | 1 quote + attribution |
| Image | 1 image constrained by viewport |
## Anti-Patterns
- generic startup gradients with no visual identity
- system-font decks unless intentionally editorial
- long bullet walls
- code blocks that need scrolling
- fixed-height content boxes that break on short screens
- invalid negated CSS functions like `-clamp(...)`
## Related ECC Skills
- `frontend-patterns` for component and interaction patterns around the deck
- `liquid-glass-design` when a presentation intentionally borrows Apple glass aesthetics
- `e2e-testing` if you need automated browser verification for the final deck
## Deliverable Checklist
- presentation runs from a local file in a browser
- every slide fits the viewport without scrolling
- style is distinctive and intentional
- animation is meaningful, not noisy
- reduced motion is respected
- file paths and customization points are explained at handoff
================================================
FILE: .agents/skills/frontend-slides/STYLE_PRESETS.md
================================================
# Style Presets Reference
Curated visual styles for `frontend-slides`.
Use this file for:
- the mandatory viewport-fitting CSS base
- preset selection and mood mapping
- CSS gotchas and validation rules
Abstract shapes only. Avoid illustrations unless the user explicitly asks for them.
## Viewport Fit Is Non-Negotiable
Every slide must fully fit in one viewport.
### Golden Rule
```text
Each slide = exactly one viewport height.
Too much content = split into more slides.
Never scroll inside a slide.
```
### Density Limits
| Slide Type | Maximum Content |
|------------|-----------------|
| Title slide | 1 heading + 1 subtitle + optional tagline |
| Content slide | 1 heading + 4-6 bullets or 2 paragraphs |
| Feature grid | 6 cards maximum |
| Code slide | 8-10 lines maximum |
| Quote slide | 1 quote + attribution |
| Image slide | 1 image, ideally under 60vh |
## Mandatory Base CSS
Copy this block into every generated presentation and then theme on top of it.
```css
/* ===========================================
VIEWPORT FITTING: MANDATORY BASE STYLES
=========================================== */
html, body {
height: 100%;
overflow-x: hidden;
}
html {
scroll-snap-type: y mandatory;
scroll-behavior: smooth;
}
.slide {
width: 100vw;
height: 100vh;
height: 100dvh;
overflow: hidden;
scroll-snap-align: start;
display: flex;
flex-direction: column;
position: relative;
}
.slide-content {
flex: 1;
display: flex;
flex-direction: column;
justify-content: center;
max-height: 100%;
overflow: hidden;
padding: var(--slide-padding);
}
:root {
--title-size: clamp(1.5rem, 5vw, 4rem);
--h2-size: clamp(1.25rem, 3.5vw, 2.5rem);
--h3-size: clamp(1rem, 2.5vw, 1.75rem);
--body-size: clamp(0.75rem, 1.5vw, 1.125rem);
--small-size: clamp(0.65rem, 1vw, 0.875rem);
--slide-padding: clamp(1rem, 4vw, 4rem);
--content-gap: clamp(0.5rem, 2vw, 2rem);
--element-gap: clamp(0.25rem, 1vw, 1rem);
}
.card, .container, .content-box {
max-width: min(90vw, 1000px);
max-height: min(80vh, 700px);
}
.feature-list, .bullet-list {
gap: clamp(0.4rem, 1vh, 1rem);
}
.feature-list li, .bullet-list li {
font-size: var(--body-size);
line-height: 1.4;
}
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(min(100%, 250px), 1fr));
gap: clamp(0.5rem, 1.5vw, 1rem);
}
img, .image-container {
max-width: 100%;
max-height: min(50vh, 400px);
object-fit: contain;
}
@media (max-height: 700px) {
:root {
--slide-padding: clamp(0.75rem, 3vw, 2rem);
--content-gap: clamp(0.4rem, 1.5vw, 1rem);
--title-size: clamp(1.25rem, 4.5vw, 2.5rem);
--h2-size: clamp(1rem, 3vw, 1.75rem);
}
}
@media (max-height: 600px) {
:root {
--slide-padding: clamp(0.5rem, 2.5vw, 1.5rem);
--content-gap: clamp(0.3rem, 1vw, 0.75rem);
--title-size: clamp(1.1rem, 4vw, 2rem);
--body-size: clamp(0.7rem, 1.2vw, 0.95rem);
}
.nav-dots, .keyboard-hint, .decorative {
display: none;
}
}
@media (max-height: 500px) {
:root {
--slide-padding: clamp(0.4rem, 2vw, 1rem);
--title-size: clamp(1rem, 3.5vw, 1.5rem);
--h2-size: clamp(0.9rem, 2.5vw, 1.25rem);
--body-size: clamp(0.65rem, 1vw, 0.85rem);
}
}
@media (max-width: 600px) {
:root {
--title-size: clamp(1.25rem, 7vw, 2.5rem);
}
.grid {
grid-template-columns: 1fr;
}
}
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 0.01ms !important;
transition-duration: 0.2s !important;
}
html {
scroll-behavior: auto;
}
}
```
## Viewport Checklist
- every `.slide` has `height: 100vh`, `height: 100dvh`, and `overflow: hidden`
- all typography uses `clamp()`
- all spacing uses `clamp()` or viewport units
- images have `max-height` constraints
- grids adapt with `auto-fit` + `minmax()`
- short-height breakpoints exist at `700px`, `600px`, and `500px`
- if anything feels cramped, split the slide
## Mood to Preset Mapping
| Mood | Good Presets |
|------|--------------|
| Impressed / Confident | Bold Signal, Electric Studio, Dark Botanical |
| Excited / Energized | Creative Voltage, Neon Cyber, Split Pastel |
| Calm / Focused | Notebook Tabs, Paper & Ink, Swiss Modern |
| Inspired / Moved | Dark Botanical, Vintage Editorial, Pastel Geometry |
## Preset Catalog
### 1. Bold Signal
- Vibe: confident, high-impact, keynote-ready
- Best for: pitch decks, launches, statements
- Fonts: Archivo Black + Space Grotesk
- Palette: charcoal base, hot orange focal card, crisp white text
- Signature: oversized section numbers, high-contrast card on dark field
### 2. Electric Studio
- Vibe: clean, bold, agency-polished
- Best for: client presentations, strategic reviews
- Fonts: Manrope only
- Palette: black, white, saturated cobalt accent
- Signature: two-panel split and sharp editorial alignment
### 3. Creative Voltage
- Vibe: energetic, retro-modern, playful confidence
- Best for: creative studios, brand work, product storytelling
- Fonts: Syne + Space Mono
- Palette: electric blue, neon yellow, deep navy
- Signature: halftone textures, badges, punchy contrast
### 4. Dark Botanical
- Vibe: elegant, premium, atmospheric
- Best for: luxury brands, thoughtful narratives, premium product decks
- Fonts: Cormorant + IBM Plex Sans
- Palette: near-black, warm ivory, blush, gold, terracotta
- Signature: blurred abstract circles, fine rules, restrained motion
### 5. Notebook Tabs
- Vibe: editorial, organized, tactile
- Best for: reports, reviews, structured storytelling
- Fonts: Bodoni Moda + DM Sans
- Palette: cream paper on charcoal with pastel tabs
- Signature: paper sheet, colored side tabs, binder details
### 6. Pastel Geometry
- Vibe: approachable, modern, friendly
- Best for: product overviews, onboarding, lighter brand decks
- Fonts: Plus Jakarta Sans only
- Palette: pale blue field, cream card, soft pink/mint/lavender accents
- Signature: vertical pills, rounded cards, soft shadows
### 7. Split Pastel
- Vibe: playful, modern, creative
- Best for: agency intros, workshops, portfolios
- Fonts: Outfit only
- Palette: peach + lavender split with mint badges
- Signature: split backdrop, rounded tags, light grid overlays
### 8. Vintage Editorial
- Vibe: witty, personality-driven, magazine-inspired
- Best for: personal brands, opinionated talks, storytelling
- Fonts: Fraunces + Work Sans
- Palette: cream, charcoal, dusty warm accents
- Signature: geometric accents, bordered callouts, punchy serif headlines
### 9. Neon Cyber
- Vibe: futuristic, techy, kinetic
- Best for: AI, infra, dev tools, future-of-X talks
- Fonts: Clash Display + Satoshi
- Palette: midnight navy, cyan, magenta
- Signature: glow, particles, grids, data-radar energy
### 10. Terminal Green
- Vibe: developer-focused, hacker-clean
- Best for: APIs, CLI tools, engineering demos
- Fonts: JetBrains Mono only
- Palette: GitHub dark + terminal green
- Signature: scan lines, command-line framing, precise monospace rhythm
### 11. Swiss Modern
- Vibe: minimal, precise, data-forward
- Best for: corporate, product strategy, analytics
- Fonts: Archivo + Nunito
- Palette: white, black, signal red
- Signature: visible grids, asymmetry, geometric discipline
### 12. Paper & Ink
- Vibe: literary, thoughtful, story-driven
- Best for: essays, keynote narratives, manifesto decks
- Fonts: Cormorant Garamond + Source Serif 4
- Palette: warm cream, charcoal, crimson accent
- Signature: pull quotes, drop caps, elegant rules
## Direct Selection Prompts
If the user already knows the style they want, let them pick directly from the preset names above instead of forcing preview generation.
## Animation Feel Mapping
| Feeling | Motion Direction |
|---------|------------------|
| Dramatic / Cinematic | slow fades, parallax, large scale-ins |
| Techy / Futuristic | glow, particles, grid motion, scramble text |
| Playful / Friendly | springy easing, rounded shapes, floating motion |
| Professional / Corporate | subtle 200-300ms transitions, clean slides |
| Calm / Minimal | very restrained movement, whitespace-first |
| Editorial / Magazine | strong hierarchy, staggered text and image interplay |
## CSS Gotcha: Negating Functions
Never write these:
```css
right: -clamp(28px, 3.5vw, 44px);
margin-left: -min(10vw, 100px);
```
Browsers ignore them silently.
Always write this instead:
```css
right: calc(-1 * clamp(28px, 3.5vw, 44px));
margin-left: calc(-1 * min(10vw, 100px));
```
## Validation Sizes
Test at minimum:
- Desktop: `1920x1080`, `1440x900`, `1280x720`
- Tablet: `1024x768`, `768x1024`
- Mobile: `375x667`, `414x896`
- Landscape phone: `667x375`, `896x414`
## Anti-Patterns
Do not use:
- purple-on-white startup templates
- Inter / Roboto / Arial as the visual voice unless the user explicitly wants utilitarian neutrality
- bullet walls, tiny type, or code blocks that require scrolling
- decorative illustrations when abstract geometry would do the job better
================================================
FILE: .agents/skills/frontend-slides/agents/openai.yaml
================================================
interface:
display_name: "Frontend Slides"
short_description: "Create distinctive HTML slide decks and convert PPTX to web"
brand_color: "#FF6B3D"
default_prompt: "Create a viewport-safe HTML presentation with strong visual direction"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/investor-materials/SKILL.md
================================================
---
name: investor-materials
description: Create and update pitch decks, one-pagers, investor memos, accelerator applications, financial models, and fundraising materials. Use when the user needs investor-facing documents, projections, use-of-funds tables, milestone plans, or materials that must stay internally consistent across multiple fundraising assets.
origin: ECC
---
# Investor Materials
Build investor-facing materials that are consistent, credible, and easy to defend.
## When to Activate
- creating or revising a pitch deck
- writing an investor memo or one-pager
- building a financial model, milestone plan, or use-of-funds table
- answering accelerator or incubator application questions
- aligning multiple fundraising docs around one source of truth
## Golden Rule
All investor materials must agree with each other.
Create or confirm a single source of truth before writing:
- traction metrics
- pricing and revenue assumptions
- raise size and instrument
- use of funds
- team bios and titles
- milestones and timelines
If conflicting numbers appear, stop and resolve them before drafting.
## Core Workflow
1. inventory the canonical facts
2. identify missing assumptions
3. choose the asset type
4. draft the asset with explicit logic
5. cross-check every number against the source of truth
## Asset Guidance
### Pitch Deck
Recommended flow:
1. company + wedge
2. problem
3. solution
4. product / demo
5. market
6. business model
7. traction
8. team
9. competition / differentiation
10. ask
11. use of funds / milestones
12. appendix
If the user wants a web-native deck, pair this skill with `frontend-slides`.
### One-Pager / Memo
- state what the company does in one clean sentence
- show why now
- include traction and proof points early
- make the ask precise
- keep claims easy to verify
### Financial Model
Include:
- explicit assumptions
- bear / base / bull cases when useful
- clean layer-by-layer revenue logic
- milestone-linked spending
- sensitivity analysis where the decision hinges on assumptions
### Accelerator Applications
- answer the exact question asked
- prioritize traction, insight, and team advantage
- avoid puffery
- keep internal metrics consistent with the deck and model
## Red Flags to Avoid
- unverifiable claims
- fuzzy market sizing without assumptions
- inconsistent team roles or titles
- revenue math that does not sum cleanly
- inflated certainty where assumptions are fragile
## Quality Gate
Before delivering:
- every number matches the current source of truth
- use of funds and revenue layers sum correctly
- assumptions are visible, not buried
- the story is clear without hype language
- the final asset is defensible in a partner meeting
================================================
FILE: .agents/skills/investor-materials/agents/openai.yaml
================================================
interface:
display_name: "Investor Materials"
short_description: "Create decks, memos, and financial materials from one source of truth"
brand_color: "#7C3AED"
default_prompt: "Draft investor materials that stay numerically consistent across assets"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/investor-outreach/SKILL.md
================================================
---
name: investor-outreach
description: Draft cold emails, warm intro blurbs, follow-ups, update emails, and investor communications for fundraising. Use when the user wants outreach to angels, VCs, strategic investors, or accelerators and needs concise, personalized, investor-facing messaging.
origin: ECC
---
# Investor Outreach
Write investor communication that is short, personalized, and easy to act on.
## When to Activate
- writing a cold email to an investor
- drafting a warm intro request
- sending follow-ups after a meeting or no response
- writing investor updates during a process
- tailoring outreach based on fund thesis or partner fit
## Core Rules
1. Personalize every outbound message.
2. Keep the ask low-friction.
3. Use proof, not adjectives.
4. Stay concise.
5. Never send generic copy that could go to any investor.
## Cold Email Structure
1. subject line: short and specific
2. opener: why this investor specifically
3. pitch: what the company does, why now, what proof matters
4. ask: one concrete next step
5. sign-off: name, role, one credibility anchor if needed
## Personalization Sources
Reference one or more of:
- relevant portfolio companies
- a public thesis, talk, post, or article
- a mutual connection
- a clear market or product fit with the investor's focus
If that context is missing, ask for it or state that the draft is a template awaiting personalization.
## Follow-Up Cadence
Default:
- day 0: initial outbound
- day 4-5: short follow-up with one new data point
- day 10-12: final follow-up with a clean close
Do not keep nudging after that unless the user wants a longer sequence.
## Warm Intro Requests
Make life easy for the connector:
- explain why the intro is a fit
- include a forwardable blurb
- keep the forwardable blurb under 100 words
## Post-Meeting Updates
Include:
- the specific thing discussed
- the answer or update promised
- one new proof point if available
- the next step
## Quality Gate
Before delivering:
- message is personalized
- the ask is explicit
- there is no fluff or begging language
- the proof point is concrete
- word count stays tight
================================================
FILE: .agents/skills/investor-outreach/agents/openai.yaml
================================================
interface:
display_name: "Investor Outreach"
short_description: "Write concise, personalized outreach and follow-ups for fundraising"
brand_color: "#059669"
default_prompt: "Draft a personalized investor outreach email with a clear low-friction ask"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/market-research/SKILL.md
================================================
---
name: market-research
description: Conduct market research, competitive analysis, investor due diligence, and industry intelligence with source attribution and decision-oriented summaries. Use when the user wants market sizing, competitor comparisons, fund research, technology scans, or research that informs business decisions.
origin: ECC
---
# Market Research
Produce research that supports decisions, not research theater.
## When to Activate
- researching a market, category, company, investor, or technology trend
- building TAM/SAM/SOM estimates
- comparing competitors or adjacent products
- preparing investor dossiers before outreach
- pressure-testing a thesis before building, funding, or entering a market
## Research Standards
1. Every important claim needs a source.
2. Prefer recent data and call out stale data.
3. Include contrarian evidence and downside cases.
4. Translate findings into a decision, not just a summary.
5. Separate fact, inference, and recommendation clearly.
## Common Research Modes
### Investor / Fund Diligence
Collect:
- fund size, stage, and typical check size
- relevant portfolio companies
- public thesis and recent activity
- reasons the fund is or is not a fit
- any obvious red flags or mismatches
### Competitive Analysis
Collect:
- product reality, not marketing copy
- funding and investor history if public
- traction metrics if public
- distribution and pricing clues
- strengths, weaknesses, and positioning gaps
### Market Sizing
Use:
- top-down estimates from reports or public datasets
- bottom-up sanity checks from realistic customer acquisition assumptions
- explicit assumptions for every leap in logic
### Technology / Vendor Research
Collect:
- how it works
- trade-offs and adoption signals
- integration complexity
- lock-in, security, compliance, and operational risk
## Output Format
Default structure:
1. executive summary
2. key findings
3. implications
4. risks and caveats
5. recommendation
6. sources
## Quality Gate
Before delivering:
- all numbers are sourced or labeled as estimates
- old data is flagged
- the recommendation follows from the evidence
- risks and counterarguments are included
- the output makes a decision easier
================================================
FILE: .agents/skills/market-research/agents/openai.yaml
================================================
interface:
display_name: "Market Research"
short_description: "Source-attributed market, competitor, and investor research"
brand_color: "#2563EB"
default_prompt: "Research this market and summarize the decision-relevant findings"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/mcp-server-patterns/SKILL.md
================================================
---
name: mcp-server-patterns
description: Build MCP servers with Node/TypeScript SDK — tools, resources, prompts, Zod validation, stdio vs Streamable HTTP. Use Context7 or official MCP docs for latest API.
origin: ECC
---
# MCP Server Patterns
The Model Context Protocol (MCP) lets AI assistants call tools, read resources, and use prompts from your server. Use this skill when building or maintaining MCP servers. The SDK API evolves; check Context7 (query-docs for "MCP") or the official MCP documentation for current method names and signatures.
## When to Use
Use when: implementing a new MCP server, adding tools or resources, choosing stdio vs HTTP, upgrading the SDK, or debugging MCP registration and transport issues.
## How It Works
### Core concepts
- **Tools**: Actions the model can invoke (e.g. search, run a command). Register with `registerTool()` or `tool()` depending on SDK version.
- **Resources**: Read-only data the model can fetch (e.g. file contents, API responses). Register with `registerResource()` or `resource()`. Handlers typically receive a `uri` argument.
- **Prompts**: Reusable, parameterised prompt templates the client can surface (e.g. in Claude Desktop). Register with `registerPrompt()` or equivalent.
- **Transport**: stdio for local clients (e.g. Claude Desktop); Streamable HTTP is preferred for remote (Cursor, cloud). Legacy HTTP/SSE is for backward compatibility.
The Node/TypeScript SDK may expose `tool()` / `resource()` or `registerTool()` / `registerResource()`; the official SDK has changed over time. Always verify against the current [MCP docs](https://modelcontextprotocol.io) or Context7.
### Connecting with stdio
For local clients, create a stdio transport and pass it to your server’s connect method. The exact API varies by SDK version (e.g. constructor vs factory). See the official MCP documentation or query Context7 for "MCP stdio server" for the current pattern.
Keep server logic (tools + resources) independent of transport so you can plug in stdio or HTTP in the entrypoint.
### Remote (Streamable HTTP)
For Cursor, cloud, or other remote clients, use **Streamable HTTP** (single MCP HTTP endpoint per current spec). Support legacy HTTP/SSE only when backward compatibility is required.
## Examples
### Install and server setup
```bash
npm install @modelcontextprotocol/sdk zod
```
```typescript
import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { z } from "zod";
const server = new McpServer({ name: "my-server", version: "1.0.0" });
```
Register tools and resources using the API your SDK version provides: some versions use `server.tool(name, description, schema, handler)` (positional args), others use `server.tool({ name, description, inputSchema }, handler)` or `registerTool()`. Same for resources — include a `uri` in the handler when the API provides it. Check the official MCP docs or Context7 for the current `@modelcontextprotocol/sdk` signatures to avoid copy-paste errors.
Use **Zod** (or the SDK’s preferred schema format) for input validation.
## Best Practices
- **Schema first**: Define input schemas for every tool; document parameters and return shape.
- **Errors**: Return structured errors or messages the model can interpret; avoid raw stack traces.
- **Idempotency**: Prefer idempotent tools where possible so retries are safe.
- **Rate and cost**: For tools that call external APIs, consider rate limits and cost; document in the tool description.
- **Versioning**: Pin SDK version in package.json; check release notes when upgrading.
## Official SDKs and Docs
- **JavaScript/TypeScript**: `@modelcontextprotocol/sdk` (npm). Use Context7 with library name "MCP" for current registration and transport patterns.
- **Go**: Official Go SDK on GitHub (`modelcontextprotocol/go-sdk`).
- **C#**: Official C# SDK for .NET.
================================================
FILE: .agents/skills/nextjs-turbopack/SKILL.md
================================================
---
name: nextjs-turbopack
description: Next.js 16+ and Turbopack — incremental bundling, FS caching, dev speed, and when to use Turbopack vs webpack.
origin: ECC
---
# Next.js and Turbopack
Next.js 16+ uses Turbopack by default for local development: an incremental bundler written in Rust that significantly speeds up dev startup and hot updates.
## When to Use
- **Turbopack (default dev)**: Use for day-to-day development. Faster cold start and HMR, especially in large apps.
- **Webpack (legacy dev)**: Use only if you hit a Turbopack bug or rely on a webpack-only plugin in dev. Disable with `--webpack` (or `--no-turbopack` depending on your Next.js version; check the docs for your release).
- **Production**: Production build behavior (`next build`) may use Turbopack or webpack depending on Next.js version; check the official Next.js docs for your version.
Use when: developing or debugging Next.js 16+ apps, diagnosing slow dev startup or HMR, or optimizing production bundles.
## How It Works
- **Turbopack**: Incremental bundler for Next.js dev. Uses file-system caching so restarts are much faster (e.g. 5–14x on large projects).
- **Default in dev**: From Next.js 16, `next dev` runs with Turbopack unless disabled.
- **File-system caching**: Restarts reuse previous work; cache is typically under `.next`; no extra config needed for basic use.
- **Bundle Analyzer (Next.js 16.1+)**: Experimental Bundle Analyzer to inspect output and find heavy dependencies; enable via config or experimental flag (see Next.js docs for your version).
## Examples
### Commands
```bash
next dev
next build
next start
```
### Usage
Run `next dev` for local development with Turbopack. Use the Bundle Analyzer (see Next.js docs) to optimize code-splitting and trim large dependencies. Prefer App Router and server components where possible.
## Best Practices
- Stay on a recent Next.js 16.x for stable Turbopack and caching behavior.
- If dev is slow, ensure you're on Turbopack (default) and that the cache isn't being cleared unnecessarily.
- For production bundle size issues, use the official Next.js bundle analysis tooling for your version.
================================================
FILE: .agents/skills/nextjs-turbopack/agents/openai.yaml
================================================
interface:
display_name: "Next.js Turbopack"
short_description: "Next.js 16+ and Turbopack dev bundler"
brand_color: "#000000"
default_prompt: "Next.js dev, Turbopack, or bundle optimization"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/security-review/SKILL.md
================================================
---
name: security-review
description: Use this skill when adding authentication, handling user input, working with secrets, creating API endpoints, or implementing payment/sensitive features. Provides comprehensive security checklist and patterns.
origin: ECC
---
# Security Review Skill
This skill ensures all code follows security best practices and identifies potential vulnerabilities.
## When to Activate
- Implementing authentication or authorization
- Handling user input or file uploads
- Creating new API endpoints
- Working with secrets or credentials
- Implementing payment features
- Storing or transmitting sensitive data
- Integrating third-party APIs
## Security Checklist
### 1. Secrets Management
#### ❌ NEVER Do This
```typescript
const apiKey = "sk-proj-xxxxx" // Hardcoded secret
const dbPassword = "password123" // In source code
```
#### ✅ ALWAYS Do This
```typescript
const apiKey = process.env.OPENAI_API_KEY
const dbUrl = process.env.DATABASE_URL
// Verify secrets exist
if (!apiKey) {
throw new Error('OPENAI_API_KEY not configured')
}
```
#### Verification Steps
- [ ] No hardcoded API keys, tokens, or passwords
- [ ] All secrets in environment variables
- [ ] `.env.local` in .gitignore
- [ ] No secrets in git history
- [ ] Production secrets in hosting platform (Vercel, Railway)
### 2. Input Validation
#### Always Validate User Input
```typescript
import { z } from 'zod'
// Define validation schema
const CreateUserSchema = z.object({
email: z.string().email(),
name: z.string().min(1).max(100),
age: z.number().int().min(0).max(150)
})
// Validate before processing
export async function createUser(input: unknown) {
try {
const validated = CreateUserSchema.parse(input)
return await db.users.create(validated)
} catch (error) {
if (error instanceof z.ZodError) {
return { success: false, errors: error.errors }
}
throw error
}
}
```
#### File Upload Validation
```typescript
function validateFileUpload(file: File) {
// Size check (5MB max)
const maxSize = 5 * 1024 * 1024
if (file.size > maxSize) {
throw new Error('File too large (max 5MB)')
}
// Type check
const allowedTypes = ['image/jpeg', 'image/png', 'image/gif']
if (!allowedTypes.includes(file.type)) {
throw new Error('Invalid file type')
}
// Extension check
const allowedExtensions = ['.jpg', '.jpeg', '.png', '.gif']
const extension = file.name.toLowerCase().match(/\.[^.]+$/)?.[0]
if (!extension || !allowedExtensions.includes(extension)) {
throw new Error('Invalid file extension')
}
return true
}
```
#### Verification Steps
- [ ] All user inputs validated with schemas
- [ ] File uploads restricted (size, type, extension)
- [ ] No direct use of user input in queries
- [ ] Whitelist validation (not blacklist)
- [ ] Error messages don't leak sensitive info
### 3. SQL Injection Prevention
#### ❌ NEVER Concatenate SQL
```typescript
// DANGEROUS - SQL Injection vulnerability
const query = `SELECT * FROM users WHERE email = '${userEmail}'`
await db.query(query)
```
#### ✅ ALWAYS Use Parameterized Queries
```typescript
// Safe - parameterized query
const { data } = await supabase
.from('users')
.select('*')
.eq('email', userEmail)
// Or with raw SQL
await db.query(
'SELECT * FROM users WHERE email = $1',
[userEmail]
)
```
#### Verification Steps
- [ ] All database queries use parameterized queries
- [ ] No string concatenation in SQL
- [ ] ORM/query builder used correctly
- [ ] Supabase queries properly sanitized
### 4. Authentication & Authorization
#### JWT Token Handling
```typescript
// ❌ WRONG: localStorage (vulnerable to XSS)
localStorage.setItem('token', token)
// ✅ CORRECT: httpOnly cookies
res.setHeader('Set-Cookie',
`token=${token}; HttpOnly; Secure; SameSite=Strict; Max-Age=3600`)
```
#### Authorization Checks
```typescript
export async function deleteUser(userId: string, requesterId: string) {
// ALWAYS verify authorization first
const requester = await db.users.findUnique({
where: { id: requesterId }
})
if (requester.role !== 'admin') {
return NextResponse.json(
{ error: 'Unauthorized' },
{ status: 403 }
)
}
// Proceed with deletion
await db.users.delete({ where: { id: userId } })
}
```
#### Row Level Security (Supabase)
```sql
-- Enable RLS on all tables
ALTER TABLE users ENABLE ROW LEVEL SECURITY;
-- Users can only view their own data
CREATE POLICY "Users view own data"
ON users FOR SELECT
USING (auth.uid() = id);
-- Users can only update their own data
CREATE POLICY "Users update own data"
ON users FOR UPDATE
USING (auth.uid() = id);
```
#### Verification Steps
- [ ] Tokens stored in httpOnly cookies (not localStorage)
- [ ] Authorization checks before sensitive operations
- [ ] Row Level Security enabled in Supabase
- [ ] Role-based access control implemented
- [ ] Session management secure
### 5. XSS Prevention
#### Sanitize HTML
```typescript
import DOMPurify from 'isomorphic-dompurify'
// ALWAYS sanitize user-provided HTML
function renderUserContent(html: string) {
const clean = DOMPurify.sanitize(html, {
ALLOWED_TAGS: ['b', 'i', 'em', 'strong', 'p'],
ALLOWED_ATTR: []
})
return <div dangerouslySetInnerHTML={{ __html: clean }} />
}
```
#### Content Security Policy
```typescript
// next.config.js
const securityHeaders = [
{
key: 'Content-Security-Policy',
value: `
default-src 'self';
script-src 'self' 'unsafe-eval' 'unsafe-inline';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;
font-src 'self';
connect-src 'self' https://api.example.com;
`.replace(/\s{2,}/g, ' ').trim()
}
]
```
#### Verification Steps
- [ ] User-provided HTML sanitized
- [ ] CSP headers configured
- [ ] No unvalidated dynamic content rendering
- [ ] React's built-in XSS protection used
### 6. CSRF Protection
#### CSRF Tokens
```typescript
import { csrf } from '@/lib/csrf'
export async function POST(request: Request) {
const token = request.headers.get('X-CSRF-Token')
if (!csrf.verify(token)) {
return NextResponse.json(
{ error: 'Invalid CSRF token' },
{ status: 403 }
)
}
// Process request
}
```
#### SameSite Cookies
```typescript
res.setHeader('Set-Cookie',
`session=${sessionId}; HttpOnly; Secure; SameSite=Strict`)
```
#### Verification Steps
- [ ] CSRF tokens on state-changing operations
- [ ] SameSite=Strict on all cookies
- [ ] Double-submit cookie pattern implemented
### 7. Rate Limiting
#### API Rate Limiting
```typescript
import rateLimit from 'express-rate-limit'
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // 100 requests per window
message: 'Too many requests'
})
// Apply to routes
app.use('/api/', limiter)
```
#### Expensive Operations
```typescript
// Aggressive rate limiting for searches
const searchLimiter = rateLimit({
windowMs: 60 * 1000, // 1 minute
max: 10, // 10 requests per minute
message: 'Too many search requests'
})
app.use('/api/search', searchLimiter)
```
#### Verification Steps
- [ ] Rate limiting on all API endpoints
- [ ] Stricter limits on expensive operations
- [ ] IP-based rate limiting
- [ ] User-based rate limiting (authenticated)
### 8. Sensitive Data Exposure
#### Logging
```typescript
// ❌ WRONG: Logging sensitive data
console.log('User login:', { email, password })
console.log('Payment:', { cardNumber, cvv })
// ✅ CORRECT: Redact sensitive data
console.log('User login:', { email, userId })
console.log('Payment:', { last4: card.last4, userId })
```
#### Error Messages
```typescript
// ❌ WRONG: Exposing internal details
catch (error) {
return NextResponse.json(
{ error: error.message, stack: error.stack },
{ status: 500 }
)
}
// ✅ CORRECT: Generic error messages
catch (error) {
console.error('Internal error:', error)
return NextResponse.json(
{ error: 'An error occurred. Please try again.' },
{ status: 500 }
)
}
```
#### Verification Steps
- [ ] No passwords, tokens, or secrets in logs
- [ ] Error messages generic for users
- [ ] Detailed errors only in server logs
- [ ] No stack traces exposed to users
### 9. Blockchain Security (Solana)
#### Wallet Verification
```typescript
import { verify } from '@solana/web3.js'
async function verifyWalletOwnership(
publicKey: string,
signature: string,
message: string
) {
try {
const isValid = verify(
Buffer.from(message),
Buffer.from(signature, 'base64'),
Buffer.from(publicKey, 'base64')
)
return isValid
} catch (error) {
return false
}
}
```
#### Transaction Verification
```typescript
async function verifyTransaction(transaction: Transaction) {
// Verify recipient
if (transaction.to !== expectedRecipient) {
throw new Error('Invalid recipient')
}
// Verify amount
if (transaction.amount > maxAmount) {
throw new Error('Amount exceeds limit')
}
// Verify user has sufficient balance
const balance = await getBalance(transaction.from)
if (balance < transaction.amount) {
throw new Error('Insufficient balance')
}
return true
}
```
#### Verification Steps
- [ ] Wallet signatures verified
- [ ] Transaction details validated
- [ ] Balance checks before transactions
- [ ] No blind transaction signing
### 10. Dependency Security
#### Regular Updates
```bash
# Check for vulnerabilities
npm audit
# Fix automatically fixable issues
npm audit fix
# Update dependencies
npm update
# Check for outdated packages
npm outdated
```
#### Lock Files
```bash
# ALWAYS commit lock files
git add package-lock.json
# Use in CI/CD for reproducible builds
npm ci # Instead of npm install
```
#### Verification Steps
- [ ] Dependencies up to date
- [ ] No known vulnerabilities (npm audit clean)
- [ ] Lock files committed
- [ ] Dependabot enabled on GitHub
- [ ] Regular security updates
## Security Testing
### Automated Security Tests
```typescript
// Test authentication
test('requires authentication', async () => {
const response = await fetch('/api/protected')
expect(response.status).toBe(401)
})
// Test authorization
test('requires admin role', async () => {
const response = await fetch('/api/admin', {
headers: { Authorization: `Bearer ${userToken}` }
})
expect(response.status).toBe(403)
})
// Test input validation
test('rejects invalid input', async () => {
const response = await fetch('/api/users', {
method: 'POST',
body: JSON.stringify({ email: 'not-an-email' })
})
expect(response.status).toBe(400)
})
// Test rate limiting
test('enforces rate limits', async () => {
const requests = Array(101).fill(null).map(() =>
fetch('/api/endpoint')
)
const responses = await Promise.all(requests)
const tooManyRequests = responses.filter(r => r.status === 429)
expect(tooManyRequests.length).toBeGreaterThan(0)
})
```
## Pre-Deployment Security Checklist
Before ANY production deployment:
- [ ] **Secrets**: No hardcoded secrets, all in env vars
- [ ] **Input Validation**: All user inputs validated
- [ ] **SQL Injection**: All queries parameterized
- [ ] **XSS**: User content sanitized
- [ ] **CSRF**: Protection enabled
- [ ] **Authentication**: Proper token handling
- [ ] **Authorization**: Role checks in place
- [ ] **Rate Limiting**: Enabled on all endpoints
- [ ] **HTTPS**: Enforced in production
- [ ] **Security Headers**: CSP, X-Frame-Options configured
- [ ] **Error Handling**: No sensitive data in errors
- [ ] **Logging**: No sensitive data logged
- [ ] **Dependencies**: Up to date, no vulnerabilities
- [ ] **Row Level Security**: Enabled in Supabase
- [ ] **CORS**: Properly configured
- [ ] **File Uploads**: Validated (size, type)
- [ ] **Wallet Signatures**: Verified (if blockchain)
## Resources
- [OWASP Top 10](https://owasp.org/www-project-top-ten/)
- [Next.js Security](https://nextjs.org/docs/security)
- [Supabase Security](https://supabase.com/docs/guides/auth)
- [Web Security Academy](https://portswigger.net/web-security)
---
**Remember**: Security is not optional. One vulnerability can compromise the entire platform. When in doubt, err on the side of caution.
================================================
FILE: .agents/skills/security-review/agents/openai.yaml
================================================
interface:
display_name: "Security Review"
short_description: "Comprehensive security checklist and vulnerability detection"
brand_color: "#EF4444"
default_prompt: "Run security checklist: secrets, input validation, injection prevention"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/strategic-compact/SKILL.md
================================================
---
name: strategic-compact
description: Suggests manual context compaction at logical intervals to preserve context through task phases rather than arbitrary auto-compaction.
origin: ECC
---
# Strategic Compact Skill
Suggests manual `/compact` at strategic points in your workflow rather than relying on arbitrary auto-compaction.
## When to Activate
- Running long sessions that approach context limits (200K+ tokens)
- Working on multi-phase tasks (research → plan → implement → test)
- Switching between unrelated tasks within the same session
- After completing a major milestone and starting new work
- When responses slow down or become less coherent (context pressure)
## Why Strategic Compaction?
Auto-compaction triggers at arbitrary points:
- Often mid-task, losing important context
- No awareness of logical task boundaries
- Can interrupt complex multi-step operations
Strategic compaction at logical boundaries:
- **After exploration, before execution** — Compact research context, keep implementation plan
- **After completing a milestone** — Fresh start for next phase
- **Before major context shifts** — Clear exploration context before different task
## How It Works
The `suggest-compact.js` script runs on PreToolUse (Edit/Write) and:
1. **Tracks tool calls** — Counts tool invocations in session
2. **Threshold detection** — Suggests at configurable threshold (default: 50 calls)
3. **Periodic reminders** — Reminds every 25 calls after threshold
## Hook Setup
Add to your `~/.claude/settings.json`:
```json
{
"hooks": {
"PreToolUse": [
{
"matcher": "Edit",
"hooks": [{ "type": "command", "command": "node ~/.claude/skills/strategic-compact/suggest-compact.js" }]
},
{
"matcher": "Write",
"hooks": [{ "type": "command", "command": "node ~/.claude/skills/strategic-compact/suggest-compact.js" }]
}
]
}
}
```
## Configuration
Environment variables:
- `COMPACT_THRESHOLD` — Tool calls before first suggestion (default: 50)
## Compaction Decision Guide
Use this table to decide when to compact:
| Phase Transition | Compact? | Why |
|-----------------|----------|-----|
| Research → Planning | Yes | Research context is bulky; plan is the distilled output |
| Planning → Implementation | Yes | Plan is in TodoWrite or a file; free up context for code |
| Implementation → Testing | Maybe | Keep if tests reference recent code; compact if switching focus |
| Debugging → Next feature | Yes | Debug traces pollute context for unrelated work |
| Mid-implementation | No | Losing variable names, file paths, and partial state is costly |
| After a failed approach | Yes | Clear the dead-end reasoning before trying a new approach |
## What Survives Compaction
Understanding what persists helps you compact with confidence:
| Persists | Lost |
|----------|------|
| CLAUDE.md instructions | Intermediate reasoning and analysis |
| TodoWrite task list | File contents you previously read |
| Memory files (`~/.claude/memory/`) | Multi-step conversation context |
| Git state (commits, branches) | Tool call history and counts |
| Files on disk | Nuanced user preferences stated verbally |
## Best Practices
1. **Compact after planning** — Once plan is finalized in TodoWrite, compact to start fresh
2. **Compact after debugging** — Clear error-resolution context before continuing
3. **Don't compact mid-implementation** — Preserve context for related changes
4. **Read the suggestion** — The hook tells you *when*, you decide *if*
5. **Write before compacting** — Save important context to files or memory before compacting
6. **Use `/compact` with a summary** — Add a custom message: `/compact Focus on implementing auth middleware next`
## Related
- [The Longform Guide](https://x.com/affaanmustafa/status/2014040193557471352) — Token optimization section
- Memory persistence hooks — For state that survives compaction
- `continuous-learning` skill — Extracts patterns before session ends
================================================
FILE: .agents/skills/strategic-compact/agents/openai.yaml
================================================
interface:
display_name: "Strategic Compact"
short_description: "Context management via strategic compaction"
brand_color: "#14B8A6"
default_prompt: "Suggest task boundary compaction for context management"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/tdd-workflow/SKILL.md
================================================
---
name: tdd-workflow
description: Use this skill when writing new features, fixing bugs, or refactoring code. Enforces test-driven development with 80%+ coverage including unit, integration, and E2E tests.
origin: ECC
---
# Test-Driven Development Workflow
This skill ensures all code development follows TDD principles with comprehensive test coverage.
## When to Activate
- Writing new features or functionality
- Fixing bugs or issues
- Refactoring existing code
- Adding API endpoints
- Creating new components
## Core Principles
### 1. Tests BEFORE Code
ALWAYS write tests first, then implement code to make tests pass.
### 2. Coverage Requirements
- Minimum 80% coverage (unit + integration + E2E)
- All edge cases covered
- Error scenarios tested
- Boundary conditions verified
### 3. Test Types
#### Unit Tests
- Individual functions and utilities
- Component logic
- Pure functions
- Helpers and utilities
#### Integration Tests
- API endpoints
- Database operations
- Service interactions
- External API calls
#### E2E Tests (Playwright)
- Critical user flows
- Complete workflows
- Browser automation
- UI interactions
## TDD Workflow Steps
### Step 1: Write User Journeys
```
As a [role], I want to [action], so that [benefit]
Example:
As a user, I want to search for markets semantically,
so that I can find relevant markets even without exact keywords.
```
### Step 2: Generate Test Cases
For each user journey, create comprehensive test cases:
```typescript
describe('Semantic Search', () => {
it('returns relevant markets for query', async () => {
// Test implementation
})
it('handles empty query gracefully', async () => {
// Test edge case
})
it('falls back to substring search when Redis unavailable', async () => {
// Test fallback behavior
})
it('sorts results by similarity score', async () => {
// Test sorting logic
})
})
```
### Step 3: Run Tests (They Should Fail)
```bash
npm test
# Tests should fail - we haven't implemented yet
```
### Step 4: Implement Code
Write minimal code to make tests pass:
```typescript
// Implementation guided by tests
export async function searchMarkets(query: string) {
// Implementation here
}
```
### Step 5: Run Tests Again
```bash
npm test
# Tests should now pass
```
### Step 6: Refactor
Improve code quality while keeping tests green:
- Remove duplication
- Improve naming
- Optimize performance
- Enhance readability
### Step 7: Verify Coverage
```bash
npm run test:coverage
# Verify 80%+ coverage achieved
```
## Testing Patterns
### Unit Test Pattern (Jest/Vitest)
```typescript
import { render, screen, fireEvent } from '@testing-library/react'
import { Button } from './Button'
describe('Button Component', () => {
it('renders with correct text', () => {
render(<Button>Click me</Button>)
expect(screen.getByText('Click me')).toBeInTheDocument()
})
it('calls onClick when clicked', () => {
const handleClick = jest.fn()
render(<Button onClick={handleClick}>Click</Button>)
fireEvent.click(screen.getByRole('button'))
expect(handleClick).toHaveBeenCalledTimes(1)
})
it('is disabled when disabled prop is true', () => {
render(<Button disabled>Click</Button>)
expect(screen.getByRole('button')).toBeDisabled()
})
})
```
### API Integration Test Pattern
```typescript
import { NextRequest } from 'next/server'
import { GET } from './route'
describe('GET /api/markets', () => {
it('returns markets successfully', async () => {
const request = new NextRequest('http://localhost/api/markets')
const response = await GET(request)
const data = await response.json()
expect(response.status).toBe(200)
expect(data.success).toBe(true)
expect(Array.isArray(data.data)).toBe(true)
})
it('validates query parameters', async () => {
const request = new NextRequest('http://localhost/api/markets?limit=invalid')
const response = await GET(request)
expect(response.status).toBe(400)
})
it('handles database errors gracefully', async () => {
// Mock database failure
const request = new NextRequest('http://localhost/api/markets')
// Test error handling
})
})
```
### E2E Test Pattern (Playwright)
```typescript
import { test, expect } from '@playwright/test'
test('user can search and filter markets', async ({ page }) => {
// Navigate to markets page
await page.goto('/')
await page.click('a[href="/markets"]')
// Verify page loaded
await expect(page.locator('h1')).toContainText('Markets')
// Search for markets
await page.fill('input[placeholder="Search markets"]', 'election')
// Wait for debounce and results
await page.waitForTimeout(600)
// Verify search results displayed
const results = page.locator('[data-testid="market-card"]')
await expect(results).toHaveCount(5, { timeout: 5000 })
// Verify results contain search term
const firstResult = results.first()
await expect(firstResult).toContainText('election', { ignoreCase: true })
// Filter by status
await page.click('button:has-text("Active")')
// Verify filtered results
await expect(results).toHaveCount(3)
})
test('user can create a new market', async ({ page }) => {
// Login first
await page.goto('/creator-dashboard')
// Fill market creation form
await page.fill('input[name="name"]', 'Test Market')
await page.fill('textarea[name="description"]', 'Test description')
await page.fill('input[name="endDate"]', '2025-12-31')
// Submit form
await page.click('button[type="submit"]')
// Verify success message
await expect(page.locator('text=Market created successfully')).toBeVisible()
// Verify redirect to market page
await expect(page).toHaveURL(/\/markets\/test-market/)
})
```
## Test File Organization
```
src/
├── components/
│ ├── Button/
│ │ ├── Button.tsx
│ │ ├── Button.test.tsx # Unit tests
│ │ └── Button.stories.tsx # Storybook
│ └── MarketCard/
│ ├── MarketCard.tsx
│ └── MarketCard.test.tsx
├── app/
│ └── api/
│ └── markets/
│ ├── route.ts
│ └── route.test.ts # Integration tests
└── e2e/
├── markets.spec.ts # E2E tests
├── trading.spec.ts
└── auth.spec.ts
```
## Mocking External Services
### Supabase Mock
```typescript
jest.mock('@/lib/supabase', () => ({
supabase: {
from: jest.fn(() => ({
select: jest.fn(() => ({
eq: jest.fn(() => Promise.resolve({
data: [{ id: 1, name: 'Test Market' }],
error: null
}))
}))
}))
}
}))
```
### Redis Mock
```typescript
jest.mock('@/lib/redis', () => ({
searchMarketsByVector: jest.fn(() => Promise.resolve([
{ slug: 'test-market', similarity_score: 0.95 }
])),
checkRedisHealth: jest.fn(() => Promise.resolve({ connected: true }))
}))
```
### OpenAI Mock
```typescript
jest.mock('@/lib/openai', () => ({
generateEmbedding: jest.fn(() => Promise.resolve(
new Array(1536).fill(0.1) // Mock 1536-dim embedding
))
}))
```
## Test Coverage Verification
### Run Coverage Report
```bash
npm run test:coverage
```
### Coverage Thresholds
```json
{
"jest": {
"coverageThresholds": {
"global": {
"branches": 80,
"functions": 80,
"lines": 80,
"statements": 80
}
}
}
}
```
## Common Testing Mistakes to Avoid
### ❌ WRONG: Testing Implementation Details
```typescript
// Don't test internal state
expect(component.state.count).toBe(5)
```
### ✅ CORRECT: Test User-Visible Behavior
```typescript
// Test what users see
expect(screen.getByText('Count: 5')).toBeInTheDocument()
```
### ❌ WRONG: Brittle Selectors
```typescript
// Breaks easily
await page.click('.css-class-xyz')
```
### ✅ CORRECT: Semantic Selectors
```typescript
// Resilient to changes
await page.click('button:has-text("Submit")')
await page.click('[data-testid="submit-button"]')
```
### ❌ WRONG: No Test Isolation
```typescript
// Tests depend on each other
test('creates user', () => { /* ... */ })
test('updates same user', () => { /* depends on previous test */ })
```
### ✅ CORRECT: Independent Tests
```typescript
// Each test sets up its own data
test('creates user', () => {
const user = createTestUser()
// Test logic
})
test('updates user', () => {
const user = createTestUser()
// Update logic
})
```
## Continuous Testing
### Watch Mode During Development
```bash
npm test -- --watch
# Tests run automatically on file changes
```
### Pre-Commit Hook
```bash
# Runs before every commit
npm test && npm run lint
```
### CI/CD Integration
```yaml
# GitHub Actions
- name: Run Tests
run: npm test -- --coverage
- name: Upload Coverage
uses: codecov/codecov-action@v3
```
## Best Practices
1. **Write Tests First** - Always TDD
2. **One Assert Per Test** - Focus on single behavior
3. **Descriptive Test Names** - Explain what's tested
4. **Arrange-Act-Assert** - Clear test structure
5. **Mock External Dependencies** - Isolate unit tests
6. **Test Edge Cases** - Null, undefined, empty, large
7. **Test Error Paths** - Not just happy paths
8. **Keep Tests Fast** - Unit tests < 50ms each
9. **Clean Up After Tests** - No side effects
10. **Review Coverage Reports** - Identify gaps
## Success Metrics
- 80%+ code coverage achieved
- All tests passing (green)
- No skipped or disabled tests
- Fast test execution (< 30s for unit tests)
- E2E tests cover critical user flows
- Tests catch bugs before production
---
**Remember**: Tests are not optional. They are the safety net that enables confident refactoring, rapid development, and production reliability.
================================================
FILE: .agents/skills/tdd-workflow/agents/openai.yaml
================================================
interface:
display_name: "TDD Workflow"
short_description: "Test-driven development with 80%+ coverage"
brand_color: "#22C55E"
default_prompt: "Follow TDD: write tests first, implement, verify 80%+ coverage"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/verification-loop/SKILL.md
================================================
---
name: verification-loop
description: "A comprehensive verification system for Claude Code sessions."
origin: ECC
---
# Verification Loop Skill
A comprehensive verification system for Claude Code sessions.
## When to Use
Invoke this skill:
- After completing a feature or significant code change
- Before creating a PR
- When you want to ensure quality gates pass
- After refactoring
## Verification Phases
### Phase 1: Build Verification
```bash
# Check if project builds
npm run build 2>&1 | tail -20
# OR
pnpm build 2>&1 | tail -20
```
If build fails, STOP and fix before continuing.
### Phase 2: Type Check
```bash
# TypeScript projects
npx tsc --noEmit 2>&1 | head -30
# Python projects
pyright . 2>&1 | head -30
```
Report all type errors. Fix critical ones before continuing.
### Phase 3: Lint Check
```bash
# JavaScript/TypeScript
npm run lint 2>&1 | head -30
# Python
ruff check . 2>&1 | head -30
```
### Phase 4: Test Suite
```bash
# Run tests with coverage
npm run test -- --coverage 2>&1 | tail -50
# Check coverage threshold
# Target: 80% minimum
```
Report:
- Total tests: X
- Passed: X
- Failed: X
- Coverage: X%
### Phase 5: Security Scan
```bash
# Check for secrets
grep -rn "sk-" --include="*.ts" --include="*.js" . 2>/dev/null | head -10
grep -rn "api_key" --include="*.ts" --include="*.js" . 2>/dev/null | head -10
# Check for console.log
grep -rn "console.log" --include="*.ts" --include="*.tsx" src/ 2>/dev/null | head -10
```
### Phase 6: Diff Review
```bash
# Show what changed
git diff --stat
git diff HEAD~1 --name-only
```
Review each changed file for:
- Unintended changes
- Missing error handling
- Potential edge cases
## Output Format
After running all phases, produce a verification report:
```
VERIFICATION REPORT
==================
Build: [PASS/FAIL]
Types: [PASS/FAIL] (X errors)
Lint: [PASS/FAIL] (X warnings)
Tests: [PASS/FAIL] (X/Y passed, Z% coverage)
Security: [PASS/FAIL] (X issues)
Diff: [X files changed]
Overall: [READY/NOT READY] for PR
Issues to Fix:
1. ...
2. ...
```
## Continuous Mode
For long sessions, run verification every 15 minutes or after major changes:
```markdown
Set a mental checkpoint:
- After completing each function
- After finishing a component
- Before moving to next task
Run: /verify
```
## Integration with Hooks
This skill complements PostToolUse hooks but provides deeper verification.
Hooks catch issues immediately; this skill provides comprehensive review.
================================================
FILE: .agents/skills/verification-loop/agents/openai.yaml
================================================
interface:
display_name: "Verification Loop"
short_description: "Build, test, lint, typecheck verification"
brand_color: "#10B981"
default_prompt: "Run verification: build, test, lint, typecheck, security"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/video-editing/SKILL.md
================================================
---
name: video-editing
description: AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.
origin: ECC
---
# Video Editing
AI-assisted editing for real footage. Not generation from prompts. Editing existing video fast.
## When to Activate
- User wants to edit, cut, or structure video footage
- Turning long recordings into short-form content
- Building vlogs, tutorials, or demo videos from raw capture
- Adding overlays, subtitles, music, or voiceover to existing video
- Reframing video for different platforms (YouTube, TikTok, Instagram)
- User says "edit video", "cut this footage", "make a vlog", or "video workflow"
## Core Thesis
AI video editing is useful when you stop asking it to create the whole video and start using it to compress, structure, and augment real footage. The value is not generation. The value is compression.
## The Pipeline
```
Screen Studio / raw footage
→ Claude / Codex
→ FFmpeg
→ Remotion
→ ElevenLabs / fal.ai
→ Descript or CapCut
```
Each layer has a specific job. Do not skip layers. Do not try to make one tool do everything.
## Layer 1: Capture (Screen Studio / Raw Footage)
Collect the source material:
- **Screen Studio**: polished screen recordings for app demos, coding sessions, browser workflows
- **Raw camera footage**: vlog footage, interviews, event recordings
- **Desktop capture via VideoDB**: session recording with real-time context (see `videodb` skill)
Output: raw files ready for organization.
## Layer 2: Organization (Claude / Codex)
Use Claude Code or Codex to:
- **Transcribe and label**: generate transcript, identify topics and themes
- **Plan structure**: decide what stays, what gets cut, what order works
- **Identify dead sections**: find pauses, tangents, repeated takes
- **Generate edit decision list**: timestamps for cuts, segments to keep
- **Scaffold FFmpeg and Remotion code**: generate the commands and compositions
```
Example prompt:
"Here's the transcript of a 4-hour recording. Identify the 8 strongest segments
for a 24-minute vlog. Give me FFmpeg cut commands for each segment."
```
This layer is about structure, not final creative taste.
## Layer 3: Deterministic Cuts (FFmpeg)
FFmpeg handles the boring but critical work: splitting, trimming, concatenating, and preprocessing.
### Extract segment by timestamp
```bash
ffmpeg -i raw.mp4 -ss 00:12:30 -to 00:15:45 -c copy segment_01.mp4
```
### Batch cut from edit decision list
```bash
#!/bin/bash
# cuts.txt: start,end,label
while IFS=, read -r start end label; do
ffmpeg -i raw.mp4 -ss "$start" -to "$end" -c copy "segments/${label}.mp4"
done < cuts.txt
```
### Concatenate segments
```bash
# Create file list
for f in segments/*.mp4; do echo "file '$f'"; done > concat.txt
ffmpeg -f concat -safe 0 -i concat.txt -c copy assembled.mp4
```
### Create proxy for faster editing
```bash
ffmpeg -i raw.mp4 -vf "scale=960:-2" -c:v libx264 -preset ultrafast -crf 28 proxy.mp4
```
### Extract audio for transcription
```bash
ffmpeg -i raw.mp4 -vn -acodec pcm_s16le -ar 16000 audio.wav
```
### Normalize audio levels
```bash
ffmpeg -i segment.mp4 -af loudnorm=I=-16:TP=-1.5:LRA=11 -c:v copy normalized.mp4
```
## Layer 4: Programmable Composition (Remotion)
Remotion turns editing problems into composable code. Use it for things that traditional editors make painful:
### When to use Remotion
- Overlays: text, images, branding, lower thirds
- Data visualizations: charts, stats, animated numbers
- Motion graphics: transitions, explainer animations
- Composable scenes: reusable templates across videos
- Product demos: annotated screenshots, UI highlights
### Basic Remotion composition
```tsx
import { AbsoluteFill, Sequence, Video, useCurrentFrame } from "remotion";
export const VlogComposition: React.FC = () => {
const frame = useCurrentFrame();
return (
<AbsoluteFill>
{/* Main footage */}
<Sequence from={0} durationInFrames={300}>
<Video src="/segments/intro.mp4" />
</Sequence>
{/* Title overlay */}
<Sequence from={30} durationInFrames={90}>
<AbsoluteFill style={{
justifyContent: "center",
alignItems: "center",
}}>
<h1 style={{
fontSize: 72,
color: "white",
textShadow: "2px 2px 8px rgba(0,0,0,0.8)",
}}>
The AI Editing Stack
</h1>
</AbsoluteFill>
</Sequence>
{/* Next segment */}
<Sequence from={300} durationInFrames={450}>
<Video src="/segments/demo.mp4" />
</Sequence>
</AbsoluteFill>
);
};
```
### Render output
```bash
npx remotion render src/index.ts VlogComposition output.mp4
```
See the [Remotion docs](https://www.remotion.dev/docs) for detailed patterns and API reference.
## Layer 5: Generated Assets (ElevenLabs / fal.ai)
Generate only what you need. Do not generate the whole video.
### Voiceover with ElevenLabs
```python
import os
import requests
resp = requests.post(
f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}",
headers={
"xi-api-key": os.environ["ELEVENLABS_API_KEY"],
"Content-Type": "application/json"
},
json={
"text": "Your narration text here",
"model_id": "eleven_turbo_v2_5",
"voice_settings": {"stability": 0.5, "similarity_boost": 0.75}
}
)
with open("voiceover.mp3", "wb") as f:
f.write(resp.content)
```
### Music and SFX with fal.ai
Use the `fal-ai-media` skill for:
- Background music generation
- Sound effects (ThinkSound model for video-to-audio)
- Transition sounds
### Generated visuals with fal.ai
Use for insert shots, thumbnails, or b-roll that doesn't exist:
```
generate(model_name: "fal-ai/nano-banana-pro", input: {
"prompt": "professional thumbnail for tech vlog, dark background, code on screen",
"image_size": "landscape_16_9"
})
```
### VideoDB generative audio
If VideoDB is configured:
```python
voiceover = coll.generate_voice(text="Narration here", voice="alloy")
music = coll.generate_music(prompt="lo-fi background for coding vlog", duration=120)
sfx = coll.generate_sound_effect(prompt="subtle whoosh transition")
```
## Layer 6: Final Polish (Descript / CapCut)
The last layer is human. Use a traditional editor for:
- **Pacing**: adjust cuts that feel too fast or slow
- **Captions**: auto-generated, then manually cleaned
- **Color grading**: basic correction and mood
- **Final audio mix**: balance voice, music, and SFX levels
- **Export**: platform-specific formats and quality settings
This is where taste lives. AI clears the repetitive work. You make the final calls.
## Social Media Reframing
Different platforms need different aspect ratios:
| Platform | Aspect Ratio | Resolution |
|----------|-------------|------------|
| YouTube | 16:9 | 1920x1080 |
| TikTok / Reels | 9:16 | 1080x1920 |
| Instagram Feed | 1:1 | 1080x1080 |
| X / Twitter | 16:9 or 1:1 | 1280x720 or 720x720 |
### Reframe with FFmpeg
```bash
# 16:9 to 9:16 (center crop)
ffmpeg -i input.mp4 -vf "crop=ih*9/16:ih,scale=1080:1920" vertical.mp4
# 16:9 to 1:1 (center crop)
ffmpeg -i input.mp4 -vf "crop=ih:ih,scale=1080:1080" square.mp4
```
### Reframe with VideoDB
```python
# Smart reframe (AI-guided subject tracking)
reframed = video.reframe(start=0, end=60, target="vertical", mode=ReframeMode.smart)
```
## Scene Detection and Auto-Cut
### FFmpeg scene detection
```bash
# Detect scene changes (threshold 0.3 = moderate sensitivity)
ffmpeg -i input.mp4 -vf "select='gt(scene,0.3)',showinfo" -vsync vfr -f null - 2>&1 | grep showinfo
```
### Silence detection for auto-cut
```bash
# Find silent segments (useful for cutting dead air)
ffmpeg -i input.mp4 -af silencedetect=noise=-30dB:d=2 -f null - 2>&1 | grep silence
```
### Highlight extraction
Use Claude to analyze transcript + scene timestamps:
```
"Given this transcript with timestamps and these scene change points,
identify the 5 most engaging 30-second clips for social media."
```
## What Each Tool Does Best
| Tool | Strength | Weakness |
|------|----------|----------|
| Claude / Codex | Organization, planning, code generation | Not the creative taste layer |
| FFmpeg | Deterministic cuts, batch processing, format conversion | No visual editing UI |
| Remotion | Programmable overlays, composable scenes, reusable templates | Learning curve for non-devs |
| Screen Studio | Polished screen recordings immediately | Only screen capture |
| ElevenLabs | Voice, narration, music, SFX | Not the center of the workflow |
| Descript / CapCut | Final pacing, captions, polish | Manual, not automatable |
## Key Principles
1. **Edit, don't generate.** This workflow is for cutting real footage, not creating from prompts.
2. **Structure before style.** Get the story right in Layer 2 before touching anything visual.
3. **FFmpeg is the backbone.** Boring but critical. Where long footage becomes manageable.
4. **Remotion for repeatability.** If you'll do it more than once, make it a Remotion component.
5. **Generate selectively.** Only use AI generation for assets that don't exist, not for everything.
6. **Taste is the last layer.** AI clears repetitive work. You make the final creative calls.
## Related Skills
- `fal-ai-media` — AI image, video, and audio generation
- `videodb` — Server-side video processing, indexing, and streaming
- `content-engine` — Platform-native content distribution
================================================
FILE: .agents/skills/video-editing/agents/openai.yaml
================================================
interface:
display_name: "Video Editing"
short_description: "AI-assisted video editing for real footage"
brand_color: "#EF4444"
default_prompt: "Edit video using AI-assisted pipeline: organize, cut, compose, generate assets, polish"
policy:
allow_implicit_invocation: true
================================================
FILE: .agents/skills/x-api/SKILL.md
================================================
---
name: x-api
description: X/Twitter API integration for posting tweets, threads, reading timelines, search, and analytics. Covers OAuth auth patterns, rate limits, and platform-native content posting. Use when the user wants to interact with X programmatically.
origin: ECC
---
# X API
Programmatic interaction with X (Twitter) for posting, reading, searching, and analytics.
## When to Activate
- User wants to post tweets or threads programmatically
- Reading timeline, mentions, or user data from X
- Searching X for content, trends, or conversations
- Building X integrations or bots
- Analytics and engagement tracking
- User says "post to X", "tweet", "X API", or "Twitter API"
## Authentication
### OAuth 2.0 (App-Only / User Context)
Best for: read-heavy operations, search, public data.
```bash
# Environment setup
export X_BEARER_TOKEN="your-bearer-token"
```
```python
import os
import requests
bearer = os.environ["X_BEARER_TOKEN"]
headers = {"Authorization": f"Bearer {bearer}"}
# Search recent tweets
resp = requests.get(
"https://api.x.com/2/tweets/search/recent",
headers=headers,
params={"query": "claude code", "max_results": 10}
)
tweets = resp.json()
```
### OAuth 1.0a (User Context)
Required for: posting tweets, managing account, DMs.
```bash
# Environment setup — source before use
export X_API_KEY="your-api-key"
export X_API_SECRET="your-api-secret"
export X_ACCESS_TOKEN="your-access-token"
export X_ACCESS_SECRET="your-access-secret"
```
```python
import os
from requests_oauthlib import OAuth1Session
oauth = OAuth1Session(
os.environ["X_API_KEY"],
client_secret=os.environ["X_API_SECRET"],
resource_owner_key=os.environ["X_ACCESS_TOKEN"],
resource_owner_secret=os.environ["X_ACCESS_SECRET"],
)
```
## Core Operations
### Post a Tweet
```python
resp = oauth.post(
"https://api.x.com/2/tweets",
json={"text": "Hello from Claude Code"}
)
resp.raise_for_status()
tweet_id = resp.json()["data"]["id"]
```
### Post a Thread
```python
def post_thread(oauth, tweets: list[str]) -> list[str]:
ids = []
reply_to = None
for text in tweets:
payload = {"text": text}
if reply_to:
payload["reply"] = {"in_reply_to_tweet_id": reply_to}
resp = oauth.post("https://api.x.com/2/tweets", json=payload)
resp.raise_for_status()
tweet_id = resp.json()["data"]["id"]
ids.append(tweet_id)
reply_to = tweet_id
return ids
```
### Read User Timeline
```python
resp = requests.get(
f"https://api.x.com/2/users/{user_id}/tweets",
headers=headers,
params={
"max_results": 10,
"tweet.fields": "created_at,public_metrics",
}
)
```
### Search Tweets
```python
resp = requests.get(
"https://api.x.com/2/tweets/search/recent",
headers=headers,
params={
"query": "from:affaanmustafa -is:retweet",
"max_results": 10,
"tweet.fields": "public_metrics,created_at",
}
)
```
### Get User by Username
```python
resp = requests.get(
"https://api.x.com/2/users/by/username/affaanmustafa",
headers=headers,
params={"user.fields": "public_metrics,description,created_at"}
)
```
### Upload Media and Post
```python
# Media upload uses v1.1 endpoint
# Step 1: Upload media
media_resp = oauth.post(
"https://upload.twitter.com/1.1/media/upload.json",
files={"media": open("i
gitextract_4n75nwkk/ ├── .agents/ │ └── skills/ │ ├── api-design/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── article-writing/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── backend-patterns/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── bun-runtime/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── claude-api/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── coding-standards/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── content-engine/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── crosspost/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── deep-research/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── dmux-workflows/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── documentation-lookup/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── e2e-testing/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── eval-harness/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── exa-search/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── fal-ai-media/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── frontend-patterns/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── frontend-slides/ │ │ ├── SKILL.md │ │ ├── STYLE_PRESETS.md │ │ └── agents/ │ │ └── openai.yaml │ ├── investor-materials/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── investor-outreach/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── market-research/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── mcp-server-patterns/ │ │ └── SKILL.md │ ├── nextjs-turbopack/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── security-review/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── strategic-compact/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── tdd-workflow/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── verification-loop/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ ├── video-editing/ │ │ ├── SKILL.md │ │ └── agents/ │ │ └── openai.yaml │ └── x-api/ │ ├── SKILL.md │ └── agents/ │ └── openai.yaml ├── .claude/ │ ├── homunculus/ │ │ └── instincts/ │ │ └── inherited/ │ │ └── everything-claude-code-instincts.yaml │ ├── package-manager.json │ └── skills/ │ └── everything-claude-code/ │ └── SKILL.md ├── .claude-plugin/ │ ├── PLUGIN_SCHEMA_NOTES.md │ ├── README.md │ ├── marketplace.json │ └── plugin.json ├── .codex/ │ ├── AGENTS.md │ ├── agents/ │ │ ├── docs-researcher.toml │ │ ├── explorer.toml │ │ └── reviewer.toml │ └── config.toml ├── .cursor/ │ ├── hooks/ │ │ ├── adapter.js │ │ ├── after-file-edit.js │ │ ├── after-mcp-execution.js │ │ ├── after-shell-execution.js │ │ ├── after-tab-file-edit.js │ │ ├── before-mcp-execution.js │ │ ├── before-read-file.js │ │ ├── before-shell-execution.js │ │ ├── before-submit-prompt.js │ │ ├── before-tab-file-read.js │ │ ├── pre-compact.js │ │ ├── session-end.js │ │ ├── session-start.js │ │ ├── stop.js │ │ ├── subagent-start.js │ │ └── subagent-stop.js │ ├── hooks.json │ ├── rules/ │ │ ├── common-agents.md │ │ ├── common-coding-style.md │ │ ├── common-development-workflow.md │ │ ├── common-git-workflow.md │ │ ├── common-hooks.md │ │ ├── common-patterns.md │ │ ├── common-performance.md │ │ ├── common-security.md │ │ ├── common-testing.md │ │ ├── golang-coding-style.md │ │ ├── golang-hooks.md │ │ ├── golang-patterns.md │ │ ├── golang-security.md │ │ ├── golang-testing.md │ │ ├── kotlin-coding-style.md │ │ ├── kotlin-hooks.md │ │ ├── kotlin-patterns.md │ │ ├── kotlin-security.md │ │ ├── kotlin-testing.md │ │ ├── php-coding-style.md │ │ ├── php-hooks.md │ │ ├── php-patterns.md │ │ ├── php-security.md │ │ ├── php-testing.md │ │ ├── python-coding-style.md │ │ ├── python-hooks.md │ │ ├── python-patterns.md │ │ ├── python-security.md │ │ ├── python-testing.md │ │ ├── swift-coding-style.md │ │ ├── swift-hooks.md │ │ ├── swift-patterns.md │ │ ├── swift-security.md │ │ ├── swift-testing.md │ │ ├── typescript-coding-style.md │ │ ├── typescript-hooks.md │ │ ├── typescript-patterns.md │ │ ├── typescript-security.md │ │ └── typescript-testing.md │ └── skills/ │ ├── article-writing/ │ │ └── SKILL.md │ ├── bun-runtime/ │ │ └── SKILL.md │ ├── content-engine/ │ │ └── SKILL.md │ ├── documentation-lookup/ │ │ └── SKILL.md │ ├── frontend-slides/ │ │ ├── SKILL.md │ │ └── STYLE_PRESETS.md │ ├── investor-materials/ │ │ └── SKILL.md │ ├── investor-outreach/ │ │ └── SKILL.md │ ├── market-research/ │ │ └── SKILL.md │ ├── mcp-server-patterns/ │ │ └── SKILL.md │ └── nextjs-turbopack/ │ └── SKILL.md ├── .github/ │ ├── FUNDING.yml │ ├── ISSUE_TEMPLATE/ │ │ └── copilot-task.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── release.yml │ └── workflows/ │ ├── ci.yml │ ├── maintenance.yml │ ├── monthly-metrics.yml │ ├── release.yml │ ├── reusable-release.yml │ ├── reusable-test.yml │ └── reusable-validate.yml ├── .gitignore ├── .markdownlint.json ├── .npmignore ├── .opencode/ │ ├── MIGRATION.md │ ├── README.md │ ├── commands/ │ │ ├── build-fix.md │ │ ├── checkpoint.md │ │ ├── code-review.md │ │ ├── e2e.md │ │ ├── eval.md │ │ ├── evolve.md │ │ ├── go-build.md │ │ ├── go-review.md │ │ ├── go-test.md │ │ ├── harness-audit.md │ │ ├── instinct-export.md │ │ ├── instinct-import.md │ │ ├── instinct-status.md │ │ ├── learn.md │ │ ├── loop-start.md │ │ ├── loop-status.md │ │ ├── model-route.md │ │ ├── orchestrate.md │ │ ├── plan.md │ │ ├── projects.md │ │ ├── promote.md │ │ ├── quality-gate.md │ │ ├── refactor-clean.md │ │ ├── rust-build.md │ │ ├── rust-review.md │ │ ├── rust-test.md │ │ ├── security.md │ │ ├── setup-pm.md │ │ ├── skill-create.md │ │ ├── tdd.md │ │ ├── test-coverage.md │ │ ├── update-codemaps.md │ │ ├── update-docs.md │ │ └── verify.md │ ├── index.ts │ ├── instructions/ │ │ └── INSTRUCTIONS.md │ ├── opencode.json │ ├── package.json │ ├── plugins/ │ │ ├── ecc-hooks.ts │ │ └── index.ts │ ├── prompts/ │ │ └── agents/ │ │ ├── architect.txt │ │ ├── build-error-resolver.txt │ │ ├── code-reviewer.txt │ │ ├── database-reviewer.txt │ │ ├── doc-updater.txt │ │ ├── e2e-runner.txt │ │ ├── go-build-resolver.txt │ │ ├── go-reviewer.txt │ │ ├── planner.txt │ │ ├── refactor-cleaner.txt │ │ ├── rust-build-resolver.txt │ │ ├── rust-reviewer.txt │ │ ├── security-reviewer.txt │ │ └── tdd-guide.txt │ ├── tools/ │ │ ├── check-coverage.ts │ │ ├── format-code.ts │ │ ├── git-summary.ts │ │ ├── index.ts │ │ ├── lint-check.ts │ │ ├── run-tests.ts │ │ └── security-audit.ts │ └── tsconfig.json ├── .prettierrc ├── .tool-versions ├── AGENTS.md ├── CHANGELOG.md ├── CLAUDE.md ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── README.zh-CN.md ├── SPONSORING.md ├── SPONSORS.md ├── TROUBLESHOOTING.md ├── VERSION ├── agents/ │ ├── architect.md │ ├── build-error-resolver.md │ ├── chief-of-staff.md │ ├── code-reviewer.md │ ├── cpp-build-resolver.md │ ├── cpp-reviewer.md │ ├── database-reviewer.md │ ├── doc-updater.md │ ├── docs-lookup.md │ ├── e2e-runner.md │ ├── go-build-resolver.md │ ├── go-reviewer.md │ ├── harness-optimizer.md │ ├── java-build-resolver.md │ ├── java-reviewer.md │ ├── kotlin-build-resolver.md │ ├── kotlin-reviewer.md │ ├── loop-operator.md │ ├── planner.md │ ├── python-reviewer.md │ ├── pytorch-build-resolver.md │ ├── refactor-cleaner.md │ ├── rust-build-resolver.md │ ├── rust-reviewer.md │ ├── security-reviewer.md │ ├── tdd-guide.md │ └── typescript-reviewer.md ├── commands/ │ ├── aside.md │ ├── build-fix.md │ ├── checkpoint.md │ ├── claw.md │ ├── code-review.md │ ├── cpp-build.md │ ├── cpp-review.md │ ├── cpp-test.md │ ├── devfleet.md │ ├── docs.md │ ├── e2e.md │ ├── eval.md │ ├── evolve.md │ ├── go-build.md │ ├── go-review.md │ ├── go-test.md │ ├── gradle-build.md │ ├── harness-audit.md │ ├── instinct-export.md │ ├── instinct-import.md │ ├── instinct-status.md │ ├── kotlin-build.md │ ├── kotlin-review.md │ ├── kotlin-test.md │ ├── learn-eval.md │ ├── learn.md │ ├── loop-start.md │ ├── loop-status.md │ ├── model-route.md │ ├── multi-backend.md │ ├── multi-execute.md │ ├── multi-frontend.md │ ├── multi-plan.md │ ├── multi-workflow.md │ ├── orchestrate.md │ ├── plan.md │ ├── pm2.md │ ├── projects.md │ ├── promote.md │ ├── prompt-optimize.md │ ├── python-review.md │ ├── quality-gate.md │ ├── refactor-clean.md │ ├── resume-session.md │ ├── rust-build.md │ ├── rust-review.md │ ├── rust-test.md │ ├── save-session.md │ ├── sessions.md │ ├── setup-pm.md │ ├── skill-create.md │ ├── skill-health.md │ ├── tdd.md │ ├── test-coverage.md │ ├── update-codemaps.md │ ├── update-docs.md │ └── verify.md ├── commitlint.config.js ├── contexts/ │ ├── dev.md │ ├── research.md │ └── review.md ├── docs/ │ ├── ARCHITECTURE-IMPROVEMENTS.md │ ├── COMMAND-AGENT-MAP.md │ ├── ECC-2.0-SESSION-ADAPTER-DISCOVERY.md │ ├── MEGA-PLAN-REPO-PROMPTS-2026-03-12.md │ ├── PHASE1-ISSUE-BUNDLE-2026-03-12.md │ ├── PR-399-REVIEW-2026-03-12.md │ ├── PR-QUEUE-TRIAGE-2026-03-13.md │ ├── SELECTIVE-INSTALL-ARCHITECTURE.md │ ├── SELECTIVE-INSTALL-DESIGN.md │ ├── SESSION-ADAPTER-CONTRACT.md │ ├── business/ │ │ ├── metrics-and-sponsorship.md │ │ └── social-launch-copy.md │ ├── continuous-learning-v2-spec.md │ ├── ja-JP/ │ │ ├── CONTRIBUTING.md │ │ ├── README.md │ │ ├── agents/ │ │ │ ├── architect.md │ │ │ ├── build-error-resolver.md │ │ │ ├── code-reviewer.md │ │ │ ├── database-reviewer.md │ │ │ ├── doc-updater.md │ │ │ ├── e2e-runner.md │ │ │ ├── go-build-resolver.md │ │ │ ├── go-reviewer.md │ │ │ ├── planner.md │ │ │ ├── python-reviewer.md │ │ │ ├── refactor-cleaner.md │ │ │ ├── security-reviewer.md │ │ │ └── tdd-guide.md │ │ ├── commands/ │ │ │ ├── README.md │ │ │ ├── build-fix.md │ │ │ ├── checkpoint.md │ │ │ ├── code-review.md │ │ │ ├── e2e.md │ │ │ ├── eval.md │ │ │ ├── evolve.md │ │ │ ├── go-build.md │ │ │ ├── go-review.md │ │ │ ├── go-test.md │ │ │ ├── instinct-export.md │ │ │ ├── instinct-import.md │ │ │ ├── instinct-status.md │ │ │ ├── learn.md │ │ │ ├── multi-backend.md │ │ │ ├── multi-execute.md │ │ │ ├── multi-frontend.md │ │ │ ├── multi-plan.md │ │ │ ├── multi-workflow.md │ │ │ ├── orchestrate.md │ │ │ ├── pm2.md │ │ │ ├── python-review.md │ │ │ ├── refactor-clean.md │ │ │ ├── sessions.md │ │ │ ├── setup-pm.md │ │ │ ├── skill-create.md │ │ │ ├── tdd.md │ │ │ ├── test-coverage.md │ │ │ ├── update-codemaps.md │ │ │ ├── update-docs.md │ │ │ └── verify.md │ │ ├── contexts/ │ │ │ ├── dev.md │ │ │ ├── research.md │ │ │ └── review.md │ │ ├── examples/ │ │ │ ├── CLAUDE.md │ │ │ └── user-CLAUDE.md │ │ ├── plugins/ │ │ │ └── README.md │ │ ├── rules/ │ │ │ ├── README.md │ │ │ ├── agents.md │ │ │ ├── coding-style.md │ │ │ ├── git-workflow.md │ │ │ ├── hooks.md │ │ │ ├── patterns.md │ │ │ ├── performance.md │ │ │ ├── security.md │ │ │ └── testing.md │ │ └── skills/ │ │ ├── README.md │ │ ├── backend-patterns/ │ │ │ └── SKILL.md │ │ ├── clickhouse-io/ │ │ │ └── SKILL.md │ │ ├── coding-standards/ │ │ │ └── SKILL.md │ │ ├── configure-ecc/ │ │ │ └── SKILL.md │ │ ├── continuous-learning/ │ │ │ └── SKILL.md │ │ ├── continuous-learning-v2/ │ │ │ ├── SKILL.md │ │ │ └── agents/ │ │ │ └── observer.md │ │ ├── cpp-testing/ │ │ │ └── SKILL.md │ │ ├── django-patterns/ │ │ │ └── SKILL.md │ │ ├── django-security/ │ │ │ └── SKILL.md │ │ ├── django-tdd/ │ │ │ └── SKILL.md │ │ ├── django-verification/ │ │ │ └── SKILL.md │ │ ├── eval-harness/ │ │ │ └── SKILL.md │ │ ├── frontend-patterns/ │ │ │ └── SKILL.md │ │ ├── golang-patterns/ │ │ │ └── SKILL.md │ │ ├── golang-testing/ │ │ │ └── SKILL.md │ │ ├── iterative-retrieval/ │ │ │ └── SKILL.md │ │ ├── java-coding-standards/ │ │ │ └── SKILL.md │ │ ├── jpa-patterns/ │ │ │ └── SKILL.md │ │ ├── nutrient-document-processing/ │ │ │ └── SKILL.md │ │ ├── postgres-patterns/ │ │ │ └── SKILL.md │ │ ├── project-guidelines-example/ │ │ │ └── SKILL.md │ │ ├── python-patterns/ │ │ │ └── SKILL.md │ │ ├── python-testing/ │ │ │ └── SKILL.md │ │ ├── security-review/ │ │ │ ├── SKILL.md │ │ │ └── cloud-infrastructure-security.md │ │ ├── security-scan/ │ │ │ └── SKILL.md │ │ ├── springboot-patterns/ │ │ │ └── SKILL.md │ │ ├── springboot-security/ │ │ │ └── SKILL.md │ │ ├── springboot-tdd/ │ │ │ └── SKILL.md │ │ ├── springboot-verification/ │ │ │ └── SKILL.md │ │ ├── strategic-compact/ │ │ │ └── SKILL.md │ │ ├── tdd-workflow/ │ │ │ └── SKILL.md │ │ └── verification-loop/ │ │ └── SKILL.md │ ├── ko-KR/ │ │ ├── CONTRIBUTING.md │ │ ├── README.md │ │ ├── TERMINOLOGY.md │ │ ├── agents/ │ │ │ ├── architect.md │ │ │ ├── build-error-resolver.md │ │ │ ├── code-reviewer.md │ │ │ ├── database-reviewer.md │ │ │ ├── doc-updater.md │ │ │ ├── e2e-runner.md │ │ │ ├── go-build-resolver.md │ │ │ ├── go-reviewer.md │ │ │ ├── planner.md │ │ │ ├── refactor-cleaner.md │ │ │ ├── security-reviewer.md │ │ │ └── tdd-guide.md │ │ ├── commands/ │ │ │ ├── build-fix.md │ │ │ ├── checkpoint.md │ │ │ ├── code-review.md │ │ │ ├── e2e.md │ │ │ ├── eval.md │ │ │ ├── go-build.md │ │ │ ├── go-review.md │ │ │ ├── go-test.md │ │ │ ├── learn.md │ │ │ ├── orchestrate.md │ │ │ ├── plan.md │ │ │ ├── refactor-clean.md │ │ │ ├── setup-pm.md │ │ │ ├── tdd.md │ │ │ ├── test-coverage.md │ │ │ ├── update-codemaps.md │ │ │ ├── update-docs.md │ │ │ └── verify.md │ │ ├── examples/ │ │ │ ├── CLAUDE.md │ │ │ ├── django-api-CLAUDE.md │ │ │ ├── go-microservice-CLAUDE.md │ │ │ ├── rust-api-CLAUDE.md │ │ │ ├── saas-nextjs-CLAUDE.md │ │ │ ├── statusline.json │ │ │ └── user-CLAUDE.md │ │ ├── rules/ │ │ │ ├── agents.md │ │ │ ├── coding-style.md │ │ │ ├── git-workflow.md │ │ │ ├── hooks.md │ │ │ ├── patterns.md │ │ │ ├── performance.md │ │ │ ├── security.md │ │ │ └── testing.md │ │ └── skills/ │ │ ├── backend-patterns/ │ │ │ └── SKILL.md │ │ ├── clickhouse-io/ │ │ │ └── SKILL.md │ │ ├── coding-standards/ │ │ │ └── SKILL.md │ │ ├── continuous-learning/ │ │ │ └── SKILL.md │ │ ├── continuous-learning-v2/ │ │ │ └── SKILL.md │ │ ├── eval-harness/ │ │ │ └── SKILL.md │ │ ├── frontend-patterns/ │ │ │ └── SKILL.md │ │ ├── golang-patterns/ │ │ │ └── SKILL.md │ │ ├── golang-testing/ │ │ │ └── SKILL.md │ │ ├── iterative-retrieval/ │ │ │ └── SKILL.md │ │ ├── postgres-patterns/ │ │ │ └── SKILL.md │ │ ├── project-guidelines-example/ │ │ │ └── SKILL.md │ │ ├── security-review/ │ │ │ ├── SKILL.md │ │ │ └── cloud-infrastructure-security.md │ │ ├── strategic-compact/ │ │ │ └── SKILL.md │ │ ├── tdd-workflow/ │ │ │ └── SKILL.md │ │ └── verification-loop/ │ │ └── SKILL.md │ ├── releases/ │ │ └── 1.8.0/ │ │ ├── linkedin-post.md │ │ ├── reference-attribution.md │ │ ├── release-notes.md │ │ ├── x-quote-eval-skills.md │ │ ├── x-quote-plankton-deslop.md │ │ └── x-thread.md │ ├── token-optimization.md │ ├── zh-CN/ │ │ ├── AGENTS.md │ │ ├── CHANGELOG.md │ │ ├── CLAUDE.md │ │ ├── CODE_OF_CONDUCT.md │ │ ├── CONTRIBUTING.md │ │ ├── README.md │ │ ├── SPONSORING.md │ │ ├── SPONSORS.md │ │ ├── TROUBLESHOOTING.md │ │ ├── agents/ │ │ │ ├── architect.md │ │ │ ├── build-error-resolver.md │ │ │ ├── chief-of-staff.md │ │ │ ├── code-reviewer.md │ │ │ ├── database-reviewer.md │ │ │ ├── doc-updater.md │ │ │ ├── e2e-runner.md │ │ │ ├── go-build-resolver.md │ │ │ ├── go-reviewer.md │ │ │ ├── harness-optimizer.md │ │ │ ├── kotlin-build-resolver.md │ │ │ ├── kotlin-reviewer.md │ │ │ ├── loop-operator.md │ │ │ ├── planner.md │ │ │ ├── python-reviewer.md │ │ │ ├── refactor-cleaner.md │ │ │ ├── security-reviewer.md │ │ │ └── tdd-guide.md │ │ ├── commands/ │ │ │ ├── aside.md │ │ │ ├── build-fix.md │ │ │ ├── checkpoint.md │ │ │ ├── claw.md │ │ │ ├── code-review.md │ │ │ ├── e2e.md │ │ │ ├── eval.md │ │ │ ├── evolve.md │ │ │ ├── go-build.md │ │ │ ├── go-review.md │ │ │ ├── go-test.md │ │ │ ├── gradle-build.md │ │ │ ├── harness-audit.md │ │ │ ├── instinct-export.md │ │ │ ├── instinct-import.md │ │ │ ├── instinct-status.md │ │ │ ├── kotlin-build.md │ │ │ ├── kotlin-review.md │ │ │ ├── kotlin-test.md │ │ │ ├── learn-eval.md │ │ │ ├── learn.md │ │ │ ├── loop-start.md │ │ │ ├── loop-status.md │ │ │ ├── model-route.md │ │ │ ├── multi-backend.md │ │ │ ├── multi-execute.md │ │ │ ├── multi-frontend.md │ │ │ ├── multi-plan.md │ │ │ ├── multi-workflow.md │ │ │ ├── orchestrate.md │ │ │ ├── plan.md │ │ │ ├── pm2.md │ │ │ ├── projects.md │ │ │ ├── promote.md │ │ │ ├── prompt-optimize.md │ │ │ ├── python-review.md │ │ │ ├── quality-gate.md │ │ │ ├── refactor-clean.md │ │ │ ├── resume-session.md │ │ │ ├── save-session.md │ │ │ ├── sessions.md │ │ │ ├── setup-pm.md │ │ │ ├── skill-create.md │ │ │ ├── tdd.md │ │ │ ├── test-coverage.md │ │ │ ├── update-codemaps.md │ │ │ ├── update-docs.md │ │ │ └── verify.md │ │ ├── contexts/ │ │ │ ├── dev.md │ │ │ ├── research.md │ │ │ └── review.md │ │ ├── examples/ │ │ │ ├── CLAUDE.md │ │ │ ├── django-api-CLAUDE.md │ │ │ ├── go-microservice-CLAUDE.md │ │ │ ├── rust-api-CLAUDE.md │ │ │ ├── saas-nextjs-CLAUDE.md │ │ │ └── user-CLAUDE.md │ │ ├── hooks/ │ │ │ └── README.md │ │ ├── plugins/ │ │ │ └── README.md │ │ ├── rules/ │ │ │ ├── README.md │ │ │ ├── common/ │ │ │ │ ├── agents.md │ │ │ │ ├── coding-style.md │ │ │ │ ├── development-workflow.md │ │ │ │ ├── git-workflow.md │ │ │ │ ├── hooks.md │ │ │ │ ├── patterns.md │ │ │ │ ├── performance.md │ │ │ │ ├── security.md │ │ │ │ └── testing.md │ │ │ ├── golang/ │ │ │ │ ├── coding-style.md │ │ │ │ ├── hooks.md │ │ │ │ ├── patterns.md │ │ │ │ ├── security.md │ │ │ │ └── testing.md │ │ │ ├── kotlin/ │ │ │ │ ├── coding-style.md │ │ │ │ ├── hooks.md │ │ │ │ ├── patterns.md │ │ │ │ ├── security.md │ │ │ │ └── testing.md │ │ │ ├── perl/ │ │ │ │ ├── coding-style.md │ │ │ │ ├── hooks.md │ │ │ │ ├── patterns.md │ │ │ │ ├── security.md │ │ │ │ └── testing.md │ │ │ ├── php/ │ │ │ │ ├── coding-style.md │ │ │ │ ├── hooks.md │ │ │ │ ├── patterns.md │ │ │ │ ├── security.md │ │ │ │ └── testing.md │ │ │ ├── python/ │ │ │ │ ├── coding-style.md │ │ │ │ ├── hooks.md │ │ │ │ ├── patterns.md │ │ │ │ ├── security.md │ │ │ │ └── testing.md │ │ │ ├── swift/ │ │ │ │ ├── coding-style.md │ │ │ │ ├── hooks.md │ │ │ │ ├── patterns.md │ │ │ │ ├── security.md │ │ │ │ └── testing.md │ │ │ └── typescript/ │ │ │ ├── coding-style.md │ │ │ ├── hooks.md │ │ │ ├── patterns.md │ │ │ ├── security.md │ │ │ └── testing.md │ │ ├── skills/ │ │ │ ├── agent-harness-construction/ │ │ │ │ └── SKILL.md │ │ │ ├── agentic-engineering/ │ │ │ │ └── SKILL.md │ │ │ ├── ai-first-engineering/ │ │ │ │ └── SKILL.md │ │ │ ├── android-clean-architecture/ │ │ │ │ └── SKILL.md │ │ │ ├── api-design/ │ │ │ │ └── SKILL.md │ │ │ ├── article-writing/ │ │ │ │ └── SKILL.md │ │ │ ├── autonomous-loops/ │ │ │ │ └── SKILL.md │ │ │ ├── backend-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── blueprint/ │ │ │ │ └── SKILL.md │ │ │ ├── carrier-relationship-management/ │ │ │ │ └── SKILL.md │ │ │ ├── claude-api/ │ │ │ │ └── SKILL.md │ │ │ ├── clickhouse-io/ │ │ │ │ └── SKILL.md │ │ │ ├── coding-standards/ │ │ │ │ └── SKILL.md │ │ │ ├── compose-multiplatform-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── configure-ecc/ │ │ │ │ └── SKILL.md │ │ │ ├── content-engine/ │ │ │ │ └── SKILL.md │ │ │ ├── content-hash-cache-pattern/ │ │ │ │ └── SKILL.md │ │ │ ├── continuous-agent-loop/ │ │ │ │ └── SKILL.md │ │ │ ├── continuous-learning/ │ │ │ │ └── SKILL.md │ │ │ ├── continuous-learning-v2/ │ │ │ │ ├── SKILL.md │ │ │ │ └── agents/ │ │ │ │ └── observer.md │ │ │ ├── cost-aware-llm-pipeline/ │ │ │ │ └── SKILL.md │ │ │ ├── cpp-coding-standards/ │ │ │ │ └── SKILL.md │ │ │ ├── cpp-testing/ │ │ │ │ └── SKILL.md │ │ │ ├── crosspost/ │ │ │ │ └── SKILL.md │ │ │ ├── customs-trade-compliance/ │ │ │ │ └── SKILL.md │ │ │ ├── database-migrations/ │ │ │ │ └── SKILL.md │ │ │ ├── deep-research/ │ │ │ │ └── SKILL.md │ │ │ ├── deployment-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── django-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── django-security/ │ │ │ │ └── SKILL.md │ │ │ ├── django-tdd/ │ │ │ │ └── SKILL.md │ │ │ ├── django-verification/ │ │ │ │ └── SKILL.md │ │ │ ├── dmux-workflows/ │ │ │ │ └── SKILL.md │ │ │ ├── docker-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── e2e-testing/ │ │ │ │ └── SKILL.md │ │ │ ├── energy-procurement/ │ │ │ │ └── SKILL.md │ │ │ ├── enterprise-agent-ops/ │ │ │ │ └── SKILL.md │ │ │ ├── eval-harness/ │ │ │ │ └── SKILL.md │ │ │ ├── exa-search/ │ │ │ │ └── SKILL.md │ │ │ ├── fal-ai-media/ │ │ │ │ └── SKILL.md │ │ │ ├── foundation-models-on-device/ │ │ │ │ └── SKILL.md │ │ │ ├── frontend-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── frontend-slides/ │ │ │ │ ├── SKILL.md │ │ │ │ └── STYLE_PRESETS.md │ │ │ ├── golang-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── golang-testing/ │ │ │ │ └── SKILL.md │ │ │ ├── inventory-demand-planning/ │ │ │ │ └── SKILL.md │ │ │ ├── investor-materials/ │ │ │ │ └── SKILL.md │ │ │ ├── investor-outreach/ │ │ │ │ └── SKILL.md │ │ │ ├── iterative-retrieval/ │ │ │ │ └── SKILL.md │ │ │ ├── java-coding-standards/ │ │ │ │ └── SKILL.md │ │ │ ├── jpa-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── kotlin-coroutines-flows/ │ │ │ │ └── SKILL.md │ │ │ ├── kotlin-exposed-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── kotlin-ktor-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── kotlin-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── kotlin-testing/ │ │ │ │ └── SKILL.md │ │ │ ├── liquid-glass-design/ │ │ │ │ └── SKILL.md │ │ │ ├── logistics-exception-management/ │ │ │ │ └── SKILL.md │ │ │ ├── market-research/ │ │ │ │ └── SKILL.md │ │ │ ├── nanoclaw-repl/ │ │ │ │ └── SKILL.md │ │ │ ├── nutrient-document-processing/ │ │ │ │ └── SKILL.md │ │ │ ├── perl-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── perl-security/ │ │ │ │ └── SKILL.md │ │ │ ├── perl-testing/ │ │ │ │ └── SKILL.md │ │ │ ├── plankton-code-quality/ │ │ │ │ └── SKILL.md │ │ │ ├── postgres-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── production-scheduling/ │ │ │ │ └── SKILL.md │ │ │ ├── project-guidelines-example/ │ │ │ │ └── SKILL.md │ │ │ ├── prompt-optimizer/ │ │ │ │ └── SKILL.md │ │ │ ├── python-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── python-testing/ │ │ │ │ └── SKILL.md │ │ │ ├── quality-nonconformance/ │ │ │ │ └── SKILL.md │ │ │ ├── ralphinho-rfc-pipeline/ │ │ │ │ └── SKILL.md │ │ │ ├── regex-vs-llm-structured-text/ │ │ │ │ └── SKILL.md │ │ │ ├── returns-reverse-logistics/ │ │ │ │ └── SKILL.md │ │ │ ├── search-first/ │ │ │ │ └── SKILL.md │ │ │ ├── security-review/ │ │ │ │ ├── SKILL.md │ │ │ │ └── cloud-infrastructure-security.md │ │ │ ├── security-scan/ │ │ │ │ └── SKILL.md │ │ │ ├── skill-stocktake/ │ │ │ │ └── SKILL.md │ │ │ ├── springboot-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── springboot-security/ │ │ │ │ └── SKILL.md │ │ │ ├── springboot-tdd/ │ │ │ │ └── SKILL.md │ │ │ ├── springboot-verification/ │ │ │ │ └── SKILL.md │ │ │ ├── strategic-compact/ │ │ │ │ └── SKILL.md │ │ │ ├── swift-actor-persistence/ │ │ │ │ └── SKILL.md │ │ │ ├── swift-concurrency-6-2/ │ │ │ │ └── SKILL.md │ │ │ ├── swift-protocol-di-testing/ │ │ │ │ └── SKILL.md │ │ │ ├── swiftui-patterns/ │ │ │ │ └── SKILL.md │ │ │ ├── tdd-workflow/ │ │ │ │ └── SKILL.md │ │ │ ├── verification-loop/ │ │ │ │ └── SKILL.md │ │ │ ├── video-editing/ │ │ │ │ └── SKILL.md │ │ │ ├── videodb/ │ │ │ │ ├── SKILL.md │ │ │ │ └── reference/ │ │ │ │ ├── api-reference.md │ │ │ │ ├── capture-reference.md │ │ │ │ ├── capture.md │ │ │ │ ├── editor.md │ │ │ │ ├── generative.md │ │ │ │ ├── rtstream-reference.md │ │ │ │ ├── rtstream.md │ │ │ │ ├── search.md │ │ │ │ ├── streaming.md │ │ │ │ └── use-cases.md │ │ │ ├── visa-doc-translate/ │ │ │ │ ├── README.md │ │ │ │ └── SKILL.md │ │ │ └── x-api/ │ │ │ └── SKILL.md │ │ ├── the-longform-guide.md │ │ ├── the-openclaw-guide.md │ │ ├── the-security-guide.md │ │ └── the-shortform-guide.md │ └── zh-TW/ │ ├── CONTRIBUTING.md │ ├── README.md │ ├── TERMINOLOGY.md │ ├── agents/ │ │ ├── architect.md │ │ ├── build-error-resolver.md │ │ ├── code-reviewer.md │ │ ├── database-reviewer.md │ │ ├── doc-updater.md │ │ ├── e2e-runner.md │ │ ├── go-build-resolver.md │ │ ├── go-reviewer.md │ │ ├── planner.md │ │ ├── refactor-cleaner.md │ │ ├── security-reviewer.md │ │ └── tdd-guide.md │ ├── commands/ │ │ ├── build-fix.md │ │ ├── checkpoint.md │ │ ├── code-review.md │ │ ├── e2e.md │ │ ├── eval.md │ │ ├── go-build.md │ │ ├── go-review.md │ │ ├── go-test.md │ │ ├── learn.md │ │ ├── orchestrate.md │ │ ├── plan.md │ │ ├── refactor-clean.md │ │ ├── setup-pm.md │ │ ├── tdd.md │ │ ├── test-coverage.md │ │ ├── update-codemaps.md │ │ ├── update-docs.md │ │ └── verify.md │ ├── rules/ │ │ ├── agents.md │ │ ├── coding-style.md │ │ ├── git-workflow.md │ │ ├── hooks.md │ │ ├── patterns.md │ │ ├── performance.md │ │ ├── security.md │ │ └── testing.md │ └── skills/ │ ├── backend-patterns/ │ │ └── SKILL.md │ ├── clickhouse-io/ │ │ └── SKILL.md │ ├── coding-standards/ │ │ └── SKILL.md │ ├── continuous-learning/ │ │ └── SKILL.md │ ├── continuous-learning-v2/ │ │ └── SKILL.md │ ├── eval-harness/ │ │ └── SKILL.md │ ├── frontend-patterns/ │ │ └── SKILL.md │ ├── golang-patterns/ │ │ └── SKILL.md │ ├── golang-testing/ │ │ └── SKILL.md │ ├── iterative-retrieval/ │ │ └── SKILL.md │ ├── postgres-patterns/ │ │ └── SKILL.md │ ├── project-guidelines-example/ │ │ └── SKILL.md │ ├── security-review/ │ │ ├── SKILL.md │ │ └── cloud-infrastructure-security.md │ ├── strategic-compact/ │ │ └── SKILL.md │ ├── tdd-workflow/ │ │ └── SKILL.md │ └── verification-loop/ │ └── SKILL.md ├── eslint.config.js ├── examples/ │ ├── CLAUDE.md │ ├── django-api-CLAUDE.md │ ├── go-microservice-CLAUDE.md │ ├── laravel-api-CLAUDE.md │ ├── rust-api-CLAUDE.md │ ├── saas-nextjs-CLAUDE.md │ ├── statusline.json │ └── user-CLAUDE.md ├── hooks/ │ ├── README.md │ └── hooks.json ├── install.ps1 ├── install.sh ├── manifests/ │ ├── install-components.json │ ├── install-modules.json │ └── install-profiles.json ├── mcp-configs/ │ └── mcp-servers.json ├── package.json ├── plugins/ │ └── README.md ├── rules/ │ ├── README.md │ ├── common/ │ │ ├── agents.md │ │ ├── coding-style.md │ │ ├── development-workflow.md │ │ ├── git-workflow.md │ │ ├── hooks.md │ │ ├── patterns.md │ │ ├── performance.md │ │ ├── security.md │ │ └── testing.md │ ├── cpp/ │ │ ├── coding-style.md │ │ ├── hooks.md │ │ ├── patterns.md │ │ ├── security.md │ │ └── testing.md │ ├── golang/ │ │ ├── coding-style.md │ │ ├── hooks.md │ │ ├── patterns.md │ │ ├── security.md │ │ └── testing.md │ ├── java/ │ │ ├── coding-style.md │ │ ├── hooks.md │ │ ├── patterns.md │ │ ├── security.md │ │ └── testing.md │ ├── kotlin/ │ │ ├── coding-style.md │ │ ├── hooks.md │ │ ├── patterns.md │ │ ├── security.md │ │ └── testing.md │ ├── perl/ │ │ ├── coding-style.md │ │ ├── hooks.md │ │ ├── patterns.md │ │ ├── security.md │ │ └── testing.md │ ├── php/ │ │ ├── coding-style.md │ │ ├── hooks.md │ │ ├── patterns.md │ │ ├── security.md │ │ └── testing.md │ ├── python/ │ │ ├── coding-style.md │ │ ├── hooks.md │ │ ├── patterns.md │ │ ├── security.md │ │ └── testing.md │ ├── swift/ │ │ ├── coding-style.md │ │ ├── hooks.md │ │ ├── patterns.md │ │ ├── security.md │ │ └── testing.md │ └── typescript/ │ ├── coding-style.md │ ├── hooks.md │ ├── patterns.md │ ├── security.md │ └── testing.md ├── schemas/ │ ├── ecc-install-config.schema.json │ ├── hooks.schema.json │ ├── install-components.schema.json │ ├── install-modules.schema.json │ ├── install-profiles.schema.json │ ├── install-state.schema.json │ ├── package-manager.schema.json │ ├── plugin.schema.json │ └── state-store.schema.json ├── scripts/ │ ├── ci/ │ │ ├── catalog.js │ │ ├── validate-agents.js │ │ ├── validate-commands.js │ │ ├── validate-hooks.js │ │ ├── validate-install-manifests.js │ │ ├── validate-no-personal-paths.js │ │ ├── validate-rules.js │ │ └── validate-skills.js │ ├── claw.js │ ├── codemaps/ │ │ └── generate.ts │ ├── codex/ │ │ ├── check-codex-global-state.sh │ │ └── install-global-git-hooks.sh │ ├── codex-git-hooks/ │ │ ├── pre-commit │ │ └── pre-push │ ├── doctor.js │ ├── ecc.js │ ├── harness-audit.js │ ├── hooks/ │ │ ├── auto-tmux-dev.js │ │ ├── check-console-log.js │ │ ├── check-hook-enabled.js │ │ ├── cost-tracker.js │ │ ├── doc-file-warning.js │ │ ├── evaluate-session.js │ │ ├── insaits-security-monitor.py │ │ ├── insaits-security-wrapper.js │ │ ├── post-bash-build-complete.js │ │ ├── post-bash-pr-created.js │ │ ├── post-edit-console-warn.js │ │ ├── post-edit-format.js │ │ ├── post-edit-typecheck.js │ │ ├── pre-bash-dev-server-block.js │ │ ├── pre-bash-git-push-reminder.js │ │ ├── pre-bash-tmux-reminder.js │ │ ├── pre-compact.js │ │ ├── pre-write-doc-warn.js │ │ ├── quality-gate.js │ │ ├── run-with-flags-shell.sh │ │ ├── run-with-flags.js │ │ ├── session-end-marker.js │ │ ├── session-end.js │ │ ├── session-start.js │ │ └── suggest-compact.js │ ├── install-apply.js │ ├── install-plan.js │ ├── lib/ │ │ ├── hook-flags.js │ │ ├── install/ │ │ │ ├── apply.js │ │ │ ├── config.js │ │ │ ├── request.js │ │ │ └── runtime.js │ │ ├── install-executor.js │ │ ├── install-lifecycle.js │ │ ├── install-manifests.js │ │ ├── install-state.js │ │ ├── install-targets/ │ │ │ ├── antigravity-project.js │ │ │ ├── claude-home.js │ │ │ ├── codex-home.js │ │ │ ├── cursor-project.js │ │ │ ├── helpers.js │ │ │ ├── opencode-home.js │ │ │ └── registry.js │ │ ├── orchestration-session.js │ │ ├── package-manager.d.ts │ │ ├── package-manager.js │ │ ├── project-detect.js │ │ ├── resolve-formatter.js │ │ ├── session-adapters/ │ │ │ ├── canonical-session.js │ │ │ ├── claude-history.js │ │ │ ├── dmux-tmux.js │ │ │ └── registry.js │ │ ├── session-aliases.d.ts │ │ ├── session-aliases.js │ │ ├── session-manager.d.ts │ │ ├── session-manager.js │ │ ├── shell-split.js │ │ ├── skill-evolution/ │ │ │ ├── dashboard.js │ │ │ ├── health.js │ │ │ ├── index.js │ │ │ ├── provenance.js │ │ │ ├── tracker.js │ │ │ └── versioning.js │ │ ├── skill-improvement/ │ │ │ ├── amendify.js │ │ │ ├── evaluate.js │ │ │ ├── health.js │ │ │ └── observations.js │ │ ├── state-store/ │ │ │ ├── index.js │ │ │ ├── migrations.js │ │ │ ├── queries.js │ │ │ └── schema.js │ │ ├── tmux-worktree-orchestrator.js │ │ ├── utils.d.ts │ │ └── utils.js │ ├── list-installed.js │ ├── orchestrate-codex-worker.sh │ ├── orchestrate-worktrees.js │ ├── orchestration-status.js │ ├── release.sh │ ├── repair.js │ ├── session-inspect.js │ ├── sessions-cli.js │ ├── setup-package-manager.js │ ├── skill-create-output.js │ ├── skills-health.js │ ├── status.js │ ├── sync-ecc-to-codex.sh │ └── uninstall.js ├── skills/ │ ├── agent-harness-construction/ │ │ └── SKILL.md │ ├── agentic-engineering/ │ │ └── SKILL.md │ ├── ai-first-engineering/ │ │ └── SKILL.md │ ├── ai-regression-testing/ │ │ └── SKILL.md │ ├── android-clean-architecture/ │ │ └── SKILL.md │ ├── api-design/ │ │ └── SKILL.md │ ├── article-writing/ │ │ └── SKILL.md │ ├── autonomous-loops/ │ │ └── SKILL.md │ ├── backend-patterns/ │ │ └── SKILL.md │ ├── blueprint/ │ │ └── SKILL.md │ ├── bun-runtime/ │ │ └── SKILL.md │ ├── carrier-relationship-management/ │ │ └── SKILL.md │ ├── claude-api/ │ │ └── SKILL.md │ ├── claude-devfleet/ │ │ └── SKILL.md │ ├── clickhouse-io/ │ │ └── SKILL.md │ ├── coding-standards/ │ │ └── SKILL.md │ ├── compose-multiplatform-patterns/ │ │ └── SKILL.md │ ├── configure-ecc/ │ │ └── SKILL.md │ ├── content-engine/ │ │ └── SKILL.md │ ├── content-hash-cache-pattern/ │ │ └── SKILL.md │ ├── continuous-agent-loop/ │ │ └── SKILL.md │ ├── continuous-learning/ │ │ ├── SKILL.md │ │ ├── config.json │ │ └── evaluate-session.sh │ ├── continuous-learning-v2/ │ │ ├── SKILL.md │ │ ├── agents/ │ │ │ ├── observer-loop.sh │ │ │ ├── observer.md │ │ │ ├── session-guardian.sh │ │ │ └── start-observer.sh │ │ ├── config.json │ │ ├── hooks/ │ │ │ └── observe.sh │ │ └── scripts/ │ │ ├── detect-project.sh │ │ ├── instinct-cli.py │ │ └── test_parse_instinct.py │ ├── cost-aware-llm-pipeline/ │ │ └── SKILL.md │ ├── cpp-coding-standards/ │ │ └── SKILL.md │ ├── cpp-testing/ │ │ └── SKILL.md │ ├── crosspost/ │ │ └── SKILL.md │ ├── customs-trade-compliance/ │ │ └── SKILL.md │ ├── data-scraper-agent/ │ │ └── SKILL.md │ ├── database-migrations/ │ │ └── SKILL.md │ ├── deep-research/ │ │ └── SKILL.md │ ├── deployment-patterns/ │ │ └── SKILL.md │ ├── django-patterns/ │ │ └── SKILL.md │ ├── django-security/ │ │ └── SKILL.md │ ├── django-tdd/ │ │ └── SKILL.md │ ├── django-verification/ │ │ └── SKILL.md │ ├── dmux-workflows/ │ │ └── SKILL.md │ ├── docker-patterns/ │ │ └── SKILL.md │ ├── documentation-lookup/ │ │ └── SKILL.md │ ├── e2e-testing/ │ │ └── SKILL.md │ ├── energy-procurement/ │ │ └── SKILL.md │ ├── enterprise-agent-ops/ │ │ └── SKILL.md │ ├── eval-harness/ │ │ └── SKILL.md │ ├── exa-search/ │ │ └── SKILL.md │ ├── fal-ai-media/ │ │ └── SKILL.md │ ├── foundation-models-on-device/ │ │ └── SKILL.md │ ├── frontend-patterns/ │ │ └── SKILL.md │ ├── frontend-slides/ │ │ ├── SKILL.md │ │ └── STYLE_PRESETS.md │ ├── golang-patterns/ │ │ └── SKILL.md │ ├── golang-testing/ │ │ └── SKILL.md │ ├── inventory-demand-planning/ │ │ └── SKILL.md │ ├── investor-materials/ │ │ └── SKILL.md │ ├── investor-outreach/ │ │ └── SKILL.md │ ├── iterative-retrieval/ │ │ └── SKILL.md │ ├── java-coding-standards/ │ │ └── SKILL.md │ ├── jpa-patterns/ │ │ └── SKILL.md │ ├── kotlin-coroutines-flows/ │ │ └── SKILL.md │ ├── kotlin-exposed-patterns/ │ │ └── SKILL.md │ ├── kotlin-ktor-patterns/ │ │ └── SKILL.md │ ├── kotlin-patterns/ │ │ └── SKILL.md │ ├── kotlin-testing/ │ │ └── SKILL.md │ ├── laravel-patterns/ │ │ └── SKILL.md │ ├── laravel-security/ │ │ └── SKILL.md │ ├── laravel-tdd/ │ │ └── SKILL.md │ ├── laravel-verification/ │ │ └── SKILL.md │ ├── liquid-glass-design/ │ │ └── SKILL.md │ ├── logistics-exception-management/ │ │ └── SKILL.md │ ├── market-research/ │ │ └── SKILL.md │ ├── mcp-server-patterns/ │ │ └── SKILL.md │ ├── nanoclaw-repl/ │ │ └── SKILL.md │ ├── nextjs-turbopack/ │ │ └── SKILL.md │ ├── nutrient-document-processing/ │ │ └── SKILL.md │ ├── perl-patterns/ │ │ └── SKILL.md │ ├── perl-security/ │ │ └── SKILL.md │ ├── perl-testing/ │ │ └── SKILL.md │ ├── plankton-code-quality/ │ │ └── SKILL.md │ ├── postgres-patterns/ │ │ └── SKILL.md │ ├── production-scheduling/ │ │ └── SKILL.md │ ├── project-guidelines-example/ │ │ └── SKILL.md │ ├── prompt-optimizer/ │ │ └── SKILL.md │ ├── python-patterns/ │ │ └── SKILL.md │ ├── python-testing/ │ │ └── SKILL.md │ ├── pytorch-patterns/ │ │ └── SKILL.md │ ├── quality-nonconformance/ │ │ └── SKILL.md │ ├── ralphinho-rfc-pipeline/ │ │ └── SKILL.md │ ├── regex-vs-llm-structured-text/ │ │ └── SKILL.md │ ├── returns-reverse-logistics/ │ │ └── SKILL.md │ ├── rust-patterns/ │ │ └── SKILL.md │ ├── rust-testing/ │ │ └── SKILL.md │ ├── search-first/ │ │ └── SKILL.md │ ├── security-review/ │ │ ├── SKILL.md │ │ └── cloud-infrastructure-security.md │ ├── security-scan/ │ │ └── SKILL.md │ ├── skill-stocktake/ │ │ ├── SKILL.md │ │ └── scripts/ │ │ ├── quick-diff.sh │ │ ├── save-results.sh │ │ └── scan.sh │ ├── springboot-patterns/ │ │ └── SKILL.md │ ├── springboot-security/ │ │ └── SKILL.md │ ├── springboot-tdd/ │ │ └── SKILL.md │ ├── springboot-verification/ │ │ └── SKILL.md │ ├── strategic-compact/ │ │ ├── SKILL.md │ │ └── suggest-compact.sh │ ├── swift-actor-persistence/ │ │ └── SKILL.md │ ├── swift-concurrency-6-2/ │ │ └── SKILL.md │ ├── swift-protocol-di-testing/ │ │ └── SKILL.md │ ├── swiftui-patterns/ │ │ └── SKILL.md │ ├── tdd-workflow/ │ │ └── SKILL.md │ ├── team-builder/ │ │ └── SKILL.md │ ├── verification-loop/ │ │ └── SKILL.md │ ├── video-editing/ │ │ └── SKILL.md │ ├── videodb/ │ │ ├── SKILL.md │ │ ├── reference/ │ │ │ ├── api-reference.md │ │ │ ├── capture-reference.md │ │ │ ├── capture.md │ │ │ ├── editor.md │ │ │ ├── generative.md │ │ │ ├── rtstream-reference.md │ │ │ ├── rtstream.md │ │ │ ├── search.md │ │ │ ├── streaming.md │ │ │ └── use-cases.md │ │ └── scripts/ │ │ └── ws_listener.py │ ├── visa-doc-translate/ │ │ ├── README.md │ │ └── SKILL.md │ └── x-api/ │ └── SKILL.md ├── tests/ │ ├── ci/ │ │ └── validators.test.js │ ├── codex-config.test.js │ ├── hooks/ │ │ ├── auto-tmux-dev.test.js │ │ ├── check-hook-enabled.test.js │ │ ├── cost-tracker.test.js │ │ ├── doc-file-warning.test.js │ │ ├── evaluate-session.test.js │ │ ├── hook-flags.test.js │ │ ├── hooks.test.js │ │ ├── observer-memory.test.js │ │ ├── post-bash-hooks.test.js │ │ ├── pre-bash-dev-server-block.test.js │ │ ├── pre-bash-reminders.test.js │ │ ├── quality-gate.test.js │ │ └── suggest-compact.test.js │ ├── integration/ │ │ └── hooks.test.js │ ├── lib/ │ │ ├── install-config.test.js │ │ ├── install-lifecycle.test.js │ │ ├── install-manifests.test.js │ │ ├── install-request.test.js │ │ ├── install-state.test.js │ │ ├── install-targets.test.js │ │ ├── orchestration-session.test.js │ │ ├── package-manager.test.js │ │ ├── project-detect.test.js │ │ ├── resolve-formatter.test.js │ │ ├── session-adapters.test.js │ │ ├── session-aliases.test.js │ │ ├── session-manager.test.js │ │ ├── shell-split.test.js │ │ ├── skill-dashboard.test.js │ │ ├── skill-evolution.test.js │ │ ├── skill-improvement.test.js │ │ ├── state-store.test.js │ │ ├── tmux-worktree-orchestrator.test.js │ │ └── utils.test.js │ ├── opencode-config.test.js │ ├── run-all.js │ └── scripts/ │ ├── claw.test.js │ ├── doctor.test.js │ ├── ecc.test.js │ ├── harness-audit.test.js │ ├── install-apply.test.js │ ├── install-plan.test.js │ ├── install-ps1.test.js │ ├── install-sh.test.js │ ├── list-installed.test.js │ ├── orchestrate-codex-worker.test.js │ ├── orchestration-status.test.js │ ├── repair.test.js │ ├── session-inspect.test.js │ ├── setup-package-manager.test.js │ ├── skill-create-output.test.js │ └── uninstall.test.js ├── the-longform-guide.md ├── the-openclaw-guide.md ├── the-security-guide.md └── the-shortform-guide.md
SYMBOL INDEX (1127 symbols across 157 files)
FILE: .cursor/hooks/adapter.js
constant MAX_STDIN (line 11) | const MAX_STDIN = 1024 * 1024;
function readStdin (line 13) | function readStdin() {
function getPluginRoot (line 24) | function getPluginRoot() {
function transformToClaude (line 28) | function transformToClaude(cursorInput, overrides = {}) {
function runExistingHook (line 49) | function runExistingHook(scriptName, stdinData) {
function hookEnabled (line 63) | function hookEnabled(hookId, allowedProfiles = ['standard', 'strict']) {
FILE: .opencode/index.ts
constant VERSION (line 44) | const VERSION = "1.6.0"
FILE: .opencode/plugins/ecc-hooks.ts
type HookProfile (line 24) | type HookProfile = "minimal" | "standard" | "strict"
FILE: .opencode/tools/check-coverage.ts
method execute (line 29) | async execute(args, context) {
type CoverageSummary (line 103) | interface CoverageSummary {
type CoverageResult (line 117) | interface CoverageResult {
function parseCoverageData (line 129) | function parseCoverageData(data: unknown): CoverageSummary {
FILE: .opencode/tools/format-code.ts
type Formatter (line 12) | type Formatter = "biome" | "prettier" | "black" | "gofmt" | "rustfmt"
method execute (line 24) | async execute(args, context) {
function detectFormatter (line 46) | function detectFormatter(cwd: string, ext: string): Formatter | null {
function buildFormatterCommand (line 59) | function buildFormatterCommand(formatter: Formatter, filePath: string): ...
FILE: .opencode/tools/git-summary.ts
method execute (line 27) | async execute(args, context) {
function run (line 48) | function run(command: string, cwd: string): string {
FILE: .opencode/tools/lint-check.ts
type Linter (line 11) | type Linter = "biome" | "eslint" | "ruff" | "pylint" | "golangci-lint"
method execute (line 30) | async execute(args, context) {
function detectLinter (line 46) | function detectLinter(cwd: string): Linter {
function buildLintCommand (line 79) | function buildLintCommand(linter: Linter, target: string, fix: boolean):...
FILE: .opencode/tools/run-tests.ts
method execute (line 33) | async execute(args, context) {
function detectPackageManager (line 100) | async function detectPackageManager(cwd: string): Promise<string> {
function detectTestFramework (line 117) | async function detectTestFramework(cwd: string): Promise<string> {
FILE: .opencode/tools/security-audit.ts
method execute (line 32) | async execute(args, context) {
type AuditCheck (line 109) | interface AuditCheck {
type AuditResults (line 118) | interface AuditResults {
function scanForSecrets (line 130) | async function scanForSecrets(
function scanDirectory (line 172) | async function scanDirectory(
function scanFile (line 195) | async function scanFile(
function scanCodeSecurity (line 223) | async function scanCodeSecurity(
function generateRecommendations (line 246) | function generateRecommendations(results: AuditResults): string[] {
FILE: scripts/ci/catalog.js
constant ROOT (line 17) | const ROOT = path.join(__dirname, '../..');
constant README_PATH (line 18) | const README_PATH = path.join(ROOT, 'README.md');
constant AGENTS_PATH (line 19) | const AGENTS_PATH = path.join(ROOT, 'AGENTS.md');
constant OUTPUT_MODE (line 21) | const OUTPUT_MODE = process.argv.includes('--md')
function normalizePathSegments (line 27) | function normalizePathSegments(relativePath) {
function listMatchingFiles (line 31) | function listMatchingFiles(relativeDir, matcher) {
function buildCatalog (line 43) | function buildCatalog() {
function readFileOrThrow (line 56) | function readFileOrThrow(filePath) {
function parseReadmeExpectations (line 64) | function parseReadmeExpectations(readmeContent) {
function parseAgentsDocExpectations (line 101) | function parseAgentsDocExpectations(agentsContent) {
function evaluateExpectations (line 156) | function evaluateExpectations(catalog, expectations) {
function formatExpectation (line 171) | function formatExpectation(expectation) {
function renderText (line 176) | function renderText(result) {
function renderMarkdown (line 195) | function renderMarkdown(result) {
function main (line 216) | function main() {
FILE: scripts/ci/validate-agents.js
constant AGENTS_DIR (line 9) | const AGENTS_DIR = path.join(__dirname, '../../agents');
constant REQUIRED_FIELDS (line 10) | const REQUIRED_FIELDS = ['model', 'tools'];
constant VALID_MODELS (line 11) | const VALID_MODELS = ['haiku', 'sonnet', 'opus'];
function extractFrontmatter (line 13) | function extractFrontmatter(content) {
function validateAgents (line 33) | function validateAgents() {
FILE: scripts/ci/validate-commands.js
constant ROOT_DIR (line 10) | const ROOT_DIR = path.join(__dirname, '../..');
constant COMMANDS_DIR (line 11) | const COMMANDS_DIR = path.join(ROOT_DIR, 'commands');
constant AGENTS_DIR (line 12) | const AGENTS_DIR = path.join(ROOT_DIR, 'agents');
constant SKILLS_DIR (line 13) | const SKILLS_DIR = path.join(ROOT_DIR, 'skills');
function validateCommands (line 15) | function validateCommands() {
FILE: scripts/ci/validate-hooks.js
constant HOOKS_FILE (line 11) | const HOOKS_FILE = path.join(__dirname, '../../hooks/hooks.json');
constant HOOKS_SCHEMA_PATH (line 12) | const HOOKS_SCHEMA_PATH = path.join(__dirname, '../../schemas/hooks.sche...
constant VALID_EVENTS (line 13) | const VALID_EVENTS = [
constant VALID_HOOK_TYPES (line 33) | const VALID_HOOK_TYPES = ['command', 'http', 'prompt', 'agent'];
constant EVENTS_WITHOUT_MATCHER (line 34) | const EVENTS_WITHOUT_MATCHER = new Set(['UserPromptSubmit', 'Notificatio...
function isNonEmptyString (line 36) | function isNonEmptyString(value) {
function isNonEmptyStringArray (line 40) | function isNonEmptyStringArray(value) {
function validateHookEntry (line 50) | function validateHookEntry(hook, label) {
function validateHooks (line 127) | function validateHooks() {
FILE: scripts/ci/validate-install-manifests.js
constant REPO_ROOT (line 10) | const REPO_ROOT = path.join(__dirname, '../..');
constant MODULES_MANIFEST_PATH (line 11) | const MODULES_MANIFEST_PATH = path.join(REPO_ROOT, 'manifests/install-mo...
constant PROFILES_MANIFEST_PATH (line 12) | const PROFILES_MANIFEST_PATH = path.join(REPO_ROOT, 'manifests/install-p...
constant COMPONENTS_MANIFEST_PATH (line 13) | const COMPONENTS_MANIFEST_PATH = path.join(REPO_ROOT, 'manifests/install...
constant MODULES_SCHEMA_PATH (line 14) | const MODULES_SCHEMA_PATH = path.join(REPO_ROOT, 'schemas/install-module...
constant PROFILES_SCHEMA_PATH (line 15) | const PROFILES_SCHEMA_PATH = path.join(REPO_ROOT, 'schemas/install-profi...
constant COMPONENTS_SCHEMA_PATH (line 16) | const COMPONENTS_SCHEMA_PATH = path.join(REPO_ROOT, 'schemas/install-com...
constant COMPONENT_FAMILY_PREFIXES (line 17) | const COMPONENT_FAMILY_PREFIXES = {
function readJson (line 24) | function readJson(filePath, label) {
function normalizeRelativePath (line 32) | function normalizeRelativePath(relativePath) {
function validateSchema (line 36) | function validateSchema(ajv, schemaPath, data, label) {
function validateInstallManifests (line 53) | function validateInstallManifests() {
FILE: scripts/ci/validate-no-personal-paths.js
constant ROOT (line 11) | const ROOT = path.join(__dirname, '../..');
constant TARGETS (line 12) | const TARGETS = [
constant BLOCK_PATTERNS (line 21) | const BLOCK_PATTERNS = [
function collectFiles (line 26) | function collectFiles(targetPath, out) {
FILE: scripts/ci/validate-rules.js
constant RULES_DIR (line 9) | const RULES_DIR = path.join(__dirname, '../../rules');
function collectRuleFiles (line 17) | function collectRuleFiles(dir) {
function validateRules (line 45) | function validateRules() {
FILE: scripts/ci/validate-skills.js
constant SKILLS_DIR (line 9) | const SKILLS_DIR = path.join(__dirname, '../../skills');
function validateSkills (line 11) | function validateSkills() {
FILE: scripts/claw.js
constant SESSION_NAME_RE (line 16) | const SESSION_NAME_RE = /^[a-zA-Z0-9][-a-zA-Z0-9]*$/;
constant DEFAULT_MODEL (line 17) | const DEFAULT_MODEL = process.env.CLAW_MODEL || 'sonnet';
constant DEFAULT_COMPACT_KEEP_TURNS (line 18) | const DEFAULT_COMPACT_KEEP_TURNS = 20;
function isValidSessionName (line 20) | function isValidSessionName(name) {
function getClawDir (line 24) | function getClawDir() {
function getSessionPath (line 28) | function getSessionPath(name) {
function listSessions (line 32) | function listSessions(dir) {
function loadHistory (line 40) | function loadHistory(filePath) {
function appendTurn (line 48) | function appendTurn(filePath, role, content, timestamp) {
function normalizeSkillList (line 55) | function normalizeSkillList(raw) {
function loadECCContext (line 61) | function loadECCContext(skillList) {
function buildPrompt (line 78) | function buildPrompt(systemPrompt, history, userMessage) {
function askClaude (line 86) | function askClaude(systemPrompt, history, userMessage, model) {
function parseTurns (line 112) | function parseTurns(history) {
function estimateTokenCount (line 122) | function estimateTokenCount(text) {
function getSessionMetrics (line 126) | function getSessionMetrics(filePath) {
function searchSessions (line 143) | function searchSessions(query, dir) {
function compactSession (line 166) | function compactSession(filePath, keepTurns = DEFAULT_COMPACT_KEEP_TURNS) {
function exportSession (line 180) | function exportSession(filePath, format, outputPath) {
function branchSession (line 216) | function branchSession(currentSessionPath, newSessionName, targetDir = g...
function skillExists (line 229) | function skillExists(skillName) {
function handleClear (line 234) | function handleClear(sessionPath) {
function handleHistory (line 240) | function handleHistory(sessionPath) {
function handleSessions (line 249) | function handleSessions(dir) {
function handleHelp (line 262) | function handleHelp() {
function main (line 278) | function main() {
FILE: scripts/codemaps/generate.ts
constant ROOT (line 30) | const ROOT = process.cwd();
constant SRC_DIR (line 31) | const SRC_DIR = process.argv[2] ? path.resolve(process.argv[2]) : ROOT;
constant OUTPUT_DIR (line 32) | const OUTPUT_DIR = path.join(ROOT, 'docs', 'CODEMAPS');
constant TODAY (line 33) | const TODAY = new Date().toISOString().split('T')[0];
constant AREA_PATTERNS (line 36) | const AREA_PATTERNS: Record<string, RegExp[]> = {
function walkDir (line 66) | function walkDir(dir: string, results: string[] = []): string[] {
function rel (line 92) | function rel(p: string): string {
type AreaInfo (line 100) | interface AreaInfo {
function classifyFiles (line 107) | function classifyFiles(allFiles: string[]): Record<string, AreaInfo> {
function lineCount (line 140) | function lineCount(p: string): number {
function buildTree (line 150) | function buildTree(dir: string, prefix = '', depth = 0): string {
function generateAreaDoc (line 182) | function generateAreaDoc(areaKey: string, area: AreaInfo, allFiles: stri...
function generateIndex (line 244) | function generateIndex(areas: Record<string, AreaInfo>, allFiles: string...
function main (line 292) | function main(): void {
FILE: scripts/doctor.js
function showHelp (line 6) | function showHelp(exitCode = 0) {
function parseArgs (line 15) | function parseArgs(argv) {
function statusLabel (line 41) | function statusLabel(status) {
function printHuman (line 57) | function printHuman(report) {
function main (line 82) | function main() {
FILE: scripts/ecc.js
constant COMMANDS (line 7) | const COMMANDS = {
constant PRIMARY_COMMANDS (line 50) | const PRIMARY_COMMANDS = [
function showHelp (line 62) | function showHelp(exitCode = 0) {
function resolveCommand (line 95) | function resolveCommand(argv) {
function runCommand (line 140) | function runCommand(commandName, args) {
function main (line 180) | function main() {
FILE: scripts/harness-audit.js
constant REPO_ROOT (line 6) | const REPO_ROOT = path.join(__dirname, '..');
constant CATEGORIES (line 8) | const CATEGORIES = [
function normalizeScope (line 18) | function normalizeScope(scope) {
function parseArgs (line 26) | function parseArgs(argv) {
function fileExists (line 78) | function fileExists(relativePath) {
function readText (line 82) | function readText(relativePath) {
function countFiles (line 86) | function countFiles(relativeDir, extension) {
function safeRead (line 112) | function safeRead(relativePath) {
function getChecks (line 120) | function getChecks() {
function summarizeCategoryScores (line 390) | function summarizeCategoryScores(checks) {
function buildReport (line 410) | function buildReport(scope) {
function printText (line 448) | function printText(report) {
function showHelp (line 474) | function showHelp(exitCode = 0) {
function main (line 483) | function main() {
FILE: scripts/hooks/auto-tmux-dev.js
constant MAX_STDIN (line 31) | const MAX_STDIN = 1024 * 1024;
FILE: scripts/hooks/check-console-log.js
constant EXCLUDED_PATTERNS (line 20) | const EXCLUDED_PATTERNS = [
constant MAX_STDIN (line 29) | const MAX_STDIN = 1024 * 1024;
FILE: scripts/hooks/cost-tracker.js
constant MAX_STDIN (line 17) | const MAX_STDIN = 1024 * 1024;
function toNumber (line 20) | function toNumber(value) {
function estimateCost (line 25) | function estimateCost(model, inputTokens, outputTokens) {
FILE: scripts/hooks/doc-file-warning.js
constant MAX_STDIN (line 12) | const MAX_STDIN = 1024 * 1024;
function isAllowedDocPath (line 15) | function isAllowedDocPath(filePath) {
FILE: scripts/hooks/evaluate-session.js
constant MAX_STDIN (line 26) | const MAX_STDIN = 1024 * 1024;
function main (line 44) | async function main() {
FILE: scripts/hooks/insaits-security-monitor.py
function extract_content (line 95) | def extract_content(data: Dict[str, Any]) -> Tuple[str, str]:
function write_audit (line 129) | def write_audit(event: Dict[str, Any]) -> None:
function get_anomaly_attr (line 148) | def get_anomaly_attr(anomaly: Any, key: str, default: str = "") -> str:
function format_feedback (line 160) | def format_feedback(anomalies: List[Any]) -> str:
function main (line 187) | def main() -> None:
FILE: scripts/hooks/insaits-security-wrapper.js
constant MAX_STDIN (line 17) | const MAX_STDIN = 1024 * 1024;
function isEnabled (line 19) | function isEnabled(value) {
FILE: scripts/hooks/post-bash-build-complete.js
constant MAX_STDIN (line 4) | const MAX_STDIN = 1024 * 1024;
FILE: scripts/hooks/post-bash-pr-created.js
constant MAX_STDIN (line 4) | const MAX_STDIN = 1024 * 1024;
FILE: scripts/hooks/post-edit-console-warn.js
constant MAX_STDIN (line 14) | const MAX_STDIN = 1024 * 1024;
FILE: scripts/hooks/post-edit-format.js
constant UNSAFE_PATH_CHARS (line 24) | const UNSAFE_PATH_CHARS = /[&|<>^%!]/;
constant MAX_STDIN (line 28) | const MAX_STDIN = 1024 * 1024;
function run (line 37) | function run(rawInput) {
FILE: scripts/hooks/post-edit-typecheck.js
constant MAX_STDIN (line 16) | const MAX_STDIN = 1024 * 1024;
FILE: scripts/hooks/pre-bash-dev-server-block.js
constant MAX_STDIN (line 4) | const MAX_STDIN = 1024 * 1024;
constant DEV_COMMAND_WORDS (line 8) | const DEV_COMMAND_WORDS = new Set([
constant SKIPPABLE_PREFIX_WORDS (line 16) | const SKIPPABLE_PREFIX_WORDS = new Set(['env', 'command', 'builtin', 'ex...
constant PREFIX_OPTION_VALUE_WORDS (line 17) | const PREFIX_OPTION_VALUE_WORDS = {
function readToken (line 37) | function readToken(input, startIndex) {
function shouldSkipOptionValue (line 87) | function shouldSkipOptionValue(wrapper, optionToken) {
function isOptionToken (line 93) | function isOptionToken(token) {
function normalizeCommandWord (line 97) | function normalizeCommandWord(token) {
function getLeadingCommandWord (line 103) | function getLeadingCommandWord(segment) {
FILE: scripts/hooks/pre-bash-git-push-reminder.js
constant MAX_STDIN (line 4) | const MAX_STDIN = 1024 * 1024;
FILE: scripts/hooks/pre-bash-tmux-reminder.js
constant MAX_STDIN (line 4) | const MAX_STDIN = 1024 * 1024;
FILE: scripts/hooks/pre-compact.js
function main (line 22) | async function main() {
FILE: scripts/hooks/quality-gate.js
constant MAX_STDIN (line 23) | const MAX_STDIN = 1024 * 1024;
function exec (line 33) | function exec(command, args, cwd = process.cwd()) {
function log (line 47) | function log(msg) {
function maybeRunQualityGate (line 57) | function maybeRunQualityGate(filePath) {
function run (line 140) | function run(rawInput) {
FILE: scripts/hooks/run-with-flags.js
constant MAX_STDIN (line 16) | const MAX_STDIN = 1024 * 1024;
function readStdinRaw (line 18) | function readStdinRaw() {
function getPluginRoot (line 33) | function getPluginRoot() {
function main (line 40) | async function main() {
FILE: scripts/hooks/session-end-marker.js
function run (line 9) | function run(rawInput) {
FILE: scripts/hooks/session-end.js
constant SUMMARY_START_MARKER (line 27) | const SUMMARY_START_MARKER = '<!-- ECC:SUMMARY:START -->';
constant SUMMARY_END_MARKER (line 28) | const SUMMARY_END_MARKER = '<!-- ECC:SUMMARY:END -->';
constant SESSION_SEPARATOR (line 29) | const SESSION_SEPARATOR = '\n---\n';
function extractSessionSummary (line 38) | function extractSessionSummary(transcriptPath) {
constant MAX_STDIN (line 111) | const MAX_STDIN = 1024 * 1024;
function runMain (line 126) | function runMain() {
function getSessionMetadata (line 133) | function getSessionMetadata() {
function extractHeaderField (line 143) | function extractHeaderField(header, label) {
function buildSessionHeader (line 148) | function buildSessionHeader(today, currentTime, metadata, existingConten...
function mergeSessionHeader (line 166) | function mergeSessionHeader(content, today, currentTime, metadata) {
function main (line 178) | async function main() {
function buildSummarySection (line 264) | function buildSummarySection(summary) {
function buildSummaryBlock (line 293) | function buildSummaryBlock(summary) {
function escapeRegExp (line 297) | function escapeRegExp(value) {
FILE: scripts/hooks/session-start.js
function main (line 25) | async function main() {
FILE: scripts/hooks/suggest-compact.js
function main (line 24) | async function main() {
FILE: scripts/install-apply.js
function showHelp (line 19) | function showHelp(exitCode = 0) {
function printHumanPlan (line 51) | function printHumanPlan(plan, dryRun) {
function main (line 95) | function main() {
FILE: scripts/install-plan.js
function showHelp (line 15) | function showHelp() {
function parseArgs (line 44) | function parseArgs(argv) {
function printProfiles (line 109) | function printProfiles(profiles) {
function printModules (line 117) | function printModules(modules) {
function printComponents (line 128) | function printComponents(components) {
function printPlan (line 137) | function printPlan(plan) {
function main (line 185) | function main() {
FILE: scripts/lib/hook-flags.js
constant VALID_PROFILES (line 12) | const VALID_PROFILES = new Set(['minimal', 'standard', 'strict']);
function normalizeId (line 14) | function normalizeId(value) {
function getHookProfile (line 18) | function getHookProfile() {
function getDisabledHookIds (line 23) | function getDisabledHookIds() {
function parseProfiles (line 35) | function parseProfiles(rawProfiles, fallback = ['standard', 'strict']) {
function isHookEnabled (line 53) | function isHookEnabled(hookId, options = {}) {
FILE: scripts/lib/install-executor.js
constant LANGUAGE_NAME_PATTERN (line 14) | const LANGUAGE_NAME_PATTERN = /^[a-zA-Z0-9_-]+$/;
constant EXCLUDED_GENERATED_SOURCE_SUFFIXES (line 15) | const EXCLUDED_GENERATED_SOURCE_SUFFIXES = [
function getSourceRoot (line 20) | function getSourceRoot() {
function getPackageVersion (line 24) | function getPackageVersion(sourceRoot) {
function getManifestVersion (line 35) | function getManifestVersion(sourceRoot) {
function getRepoCommit (line 46) | function getRepoCommit(sourceRoot) {
function readDirectoryNames (line 59) | function readDirectoryNames(dirPath) {
function listAvailableLanguages (line 70) | function listAvailableLanguages(sourceRoot = getSourceRoot()) {
function validateLegacyTarget (line 78) | function validateLegacyTarget(target) {
constant IGNORED_DIRECTORY_NAMES (line 86) | const IGNORED_DIRECTORY_NAMES = new Set([
function listFilesRecursive (line 91) | function listFilesRecursive(dirPath) {
function isGeneratedRuntimeSourcePath (line 117) | function isGeneratedRuntimeSourcePath(sourceRelativePath) {
function createStatePreview (line 122) | function createStatePreview(options) {
function applyInstallPlan (line 127) | function applyInstallPlan(plan) {
function buildCopyFileOperation (line 132) | function buildCopyFileOperation({ moduleId, sourcePath, sourceRelativePa...
function addRecursiveCopyOperations (line 145) | function addRecursiveCopyOperations(operations, options) {
function addFileCopyOperation (line 169) | function addFileCopyOperation(operations, options) {
function addMatchingRuleOperations (line 186) | function addMatchingRuleOperations(operations, options) {
function isDirectoryNonEmpty (line 217) | function isDirectoryNonEmpty(dirPath) {
function planClaudeLegacyInstall (line 221) | function planClaudeLegacyInstall(context) {
function planCursorLegacyInstall (line 277) | function planCursorLegacyInstall(context) {
function planAntigravityLegacyInstall (line 364) | function planAntigravityLegacyInstall(context) {
function createLegacyInstallPlan (line 442) | function createLegacyInstallPlan(options = {}) {
function createLegacyCompatInstallPlan (line 509) | function createLegacyCompatInstallPlan(options = {}) {
function materializeScaffoldOperation (line 541) | function materializeScaffoldOperation(sourceRoot, operation) {
function createManifestInstallPlan (line 578) | function createManifestInstallPlan(options = {}) {
FILE: scripts/lib/install-lifecycle.js
constant DEFAULT_REPO_ROOT (line 14) | const DEFAULT_REPO_ROOT = path.join(__dirname, '../..');
function readPackageVersion (line 16) | function readPackageVersion(repoRoot) {
function normalizeTargets (line 25) | function normalizeTargets(targets) {
function compareStringArrays (line 41) | function compareStringArrays(left, right) {
function getManagedOperations (line 52) | function getManagedOperations(state) {
function resolveOperationSourcePath (line 58) | function resolveOperationSourcePath(repoRoot, operation) {
function areFilesEqual (line 66) | function areFilesEqual(leftPath, rightPath) {
function readFileUtf8 (line 80) | function readFileUtf8(filePath) {
function isPlainObject (line 84) | function isPlainObject(value) {
function cloneJsonValue (line 88) | function cloneJsonValue(value) {
function parseJsonLikeValue (line 96) | function parseJsonLikeValue(value, label) {
function getOperationTextContent (line 116) | function getOperationTextContent(operation) {
function getOperationJsonPayload (line 134) | function getOperationJsonPayload(operation) {
function getOperationPreviousContent (line 152) | function getOperationPreviousContent(operation) {
function getOperationPreviousJson (line 168) | function getOperationPreviousJson(operation) {
function formatJson (line 184) | function formatJson(value) {
function readJsonFile (line 188) | function readJsonFile(filePath) {
function ensureParentDir (line 192) | function ensureParentDir(filePath) {
function deepMergeJson (line 196) | function deepMergeJson(baseValue, patchValue) {
function jsonContainsSubset (line 212) | function jsonContainsSubset(actualValue, expectedValue) {
constant JSON_REMOVE_SENTINEL (line 235) | const JSON_REMOVE_SENTINEL = Symbol('json-remove');
function deepRemoveJsonSubset (line 237) | function deepRemoveJsonSubset(currentValue, managedValue) {
function hydrateRecordedOperations (line 281) | function hydrateRecordedOperations(repoRoot, operations) {
function buildRecordedStatePreview (line 294) | function buildRecordedStatePreview(state, context, operations) {
function shouldRepairFromRecordedOperations (line 307) | function shouldRepairFromRecordedOperations(state) {
function executeRepairOperation (line 311) | function executeRepairOperation(repoRoot, operation) {
function executeUninstallOperation (line 362) | function executeUninstallOperation(operation) {
function inspectManagedOperation (line 494) | function inspectManagedOperation(repoRoot, operation) {
function summarizeManagedOperationHealth (line 621) | function summarizeManagedOperationHealth(repoRoot, operations) {
function buildDiscoveryRecord (line 642) | function buildDiscoveryRecord(adapter, context) {
function discoverInstalledStates (line 697) | function discoverInstalledStates(options = {}) {
function buildIssue (line 710) | function buildIssue(severity, code, message, extra = {}) {
function determineStatus (line 719) | function determineStatus(issues) {
function analyzeRecord (line 731) | function analyzeRecord(record, context) {
function buildDoctorReport (line 897) | function buildDoctorReport(options = {}) {
function createRepairPlanFromRecord (line 939) | function createRepairPlanFromRecord(record, context) {
function repairInstalledStates (line 986) | function repairInstalledStates(options = {}) {
function cleanupEmptyParentDirs (line 1097) | function cleanupEmptyParentDirs(filePath, stopAt) {
function uninstallInstalledStates (line 1121) | function uninstallInstalledStates(options = {}) {
FILE: scripts/lib/install-manifests.js
constant DEFAULT_REPO_ROOT (line 6) | const DEFAULT_REPO_ROOT = path.join(__dirname, '../..');
constant SUPPORTED_INSTALL_TARGETS (line 7) | const SUPPORTED_INSTALL_TARGETS = ['claude', 'cursor', 'antigravity', 'c...
constant COMPONENT_FAMILY_PREFIXES (line 8) | const COMPONENT_FAMILY_PREFIXES = {
constant LEGACY_COMPAT_BASE_MODULE_IDS_BY_TARGET (line 14) | const LEGACY_COMPAT_BASE_MODULE_IDS_BY_TARGET = Object.freeze({
constant LEGACY_LANGUAGE_ALIAS_TO_CANONICAL (line 37) | const LEGACY_LANGUAGE_ALIAS_TO_CANONICAL = Object.freeze({
constant LEGACY_LANGUAGE_EXTRA_MODULE_IDS (line 49) | const LEGACY_LANGUAGE_EXTRA_MODULE_IDS = Object.freeze({
function readJson (line 59) | function readJson(filePath, label) {
function dedupeStrings (line 67) | function dedupeStrings(values) {
function assertKnownModuleIds (line 71) | function assertKnownModuleIds(moduleIds, manifests) {
function intersectTargets (line 84) | function intersectTargets(modules) {
function getManifestPaths (line 94) | function getManifestPaths(repoRoot = DEFAULT_REPO_ROOT) {
function loadInstallManifests (line 102) | function loadInstallManifests(options = {}) {
function listInstallProfiles (line 139) | function listInstallProfiles(options = {}) {
function listInstallModules (line 148) | function listInstallModules(options = {}) {
function listLegacyCompatibilityLanguages (line 162) | function listLegacyCompatibilityLanguages() {
function validateInstallModuleIds (line 166) | function validateInstallModuleIds(moduleIds, options = {}) {
function listInstallComponents (line 173) | function listInstallComponents(options = {}) {
function expandComponentIdsToModuleIds (line 211) | function expandComponentIdsToModuleIds(componentIds, manifests) {
function resolveLegacyCompatibilitySelection (line 225) | function resolveLegacyCompatibilitySelection(options = {}) {
function resolveInstallPlan (line 278) | function resolveInstallPlan(options = {}) {
FILE: scripts/lib/install-state.js
constant SCHEMA_PATH (line 14) | const SCHEMA_PATH = path.join(__dirname, '..', '..', 'schemas', 'install...
function cloneJsonValue (line 18) | function cloneJsonValue(value) {
function readJson (line 26) | function readJson(filePath, label) {
function getValidator (line 34) | function getValidator() {
function createFallbackValidator (line 50) | function createFallbackValidator() {
function formatValidationErrors (line 221) | function formatValidationErrors(errors = []) {
function validateInstallState (line 227) | function validateInstallState(state) {
function assertValidInstallState (line 236) | function assertValidInstallState(state, label) {
function createInstallState (line 243) | function createInstallState(options) {
function readInstallState (line 295) | function readInstallState(filePath) {
function writeInstallState (line 301) | function writeInstallState(filePath, state) {
FILE: scripts/lib/install-targets/antigravity-project.js
method planOperations (line 15) | planOperations(input, adapter) {
FILE: scripts/lib/install-targets/cursor-project.js
method planOperations (line 15) | planOperations(input, adapter) {
FILE: scripts/lib/install-targets/helpers.js
function normalizeRelativePath (line 5) | function normalizeRelativePath(relativePath) {
function resolveBaseRoot (line 12) | function resolveBaseRoot(scope, input = {}) {
function buildValidationIssue (line 28) | function buildValidationIssue(severity, code, message, extra = {}) {
function listRelativeFiles (line 37) | function listRelativeFiles(dirPath, prefix = '') {
function createManagedOperation (line 61) | function createManagedOperation({
function defaultValidateAdapterInput (line 83) | function defaultValidateAdapterInput(config, input = {}) {
function createRemappedOperation (line 107) | function createRemappedOperation(adapter, moduleId, sourceRelativePath, ...
function createNamespacedFlatRuleOperations (line 120) | function createNamespacedFlatRuleOperations(adapter, moduleId, sourceRel...
function createFlatRuleOperations (line 163) | function createFlatRuleOperations({ moduleId, repoRoot, sourceRelativePa...
function createInstallTargetAdapter (line 204) | function createInstallTargetAdapter(config) {
FILE: scripts/lib/install-targets/registry.js
constant ADAPTERS (line 7) | const ADAPTERS = Object.freeze([
function listInstallTargetAdapters (line 15) | function listInstallTargetAdapters() {
function getInstallTargetAdapter (line 19) | function getInstallTargetAdapter(targetOrAdapterId) {
function planInstallTargetScaffold (line 29) | function planInstallTargetScaffold(options = {}) {
FILE: scripts/lib/install/apply.js
function applyInstallPlan (line 7) | function applyInstallPlan(plan) {
FILE: scripts/lib/install/config.js
constant DEFAULT_INSTALL_CONFIG (line 7) | const DEFAULT_INSTALL_CONFIG = 'ecc-install.json';
constant CONFIG_SCHEMA_PATH (line 8) | const CONFIG_SCHEMA_PATH = path.join(__dirname, '..', '..', '..', 'schem...
function readJson (line 12) | function readJson(filePath, label) {
function getValidator (line 20) | function getValidator() {
function dedupeStrings (line 31) | function dedupeStrings(values) {
function formatValidationErrors (line 35) | function formatValidationErrors(errors = []) {
function resolveInstallConfigPath (line 39) | function resolveInstallConfigPath(configPath, options = {}) {
function loadInstallConfig (line 50) | function loadInstallConfig(configPath, options = {}) {
FILE: scripts/lib/install/request.js
constant LEGACY_INSTALL_TARGETS (line 5) | const LEGACY_INSTALL_TARGETS = ['claude', 'cursor', 'antigravity'];
function dedupeStrings (line 7) | function dedupeStrings(values) {
function parseInstallArgs (line 11) | function parseInstallArgs(argv) {
function normalizeInstallRequest (line 70) | function normalizeInstallRequest(options = {}) {
FILE: scripts/lib/install/runtime.js
function createInstallPlanFromRequest (line 9) | function createInstallPlanFromRequest(request, options = {}) {
FILE: scripts/lib/orchestration-session.js
function stripCodeTicks (line 7) | function stripCodeTicks(value) {
function parseSection (line 20) | function parseSection(content, heading) {
function parseBullets (line 46) | function parseBullets(section) {
function parseWorkerStatus (line 58) | function parseWorkerStatus(content) {
function parseWorkerTask (line 92) | function parseWorkerTask(content) {
function parseWorkerHandoff (line 99) | function parseWorkerHandoff(content) {
function readTextIfExists (line 107) | function readTextIfExists(filePath) {
function listWorkerDirectories (line 115) | function listWorkerDirectories(coordinationDir) {
function loadWorkerSnapshots (line 131) | function loadWorkerSnapshots(coordinationDir) {
function listTmuxPanes (line 157) | function listTmuxPanes(sessionName, options = {}) {
function summarizeWorkerStates (line 218) | function summarizeWorkerStates(workers) {
function buildSessionSnapshot (line 226) | function buildSessionSnapshot({ sessionName, coordinationDir, panes }) {
function resolveSnapshotTarget (line 247) | function resolveSnapshotTarget(targetPath, cwd = process.cwd()) {
function collectSessionSnapshot (line 273) | function collectSessionSnapshot(targetPath, cwd = process.cwd()) {
FILE: scripts/lib/package-manager.d.ts
type PackageManagerName (line 7) | type PackageManagerName = 'npm' | 'pnpm' | 'yarn' | 'bun';
type PackageManagerConfig (line 10) | interface PackageManagerConfig {
type DetectionSource (line 29) | type DetectionSource =
type PackageManagerResult (line 38) | interface PackageManagerResult {
constant PACKAGE_MANAGERS (line 45) | const PACKAGE_MANAGERS: Record<PackageManagerName, PackageManagerConfig>;
constant DETECTION_PRIORITY (line 48) | const DETECTION_PRIORITY: PackageManagerName[];
type GetPackageManagerOptions (line 50) | interface GetPackageManagerOptions {
FILE: scripts/lib/package-manager.js
constant PACKAGE_MANAGERS (line 13) | const PACKAGE_MANAGERS = {
constant DETECTION_PRIORITY (line 57) | const DETECTION_PRIORITY = ['pnpm', 'bun', 'yarn', 'npm'];
function getConfigPath (line 60) | function getConfigPath() {
function loadConfig (line 67) | function loadConfig() {
function saveConfig (line 84) | function saveConfig(config) {
function detectFromLockFile (line 92) | function detectFromLockFile(projectDir = process.cwd()) {
function detectFromPackageJson (line 107) | function detectFromPackageJson(projectDir = process.cwd()) {
function getAvailablePackageManagers (line 136) | function getAvailablePackageManagers() {
function getPackageManager (line 163) | function getPackageManager(options = {}) {
function setPreferredPackageManager (line 241) | function setPreferredPackageManager(pmName) {
function setProjectPackageManager (line 262) | function setProjectPackageManager(pmName, projectDir = process.cwd()) {
constant SAFE_NAME_REGEX (line 285) | const SAFE_NAME_REGEX = /^[@a-zA-Z0-9_./-]+$/;
function getRunCommand (line 293) | function getRunCommand(script, options = {}) {
constant SAFE_ARGS_REGEX (line 319) | const SAFE_ARGS_REGEX = /^[@a-zA-Z0-9\s_./:=,'"*+-]+$/;
function getExecCommand (line 327) | function getExecCommand(binary, args = '', options = {}) {
function getSelectionPrompt (line 349) | function getSelectionPrompt() {
function escapeRegex (line 362) | function escapeRegex(str) {
function getCommandPattern (line 370) | function getCommandPattern(action) {
FILE: scripts/lib/project-detect.js
constant LANGUAGE_RULES (line 17) | const LANGUAGE_RULES = [
constant FRAMEWORK_RULES (line 84) | const FRAMEWORK_RULES = [
function fileExists (line 131) | function fileExists(projectDir, filePath) {
function hasFileWithExtension (line 145) | function hasFileWithExtension(projectDir, extensions) {
function getPackageJsonDeps (line 163) | function getPackageJsonDeps(projectDir) {
function getPythonDeps (line 179) | function getPythonDeps(projectDir) {
function getGoDeps (line 232) | function getGoDeps(projectDir) {
function getRustDeps (line 259) | function getRustDeps(projectDir) {
function getComposerDeps (line 288) | function getComposerDeps(projectDir) {
function getElixirDeps (line 304) | function getElixirDeps(projectDir) {
function detectProjectType (line 325) | function detectProjectType(projectDir) {
FILE: scripts/lib/resolve-formatter.js
constant BIOME_CONFIGS (line 21) | const BIOME_CONFIGS = ['biome.json', 'biome.jsonc'];
constant PRETTIER_CONFIGS (line 23) | const PRETTIER_CONFIGS = [
constant PROJECT_ROOT_MARKERS (line 37) | const PROJECT_ROOT_MARKERS = ['package.json', ...BIOME_CONFIGS, ...PRETT...
constant WIN_CMD_SHIMS (line 40) | const WIN_CMD_SHIMS = { npx: 'npx.cmd', pnpm: 'pnpm.cmd', yarn: 'yarn.cm...
constant FORMATTER_PACKAGES (line 43) | const FORMATTER_PACKAGES = {
function findProjectRoot (line 58) | function findProjectRoot(startDir) {
function detectFormatter (line 83) | function detectFormatter(projectRoot) {
function getRunnerFromPackageManager (line 125) | function getRunnerFromPackageManager(projectRoot) {
function resolveFormatterBin (line 146) | function resolveFormatterBin(projectRoot, formatter) {
function clearCaches (line 174) | function clearCaches() {
FILE: scripts/lib/session-adapters/canonical-session.js
constant SESSION_SCHEMA_VERSION (line 7) | const SESSION_SCHEMA_VERSION = 'ecc.session.v1';
constant SESSION_RECORDING_SCHEMA_VERSION (line 8) | const SESSION_RECORDING_SCHEMA_VERSION = 'ecc.session.recording.v1';
constant DEFAULT_RECORDING_DIR (line 9) | const DEFAULT_RECORDING_DIR = path.join(os.tmpdir(), 'ecc-session-record...
function isObject (line 11) | function isObject(value) {
function sanitizePathSegment (line 15) | function sanitizePathSegment(value) {
function parseContextSeedPaths (line 22) | function parseContextSeedPaths(context) {
function ensureString (line 33) | function ensureString(value, fieldPath) {
function ensureOptionalString (line 39) | function ensureOptionalString(value, fieldPath) {
function ensureBoolean (line 45) | function ensureBoolean(value, fieldPath) {
function ensureArrayOfStrings (line 51) | function ensureArrayOfStrings(value, fieldPath) {
function ensureInteger (line 57) | function ensureInteger(value, fieldPath) {
function buildAggregates (line 63) | function buildAggregates(workers) {
function summarizeRawWorkerStates (line 76) | function summarizeRawWorkerStates(snapshot) {
function deriveDmuxSessionState (line 90) | function deriveDmuxSessionState(snapshot) {
function validateCanonicalSnapshot (line 120) | function validateCanonicalSnapshot(snapshot) {
function resolveRecordingDir (line 213) | function resolveRecordingDir(options = {}) {
function getFallbackSessionRecordingPath (line 225) | function getFallbackSessionRecordingPath(snapshot, options = {}) {
function readExistingRecording (line 235) | function readExistingRecording(filePath) {
function writeFallbackSessionRecording (line 247) | function writeFallbackSessionRecording(snapshot, options = {}) {
function loadStateStore (line 280) | function loadStateStore(options = {}) {
function resolveStateStoreWriter (line 303) | function resolveStateStoreWriter(stateStore) {
function persistCanonicalSnapshot (line 336) | function persistCanonicalSnapshot(snapshot, options = {}) {
function normalizeDmuxSnapshot (line 374) | function normalizeDmuxSnapshot(snapshot, sourceTarget) {
function deriveClaudeWorkerId (line 419) | function deriveClaudeWorkerId(session) {
function normalizeClaudeHistorySession (line 427) | function normalizeClaudeHistorySession(session, sourceTarget) {
FILE: scripts/lib/session-adapters/claude-history.js
function parseClaudeTarget (line 10) | function parseClaudeTarget(target) {
function isSessionFileTarget (line 24) | function isSessionFileTarget(target, cwd) {
function hydrateSessionFromPath (line 35) | function hydrateSessionFromPath(sessionPath) {
function resolveSessionRecord (line 57) | function resolveSessionRecord(target, cwd) {
function createClaudeHistoryAdapter (line 114) | function createClaudeHistoryAdapter(options = {}) {
FILE: scripts/lib/session-adapters/dmux-tmux.js
function isPlanFileTarget (line 9) | function isPlanFileTarget(target, cwd) {
function isSessionNameTarget (line 20) | function isSessionNameTarget(target, cwd) {
function buildSourceTarget (line 29) | function buildSourceTarget(target, cwd) {
function createDmuxTmuxAdapter (line 43) | function createDmuxTmuxAdapter(options = {}) {
FILE: scripts/lib/session-adapters/registry.js
constant TARGET_TYPE_TO_ADAPTER_ID (line 6) | const TARGET_TYPE_TO_ADAPTER_ID = Object.freeze({
function buildDefaultAdapterOptions (line 14) | function buildDefaultAdapterOptions(options, adapterId) {
function createDefaultAdapters (line 30) | function createDefaultAdapters(options = {}) {
function coerceTargetValue (line 37) | function coerceTargetValue(value) {
function normalizeStructuredTarget (line 45) | function normalizeStructuredTarget(target, context = {}) {
function createAdapterRegistry (line 78) | function createAdapterRegistry(options = {}) {
function inspectSessionTarget (line 117) | function inspectSessionTarget(target, options = {}) {
FILE: scripts/lib/session-aliases.d.ts
type AliasEntry (line 7) | interface AliasEntry {
type AliasStore (line 15) | interface AliasStore {
type ResolvedAlias (line 25) | interface ResolvedAlias {
type AliasListItem (line 33) | interface AliasListItem {
type AliasResult (line 42) | interface AliasResult {
type SetAliasResult (line 48) | interface SetAliasResult extends AliasResult {
type DeleteAliasResult (line 55) | interface DeleteAliasResult extends AliasResult {
type RenameAliasResult (line 60) | interface RenameAliasResult extends AliasResult {
type CleanupResult (line 66) | interface CleanupResult {
type ListAliasesOptions (line 73) | interface ListAliasesOptions {
FILE: scripts/lib/session-aliases.js
function getAliasesPath (line 17) | function getAliasesPath() {
constant ALIAS_VERSION (line 22) | const ALIAS_VERSION = '1.0';
function getDefaultAliases (line 27) | function getDefaultAliases() {
function loadAliases (line 42) | function loadAliases() {
function saveAliases (line 88) | function saveAliases(aliases) {
function resolveAlias (line 158) | function resolveAlias(alias) {
function setAlias (line 188) | function setAlias(alias, sessionPath, title = null) {
function listAliases (line 244) | function listAliases(options = {}) {
function deleteAlias (line 281) | function deleteAlias(alias) {
function renameAlias (line 308) | function renameAlias(oldAlias, newAlias) {
function resolveSessionAlias (line 365) | function resolveSessionAlias(aliasOrId) {
function updateAliasTitle (line 382) | function updateAliasTitle(alias, title) {
function getAliasesForSession (line 412) | function getAliasesForSession(sessionPath) {
function cleanupAliases (line 434) | function cleanupAliases(sessionExists) {
FILE: scripts/lib/session-manager.d.ts
type SessionFilenameMeta (line 7) | interface SessionFilenameMeta {
type SessionMetadata (line 19) | interface SessionMetadata {
type SessionStats (line 31) | interface SessionStats {
type Session (line 41) | interface Session extends SessionFilenameMeta {
type SessionListResult (line 61) | interface SessionListResult {
type GetAllSessionsOptions (line 69) | interface GetAllSessionsOptions {
FILE: scripts/lib/session-manager.js
constant SESSION_FILENAME_REGEX (line 25) | const SESSION_FILENAME_REGEX = /^(\d{4}-\d{2}-\d{2})(?:-([a-zA-Z0-9_][a-...
function parseSessionFilename (line 32) | function parseSessionFilename(filename) {
function getSessionPath (line 65) | function getSessionPath(filename) {
function getSessionContent (line 74) | function getSessionContent(sessionPath) {
function parseSessionMetadata (line 83) | function parseSessionMetadata(content) {
function getSessionStats (line 180) | function getSessionStats(sessionPathOrContent) {
function getAllSessions (line 214) | function getAllSessions(options = {}) {
function getSessionById (line 301) | function getSessionById(sessionId, includeContent = false) {
function getSessionTitle (line 361) | function getSessionTitle(sessionPath) {
function getSessionSize (line 373) | function getSessionSize(sessionPath) {
function writeSessionContent (line 393) | function writeSessionContent(sessionPath, content) {
function appendSessionContent (line 409) | function appendSessionContent(sessionPath, content) {
function deleteSession (line 424) | function deleteSession(sessionPath) {
function sessionExists (line 442) | function sessionExists(sessionPath) {
FILE: scripts/lib/shell-split.js
function splitShellSegments (line 8) | function splitShellSegments(command) {
FILE: scripts/lib/skill-evolution/dashboard.js
constant DAY_IN_MS (line 7) | const DAY_IN_MS = 24 * 60 * 60 * 1000;
constant SPARKLINE_CHARS (line 8) | const SPARKLINE_CHARS = '\u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588';
constant EMPTY_BLOCK (line 9) | const EMPTY_BLOCK = '\u2591';
constant FILL_BLOCK (line 10) | const FILL_BLOCK = '\u2588';
constant DEFAULT_PANEL_WIDTH (line 11) | const DEFAULT_PANEL_WIDTH = 64;
constant VALID_PANELS (line 12) | const VALID_PANELS = new Set(['success-rate', 'failures', 'amendments', ...
function sparkline (line 14) | function sparkline(values) {
function horizontalBar (line 30) | function horizontalBar(value, max, width) {
function panelBox (line 40) | function panelBox(title, lines, width) {
function bucketByDay (line 56) | function bucketByDay(records, nowMs, days) {
function getTrendArrow (line 88) | function getTrendArrow(successRate7d, successRate30d) {
function formatPercent (line 105) | function formatPercent(value) {
function groupRecordsBySkill (line 113) | function groupRecordsBySkill(records) {
function renderSuccessRatePanel (line 125) | function renderSuccessRatePanel(records, skills, options = {}) {
function renderFailureClusterPanel (line 174) | function renderFailureClusterPanel(records, options = {}) {
function renderAmendmentPanel (line 222) | function renderAmendmentPanel(skillsById, options = {}) {
function renderVersionTimelinePanel (line 277) | function renderVersionTimelinePanel(skillsById, options = {}) {
function renderDashboard (line 331) | function renderDashboard(options = {}) {
FILE: scripts/lib/skill-evolution/health.js
constant DAY_IN_MS (line 10) | const DAY_IN_MS = 24 * 60 * 60 * 1000;
constant PENDING_AMENDMENT_STATUSES (line 11) | const PENDING_AMENDMENT_STATUSES = Object.freeze(new Set(['pending', 'pr...
function roundRate (line 13) | function roundRate(value) {
function formatRate (line 21) | function formatRate(value) {
function summarizeHealthReport (line 29) | function summarizeHealthReport(report) {
function listSkillsInRoot (line 41) | function listSkillsInRoot(rootPath) {
function discoverSkills (line 55) | function discoverSkills(options = {}) {
function calculateSuccessRate (line 80) | function calculateSuccessRate(records) {
function filterRecordsWithinDays (line 89) | function filterRecordsWithinDays(records, nowMs, days) {
function getFailureTrend (line 97) | function getFailureTrend(successRate7d, successRate30d, warnThreshold) {
function countPendingAmendments (line 114) | function countPendingAmendments(skillDir) {
function getLastRun (line 130) | function getLastRun(records) {
function collectSkillHealth (line 145) | function collectSkillHealth(options = {}) {
function formatHealthReport (line 213) | function formatHealthReport(report, options = {}) {
FILE: scripts/lib/skill-evolution/provenance.js
constant PROVENANCE_FILE_NAME (line 9) | const PROVENANCE_FILE_NAME = '.provenance.json';
constant SKILL_TYPES (line 10) | const SKILL_TYPES = Object.freeze({
function resolveRepoRoot (line 17) | function resolveRepoRoot(repoRoot) {
function resolveHomeDir (line 25) | function resolveHomeDir(homeDir) {
function normalizeSkillDir (line 29) | function normalizeSkillDir(skillPath) {
function isWithinRoot (line 42) | function isWithinRoot(targetPath, rootPath) {
function getSkillRoots (line 50) | function getSkillRoots(options = {}) {
function classifySkillPath (line 61) | function classifySkillPath(skillPath, options = {}) {
function requiresProvenance (line 80) | function requiresProvenance(skillPath, options = {}) {
function getProvenancePath (line 85) | function getProvenancePath(skillPath) {
function isIsoTimestamp (line 89) | function isIsoTimestamp(value) {
function validateProvenance (line 98) | function validateProvenance(record) {
function assertValidProvenance (line 133) | function assertValidProvenance(record) {
function readProvenance (line 140) | function readProvenance(skillPath, options = {}) {
function writeProvenance (line 158) | function writeProvenance(skillPath, record, options = {}) {
FILE: scripts/lib/skill-evolution/tracker.js
constant VALID_OUTCOMES (line 9) | const VALID_OUTCOMES = new Set(['success', 'failure', 'partial']);
constant VALID_FEEDBACK (line 10) | const VALID_FEEDBACK = new Set(['accepted', 'corrected', 'rejected']);
function resolveHomeDir (line 12) | function resolveHomeDir(homeDir) {
function getRunsFilePath (line 16) | function getRunsFilePath(options = {}) {
function toNullableNumber (line 24) | function toNullableNumber(value, fieldName) {
function normalizeExecutionRecord (line 37) | function normalizeExecutionRecord(input, options = {}) {
function readJsonl (line 86) | function readJsonl(filePath) {
function recordSkillExecution (line 105) | function recordSkillExecution(input, options = {}) {
function readSkillExecutionRecords (line 131) | function readSkillExecutionRecords(options = {}) {
FILE: scripts/lib/skill-evolution/versioning.js
constant VERSION_DIRECTORY_NAME (line 8) | const VERSION_DIRECTORY_NAME = '.versions';
constant EVOLUTION_DIRECTORY_NAME (line 9) | const EVOLUTION_DIRECTORY_NAME = '.evolution';
constant EVOLUTION_LOG_TYPES (line 10) | const EVOLUTION_LOG_TYPES = Object.freeze([
function normalizeSkillDir (line 16) | function normalizeSkillDir(skillPath) {
function getSkillFilePath (line 29) | function getSkillFilePath(skillPath) {
function ensureSkillExists (line 33) | function ensureSkillExists(skillPath) {
function getVersionsDir (line 42) | function getVersionsDir(skillPath) {
function getEvolutionDir (line 46) | function getEvolutionDir(skillPath) {
function getEvolutionLogPath (line 50) | function getEvolutionLogPath(skillPath, logType) {
function ensureSkillVersioning (line 58) | function ensureSkillVersioning(skillPath) {
function parseVersionNumber (line 80) | function parseVersionNumber(fileName) {
function listVersions (line 89) | function listVersions(skillPath) {
function getCurrentVersion (line 115) | function getCurrentVersion(skillPath) {
function appendEvolutionRecord (line 129) | function appendEvolutionRecord(skillPath, logType, record) {
function readJsonl (line 135) | function readJsonl(filePath) {
function getEvolutionLog (line 154) | function getEvolutionLog(skillPath, logType) {
function createVersion (line 158) | function createVersion(skillPath, options = {}) {
function rollbackTo (line 185) | function rollbackTo(skillPath, targetVersion, options = {}) {
FILE: scripts/lib/skill-improvement/amendify.js
constant AMENDMENT_SCHEMA_VERSION (line 5) | const AMENDMENT_SCHEMA_VERSION = 'ecc.skill-amendment-proposal.v1';
function createProposalId (line 7) | function createProposalId(skillId) {
function summarizePatchPreview (line 11) | function summarizePatchPreview(skillId, health) {
function proposeSkillAmendment (line 34) | function proposeSkillAmendment(skillId, records, options = {}) {
FILE: scripts/lib/skill-improvement/evaluate.js
constant EVALUATION_SCHEMA_VERSION (line 3) | const EVALUATION_SCHEMA_VERSION = 'ecc.skill-evaluation.v1';
function roundRate (line 5) | function roundRate(value) {
function summarize (line 9) | function summarize(records) {
function buildSkillEvaluationScaffold (line 21) | function buildSkillEvaluationScaffold(skillId, records, options = {}) {
FILE: scripts/lib/skill-improvement/health.js
constant HEALTH_SCHEMA_VERSION (line 3) | const HEALTH_SCHEMA_VERSION = 'ecc.skill-health.v1';
function roundRate (line 5) | function roundRate(value) {
function rankCounts (line 9) | function rankCounts(values) {
function summarizeVariantRuns (line 15) | function summarizeVariantRuns(records) {
function deriveSkillStatus (line 33) | function deriveSkillStatus(skillSummary, options = {}) {
function buildSkillHealthReport (line 46) | function buildSkillHealthReport(records, options = {}) {
FILE: scripts/lib/skill-improvement/observations.js
constant OBSERVATION_SCHEMA_VERSION (line 7) | const OBSERVATION_SCHEMA_VERSION = 'ecc.skill-observation.v1';
function resolveProjectRoot (line 9) | function resolveProjectRoot(options = {}) {
function getSkillTelemetryRoot (line 13) | function getSkillTelemetryRoot(options = {}) {
function getSkillObservationsPath (line 17) | function getSkillObservationsPath(options = {}) {
function ensureString (line 21) | function ensureString(value, label) {
function createObservationId (line 29) | function createObservationId() {
function createSkillObservation (line 33) | function createSkillObservation(input) {
function appendSkillObservation (line 74) | function appendSkillObservation(observation, options = {}) {
function readSkillObservations (line 81) | function readSkillObservations(options = {}) {
FILE: scripts/lib/state-store/index.js
constant DEFAULT_STATE_STORE_RELATIVE_PATH (line 12) | const DEFAULT_STATE_STORE_RELATIVE_PATH = path.join('.claude', 'ecc', 's...
function resolveStateStorePath (line 14) | function resolveStateStorePath(options = {}) {
function wrapSqlJsDatabase (line 34) | function wrapSqlJsDatabase(rawDb, dbPath) {
function openDatabase (line 141) | async function openDatabase(SQL, dbPath) {
function createStateStore (line 164) | async function createStateStore(options = {}) {
FILE: scripts/lib/state-store/migrations.js
constant INITIAL_SCHEMA_SQL (line 3) | const INITIAL_SCHEMA_SQL = `
constant MIGRATIONS (line 110) | const MIGRATIONS = [
function ensureMigrationTable (line 118) | function ensureMigrationTable(db) {
function getAppliedMigrations (line 128) | function getAppliedMigrations(db) {
function applyMigrations (line 144) | function applyMigrations(db) {
FILE: scripts/lib/state-store/queries.js
constant ACTIVE_SESSION_STATES (line 5) | const ACTIVE_SESSION_STATES = ['active', 'running', 'idle'];
constant SUCCESS_OUTCOMES (line 6) | const SUCCESS_OUTCOMES = new Set(['success', 'succeeded', 'passed']);
constant FAILURE_OUTCOMES (line 7) | const FAILURE_OUTCOMES = new Set(['failure', 'failed', 'error']);
function normalizeLimit (line 9) | function normalizeLimit(value, fallback) {
function parseJsonColumn (line 22) | function parseJsonColumn(value, fallback) {
function stringifyJson (line 30) | function stringifyJson(value, label) {
function mapSessionRow (line 38) | function mapSessionRow(row) {
function mapSkillRunRow (line 53) | function mapSkillRunRow(row) {
function mapSkillVersionRow (line 69) | function mapSkillVersionRow(row) {
function mapDecisionRow (line 80) | function mapDecisionRow(row) {
function mapInstallStateRow (line 93) | function mapInstallStateRow(row) {
function mapGovernanceEventRow (line 112) | function mapGovernanceEventRow(row) {
function classifyOutcome (line 124) | function classifyOutcome(outcome) {
function toPercent (line 137) | function toPercent(numerator, denominator) {
function summarizeSkillRuns (line 145) | function summarizeSkillRuns(skillRuns) {
function summarizeInstallHealth (line 174) | function summarizeInstallHealth(installations) {
function normalizeSessionInput (line 205) | function normalizeSessionInput(session) {
function normalizeSkillRunInput (line 218) | function normalizeSkillRunInput(skillRun) {
function normalizeSkillVersionInput (line 234) | function normalizeSkillVersionInput(skillVersion) {
function normalizeDecisionInput (line 245) | function normalizeDecisionInput(decision) {
function normalizeInstallStateInput (line 260) | function normalizeInstallStateInput(installState) {
function normalizeGovernanceEventInput (line 276) | function normalizeGovernanceEventInput(governanceEvent) {
function createQueryApi (line 288) | function createQueryApi(db) {
FILE: scripts/lib/state-store/schema.js
constant SCHEMA_PATH (line 7) | const SCHEMA_PATH = path.join(__dirname, '..', '..', '..', 'schemas', 's...
constant ENTITY_DEFINITIONS (line 9) | const ENTITY_DEFINITIONS = {
function readSchema (line 22) | function readSchema() {
function getAjv (line 31) | function getAjv() {
function getEntityValidator (line 43) | function getEntityValidator(entityName) {
function formatValidationErrors (line 65) | function formatValidationErrors(errors = []) {
function validateEntity (line 71) | function validateEntity(entityName, payload) {
function assertValidEntity (line 80) | function assertValidEntity(entityName, payload, label) {
FILE: scripts/lib/tmux-worktree-orchestrator.js
function slugify (line 7) | function slugify(value, fallback = 'worker') {
function renderTemplate (line 16) | function renderTemplate(template, variables) {
function shellQuote (line 29) | function shellQuote(value) {
function formatCommand (line 33) | function formatCommand(program, args) {
function buildTemplateVariables (line 37) | function buildTemplateVariables(values) {
function buildSessionBannerCommand (line 49) | function buildSessionBannerCommand(sessionName, coordinationDir) {
function normalizeSeedPaths (line 53) | function normalizeSeedPaths(seedPaths, repoRoot) {
function overlaySeedPaths (line 86) | function overlaySeedPaths({ repoRoot, seedPaths, worktreePath }) {
function buildWorkerArtifacts (line 108) | function buildWorkerArtifacts(workerPlan) {
function buildOrchestrationPlan (line 175) | function buildOrchestrationPlan(config = {}) {
function materializePlan (line 314) | function materializePlan(plan) {
function runCommand (line 324) | function runCommand(program, args, options = {}) {
function commandSucceeds (line 341) | function commandSucceeds(program, args, options = {}) {
function canonicalizePath (line 350) | function canonicalizePath(targetPath) {
function branchExists (line 366) | function branchExists(repoRoot, branchName) {
function listWorktrees (line 372) | function listWorktrees(repoRoot) {
function cleanupExisting (line 390) | function cleanupExisting(plan) {
function rollbackCreatedResources (line 426) | function rollbackCreatedResources(plan, createdState, runtime = {}) {
function executePlan (line 482) | function executePlan(plan, runtime = {}) {
FILE: scripts/lib/utils.d.ts
type FileMatch (line 64) | interface FileMatch {
type FindFilesOptions (line 71) | interface FindFilesOptions {
type ReplaceInFileOptions (line 96) | interface ReplaceInFileOptions {
type GrepMatch (line 116) | interface GrepMatch {
type ReadStdinJsonOptions (line 128) | interface ReadStdinJsonOptions {
type CommandResult (line 163) | interface CommandResult {
FILE: scripts/lib/utils.js
function getHomeDir (line 19) | function getHomeDir() {
function getClaudeDir (line 26) | function getClaudeDir() {
function getSessionsDir (line 33) | function getSessionsDir() {
function getLearnedSkillsDir (line 40) | function getLearnedSkillsDir() {
function getTempDir (line 47) | function getTempDir() {
function ensureDir (line 57) | function ensureDir(dirPath) {
function getDateString (line 74) | function getDateString() {
function getTimeString (line 85) | function getTimeString() {
function getGitRepoName (line 95) | function getGitRepoName() {
function getProjectName (line 104) | function getProjectName() {
function getSessionIdShort (line 114) | function getSessionIdShort(fallback = 'default') {
function getDateTimeString (line 125) | function getDateTimeString() {
function findFiles (line 142) | function findFiles(dir, pattern, options = {}) {
function readStdinJson (line 208) | async function readStdinJson(options = {}) {
function log (line 265) | function log(message) {
function output (line 272) | function output(data) {
function readFile (line 283) | function readFile(filePath) {
function writeFile (line 294) | function writeFile(filePath, content) {
function appendFile (line 302) | function appendFile(filePath, content) {
function commandExists (line 311) | function commandExists(cmd) {
function runCommand (line 341) | function runCommand(cmd, options = {}) {
function isGitRepo (line 371) | function isGitRepo() {
function getGitModifiedFiles (line 381) | function getGitModifiedFiles(patterns = []) {
function replaceInFile (line 419) | function replaceInFile(filePath, search, replace, options = {}) {
function countInFile (line 446) | function countInFile(filePath, pattern) {
function grepFile (line 470) | function grepFile(filePath, pattern) {
FILE: scripts/list-installed.js
function showHelp (line 6) | function showHelp(exitCode = 0) {
function parseArgs (line 15) | function parseArgs(argv) {
function printHuman (line 41) | function printHuman(records) {
function main (line 65) | function main() {
FILE: scripts/orchestrate-worktrees.js
function usage (line 13) | function usage() {
function parseArgs (line 27) | function parseArgs(argv) {
function loadPlanConfig (line 37) | function loadPlanConfig(planPath) {
function printDryRun (line 45) | function printDryRun(plan, absolutePath) {
function main (line 69) | function main() {
FILE: scripts/orchestration-status.js
function usage (line 9) | function usage() {
function parseArgs (line 21) | function parseArgs(argv) {
function main (line 30) | function main() {
FILE: scripts/repair.js
function showHelp (line 6) | function showHelp(exitCode = 0) {
function parseArgs (line 15) | function parseArgs(argv) {
function printHuman (line 44) | function printHuman(result) {
function main (line 68) | function main() {
FILE: scripts/session-inspect.js
function usage (line 13) | function usage() {
function parseArgs (line 40) | function parseArgs(argv) {
function inspectSkillLoopTarget (line 66) | function inspectSkillLoopTarget(target, options = {}) {
function main (line 100) | function main() {
FILE: scripts/sessions-cli.js
function showHelp (line 6) | function showHelp(exitCode = 0) {
function parseArgs (line 16) | function parseArgs(argv) {
function printSessionList (line 49) | function printSessionList(payload) {
function printWorkers (line 68) | function printWorkers(workers) {
function printSkillRuns (line 82) | function printSkillRuns(skillRuns) {
function printDecisions (line 96) | function printDecisions(decisions) {
function printSessionDetail (line 110) | function printSessionDetail(payload) {
function main (line 126) | async function main() {
FILE: scripts/setup-package-manager.js
function showHelp (line 25) | function showHelp() {
function detectAndShow (line 60) | function detectAndShow() {
function listAvailable (line 95) | function listAvailable() {
function setGlobal (line 115) | function setGlobal(pmName) {
function setProject (line 138) | function setProject(pmName) {
FILE: scripts/skill-create-output.js
constant BOX (line 24) | const BOX = {
constant SPINNER (line 36) | const SPINNER = ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];
function box (line 39) | function box(title, content, width = 60) {
function stripAnsi (line 50) | function stripAnsi(str) {
function progressBar (line 55) | function progressBar(percent, width = 30) {
function sleep (line 62) | function sleep(ms) {
function animateProgress (line 66) | async function animateProgress(label, steps, callback) {
class SkillCreateOutput (line 81) | class SkillCreateOutput {
method constructor (line 82) | constructor(repoName, options = {}) {
method header (line 88) | header() {
method analyzePhase (line 99) | async analyzePhase(data) {
method analysisResults (line 112) | analysisResults(data) {
method patterns (line 122) | patterns(patterns) {
method instincts (line 138) | instincts(instincts) {
method output (line 145) | output(skillPath, instinctsPath) {
method nextSteps (line 158) | nextSteps() {
method footer (line 168) | footer() {
function demo (line 177) | async function demo() {
FILE: scripts/skills-health.js
function showHelp (line 7) | function showHelp() {
function requireValue (line 26) | function requireValue(argv, index, argName) {
function parseArgs (line 35) | function parseArgs(argv) {
function main (line 110) | function main() {
FILE: scripts/status.js
function showHelp (line 6) | function showHelp(exitCode = 0) {
function parseArgs (line 16) | function parseArgs(argv) {
function printActiveSessions (line 46) | function printActiveSessions(section) {
function printSkillRuns (line 61) | function printSkillRuns(section) {
function printInstallHealth (line 84) | function printInstallHealth(section) {
function printGovernance (line 105) | function printGovernance(section) {
function printHuman (line 119) | function printHuman(payload) {
function main (line 131) | async function main() {
FILE: scripts/uninstall.js
function showHelp (line 6) | function showHelp(exitCode = 0) {
function parseArgs (line 15) | function parseArgs(argv) {
function printHuman (line 44) | function printHuman(result) {
function main (line 68) | function main() {
FILE: skills/continuous-learning-v2/scripts/instinct-cli.py
function _ensure_global_dirs (line 51) | def _ensure_global_dirs():
function _validate_file_path (line 62) | def _validate_file_path(path_str: str, must_exist: bool = False) -> Path:
function _validate_instinct_id (line 89) | def _validate_instinct_id(instinct_id: str) -> bool:
function detect_project (line 106) | def detect_project() -> dict:
function _update_registry (line 186) | def _update_registry(pid: str, pname: str, proot: str, premote: str) -> ...
function load_registry (line 210) | def load_registry() -> dict:
function parse_instinct_file (line 223) | def parse_instinct_file(content: str) -> list[dict]:
function _load_instincts_from_dir (line 264) | def _load_instincts_from_dir(directory: Path, source_type: str, scope_la...
function load_all_instincts (line 290) | def load_all_instincts(project: dict, include_global: bool = True) -> li...
function load_project_only_instincts (line 325) | def load_project_only_instincts(project: dict) -> list[dict]:
function cmd_status (line 341) | def cmd_status(args) -> int:
function _print_instincts_by_domain (line 392) | def _print_instincts_by_domain(instincts: list[dict]) -> None:
function cmd_import (line 427) | def cmd_import(args) -> int:
function cmd_export (line 577) | def cmd_export(args) -> int:
function cmd_evolve (line 646) | def cmd_evolve(args) -> int:
function _find_cross_project_instincts (line 762) | def _find_cross_project_instincts() -> dict:
function _show_promotion_candidates (line 785) | def _show_promotion_candidates(project: dict) -> None:
function cmd_promote (line 821) | def cmd_promote(args) -> int:
function _promote_specific (line 833) | def _promote_specific(project: dict, instinct_id: str, force: bool) -> int:
function _promote_auto (line 884) | def _promote_auto(project: dict, force: bool, dry_run: bool) -> int:
function cmd_projects (line 962) | def cmd_projects(args) -> int:
function _generate_evolved (line 1012) | def _generate_evolved(skill_candidates: list, workflow_instincts: list, ...
function main (line 1090) | def main() -> int:
FILE: skills/continuous-learning-v2/scripts/test_parse_instinct.py
function project_tree (line 85) | def project_tree(tmp_path):
function patch_globals (line 112) | def patch_globals(project_tree, monkeypatch):
function _make_project (line 124) | def _make_project(tree, pid="abc123", pname="test-project"):
function test_multiple_instincts_preserve_content (line 179) | def test_multiple_instincts_preserve_content():
function test_single_instinct_preserves_content (line 187) | def test_single_instinct_preserves_content():
function test_empty_content_no_error (line 208) | def test_empty_content_no_error():
function test_parse_no_id_skipped (line 222) | def test_parse_no_id_skipped():
function test_parse_confidence_is_float (line 236) | def test_parse_confidence_is_float():
function test_parse_trigger_strips_quotes (line 252) | def test_parse_trigger_strips_quotes():
function test_parse_empty_string (line 267) | def test_parse_empty_string():
function test_parse_garbage_input (line 272) | def test_parse_garbage_input():
function test_validate_normal_path (line 281) | def test_validate_normal_path(tmp_path):
function test_validate_rejects_etc (line 288) | def test_validate_rejects_etc():
function test_validate_rejects_var_log (line 293) | def test_validate_rejects_var_log():
function test_validate_rejects_usr (line 298) | def test_validate_rejects_usr():
function test_validate_rejects_proc (line 303) | def test_validate_rejects_proc():
function test_validate_must_exist_fails (line 308) | def test_validate_must_exist_fails(tmp_path):
function test_validate_home_expansion (line 313) | def test_validate_home_expansion(tmp_path):
function test_validate_relative_path (line 319) | def test_validate_relative_path(tmp_path, monkeypatch):
function test_detect_project_global_fallback (line 332) | def test_detect_project_global_fallback(patch_globals, monkeypatch):
function test_detect_project_from_env (line 347) | def test_detect_project_from_env(patch_globals, monkeypatch, tmp_path):
function test_detect_project_git_timeout (line 368) | def test_detect_project_git_timeout(patch_globals, monkeypatch):
function test_detect_project_creates_directories (line 382) | def test_detect_project_creates_directories(patch_globals, monkeypatch, ...
function test_load_from_empty_dir (line 407) | def test_load_from_empty_dir(tmp_path):
function test_load_from_nonexistent_dir (line 412) | def test_load_from_nonexistent_dir(tmp_path):
function test_load_annotates_metadata (line 417) | def test_load_annotates_metadata(tmp_path):
function test_load_defaults_scope_from_label (line 429) | def test_load_defaults_scope_from_label(tmp_path):
function test_load_preserves_explicit_scope (line 446) | def test_load_preserves_explicit_scope(tmp_path):
function test_load_handles_corrupt_file (line 457) | def test_load_handles_corrupt_file(tmp_path, capsys):
function test_load_supports_yml_extension (line 469) | def test_load_supports_yml_extension(tmp_path):
function test_load_supports_md_extension (line 478) | def test_load_supports_md_extension(tmp_path):
function test_load_instincts_from_dir_uses_utf8_encoding (line 487) | def test_load_instincts_from_dir_uses_utf8_encoding(tmp_path, monkeypatch):
function test_load_all_project_and_global (line 506) | def test_load_all_project_and_global(patch_globals):
function test_load_all_project_overrides_global (line 522) | def test_load_all_project_overrides_global(patch_globals):
function test_load_all_global_only (line 543) | def test_load_all_global_only(patch_globals):
function test_load_project_only_excludes_global (line 564) | def test_load_project_only_excludes_global(patch_globals):
function test_load_project_only_global_fallback_loads_global (line 578) | def test_load_project_only_global_fallback_loads_global(patch_globals):
function test_load_all_empty (line 599) | def test_load_all_empty(patch_globals):
function test_cmd_status_no_instincts (line 612) | def test_cmd_status_no_instincts(patch_globals, monkeypatch, capsys):
function test_cmd_status_with_instincts (line 625) | def test_cmd_status_with_instincts(patch_globals, monkeypatch, capsys):
function test_cmd_status_returns_int (line 645) | def test_cmd_status_returns_int(patch_globals, monkeypatch):
function test_cmd_projects_empty_registry (line 660) | def test_cmd_projects_empty_registry(patch_globals, capsys):
function test_cmd_projects_with_registry (line 669) | def test_cmd_projects_with_registry(patch_globals, capsys):
function test_promote_specific_not_found (line 702) | def test_promote_specific_not_found(patch_globals, capsys):
function test_promote_specific_rejects_invalid_id (line 713) | def test_promote_specific_rejects_invalid_id(patch_globals, capsys):
function test_promote_specific_already_global (line 724) | def test_promote_specific_already_global(patch_globals, capsys):
function test_promote_specific_success (line 740) | def test_promote_specific_success(patch_globals, capsys):
function test_promote_auto_no_candidates (line 764) | def test_promote_auto_no_candidates(patch_globals, capsys):
function test_promote_auto_dry_run (line 778) | def test_promote_auto_dry_run(patch_globals, capsys):
function test_promote_auto_writes_file (line 819) | def test_promote_auto_writes_file(patch_globals, capsys):
function test_promote_auto_skips_invalid_id (line 857) | def test_promote_auto_skips_invalid_id(patch_globals, capsys):
function test_find_cross_project_empty_registry (line 895) | def test_find_cross_project_empty_registry(patch_globals):
function test_find_cross_project_single_project (line 902) | def test_find_cross_project_single_project(patch_globals):
function test_find_cross_project_shared_instinct (line 915) | def test_find_cross_project_shared_instinct(patch_globals):
function test_load_registry_missing_file (line 939) | def test_load_registry_missing_file(patch_globals):
function test_load_registry_corrupt_json (line 944) | def test_load_registry_corrupt_json(patch_globals):
function test_load_registry_valid (line 951) | def test_load_registry_valid(patch_globals):
function test_load_registry_uses_utf8_encoding (line 959) | def test_load_registry_uses_utf8_encoding(monkeypatch):
function test_validate_instinct_id (line 971) | def test_validate_instinct_id():
function test_update_registry_atomic_replaces_file (line 978) | def test_update_registry_atomic_replaces_file(patch_globals):
FILE: skills/videodb/scripts/ws_listener.py
function default_output_dir (line 60) | def default_output_dir() -> Path:
function ensure_private_dir (line 68) | def ensure_private_dir(path: Path) -> Path:
function parse_args (line 78) | def parse_args() -> tuple[bool, Path]:
function log (line 108) | def log(msg: str):
function append_event (line 113) | def append_event(event: dict):
function write_pid (line 122) | def write_pid():
function cleanup_pid (line 128) | def cleanup_pid():
function is_fatal_error (line 136) | def is_fatal_error(exc: Exception) -> bool:
function listen_with_retry (line 147) | async def listen_with_retry():
function main_async (line 232) | async def main_async():
function main (line 273) | def main():
FILE: tests/ci/validators.test.js
function test (line 23) | function test(name, fn) {
function createTestDir (line 35) | function createTestDir() {
function cleanupTestDir (line 39) | function cleanupTestDir(testDir) {
function writeJson (line 43) | function writeJson(filePath, value) {
function writeInstallComponentsManifest (line 48) | function writeInstallComponentsManifest(testDir, components) {
function runValidatorWithDir (line 64) | function runValidatorWithDir(validatorName, dirConstant, overridePath) {
function runValidatorWithDirs (line 98) | function runValidatorWithDirs(validatorName, overrides) {
function runValidator (line 125) | function runValidator(validatorName) {
function runCatalogValidator (line 143) | function runCatalogValidator(overrides = {}) {
function writeCatalogFixture (line 177) | function writeCatalogFixture(testDir, options = {}) {
function runTests (line 205) | function runTests() {
FILE: tests/codex-config.test.js
function test (line 11) | function test(name, fn) {
FILE: tests/hooks/auto-tmux-dev.test.js
function test (line 15) | function test(name, fn) {
function runScript (line 27) | function runScript(input) {
function runTests (line 40) | function runTests() {
FILE: tests/hooks/check-hook-enabled.test.js
function test (line 15) | function test(name, fn) {
function runScript (line 27) | function runScript(args = [], envOverrides = {}) {
function runTests (line 45) | function runTests() {
FILE: tests/hooks/cost-tracker.test.js
function test (line 15) | function test(name, fn) {
function makeTempDir (line 27) | function makeTempDir() {
function runScript (line 31) | function runScript(input, envOverrides = {}) {
function runTests (line 42) | function runTests() {
FILE: tests/hooks/doc-file-warning.test.js
function test (line 10) | function test(name, fn) {
function runScript (line 22) | function runScript(input) {
function runTests (line 31) | function runTests() {
FILE: tests/hooks/evaluate-session.test.js
function test (line 19) | function test(name, fn) {
function createTestDir (line 31) | function createTestDir() {
function cleanupTestDir (line 35) | function cleanupTestDir(testDir) {
function createTranscript (line 43) | function createTranscript(dir, messageCount) {
function runEvaluate (line 60) | function runEvaluate(stdinJson) {
function runTests (line 73) | function runTests() {
FILE: tests/hooks/hook-flags.test.js
function test (line 20) | function test(name, fn) {
function withEnv (line 33) | function withEnv(vars, fn) {
function runTests (line 57) | function runTests() {
FILE: tests/hooks/hooks.test.js
function toBashPath (line 13) | function toBashPath(filePath) {
function sleepMs (line 23) | function sleepMs(ms) {
function test (line 28) | function test(name, fn) {
function asyncTest (line 41) | async function asyncTest(name, fn) {
function runScript (line 54) | function runScript(scriptPath, input = '', env = {}) {
function runShellScript (line 80) | function runShellScript(scriptPath, args = [], input = '', env = {}, cwd...
function createTestDir (line 104) | function createTestDir() {
function cleanupTestDir (line 109) | function cleanupTestDir(testDir) {
function createCommandShim (line 125) | function createCommandShim(binDir, baseName, logFile) {
function readCommandLog (line 148) | function readCommandLog(logFile) {
function withPrependedPath (line 164) | function withPrependedPath(binDir, env = {}) {
function assertNoProjectDetectionSideEffects (line 176) | function assertNoProjectDetectionSideEffects(homeDir, testName) {
function assertObserveSkipBeforeProjectDetection (line 189) | async function assertObserveSkipBeforeProjectDetection(testCase) {
function runPatchedRunAll (line 221) | function runPatchedRunAll(tempRoot) {
function runTests (line 242) | async function runTests() {
FILE: tests/hooks/observer-memory.test.js
function test (line 21) | function test(name, fn) {
function createTempDir (line 33) | function createTempDir() {
function cleanupDir (line 37) | function cleanupDir(dir) {
FILE: tests/hooks/post-bash-hooks.test.js
function test (line 14) | function test(name, fn) {
function runScript (line 26) | function runScript(scriptPath, input) {
FILE: tests/hooks/pre-bash-dev-server-block.test.js
function test (line 13) | function test(name, fn) {
function runScript (line 25) | function runScript(command) {
function runTests (line 35) | function runTests() {
FILE: tests/hooks/pre-bash-reminders.test.js
function test (line 14) | function test(name, fn) {
function runScript (line 26) | function runScript(scriptPath, command, envOverrides = {}) {
function runTests (line 38) | function runTests() {
FILE: tests/hooks/quality-gate.test.js
function test (line 14) | function test(name, fn) {
FILE: tests/hooks/suggest-compact.test.js
function test (line 19) | function test(name, fn) {
function runCompact (line 35) | function runCompact(envOverrides = {}) {
function getCounterFilePath (line 53) | function getCounterFilePath(sessionId) {
function runTests (line 57) | function runTests() {
FILE: tests/integration/hooks.test.js
constant REPO_ROOT (line 14) | const REPO_ROOT = path.join(__dirname, '..', '..');
function _test (line 17) | function _test(name, fn) {
function asyncTest (line 30) | async function asyncTest(name, fn) {
function runHookWithInput (line 49) | function runHookWithInput(scriptPath, input = {}, env = {}, timeoutMs = ...
function runHookCommand (line 100) | function runHookCommand(command, input = {}, env = {}, timeoutMs = 10000) {
function createTestDir (line 165) | function createTestDir() {
function cleanupTestDir (line 170) | function cleanupTestDir(testDir) {
function runTests (line 175) | async function runTests() {
FILE: tests/lib/install-config.test.js
function test (line 15) | function test(name, fn) {
function createTempDir (line 27) | function createTempDir(prefix) {
function cleanup (line 31) | function cleanup(dirPath) {
function writeJson (line 35) | function writeJson(filePath, value) {
function runTests (line 40) | function runTests() {
FILE: tests/lib/install-lifecycle.test.js
constant REPO_ROOT (line 21) | const REPO_ROOT = path.join(__dirname, '..', '..');
constant CURRENT_PACKAGE_VERSION (line 22) | const CURRENT_PACKAGE_VERSION = JSON.parse(
constant CURRENT_MANIFEST_VERSION (line 25) | const CURRENT_MANIFEST_VERSION = JSON.parse(
function test (line 29) | function test(name, fn) {
function createTempDir (line 41) | function createTempDir(prefix) {
function cleanup (line 45) | function cleanup(dirPath) {
function writeState (line 49) | function writeState(filePath, options) {
function runTests (line 55) | function runTests() {
FILE: tests/lib/install-manifests.test.js
function test (line 21) | function test(name, fn) {
function createTestRepo (line 33) | function createTestRepo() {
function cleanupTestRepo (line 39) | function cleanupTestRepo(root) {
function writeJson (line 43) | function writeJson(filePath, value) {
function runTests (line 48) | function runTests() {
FILE: tests/lib/install-request.test.js
function test (line 12) | function test(name, fn) {
function runTests (line 24) | function runTests() {
FILE: tests/lib/install-state.test.js
function test (line 16) | function test(name, fn) {
function createTestDir (line 28) | function createTestDir() {
function cleanupTestDir (line 32) | function cleanupTestDir(dirPath) {
function runTests (line 36) | function runTests() {
FILE: tests/lib/install-targets.test.js
function normalizedRelativePath (line 14) | function normalizedRelativePath(value) {
function test (line 18) | function test(name, fn) {
function runTests (line 30) | function runTests() {
FILE: tests/lib/orchestration-session.test.js
function test (line 23) | function test(desc, fn) {
FILE: tests/lib/package-manager.test.js
function test (line 16) | function test(name, fn) {
function createTestDir (line 29) | function createTestDir() {
function cleanupTestDir (line 36) | function cleanupTestDir(testDir) {
function runTests (line 41) | function runTests() {
FILE: tests/lib/project-detect.test.js
function test (line 25) | function test(name, fn) {
function createTempDir (line 38) | function createTempDir() {
function cleanupDir (line 43) | function cleanupDir(dir) {
function writeTestFile (line 50) | function writeTestFile(dir, filePath, content = '') {
function runTests (line 57) | function runTests() {
FILE: tests/lib/resolve-formatter.test.js
function test (line 21) | function test(name, fn) {
function makeTmpDir (line 41) | function makeTmpDir() {
function cleanupTmpDirs (line 50) | function cleanupTmpDirs() {
function runTests (line 61) | function runTests() {
FILE: tests/lib/session-adapters.test.js
function test (line 24) | function test(name, fn) {
function withHome (line 35) | function withHome(homeDir, fn) {
method persistCanonicalSessionSnapshot (line 459) | persistCanonicalSessionSnapshot(snapshot, metadata) {
method loadStateStoreImpl (line 553) | loadStateStoreImpl() {
FILE: tests/lib/session-aliases.test.js
function test (line 27) | function test(name, fn) {
function resetAliases (line 39) | function resetAliases() {
function runTests (line 50) | function runTests() {
FILE: tests/lib/session-manager.test.js
function test (line 15) | function test(name, fn) {
function createTempSessionDir (line 28) | function createTempSessionDir() {
function cleanup (line 34) | function cleanup(dir) {
function runTests (line 42) | function runTests() {
FILE: tests/lib/shell-split.test.js
function test (line 10) | function test(desc, fn) {
FILE: tests/lib/skill-dashboard.test.js
constant HEALTH_SCRIPT (line 17) | const HEALTH_SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'skill...
function test (line 19) | function test(name, fn) {
function createTempDir (line 31) | function createTempDir(prefix) {
function cleanupTempDir (line 35) | function cleanupTempDir(dirPath) {
function createSkill (line 39) | function createSkill(skillRoot, name, content) {
function appendJsonl (line 46) | function appendJsonl(filePath, rows) {
function runCli (line 52) | function runCli(args) {
function runTests (line 58) | function runTests() {
FILE: tests/lib/skill-evolution.test.js
constant HEALTH_SCRIPT (line 19) | const HEALTH_SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'skill...
function test (line 21) | function test(name, fn) {
function createTempDir (line 33) | function createTempDir(prefix) {
function cleanupTempDir (line 37) | function cleanupTempDir(dirPath) {
function createSkill (line 41) | function createSkill(skillRoot, name, content) {
function appendJsonl (line 48) | function appendJsonl(filePath, rows) {
function readJson (line 54) | function readJson(filePath) {
function runCli (line 58) | function runCli(args, options = {}) {
function runTests (line 68) | function runTests() {
FILE: tests/lib/skill-improvement.test.js
function test (line 23) | function test(name, fn) {
function makeProjectRoot (line 34) | function makeProjectRoot(prefix) {
function cleanup (line 38) | function cleanup(dirPath) {
FILE: tests/lib/state-store.test.js
constant ECC_SCRIPT (line 16) | const ECC_SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'ecc.js');
constant STATUS_SCRIPT (line 17) | const STATUS_SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'statu...
constant SESSIONS_SCRIPT (line 18) | const SESSIONS_SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'ses...
function test (line 20) | async function test(name, fn) {
function createTempDir (line 32) | function createTempDir(prefix) {
function cleanupTempDir (line 36) | function cleanupTempDir(dirPath) {
function runNode (line 40) | function runNode(scriptPath, args = [], options = {}) {
function parseJson (line 51) | function parseJson(stdout) {
function seedStore (line 55) | async function seedStore(dbPath) {
function runTests (line 255) | async function runTests() {
FILE: tests/lib/tmux-worktree-orchestrator.test.js
function test (line 23) | function test(desc, fn) {
method spawnSync (line 313) | spawnSync(program, args) {
method runCommand (line 320) | runCommand(program, args) {
method materializePlan (line 333) | materializePlan(receivedPlan) {
method overlaySeedPaths (line 336) | overlaySeedPaths() {
method rollbackCreatedResources (line 339) | rollbackCreatedResources(receivedPlan, createdState) {
method spawnSync (line 384) | spawnSync(program, args) {
method runCommand (line 390) | runCommand(program, args) {
method materializePlan (line 402) | materializePlan() {}
method rollbackCreatedResources (line 403) | rollbackCreatedResources(receivedPlan, createdState) {
FILE: tests/lib/utils.test.js
function test (line 15) | function test(name, fn) {
function runTests (line 28) | function runTests() {
FILE: tests/opencode-config.test.js
function test (line 11) | function test(name, fn) {
function walk (line 47) | function walk(value) {
FILE: tests/run-all.js
constant TEST_GLOB (line 14) | const TEST_GLOB = 'tests/**/*.test.js';
function matchesTestGlob (line 16) | function matchesTestGlob(relativePath) {
function walkFiles (line 25) | function walkFiles(dir, acc = []) {
function discoverTestFiles (line 38) | function discoverTestFiles() {
constant BOX_W (line 48) | const BOX_W = 58;
FILE: tests/scripts/claw.test.js
function test (line 33) | function test(name, fn) {
function makeTmpDir (line 46) | function makeTmpDir() {
function runTests (line 50) | function runTests() {
FILE: tests/scripts/doctor.test.js
constant SCRIPT (line 11) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'doctor.js');
constant REPO_ROOT (line 12) | const REPO_ROOT = path.join(__dirname, '..', '..');
constant CURRENT_PACKAGE_VERSION (line 13) | const CURRENT_PACKAGE_VERSION = JSON.parse(
constant CURRENT_MANIFEST_VERSION (line 16) | const CURRENT_MANIFEST_VERSION = JSON.parse(
function createTempDir (line 24) | function createTempDir(prefix) {
function cleanup (line 28) | function cleanup(dirPath) {
function writeState (line 32) | function writeState(filePath, options) {
function run (line 37) | function run(args = [], options = {}) {
function test (line 62) | function test(name, fn) {
function runTests (line 74) | function runTests() {
FILE: tests/scripts/ecc.test.js
constant SCRIPT (line 11) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'ecc.js');
function runCli (line 13) | function runCli(args, options = {}) {
function createTempDir (line 37) | function createTempDir(prefix) {
function parseJson (line 41) | function parseJson(stdout) {
function runTest (line 45) | function runTest(name, fn) {
function main (line 57) | function main() {
FILE: tests/scripts/harness-audit.test.js
constant SCRIPT (line 9) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'harness-audi...
function run (line 11) | function run(args = []) {
function test (line 22) | function test(name, fn) {
function runTests (line 34) | function runTests() {
FILE: tests/scripts/install-apply.test.js
constant SCRIPT (line 11) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'install-appl...
function createTempDir (line 13) | function createTempDir(prefix) {
function cleanup (line 17) | function cleanup(dirPath) {
function readJson (line 21) | function readJson(filePath) {
function run (line 25) | function run(args = [], options = {}) {
function test (line 51) | function test(name, fn) {
function runTests (line 63) | function runTests() {
FILE: tests/scripts/install-plan.test.js
constant SCRIPT (line 9) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'install-plan...
function run (line 11) | function run(args = []) {
function test (line 28) | function test(name, fn) {
function runTests (line 40) | function runTests() {
FILE: tests/scripts/install-ps1.test.js
constant SCRIPT (line 11) | const SCRIPT = path.join(__dirname, '..', '..', 'install.ps1');
constant PACKAGE_JSON (line 12) | const PACKAGE_JSON = path.join(__dirname, '..', '..', 'package.json');
function createTempDir (line 14) | function createTempDir(prefix) {
function cleanup (line 18) | function cleanup(dirPath) {
function resolvePowerShellCommand (line 22) | function resolvePowerShellCommand() {
function run (line 42) | function run(powerShellCommand, args = [], options = {}) {
function test (line 68) | function test(name, fn) {
function runTests (line 80) | function runTests() {
FILE: tests/scripts/install-sh.test.js
constant SCRIPT (line 11) | const SCRIPT = path.join(__dirname, '..', '..', 'install.sh');
function createTempDir (line 13) | function createTempDir(prefix) {
function cleanup (line 17) | function cleanup(dirPath) {
function run (line 21) | function run(args = [], options = {}) {
function test (line 46) | function test(name, fn) {
function runTests (line 58) | function runTests() {
FILE: tests/scripts/list-installed.test.js
constant SCRIPT (line 11) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'list-install...
constant REPO_ROOT (line 12) | const REPO_ROOT = path.join(__dirname, '..', '..');
constant CURRENT_PACKAGE_VERSION (line 13) | const CURRENT_PACKAGE_VERSION = JSON.parse(
constant CURRENT_MANIFEST_VERSION (line 16) | const CURRENT_MANIFEST_VERSION = JSON.parse(
function createTempDir (line 24) | function createTempDir(prefix) {
function cleanup (line 28) | function cleanup(dirPath) {
function writeState (line 32) | function writeState(filePath, options) {
function run (line 37) | function run(args = [], options = {}) {
function test (line 62) | function test(name, fn) {
function runTests (line 74) | function runTests() {
FILE: tests/scripts/orchestrate-codex-worker.test.js
constant SCRIPT (line 9) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'orchestrate-...
function test (line 16) | function test(desc, fn) {
FILE: tests/scripts/orchestration-status.test.js
constant SCRIPT (line 11) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'orchestratio...
function run (line 13) | function run(args = [], options = {}) {
function test (line 31) | function test(name, fn) {
function runTests (line 43) | function runTests() {
FILE: tests/scripts/repair.test.js
constant INSTALL_SCRIPT (line 11) | const INSTALL_SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'inst...
constant DOCTOR_SCRIPT (line 12) | const DOCTOR_SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'docto...
constant REPAIR_SCRIPT (line 13) | const REPAIR_SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'repai...
constant REPO_ROOT (line 14) | const REPO_ROOT = path.join(__dirname, '..', '..');
constant CURRENT_PACKAGE_VERSION (line 15) | const CURRENT_PACKAGE_VERSION = JSON.parse(
constant CURRENT_MANIFEST_VERSION (line 18) | const CURRENT_MANIFEST_VERSION = JSON.parse(
function createTempDir (line 26) | function createTempDir(prefix) {
function cleanup (line 30) | function cleanup(dirPath) {
function writeState (line 34) | function writeState(filePath, options) {
function runNode (line 40) | function runNode(scriptPath, args = [], options = {}) {
function test (line 65) | function test(name, fn) {
function runTests (line 77) | function runTests() {
FILE: tests/scripts/session-inspect.test.js
constant SCRIPT (line 13) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'session-insp...
function run (line 15) | function run(args = [], options = {}) {
function test (line 49) | function test(name, fn) {
function runTests (line 61) | function runTests() {
FILE: tests/scripts/setup-package-manager.test.js
constant SCRIPT (line 15) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'setup-packag...
function run (line 18) | function run(args = [], env = {}) {
function test (line 37) | function test(name, fn) {
function runTests (line 49) | function runTests() {
FILE: tests/scripts/skill-create-output.test.js
function test (line 19) | function test(name, fn) {
function stripAnsi (line 32) | function stripAnsi(str) {
function captureLog (line 38) | function captureLog(fn) {
function runTests (line 50) | function runTests() {
FILE: tests/scripts/uninstall.test.js
constant INSTALL_SCRIPT (line 11) | const INSTALL_SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'inst...
constant SCRIPT (line 12) | const SCRIPT = path.join(__dirname, '..', '..', 'scripts', 'uninstall.js');
constant REPO_ROOT (line 13) | const REPO_ROOT = path.join(__dirname, '..', '..');
constant CURRENT_PACKAGE_VERSION (line 14) | const CURRENT_PACKAGE_VERSION = JSON.parse(
constant CURRENT_MANIFEST_VERSION (line 17) | const CURRENT_MANIFEST_VERSION = JSON.parse(
function createTempDir (line 25) | function createTempDir(prefix) {
function cleanup (line 29) | function cleanup(dirPath) {
function writeState (line 33) | function writeState(filePath, options) {
function run (line 39) | function run(args = [], options = {}) {
function test (line 64) | function test(name, fn) {
function runTests (line 76) | function runTests() {
Condensed preview — 1181 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,064K chars).
[
{
"path": ".agents/skills/api-design/SKILL.md",
"chars": 13082,
"preview": "---\nname: api-design\ndescription: REST API design patterns including resource naming, status codes, pagination, filterin"
},
{
"path": ".agents/skills/api-design/agents/openai.yaml",
"chars": 247,
"preview": "interface:\n display_name: \"API Design\"\n short_description: \"REST API design patterns and best practices\"\n brand_color"
},
{
"path": ".agents/skills/article-writing/SKILL.md",
"chars": 3142,
"preview": "---\nname: article-writing\ndescription: Write articles, guides, blog posts, tutorials, newsletter issues, and other long-"
},
{
"path": ".agents/skills/article-writing/agents/openai.yaml",
"chars": 288,
"preview": "interface:\n display_name: \"Article Writing\"\n short_description: \"Write long-form content in a supplied voice without s"
},
{
"path": ".agents/skills/backend-patterns/SKILL.md",
"chars": 13813,
"preview": "---\nname: backend-patterns\ndescription: Backend architecture patterns, API design, database optimization, and server-sid"
},
{
"path": ".agents/skills/backend-patterns/agents/openai.yaml",
"chars": 259,
"preview": "interface:\n display_name: \"Backend Patterns\"\n short_description: \"API design, database, and server-side patterns\"\n br"
},
{
"path": ".agents/skills/bun-runtime/SKILL.md",
"chars": 2596,
"preview": "---\nname: bun-runtime\ndescription: Bun as runtime, package manager, bundler, and test runner. When to choose Bun vs Node"
},
{
"path": ".agents/skills/bun-runtime/agents/openai.yaml",
"chars": 246,
"preview": "interface:\n display_name: \"Bun Runtime\"\n short_description: \"Bun as runtime, package manager, bundler, and test runner"
},
{
"path": ".agents/skills/claude-api/SKILL.md",
"chars": 8491,
"preview": "---\nname: claude-api\ndescription: Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streamin"
},
{
"path": ".agents/skills/claude-api/agents/openai.yaml",
"chars": 279,
"preview": "interface:\n display_name: \"Claude API\"\n short_description: \"Anthropic Claude API patterns and SDKs\"\n brand_color: \"#D"
},
{
"path": ".agents/skills/coding-standards/SKILL.md",
"chars": 11553,
"preview": "---\nname: coding-standards\ndescription: Universal coding standards, best practices, and patterns for TypeScript, JavaScr"
},
{
"path": ".agents/skills/coding-standards/agents/openai.yaml",
"chars": 261,
"preview": "interface:\n display_name: \"Coding Standards\"\n short_description: \"Universal coding standards and best practices\"\n bra"
},
{
"path": ".agents/skills/content-engine/SKILL.md",
"chars": 2569,
"preview": "---\nname: content-engine\ndescription: Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newslette"
},
{
"path": ".agents/skills/content-engine/agents/openai.yaml",
"chars": 274,
"preview": "interface:\n display_name: \"Content Engine\"\n short_description: \"Turn one idea into platform-native social and content "
},
{
"path": ".agents/skills/crosspost/SKILL.md",
"chars": 5346,
"preview": "---\nname: crosspost\ndescription: Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts co"
},
{
"path": ".agents/skills/crosspost/agents/openai.yaml",
"chars": 300,
"preview": "interface:\n display_name: \"Crosspost\"\n short_description: \"Multi-platform content distribution with native adaptation\""
},
{
"path": ".agents/skills/deep-research/SKILL.md",
"chars": 4572,
"preview": "---\nname: deep-research\ndescription: Multi-source deep research using firecrawl and exa MCPs. Searches the web, synthesi"
},
{
"path": ".agents/skills/deep-research/agents/openai.yaml",
"chars": 281,
"preview": "interface:\n display_name: \"Deep Research\"\n short_description: \"Multi-source deep research with firecrawl and exa MCPs\""
},
{
"path": ".agents/skills/dmux-workflows/SKILL.md",
"chars": 4716,
"preview": "---\nname: dmux-workflows\ndescription: Multi-agent orchestration using dmux (tmux pane manager for AI agents). Patterns f"
},
{
"path": ".agents/skills/dmux-workflows/agents/openai.yaml",
"chars": 250,
"preview": "interface:\n display_name: \"dmux Workflows\"\n short_description: \"Multi-agent orchestration with dmux\"\n brand_color: \"#"
},
{
"path": ".agents/skills/documentation-lookup/SKILL.md",
"chars": 4900,
"preview": "---\nname: documentation-lookup\ndescription: Use up-to-date library and framework docs via Context7 MCP instead of traini"
},
{
"path": ".agents/skills/documentation-lookup/agents/openai.yaml",
"chars": 241,
"preview": "interface:\n display_name: \"Documentation Lookup\"\n short_description: \"Fetch up-to-date library docs via Context7 MCP\"\n"
},
{
"path": ".agents/skills/e2e-testing/SKILL.md",
"chars": 7937,
"preview": "---\nname: e2e-testing\ndescription: Playwright E2E testing patterns, Page Object Model, configuration, CI/CD integration,"
},
{
"path": ".agents/skills/e2e-testing/agents/openai.yaml",
"chars": 234,
"preview": "interface:\n display_name: \"E2E Testing\"\n short_description: \"Playwright end-to-end testing\"\n brand_color: \"#06B6D4\"\n "
},
{
"path": ".agents/skills/eval-harness/SKILL.md",
"chars": 5515,
"preview": "---\nname: eval-harness\ndescription: Formal evaluation framework for Claude Code sessions implementing eval-driven develo"
},
{
"path": ".agents/skills/eval-harness/agents/openai.yaml",
"chars": 255,
"preview": "interface:\n display_name: \"Eval Harness\"\n short_description: \"Eval-driven development with pass/fail criteria\"\n brand"
},
{
"path": ".agents/skills/exa-search/SKILL.md",
"chars": 4811,
"preview": "---\nname: exa-search\ndescription: Neural search via Exa MCP for web, code, and company research. Use when the user needs"
},
{
"path": ".agents/skills/exa-search/agents/openai.yaml",
"chars": 275,
"preview": "interface:\n display_name: \"Exa Search\"\n short_description: \"Neural search via Exa MCP for web, code, and companies\"\n "
},
{
"path": ".agents/skills/fal-ai-media/SKILL.md",
"chars": 6828,
"preview": "---\nname: fal-ai-media\ndescription: Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-im"
},
{
"path": ".agents/skills/fal-ai-media/agents/openai.yaml",
"chars": 255,
"preview": "interface:\n display_name: \"fal.ai Media\"\n short_description: \"AI image, video, and audio generation via fal.ai\"\n bran"
},
{
"path": ".agents/skills/frontend-patterns/SKILL.md",
"chars": 14745,
"preview": "---\nname: frontend-patterns\ndescription: Frontend development patterns for React, Next.js, state management, performance"
},
{
"path": ".agents/skills/frontend-patterns/agents/openai.yaml",
"chars": 251,
"preview": "interface:\n display_name: \"Frontend Patterns\"\n short_description: \"React and Next.js patterns and best practices\"\n br"
},
{
"path": ".agents/skills/frontend-slides/SKILL.md",
"chars": 6558,
"preview": "---\nname: frontend-slides\ndescription: Create stunning, animation-rich HTML presentations from scratch or by converting "
},
{
"path": ".agents/skills/frontend-slides/STYLE_PRESETS.md",
"chars": 9145,
"preview": "# Style Presets Reference\n\nCurated visual styles for `frontend-slides`.\n\nUse this file for:\n- the mandatory viewport-fit"
},
{
"path": ".agents/skills/frontend-slides/agents/openai.yaml",
"chars": 285,
"preview": "interface:\n display_name: \"Frontend Slides\"\n short_description: \"Create distinctive HTML slide decks and convert PPTX "
},
{
"path": ".agents/skills/investor-materials/SKILL.md",
"chars": 2723,
"preview": "---\nname: investor-materials\ndescription: Create and update pitch decks, one-pagers, investor memos, accelerator applica"
},
{
"path": ".agents/skills/investor-materials/agents/openai.yaml",
"chars": 300,
"preview": "interface:\n display_name: \"Investor Materials\"\n short_description: \"Create decks, memos, and financial materials from "
},
{
"path": ".agents/skills/investor-outreach/SKILL.md",
"chars": 2140,
"preview": "---\nname: investor-outreach\ndescription: Draft cold emails, warm intro blurbs, follow-ups, update emails, and investor c"
},
{
"path": ".agents/skills/investor-outreach/agents/openai.yaml",
"chars": 300,
"preview": "interface:\n display_name: \"Investor Outreach\"\n short_description: \"Write concise, personalized outreach and follow-ups"
},
{
"path": ".agents/skills/market-research/SKILL.md",
"chars": 2226,
"preview": "---\nname: market-research\ndescription: Conduct market research, competitive analysis, investor due diligence, and indust"
},
{
"path": ".agents/skills/market-research/agents/openai.yaml",
"chars": 281,
"preview": "interface:\n display_name: \"Market Research\"\n short_description: \"Source-attributed market, competitor, and investor re"
},
{
"path": ".agents/skills/mcp-server-patterns/SKILL.md",
"chars": 3859,
"preview": "---\nname: mcp-server-patterns\ndescription: Build MCP servers with Node/TypeScript SDK — tools, resources, prompts, Zod v"
},
{
"path": ".agents/skills/nextjs-turbopack/SKILL.md",
"chars": 2158,
"preview": "---\nname: nextjs-turbopack\ndescription: Next.js 16+ and Turbopack — incremental bundling, FS caching, dev speed, and whe"
},
{
"path": ".agents/skills/nextjs-turbopack/agents/openai.yaml",
"chars": 242,
"preview": "interface:\n display_name: \"Next.js Turbopack\"\n short_description: \"Next.js 16+ and Turbopack dev bundler\"\n brand_colo"
},
{
"path": ".agents/skills/security-review/SKILL.md",
"chars": 12194,
"preview": "---\nname: security-review\ndescription: Use this skill when adding authentication, handling user input, working with secr"
},
{
"path": ".agents/skills/security-review/agents/openai.yaml",
"chars": 288,
"preview": "interface:\n display_name: \"Security Review\"\n short_description: \"Comprehensive security checklist and vulnerability de"
},
{
"path": ".agents/skills/strategic-compact/SKILL.md",
"chars": 3997,
"preview": "---\nname: strategic-compact\ndescription: Suggests manual context compaction at logical intervals to preserve context thr"
},
{
"path": ".agents/skills/strategic-compact/agents/openai.yaml",
"chars": 257,
"preview": "interface:\n display_name: \"Strategic Compact\"\n short_description: \"Context management via strategic compaction\"\n bran"
},
{
"path": ".agents/skills/tdd-workflow/SKILL.md",
"chars": 9633,
"preview": "---\nname: tdd-workflow\ndescription: Use this skill when writing new features, fixing bugs, or refactoring code. Enforces"
},
{
"path": ".agents/skills/tdd-workflow/agents/openai.yaml",
"chars": 258,
"preview": "interface:\n display_name: \"TDD Workflow\"\n short_description: \"Test-driven development with 80%+ coverage\"\n brand_colo"
},
{
"path": ".agents/skills/verification-loop/SKILL.md",
"chars": 2491,
"preview": "---\nname: verification-loop\ndescription: \"A comprehensive verification system for Claude Code sessions.\"\norigin: ECC\n---"
},
{
"path": ".agents/skills/verification-loop/agents/openai.yaml",
"chars": 256,
"preview": "interface:\n display_name: \"Verification Loop\"\n short_description: \"Build, test, lint, typecheck verification\"\n brand_"
},
{
"path": ".agents/skills/video-editing/SKILL.md",
"chars": 9675,
"preview": "---\nname: video-editing\ndescription: AI-assisted video editing workflows for cutting, structuring, and augmenting real f"
},
{
"path": ".agents/skills/video-editing/agents/openai.yaml",
"chars": 283,
"preview": "interface:\n display_name: \"Video Editing\"\n short_description: \"AI-assisted video editing for real footage\"\n brand_col"
},
{
"path": ".agents/skills/x-api/SKILL.md",
"chars": 5547,
"preview": "---\nname: x-api\ndescription: X/Twitter API integration for posting tweets, threads, reading timelines, search, and analy"
},
{
"path": ".agents/skills/x-api/agents/openai.yaml",
"chars": 279,
"preview": "interface:\n display_name: \"X API\"\n short_description: \"X/Twitter API integration for posting, threads, and analytics\"\n"
},
{
"path": ".claude/homunculus/instincts/inherited/everything-claude-code-instincts.yaml",
"chars": 4758,
"preview": "# Curated instincts for affaan-m/everything-claude-code\n# Import with: /instinct-import .claude/homunculus/instincts/inh"
},
{
"path": ".claude/package-manager.json",
"chars": 68,
"preview": "{\n \"packageManager\": \"bun\",\n \"setAt\": \"2026-01-23T02:09:58.819Z\"\n}"
},
{
"path": ".claude/skills/everything-claude-code/SKILL.md",
"chars": 3361,
"preview": "# Everything Claude Code\n\nUse this skill when working inside the `everything-claude-code` repository and you need repo-s"
},
{
"path": ".claude-plugin/PLUGIN_SCHEMA_NOTES.md",
"chars": 5296,
"preview": "# Plugin Manifest Schema Notes\n\nThis document captures **undocumented but enforced constraints** of the Claude Code plug"
},
{
"path": ".claude-plugin/README.md",
"chars": 1232,
"preview": "### Plugin Manifest Gotchas\n\nIf you plan to edit `.claude-plugin/plugin.json`, be aware that the Claude plugin validator"
},
{
"path": ".claude-plugin/marketplace.json",
"chars": 1510,
"preview": "{\n \"$schema\": \"https://anthropic.com/claude-code/marketplace.schema.json\",\n \"name\": \"everything-claude-code\",\n \"descr"
},
{
"path": ".claude-plugin/plugin.json",
"chars": 698,
"preview": "{\n \"name\": \"everything-claude-code\",\n \"version\": \"1.8.0\",\n \"description\": \"Complete collection of battle-tested Claud"
},
{
"path": ".codex/AGENTS.md",
"chars": 3660,
"preview": "# ECC for Codex CLI\n\nThis supplements the root `AGENTS.md` with Codex-specific guidance.\n\n## Model Recommendations\n\n| Ta"
},
{
"path": ".codex/agents/docs-researcher.toml",
"chars": 317,
"preview": "model = \"gpt-5.4\"\nmodel_reasoning_effort = \"medium\"\nsandbox_mode = \"read-only\"\n\ndeveloper_instructions = \"\"\"\nVerify APIs"
},
{
"path": ".codex/agents/explorer.toml",
"chars": 315,
"preview": "model = \"gpt-5.4\"\nmodel_reasoning_effort = \"medium\"\nsandbox_mode = \"read-only\"\n\ndeveloper_instructions = \"\"\"\nStay in exp"
},
{
"path": ".codex/agents/reviewer.toml",
"chars": 296,
"preview": "model = \"gpt-5.4\"\nmodel_reasoning_effort = \"high\"\nsandbox_mode = \"read-only\"\n\ndeveloper_instructions = \"\"\"\nReview like a"
},
{
"path": ".codex/config.toml",
"chars": 3167,
"preview": "#:schema https://developers.openai.com/codex/config-schema.json\n\n# Everything Claude Code (ECC) — Codex Reference Config"
},
{
"path": ".cursor/hooks/adapter.js",
"chars": 2531,
"preview": "#!/usr/bin/env node\n/**\n * Cursor-to-Claude Code Hook Adapter\n * Transforms Cursor stdin JSON to Claude Code hook format"
},
{
"path": ".cursor/hooks/after-file-edit.js",
"chars": 660,
"preview": "#!/usr/bin/env node\nconst { readStdin, runExistingHook, transformToClaude } = require('./adapter');\nreadStdin().then(raw"
},
{
"path": ".cursor/hooks/after-mcp-execution.js",
"chars": 456,
"preview": "#!/usr/bin/env node\nconst { readStdin } = require('./adapter');\nreadStdin().then(raw => {\n try {\n const input = JSON"
},
{
"path": ".cursor/hooks/after-shell-execution.js",
"chars": 1060,
"preview": "#!/usr/bin/env node\nconst { readStdin, hookEnabled } = require('./adapter');\n\nreadStdin().then(raw => {\n try {\n cons"
},
{
"path": ".cursor/hooks/after-tab-file-edit.js",
"chars": 440,
"preview": "#!/usr/bin/env node\nconst { readStdin, runExistingHook, transformToClaude } = require('./adapter');\nreadStdin().then(raw"
},
{
"path": ".cursor/hooks/before-mcp-execution.js",
"chars": 396,
"preview": "#!/usr/bin/env node\nconst { readStdin } = require('./adapter');\nreadStdin().then(raw => {\n try {\n const input = JSON"
},
{
"path": ".cursor/hooks/before-read-file.js",
"chars": 488,
"preview": "#!/usr/bin/env node\nconst { readStdin } = require('./adapter');\nreadStdin().then(raw => {\n try {\n const input = JSON"
},
{
"path": ".cursor/hooks/before-shell-execution.js",
"chars": 1700,
"preview": "#!/usr/bin/env node\nconst { readStdin, hookEnabled } = require('./adapter');\nconst { splitShellSegments } = require('../"
},
{
"path": ".cursor/hooks/before-submit-prompt.js",
"chars": 894,
"preview": "#!/usr/bin/env node\nconst { readStdin } = require('./adapter');\nreadStdin().then(raw => {\n try {\n const input = JSON"
},
{
"path": ".cursor/hooks/before-tab-file-read.js",
"chars": 446,
"preview": "#!/usr/bin/env node\nconst { readStdin } = require('./adapter');\nreadStdin().then(raw => {\n try {\n const input = JSON"
},
{
"path": ".cursor/hooks/pre-compact.js",
"chars": 304,
"preview": "#!/usr/bin/env node\nconst { readStdin, runExistingHook, transformToClaude } = require('./adapter');\nreadStdin().then(raw"
},
{
"path": ".cursor/hooks/session-end.js",
"chars": 431,
"preview": "#!/usr/bin/env node\nconst { readStdin, runExistingHook, transformToClaude, hookEnabled } = require('./adapter');\nreadStd"
},
{
"path": ".cursor/hooks/session-start.js",
"chars": 421,
"preview": "#!/usr/bin/env node\nconst { readStdin, runExistingHook, transformToClaude, hookEnabled } = require('./adapter');\nreadStd"
},
{
"path": ".cursor/hooks/stop.js",
"chars": 833,
"preview": "#!/usr/bin/env node\nconst { readStdin, runExistingHook, transformToClaude, hookEnabled } = require('./adapter');\nreadStd"
},
{
"path": ".cursor/hooks/subagent-start.js",
"chars": 324,
"preview": "#!/usr/bin/env node\nconst { readStdin } = require('./adapter');\nreadStdin().then(raw => {\n try {\n const input = JSON"
},
{
"path": ".cursor/hooks/subagent-stop.js",
"chars": 326,
"preview": "#!/usr/bin/env node\nconst { readStdin } = require('./adapter');\nreadStdin().then(raw => {\n try {\n const input = JSON"
},
{
"path": ".cursor/hooks.json",
"chars": 3163,
"preview": "{\n \"hooks\": {\n \"sessionStart\": [\n {\n \"command\": \"node .cursor/hooks/session-start.js\",\n \"event\": "
},
{
"path": ".cursor/rules/common-agents.md",
"chars": 1618,
"preview": "---\ndescription: \"Agent orchestration: available agents, parallel execution, multi-perspective analysis\"\nalwaysApply: tr"
},
{
"path": ".cursor/rules/common-coding-style.md",
"chars": 1517,
"preview": "---\ndescription: \"ECC coding style: immutability, file organization, error handling, validation\"\nalwaysApply: true\n---\n#"
},
{
"path": ".cursor/rules/common-development-workflow.md",
"chars": 1037,
"preview": "---\ndescription: \"Development workflow: plan, TDD, review, commit pipeline\"\nalwaysApply: true\n---\n# Development Workflow"
},
{
"path": ".cursor/rules/common-git-workflow.md",
"chars": 687,
"preview": "---\ndescription: \"Git workflow: conventional commits, PR process\"\nalwaysApply: true\n---\n# Git Workflow\n\n## Commit Messag"
},
{
"path": ".cursor/rules/common-hooks.md",
"chars": 880,
"preview": "---\ndescription: \"Hooks system: types, auto-accept permissions, TodoWrite best practices\"\nalwaysApply: true\n---\n# Hooks "
},
{
"path": ".cursor/rules/common-patterns.md",
"chars": 1124,
"preview": "---\ndescription: \"Common patterns: repository, API response, skeleton projects\"\nalwaysApply: true\n---\n# Common Patterns\n"
},
{
"path": ".cursor/rules/common-performance.md",
"chars": 1712,
"preview": "---\ndescription: \"Performance: model selection, context management, build troubleshooting\"\nalwaysApply: true\n---\n# Perfo"
},
{
"path": ".cursor/rules/common-security.md",
"chars": 968,
"preview": "---\ndescription: \"Security: mandatory checks, secret management, response protocol\"\nalwaysApply: true\n---\n# Security Gui"
},
{
"path": ".cursor/rules/common-testing.md",
"chars": 872,
"preview": "---\ndescription: \"Testing requirements: 80% coverage, TDD workflow, test types\"\nalwaysApply: true\n---\n# Testing Requirem"
},
{
"path": ".cursor/rules/golang-coding-style.md",
"chars": 621,
"preview": "---\ndescription: \"Go coding style extending common rules\"\nglobs: [\"**/*.go\", \"**/go.mod\", \"**/go.sum\"]\nalwaysApply: fals"
},
{
"path": ".cursor/rules/golang-hooks.md",
"chars": 448,
"preview": "---\ndescription: \"Go hooks extending common rules\"\nglobs: [\"**/*.go\", \"**/go.mod\", \"**/go.sum\"]\nalwaysApply: false\n---\n#"
},
{
"path": ".cursor/rules/golang-patterns.md",
"chars": 931,
"preview": "---\ndescription: \"Go patterns extending common rules\"\nglobs: [\"**/*.go\", \"**/go.mod\", \"**/go.sum\"]\nalwaysApply: false\n--"
},
{
"path": ".cursor/rules/golang-security.md",
"chars": 600,
"preview": "---\ndescription: \"Go security extending common rules\"\nglobs: [\"**/*.go\", \"**/go.mod\", \"**/go.sum\"]\nalwaysApply: false\n--"
},
{
"path": ".cursor/rules/golang-testing.md",
"chars": 499,
"preview": "---\ndescription: \"Go testing extending common rules\"\nglobs: [\"**/*.go\", \"**/go.mod\", \"**/go.sum\"]\nalwaysApply: false\n---"
},
{
"path": ".cursor/rules/kotlin-coding-style.md",
"chars": 1016,
"preview": "---\ndescription: \"Kotlin coding style extending common rules\"\nglobs: [\"**/*.kt\", \"**/*.kts\", \"**/build.gradle.kts\"]\nalwa"
},
{
"path": ".cursor/rules/kotlin-hooks.md",
"chars": 467,
"preview": "---\ndescription: \"Kotlin hooks extending common rules\"\nglobs: [\"**/*.kt\", \"**/*.kts\", \"**/build.gradle.kts\"]\nalwaysApply"
},
{
"path": ".cursor/rules/kotlin-patterns.md",
"chars": 1167,
"preview": "---\ndescription: \"Kotlin patterns extending common rules\"\nglobs: [\"**/*.kt\", \"**/*.kts\", \"**/build.gradle.kts\"]\nalwaysAp"
},
{
"path": ".cursor/rules/kotlin-security.md",
"chars": 1397,
"preview": "---\ndescription: \"Kotlin security extending common rules\"\nglobs: [\"**/*.kt\", \"**/*.kts\", \"**/build.gradle.kts\"]\nalwaysAp"
},
{
"path": ".cursor/rules/kotlin-testing.md",
"chars": 780,
"preview": "---\ndescription: \"Kotlin testing extending common rules\"\nglobs: [\"**/*.kt\", \"**/*.kts\", \"**/build.gradle.kts\"]\nalwaysApp"
},
{
"path": ".cursor/rules/php-coding-style.md",
"chars": 850,
"preview": "---\ndescription: \"PHP coding style extending common rules\"\nglobs: [\"**/*.php\", \"**/composer.json\"]\nalwaysApply: false\n--"
},
{
"path": ".cursor/rules/php-hooks.md",
"chars": 718,
"preview": "---\ndescription: \"PHP hooks extending common rules\"\nglobs: [\"**/*.php\", \"**/composer.json\", \"**/phpstan.neon\", \"**/phpst"
},
{
"path": ".cursor/rules/php-patterns.md",
"chars": 841,
"preview": "---\ndescription: \"PHP patterns extending common rules\"\nglobs: [\"**/*.php\", \"**/composer.json\"]\nalwaysApply: false\n---\n# "
},
{
"path": ".cursor/rules/php-security.md",
"chars": 851,
"preview": "---\ndescription: \"PHP security extending common rules\"\nglobs: [\"**/*.php\", \"**/composer.lock\", \"**/composer.json\"]\nalway"
},
{
"path": ".cursor/rules/php-testing.md",
"chars": 740,
"preview": "---\ndescription: \"PHP testing extending common rules\"\nglobs: [\"**/*.php\", \"**/phpunit.xml\", \"**/phpunit.xml.dist\", \"**/c"
},
{
"path": ".cursor/rules/python-coding-style.md",
"chars": 760,
"preview": "---\ndescription: \"Python coding style extending common rules\"\nglobs: [\"**/*.py\", \"**/*.pyi\"]\nalwaysApply: false\n---\n# Py"
},
{
"path": ".cursor/rules/python-hooks.md",
"chars": 473,
"preview": "---\ndescription: \"Python hooks extending common rules\"\nglobs: [\"**/*.py\", \"**/*.pyi\"]\nalwaysApply: false\n---\n# Python Ho"
},
{
"path": ".cursor/rules/python-patterns.md",
"chars": 872,
"preview": "---\ndescription: \"Python patterns extending common rules\"\nglobs: [\"**/*.py\", \"**/*.pyi\"]\nalwaysApply: false\n---\n# Python"
},
{
"path": ".cursor/rules/python-security.md",
"chars": 573,
"preview": "---\ndescription: \"Python security extending common rules\"\nglobs: [\"**/*.py\", \"**/*.pyi\"]\nalwaysApply: false\n---\n# Python"
},
{
"path": ".cursor/rules/python-testing.md",
"chars": 630,
"preview": "---\ndescription: \"Python testing extending common rules\"\nglobs: [\"**/*.py\", \"**/*.pyi\"]\nalwaysApply: false\n---\n# Python "
},
{
"path": ".cursor/rules/swift-coding-style.md",
"chars": 1400,
"preview": "---\ndescription: \"Swift coding style extending common rules\"\nglobs: [\"**/*.swift\", \"**/Package.swift\"]\nalwaysApply: fals"
},
{
"path": ".cursor/rules/swift-hooks.md",
"chars": 556,
"preview": "---\ndescription: \"Swift hooks extending common rules\"\nglobs: [\"**/*.swift\", \"**/Package.swift\"]\nalwaysApply: false\n---\n#"
},
{
"path": ".cursor/rules/swift-patterns.md",
"chars": 1574,
"preview": "---\ndescription: \"Swift patterns extending common rules\"\nglobs: [\"**/*.swift\", \"**/Package.swift\"]\nalwaysApply: false\n--"
},
{
"path": ".cursor/rules/swift-security.md",
"chars": 1065,
"preview": "---\ndescription: \"Swift security extending common rules\"\nglobs: [\"**/*.swift\", \"**/Package.swift\"]\nalwaysApply: false\n--"
},
{
"path": ".cursor/rules/swift-testing.md",
"chars": 1052,
"preview": "---\ndescription: \"Swift testing extending common rules\"\nglobs: [\"**/*.swift\", \"**/Package.swift\"]\nalwaysApply: false\n---"
},
{
"path": ".cursor/rules/typescript-coding-style.md",
"chars": 1186,
"preview": "---\ndescription: \"TypeScript coding style extending common rules\"\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\n"
},
{
"path": ".cursor/rules/typescript-hooks.md",
"chars": 608,
"preview": "---\ndescription: \"TypeScript hooks extending common rules\"\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\nalwaysA"
},
{
"path": ".cursor/rules/typescript-patterns.md",
"chars": 1077,
"preview": "---\ndescription: \"TypeScript patterns extending common rules\"\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\nalwa"
},
{
"path": ".cursor/rules/typescript-security.md",
"chars": 595,
"preview": "---\ndescription: \"TypeScript security extending common rules\"\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\nalwa"
},
{
"path": ".cursor/rules/typescript-testing.md",
"chars": 422,
"preview": "---\ndescription: \"TypeScript testing extending common rules\"\nglobs: [\"**/*.ts\", \"**/*.tsx\", \"**/*.js\", \"**/*.jsx\"]\nalway"
},
{
"path": ".cursor/skills/article-writing/SKILL.md",
"chars": 3142,
"preview": "---\nname: article-writing\ndescription: Write articles, guides, blog posts, tutorials, newsletter issues, and other long-"
},
{
"path": ".cursor/skills/bun-runtime/SKILL.md",
"chars": 2596,
"preview": "---\nname: bun-runtime\ndescription: Bun as runtime, package manager, bundler, and test runner. When to choose Bun vs Node"
},
{
"path": ".cursor/skills/content-engine/SKILL.md",
"chars": 2569,
"preview": "---\nname: content-engine\ndescription: Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newslette"
},
{
"path": ".cursor/skills/documentation-lookup/SKILL.md",
"chars": 4900,
"preview": "---\nname: documentation-lookup\ndescription: Use up-to-date library and framework docs via Context7 MCP instead of traini"
},
{
"path": ".cursor/skills/frontend-slides/SKILL.md",
"chars": 6558,
"preview": "---\nname: frontend-slides\ndescription: Create stunning, animation-rich HTML presentations from scratch or by converting "
},
{
"path": ".cursor/skills/frontend-slides/STYLE_PRESETS.md",
"chars": 9145,
"preview": "# Style Presets Reference\n\nCurated visual styles for `frontend-slides`.\n\nUse this file for:\n- the mandatory viewport-fit"
},
{
"path": ".cursor/skills/investor-materials/SKILL.md",
"chars": 2723,
"preview": "---\nname: investor-materials\ndescription: Create and update pitch decks, one-pagers, investor memos, accelerator applica"
},
{
"path": ".cursor/skills/investor-outreach/SKILL.md",
"chars": 2140,
"preview": "---\nname: investor-outreach\ndescription: Draft cold emails, warm intro blurbs, follow-ups, update emails, and investor c"
},
{
"path": ".cursor/skills/market-research/SKILL.md",
"chars": 2226,
"preview": "---\nname: market-research\ndescription: Conduct market research, competitive analysis, investor due diligence, and indust"
},
{
"path": ".cursor/skills/mcp-server-patterns/SKILL.md",
"chars": 3859,
"preview": "---\nname: mcp-server-patterns\ndescription: Build MCP servers with Node/TypeScript SDK — tools, resources, prompts, Zod v"
},
{
"path": ".cursor/skills/nextjs-turbopack/SKILL.md",
"chars": 2158,
"preview": "---\nname: nextjs-turbopack\ndescription: Next.js 16+ and Turbopack — incremental bundling, FS caching, dev speed, and whe"
},
{
"path": ".github/FUNDING.yml",
"chars": 47,
"preview": "github: affaan-m\ncustom: ['https://ecc.tools']\n"
},
{
"path": ".github/ISSUE_TEMPLATE/copilot-task.md",
"chars": 333,
"preview": "---\nname: Copilot Task\nabout: Assign a coding task to GitHub Copilot agent\ntitle: \"[Copilot] \"\nlabels: copilot\nassignees"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 1054,
"preview": "## What Changed\n<!-- Describe the specific changes made in this PR -->\n\n## Why This Change\n<!-- Explain the motivation a"
},
{
"path": ".github/release.yml",
"chars": 355,
"preview": "changelog:\n categories:\n - title: Core Harness\n labels:\n - enhancement\n - feature\n - title: Re"
},
{
"path": ".github/workflows/ci.yml",
"chars": 6188,
"preview": "name: CI\n\non:\n push:\n branches: [main]\n pull_request:\n branches: [main]\n\n# Prevent duplicate runs\nconcurrency:\n "
},
{
"path": ".github/workflows/maintenance.yml",
"chars": 1234,
"preview": "name: Scheduled Maintenance\n\non:\n schedule:\n - cron: '0 9 * * 1' # Weekly Monday 9am UTC\n workflow_dispatch:\n\nperm"
},
{
"path": ".github/workflows/monthly-metrics.yml",
"chars": 6489,
"preview": "name: Monthly Metrics Snapshot\n\non:\n schedule:\n - cron: '0 14 1 * *' # Monthly on the 1st at 14:00 UTC\n workflow_di"
},
{
"path": ".github/workflows/release.yml",
"chars": 2055,
"preview": "name: Release\n\non:\n push:\n tags: ['v*']\n\npermissions:\n contents: write\n\njobs:\n release:\n name: Create Release\n "
},
{
"path": ".github/workflows/reusable-release.yml",
"chars": 1415,
"preview": "name: Reusable Release Workflow\n\non:\n workflow_call:\n inputs:\n tag:\n description: 'Version tag (e.g., v1"
},
{
"path": ".github/workflows/reusable-test.yml",
"chars": 3997,
"preview": "name: Reusable Test Workflow\n\non:\n workflow_call:\n inputs:\n os:\n description: 'Operating system'\n "
},
{
"path": ".github/workflows/reusable-validate.yml",
"chars": 974,
"preview": "name: Reusable Validation Workflow\n\non:\n workflow_call:\n inputs:\n node-version:\n description: 'Node.js v"
},
{
"path": ".gitignore",
"chars": 995,
"preview": "# Environment files\n.env\n.env.local\n.env.*.local\n.env.development\n.env.test\n.env.production\n\n# API keys and secrets\n*.ke"
},
{
"path": ".markdownlint.json",
"chars": 359,
"preview": "{\n \"globs\": [\"**/*.md\", \"!**/node_modules/**\"],\n \"default\": true,\n \"MD009\": { \"br_spaces\": 2, \"strict\": false },\n \"M"
},
{
"path": ".npmignore",
"chars": 231,
"preview": "# npm always includes README* — exclude translations from package\nREADME.zh-CN.md\n\n# Dev-only script (release is CI/loca"
},
{
"path": ".opencode/MIGRATION.md",
"chars": 11091,
"preview": "# Migration Guide: Claude Code to OpenCode\n\nThis guide helps you migrate from Claude Code to OpenCode while using the Ev"
},
{
"path": ".opencode/README.md",
"chars": 5570,
"preview": "# OpenCode ECC Plugin\n\n> ⚠️ This README is specific to OpenCode usage. \n> If you installed ECC via npm (e.g. `npm insta"
},
{
"path": ".opencode/commands/build-fix.md",
"chars": 1555,
"preview": "---\ndescription: Fix build and TypeScript errors with minimal changes\nagent: build-error-resolver\nsubtask: true\n---\n\n# B"
},
{
"path": ".opencode/commands/checkpoint.md",
"chars": 1327,
"preview": "---\ndescription: Save verification state and progress checkpoint\nagent: build\n---\n\n# Checkpoint Command\n\nSave current ve"
},
{
"path": ".opencode/commands/code-review.md",
"chars": 1558,
"preview": "---\ndescription: Review code for quality, security, and maintainability\nagent: code-reviewer\nsubtask: true\n---\n\n# Code R"
},
{
"path": ".opencode/commands/e2e.md",
"chars": 2233,
"preview": "---\ndescription: Generate and run E2E tests with Playwright\nagent: e2e-runner\nsubtask: true\n---\n\n# E2E Command\n\nGenerate"
},
{
"path": ".opencode/commands/eval.md",
"chars": 1658,
"preview": "---\ndescription: Run evaluation against acceptance criteria\nagent: build\n---\n\n# Eval Command\n\nEvaluate implementation ag"
},
{
"path": ".opencode/commands/evolve.md",
"chars": 952,
"preview": "---\ndescription: Analyze instincts and suggest or generate evolved structures\nagent: build\n---\n\n# Evolve Command\n\nAnalyz"
},
{
"path": ".opencode/commands/go-build.md",
"chars": 1579,
"preview": "---\ndescription: Fix Go build and vet errors\nagent: go-build-resolver\nsubtask: true\n---\n\n# Go Build Command\n\nFix Go buil"
},
{
"path": ".opencode/commands/go-review.md",
"chars": 1768,
"preview": "---\ndescription: Go code review for idiomatic patterns\nagent: go-reviewer\nsubtask: true\n---\n\n# Go Review Command\n\nReview"
},
{
"path": ".opencode/commands/go-test.md",
"chars": 2490,
"preview": "---\ndescription: Go TDD workflow with table-driven tests\nagent: tdd-guide\nsubtask: true\n---\n\n# Go Test Command\n\nImplemen"
},
{
"path": ".opencode/commands/harness-audit.md",
"chars": 2061,
"preview": "# Harness Audit Command\n\nRun a deterministic repository harness audit and return a prioritized scorecard.\n\n## Usage\n\n`/h"
},
{
"path": ".opencode/commands/instinct-export.md",
"chars": 1465,
"preview": "---\ndescription: Export instincts for sharing\nagent: build\n---\n\n# Instinct Export Command\n\nExport instincts for sharing "
},
{
"path": ".opencode/commands/instinct-import.md",
"chars": 1508,
"preview": "---\ndescription: Import instincts from external sources\nagent: build\n---\n\n# Instinct Import Command\n\nImport instincts fr"
},
{
"path": ".opencode/commands/instinct-status.md",
"chars": 697,
"preview": "---\ndescription: Show learned instincts (project + global) with confidence\nagent: build\n---\n\n# Instinct Status Command\n\n"
},
{
"path": ".opencode/commands/learn.md",
"chars": 1351,
"preview": "---\ndescription: Extract patterns and learnings from current session\nagent: build\n---\n\n# Learn Command\n\nExtract patterns"
},
{
"path": ".opencode/commands/loop-start.md",
"chars": 884,
"preview": "# Loop Start Command\n\nStart a managed autonomous loop pattern with safety defaults.\n\n## Usage\n\n`/loop-start [pattern] [-"
},
{
"path": ".opencode/commands/loop-status.md",
"chars": 455,
"preview": "# Loop Status Command\n\nInspect active loop state, progress, and failure signals.\n\n## Usage\n\n`/loop-status [--watch]`\n\n##"
},
{
"path": ".opencode/commands/model-route.md",
"chars": 585,
"preview": "# Model Route Command\n\nRecommend the best model tier for the current task by complexity and budget.\n\n## Usage\n\n`/model-r"
},
{
"path": ".opencode/commands/orchestrate.md",
"chars": 2453,
"preview": "---\ndescription: Orchestrate multiple agents for complex tasks\nagent: planner\nsubtask: true\n---\n\n# Orchestrate Command\n\n"
},
{
"path": ".opencode/commands/plan.md",
"chars": 1155,
"preview": "---\ndescription: Create implementation plan with risk assessment\nagent: planner\nsubtask: true\n---\n\n# Plan Command\n\nCreat"
},
{
"path": ".opencode/commands/projects.md",
"chars": 436,
"preview": "---\ndescription: List registered projects and instinct counts\nagent: build\n---\n\n# Projects Command\n\nShow continuous-lear"
},
{
"path": ".opencode/commands/promote.md",
"chars": 441,
"preview": "---\ndescription: Promote project instincts to global scope\nagent: build\n---\n\n# Promote Command\n\nPromote instincts in con"
},
{
"path": ".opencode/commands/quality-gate.md",
"chars": 617,
"preview": "# Quality Gate Command\n\nRun the ECC quality pipeline on demand for a file or project scope.\n\n## Usage\n\n`/quality-gate [p"
},
{
"path": ".opencode/commands/refactor-clean.md",
"chars": 2107,
"preview": "---\ndescription: Remove dead code and consolidate duplicates\nagent: refactor-cleaner\nsubtask: true\n---\n\n# Refactor Clean"
},
{
"path": ".opencode/commands/rust-build.md",
"chars": 1752,
"preview": "---\ndescription: Fix Rust build errors and borrow checker issues\nagent: rust-build-resolver\nsubtask: true\n---\n\n# Rust Bu"
},
{
"path": ".opencode/commands/rust-review.md",
"chars": 1842,
"preview": "---\ndescription: Rust code review for ownership, safety, and idiomatic patterns\nagent: rust-reviewer\nsubtask: true\n---\n\n"
},
{
"path": ".opencode/commands/rust-test.md",
"chars": 2228,
"preview": "---\ndescription: Rust TDD workflow with unit and property tests\nagent: tdd-guide\nsubtask: true\n---\n\n# Rust Test Command\n"
},
{
"path": ".opencode/commands/security.md",
"chars": 2081,
"preview": "---\ndescription: Run comprehensive security review\nagent: security-reviewer\nsubtask: true\n---\n\n# Security Review Command"
},
{
"path": ".opencode/commands/setup-pm.md",
"chars": 1519,
"preview": "---\ndescription: Configure package manager preference\nagent: build\n---\n\n# Setup Package Manager Command\n\nConfigure your "
},
{
"path": ".opencode/commands/skill-create.md",
"chars": 1998,
"preview": "---\ndescription: Generate skills from git history analysis\nagent: build\n---\n\n# Skill Create Command\n\nAnalyze git history"
},
{
"path": ".opencode/commands/tdd.md",
"chars": 1697,
"preview": "---\ndescription: Enforce TDD workflow with 80%+ coverage\nagent: tdd-guide\nsubtask: true\n---\n\n# TDD Command\n\nImplement th"
},
{
"path": ".opencode/commands/test-coverage.md",
"chars": 1652,
"preview": "---\ndescription: Analyze and improve test coverage\nagent: tdd-guide\nsubtask: true\n---\n\n# Test Coverage Command\n\nAnalyze "
},
{
"path": ".opencode/commands/update-codemaps.md",
"chars": 1344,
"preview": "---\ndescription: Update codemaps for codebase navigation\nagent: doc-updater\nsubtask: true\n---\n\n# Update Codemaps Command"
},
{
"path": ".opencode/commands/update-docs.md",
"chars": 1373,
"preview": "---\ndescription: Update documentation for recent changes\nagent: doc-updater\nsubtask: true\n---\n\n# Update Docs Command\n\nUp"
},
{
"path": ".opencode/commands/verify.md",
"chars": 1401,
"preview": "---\ndescription: Run verification loop to validate implementation\nagent: build\n---\n\n# Verify Command\n\nRun verification l"
},
{
"path": ".opencode/index.ts",
"chars": 1961,
"preview": "/**\n * Everything Claude Code (ECC) Plugin for OpenCode\n *\n * This package provides the published ECC OpenCode plugin mo"
},
{
"path": ".opencode/instructions/INSTRUCTIONS.md",
"chars": 7839,
"preview": "# Everything Claude Code - OpenCode Instructions\n\nThis document consolidates the core rules and guidelines from the Clau"
},
{
"path": ".opencode/opencode.json",
"chars": 10687,
"preview": "{\n \"$schema\": \"https://opencode.ai/config.json\",\n \"model\": \"anthropic/claude-sonnet-4-5\",\n \"small_model\": \"anthropic/"
},
{
"path": ".opencode/package.json",
"chars": 1551,
"preview": "{\n \"name\": \"ecc-universal\",\n \"version\": \"1.8.0\",\n \"description\": \"Everything Claude Code (ECC) plugin for OpenCode - "
},
{
"path": ".opencode/plugins/ecc-hooks.ts",
"chars": 15045,
"preview": "/**\n * Everything Claude Code (ECC) Plugin Hooks for OpenCode\n *\n * This plugin translates Claude Code hooks to OpenCode"
},
{
"path": ".opencode/plugins/index.ts",
"chars": 406,
"preview": "/**\n * Everything Claude Code (ECC) Plugins for OpenCode\n *\n * This module exports all ECC plugins for OpenCode integrat"
},
{
"path": ".opencode/prompts/agents/architect.txt",
"chars": 4650,
"preview": "You are a senior software architect specializing in scalable, maintainable system design.\n\n## Your Role\n\n- Design system"
},
{
"path": ".opencode/prompts/agents/build-error-resolver.txt",
"chars": 5618,
"preview": "# Build Error Resolver\n\nYou are an expert build error resolution specialist focused on fixing TypeScript, compilation, a"
},
{
"path": ".opencode/prompts/agents/code-reviewer.txt",
"chars": 2813,
"preview": "You are a senior code reviewer ensuring high standards of code quality and security.\n\nWhen invoked:\n1. Run git diff to s"
},
{
"path": ".opencode/prompts/agents/database-reviewer.txt",
"chars": 7066,
"preview": "# Database Reviewer\n\nYou are an expert PostgreSQL database specialist focused on query optimization, schema design, secu"
},
{
"path": ".opencode/prompts/agents/doc-updater.txt",
"chars": 4715,
"preview": "# Documentation & Codemap Specialist\n\nYou are a documentation specialist focused on keeping codemaps and documentation c"
},
{
"path": ".opencode/prompts/agents/e2e-runner.txt",
"chars": 8070,
"preview": "# E2E Test Runner\n\nYou are an expert end-to-end testing specialist. Your mission is to ensure critical user journeys wor"
},
{
"path": ".opencode/prompts/agents/go-build-resolver.txt",
"chars": 6327,
"preview": "# Go Build Error Resolver\n\nYou are an expert Go build error resolution specialist. Your mission is to fix Go build error"
},
{
"path": ".opencode/prompts/agents/go-reviewer.txt",
"chars": 5828,
"preview": "You are a senior Go code reviewer ensuring high standards of idiomatic Go and best practices.\n\nWhen invoked:\n1. Run `git"
},
{
"path": ".opencode/prompts/agents/planner.txt",
"chars": 2945,
"preview": "You are an expert planning specialist focused on creating comprehensive, actionable implementation plans.\n\n## Your Role\n"
}
]
// ... and 981 more files (download for full content)
About this extraction
This page contains the full source code of the affaan-m/everything-claude-code GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 1181 files (6.4 MB), approximately 1.7M tokens, and a symbol index with 1127 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.