@kinqs/brainrouter-mcp-server 0.3.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +144 -0
- package/README.md +56 -0
- package/agents/README.md +120 -0
- package/agents/code-reviewer.md +97 -0
- package/agents/security-auditor.md +101 -0
- package/agents/test-engineer.md +95 -0
- package/dist/__tests__/agent_mode.test.d.ts +1 -0
- package/dist/__tests__/api-routes.test.d.ts +1 -0
- package/dist/__tests__/api-routes.test.js +170 -0
- package/dist/__tests__/crypto.test.d.ts +1 -0
- package/dist/__tests__/crypto.test.js +28 -0
- package/dist/__tests__/host-integrations.test.d.ts +1 -0
- package/dist/__tests__/host-integrations.test.js +82 -0
- package/dist/__tests__/integration.test.d.ts +1 -0
- package/dist/__tests__/integration.test.js +50 -0
- package/dist/__tests__/loader.test.d.ts +1 -0
- package/dist/__tests__/loader.test.js +89 -0
- package/dist/__tests__/neural-spark.test.d.ts +1 -0
- package/dist/__tests__/neural-spark.test.js +112 -0
- package/dist/__tests__/pagination.test.d.ts +1 -0
- package/dist/__tests__/pagination.test.js +23 -0
- package/dist/__tests__/redaction.test.d.ts +1 -0
- package/dist/__tests__/redaction.test.js +17 -0
- package/dist/__tests__/registry.test.d.ts +1 -0
- package/dist/__tests__/registry.test.js +56 -0
- package/dist/__tests__/retry.test.d.ts +1 -0
- package/dist/__tests__/retry.test.js +30 -0
- package/dist/__tests__/skill-activation.test.d.ts +1 -0
- package/dist/__tests__/skill-activation.test.js +112 -0
- package/dist/__tests__/working-memory.test.d.ts +1 -0
- package/dist/__tests__/working-memory.test.js +200 -0
- package/dist/__tests__/workspace-paths.test.d.ts +1 -0
- package/dist/__tests__/workspace-paths.test.js +56 -0
- package/dist/__tests__/writer.test.d.ts +1 -0
- package/dist/__tests__/writer.test.js +94 -0
- package/dist/api/auth/crypto.d.ts +4 -0
- package/dist/api/auth/crypto.js +54 -0
- package/dist/api/middleware/auth.d.ts +12 -0
- package/dist/api/middleware/auth.js +90 -0
- package/dist/api/pagination.d.ts +18 -0
- package/dist/api/pagination.js +32 -0
- package/dist/api/routes/auth.d.ts +1 -0
- package/dist/api/routes/auth.js +130 -0
- package/dist/api/routes/chat-completions.d.ts +7 -0
- package/dist/api/routes/chat-completions.js +474 -0
- package/dist/api/routes/contradictions.d.ts +1 -0
- package/dist/api/routes/contradictions.js +28 -0
- package/dist/api/routes/evidence.d.ts +1 -0
- package/dist/api/routes/evidence.js +59 -0
- package/dist/api/routes/governance.d.ts +1 -0
- package/dist/api/routes/governance.js +95 -0
- package/dist/api/routes/graph.d.ts +1 -0
- package/dist/api/routes/graph.js +25 -0
- package/dist/api/routes/hooks.d.ts +1 -0
- package/dist/api/routes/hooks.js +88 -0
- package/dist/api/routes/memories.d.ts +1 -0
- package/dist/api/routes/memories.js +92 -0
- package/dist/api/routes/persona.d.ts +1 -0
- package/dist/api/routes/persona.js +9 -0
- package/dist/api/routes/scenes.d.ts +1 -0
- package/dist/api/routes/scenes.js +35 -0
- package/dist/api/routes/skills.d.ts +1 -0
- package/dist/api/routes/skills.js +14 -0
- package/dist/api/routes/stats.d.ts +1 -0
- package/dist/api/routes/stats.js +8 -0
- package/dist/api/routes/users.d.ts +1 -0
- package/dist/api/routes/users.js +82 -0
- package/dist/api/routes/working.d.ts +1 -0
- package/dist/api/routes/working.js +88 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +492 -0
- package/dist/integrations/claude-code.d.ts +12 -0
- package/dist/integrations/claude-code.js +35 -0
- package/dist/integrations/codex.d.ts +12 -0
- package/dist/integrations/codex.js +34 -0
- package/dist/integrations/generic-mcp.d.ts +52 -0
- package/dist/integrations/generic-mcp.js +118 -0
- package/dist/loader.d.ts +29 -0
- package/dist/loader.js +200 -0
- package/dist/memory/capture.d.ts +35 -0
- package/dist/memory/capture.js +230 -0
- package/dist/memory/config.d.ts +2 -0
- package/dist/memory/config.js +3 -0
- package/dist/memory/engine.d.ts +203 -0
- package/dist/memory/engine.js +626 -0
- package/dist/memory/llm-semaphore.d.ts +41 -0
- package/dist/memory/llm-semaphore.js +81 -0
- package/dist/memory/memory-type-config.d.ts +11 -0
- package/dist/memory/memory-type-config.js +65 -0
- package/dist/memory/pipeline/cognitive-contradiction.d.ts +7 -0
- package/dist/memory/pipeline/cognitive-contradiction.js +59 -0
- package/dist/memory/pipeline/cognitive-dedup.d.ts +23 -0
- package/dist/memory/pipeline/cognitive-dedup.js +38 -0
- package/dist/memory/pipeline/cognitive-extractor.d.ts +21 -0
- package/dist/memory/pipeline/cognitive-extractor.js +183 -0
- package/dist/memory/pipeline/contextual-focus-builder.d.ts +13 -0
- package/dist/memory/pipeline/contextual-focus-builder.js +135 -0
- package/dist/memory/pipeline/focus-direction-shift.d.ts +10 -0
- package/dist/memory/pipeline/focus-direction-shift.js +27 -0
- package/dist/memory/pipeline/graph-builder.d.ts +11 -0
- package/dist/memory/pipeline/graph-builder.js +88 -0
- package/dist/memory/pipeline/graph-recall.d.ts +13 -0
- package/dist/memory/pipeline/graph-recall.js +55 -0
- package/dist/memory/pipeline/identity-distiller.d.ts +15 -0
- package/dist/memory/pipeline/identity-distiller.js +40 -0
- package/dist/memory/pipeline/l1-contradiction.d.ts +7 -0
- package/dist/memory/pipeline/l1-contradiction.js +66 -0
- package/dist/memory/pipeline/l1-dedup.d.ts +23 -0
- package/dist/memory/pipeline/l1-dedup.js +39 -0
- package/dist/memory/pipeline/l1-extractor.d.ts +21 -0
- package/dist/memory/pipeline/l1-extractor.js +180 -0
- package/dist/memory/pipeline/l2-direction-shift.d.ts +10 -0
- package/dist/memory/pipeline/l2-direction-shift.js +27 -0
- package/dist/memory/pipeline/l2-scene.d.ts +15 -0
- package/dist/memory/pipeline/l2-scene.js +140 -0
- package/dist/memory/pipeline/l3-distiller.d.ts +15 -0
- package/dist/memory/pipeline/l3-distiller.js +40 -0
- package/dist/memory/pipeline/neural-spark.d.ts +27 -0
- package/dist/memory/pipeline/neural-spark.js +78 -0
- package/dist/memory/pipeline/skill-prewarm.d.ts +63 -0
- package/dist/memory/pipeline/skill-prewarm.js +127 -0
- package/dist/memory/pipeline/task-queue.d.ts +54 -0
- package/dist/memory/pipeline/task-queue.js +117 -0
- package/dist/memory/prompts/cognitive-contradiction.d.ts +1 -0
- package/dist/memory/prompts/cognitive-contradiction.js +25 -0
- package/dist/memory/prompts/cognitive-extraction.d.ts +10 -0
- package/dist/memory/prompts/cognitive-extraction.js +114 -0
- package/dist/memory/prompts/core-identity.d.ts +6 -0
- package/dist/memory/prompts/core-identity.js +60 -0
- package/dist/memory/prompts/focus-direction-shift.d.ts +5 -0
- package/dist/memory/prompts/focus-direction-shift.js +32 -0
- package/dist/memory/prompts/focus-scene-cluster.d.ts +2 -0
- package/dist/memory/prompts/focus-scene-cluster.js +33 -0
- package/dist/memory/prompts/focus-scene.d.ts +7 -0
- package/dist/memory/prompts/focus-scene.js +40 -0
- package/dist/memory/prompts/graph-extraction-batch.d.ts +14 -0
- package/dist/memory/prompts/graph-extraction-batch.js +54 -0
- package/dist/memory/prompts/graph-extraction.d.ts +2 -0
- package/dist/memory/prompts/graph-extraction.js +53 -0
- package/dist/memory/prompts/l1-contradiction-batch.d.ts +16 -0
- package/dist/memory/prompts/l1-contradiction-batch.js +47 -0
- package/dist/memory/prompts/l1-contradiction.d.ts +1 -0
- package/dist/memory/prompts/l1-contradiction.js +25 -0
- package/dist/memory/prompts/l1-extraction.d.ts +10 -0
- package/dist/memory/prompts/l1-extraction.js +114 -0
- package/dist/memory/prompts/l2-direction-shift.d.ts +5 -0
- package/dist/memory/prompts/l2-direction-shift.js +32 -0
- package/dist/memory/prompts/l2-scene-cluster.d.ts +2 -0
- package/dist/memory/prompts/l2-scene-cluster.js +33 -0
- package/dist/memory/prompts/l2-scene.d.ts +7 -0
- package/dist/memory/prompts/l2-scene.js +40 -0
- package/dist/memory/prompts/l3-persona.d.ts +6 -0
- package/dist/memory/prompts/l3-persona.js +60 -0
- package/dist/memory/recall.d.ts +47 -0
- package/dist/memory/recall.js +427 -0
- package/dist/memory/redaction.d.ts +1 -0
- package/dist/memory/redaction.js +24 -0
- package/dist/memory/retry.d.ts +13 -0
- package/dist/memory/retry.js +53 -0
- package/dist/memory/scheduler.d.ts +9 -0
- package/dist/memory/scheduler.js +16 -0
- package/dist/memory/skill-hints-loader.d.ts +30 -0
- package/dist/memory/skill-hints-loader.js +100 -0
- package/dist/memory/store/embedding.d.ts +16 -0
- package/dist/memory/store/embedding.js +68 -0
- package/dist/memory/store/reranker.d.ts +24 -0
- package/dist/memory/store/reranker.js +83 -0
- package/dist/memory/store/sqlite.d.ts +167 -0
- package/dist/memory/store/sqlite.js +1816 -0
- package/dist/memory/store/types.d.ts +101 -0
- package/dist/memory/store/types.js +1 -0
- package/dist/memory/types.d.ts +207 -0
- package/dist/memory/types.js +7 -0
- package/dist/memory/validation.d.ts +441 -0
- package/dist/memory/validation.js +129 -0
- package/dist/memory/working/canvas.d.ts +5 -0
- package/dist/memory/working/canvas.js +43 -0
- package/dist/memory/working/offload.d.ts +71 -0
- package/dist/memory/working/offload.js +211 -0
- package/dist/memory/working/step-log.d.ts +16 -0
- package/dist/memory/working/step-log.js +35 -0
- package/dist/registry.d.ts +34 -0
- package/dist/registry.js +305 -0
- package/dist/resolver.d.ts +17 -0
- package/dist/resolver.js +126 -0
- package/dist/scripts/validate-foreign-workspace-path.d.ts +1 -0
- package/dist/scripts/validate-foreign-workspace-path.js +39 -0
- package/dist/tools/agent_memory_tools.d.ts +485 -0
- package/dist/tools/agent_memory_tools.js +793 -0
- package/dist/tools/create_skill.d.ts +46 -0
- package/dist/tools/create_skill.js +46 -0
- package/dist/tools/get_doc.d.ts +21 -0
- package/dist/tools/get_doc.js +24 -0
- package/dist/tools/get_persona.d.ts +15 -0
- package/dist/tools/get_persona.js +20 -0
- package/dist/tools/get_reference.d.ts +15 -0
- package/dist/tools/get_reference.js +20 -0
- package/dist/tools/get_skill.d.ts +34 -0
- package/dist/tools/get_skill.js +65 -0
- package/dist/tools/get_template_doc.d.ts +21 -0
- package/dist/tools/get_template_doc.js +24 -0
- package/dist/tools/list_docs.d.ts +15 -0
- package/dist/tools/list_docs.js +16 -0
- package/dist/tools/list_skills.d.ts +18 -0
- package/dist/tools/list_skills.js +17 -0
- package/dist/tools/list_template_docs.d.ts +15 -0
- package/dist/tools/list_template_docs.js +16 -0
- package/dist/tools/memory-engineering.d.ts +225 -0
- package/dist/tools/memory-engineering.js +284 -0
- package/dist/tools/memory-explain.d.ts +34 -0
- package/dist/tools/memory-explain.js +109 -0
- package/dist/tools/memory-governance.d.ts +171 -0
- package/dist/tools/memory-governance.js +224 -0
- package/dist/tools/memory-hooks.d.ts +67 -0
- package/dist/tools/memory-hooks.js +102 -0
- package/dist/tools/memory-working.d.ts +98 -0
- package/dist/tools/memory-working.js +101 -0
- package/dist/tools/memory_capture_turn.d.ts +66 -0
- package/dist/tools/memory_capture_turn.js +85 -0
- package/dist/tools/memory_consolidate.d.ts +55 -0
- package/dist/tools/memory_consolidate.js +176 -0
- package/dist/tools/memory_contradictions.d.ts +53 -0
- package/dist/tools/memory_contradictions.js +52 -0
- package/dist/tools/memory_graph_query.d.ts +51 -0
- package/dist/tools/memory_graph_query.js +35 -0
- package/dist/tools/memory_mark_cited.d.ts +43 -0
- package/dist/tools/memory_mark_cited.js +63 -0
- package/dist/tools/memory_recall.d.ts +77 -0
- package/dist/tools/memory_recall.js +81 -0
- package/dist/tools/memory_register_skill_hints.d.ts +49 -0
- package/dist/tools/memory_register_skill_hints.js +55 -0
- package/dist/tools/memory_resolve_session.d.ts +24 -0
- package/dist/tools/memory_resolve_session.js +133 -0
- package/dist/tools/memory_search.d.ts +146 -0
- package/dist/tools/memory_search.js +84 -0
- package/dist/tools/search_skills.d.ts +18 -0
- package/dist/tools/search_skills.js +17 -0
- package/dist/tools/update_doc.d.ts +24 -0
- package/dist/tools/update_doc.js +35 -0
- package/dist/tools/update_skill.d.ts +30 -0
- package/dist/tools/update_skill.js +80 -0
- package/dist/types.d.ts +81 -0
- package/dist/types.js +4 -0
- package/dist/writer.d.ts +30 -0
- package/dist/writer.js +220 -0
- package/docs/TEMPLATE ONLY +1 -0
- package/docs/api/API.md +64 -0
- package/docs/api/security/SECURITY.md +58 -0
- package/docs/deployment/DockerDeployment.md +30 -0
- package/docs/design/Design.md +59 -0
- package/docs/design/themes/apple.md +101 -0
- package/docs/design/themes/dieter-grid.md +100 -0
- package/docs/design/themes/gallery-white.md +100 -0
- package/docs/design/themes/pinterest.md +101 -0
- package/docs/design/themes/realty-open-house.md +101 -0
- package/docs/design/themes/vodafone.md +101 -0
- package/docs/hooks/Hooks.md +30 -0
- package/docs/schema/Schema.md +35 -0
- package/docs/strategy/ScalingStrategy.md +19 -0
- package/package.json +88 -0
- package/references/accessibility-checklist.md +160 -0
- package/references/orchestration-patterns.md +370 -0
- package/references/performance-checklist.md +153 -0
- package/references/security-checklist.md +134 -0
- package/references/testing-patterns.md +236 -0
- package/skills/agent/adr-skill/SKILL.md +299 -0
- package/skills/agent/agentic-engineering-workflow/SKILL.md +95 -0
- package/skills/agent/bootstrap-skill/SKILL.md +103 -0
- package/skills/agent/context-engineering/SKILL.md +307 -0
- package/skills/agent/debugging-and-error-recovery/SKILL.md +308 -0
- package/skills/agent/developer-growth-analysis/SKILL.md +328 -0
- package/skills/agent/doubt-driven-skill/SKILL.md +249 -0
- package/skills/agent/handover-skill/SKILL.md +112 -0
- package/skills/agent/idea-refine-skill/SKILL.md +185 -0
- package/skills/agent/idea-refine-skill/examples.md +238 -0
- package/skills/agent/idea-refine-skill/frameworks.md +99 -0
- package/skills/agent/idea-refine-skill/refinement-criteria.md +113 -0
- package/skills/agent/interview-skill/SKILL.md +226 -0
- package/skills/agent/planning-skill/SKILL.md +270 -0
- package/skills/agent/skill-authoring/SKILL.md +189 -0
- package/skills/agent/source-driven-skill/SKILL.md +197 -0
- package/skills/agent/spec-driven-skill/SKILL.md +221 -0
- package/skills/agent/sync-skill/SKILL.md +92 -0
- package/skills/agent/using-agent-skills/SKILL.md +189 -0
- package/skills/api/a11y-skill/SKILL.md +88 -0
- package/skills/api/api-skill/SKILL.md +123 -0
- package/skills/api/auth-skill/SKILL.md +80 -0
- package/skills/api/debug-skill/SKILL.md +535 -0
- package/skills/api/performance-skill/SKILL.md +100 -0
- package/skills/api/testing-skill/SKILL.md +100 -0
- package/skills/codebase/code-review-and-quality/SKILL.md +228 -0
- package/skills/codebase/code-simplification/SKILL.md +352 -0
- package/skills/codebase/code-structure-cleanup/SKILL.md +142 -0
- package/skills/codebase/concerns-skill/SKILL.md +89 -0
- package/skills/codebase/conventions-skill/SKILL.md +95 -0
- package/skills/codebase/doc-management-skill/SKILL.md +47 -0
- package/skills/codebase/git-workflow-skill/SKILL.md +312 -0
- package/skills/communication/1-3-1-rule/SKILL.md +120 -0
- package/skills/design/brutalist-skill/SKILL.md +131 -0
- package/skills/design/concept-diagrams/SKILL.md +387 -0
- package/skills/design/concept-diagrams/examples/apartment-floor-plan-conversion.md +244 -0
- package/skills/design/concept-diagrams/examples/automated-password-reset-flow.md +276 -0
- package/skills/design/concept-diagrams/examples/autonomous-llm-research-agent-flow.md +240 -0
- package/skills/design/concept-diagrams/examples/banana-journey-tree-to-smoothie.md +161 -0
- package/skills/design/concept-diagrams/examples/commercial-aircraft-structure.md +209 -0
- package/skills/design/concept-diagrams/examples/cpu-ooo-microarchitecture.md +236 -0
- package/skills/design/concept-diagrams/examples/electricity-grid-flow.md +182 -0
- package/skills/design/concept-diagrams/examples/feature-film-production-pipeline.md +172 -0
- package/skills/design/concept-diagrams/examples/hospital-emergency-department-flow.md +165 -0
- package/skills/design/concept-diagrams/examples/ml-benchmark-grouped-bar-chart.md +114 -0
- package/skills/design/concept-diagrams/examples/place-order-uml-sequence.md +325 -0
- package/skills/design/concept-diagrams/examples/smart-city-infrastructure.md +173 -0
- package/skills/design/concept-diagrams/examples/smartphone-layer-anatomy.md +154 -0
- package/skills/design/concept-diagrams/examples/sn2-reaction-mechanism.md +247 -0
- package/skills/design/concept-diagrams/examples/wind-turbine-structure.md +338 -0
- package/skills/design/concept-diagrams/references/dashboard-patterns.md +43 -0
- package/skills/design/concept-diagrams/references/infrastructure-patterns.md +144 -0
- package/skills/design/concept-diagrams/references/physical-shape-cookbook.md +42 -0
- package/skills/design/concept-diagrams/templates/template.html +174 -0
- package/skills/design/gpt-tasteskill/SKILL.md +114 -0
- package/skills/design/minimalist-skill/SKILL.md +116 -0
- package/skills/design/output-skill/SKILL.md +87 -0
- package/skills/design/redesign-skill/SKILL.md +213 -0
- package/skills/design/soft-skill/SKILL.md +132 -0
- package/skills/design/stitch-skill/EXAMPLE.md +121 -0
- package/skills/design/stitch-skill/SKILL.md +222 -0
- package/skills/design/taste-skill/SKILL.md +269 -0
- package/skills/devops/ci-cd-skill/SKILL.md +402 -0
- package/skills/devops/docker-skill/SKILL.md +297 -0
- package/skills/devops/domain-skill/SKILL.md +234 -0
- package/skills/lifecycle/changelog-generator/SKILL.md +135 -0
- package/skills/lifecycle/incremental-skill/SKILL.md +257 -0
- package/skills/lifecycle/migration-skill/SKILL.md +218 -0
- package/skills/lifecycle/shipping-skill/SKILL.md +321 -0
- package/skills/memory/agent-memory/SKILL.md +122 -0
- package/skills/qa/browser-testing-skill/SKILL.md +314 -0
- package/skills/ux/adversarial-ux-skill/SKILL.md +168 -0
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: domain-skill
|
|
3
|
+
description: Architect production-ready domain routing. Configure reverse proxies (e.g., Traefik), SSL/TLS certificates, and Cloudflare tunnels for secure public access.
|
|
4
|
+
hints: |
|
|
5
|
+
- Always identify the primary hostnames (e.g. app.domain.com, api.domain.com) before structuring routing.
|
|
6
|
+
- Review Traefik labels in docker-compose.yml to ensure correct entrypoint and rule mappings.
|
|
7
|
+
- Use Cloudflare Zero Trust tunnels to establish secure outbound-only ingress paths without exposing local ports.
|
|
8
|
+
- Set up environment variables (like DOMAIN, CORS_ORIGIN, and WebAuthn relying party IDs) dynamically.
|
|
9
|
+
- Test routing and certificate issuance sequentially, beginning with Flexible TLS before strict enforcement.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Custom Domain & Networking
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
A robust routing architecture ensures secure, encrypted public access to backend and frontend services. This skill guides the setup of production-ready routing using reverse proxies (e.g., Traefik v3) coupled with secure edge ingress (e.g., Cloudflare Tunnels) to direct external traffic cleanly to containerized services without exposing local ports.
|
|
17
|
+
|
|
18
|
+
## Ingress Architecture
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
Browser
|
|
22
|
+
│ HTTPS (TLS terminated by Cloudflare)
|
|
23
|
+
▼
|
|
24
|
+
Cloudflare Edge (api.yourdomain.com)
|
|
25
|
+
│ Outbound tunnel (no open ports needed)
|
|
26
|
+
▼
|
|
27
|
+
cloudflared daemon ← Docker container, profile: production
|
|
28
|
+
│ HTTP http://traefik:80
|
|
29
|
+
▼
|
|
30
|
+
Traefik v3 ← traefik container
|
|
31
|
+
│ HTTP :3001
|
|
32
|
+
▼
|
|
33
|
+
Node.js / Express ← backend container
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
> Local dev skips cloudflared entirely. Traefik routes `Host(\`localhost\`)` directly.
|
|
37
|
+
|
|
38
|
+
---
|
|
39
|
+
|
|
40
|
+
## Environment Variables
|
|
41
|
+
|
|
42
|
+
Ensure the following networking environment variables are configured in the `.env` or deployment settings:
|
|
43
|
+
|
|
44
|
+
| Variable | Dev value | Prod value | Purpose |
|
|
45
|
+
|---|---|---|---|
|
|
46
|
+
| `DOMAIN` | `api.yourdomain.com` | `api.yourdomain.com` | Traefik HTTPS router host rule |
|
|
47
|
+
| `ACME_EMAIL` | `admin@yourdomain.com` | `admin@yourdomain.com` | Let's Encrypt certificate contact |
|
|
48
|
+
| `CLOUDFLARE_TUNNEL_TOKEN` | *(blank)* | `<token from CF dashboard>` | Authenticates cloudflared to Cloudflare |
|
|
49
|
+
| `FRONTEND_URL` | `http://localhost:3000` | `https://yourdomain.com` | Email link base URL |
|
|
50
|
+
| `CORS_ORIGIN` | `http://localhost:3000,https://yourdomain.com` | `https://yourdomain.com` | Allowed CORS origins |
|
|
51
|
+
| `PASSKEY_RP_ID` | `localhost` | `yourdomain.com` | WebAuthn Relying Party ID |
|
|
52
|
+
| `PASSKEY_ORIGIN` | `http://localhost:3000` | `https://yourdomain.com` | WebAuthn allowed origin |
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Traefik Router Setup
|
|
57
|
+
|
|
58
|
+
Two routers are typically configured in `docker-compose.yml` on the `backend` service:
|
|
59
|
+
|
|
60
|
+
### HTTP Router (always active)
|
|
61
|
+
|
|
62
|
+
```yaml
|
|
63
|
+
- "traefik.http.routers.backend.rule=Host(`localhost`) || Host(`api.yourdomain.com`)"
|
|
64
|
+
- "traefik.http.routers.backend.entrypoints=web"
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
Accepts both `localhost` (dev) and `api.yourdomain.com` (prod via cloudflared HTTP passthrough).
|
|
68
|
+
|
|
69
|
+
### HTTPS Router (activates with Cloudflare Full strict)
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
- "traefik.http.routers.backend-secure.rule=Host(`api.yourdomain.com`)"
|
|
73
|
+
- "traefik.http.routers.backend-secure.entrypoints=websecure"
|
|
74
|
+
- "traefik.http.routers.backend-secure.tls=true"
|
|
75
|
+
- "traefik.http.routers.backend-secure.tls.certresolver=letsencrypt"
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Traefik will auto-issue a Let's Encrypt cert once `api.yourdomain.com` is publicly resolvable.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## Cloudflare SSL Mode Decision
|
|
83
|
+
|
|
84
|
+
| Mode | When to use | Traefik TLS needed? |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| **Flexible** | Dev/staging; simplest setup | ❌ No |
|
|
87
|
+
| **Full** | Traefik has any cert (even self-signed) | ✅ Yes |
|
|
88
|
+
| **Full (strict)** | Production; Traefik has valid Let's Encrypt cert | ✅ Yes |
|
|
89
|
+
|
|
90
|
+
> **Recommended:** Start with **Flexible** to verify connectivity, then switch to **Full (strict)** once the domain is proven reachable and Let's Encrypt issues the cert.
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## Workflow
|
|
95
|
+
|
|
96
|
+
### Step 1 — Create the tunnel
|
|
97
|
+
|
|
98
|
+
1. Go to [Cloudflare Zero Trust](https://one.dash.cloudflare.com) → **Networks → Tunnels → Create a tunnel**
|
|
99
|
+
2. Choose **Cloudflared** connector
|
|
100
|
+
3. Name the tunnel `app-tunnel`
|
|
101
|
+
4. Copy the **tunnel token** — this is your `CLOUDFLARE_TUNNEL_TOKEN`
|
|
102
|
+
|
|
103
|
+
### Step 2 — Configure Public Hostname
|
|
104
|
+
|
|
105
|
+
In the tunnel settings, add a Public Hostname:
|
|
106
|
+
|
|
107
|
+
| Field | Value |
|
|
108
|
+
|---|---|
|
|
109
|
+
| Subdomain | `api` |
|
|
110
|
+
| Domain | `yourdomain.com` |
|
|
111
|
+
| Service Type | `HTTP` |
|
|
112
|
+
| Service URL | `traefik:80` |
|
|
113
|
+
|
|
114
|
+
Cloudflare will automatically create the DNS record:
|
|
115
|
+
|
|
116
|
+
| Type | Name | Target | Proxy |
|
|
117
|
+
|---|---|---|---|
|
|
118
|
+
| CNAME | `api` | `<tunnel-id>.cfargotunnel.com` | ✅ Proxied |
|
|
119
|
+
|
|
120
|
+
### Step 3 — Add token to `.env`
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
# .env
|
|
124
|
+
CLOUDFLARE_TUNNEL_TOKEN=<paste token here>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Step 4 — Start cloudflared
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# Only starts services with the production profile
|
|
131
|
+
docker compose --profile production up -d cloudflared
|
|
132
|
+
|
|
133
|
+
# Verify connection
|
|
134
|
+
docker logs cloudflared --tail 20
|
|
135
|
+
# Expected: "Connection established" / "Registered tunnel connection"
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### Step 5 — Verify
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# Health check through the full tunnel
|
|
142
|
+
curl https://api.yourdomain.com/health
|
|
143
|
+
# Expected: { "status": "ok", ... }
|
|
144
|
+
|
|
145
|
+
# Check Traefik picked up the new router
|
|
146
|
+
open http://localhost:8080 # Traefik dashboard
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## SSL Mode: Switch to Full (strict)
|
|
152
|
+
|
|
153
|
+
Once Let's Encrypt issues the cert (check Traefik dashboard → TLS), switch Cloudflare:
|
|
154
|
+
|
|
155
|
+
1. Cloudflare dashboard → **SSL/TLS → Overview**
|
|
156
|
+
2. Change mode to **Full (strict)**
|
|
157
|
+
3. No Docker restart needed — Traefik handles this automatically
|
|
158
|
+
|
|
159
|
+
---
|
|
160
|
+
|
|
161
|
+
## Cloudflared Compose Profile
|
|
162
|
+
|
|
163
|
+
The `cloudflared` service uses `profiles: [production]` so it **never starts** during normal dev:
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# Dev (cloudflared excluded)
|
|
167
|
+
docker compose up -d
|
|
168
|
+
|
|
169
|
+
# Production (all services including cloudflared)
|
|
170
|
+
docker compose --profile production up -d
|
|
171
|
+
|
|
172
|
+
# Start cloudflared only (if stack is already running)
|
|
173
|
+
docker compose --profile production up -d cloudflared
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
---
|
|
177
|
+
|
|
178
|
+
## Migration Path: Tunnel → VPS + WireGuard
|
|
179
|
+
|
|
180
|
+
When you move to a dedicated server with a static IP:
|
|
181
|
+
|
|
182
|
+
1. **Remove** `cloudflared` service from docker-compose (or keep as fallback)
|
|
183
|
+
2. **Point** Cloudflare DNS `A` record `api` → `<vps-ip>` (Proxied ✅)
|
|
184
|
+
3. **Open** ports `80` and `443` on the VPS firewall
|
|
185
|
+
4. **Traefik** will handle Let's Encrypt directly via HTTP challenge on port 80
|
|
186
|
+
5. **Update** SSL/TLS mode to **Full (strict)** in Cloudflare
|
|
187
|
+
|
|
188
|
+
The Traefik labels and ACME config in docker-compose remain identical — only the ingress path changes.
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Pitfalls
|
|
193
|
+
|
|
194
|
+
| Problem | Cause | Fix |
|
|
195
|
+
|---|---|---|
|
|
196
|
+
| `curl: (6) Could not resolve host` | DNS not propagated | Wait 1–5 min after Cloudflare saves the CNAME |
|
|
197
|
+
| Tunnel connected but 502 | cloudflared can't reach `traefik:80` | Verify both are on the same docker network; check `docker network inspect` |
|
|
198
|
+
| Let's Encrypt cert not issued | Domain not publicly reachable on port 80 | Use Flexible SSL mode until tunnel is confirmed working |
|
|
199
|
+
| CORS errors in browser | `CORS_ORIGIN` missing origin domain | Add proper origin to `.env` and restart backend |
|
|
200
|
+
| WebAuthn fails on prod | `PASSKEY_RP_ID` still set to `localhost` | Update to the production domain and redeploy |
|
|
201
|
+
| `--profile production` not recognized | Old Docker Compose version | Upgrade to Docker Compose v2.x (`docker compose version`) |
|
|
202
|
+
|
|
203
|
+
## When to Use
|
|
204
|
+
|
|
205
|
+
- Mapping custom domains (e.g., `app.domain.com` or `api.domain.com`) to containerized services.
|
|
206
|
+
- Designing secure ingress architectures via reverse proxies (e.g., Traefik, Nginx) and edge providers (e.g., Cloudflare).
|
|
207
|
+
- Setting up SSL/TLS termination, automated certificate resolvers (Let's Encrypt), or Cloudflare Tunnels (`cloudflared`).
|
|
208
|
+
|
|
209
|
+
**When NOT to use:**
|
|
210
|
+
- Basic local-only dev environments that do not require DNS mapping or secure public access.
|
|
211
|
+
- Deploying on serverless platforms (e.g., Vercel, Netlify) where domain routing is fully managed by the provider.
|
|
212
|
+
|
|
213
|
+
## Common Rationalizations
|
|
214
|
+
|
|
215
|
+
| Rationalization | Reality |
|
|
216
|
+
|---|---|
|
|
217
|
+
| "I will expose the container port directly to the internet." | Exposing service ports directly bypasses reverse proxy benefits (load balancing, SSL termination, request filtering) and introduces massive security vulnerabilities. |
|
|
218
|
+
| "I'll use HTTP in staging to save setup time." | Staging must mimic production. Omitting TLS in staging leads to hidden CORS, WebAuthn, cookie security, or certificate routing errors that only show up in production. |
|
|
219
|
+
| "Setting up Cloudflare tunnels is too slow; I'll just open port 80/443." | Opening incoming ports makes the host machine an active target for automated port scanners. Outbound-only tunnels are vastly more secure. |
|
|
220
|
+
|
|
221
|
+
## Red Flags
|
|
222
|
+
|
|
223
|
+
- Hardcoded domain names in docker-compose configurations instead of environment variables.
|
|
224
|
+
- Using Flexible SSL/TLS modes in production indefinitely without terminating TLS at the reverse proxy (leaves edge-to-origin traffic unencrypted).
|
|
225
|
+
- Mixing production tunnel credentials or domain records directly inside shared development files.
|
|
226
|
+
- Exposing Traefik dashboards publicly without authentication or strong basic auth middlewares.
|
|
227
|
+
|
|
228
|
+
## Verification
|
|
229
|
+
|
|
230
|
+
After completing the domain setup, verify:
|
|
231
|
+
- [ ] Ingress paths are tested and return valid HTTP statuses (e.g., 200 OK, secure 301 redirects).
|
|
232
|
+
- [ ] SSL/TLS certificate is verified as valid and issued by a recognized CA (e.g., Let's Encrypt, Cloudflare Edge).
|
|
233
|
+
- [ ] CORS origins and authentication parameters (e.g., WebAuthn/Passkey RP IDs) match the active host exactly.
|
|
234
|
+
- [ ] Cloudflared connections are confirmed in container logs with `Connection established` and no active errors.
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: changelog-generator
|
|
3
|
+
description: Automatically creates user-facing changelogs from git commits by analyzing commit history, categorizing changes, and transforming technical commits into clear, customer-friendly release notes. Turns hours of manual changelog writing into minutes of automated generation.
|
|
4
|
+
hints:
|
|
5
|
+
- Check openSrc/ or existing project files for CHANGELOG.md patterns and formats if available.
|
|
6
|
+
- Exclude developer-only noise (e.g. chore, simple refactoring, config updates) from user-facing logs.
|
|
7
|
+
- Group additions into cohesive, standard categories: Features, Improvements, Bug Fixes, Breaking Changes, Security.
|
|
8
|
+
- Translate technical implementation terms (e.g., class names, SQL keys) into user-facing benefits and actions.
|
|
9
|
+
- Highlight breaking changes or required migration steps prominently at the top of the changelog notes.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Changelog Generator
|
|
13
|
+
|
|
14
|
+
This skill transforms technical git commits into polished, user-friendly changelogs that your customers and users will actually understand and appreciate.
|
|
15
|
+
|
|
16
|
+
## When to Use This Skill
|
|
17
|
+
|
|
18
|
+
- Preparing release notes for a new version
|
|
19
|
+
- Creating weekly or monthly product update summaries
|
|
20
|
+
- Documenting changes for customers
|
|
21
|
+
- Writing changelog entries for app store submissions
|
|
22
|
+
- Generating update notifications
|
|
23
|
+
- Creating internal release documentation
|
|
24
|
+
- Maintaining a public changelog/product updates page
|
|
25
|
+
|
|
26
|
+
## Overview
|
|
27
|
+
|
|
28
|
+
1. **Scans Git History**: Analyzes commits from a specific time period or between versions
|
|
29
|
+
2. **Categorizes Changes**: Groups commits into logical categories (features, improvements, bug fixes, breaking changes, security)
|
|
30
|
+
3. **Translates Technical → User-Friendly**: Converts developer commits into customer language
|
|
31
|
+
4. **Formats Professionally**: Creates clean, structured changelog entries
|
|
32
|
+
5. **Filters Noise**: Excludes internal commits (refactoring, tests, etc.)
|
|
33
|
+
6. **Follows Best Practices**: Applies changelog guidelines and your brand voice
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
## Workflow
|
|
37
|
+
|
|
38
|
+
1. Identify release scope (version range, commit range, or date range).
|
|
39
|
+
2. Gather relevant commits and exclude maintenance noise.
|
|
40
|
+
3. Group changes into user-facing categories.
|
|
41
|
+
4. Rewrite each item in plain customer language.
|
|
42
|
+
5. Format output as publish-ready markdown and verify clarity.
|
|
43
|
+
|
|
44
|
+
## Usage
|
|
45
|
+
|
|
46
|
+
### Basic Usage
|
|
47
|
+
|
|
48
|
+
From your project repository:
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
Create a changelog from commits since last release
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
```
|
|
55
|
+
Generate changelog for all commits from the past week
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
```
|
|
59
|
+
Create release notes for version 2.5.0
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
### With Specific Date Range
|
|
63
|
+
|
|
64
|
+
```
|
|
65
|
+
Create a changelog for all commits between March 1 and March 15
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
### With Custom Guidelines
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
Create a changelog for commits since v2.4.0, using my changelog
|
|
72
|
+
guidelines from CHANGELOG_STYLE.md
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
## Example
|
|
76
|
+
|
|
77
|
+
**User**: "Create a changelog for commits from the past 7 days"
|
|
78
|
+
|
|
79
|
+
**Output**:
|
|
80
|
+
```markdown
|
|
81
|
+
# Updates - Week of March 10, 2024
|
|
82
|
+
|
|
83
|
+
## ✨ New Features
|
|
84
|
+
|
|
85
|
+
- **Team Workspaces**: Create separate workspaces for different
|
|
86
|
+
projects. Invite team members and keep everything organized.
|
|
87
|
+
|
|
88
|
+
- **Keyboard Shortcuts**: Press ? to see all available shortcuts.
|
|
89
|
+
Navigate faster without touching your mouse.
|
|
90
|
+
|
|
91
|
+
## 🔧 Improvements
|
|
92
|
+
|
|
93
|
+
- **Faster Sync**: Files now sync 2x faster across devices
|
|
94
|
+
- **Better Search**: Search now includes file contents, not just titles
|
|
95
|
+
|
|
96
|
+
## 🐛 Fixes
|
|
97
|
+
|
|
98
|
+
- Fixed issue where large images wouldn't upload
|
|
99
|
+
- Resolved timezone confusion in scheduled posts
|
|
100
|
+
- Corrected notification badge count
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Inspired by:** Manik Aggarwal's use case from Lenny's Newsletter
|
|
104
|
+
|
|
105
|
+
## Tips
|
|
106
|
+
|
|
107
|
+
- Run from your git repository root
|
|
108
|
+
- Specify date ranges for focused changelogs
|
|
109
|
+
- Use your CHANGELOG_STYLE.md for consistent formatting
|
|
110
|
+
- Review and adjust the generated changelog before publishing
|
|
111
|
+
- Save output directly to CHANGELOG.md
|
|
112
|
+
|
|
113
|
+
## Related Use Cases
|
|
114
|
+
|
|
115
|
+
- Creating GitHub release notes
|
|
116
|
+
- Writing app store update descriptions
|
|
117
|
+
- Generating email updates for users
|
|
118
|
+
- Creating social media announcement posts
|
|
119
|
+
|
|
120
|
+
## Common Rationalizations
|
|
121
|
+
| Rationalization | Reality |
|
|
122
|
+
|---|---|
|
|
123
|
+
| I'll just dump raw commit logs directly. | Raw commits contain internal technical jargon (e.g. `refactor: fix database constraints`) that confuses users. |
|
|
124
|
+
| No one reads changelogs, so formatting doesn't matter. | Well-structured changelogs demonstrate project health, building trust with users and stakeholders. |
|
|
125
|
+
|
|
126
|
+
## Red Flags
|
|
127
|
+
- Including chore commits (`chore: update eslint`) or test commits in user-facing release notes.
|
|
128
|
+
- Highlighting internal module names or database parameters instead of functional product capabilities.
|
|
129
|
+
- Obfuscating or hiding major breaking changes in fine print.
|
|
130
|
+
|
|
131
|
+
## Verification
|
|
132
|
+
After completing the skill, confirm:
|
|
133
|
+
- [ ] Technical jargon is completely rewritten to represent user-facing value and utility.
|
|
134
|
+
- [ ] Internal/engineering noise (tests, configs, refactors) is filtered out.
|
|
135
|
+
- [ ] Markdown formatting is verified clean, readable, and properly categorized.
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: incremental-skill
|
|
3
|
+
description: Delivers changes incrementally. Use when implementing any feature or change that touches more than one file. Use when you're about to write a large amount of code at once, or when a task feels too big to land in one step.
|
|
4
|
+
hints:
|
|
5
|
+
- Check openSrc/ or existing project layouts for modular folder structures if available.
|
|
6
|
+
- Implement code in thin vertical slices (e.g. database schema first, then api route, then frontend UI components).
|
|
7
|
+
- Verify every single micro-slice immediately after implementation via test runner or build suites.
|
|
8
|
+
- Wrap incomplete code blocks behind feature flags before merging to the main branch.
|
|
9
|
+
- Adhere strictly to scope discipline: document out-of-scope issues rather than attempting to refactor them immediately.
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Incremental Implementation
|
|
13
|
+
|
|
14
|
+
## Overview
|
|
15
|
+
|
|
16
|
+
Build in thin vertical slices — implement one piece, test it, verify it, then expand. Avoid implementing an entire feature in one pass. Each increment should leave the system in a working, testable state. This is the execution discipline that makes large features manageable.
|
|
17
|
+
|
|
18
|
+
## When to Use
|
|
19
|
+
|
|
20
|
+
- Implementing any multi-file change
|
|
21
|
+
- Building a new feature from a task breakdown
|
|
22
|
+
- Refactoring existing code
|
|
23
|
+
- Any time you're tempted to write more than ~100 lines before testing
|
|
24
|
+
|
|
25
|
+
**When NOT to use:** Single-file, single-function changes where the scope is already minimal.
|
|
26
|
+
|
|
27
|
+
## The Increment Cycle
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
┌──────────────────────────────────────┐
|
|
31
|
+
│ │
|
|
32
|
+
│ Implement ──→ Test ──→ Verify ──┐ │
|
|
33
|
+
│ ▲ │ │
|
|
34
|
+
│ └───── Commit ◄─────────────┘ │
|
|
35
|
+
│ │ │
|
|
36
|
+
│ ▼ │
|
|
37
|
+
│ Next slice │
|
|
38
|
+
│ │
|
|
39
|
+
└──────────────────────────────────────┘
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
For each slice:
|
|
43
|
+
|
|
44
|
+
1. **Implement** the smallest complete piece of functionality
|
|
45
|
+
2. **Test** — run the test suite (or write a test if none exists)
|
|
46
|
+
3. **Verify** — confirm the slice works as expected (tests pass, build succeeds, manual check)
|
|
47
|
+
4. **Commit** -- save your progress with a descriptive message (see `git-workflow-and-versioning` for atomic commit guidance)
|
|
48
|
+
5. **Move to the next slice** — carry forward, don't restart
|
|
49
|
+
|
|
50
|
+
## Slicing Strategies
|
|
51
|
+
|
|
52
|
+
### Vertical Slices (Preferred)
|
|
53
|
+
|
|
54
|
+
Build one complete path through the stack:
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
Slice 1: Create a task (DB + API + basic UI)
|
|
58
|
+
→ Tests pass, user can create a task via the UI
|
|
59
|
+
|
|
60
|
+
Slice 2: List tasks (query + API + UI)
|
|
61
|
+
→ Tests pass, user can see their tasks
|
|
62
|
+
|
|
63
|
+
Slice 3: Edit a task (update + API + UI)
|
|
64
|
+
→ Tests pass, user can modify tasks
|
|
65
|
+
|
|
66
|
+
Slice 4: Delete a task (delete + API + UI + confirmation)
|
|
67
|
+
→ Tests pass, full CRUD complete
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
Each slice delivers working end-to-end functionality.
|
|
71
|
+
|
|
72
|
+
### Contract-First Slicing
|
|
73
|
+
|
|
74
|
+
When backend and frontend need to develop in parallel:
|
|
75
|
+
|
|
76
|
+
```
|
|
77
|
+
Slice 0: Define the API contract (types, interfaces, OpenAPI spec)
|
|
78
|
+
Slice 1a: Implement backend against the contract + API tests
|
|
79
|
+
Slice 1b: Implement frontend against mock data matching the contract
|
|
80
|
+
Slice 2: Integrate and test end-to-end
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
### Risk-First Slicing
|
|
84
|
+
|
|
85
|
+
Tackle the riskiest or most uncertain piece first:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
Slice 1: Prove the WebSocket connection works (highest risk)
|
|
89
|
+
Slice 2: Build real-time task updates on the proven connection
|
|
90
|
+
Slice 3: Add offline support and reconnection
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
If Slice 1 fails, you discover it before investing in Slices 2 and 3.
|
|
94
|
+
|
|
95
|
+
## Implementation Rules
|
|
96
|
+
|
|
97
|
+
### Rule 0: Simplicity First
|
|
98
|
+
|
|
99
|
+
Before writing any code, ask: "What is the simplest thing that could work?"
|
|
100
|
+
|
|
101
|
+
After writing code, review it against these checks:
|
|
102
|
+
- Can this be done in fewer lines?
|
|
103
|
+
- Are these abstractions earning their complexity?
|
|
104
|
+
- Would a staff engineer look at this and say "why didn't you just..."?
|
|
105
|
+
- Am I building for hypothetical future requirements, or the current task?
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
SIMPLICITY CHECK:
|
|
109
|
+
✗ Generic EventBus with middleware pipeline for one notification
|
|
110
|
+
✓ Simple function call
|
|
111
|
+
|
|
112
|
+
✗ Abstract factory pattern for two similar components
|
|
113
|
+
✓ Two straightforward components with shared utilities
|
|
114
|
+
|
|
115
|
+
✗ Config-driven form builder for three forms
|
|
116
|
+
✓ Three form components
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Three similar lines of code is better than a premature abstraction. Implement the naive, obviously-correct version first. Optimize only after correctness is proven with tests.
|
|
120
|
+
|
|
121
|
+
### Rule 0.5: Scope Discipline
|
|
122
|
+
|
|
123
|
+
Touch only what the task requires.
|
|
124
|
+
|
|
125
|
+
Do NOT:
|
|
126
|
+
- "Clean up" code adjacent to your change
|
|
127
|
+
- Refactor imports in files you're not modifying
|
|
128
|
+
- Remove comments you don't fully understand
|
|
129
|
+
- Add features not in the spec because they "seem useful"
|
|
130
|
+
- Modernize syntax in files you're only reading
|
|
131
|
+
|
|
132
|
+
If you notice something worth improving outside your task scope, note it — don't fix it:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
NOTICED BUT NOT TOUCHING:
|
|
136
|
+
- src/utils/format.ts has an unused import (unrelated to this task)
|
|
137
|
+
- The auth middleware could use better error messages (separate task)
|
|
138
|
+
→ Want me to create tasks for these?
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Rule 1: One Thing at a Time
|
|
142
|
+
|
|
143
|
+
Each increment changes one logical thing. Don't mix concerns:
|
|
144
|
+
|
|
145
|
+
**Bad:** One commit that adds a new component, refactors an existing one, and updates the build config.
|
|
146
|
+
|
|
147
|
+
**Good:** Three separate commits — one for each change.
|
|
148
|
+
|
|
149
|
+
### Rule 2: Keep It Compilable
|
|
150
|
+
|
|
151
|
+
After each increment, the project must build and existing tests must pass. Don't leave the codebase in a broken state between slices.
|
|
152
|
+
|
|
153
|
+
### Rule 3: Feature Flags for Incomplete Features
|
|
154
|
+
|
|
155
|
+
If a feature isn't ready for users but you need to merge increments:
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
// Feature flag for work-in-progress
|
|
159
|
+
const ENABLE_TASK_SHARING = process.env.FEATURE_TASK_SHARING === 'true';
|
|
160
|
+
|
|
161
|
+
if (ENABLE_TASK_SHARING) {
|
|
162
|
+
// New sharing UI
|
|
163
|
+
}
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
This lets you merge small increments to the main branch without exposing incomplete work.
|
|
167
|
+
|
|
168
|
+
### Rule 4: Safe Defaults
|
|
169
|
+
|
|
170
|
+
New code should default to safe, conservative behavior:
|
|
171
|
+
|
|
172
|
+
```typescript
|
|
173
|
+
// Safe: disabled by default, opt-in
|
|
174
|
+
export function createTask(data: TaskInput, options?: { notify?: boolean }) {
|
|
175
|
+
const shouldNotify = options?.notify ?? false;
|
|
176
|
+
// ...
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Rule 5: Rollback-Friendly
|
|
181
|
+
|
|
182
|
+
Each increment should be independently revertable:
|
|
183
|
+
|
|
184
|
+
- Additive changes (new files, new functions) are easy to revert
|
|
185
|
+
- Modifications to existing code should be minimal and focused
|
|
186
|
+
- Database migrations should have corresponding rollback migrations
|
|
187
|
+
- Avoid deleting something in one commit and replacing it in the same commit — separate them
|
|
188
|
+
|
|
189
|
+
## Working with Agents
|
|
190
|
+
|
|
191
|
+
When directing an agent to implement incrementally:
|
|
192
|
+
|
|
193
|
+
```
|
|
194
|
+
"Let's implement Task 3 from the plan.
|
|
195
|
+
|
|
196
|
+
Start with just the database schema change and the API endpoint.
|
|
197
|
+
Don't touch the UI yet — we'll do that in the next increment.
|
|
198
|
+
|
|
199
|
+
After implementing, run `npm test` and `npm run build` to verify
|
|
200
|
+
nothing is broken."
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
Be explicit about what's in scope and what's NOT in scope for each increment.
|
|
204
|
+
|
|
205
|
+
## Increment Checklist
|
|
206
|
+
|
|
207
|
+
After each increment, verify:
|
|
208
|
+
|
|
209
|
+
- [ ] The change does one thing and does it completely
|
|
210
|
+
- [ ] All existing tests still pass (`npm test`)
|
|
211
|
+
- [ ] The build succeeds (`npm run build`)
|
|
212
|
+
- [ ] Type checking passes (`npx tsc --noEmit`)
|
|
213
|
+
- [ ] Linting passes (`npm run lint`)
|
|
214
|
+
- [ ] The new functionality works as expected
|
|
215
|
+
- [ ] The change is committed with a descriptive message
|
|
216
|
+
|
|
217
|
+
**Note:** Run each verification command after a change that could affect it. After a successful run, don't repeat the same command unless the code has changed since — re-running on unchanged code adds no information.
|
|
218
|
+
|
|
219
|
+
## Common Rationalizations
|
|
220
|
+
|
|
221
|
+
| Rationalization | Reality |
|
|
222
|
+
|---|---|
|
|
223
|
+
| "I'll test it all at the end" | Bugs compound. A bug in Slice 1 makes Slices 2-5 wrong. Test each slice. |
|
|
224
|
+
| "It's faster to do it all at once" | It *feels* faster until something breaks and you can't find which of 500 changed lines caused it. |
|
|
225
|
+
| "These changes are too small to commit separately" | Small commits are free. Large commits hide bugs and make rollbacks painful. |
|
|
226
|
+
| "I'll add the feature flag later" | If the feature isn't complete, it shouldn't be user-visible. Add the flag now. |
|
|
227
|
+
| "This refactor is small enough to include" | Refactors mixed with features make both harder to review and debug. Separate them. |
|
|
228
|
+
| "Let me run the build command again just to be sure" | After a successful run, repeating the same command adds nothing unless the code has changed since. Run it again after subsequent edits, not as reassurance. |
|
|
229
|
+
|
|
230
|
+
## Red Flags
|
|
231
|
+
|
|
232
|
+
- More than 100 lines of code written without running tests
|
|
233
|
+
- Multiple unrelated changes in a single increment
|
|
234
|
+
- "Let me just quickly add this too" scope expansion
|
|
235
|
+
- Skipping the test/verify step to move faster
|
|
236
|
+
- Build or tests broken between increments
|
|
237
|
+
- Large uncommitted changes accumulating
|
|
238
|
+
- Building abstractions before the third use case demands it
|
|
239
|
+
- Touching files outside the task scope "while I'm here"
|
|
240
|
+
- Creating new utility files for one-time operations
|
|
241
|
+
- Running the same build/test command twice in a row without any intervening code change
|
|
242
|
+
|
|
243
|
+
## Required Checks
|
|
244
|
+
|
|
245
|
+
After completing all increments for a task:
|
|
246
|
+
|
|
247
|
+
- [ ] Each increment was individually tested and committed.
|
|
248
|
+
- [ ] The full test suite passes.
|
|
249
|
+
- [ ] The build is clean and error-free.
|
|
250
|
+
- [ ] The feature works end-to-end as specified.
|
|
251
|
+
- [ ] No uncommitted files or styling junk are left behind.
|
|
252
|
+
|
|
253
|
+
## Verification
|
|
254
|
+
After completing the skill, confirm:
|
|
255
|
+
- [ ] Each micro-slice is verified functionally and committed with an atomic, conventional message.
|
|
256
|
+
- [ ] Build processes and lint suites run successfully without errors or warnings.
|
|
257
|
+
- [ ] Scope discipline has been strictly observed, and no out-of-scope code changes were introduced.
|