tillerhand 3.43.0 → 3.47.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/agents/board-chair.md +20 -20
- package/.claude/agents/code-reviewer.md +20 -20
- package/.claude/agents/council-advisor.md +14 -14
- package/.claude/agents/security-auditor.md +30 -30
- package/.claude/agents/test-writer.md +22 -22
- package/.claude/board/board-ai.md +25 -25
- package/.claude/board/board-api.md +25 -25
- package/.claude/board/board-architect.md +28 -28
- package/.claude/board/board-devops.md +25 -25
- package/.claude/board/board-mobile.md +25 -25
- package/.claude/board/board-performance.md +24 -24
- package/.claude/board/board-privacy.md +25 -25
- package/.claude/board/board-product.md +26 -26
- package/.claude/board/board-qa.md +28 -28
- package/.claude/board/board-ux.md +26 -26
- package/.claude/board/council.md +76 -76
- package/.claude/board/rules.md +61 -61
- package/.claude/claude-security-guidance.md +10 -10
- package/.claude/commands/adopt.md +70 -69
- package/.claude/commands/ask-mode.md +9 -9
- package/.claude/commands/board.md +15 -15
- package/.claude/commands/build.md +47 -47
- package/.claude/commands/dashboard.md +17 -17
- package/.claude/commands/design.md +31 -31
- package/.claude/commands/findings-all.md +14 -14
- package/.claude/commands/findings-business.md +7 -7
- package/.claude/commands/findings-legal.md +7 -7
- package/.claude/commands/findings-perf.md +7 -7
- package/.claude/commands/findings-security.md +9 -9
- package/.claude/commands/findings-tech.md +7 -7
- package/.claude/commands/findings-ux.md +7 -7
- package/.claude/commands/fix-bug.md +15 -15
- package/.claude/commands/freeze.md +8 -8
- package/.claude/commands/handoff.md +38 -38
- package/.claude/commands/kit-update.md +17 -14
- package/.claude/commands/language.md +13 -0
- package/.claude/commands/maintain.md +19 -19
- package/.claude/commands/plan-task.md +32 -32
- package/.claude/commands/qa.md +17 -17
- package/.claude/commands/release.md +40 -40
- package/.claude/commands/research.md +31 -31
- package/.claude/commands/retro.md +32 -32
- package/.claude/commands/review-changes.md +15 -15
- package/.claude/commands/rollback.md +24 -24
- package/.claude/commands/start.md +116 -113
- package/.claude/commands/tools.md +11 -11
- package/.claude/commands/user-feedback.md +11 -11
- package/.claude/commands/wrap-up.md +18 -18
- package/.claude/findings/lenses/business.md +24 -24
- package/.claude/findings/lenses/legal.md +29 -29
- package/.claude/findings/lenses/perf.md +19 -19
- package/.claude/findings/lenses/security.md +30 -30
- package/.claude/findings/lenses/tech.md +23 -23
- package/.claude/findings/lenses/ux.md +19 -19
- package/.claude/findings/protocol.md +54 -54
- package/.claude/findings/report-template.md +30 -30
- package/.claude/hooks/budget.mjs +7 -7
- package/.claude/hooks/checkpoint.mjs +12 -12
- package/.claude/hooks/commit-gate.mjs +38 -37
- package/.claude/hooks/cost.mjs +2 -2
- package/.claude/hooks/council.mjs +3 -3
- package/.claude/hooks/dashboard-data.mjs +4 -3
- package/.claude/hooks/dashboard.mjs +164 -149
- package/.claude/hooks/destructive-guard.mjs +74 -64
- package/.claude/hooks/edit-rounds.mjs +3 -3
- package/.claude/hooks/flow.mjs +10 -10
- package/.claude/hooks/freeze-guard.mjs +27 -23
- package/.claude/hooks/gate.mjs +25 -25
- package/.claude/hooks/guard-secrets.mjs +11 -11
- package/.claude/hooks/lang.mjs +114 -0
- package/.claude/hooks/messages.mjs +495 -0
- package/.claude/hooks/models.mjs +14 -11
- package/.claude/hooks/notify.mjs +3 -2
- package/.claude/hooks/package-gate.mjs +17 -15
- package/.claude/hooks/plugins-sync.mjs +9 -9
- package/.claude/hooks/prefs.mjs +19 -19
- package/.claude/hooks/preview.mjs +11 -11
- package/.claude/hooks/progress.mjs +14 -14
- package/.claude/hooks/qa-report.mjs +11 -10
- package/.claude/hooks/reminder.mjs +6 -3
- package/.claude/hooks/session-start.mjs +23 -17
- package/.claude/hooks/shared.mjs +1 -1
- package/.claude/hooks/status-read.mjs +5 -4
- package/.claude/hooks/statusline.mjs +14 -11
- package/.claude/hooks/structure-guard.mjs +9 -9
- package/.claude/hooks/test-guard.mjs +12 -12
- package/.claude/hooks/tools.mjs +28 -29
- package/.claude/hooks/usage.mjs +18 -15
- package/.claude/output-styles/anlatici.md +28 -28
- package/.claude/security-patterns.json +3 -3
- package/.claude/settings.json +2 -0
- package/.claude/skills/logo-design/SKILL.md +42 -42
- package/.claude/skills/motion-video/SKILL.md +52 -52
- package/.claude/skills/source-research/SKILL.md +35 -35
- package/.claude/skills/ui-motion/SKILL.md +38 -38
- package/.github/workflows/kit-tests.yml +7 -7
- package/.github/workflows/npm-publish.yml +16 -16
- package/AGENTS.md +56 -56
- package/CHANGELOG.md +7 -7
- package/CLAUDE.md +5 -5
- package/README.md +199 -172
- package/README.tr.md +292 -0
- package/docs/architecture/overview.md +31 -31
- package/docs/architecture/stack.md +2 -2
- package/docs/archive/README.md +4 -4
- package/docs/decisions/adr-template.md +14 -14
- package/docs/decisions/log.md +10 -10
- package/docs/findings/README.md +13 -13
- package/docs/findings/config.md +13 -13
- package/docs/legal/privacy-kvkk.md +1 -1
- package/docs/operations/accounts.md +25 -25
- package/docs/operations/deploy-setup.md +64 -64
- package/docs/operations/feature-flags.md +17 -17
- package/docs/operations/maintenance.md +48 -48
- package/docs/operations/release-checklist.md +61 -61
- package/docs/operations/spend-alarms.md +28 -28
- package/docs/product/feedback.md +9 -8
- package/docs/product/glossary.md +16 -16
- package/docs/product/launch.md +28 -28
- package/docs/product/prd.md +43 -42
- package/docs/product/roadmap.md +31 -30
- package/docs/product/specs/_template.md +13 -12
- package/docs/product/unit-economics.md +23 -22
- package/docs/quality/metrics.md +14 -14
- package/docs/quality/retros.md +11 -11
- package/docs/quality/test-plan.md +48 -48
- package/docs/security/checklist.md +57 -57
- package/docs/workflow/board.md +7 -7
- package/docs/workflow/cost-log.md +4 -4
- package/docs/workflow/decision-protocol.md +70 -70
- package/docs/workflow/learning.md +4 -4
- package/docs/workflow/mcp-catalog.md +31 -31
- package/docs/workflow/models.md +35 -35
- package/docs/workflow/progress.md +7 -7
- package/docs/workflow/skills.md +108 -108
- package/docs/workflow/usage-limits.md +62 -62
- package/kit/CHANGELOG.md +882 -841
- package/kit/VERSION +1 -1
- package/kit/guide.html +713 -477
- package/kit/guide.tr.html +1328 -0
- package/kit/kit.mjs +56 -54
- package/kit/project/README.md +29 -29
- package/kit/project/gitignore +12 -12
- package/kit/templates/addons/ai/.env.example.append +5 -5
- package/kit/templates/addons/ai/ai/evals/README.md +11 -11
- package/kit/templates/addons/ai/ai/evals/cases.jsonl +2 -2
- package/kit/templates/addons/ai/ai/prompts/README.md +8 -8
- package/kit/templates/addons/ai/docs/ai/guide.md +56 -56
- package/kit/templates/backend/.claude/hooks/format.mjs +1 -1
- package/kit/templates/backend/.claude/structure.json +1 -1
- package/kit/templates/backend/.env.example +6 -6
- package/kit/templates/backend/.github/dependabot.yml +1 -1
- package/kit/templates/backend/.github/workflows/ci.yml +13 -13
- package/kit/templates/backend/.github/workflows/claude-ci-fix.yml +19 -19
- package/kit/templates/backend/.github/workflows/claude-maintenance.yml +18 -18
- package/kit/templates/backend/.github/workflows/live-monitoring.yml +14 -14
- package/kit/templates/backend/.pre-commit-config.yaml +3 -3
- package/kit/templates/backend/docs/architecture/stack.md +98 -98
- package/kit/templates/backend/docs/architecture/structure.md +34 -34
- package/kit/templates/mobile/.claude/structure.json +1 -1
- package/kit/templates/mobile/.env.example +6 -6
- package/kit/templates/mobile/.github/dependabot.yml +2 -2
- package/kit/templates/mobile/.github/workflows/ci.yml +18 -18
- package/kit/templates/mobile/.github/workflows/claude-ci-fix.yml +19 -19
- package/kit/templates/mobile/.github/workflows/claude-maintenance.yml +18 -18
- package/kit/templates/mobile/.gitignore.append +2 -2
- package/kit/templates/mobile/docs/architecture/stack.md +113 -113
- package/kit/templates/mobile/docs/architecture/structure.md +33 -33
- package/kit/templates/mobile/docs/design/design-guide.md +37 -37
- package/kit/templates/mobile/tests/security/rls.mjs +22 -22
- package/kit/templates/web-saas/.claude/structure.json +1 -1
- package/kit/templates/web-saas/.env.example +11 -11
- package/kit/templates/web-saas/.github/dependabot.yml +3 -3
- package/kit/templates/web-saas/.github/workflows/ci.yml +20 -20
- package/kit/templates/web-saas/.github/workflows/claude-ci-fix.yml +19 -19
- package/kit/templates/web-saas/.github/workflows/claude-maintenance.yml +18 -18
- package/kit/templates/web-saas/.github/workflows/live-monitoring.yml +12 -12
- package/kit/templates/web-saas/docs/architecture/stack.md +116 -116
- package/kit/templates/web-saas/docs/architecture/structure.md +44 -44
- package/kit/templates/web-saas/docs/design/design-guide.md +38 -38
- package/kit/templates/web-saas/tests/live/smoke.spec.ts +4 -4
- package/kit/templates/web-saas/tests/security/rls.mjs +22 -22
- package/kit/tools/codex/.codex/hooks.json +1 -1
- package/package.json +2 -2
- package/README.en.md +0 -267
package/kit/guide.html
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
<!doctype html>
|
|
2
|
-
<html lang="
|
|
2
|
+
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
|
6
|
-
<title>TillerHand ·
|
|
7
|
-
<meta name="description" content="TillerHand
|
|
6
|
+
<title>TillerHand · The AI writes the code, you steer</title>
|
|
7
|
+
<meta name="description" content="TillerHand is a starter kit that takes a product from idea to production and maintenance with Claude Code. The AI writes the code; you make the decisions.">
|
|
8
8
|
<link rel="icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 72 72'%3E%3Ccircle cx='36' cy='36' r='30' fill='none' stroke='%230f172a' stroke-width='6'/%3E%3Cpath d='M36 36 L57 15' stroke='%232a78d6' stroke-width='6' stroke-linecap='round'/%3E%3Ccircle cx='57' cy='15' r='10' fill='%232a78d6'/%3E%3C/svg%3E">
|
|
9
9
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
10
10
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
@@ -66,7 +66,7 @@ p { margin: 0 0 1em; }
|
|
|
66
66
|
:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 6px; }
|
|
67
67
|
.container { max-width: 1160px; margin: 0 auto; padding: 0 24px; }
|
|
68
68
|
|
|
69
|
-
/*
|
|
69
|
+
/* Top menu */
|
|
70
70
|
.nav { position: sticky; top: 0; z-index: 20; background: color-mix(in srgb, var(--bg) 85%, transparent); backdrop-filter: saturate(1.4) blur(10px); border-bottom: 1px solid var(--line); }
|
|
71
71
|
.nav .container { display: flex; align-items: center; gap: 24px; height: 60px; }
|
|
72
72
|
.brand { display: flex; align-items: center; gap: 10px; font-weight: 800; font-size: 18px; color: var(--fg); letter-spacing: -.02em; }
|
|
@@ -81,6 +81,10 @@ p { margin: 0 0 1em; }
|
|
|
81
81
|
.btn.primary:hover { background: var(--accent-ink); }
|
|
82
82
|
.btn.ghost { border-color: var(--line-strong); color: var(--fg); background: var(--surface); }
|
|
83
83
|
.btn.small { height: 36px; padding: 0 14px; font-size: 14px; }
|
|
84
|
+
.lang { display: inline-flex; flex: none; gap: 2px; padding: 2px; border: 1px solid var(--line-strong); border-radius: 999px; background: var(--surface); font-size: 13px; font-weight: 600; line-height: 1.2; }
|
|
85
|
+
.lang a, .lang span { padding: 4px 11px; border-radius: 999px; color: var(--muted); }
|
|
86
|
+
.lang a:hover { color: var(--fg); text-decoration: none; }
|
|
87
|
+
.lang span[aria-current="true"] { background: var(--accent-soft); color: var(--accent-ink); }
|
|
84
88
|
|
|
85
89
|
/* Hero */
|
|
86
90
|
.hero { padding: 88px 0 72px; background: radial-gradient(1000px 420px at 85% -10%, var(--accent-soft), transparent 70%); }
|
|
@@ -98,7 +102,7 @@ p { margin: 0 0 1em; }
|
|
|
98
102
|
.copy:hover { background: rgba(255,255,255,.16); }
|
|
99
103
|
.hero-note { font-size: 13.5px; color: var(--muted); margin-top: 14px; }
|
|
100
104
|
|
|
101
|
-
/*
|
|
105
|
+
/* Product cards (drawn screens) */
|
|
102
106
|
.window { background: var(--surface); border: 1px solid var(--line); border-radius: var(--radius); box-shadow: var(--shadow); overflow: hidden; }
|
|
103
107
|
.window .bar { display: flex; align-items: center; gap: 7px; padding: 11px 14px; border-bottom: 1px solid var(--line); background: var(--bg-soft); font-size: 12.5px; color: var(--muted); }
|
|
104
108
|
.window .bar i { width: 10px; height: 10px; border-radius: 50%; background: var(--line-strong); }
|
|
@@ -117,7 +121,7 @@ p { margin: 0 0 1em; }
|
|
|
117
121
|
.tag.bad { background: var(--bad-soft); color: var(--bad); }
|
|
118
122
|
.tag.info { background: var(--accent-soft); color: var(--accent-ink); }
|
|
119
123
|
|
|
120
|
-
/*
|
|
124
|
+
/* Sections */
|
|
121
125
|
.band { padding: 96px 0; }
|
|
122
126
|
.band.soft { background: var(--bg-soft); border-top: 1px solid var(--line); border-bottom: 1px solid var(--line); }
|
|
123
127
|
.kicker { font-size: 13px; font-weight: 600; letter-spacing: .08em; text-transform: uppercase; color: var(--accent-ink); margin-bottom: 12px; }
|
|
@@ -136,7 +140,7 @@ p { margin: 0 0 1em; }
|
|
|
136
140
|
.icon { grid-row: 1 / span 2; color: var(--accent); padding-top: 1px; }
|
|
137
141
|
.icon svg { width: 24px; height: 24px; }
|
|
138
142
|
|
|
139
|
-
/*
|
|
143
|
+
/* Cycle */
|
|
140
144
|
.cycle { display: grid; grid-template-columns: repeat(5, 1fr); gap: 0; position: relative; margin-top: 8px; }
|
|
141
145
|
.cycle li { list-style: none; position: relative; padding: 0 14px; text-align: center; }
|
|
142
146
|
.cycle li::after { content: ""; position: absolute; top: 27px; left: calc(50% + 34px); right: calc(-50% + 34px); height: 2px; background: var(--line-strong); }
|
|
@@ -154,7 +158,7 @@ p { margin: 0 0 1em; }
|
|
|
154
158
|
.back { text-align: center; margin-top: 28px; font-size: 14px; color: var(--muted); }
|
|
155
159
|
.back span { display: inline-block; border: 1px dashed var(--line-strong); border-radius: 999px; padding: 6px 16px; }
|
|
156
160
|
|
|
157
|
-
/*
|
|
161
|
+
/* Moments */
|
|
158
162
|
.moments { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
|
|
159
163
|
.moment h3 { font-size: 17px; margin: 18px 0 6px; }
|
|
160
164
|
.moment > p { color: var(--muted); font-size: 15px; margin: 0; }
|
|
@@ -165,7 +169,7 @@ p { margin: 0 0 1em; }
|
|
|
165
169
|
.term .y { color: #ffd479; }
|
|
166
170
|
.window .term { border-radius: 0; margin: 0; }
|
|
167
171
|
|
|
168
|
-
/*
|
|
172
|
+
/* Measurement */
|
|
169
173
|
.stats { display: grid; grid-template-columns: 1.2fr 1fr; gap: 24px; align-items: stretch; }
|
|
170
174
|
.bars .row { display: grid; grid-template-columns: 120px 1fr 56px; gap: 14px; align-items: center; margin-bottom: 16px; font-size: 15px; }
|
|
171
175
|
.bars .track { height: 14px; background: var(--code-bg); border-radius: 999px; overflow: hidden; }
|
|
@@ -178,7 +182,7 @@ p { margin: 0 0 1em; }
|
|
|
178
182
|
.big .card p { font-size: 14px; }
|
|
179
183
|
.fine { font-size: 13.5px; color: var(--muted); margin-top: 20px; }
|
|
180
184
|
|
|
181
|
-
/*
|
|
185
|
+
/* Guide layout */
|
|
182
186
|
.docs { display: grid; grid-template-columns: 236px minmax(0, 1fr); gap: 56px; padding-top: 24px; padding-bottom: 96px; }
|
|
183
187
|
.side { position: sticky; top: 84px; align-self: start; max-height: calc(100vh - 100px); overflow-y: auto; font-size: 14px; padding-right: 8px; }
|
|
184
188
|
.side p { font-size: 11.5px; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; color: var(--muted); margin: 20px 0 8px; }
|
|
@@ -227,6 +231,66 @@ td.f { font: 13px var(--mono); color: var(--fg); white-space: nowrap; }
|
|
|
227
231
|
.rules b { display: block; margin-bottom: 2px; }
|
|
228
232
|
.rules span { font-size: 14px; color: var(--muted); }
|
|
229
233
|
|
|
234
|
+
::selection { background: color-mix(in srgb, var(--accent) 26%, transparent); }
|
|
235
|
+
|
|
236
|
+
/* Reading progress (underline of the menu) */
|
|
237
|
+
.progress { position: absolute; left: 0; bottom: -1px; width: 100%; height: 2px; background: var(--accent); transform-origin: 0 50%; transform: scaleX(0); }
|
|
238
|
+
|
|
239
|
+
/* Setup picker */
|
|
240
|
+
.setup { max-width: 540px; }
|
|
241
|
+
.seg { display: inline-flex; gap: 4px; padding: 4px; background: var(--bg-soft); border: 1px solid var(--line); border-radius: 12px; margin-bottom: 12px; }
|
|
242
|
+
.seg button { font: 600 14px var(--font); color: var(--muted); background: none; border: 0; border-radius: 9px; padding: 7px 14px; cursor: pointer; transition: background .2s, color .2s, box-shadow .2s; }
|
|
243
|
+
.seg button:hover { color: var(--fg); }
|
|
244
|
+
.seg button[aria-selected="true"] { background: var(--surface); color: var(--fg); box-shadow: 0 1px 2px rgba(15, 23, 42, .08), 0 3px 10px rgba(15, 23, 42, .06); }
|
|
245
|
+
.setup .install { max-width: none; }
|
|
246
|
+
.install.chat span::before { content: "› "; }
|
|
247
|
+
.via { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 14px; margin-top: 12px; font-size: 13.5px; color: var(--muted); }
|
|
248
|
+
.via button { font: 500 13.5px var(--font); color: var(--muted); background: none; border: 0; padding: 2px 0; cursor: pointer; border-bottom: 1.5px solid transparent; }
|
|
249
|
+
.via button:hover { color: var(--fg); }
|
|
250
|
+
.via button[aria-pressed="true"] { color: var(--fg); border-bottom-color: var(--accent); }
|
|
251
|
+
.setup .next { margin: 14px 0 0; font-size: 14.5px; color: var(--fg-2); }
|
|
252
|
+
.setup .next b { color: var(--fg); }
|
|
253
|
+
|
|
254
|
+
/* Hero demo: without JS the final state is visible */
|
|
255
|
+
.demo .prompt { font: 13px var(--mono); color: var(--fg-2); margin: 0 0 14px; padding-bottom: 12px; border-bottom: 1px dashed var(--line-strong); min-height: 1.7em; }
|
|
256
|
+
.demo .prompt b { color: var(--accent-ink); font-weight: 500; }
|
|
257
|
+
.demo .caret { display: inline-block; width: 7px; height: 1.05em; margin-left: 2px; vertical-align: -2px; background: var(--accent); animation: blink 1s steps(1) infinite; }
|
|
258
|
+
@keyframes blink { 50% { opacity: 0; } }
|
|
259
|
+
.demo [data-s] { transition: opacity .5s cubic-bezier(.16, 1, .3, 1), transform .5s cubic-bezier(.16, 1, .3, 1); }
|
|
260
|
+
.demo.run [data-s]:not(.in) { opacity: 0; transform: translateY(6px); }
|
|
261
|
+
.opt { transition: border-color .35s ease, background .35s ease, box-shadow .35s ease; }
|
|
262
|
+
.demo.run .opt.rec:not(.picked) { border-color: var(--line); background: transparent; box-shadow: none; }
|
|
263
|
+
.demo.run .opt.rec:not(.picked) b { color: var(--fg); }
|
|
264
|
+
|
|
265
|
+
/* Route picker */
|
|
266
|
+
.routes { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 16px; margin: 4px 0 32px; }
|
|
267
|
+
.route { display: flex; flex-direction: column; border: 1px solid var(--line); border-radius: var(--radius); padding: 22px 22px 20px; background: var(--surface); box-shadow: var(--shadow); transition: transform .25s cubic-bezier(.16, 1, .3, 1), border-color .25s ease; }
|
|
268
|
+
.route:hover { transform: translateY(-2px); border-color: var(--line-strong); }
|
|
269
|
+
.route.primary { border-color: color-mix(in srgb, var(--accent) 45%, var(--line)); background: linear-gradient(180deg, var(--accent-soft), var(--surface) 60%); }
|
|
270
|
+
.doc .route h3 { font-size: 19px; margin: 0 0 4px; }
|
|
271
|
+
.route .for { font-size: 14px; color: var(--muted); margin-bottom: 18px; }
|
|
272
|
+
.steps { list-style: none; padding: 0 !important; margin: 0 0 18px; flex: 1; }
|
|
273
|
+
.doc .steps li { position: relative; margin: 0; padding: 0 0 12px 26px; font-size: 14.5px; color: var(--fg-2); }
|
|
274
|
+
.steps li::before { content: ""; position: absolute; left: 3px; top: 7px; width: 11px; height: 11px; border-radius: 50%; background: var(--surface); border: 2px solid var(--accent); }
|
|
275
|
+
.steps li::after { content: ""; position: absolute; left: 8px; top: 20px; bottom: 0; width: 2px; background: var(--line-strong); }
|
|
276
|
+
.doc .steps li:last-child { padding-bottom: 0; }
|
|
277
|
+
.steps li:last-child::after { display: none; }
|
|
278
|
+
.route .go { font-weight: 600; font-size: 14.5px; align-self: flex-start; }
|
|
279
|
+
|
|
280
|
+
/* Guardrail flow */
|
|
281
|
+
.gflow { margin: 0 0 24px; border: 1px solid var(--line); border-radius: var(--radius); background: var(--bg-soft); padding: 20px 22px; }
|
|
282
|
+
.gflow .lane + .lane { margin-top: 16px; padding-top: 16px; border-top: 1px dashed var(--line-strong); }
|
|
283
|
+
.gflow .lane-h { font-size: 12.5px; font-weight: 600; color: var(--muted); margin: 0 0 10px; }
|
|
284
|
+
.gflow ol { list-style: none; display: flex; flex-wrap: wrap; align-items: center; gap: 10px 0; padding: 0 !important; margin: 0; }
|
|
285
|
+
.doc .gflow li { display: flex; align-items: center; margin: 0; font-size: 13.5px; }
|
|
286
|
+
.gflow li + li::before { content: ""; width: 16px; height: 2px; margin: 0 6px; background: var(--line-strong); }
|
|
287
|
+
.gflow .node { display: inline-flex; align-items: center; gap: 6px; border: 1px solid var(--line-strong); background: var(--surface); color: var(--fg); border-radius: 999px; padding: 5px 12px; }
|
|
288
|
+
.gflow .node svg { width: 14px; height: 14px; flex: none; }
|
|
289
|
+
.gflow .start .node { background: var(--term-bg); color: var(--term-fg); border-color: var(--term-bg); font-family: var(--mono); font-size: 12.5px; }
|
|
290
|
+
.gflow .stop .node { border-color: color-mix(in srgb, var(--bad) 55%, transparent); background: var(--bad-soft); color: var(--bad); font-weight: 600; }
|
|
291
|
+
.gflow .pass .node { border-color: color-mix(in srgb, var(--ok) 55%, transparent); background: var(--ok-soft); color: var(--ok); font-weight: 600; }
|
|
292
|
+
.gflow figcaption { font-size: 13.5px; color: var(--muted); margin-top: 14px; }
|
|
293
|
+
|
|
230
294
|
footer { border-top: 1px solid var(--line); padding: 40px 0; font-size: 14px; color: var(--muted); }
|
|
231
295
|
footer .container { display: flex; flex-wrap: wrap; gap: 16px; justify-content: space-between; align-items: center; }
|
|
232
296
|
|
|
@@ -245,15 +309,23 @@ footer .container { display: flex; flex-wrap: wrap; gap: 16px; justify-content:
|
|
|
245
309
|
@media (max-width: 720px) {
|
|
246
310
|
.container { padding: 0 16px; }
|
|
247
311
|
.nav-links a:not(.btn) { display: none; }
|
|
312
|
+
.nav .container { gap: 12px; }
|
|
313
|
+
.lang a, .lang span { padding: 4px 9px; }
|
|
248
314
|
.hero { padding: 56px 0 48px; }
|
|
249
315
|
.band { padding: 64px 0; }
|
|
250
|
-
.grid2, .rules, .big { grid-template-columns: minmax(0, 1fr); }
|
|
316
|
+
.grid2, .rules, .big, .routes { grid-template-columns: minmax(0, 1fr); }
|
|
251
317
|
.bars .row { grid-template-columns: 92px 1fr 48px; }
|
|
252
318
|
}
|
|
319
|
+
@media (max-width: 480px) {
|
|
320
|
+
.nav-links { display: none; }
|
|
321
|
+
.lang { margin-left: auto; }
|
|
322
|
+
}
|
|
253
323
|
@media (prefers-reduced-motion: reduce) {
|
|
254
324
|
html { scroll-behavior: auto; }
|
|
255
325
|
.cycle .dot { animation: none; }
|
|
256
|
-
.btn { transition: none; }
|
|
326
|
+
.btn, .route, .seg button, .opt, .demo [data-s] { transition: none; }
|
|
327
|
+
.demo .caret { animation: none; }
|
|
328
|
+
.route:hover { transform: none; }
|
|
257
329
|
}
|
|
258
330
|
</style>
|
|
259
331
|
</head>
|
|
@@ -271,14 +343,16 @@ footer .container { display: flex; flex-wrap: wrap; gap: 16px; justify-content:
|
|
|
271
343
|
<header class="nav">
|
|
272
344
|
<div class="container">
|
|
273
345
|
<a class="brand" href="#top"><svg class="mark"><use href="#mark"/></svg>TillerHand</a>
|
|
274
|
-
<nav class="nav-links" aria-label="
|
|
275
|
-
<a href="#nasil">
|
|
276
|
-
<a href="#ekranlar">
|
|
277
|
-
<a href="#olcum"
|
|
278
|
-
<a href="#rehber">
|
|
346
|
+
<nav class="nav-links" aria-label="Main menu">
|
|
347
|
+
<a href="#nasil">How it works</a>
|
|
348
|
+
<a href="#ekranlar">Screens</a>
|
|
349
|
+
<a href="#olcum">Results</a>
|
|
350
|
+
<a href="#rehber">Guide</a>
|
|
279
351
|
<a class="btn ghost small" href="https://github.com/burakdogrul/TillerHand">GitHub</a>
|
|
280
352
|
</nav>
|
|
353
|
+
<div class="lang" role="group" aria-label="Language"><span aria-current="true">English</span><a href="guide.tr.html" hreflang="tr" lang="tr">Türkçe</a></div>
|
|
281
354
|
</div>
|
|
355
|
+
<div class="progress" aria-hidden="true"></div>
|
|
282
356
|
</header>
|
|
283
357
|
|
|
284
358
|
<main id="top">
|
|
@@ -287,541 +361,636 @@ footer .container { display: flex; flex-wrap: wrap; gap: 16px; justify-content:
|
|
|
287
361
|
<section class="hero">
|
|
288
362
|
<div class="container">
|
|
289
363
|
<div>
|
|
290
|
-
<span class="pill"><b>v3.
|
|
291
|
-
<h1>
|
|
292
|
-
<p class="sub">TillerHand
|
|
293
|
-
<div class="
|
|
294
|
-
|
|
295
|
-
|
|
364
|
+
<span class="pill"><b>v3.47.1</b> Starter kit for Claude Code · MIT</span>
|
|
365
|
+
<h1>The AI builds.<br><em>You steer.</em></h1>
|
|
366
|
+
<p class="sub">TillerHand takes a product from idea to production and maintenance with Claude Code. At every important decision the AI gives you the options, its recommendation and the cost of each option. An expert board reviews the work, and guardrails stop mistakes before they happen.</p>
|
|
367
|
+
<div class="setup">
|
|
368
|
+
<div class="seg" role="tablist" aria-label="Project status">
|
|
369
|
+
<button type="button" role="tab" aria-selected="true" data-path="new">New project</button>
|
|
370
|
+
<button type="button" role="tab" aria-selected="false" data-path="old">Existing project</button>
|
|
371
|
+
</div>
|
|
372
|
+
<div class="install"><span id="cmd">npx tillerhand init</span><button class="copy" type="button" data-copy="cmd">Copy</button></div>
|
|
373
|
+
<div class="via" role="group" aria-label="Where you run it">
|
|
374
|
+
<span>Where:</span>
|
|
375
|
+
<button type="button" aria-pressed="true" data-via="term">Terminal</button>
|
|
376
|
+
<button type="button" aria-pressed="false" data-via="chat">Claude app</button>
|
|
377
|
+
</div>
|
|
378
|
+
<p class="next" aria-live="polite">Run it in the project folder. Then open a new session in the same folder and type <code>/start your idea</code>.</p>
|
|
379
|
+
</div>
|
|
380
|
+
<p class="hero-note">One command is enough; the plugin and git routes are in <a href="#baslangic">Setup</a> · Also works in Codex and Antigravity · No coding knowledge needed</p>
|
|
296
381
|
</div>
|
|
297
|
-
<div class="window" aria-label="
|
|
298
|
-
<div class="bar"><i></i><i></i><i></i><span>Claude Code · /start
|
|
382
|
+
<div class="window demo" aria-label="Example: a decision question the AI asks you">
|
|
383
|
+
<div class="bar"><i></i><i></i><i></i><span>Claude Code · /start</span></div>
|
|
299
384
|
<div class="body">
|
|
300
|
-
<p class="
|
|
301
|
-
<p class="
|
|
302
|
-
<
|
|
303
|
-
<div class="opt"><b>
|
|
304
|
-
<div class="opt"><b>
|
|
305
|
-
<div class="
|
|
385
|
+
<p class="prompt"><b>›</b> <span class="typed">/start Invoice tracking for freelancers</span><span class="caret" aria-hidden="true"></span></p>
|
|
386
|
+
<p class="ctx" data-s="1">Step 4/9 · Technology · This decision shapes the whole data layer; changing it later is expensive.</p>
|
|
387
|
+
<p class="q" data-s="1">Which database and authentication should we use?</p>
|
|
388
|
+
<div class="opt rec" data-s="2"><b>Supabase (Recommended)</b><span>Postgres, auth and file storage in one place. Row-level security is ready; the free tier is enough for an MVP.</span></div>
|
|
389
|
+
<div class="opt" data-s="3"><b>Neon + Better Auth</b><span>More control, less dependence on one provider. The auth code stays with you.</span></div>
|
|
390
|
+
<div class="opt" data-s="4"><b>Firebase</b><span>Real-time and a shared backend with mobile. NoSQL; weak relational queries.</span></div>
|
|
391
|
+
<div class="board-row" data-s="6">Board opinion: <span class="tag" data-s="6">Architect ✓</span><span class="tag" data-s="7">Security ✓</span><span class="tag warn" data-s="8">Cost: watch</span></div>
|
|
306
392
|
</div>
|
|
307
393
|
</div>
|
|
308
394
|
</div>
|
|
309
395
|
</section>
|
|
310
396
|
|
|
311
|
-
<!-- ============
|
|
397
|
+
<!-- ============ PROBLEM ============ -->
|
|
312
398
|
<section class="band soft">
|
|
313
399
|
<div class="container">
|
|
314
|
-
<p class="kicker">
|
|
315
|
-
<h2>AI
|
|
316
|
-
<p class="lead">"
|
|
400
|
+
<p class="kicker">Why</p>
|
|
401
|
+
<h2>Writing code with AI is fast. Shipping a product is a different job.</h2>
|
|
402
|
+
<p class="lead">With "vibe coding" a demo takes an afternoon. A product that real users touch can't survive silent decisions, untested code, leaked keys and a messy folder tree. TillerHand keeps the speed and closes these four gaps.</p>
|
|
317
403
|
<div class="grid2">
|
|
318
404
|
<div class="card problem">
|
|
319
|
-
<div class="was"><b>
|
|
320
|
-
<div class="now"><b>TillerHand
|
|
405
|
+
<div class="was"><b>Usually</b>The AI picks the database, the library and the data model on its own. Nobody knows why.</div>
|
|
406
|
+
<div class="now"><b>With TillerHand</b>Every decision comes to you with 2-4 options: the recommended one first, with when each is better and what it costs. Your answer goes into the log and is never asked again.</div>
|
|
321
407
|
</div>
|
|
322
408
|
<div class="card problem">
|
|
323
|
-
<div class="was"><b>
|
|
324
|
-
<div class="now"><b>TillerHand
|
|
409
|
+
<div class="was"><b>Usually</b>"It works" is the only proof, and there are no tests. The next change breaks the last one.</div>
|
|
410
|
+
<div class="now"><b>With TillerHand</b>Acceptance tests are written before the code and start red. Before "done", proof is shown: test output, a screenshot.</div>
|
|
325
411
|
</div>
|
|
326
412
|
<div class="card problem">
|
|
327
|
-
<div class="was"><b>
|
|
328
|
-
<div class="now"><b>TillerHand
|
|
413
|
+
<div class="was"><b>Usually</b>An API key lands in the code, the prod database gets deleted by accident, a test is weakened so it passes.</div>
|
|
414
|
+
<div class="now"><b>With TillerHand</b>Hooks stop these before they happen. The AI can't bypass these guardrails; every step toward prod needs your approval.</div>
|
|
329
415
|
</div>
|
|
330
416
|
<div class="card problem">
|
|
331
|
-
<div class="was"><b>
|
|
332
|
-
<div class="now"><b>TillerHand
|
|
417
|
+
<div class="was"><b>Usually</b>Three months later nobody knows where the files are; <code>final-v2-old.tsx</code> multiplies.</div>
|
|
418
|
+
<div class="now"><b>With TillerHand</b>A feature-based folder map is enforced when files are written, in CI and in review. Clutter files are blocked.</div>
|
|
333
419
|
</div>
|
|
334
420
|
</div>
|
|
335
421
|
</div>
|
|
336
422
|
</section>
|
|
337
423
|
|
|
338
|
-
<!-- ============
|
|
424
|
+
<!-- ============ CYCLE ============ -->
|
|
339
425
|
<section class="band" id="nasil">
|
|
340
426
|
<div class="container">
|
|
341
|
-
<p class="kicker">
|
|
342
|
-
<h2>
|
|
343
|
-
<p class="lead">TillerHand
|
|
427
|
+
<p class="kicker">How it works</p>
|
|
428
|
+
<h2>The same cycle for every task. You sit in the middle.</h2>
|
|
429
|
+
<p class="lead">TillerHand is a way of working, not a list of commands. You write your idea and walk through the rest with the AI, step by step. Nothing important happens without you knowing.</p>
|
|
344
430
|
<ol class="cycle">
|
|
345
|
-
<li><div class="dot">1</div><div><h3>AI
|
|
346
|
-
<li class="you"><div class="dot">2</div><div><h3>
|
|
347
|
-
<li><div class="dot">3</div><div><h3
|
|
348
|
-
<li><div class="dot">4</div><div><h3>
|
|
349
|
-
<li><div class="dot">5</div><div><h3>
|
|
431
|
+
<li><div class="dot">1</div><div><h3>The AI plans</h3><p>Reads the task, finds the decision points, prepares the options.</p></div></li>
|
|
432
|
+
<li class="you"><div class="dot">2</div><div><h3>You decide</h3><p>Recommended option first; when each is better, and what it costs.</p></div></li>
|
|
433
|
+
<li><div class="dot">3</div><div><h3>Test first, then code</h3><p>A separate agent writes the tests and they start red; the code turns them green.</p></div></li>
|
|
434
|
+
<li><div class="dot">4</div><div><h3>The board reviews</h3><p>The relevant experts review; a critical finding means the task is not done.</p></div></li>
|
|
435
|
+
<li><div class="dot">5</div><div><h3>Saved with proof</h3><p>If the gate is green: commit, dashboard update, next task.</p></div></li>
|
|
350
436
|
</ol>
|
|
351
|
-
<p class="back"><span>↺
|
|
437
|
+
<p class="back"><span>↺ Repeats for every task · findings reports and a board meeting at the end of a phase</span></p>
|
|
352
438
|
|
|
353
439
|
<div class="grid3" style="margin-top:56px">
|
|
354
440
|
<div class="card">
|
|
355
441
|
<div class="icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M9 11l3 3L22 4"/><path d="M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11"/></svg></div>
|
|
356
|
-
<h3>
|
|
357
|
-
<p
|
|
442
|
+
<h3>You make the decisions</h3>
|
|
443
|
+
<p>Product, technical, design, data, security and cost decisions are asked with reasoned options. Design questions come with a visual preview using real content.</p>
|
|
358
444
|
</div>
|
|
359
445
|
<div class="card">
|
|
360
446
|
<div class="icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"/><circle cx="9" cy="7" r="4"/><path d="M23 21v-2a4 4 0 0 0-3-3.87"/><path d="M16 3.13a4 4 0 0 1 0 7.75"/></svg></div>
|
|
361
|
-
<h3>
|
|
362
|
-
<p
|
|
447
|
+
<h3>The expert board reviews</h3>
|
|
448
|
+
<p>Members such as Product, Architect, Security, UX, Privacy (KVKK) and QA review the plan, the task, the commit and the phase. For key decisions a council of different models meets.</p>
|
|
363
449
|
</div>
|
|
364
450
|
<div class="card">
|
|
365
451
|
<div class="icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg></div>
|
|
366
|
-
<h3>
|
|
367
|
-
<p>
|
|
452
|
+
<h3>Guardrails stop mistakes</h3>
|
|
453
|
+
<p>Secret block, destructive command shield, package gate, test protection, commit gate. The rules are written, the checks are automatic; the AI can't bypass them.</p>
|
|
368
454
|
</div>
|
|
369
455
|
<div class="card">
|
|
370
456
|
<div class="icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M3 3v18h18"/><path d="M7 15l4-4 3 3 5-6"/></svg></div>
|
|
371
|
-
<h3>
|
|
372
|
-
<p>
|
|
457
|
+
<h3>You always know where you are</h3>
|
|
458
|
+
<p>A status block at the end of every answer, the task and limit in the status line, a live control panel in the browser.</p>
|
|
373
459
|
</div>
|
|
374
460
|
<div class="card">
|
|
375
461
|
<div class="icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><circle cx="11" cy="11" r="8"/><path d="M21 21l-4.35-4.35"/></svg></div>
|
|
376
|
-
<h3>
|
|
377
|
-
<p>
|
|
462
|
+
<h3>Scans like an expert</h3>
|
|
463
|
+
<p>The 20 most important findings for tech, business, security, UX, performance and legal; with evidence, a score and a fix.</p>
|
|
378
464
|
</div>
|
|
379
465
|
<div class="card">
|
|
380
466
|
<div class="icon"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M22 12h-4l-3 9L9 3l-3 9H2"/></svg></div>
|
|
381
|
-
<h3>
|
|
382
|
-
<p>Hosting,
|
|
467
|
+
<h3>To production and beyond</h3>
|
|
468
|
+
<p>Hosting, domain and backup setup step by step; approved prod deploys; live monitoring and regular maintenance.</p>
|
|
383
469
|
</div>
|
|
384
470
|
</div>
|
|
385
471
|
</div>
|
|
386
472
|
</section>
|
|
387
473
|
|
|
388
|
-
<!-- ============
|
|
474
|
+
<!-- ============ SCREENS ============ -->
|
|
389
475
|
<section class="band soft" id="ekranlar">
|
|
390
476
|
<div class="container">
|
|
391
|
-
<p class="kicker"
|
|
392
|
-
<h2>
|
|
393
|
-
<p class="lead">
|
|
477
|
+
<p class="kicker">At work</p>
|
|
478
|
+
<h2>This is what a day with TillerHand looks like.</h2>
|
|
479
|
+
<p class="lead">These are simplified versions of real output. All of it happens inside a Claude Code session, in the chat.</p>
|
|
394
480
|
<div class="moments">
|
|
395
481
|
<div class="moment">
|
|
396
482
|
<div class="window">
|
|
397
|
-
<div class="bar"><i></i><i></i><i></i><span>
|
|
398
|
-
<pre class="term"
|
|
399
|
-
|
|
483
|
+
<div class="bar"><i></i><i></i><i></i><span>Board · task-end meeting</span></div>
|
|
484
|
+
<pre class="term">MEMBER: Security · VERDICT: <span class="r">RET</span>
|
|
485
|
+
FINDINGS:
|
|
400
486
|
<span class="r">[KRİTİK]</span> app/api/invoice/[id]/route.ts:14
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
<span class="g">→
|
|
404
|
-
|
|
405
|
-
|
|
487
|
+
The invoice owner is not checked; another
|
|
488
|
+
user's id reads their invoice.
|
|
489
|
+
<span class="g">→ Add a user_id condition to the query.</span>
|
|
490
|
+
MEMBER: QA · VERDICT: <span class="g">ONAY</span>
|
|
491
|
+
ASK THE USER: none</pre>
|
|
406
492
|
</div>
|
|
407
|
-
<h3>
|
|
408
|
-
<p>
|
|
493
|
+
<h3>The board catches a hole</h3>
|
|
494
|
+
<p>With a critical finding (RET) the task is not done. You get three paths: fix it, accept the risk with a reason, or roll the task back.</p>
|
|
409
495
|
</div>
|
|
410
496
|
<div class="moment">
|
|
411
497
|
<div class="window">
|
|
412
|
-
<div class="bar"><i></i><i></i><i></i><span>
|
|
498
|
+
<div class="bar"><i></i><i></i><i></i><span>Guardrail · the AI tries to write a file</span></div>
|
|
413
499
|
<pre class="term"><span class="c">Write lib/stripe.ts</span>
|
|
414
|
-
<span class="r">
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
500
|
+
<span class="r">BLOCKED:</span> a secret is being written to
|
|
501
|
+
lib/stripe.ts (Stripe secret key).
|
|
502
|
+
Do not write the secret in code; read it from
|
|
503
|
+
an environment variable and add its name to .env.example with an empty value.
|
|
418
504
|
|
|
419
505
|
<span class="c">Bash vercel deploy --prod</span>
|
|
420
|
-
<span class="y">
|
|
506
|
+
<span class="y">APPROVAL NEEDED:</span> Deploy to the prod environment.</pre>
|
|
421
507
|
</div>
|
|
422
|
-
<h3>
|
|
423
|
-
<p>
|
|
508
|
+
<h3>Guardrails stop the mistake before it happens</h3>
|
|
509
|
+
<p>The block comes inside the chat, with an explanation. Every step that touches prod, data or money waits for your approval.</p>
|
|
424
510
|
</div>
|
|
425
511
|
<div class="moment">
|
|
426
512
|
<div class="window">
|
|
427
|
-
<div class="bar"><i></i><i></i><i></i><span>
|
|
428
|
-
<pre class="term">──
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
Kurul: <span class="g">ONAY</span> (ux, qa)
|
|
433
|
-
Sıradaki: G-013 şifre sıfırlama
|
|
434
|
-
Bekleyen karar: e-posta servisi</pre>
|
|
513
|
+
<div class="bar"><i></i><i></i><i></i><span>At the end of every answer</span></div>
|
|
514
|
+
<pre class="term">── Status ──────────────────────
|
|
515
|
+
Phase: 1 · Task: G-012 (7/23) · Question mode: open · Limit: 5h 34% weekly 5%
|
|
516
|
+
Done: signup form + validation, tests green · Board: <span class="g">ONAY</span> (ux, qa) · Auto decisions: none
|
|
517
|
+
Next: G-013 password reset · pending decision: email service</pre>
|
|
435
518
|
</div>
|
|
436
|
-
<h3>
|
|
437
|
-
<p>
|
|
519
|
+
<h3>You always know where you are</h3>
|
|
520
|
+
<p>Phase, task, limit, the board's verdict and the next step at the end of every answer. When you come back after a break, your place is ready.</p>
|
|
438
521
|
</div>
|
|
439
522
|
<div class="moment">
|
|
440
523
|
<div class="window">
|
|
441
524
|
<div class="bar"><i></i><i></i><i></i><span>dashboard.html</span></div>
|
|
442
525
|
<div class="body">
|
|
443
|
-
<p class="ctx"
|
|
526
|
+
<p class="ctx">Now · Phase 1 · G-012 signup form</p>
|
|
444
527
|
<div class="bars" style="margin:6px 0 14px">
|
|
445
|
-
<div class="row"><span>
|
|
446
|
-
<div class="row"><span>
|
|
528
|
+
<div class="row"><span>Roadmap</span><div class="track"><div class="fill kit" style="width:30%"></div></div><span class="val">7/23</span></div>
|
|
529
|
+
<div class="row"><span>Security</span><div class="track"><div class="fill kit" style="width:86%"></div></div><span class="val">86</span></div>
|
|
447
530
|
<div class="row"><span>UX</span><div class="track"><div class="fill kit" style="width:74%"></div></div><span class="val">74</span></div>
|
|
448
531
|
</div>
|
|
449
|
-
<div class="board-row" style="margin-top:0">
|
|
532
|
+
<div class="board-row" style="margin-top:0">Attention: <span class="tag bad">1 critical finding</span><span class="tag warn">domain: 21 days</span><span class="tag info">2 decisions pending</span></div>
|
|
450
533
|
</div>
|
|
451
534
|
</div>
|
|
452
|
-
<h3>
|
|
453
|
-
<p>
|
|
535
|
+
<h3>The whole project on one page</h3>
|
|
536
|
+
<p>Decisions, board, findings, quality, operations and limit; it updates itself after every Claude answer.</p>
|
|
454
537
|
</div>
|
|
455
538
|
</div>
|
|
456
539
|
</div>
|
|
457
540
|
</section>
|
|
458
541
|
|
|
459
|
-
<!-- ============
|
|
542
|
+
<!-- ============ RESULTS ============ -->
|
|
460
543
|
<section class="band" id="olcum">
|
|
461
544
|
<div class="container">
|
|
462
|
-
<p class="kicker"
|
|
463
|
-
<h2>
|
|
464
|
-
<p class="lead">
|
|
545
|
+
<p class="kicker">Results</p>
|
|
546
|
+
<h2>The difference is in the tests that catch bugs.</h2>
|
|
547
|
+
<p class="lead">The same tasks ran with and without TillerHand through <code>claude -p</code> and were scored with hidden tests. Then bugs were injected into the code on purpose: do the tests the agent wrote catch them?</p>
|
|
465
548
|
<div class="stats">
|
|
466
549
|
<div class="card bars">
|
|
467
|
-
<h3 style="margin-bottom:22px">
|
|
468
|
-
<div class="row"><span><b>TillerHand</b></span><div class="track"><div class="fill kit" style="width:63%"></div></div><span class="val"
|
|
469
|
-
<div class="row"><span>
|
|
470
|
-
<p class="fine" style="margin-top:8px">
|
|
550
|
+
<h3 style="margin-bottom:22px">Tests that catch the injected bugs</h3>
|
|
551
|
+
<div class="row"><span><b>TillerHand</b></span><div class="track"><div class="fill kit" style="width:63%"></div></div><span class="val">63%</span></div>
|
|
552
|
+
<div class="row"><span>No kit</span><div class="track"><div class="fill" style="width:31%"></div></div><span class="val">31%</span></div>
|
|
553
|
+
<p class="fine" style="margin-top:8px">The gap was biggest on tasks with implicit requirements and a Turkish sorting trap.</p>
|
|
471
554
|
</div>
|
|
472
555
|
<div class="big">
|
|
473
|
-
<div class="card"><div class="num">24/24</div><p>TillerHand
|
|
474
|
-
<div class="card"><div class="num">81/81</div><p
|
|
475
|
-
<div class="card" style="grid-column:1 / -1"><div class="num">48</div><p>
|
|
556
|
+
<div class="card"><div class="num">24/24</div><p>With TillerHand the tests came before the code in every run. Without the kit, in none.</p></div>
|
|
557
|
+
<div class="card"><div class="num">81/81</div><p>Both conditions passed every hidden test; the model solves tasks of this size without the kit too.</p></div>
|
|
558
|
+
<div class="card" style="grid-column:1 / -1"><div class="num">48</div><p>Runs: 6 different tasks (bug fix, new feature, authorization security, pagination, Turkish sorting and a trash bin); 24 runs per condition.</p></div>
|
|
476
559
|
</div>
|
|
477
560
|
</div>
|
|
478
|
-
<p class="fine">
|
|
561
|
+
<p class="fine">Version 3.18.2 · Sonnet · 6 tasks · 24 runs per condition. The setup and results are in the repo: <code>kit/eval/</code>.</p>
|
|
479
562
|
</div>
|
|
480
563
|
</section>
|
|
481
564
|
|
|
482
|
-
<!-- ============
|
|
565
|
+
<!-- ============ GUIDE ============ -->
|
|
483
566
|
<div class="band soft" style="padding:72px 0 0" id="rehber">
|
|
484
567
|
<div class="container">
|
|
485
|
-
<p class="kicker">
|
|
486
|
-
<h2>
|
|
487
|
-
<p class="lead" style="margin-bottom:40px">
|
|
568
|
+
<p class="kicker">Guide</p>
|
|
569
|
+
<h2>The full guide</h2>
|
|
570
|
+
<p class="lead" style="margin-bottom:40px">Everything from setup to maintenance: commands, board, guardrails, tools and rules.</p>
|
|
488
571
|
</div>
|
|
489
572
|
</div>
|
|
490
573
|
|
|
491
574
|
<div class="container docs">
|
|
492
|
-
<nav class="side" aria-label="
|
|
493
|
-
<p>
|
|
494
|
-
<a href="#baslangic">
|
|
495
|
-
<a href="#hic-bilmiyorsan">
|
|
496
|
-
<a href="#
|
|
497
|
-
<
|
|
498
|
-
<
|
|
499
|
-
<a href="#
|
|
500
|
-
<a href="#
|
|
501
|
-
<a href="#
|
|
502
|
-
<a href="#
|
|
503
|
-
<
|
|
504
|
-
<
|
|
505
|
-
<a href="#
|
|
506
|
-
<a href="#
|
|
507
|
-
<
|
|
508
|
-
<
|
|
509
|
-
<a href="#
|
|
510
|
-
<
|
|
511
|
-
<
|
|
512
|
-
<a href="#
|
|
513
|
-
<a href="#
|
|
514
|
-
<
|
|
515
|
-
<
|
|
516
|
-
<a href="#
|
|
517
|
-
<a href="#
|
|
575
|
+
<nav class="side" aria-label="Guide contents">
|
|
576
|
+
<p>Start</p>
|
|
577
|
+
<a href="#baslangic">Setup</a>
|
|
578
|
+
<a href="#hic-bilmiyorsan">If you're new</a>
|
|
579
|
+
<a href="#adopt">Existing project</a>
|
|
580
|
+
<a href="#gunluk">Every day</a>
|
|
581
|
+
<p>How it works</p>
|
|
582
|
+
<a href="#protokol">Decision protocol</a>
|
|
583
|
+
<a href="#sihirbaz">The /start wizard</a>
|
|
584
|
+
<a href="#tasarim">Design flow</a>
|
|
585
|
+
<a href="#asamalar">Four stages</a>
|
|
586
|
+
<a href="#kurul">Expert board</a>
|
|
587
|
+
<p>Quality and security</p>
|
|
588
|
+
<a href="#kontroller">Guardrail layers</a>
|
|
589
|
+
<a href="#bulgular">Findings reports</a>
|
|
590
|
+
<a href="#yapi">Project structure</a>
|
|
591
|
+
<p>Tracking</p>
|
|
592
|
+
<a href="#rapor">Reports and dashboard</a>
|
|
593
|
+
<a href="#limit">Limit awareness</a>
|
|
594
|
+
<p>Tools</p>
|
|
595
|
+
<a href="#yetenekler">Capability packs</a>
|
|
596
|
+
<a href="#skiller">Which skill for which job</a>
|
|
597
|
+
<a href="#araclar">Codex and Antigravity</a>
|
|
598
|
+
<p>Reference</p>
|
|
599
|
+
<a href="#komutlar">Commands</a>
|
|
600
|
+
<a href="#kit">Updates and maintenance</a>
|
|
601
|
+
<a href="#kurallar">Golden rules</a>
|
|
518
602
|
</nav>
|
|
519
603
|
|
|
520
604
|
<div class="doc">
|
|
521
605
|
|
|
522
606
|
<section id="baslangic">
|
|
523
|
-
<p class="path">
|
|
524
|
-
<h2>
|
|
525
|
-
<p class="lead">
|
|
526
|
-
<
|
|
527
|
-
|
|
607
|
+
<p class="path">Before you start</p>
|
|
608
|
+
<h2>Setup</h2>
|
|
609
|
+
<p class="lead">Pick your path first: are you starting a new idea in an empty folder, or do you already have code? The install is the same for both; what changes is the command you type after it.</p>
|
|
610
|
+
<div class="routes">
|
|
611
|
+
<article class="route primary">
|
|
612
|
+
<h3>I have a new idea</h3>
|
|
613
|
+
<p class="for">Empty folder, no code</p>
|
|
614
|
+
<ol class="steps">
|
|
615
|
+
<li><code>npx tillerhand init</code> in the folder</li>
|
|
616
|
+
<li>New session in the same folder, <code>/start your idea</code>: a plan in nine steps</li>
|
|
617
|
+
<li>Phase 0: CI and the first deploy</li>
|
|
618
|
+
<li>Every day <code>/build</code>: the next task</li>
|
|
619
|
+
</ol>
|
|
620
|
+
<a class="go" href="#sihirbaz">The /start wizard →</a>
|
|
621
|
+
</article>
|
|
622
|
+
<article class="route">
|
|
623
|
+
<h3>I already have code</h3>
|
|
624
|
+
<p class="for">A project that is under way, that you don't like, or want to bring into order</p>
|
|
625
|
+
<ol class="steps">
|
|
626
|
+
<li><code>npx tillerhand init</code> in the project root; your files are not overwritten</li>
|
|
627
|
+
<li>New session, <code>/adopt</code>: the code is scanned, the docs are derived from it</li>
|
|
628
|
+
<li>Tests for the critical flows first</li>
|
|
629
|
+
<li>Alignment tasks with <code>/build</code>, feature by feature</li>
|
|
630
|
+
</ol>
|
|
631
|
+
<a class="go" href="#adopt">How /adopt works →</a>
|
|
632
|
+
</article>
|
|
633
|
+
</div>
|
|
634
|
+
<p><b>Requirements:</b> <a href="https://claude.com/claude-code">Claude Code</a>, Git, Node.js 18+.</p>
|
|
635
|
+
<p>For the install, <b>pick one route</b>; all three copy the same files into the project (<code>.claude/</code>, <code>CLAUDE.md</code>, <code>AGENTS.md</code>, <code>docs/</code>) and create a git repo if there isn't one. If you're unsure, use npm. The project type is not asked at install, but during <code>/start</code>.</p>
|
|
528
636
|
<div class="table-wrap"><table>
|
|
529
|
-
<thead><tr><th>
|
|
637
|
+
<thead><tr><th>Route</th><th>When</th></tr></thead>
|
|
530
638
|
<tbody>
|
|
531
|
-
<tr><td><b>1. npm</b> (
|
|
532
|
-
<tr><td><b>2. Claude Code plugin</b></td><td>
|
|
533
|
-
<tr><td><b>3. git</b></td><td>
|
|
639
|
+
<tr><td><b>1. npm</b> (recommended)</td><td>The shortest route. In the terminal, or by telling Claude "run <code>npx tillerhand init</code> in this folder"</td></tr>
|
|
640
|
+
<tr><td><b>2. Claude Code plugin</b></td><td>Installed once on the computer, then <code>/tillerhand:init</code> in every new project. The plugin only does the install and fetches the latest version each time</td></tr>
|
|
641
|
+
<tr><td><b>3. git</b></td><td>To see the kit's source, change it or contribute. The kit sits in the project in a <code>vibe-kit/</code> folder and goes into <code>.gitignore</code></td></tr>
|
|
534
642
|
</tbody>
|
|
535
643
|
</table></div>
|
|
536
|
-
<pre class="term"><span class="c"># 1. npm
|
|
537
|
-
mkdir yeni-proje && cd yeni-proje
|
|
644
|
+
<pre class="term"><span class="c"># 1. npm: in the project folder</span>
|
|
538
645
|
npx tillerhand init
|
|
539
|
-
claude
|
|
540
|
-
<span class="c"># 2. plugin (Claude Code içinde, proje klasöründe)</span>
|
|
646
|
+
<span class="c"># 2. plugin: once (if /plugin does not open on the desktop, in the terminal: claude plugin marketplace add … and claude plugin install …)</span>
|
|
541
647
|
/plugin marketplace add burakdogrul/TillerHand
|
|
542
648
|
/plugin install tillerhand@tillerhand
|
|
649
|
+
<span class="c"># then in every new project:</span>
|
|
543
650
|
/tillerhand:init
|
|
544
|
-
<span class="c"># 3. git
|
|
651
|
+
<span class="c"># 3. git: in the project folder</span>
|
|
545
652
|
git clone https://github.com/burakdogrul/TillerHand.git vibe-kit
|
|
546
653
|
node vibe-kit/kit/kit.mjs init</pre>
|
|
547
|
-
<p>
|
|
548
|
-
<
|
|
549
|
-
<
|
|
550
|
-
/
|
|
551
|
-
<div class="note"><b>Hangi araç:</b> <code>init</code>, Claude Code, Codex ve Antigravity'den hangisiyle (birden fazlası olabilir) çalışacağını sorar. Doğrudan da verebilirsin: <code>init --tool codex</code>. Kit başka bir klasördeyse: <code>node <kit>/kit/kit.mjs init --project <proje></code>. Türkiye eki için <code>--addons tr</code>.</div>
|
|
552
|
-
<div class="note"><b>Var olan proje:</b> <code>/adopt</code> kodu tarar, belgeleri koddan çıkarır, neyi beğenmediğini sorar, eski CLAUDE.md'deki kuralları tek tek sorup AGENTS.md'ye taşır. Önce kritik akışlara doğru davranışa göre test yazılır, sonra yapı özellik özellik ayrı dalda kitin düzenine taşınır. Projenin dosyalarının üzerine yazılmaz; kitin hali <code>.kit-new</code> olarak yanına konur.</div>
|
|
553
|
-
<div class="note"><b>Eklentiler:</b> Proje ilk açıldığında Claude Code, <code>.claude/settings.json</code>'da tanımlı skill eklentilerini kurmayı önerir: Caveman, Impeccable, Taste Skill, UI UX Pro Max, Humanizer, Ponytail ve Matt Pocock. <code>/start</code> onayınla eksikleri proje kapsamında kurar (<code>plugins-sync.mjs --install</code>). Tasarım, güvenlik, yayın ve video paketleri kurulur ama kapalı kalır; ilgili komut gerektiğinde açmayı sorar.</div>
|
|
554
|
-
<div class="note"><b>Önerilen: kod haritası.</b> <a href="https://github.com/DeusData/codebase-memory-mcp">codebase-memory-mcp</a> bağlıysa AI kodu dosya dosya okumak yerine sorgular; proje büyüdükçe ciddi token tasarrufu sağlar. <code>/start</code> kurmak isteyip istemediğini sorar; kurulumu kendi terminalinde yaparsın.</div>
|
|
654
|
+
<p>After the install, open <b>a new Claude Code session</b> in the same folder; the kit's commands and guardrails load in the new session. Then <code>/start your idea</code> in a new project, or <code>/adopt</code> in an existing one.</p>
|
|
655
|
+
<div class="note"><b>Which tool:</b> <code>init</code> asks which of Claude Code, Codex and Antigravity you will use (one or more). You can also pass it directly: <code>init --tool codex</code>. If the kit is in another folder: <code>node <kit>/kit/kit.mjs init --project <project></code>. For the Turkey add-on use <code>--addons tr</code>.</div>
|
|
656
|
+
<div class="note"><b>Plugins:</b> When the project opens for the first time, Claude Code offers to install the skill plugins defined in <code>.claude/settings.json</code>: Caveman, Impeccable, Taste Skill, UI UX Pro Max, Humanizer, Ponytail and Matt Pocock. <code>/start</code> installs the missing ones at project scope with your approval (<code>plugins-sync.mjs --install</code>). The design, security, release and video packs are installed but stay off; the related command asks to turn them on when needed.</div>
|
|
657
|
+
<div class="note"><b>Recommended: the code map.</b> If <a href="https://github.com/DeusData/codebase-memory-mcp">codebase-memory-mcp</a> is connected, the AI queries the code instead of reading it file by file; as the project grows this saves a lot of tokens. <code>/start</code> asks whether you want it; you do the install in your own terminal.</div>
|
|
555
658
|
</section>
|
|
556
659
|
|
|
557
660
|
<section id="hic-bilmiyorsan">
|
|
558
|
-
<p class="path">
|
|
559
|
-
<h2>
|
|
560
|
-
<p class="lead">
|
|
661
|
+
<p class="path">Without coding</p>
|
|
662
|
+
<h2>If you're new: step by step</h2>
|
|
663
|
+
<p class="lead">You don't need to know how to code. Claude does the git, terminal and install work and asks you at every important step. You describe what you want and make the choices.</p>
|
|
561
664
|
<ol>
|
|
562
|
-
<li><b>
|
|
563
|
-
<li><b>
|
|
564
|
-
<li><b>
|
|
565
|
-
<li><b>
|
|
566
|
-
<li><b>
|
|
665
|
+
<li><b>Accounts (once):</b> a <a href="https://github.com">GitHub</a> account (free) and a Claude <b>Pro</b> or <b>Max</b> subscription.</li>
|
|
666
|
+
<li><b>Programs (once):</b> the <a href="https://claude.com/download">Claude desktop app</a>, <a href="https://nodejs.org">Node.js</a> (LTS version), <a href="https://git-scm.com/downloads">Git</a>. You can also install <a href="https://desktop.github.com">GitHub Desktop</a> if you like.</li>
|
|
667
|
+
<li><b>Project:</b> Create a folder for your project and select it in the <b>Code</b> tab of the Claude desktop app. Tell Claude "run <code>npx tillerhand init</code> in this folder". If you've <a href="#baslangic">installed the TillerHand plugin once</a>, <code>/tillerhand:init</code> works too.</li>
|
|
668
|
+
<li><b>Open:</b> Open a <b>new session</b> in the same folder; the kit's commands and guardrails load in the new session. If it offers to install the plugins, accept.</li>
|
|
669
|
+
<li><b>Start:</b> Type <code>/start your idea</code> (or <a href="#adopt"><code>/adopt</code></a> if you already have code). <b>The first option of every question is the recommended one</b>; if you're unsure, pick it. If you're on Pro, suggested answers for the first questions: profile <b>Light</b>, planning depth <b>Quick</b> (~25-35% of your 5-hour limit), dashboard <b>Yes</b>, narrator mode <b>Yes</b>.</li>
|
|
567
670
|
</ol>
|
|
568
|
-
<div class="note accent"><b>
|
|
671
|
+
<div class="note accent"><b>Good to know.</b> Pro has a 5-hour and a weekly usage limit; Claude warns at 90%, 95% and 99% but does not stop the work. If the limit runs out and the work is cut off, you continue from where you left off with <code>/build</code> after it resets. Decisions such as database, design and cost are never made without asking; hard-to-undo steps such as payment, data deletion and going live always need approval. To hand the project to someone else use <code>/handoff</code>; the new owner continues from the same place with <code>/handoff devral</code>.</div>
|
|
672
|
+
</section>
|
|
673
|
+
|
|
674
|
+
<section id="adopt">
|
|
675
|
+
<p class="path">If you already have code</p>
|
|
676
|
+
<h2>/adopt: bring an existing project into the kit</h2>
|
|
677
|
+
<p class="lead">The counterpart of <code>/start</code> for existing code. It starts from the code, not from an idea, but you still make the decisions. This session does not touch the application code or move files; moving and fixing happen later as <code>/build</code> tasks.</p>
|
|
678
|
+
<pre class="term"><span class="c"># in the project root</span>
|
|
679
|
+
npx tillerhand init
|
|
680
|
+
<span class="c"># new session in the same folder</span>
|
|
681
|
+
/adopt</pre>
|
|
682
|
+
<div class="phase">
|
|
683
|
+
<div class="n">1</div>
|
|
684
|
+
<div>
|
|
685
|
+
<p class="when">Read-only</p>
|
|
686
|
+
<h3>Scans</h3>
|
|
687
|
+
<p>The stack, folder structure, features, test status and the last 30 commits are extracted. A quick scan costs about 10-20% of the 5-hour limit; a deep scan also runs the findings reports you choose.</p>
|
|
688
|
+
</div>
|
|
689
|
+
</div>
|
|
690
|
+
<div class="phase">
|
|
691
|
+
<div class="n">2</div>
|
|
692
|
+
<div>
|
|
693
|
+
<p class="when">With your answers</p>
|
|
694
|
+
<h3>Derives the docs from the code</h3>
|
|
695
|
+
<p>The PRD, stack and architecture are drafted from the code, and anything unclear is asked: what don't you like, what do you want to improve? The rules in the old <code>CLAUDE.md</code> are asked one by one and moved to <code>AGENTS.md</code>. If a kit file clashes with one of the project's, it is placed next to it as <code>.kit-new</code> and the merge is asked.</p>
|
|
696
|
+
</div>
|
|
697
|
+
</div>
|
|
698
|
+
<div class="phase">
|
|
699
|
+
<div class="n">3</div>
|
|
700
|
+
<div>
|
|
701
|
+
<p class="when">Before moving</p>
|
|
702
|
+
<h3>Tests for the critical flows</h3>
|
|
703
|
+
<p>3-7 flows such as login, payment and data saving are chosen, and the correct behavior of each is asked from you. The test is written from your answer, not from what the code does today; if the two conflict, it becomes a finding.</p>
|
|
704
|
+
</div>
|
|
705
|
+
</div>
|
|
706
|
+
<div class="phase">
|
|
707
|
+
<div class="n">4</div>
|
|
708
|
+
<div>
|
|
709
|
+
<p class="when">Roadmap</p>
|
|
710
|
+
<h3>Alignment tasks</h3>
|
|
711
|
+
<div class="chips"><span>Phase 0 safe ground</span><span>Phase 1 move the structure</span><span>Phase 2 findings</span><span>Phase 3 new features</span></div>
|
|
712
|
+
<p>The structure is moved on a separate branch, feature by feature. After each task the tests and the app must still work; if something breaks, <code>/rollback</code>. Then <code>/build</code> as every day.</p>
|
|
713
|
+
</div>
|
|
714
|
+
</div>
|
|
569
715
|
</section>
|
|
570
716
|
|
|
571
717
|
<section id="gunluk">
|
|
572
|
-
<p class="path">
|
|
573
|
-
<h2>
|
|
718
|
+
<p class="path">Routine</p>
|
|
719
|
+
<h2>Every day</h2>
|
|
574
720
|
<div class="table-wrap"><table>
|
|
575
|
-
<thead><tr><th>
|
|
721
|
+
<thead><tr><th>When</th><th>What you type</th></tr></thead>
|
|
576
722
|
<tbody>
|
|
577
|
-
<tr><td
|
|
578
|
-
<tr><td>
|
|
579
|
-
<tr><td>
|
|
580
|
-
<tr><td>
|
|
581
|
-
<tr><td>
|
|
723
|
+
<tr><td>When you start work</td><td><code>/build</code>: you don't need to type a task code; it takes the next task itself and tests it</td></tr>
|
|
724
|
+
<tr><td>If you wonder about the status</td><td><code>where are we?</code> or <code>/dashboard</code></td></tr>
|
|
725
|
+
<tr><td>If something breaks</td><td><code>/rollback</code>: safely returns to the last working state</td></tr>
|
|
726
|
+
<tr><td>If you see a bug</td><td><code>/fix-bug symptom</code>: finds the root cause, writes a red test first, then fixes it</td></tr>
|
|
727
|
+
<tr><td>When you stop</td><td><code>/wrap-up</code> (saves everything), then <code>/clear</code>. On a clean screen the next command is written</td></tr>
|
|
582
728
|
</tbody>
|
|
583
729
|
</table></div>
|
|
584
730
|
</section>
|
|
585
731
|
|
|
586
732
|
<section id="protokol">
|
|
587
733
|
<p class="path">docs/workflow/decision-protocol.md</p>
|
|
588
|
-
<h2>
|
|
589
|
-
<p class="lead"
|
|
734
|
+
<h2>You make the decisions</h2>
|
|
735
|
+
<p class="lead">Every choice about product, tech, design, content, data, security and cost is a decision point. The AI prepares the options, puts its recommendation first, and writes when each option is better and what it costs. Your answer is saved to <code>docs/decisions/log.md</code>, then applied, and never asked again.</p>
|
|
590
736
|
<div class="grid2" style="margin-bottom:20px">
|
|
591
737
|
<div class="window">
|
|
592
|
-
<div class="bar"><i></i><i></i><i></i><span
|
|
738
|
+
<div class="bar"><i></i><i></i><i></i><span>Example question</span></div>
|
|
593
739
|
<div class="body">
|
|
594
|
-
<p class="ctx">
|
|
595
|
-
<p class="q">
|
|
596
|
-
<div class="opt rec"><b>Python + FastAPI (
|
|
597
|
-
<div class="opt"><b>Node.js + Hono</b><span>
|
|
598
|
-
<div class="opt"><b>Go</b><span
|
|
740
|
+
<p class="ctx">Phase: Setup 4/9 · Technology. This decision shapes all the backend code; changing it later is expensive.</p>
|
|
741
|
+
<p class="q">Which language and framework should we write the backend in?</p>
|
|
742
|
+
<div class="opt rec"><b>Python + FastAPI (Recommended)</b><span>Your idea involves reading documents and AI summaries; Python has the strongest ecosystem for that.</span></div>
|
|
743
|
+
<div class="opt"><b>Node.js + Hono</b><span>If the frontend is TypeScript too, you get one language and shared types.</span></div>
|
|
744
|
+
<div class="opt"><b>Go</b><span>If you need very high traffic and low server cost; development is slower.</span></div>
|
|
599
745
|
</div>
|
|
600
746
|
</div>
|
|
601
747
|
<div class="table-wrap" style="margin:0"><table>
|
|
602
|
-
<thead><tr><th>
|
|
748
|
+
<thead><tr><th>What you say</th><th>What happens</th></tr></thead>
|
|
603
749
|
<tbody>
|
|
604
|
-
<tr><td>"
|
|
605
|
-
<tr><td>"
|
|
606
|
-
<tr><td>"
|
|
607
|
-
<tr><td><code>/ask-mode</code></td><td>
|
|
750
|
+
<tr><td>"don't ask about design"</td><td>Only the <code>tasarim</code> topic is closed. The AI picks the recommended option, records the decision as "otomatik" (automatic) and reports it in the status block. Previews are still produced.</td></tr>
|
|
751
|
+
<tr><td>"don't ask anything"</td><td>All topics are closed.</td></tr>
|
|
752
|
+
<tr><td>"ask again"</td><td>The topic(s) reopen.</td></tr>
|
|
753
|
+
<tr><td><code>/ask-mode</code></td><td>Shows the current mode and the automatic decisions; changes it with <code>on</code> / <code>off <topic></code>.</td></tr>
|
|
608
754
|
</tbody>
|
|
609
755
|
</table></div>
|
|
610
756
|
</div>
|
|
611
757
|
<div class="table-wrap"><table>
|
|
612
|
-
<thead><tr><th>
|
|
758
|
+
<thead><tr><th>Topic</th><th>Example decisions</th></tr></thead>
|
|
613
759
|
<tbody>
|
|
614
|
-
<tr><td class="f">urun</td><td>MVP
|
|
615
|
-
<tr><td class="f">teknik</td><td>
|
|
616
|
-
<tr><td class="f">tasarim</td><td>
|
|
617
|
-
<tr><td class="f">icerik</td><td>
|
|
618
|
-
<tr><td class="f">veri</td><td>
|
|
619
|
-
<tr><td class="f">guvenlik</td><td>
|
|
620
|
-
<tr><td class="f">maliyet</td><td
|
|
760
|
+
<tr><td class="f">urun</td><td>MVP scope, priority, user flow, price</td></tr>
|
|
761
|
+
<tr><td class="f">teknik</td><td>Language, framework, database, auth, hosting, adding a library, API style</td></tr>
|
|
762
|
+
<tr><td class="f">tasarim</td><td>Style direction, color, typeface, layout, component style, animation, dark theme</td></tr>
|
|
763
|
+
<tr><td class="f">icerik</td><td>Copy, tone of voice, formal/informal address, headline and CTA alternatives</td></tr>
|
|
764
|
+
<tr><td class="f">veri</td><td>Data model, delete behavior, retention period</td></tr>
|
|
765
|
+
<tr><td class="f">guvenlik</td><td>Roles, session length, rate limits, personal data</td></tr>
|
|
766
|
+
<tr><td class="f">maliyet</td><td>Paid service, plan tier, AI model, spending limit</td></tr>
|
|
621
767
|
</tbody>
|
|
622
768
|
</table></div>
|
|
623
|
-
<div class="note">
|
|
769
|
+
<div class="note">For hard-to-reverse decisions (database, auth, payment, data model; a "one-way door") the board's opinion, and if needed the council's, is taken first. Whatever the question mode, approval is always asked for: data deletion, deploys to prod, anything that spends money, irreversible commands. Implementation details such as file and variable names are not asked, only reported.</div>
|
|
624
770
|
</section>
|
|
625
771
|
|
|
626
772
|
<section id="sihirbaz">
|
|
627
773
|
<p class="path">.claude/commands/start.md</p>
|
|
628
|
-
<h2>/start:
|
|
629
|
-
<p class="lead">
|
|
774
|
+
<h2>/start: the nine-step wizard</h2>
|
|
775
|
+
<p class="lead">It makes all the basic decisions of the project without writing application code. Decisions are written to the log the moment they are made and show up on the dashboard. If it stops halfway, it continues from the step it reached.</p>
|
|
630
776
|
<div class="table-wrap"><table>
|
|
631
|
-
<thead><tr><th>
|
|
777
|
+
<thead><tr><th>Step</th><th>What happens</th><th>Example question</th><th>Skill</th></tr></thead>
|
|
632
778
|
<tbody>
|
|
633
|
-
<tr><td class="f">0
|
|
634
|
-
<tr><td class="f">1
|
|
635
|
-
<tr><td class="f">2
|
|
636
|
-
<tr><td class="f">3
|
|
637
|
-
<tr><td class="f">4
|
|
638
|
-
<tr><td class="f">5
|
|
639
|
-
<tr><td class="f">6
|
|
640
|
-
<tr><td class="f">7
|
|
641
|
-
<tr><td class="f">8
|
|
642
|
-
<tr><td class="f">9
|
|
779
|
+
<tr><td class="f">0 Preparation</td><td>Profile (Light / Standard / Full), planning depth (with its cost), tool, dashboard, node, git, skill, limit and code map checks</td><td>"Planning depth: Quick (~25-35%) / Standard (~50-70%) / Detailed (~80-100%)?"</td><td>caveman</td></tr>
|
|
780
|
+
<tr><td class="f">1 Idea</td><td>The idea is questioned in rounds, the PRD is written</td><td>"Which features should the first version have?" (multi-select; unselected ones are out of scope)</td><td>grilling</td></tr>
|
|
781
|
+
<tr><td class="f">2 Type</td><td>Web/SaaS, mobile or backend; whether there is an AI feature</td><td>"Your users work at a desk; I recommend web. Does that fit?"</td><td>-</td></tr>
|
|
782
|
+
<tr><td class="f">3 Install</td><td><code>node kit/kit.mjs install</code> places the type and the folder map</td><td>-</td><td>-</td></tr>
|
|
783
|
+
<tr><td class="f">4 Technology</td><td>The 10-12 decisions in the type's decision catalog, one by one</td><td>"Database and auth: Supabase / Neon + Better Auth / Firebase?"</td><td>research</td></tr>
|
|
784
|
+
<tr><td class="f">5 Architecture</td><td>Data model, login methods, roles, services and cost, glossary, unit economics</td><td>"Should a deleted invoice go to the trash or be deleted permanently?"</td><td>domain-modeling, codebase-design</td></tr>
|
|
785
|
+
<tr><td class="f">6 Board</td><td>The expert board suggested for the type; members work with the review role's model, and the agents are generated in the project. An expensive step: cost first, then "Do it / Do it light / Leave for later"</td><td>"Who should be on the board?" (multi-select)</td><td>-</td></tr>
|
|
786
|
+
<tr><td class="f">7 Design</td><td><code>/design general</code>: style, color, typeface and details through visual previews. An expensive step: the cost is asked first</td><td>"Which of these three landing pages?"</td><td>taste, impeccable, ui-ux-pro-max</td></tr>
|
|
787
|
+
<tr><td class="f">8 Roadmap</td><td>Tasks with the acceptance test first, the first feature, the launch goal</td><td>"Which feature should we start with in Phase 1?"</td><td>-</td></tr>
|
|
788
|
+
<tr><td class="f">9 Wrap-up</td><td>Summary, steps left for later, the first task</td><td>-</td><td>-</td></tr>
|
|
643
789
|
</tbody>
|
|
644
790
|
</table></div>
|
|
645
|
-
<div class="note">
|
|
791
|
+
<div class="note">When the stack is chosen, the Requirements/Setup section of the project's README and the version file (<code>.nvmrc</code> / <code>.python-version</code>) are filled in; the project can be set up the same way on another computer. <code>/release</code> and the monthly <code>/maintain</code> test this by installing it in a clean folder.</div>
|
|
646
792
|
</section>
|
|
647
793
|
|
|
648
794
|
<section id="tasarim">
|
|
649
|
-
<p class="path">/design ·
|
|
650
|
-
<h2>
|
|
651
|
-
<p class="lead">
|
|
652
|
-
<div class="flow" role="list" aria-label="
|
|
653
|
-
<span role="listitem">
|
|
654
|
-
<span role="listitem">
|
|
655
|
-
<span role="listitem">
|
|
656
|
-
<span role="listitem">
|
|
795
|
+
<p class="path">/design · visual preview</p>
|
|
796
|
+
<h2>You choose design by seeing it</h2>
|
|
797
|
+
<p class="lead">For every design decision, a sample with real content is produced for each option (<code>.previews/</code>), opened in the browser, and a screenshot is shown; then you are asked. Each style direction is drawn with its own skill, so the differences between the options are real.</p>
|
|
798
|
+
<div class="flow" role="list" aria-label="Design flow">
|
|
799
|
+
<span role="listitem">Style direction · 3 samples</span><i aria-hidden="true">→</i>
|
|
800
|
+
<span role="listitem">Color · 3 palettes</span><i aria-hidden="true">→</i>
|
|
801
|
+
<span role="listitem">Typeface · 3 pairs</span><i aria-hidden="true">→</i>
|
|
802
|
+
<span role="listitem">Details</span><i aria-hidden="true">→</i>
|
|
657
803
|
<span role="listitem">DESIGN.md</span><i aria-hidden="true">→</i>
|
|
658
|
-
<span role="listitem">
|
|
659
|
-
<span role="listitem">
|
|
660
|
-
<span role="listitem">
|
|
804
|
+
<span role="listitem">Page structure</span><i aria-hidden="true">→</i>
|
|
805
|
+
<span role="listitem">Copy + humanizer</span><i aria-hidden="true">→</i>
|
|
806
|
+
<span role="listitem">Apply</span><i aria-hidden="true">→</i>
|
|
661
807
|
<span role="listitem">critique · audit · polish</span>
|
|
662
808
|
</div>
|
|
663
809
|
<div class="tiles">
|
|
664
|
-
<article class="tile"><h3>Premium / Apple
|
|
665
|
-
<article class="tile"><h3>Minimal
|
|
666
|
-
<article class="tile"><h3>
|
|
667
|
-
<article class="tile"><h3>
|
|
668
|
-
<article class="tile"><h3
|
|
669
|
-
<article class="tile"><h3>
|
|
810
|
+
<article class="tile"><h3>Premium / Apple style</h3><p class="stack">taste-skill:high-end-visual-design</p><ul><li>Lots of space, large and thin type, soft transitions</li><li>Consumer product, brand perception, high price</li></ul></article>
|
|
811
|
+
<article class="tile"><h3>Minimal editorial</h3><p class="stack">taste-skill:minimalist-ui</p><ul><li>Warm monochrome, type-driven, flat surfaces</li><li>Content, portfolio, calm SaaS</li></ul></article>
|
|
812
|
+
<article class="tile"><h3>Bold and animated</h3><p class="stack">taste-skill:gpt-taste</p><ul><li>Giant type, scroll-driven animation, bento</li><li>Launch page, young audience</li></ul></article>
|
|
813
|
+
<article class="tile"><h3>Industrial / brutalist</h3><p class="stack">taste-skill:industrial-brutalist-ui</p><ul><li>Raw grid, terminal look</li><li>Developer tool, data-dense dashboard</li></ul></article>
|
|
814
|
+
<article class="tile"><h3>Functional product UI</h3><p class="stack">impeccable + ui-ux-pro-max:ui-styling</p><ul><li>Plain, information-dense, fast to use</li><li>Panel, admin, B2B tool</li></ul></article>
|
|
815
|
+
<article class="tile"><h3>Common to every direction</h3><p class="stack">impeccable · ui-ux-pro-max · humanizer</p><ul><li>PRODUCT.md and DESIGN.md in Impeccable</li><li>Palette and typeface candidates from UI UX Pro Max</li><li>Copy passes through Humanizer</li></ul></article>
|
|
670
816
|
</div>
|
|
671
|
-
<div class="note"><b
|
|
817
|
+
<div class="note"><b>Inspiration brand (optional):</b> The DESIGN.md of a product you like (awesome-design-md) is downloaded and its principles are distilled with Impeccable. The logo, name and exact palette are not taken; there is no brand imitation.</div>
|
|
672
818
|
</section>
|
|
673
819
|
|
|
674
820
|
<section id="asamalar">
|
|
675
|
-
<p class="path"
|
|
676
|
-
<h2>
|
|
677
|
-
<p class="lead">
|
|
821
|
+
<p class="path">After /start</p>
|
|
822
|
+
<h2>Four stages</h2>
|
|
823
|
+
<p class="lead">Every stage has an exit gate: you don't move on to the next one until the items at the gate are complete.</p>
|
|
678
824
|
<div class="phase">
|
|
679
825
|
<div class="n">1</div>
|
|
680
826
|
<div>
|
|
681
|
-
<p class="when"
|
|
682
|
-
<h3>
|
|
683
|
-
<div class="chips"><span>/build G-001</span><span>… G-007</span><span>CI
|
|
684
|
-
<div class="gate"><b
|
|
827
|
+
<p class="when">Day one · Phase 0</p>
|
|
828
|
+
<h3>Setup and first deploy</h3>
|
|
829
|
+
<div class="chips"><span>/build G-001</span><span>… G-007</span><span>CI green</span><span>prod URL</span><span>Sentry</span><span>tokens in code</span></div>
|
|
830
|
+
<div class="gate"><b>Exit gate</b><ul><li>dev, test, lint and build commands work</li><li>A trial commit containing a secret is rejected, CI is green on GitHub</li><li>"Hello world" opens at the prod URL, error tracking works</li></ul></div>
|
|
685
831
|
</div>
|
|
686
832
|
</div>
|
|
687
833
|
<div class="phase">
|
|
688
834
|
<div class="n">2</div>
|
|
689
835
|
<div>
|
|
690
|
-
<p class="when">
|
|
691
|
-
<h3>
|
|
692
|
-
<div class="flow" role="list" aria-label="
|
|
693
|
-
<span role="listitem">/plan-task ·
|
|
694
|
-
<span role="listitem">/build ·
|
|
695
|
-
<span role="listitem">
|
|
836
|
+
<p class="when">Every task · Phase 1–2</p>
|
|
837
|
+
<h3>Development cycle</h3>
|
|
838
|
+
<div class="flow" role="list" aria-label="Task cycle">
|
|
839
|
+
<span role="listitem">/plan-task · decision points are asked</span><i aria-hidden="true">→</i>
|
|
840
|
+
<span role="listitem">/build · test-writer writes the tests</span><i aria-hidden="true">→</i>
|
|
841
|
+
<span role="listitem">proof</span><i aria-hidden="true">→</i>
|
|
696
842
|
<span role="listitem">/review-changes</span><i aria-hidden="true">→</i>
|
|
697
|
-
<span role="listitem">
|
|
843
|
+
<span role="listitem">gate + board → commit</span><i aria-hidden="true">→</i>
|
|
698
844
|
<span role="listitem">/wrap-up</span>
|
|
699
845
|
</div>
|
|
700
|
-
<div class="gate"><b>"
|
|
846
|
+
<div class="gate"><b>Definition of "done"</b><ul><li>All decisions that came up in the task were asked and recorded</li><li>Tests are green, proof that it works was shown</li><li>If there is an interface: it matches DESIGN.md, an Impeccable critique was done, the copy passed through Humanizer</li><li>No RET in the task-end board meeting</li></ul></div>
|
|
701
847
|
</div>
|
|
702
848
|
</div>
|
|
703
849
|
<div class="phase">
|
|
704
850
|
<div class="n">3</div>
|
|
705
851
|
<div>
|
|
706
|
-
<p class="when">
|
|
707
|
-
<h3>
|
|
852
|
+
<p class="when">Launch · and every release</p>
|
|
853
|
+
<h3>Going live</h3>
|
|
708
854
|
<div class="chips"><span>/release first</span><span>/release</span><span>security-auditor</span><span>security-review</span><span>ponytail-audit</span><span>impeccable audit</span></div>
|
|
709
|
-
<p><code>/release first</code>
|
|
710
|
-
<div class="gate"><b
|
|
855
|
+
<p><code>/release first</code> walks you through the hosting, environment variables, domain and DNS, backup and point-in-time recovery (PITR), and rollback rehearsal for your provider (Vercel, Supabase, Railway, EAS) at the first launch. The steps come from the official docs, with source and date; you enter the secret in the dashboard of the provider.</p>
|
|
856
|
+
<div class="gate"><b>Exit gate</b><ul><li>All ❌ items are closed; the things you need to check were asked</li><li>A restore from backup was tried, the rollback path is written down</li><li>KVKK texts are published, spending limits are set, live monitoring is on</li></ul></div>
|
|
711
857
|
</div>
|
|
712
858
|
</div>
|
|
713
859
|
<div class="phase">
|
|
714
860
|
<div class="n">4</div>
|
|
715
861
|
<div>
|
|
716
|
-
<p class="when">
|
|
717
|
-
<h3>
|
|
862
|
+
<p class="when">While live · regularly</p>
|
|
863
|
+
<h3>Maintenance</h3>
|
|
718
864
|
<div class="chips"><span>/maintain weekly</span><span>monthly · ponytail-debt</span><span>quarterly · ponytail-audit</span><span>/user-feedback</span><span>/retro</span></div>
|
|
719
|
-
<p>
|
|
720
|
-
<div class="gate"><b>
|
|
865
|
+
<p>Live monitoring tests a critical flow and the response time every 3 hours; when it breaks, a GitHub issue is opened, a warning shows on the dashboard and <code>/fix-bug</code> is suggested.</p>
|
|
866
|
+
<div class="gate"><b>In an incident, in order</b><ul><li><b>Stop</b>, <b>Record</b>, <b>Fix</b>, <b>Notify</b> (the KVKK Board within 72 hours for a personal data breach), <b>Learn</b></li></ul></div>
|
|
721
867
|
</div>
|
|
722
868
|
</div>
|
|
723
869
|
</section>
|
|
724
870
|
|
|
725
871
|
<section id="kurul">
|
|
726
872
|
<p class="path">.claude/agents/board-* · docs/workflow/board.md</p>
|
|
727
|
-
<h2>
|
|
728
|
-
<p class="lead">
|
|
873
|
+
<h2>Expert board</h2>
|
|
874
|
+
<p class="lead">Expert agents are created in your project for the product type you choose and tailored to the stack. They review the work continuously, recommend decisions and keep you informed. They are advisors; they stop the work only on a critical finding. The decision is always yours.</p>
|
|
729
875
|
<div class="tiles">
|
|
730
|
-
<article class="tile"><h3>Web / SaaS</h3><p class="stack"
|
|
731
|
-
<article class="tile"><h3>
|
|
732
|
-
<article class="tile"><h3>Backend</h3><p class="stack"
|
|
876
|
+
<article class="tile"><h3>Web / SaaS</h3><p class="stack">product · architect · security · ux · performance · privacy · qa</p><ul><li>+ devops, + ai (if there is an AI add-on)</li></ul></article>
|
|
877
|
+
<article class="tile"><h3>Mobile</h3><p class="stack">product · architect · security · ux · mobile · privacy · qa</p><ul><li>+ devops, + ai</li></ul></article>
|
|
878
|
+
<article class="tile"><h3>Backend</h3><p class="stack">product · architect · security · api · devops · qa</p><ul><li>+ privacy (if there is personal data), + ai</li></ul></article>
|
|
733
879
|
</div>
|
|
734
880
|
<div class="table-wrap"><table>
|
|
735
|
-
<thead><tr><th>
|
|
881
|
+
<thead><tr><th>Meeting</th><th>When</th><th>Who</th><th>Model</th></tr></thead>
|
|
736
882
|
<tbody>
|
|
737
|
-
<tr><td>Plan ·
|
|
738
|
-
<tr><td>
|
|
739
|
-
<tr><td>Commit (
|
|
740
|
-
<tr><td>
|
|
741
|
-
<tr><td>
|
|
883
|
+
<tr><td>Plan · council</td><td>At the end of /plan-task, before approval</td><td>Product + Architect + relevant members (at most 4) + chair</td><td>review role · chair opus</td></tr>
|
|
884
|
+
<tr><td>Task end</td><td>At the end of /build</td><td>Relevant members (at most 3)</td><td>review role</td></tr>
|
|
885
|
+
<tr><td>Commit (light)</td><td>Before every commit; the hook enforces it. Skipped if the task-end meeting approved the same changes</td><td>At most 2 relevant members, only files changed since the last approval</td><td>haiku</td></tr>
|
|
886
|
+
<tr><td>Phase end · going live</td><td>/board convene, /release first</td><td>The whole board + chair</td><td>review role · chair opus</td></tr>
|
|
887
|
+
<tr><td>Decision council</td><td>A one-way door decision, /board council</td><td>3 advisors answer the same question + chair</td><td>haiku · sonnet · opus · chair opus</td></tr>
|
|
742
888
|
</tbody>
|
|
743
889
|
</table></div>
|
|
744
|
-
<h3>
|
|
745
|
-
<p>Karpathy'
|
|
890
|
+
<h3>Council: three stages</h3>
|
|
891
|
+
<p>Karpathy's <a href="https://github.com/karpathy/llm-council">llm-council</a> structure, adapted to the board. Heavy meetings and decisions that are expensive to reverse go through three stages:</p>
|
|
746
892
|
<div class="tiles">
|
|
747
|
-
<article class="tile"><h3>1 ·
|
|
748
|
-
<article class="tile"><h3>2 ·
|
|
749
|
-
<article class="tile"><h3>
|
|
750
|
-
<article class="tile"><h3>3 ·
|
|
893
|
+
<article class="tile"><h3>1 · First opinions</h3><p>Members (or advisors on different models) work in parallel without knowing about each other. Opinions are labeled A, B, C; findings A1, A2…</p></article>
|
|
894
|
+
<article class="tile"><h3>2 · Anonymous cross-vote</h3><p>Each member reads the others' opinions without knowing who wrote them, votes each finding DOĞRU · ABARTILI · YANLIŞ (true · exaggerated · false), writes what is missing, and ranks the opinions.</p></article>
|
|
895
|
+
<article class="tile"><h3>Count (code)</h3><p><code>council.mjs</code> computes the average rank, the finding votes and the consensus percentage in code; the model can't change the numbers.</p></article>
|
|
896
|
+
<article class="tile"><h3>3 · Chair</h3><p>board-chair (opus) reads the minutes, writes the decision, drops refuted findings with a reason, and keeps the minority opinion. It can't drop a disputed critical finding; it asks you.</p></article>
|
|
751
897
|
</div>
|
|
752
|
-
<p
|
|
898
|
+
<p>The <b>profile</b> decides when the council meets (one council costs about 12% of the 5-hour limit on Pro):</p>
|
|
753
899
|
<div class="table-wrap"><table>
|
|
754
|
-
<thead><tr><th></th><th>
|
|
900
|
+
<thead><tr><th></th><th>Light (recommended for Pro)</th><th>Standard</th><th>Full</th></tr></thead>
|
|
755
901
|
<tbody>
|
|
756
|
-
<tr><td>
|
|
757
|
-
<tr><td>Commit
|
|
758
|
-
<tr><td>
|
|
759
|
-
<tr><td>
|
|
760
|
-
<tr><td>
|
|
902
|
+
<tr><td>Plugins</td><td>Core 6 + the type's LSP and stack skills</td><td>Core 8 + stack; packs when needed</td><td>Core 8 + stack; packs when needed</td></tr>
|
|
903
|
+
<tr><td>Commit review</td><td>Off</td><td>On</td><td>On</td></tr>
|
|
904
|
+
<tr><td>Command list</td><td>10 core commands with descriptions, the rest by name only (~1,100 tokens less)</td><td>Like Light</td><td>All with descriptions</td></tr>
|
|
905
|
+
<tr><td>Meeting council</td><td>None</td><td>Phase end, going live</td><td>Plan, phase end, going live, RET</td></tr>
|
|
906
|
+
<tr><td>Decision council</td><td>Database, auth</td><td>Database, auth</td><td>All one-way decisions</td></tr>
|
|
761
907
|
</tbody>
|
|
762
908
|
</table></div>
|
|
763
|
-
<p>
|
|
764
|
-
<div class="note">RET
|
|
909
|
+
<p>The "(Recommended)" option of a question asked in the decision council comes from the council; under each option you see the council's vote and the minority opinion. Minutes are in <code>docs/workflow/council/</code>, with a summary in the dashboard's Board tab.</p>
|
|
910
|
+
<div class="note">When a RET comes, the task is not counted as done. You get three options: fix it (recommended), accept the risk and record the reason, or roll the task back. If members disagree, the two opinions are shown side by side and the decision is asked from you.</div>
|
|
765
911
|
</section>
|
|
766
912
|
|
|
767
913
|
<section id="kontroller">
|
|
768
|
-
<p class="path">
|
|
769
|
-
<h2>
|
|
770
|
-
<p class="lead">
|
|
914
|
+
<p class="path">Rules are written, checks are automatic</p>
|
|
915
|
+
<h2>Guardrail layers</h2>
|
|
916
|
+
<p class="lead">Decisions are made in Claude Code's permission layer (allow · ask · block); the AI can't bypass them. In Codex and Antigravity the same scripts run through that tool's hooks.</p>
|
|
917
|
+
<figure class="gflow" aria-label="Example: the order of the guardrails and one stop">
|
|
918
|
+
<div class="lane">
|
|
919
|
+
<p class="lane-h">On every file write and command</p>
|
|
920
|
+
<ol>
|
|
921
|
+
<li class="start"><span class="node">AI writes / runs</span></li>
|
|
922
|
+
<li><span class="node">Secret block</span></li>
|
|
923
|
+
<li><span class="node">Destructive command shield</span></li>
|
|
924
|
+
<li><span class="node">Package gate</span></li>
|
|
925
|
+
<li><span class="node">Structure and scope</span></li>
|
|
926
|
+
<li class="stop"><span class="node"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" aria-hidden="true"><path d="M18 6L6 18M6 6l12 12"/></svg>Test separation: stopped</span></li>
|
|
927
|
+
</ol>
|
|
928
|
+
</div>
|
|
929
|
+
<div class="lane">
|
|
930
|
+
<p class="lane-h">On every commit</p>
|
|
931
|
+
<ol>
|
|
932
|
+
<li><span class="node">Deterministic gate</span></li>
|
|
933
|
+
<li><span class="node">Test source</span></li>
|
|
934
|
+
<li><span class="node">Board</span></li>
|
|
935
|
+
<li class="pass"><span class="node"><svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M20 6L9 17l-5-5"/></svg>Commit</span></li>
|
|
936
|
+
</ol>
|
|
937
|
+
</div>
|
|
938
|
+
<figcaption>Example: the code agent tried to change a test file and test separation stopped it. Each layer is a separate script; if one stops, nothing happens, and on an "ask" decision the approval comes to you.</figcaption>
|
|
939
|
+
</figure>
|
|
771
940
|
<div class="table-wrap"><table>
|
|
772
|
-
<thead><tr><th>
|
|
941
|
+
<thead><tr><th>Layer</th><th>What it does</th></tr></thead>
|
|
773
942
|
<tbody>
|
|
774
|
-
<tr><td>
|
|
775
|
-
<tr><td>
|
|
776
|
-
<tr><td>
|
|
777
|
-
<tr><td>
|
|
778
|
-
<tr><td>
|
|
779
|
-
<tr><td>Test
|
|
780
|
-
<tr><td>Test
|
|
781
|
-
<tr><td>
|
|
782
|
-
<tr><td>Commit
|
|
783
|
-
<tr><td>
|
|
784
|
-
<tr><td>
|
|
785
|
-
<tr><td>
|
|
786
|
-
<tr><td>Dev/prod
|
|
787
|
-
<tr><td>
|
|
943
|
+
<tr><td>Secret block</td><td>Blocks API keys (Anthropic, OpenAI, Stripe, AWS, GitHub, Supabase…) written to code or docs; also scans before a commit</td></tr>
|
|
944
|
+
<tr><td>Destructive command shield</td><td><code>DROP</code>, <code>TRUNCATE</code>, unconditional <code>DELETE</code>, <code>db reset</code> and pulling prod environment variables onto the machine are blocked; prod deploy, rollback, store submission and migrations are asked</td></tr>
|
|
945
|
+
<tr><td>Package gate</td><td>A package that is installed, or downloaded and run with <code>npx</code> or <code>uvx</code>, is checked against the registry: if it doesn't exist it is blocked; if it is very new, rarely downloaded or looks like a popular package, it is asked</td></tr>
|
|
946
|
+
<tr><td>Structure guard</td><td>A new file outside the map is asked; clutter such as <code>*.bak</code>, <code>*-old.*</code>, copies and <code>temp/</code> is blocked</td></tr>
|
|
947
|
+
<tr><td>Config approval</td><td><code>CLAUDE.md</code>, <code>AGENTS.md</code>, <code>.claude/</code>, <code>.codex/</code>, <code>.mcp.json</code> and workflow files don't change without your approval</td></tr>
|
|
948
|
+
<tr><td>Test separation</td><td>The tests are written before the code by a separate agent (<code>test-writer</code>, a different model is recommended), not by whoever writes the code. Nobody but this agent can write to a test file: the main session and the code agent are blocked if they try. A test file changed indirectly by a patch or script also stops at the commit gate. So whoever writes the code can't shape the test to fit their own code</td></tr>
|
|
949
|
+
<tr><td>Test protection</td><td>Deleting or commenting out an assertion, <code>.skip</code>/<code>.only</code>, a loosened assertion, deleting or moving a test file, and narrowing coverage in the test config are asked; so is writing to a test file through the shell</td></tr>
|
|
950
|
+
<tr><td>Deterministic gate</td><td><code>gate.mjs --run</code>: lint, type check, tests and Semgrep run; the output feeds the board, and a red check counts as RET. If the "must not change" behaviors in the spec have no test or the test is red, the gate is red. It is also red if an added line contains a path specific to this machine (the full path of the project folder or the home folder). A new or changed command is first shown to you for approval</td></tr>
|
|
951
|
+
<tr><td>Commit gate</td><td>No commit without a board review and a green gate for the same changes; the task-end approval also counts for the commit, so the same change is not reviewed twice; skipping the review (<code>--skip</code>) is asked every time</td></tr>
|
|
952
|
+
<tr><td>Edit lock</td><td>While <code>/freeze <folder></code> is on, the AI writes only to that folder; writing outside through the shell is asked, and a symlink can't escape it</td></tr>
|
|
953
|
+
<tr><td>Scope shield</td><td>After <code>/plan-task</code> approval, the plan's file list is saved; writing to an existing file not on the list is asked. Turning the shield on and off is asked too</td></tr>
|
|
954
|
+
<tr><td>Edit round counter</td><td>When the same code file is edited for the 5th and 10th time in a session, a Semgrep and security review reminder appears</td></tr>
|
|
955
|
+
<tr><td>Dev/prod separation</td><td>The local environment and the AI (including read-only MCP) connect only to the dev project; prod secrets stay in the hosting dashboard</td></tr>
|
|
956
|
+
<tr><td>Security review</td><td><code>security-guidance</code>: a risky-pattern warning while writing (service_role on the client, personal data in logs, innerHTML), and a review by a separate model at the commit</td></tr>
|
|
788
957
|
</tbody>
|
|
789
958
|
</table></div>
|
|
790
959
|
<div class="table-wrap"><table>
|
|
791
|
-
<thead><tr><th>
|
|
960
|
+
<thead><tr><th>When</th><th>Where</th><th>What it catches</th></tr></thead>
|
|
792
961
|
<tbody>
|
|
793
|
-
<tr><td>Push
|
|
794
|
-
<tr><td>
|
|
795
|
-
<tr><td>
|
|
962
|
+
<tr><td>Push and PR</td><td>GitHub Actions</td><td>Lint, types, tests, build, Semgrep, duplicate code, folder structure, dependency vulnerabilities, a secret scan across the whole history; a complexity budget on changed files (function: complexity 15 / 80 lines, file: 400 lines); if Supabase is used, an RLS adversarial test against a local Supabase</td></tr>
|
|
963
|
+
<tr><td>Live</td><td>Live monitoring · cloud agents (optional)</td><td>A critical-flow and response-time test every 3 hours, an issue and a dashboard warning when it breaks; a fix suggestion for red CI; a weekly maintenance report</td></tr>
|
|
964
|
+
<tr><td>Every week</td><td>Dependabot</td><td>Outdated dependencies; majors are planned</td></tr>
|
|
796
965
|
</tbody>
|
|
797
966
|
</table></div>
|
|
798
967
|
</section>
|
|
799
968
|
|
|
800
969
|
<section id="bulgular">
|
|
801
970
|
<p class="path">/findings-* · docs/findings/</p>
|
|
802
|
-
<h2>
|
|
803
|
-
<p class="lead">
|
|
971
|
+
<h2>Findings reports</h2>
|
|
972
|
+
<p class="lead">Scans the project through an expert's eyes and ranks the most important findings, at most 20, with evidence, a 0-100 severity score and a technical fix. Each report gives a health score for its area and is compared with the previous one (new / continuing / worse / resolved).</p>
|
|
804
973
|
<div class="table-wrap"><table>
|
|
805
|
-
<thead><tr><th>
|
|
974
|
+
<thead><tr><th>Command</th><th>Point of view</th><th>Example finding</th></tr></thead>
|
|
806
975
|
<tbody>
|
|
807
|
-
<tr><td class="f">/findings-tech</td><td>
|
|
808
|
-
<tr><td class="f">/findings-business</td><td>
|
|
809
|
-
<tr><td class="f">/findings-security</td><td>
|
|
810
|
-
<tr><td class="f">/findings-ux</td><td>
|
|
811
|
-
<tr><td class="f">/findings-perf</td><td>
|
|
812
|
-
<tr><td class="f">/findings-legal</td><td>
|
|
813
|
-
<tr><td class="f">/findings-all</td><td>
|
|
976
|
+
<tr><td class="f">/findings-tech</td><td>Senior architect</td><td>The same authorization check is rewritten in 4 places; an unused export; an N+1 query</td></tr>
|
|
977
|
+
<tr><td class="f">/findings-business</td><td>The industry's senior expert (a banker in banking); with web research</td><td>No reconciliation flow; the refund rule is undefined; a feature that competitors have as standard is missing</td></tr>
|
|
978
|
+
<tr><td class="f">/findings-security</td><td>Attacker</td><td>Someone else's invoice can be read (IDOR); the webhook signature is not verified</td></tr>
|
|
979
|
+
<tr><td class="f">/findings-ux</td><td>User and UX researcher</td><td>The empty list screen gives no direction; contrast is 3.1:1</td></tr>
|
|
980
|
+
<tr><td class="f">/findings-perf</td><td>Performance and FinOps</td><td>The dashboard page ships 480 KB of client JS; no max_tokens on the AI call</td></tr>
|
|
981
|
+
<tr><td class="f">/findings-legal</td><td>Compliance expert (not legal advice)</td><td>The tax number is missing from the data inventory; the cookie banner loads analytics before consent</td></tr>
|
|
982
|
+
<tr><td class="f">/findings-all</td><td>All the selected ones, in parallel</td><td>A combined summary and a shared fix plan</td></tr>
|
|
814
983
|
</tbody>
|
|
815
984
|
</table></div>
|
|
816
|
-
<div class="note"
|
|
985
|
+
<div class="note">Severity score = impact (40) + likelihood (25) + spread (20) + urgency (15). Levels: Critical ≥80 · High 60-79 · Medium 40-59 · Low <40. Health = 100 − penalty (critical 15 · high 8 · medium 4 · low 1). At the end of the report are the fix plan, the relevant board member's opinion, and the question of which findings go into the roadmap.</div>
|
|
817
986
|
</section>
|
|
818
987
|
|
|
819
988
|
<section id="yapi">
|
|
820
989
|
<p class="path">.claude/structure.json · docs/architecture/structure.md</p>
|
|
821
|
-
<h2>
|
|
822
|
-
<p class="lead">
|
|
823
|
-
<pre class="term">.claude/ <span class="c">#
|
|
824
|
-
.github/ <span class="c"># CI, Dependabot,
|
|
990
|
+
<h2>The project structure is protected</h2>
|
|
991
|
+
<p class="lead">The code is organized by feature: everything that belongs to a feature lives under <code>features/<feature>/</code>. If a new file is about to be written outside the structure map, you are asked; clutter files are blocked. Trial work goes to <code>sandbox/</code>, outdated docs to <code>docs/archive/</code>.</p>
|
|
992
|
+
<pre class="term">.claude/ <span class="c"># commands, agents, hooks, board, findings, structure.json</span>
|
|
993
|
+
.github/ <span class="c"># CI, Dependabot, live monitoring, cloud agents</span>
|
|
825
994
|
docs/
|
|
826
995
|
product/ prd · roadmap · glossary · launch · feedback · unit-economics · specs/
|
|
827
996
|
architecture/ overview · stack · structure
|
|
@@ -832,43 +1001,42 @@ docs/
|
|
|
832
1001
|
legal/ privacy-kvkk
|
|
833
1002
|
operations/ release-checklist · deploy-setup · maintenance · accounts · feature-flags · spend-alarms
|
|
834
1003
|
workflow/ progress · decision-protocol · skills · board · usage-limits · cost-log
|
|
835
|
-
findings/ /findings-*
|
|
1004
|
+
findings/ /findings-* reports
|
|
836
1005
|
archive/
|
|
837
|
-
src/features/<
|
|
1006
|
+
src/features/<feature>/{components,hooks,server,__tests__} <span class="c"># web</span>
|
|
838
1007
|
tests/
|
|
839
|
-
sandbox/ <span class="c"># git
|
|
1008
|
+
sandbox/ <span class="c"># not in git</span>
|
|
840
1009
|
AGENTS.md · CLAUDE.md · README.md · CHANGELOG.md</pre>
|
|
841
|
-
<div class="note"><code>AGENTS.md</code>
|
|
1010
|
+
<div class="note"><code>AGENTS.md</code> holds the shared rules (read by Claude Code, Codex and Antigravity); <code>CLAUDE.md</code> imports it and carries the Claude Code-specific additions. The structure is protected in four places: the hook at write time, CI on every PR, the board's Architect, and <code>/findings-tech</code>. Changing the map is a technical decision; you are asked and it is recorded as an ADR.</div>
|
|
842
1011
|
</section>
|
|
843
1012
|
|
|
844
1013
|
<section id="rapor">
|
|
845
|
-
<p class="path">
|
|
846
|
-
<h2>
|
|
1014
|
+
<p class="path">Where are we, at every moment</p>
|
|
1015
|
+
<h2>Reports and dashboard</h2>
|
|
847
1016
|
<div class="grid2">
|
|
848
1017
|
<div>
|
|
849
|
-
<h3 style="margin-top:0">
|
|
850
|
-
<pre class="term">──
|
|
851
|
-
|
|
852
|
-
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
<pre class="term">▶ Faz 1 · G-012 · görev 7/23 · soru: açık · 5s %34 · hf %5 · bağlam %42</pre>
|
|
1018
|
+
<h3 style="margin-top:0">At the end of every answer: the status block</h3>
|
|
1019
|
+
<pre class="term">── Status ──────────────────────
|
|
1020
|
+
Phase: 1 · Task: G-012 (7/23) · Question mode: open · Limit: 5h 34% weekly 5%
|
|
1021
|
+
Done: signup form + validation, tests green · Board: ONAY (ux, qa) · Auto decisions: none
|
|
1022
|
+
Next: G-013 password reset · pending decision: email service</pre>
|
|
1023
|
+
<h3>Always: the status line</h3>
|
|
1024
|
+
<pre class="term">▶ Phase 1 · G-012 · task 7/23 · questions: open · 5h 34% · weekly 5% · context 42%</pre>
|
|
857
1025
|
</div>
|
|
858
1026
|
<div>
|
|
859
1027
|
<h3 style="margin-top:0">dashboard.html</h3>
|
|
860
1028
|
<ul>
|
|
861
|
-
<li><b
|
|
862
|
-
<li><b>10
|
|
863
|
-
<li><b
|
|
864
|
-
<li><b>Limit
|
|
865
|
-
<li>
|
|
866
|
-
<li>
|
|
1029
|
+
<li><b>At the top:</b> Now (phase, task, next step), things that need attention (in order of importance), a health badge and summary tiles</li>
|
|
1030
|
+
<li><b>10 tabs:</b> Overview · Roadmap · Decisions · Board · Findings · Quality · Activity · Product and tech · Operations · Limit and cost</li>
|
|
1031
|
+
<li><b>Product and tech:</b> PRD, MVP and acceptance tests, unit economics, feedback, stack, design, brand pack, promo videos, research notes</li>
|
|
1032
|
+
<li><b>Limit and cost:</b> 5-hour and weekly limit, context, token and API-equivalent cost for the last 30 days (ccusage), limit cost per task</li>
|
|
1033
|
+
<li>A <b>Copy</b> button next to the next step and the commands in warnings: you paste the command into the Claude chat</li>
|
|
1034
|
+
<li>Updates after every Claude answer and refreshes every 30 seconds while open; it spends no extra tokens</li>
|
|
867
1035
|
</ul>
|
|
868
|
-
<h3>
|
|
1036
|
+
<h3>Desktop notification</h3>
|
|
869
1037
|
<ul>
|
|
870
|
-
<li>Claude
|
|
871
|
-
<li>
|
|
1038
|
+
<li>When Claude asks a question or waits for approval</li>
|
|
1039
|
+
<li>When a job longer than 90 seconds finishes · to turn it off: <code>KIT_NOTIFY=off</code></li>
|
|
872
1040
|
</ul>
|
|
873
1041
|
</div>
|
|
874
1042
|
</div>
|
|
@@ -876,189 +1044,192 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
|
|
|
876
1044
|
|
|
877
1045
|
<section id="limit">
|
|
878
1046
|
<p class="path">docs/workflow/usage-limits.md</p>
|
|
879
|
-
<h2>Limit
|
|
880
|
-
<p class="lead"
|
|
1047
|
+
<h2>Limit awareness</h2>
|
|
1048
|
+
<p class="lead">Before work starts, the 5-hour and weekly limits are read: on the desktop with the <code>get_usage</code> tool, in the terminal and IDE from what Claude Code sends to the status line. The limit is only a reason to warn: work doesn't stop, and continues until you say "stop".</p>
|
|
881
1049
|
<div class="grid2">
|
|
882
1050
|
<div class="table-wrap" style="margin:0"><table>
|
|
883
|
-
<thead><tr><th
|
|
1051
|
+
<thead><tr><th>While working</th><th>What happens</th></tr></thead>
|
|
884
1052
|
<tbody>
|
|
885
|
-
<tr><td
|
|
886
|
-
<tr><td
|
|
887
|
-
<tr><td
|
|
888
|
-
<tr><td>"
|
|
1053
|
+
<tr><td>90%</td><td>A one-line reminder and the reset time; work continues</td></tr>
|
|
1054
|
+
<tr><td>95%</td><td>A "limit is almost gone" warning; where it left off is saved quietly</td></tr>
|
|
1055
|
+
<tr><td>99%</td><td>A "work may be left unfinished" warning; steps are kept small, a WIP commit is suggested</td></tr>
|
|
1056
|
+
<tr><td>If you say "stop"</td><td>Stops safely: finishes the step, runs the tests, writes where it left off</td></tr>
|
|
889
1057
|
</tbody>
|
|
890
1058
|
</table></div>
|
|
891
1059
|
<div class="table-wrap" style="margin:0"><table>
|
|
892
|
-
<thead><tr><th>
|
|
1060
|
+
<thead><tr><th>Level</th><th>5-hour</th><th>Weekly</th><th>Behavior</th></tr></thead>
|
|
893
1061
|
<tbody>
|
|
894
|
-
<tr><td><span class="tag">
|
|
895
|
-
<tr><td><span class="tag warn">
|
|
896
|
-
<tr><td><span class="tag bad">
|
|
1062
|
+
<tr><td><span class="tag">green</span></td><td>< 60%</td><td>< 70%</td><td>Works normally</td></tr>
|
|
1063
|
+
<tr><td><span class="tag warn">yellow</span></td><td>60–84%</td><td>70–89%</td><td>States the estimated cost, the board is halved</td></tr>
|
|
1064
|
+
<tr><td><span class="tag bad">red</span></td><td>≥ 85%</td><td>≥ 90%</td><td>States the cost and the remaining share in one line</td></tr>
|
|
897
1065
|
</tbody>
|
|
898
1066
|
</table></div>
|
|
899
1067
|
</div>
|
|
900
|
-
<div class="note">
|
|
1068
|
+
<div class="note">Task costs are written to <code>docs/workflow/cost-log.md</code>; estimates settle on real data over time. At session start only the summary rules and <code>docs/workflow/progress.md</code> are loaded (about 1,700 tokens). If the code map is connected, the code is queried without reading the files. The main session's context is kept small too: independent questions are asked in one round, gate and subagent reports come back short, and <code>/clear</code> is suggested once a task is done and committed.</div>
|
|
901
1069
|
</section>
|
|
902
1070
|
|
|
903
1071
|
<section id="yetenekler">
|
|
904
1072
|
<p class="path">.claude/skills · MCP</p>
|
|
905
|
-
<h2>
|
|
906
|
-
<p class="lead"
|
|
1073
|
+
<h2>Capability packs</h2>
|
|
1074
|
+
<p class="lead">The core jobs rely on the kit's own skills, not on tools installed from outside; outside tools are turned on only where they make a difference and according to the project type.</p>
|
|
907
1075
|
<div class="tiles">
|
|
908
|
-
<article class="tile"><h3>
|
|
909
|
-
<article class="tile"><h3>
|
|
910
|
-
<article class="tile"><h3
|
|
911
|
-
<article class="tile"><h3>
|
|
912
|
-
<article class="tile"><h3>
|
|
913
|
-
<article class="tile"><h3>
|
|
914
|
-
<article class="tile"><h3>
|
|
915
|
-
<article class="tile"><h3>Spec
|
|
916
|
-
<article class="tile"><h3>Logo</h3><p class="stack">logo-design · SVG</p><ul><li>
|
|
917
|
-
<article class="tile"><h3>
|
|
918
|
-
<article class="tile"><h3>
|
|
919
|
-
<article class="tile"><h3
|
|
920
|
-
<article class="tile"><h3>
|
|
921
|
-
<article class="tile"><h3>
|
|
922
|
-
<article class="tile"><h3>
|
|
923
|
-
<article class="tile"><h3
|
|
924
|
-
<article class="tile"><h3>
|
|
925
|
-
<article class="tile"><h3>
|
|
926
|
-
<article class="tile"><h3>
|
|
1076
|
+
<article class="tile"><h3>The right source</h3><p class="stack">source-research · Context7 · Firecrawl (optional)</p><ul><li>Official docs, law and standards first</li><li>Every claim gets a source, a date and a confidence level (A-D)</li><li>Library docs come up to date from Context7</li><li>The Firecrawl API key stays in your own environment variable</li></ul></article>
|
|
1077
|
+
<article class="tile"><h3>Deployment setup</h3><p class="stack">/release first · deploy-setup.md</p><ul><li>Hosting, environment variables, domain and DNS, backup, rollback rehearsal</li><li>Vercel, Supabase, Railway, EAS; steps with sources and dates</li><li>You enter the secret in the dashboard; it is not written to the chat or to a file</li></ul></article>
|
|
1078
|
+
<article class="tile"><h3>Rules that learn</h3><p class="stack">/fix-bug · /retro · hookify · AGENTS.md</p><ul><li>When the same error class comes a second time, /fix-bug suggests a rule; a warning shows on the dashboard too</li><li>Mechanical rules go to hookify, the rest to AGENTS.md; nothing is written without your approval</li><li>Every rule has a source and a date; /maintain asks about those older than 90 days</li><li>Auto memory is asked at /start, off is recommended</li></ul></article>
|
|
1079
|
+
<article class="tile"><h3>Personal preferences</h3><p class="stack">~/.vibe-kit/tercihler.md · prefs.mjs</p><ul><li>When you correct a behavior or say how you want to work, the AI takes a note</li><li>At the end of a task and a session it asks "save this as a preference?"; what you don't approve is not written</li><li>Preferences apply to all your projects and load in every session; they don't go into git</li><li>List: <code>node .claude/hooks/prefs.mjs --list</code>, remove: <code>--remove <no></code></li></ul></article>
|
|
1080
|
+
<article class="tile"><h3>Model per role</h3><p class="stack">docs/workflow/models.md · models.mjs</p><ul><li>Five roles: planning, coding, test writing, review, docs and research</li><li>One question per role at the start of each task (model and effort together), on two screens</li><li>Recommended: plan Opus, code Sonnet, tests Opus, review Sonnet, docs Haiku; all at high effort. Tests use a different model from the code: they don't share the same blind spot</li><li>Test, review and docs work runs in a subagent with the chosen model; the plan runs in the main session</li><li>The roadmap mark, the cost line and the progress labels are written by <code>progress.mjs</code>; no model call is spent and the format doesn't break</li><li>A subagent only when it pays off: <code>flow.mjs</code> looks at task size, context and limit; a small task stays in the main session, board members are chosen from the changed paths and their number shrinks with the limit; a member writes at most 5 findings</li></ul></article>
|
|
1081
|
+
<article class="tile"><h3>Turkey add-on</h3><p class="stack">--addons tr · docs/legal/turkiye.md</p><ul><li>KVKK transfer abroad: standard contract, 5-business-day notification</li><li>e-Fatura and e-Arşiv thresholds (GİB)</li><li>iyzico and PayTR notification signature code and adversarial test</li><li>İ/ı and Turkish sorting tests; not legal advice</li></ul></article>
|
|
1082
|
+
<article class="tile"><h3>QA and preview in the browser</h3><p class="stack">/qa · preview.mjs · Playwright CLI</p><ul><li>Interface criteria run as tests in a real browser</li><li>The report is written from the test result, a card on the dashboard</li><li>On an interface task /build takes desktop and mobile screenshots</li></ul></article>
|
|
1083
|
+
<article class="tile"><h3>Spec and drift check</h3><p class="stack">docs/product/specs/ · gate.mjs</p><ul><li>Current, expected and must-not-change behavior</li><li>The tests of the "must not change" lines are checked at the gate</li><li>/plan-task for work of 3+ files, /fix-bug writes it for every bug</li></ul></article>
|
|
1084
|
+
<article class="tile"><h3>Logo</h3><p class="stack">logo-design · SVG</p><ul><li>Brand questions, 4-6 concepts with a visual preview</li><li>Readable at 16 px, a one-color version, a dark background</li><li>Favicon, app icons, PNG sizes</li></ul></article>
|
|
1085
|
+
<article class="tile"><h3>Promo video</h3><p class="stack">motion-video · renderAt(t) · Playwright · ffmpeg</p><ul><li>One continuous conversion, a real cursor, 120 BPM</li><li>Closed-form springs (verified with a test)</li><li>A beat map and 4 frames approved first, then MP4</li></ul></article>
|
|
1086
|
+
<article class="tile"><h3>Interface motion and 3D</h3><p class="stack">ui-motion · Motion · Reanimated · GSAP · three.js</p><ul><li>Duration tokens, springs, transform/opacity only</li><li>The reduced-motion preference is mandatory</li><li>3D: lazy loading, a static fallback, mobile GPU</li></ul></article>
|
|
1087
|
+
<article class="tile"><h3>Review and discovery</h3><p class="stack">rea · Understand-Anything · awesome-design-md</p><ul><li>How a competitor's feature works: only in software you are authorized to examine, with approval first</li><li>A code map for people: suggested by /adopt, /handoff, /release first</li></ul></article>
|
|
1088
|
+
<article class="tile"><h3>Security</h3><p class="stack">security-guidance · claude-security · Trail of Bits</p><ul><li>While writing: a risky-pattern warning</li><li>At the commit: a review by a separate model</li><li>/findings-security: a multi-agent, verified scan</li></ul></article>
|
|
1089
|
+
<article class="tile"><h3>Code intelligence and stack rules</h3><p class="stack">typescript-lsp · pyright-lsp · Vercel · Expo · Supabase</p><ul><li>Type errors after every edit; invented APIs are caught before compiling</li><li>React, React Native, Postgres and Core Web Vitals rules turn on by type</li></ul></article>
|
|
1090
|
+
<article class="tile"><h3>Mobile testing and services</h3><p class="stack">Maestro · Expo MCP · service catalog</p><ul><li>Acceptance tests on a device or simulator</li><li>EAS build, TestFlight crash logs</li><li>GitHub, Stripe, PostHog, Figma: once the service is chosen</li></ul></article>
|
|
1091
|
+
<article class="tile"><h3>Measurement and cost</h3><p class="stack">Playwright CLI · Chrome DevTools MCP · ccusage</p><ul><li>Console, network and screenshots through the CLI; performance traces through MCP</li><li>Tokens and cost per project on the dashboard</li></ul></article>
|
|
1092
|
+
<article class="tile"><h3>Rollback</h3><p class="stack">/rollback · checkpoint.mjs</p><ul><li>A working point is saved while tests are green</li><li>Going back is a new commit; history is not deleted</li><li>Unfinished work is stashed, .env is not touched</li></ul></article>
|
|
1093
|
+
<article class="tile"><h3>In your language</h3><p class="stack">.kit.json → lang</p><ul><li><code>/start</code> and <code>/adopt</code> ask the language first: Turkish / English / Other</li><li>Questions, answers, documents, the dashboard and the status line come in that language; change it with <code>/language</code></li></ul></article>
|
|
1094
|
+
<article class="tile"><h3>Narrator mode</h3><p class="stack">output style: anlatici</p><ul><li>After every step: what I did, why, how you can see it</li><li>At the end of a task, at most 2 comprehension questions; the answers go on the dashboard</li></ul></article>
|
|
1095
|
+
<article class="tile"><h3>Spend alarm</h3><p class="stack">spend-alarms.md · dashboard</p><ul><li>The provider's cap and a 50%/80% warning</li><li>In code: a per-user quota, a daily budget, automatic shutdown</li><li>/release and /maintain check it</li></ul></article>
|
|
927
1096
|
</div>
|
|
928
1097
|
</section>
|
|
929
1098
|
|
|
930
1099
|
<section id="skiller">
|
|
931
1100
|
<p class="path">docs/workflow/skills.md</p>
|
|
932
|
-
<h2>
|
|
1101
|
+
<h2>Which skill for which job</h2>
|
|
933
1102
|
<div class="table-wrap"><table>
|
|
934
|
-
<thead><tr><th
|
|
1103
|
+
<thead><tr><th>Job</th><th>Skill</th></tr></thead>
|
|
935
1104
|
<tbody>
|
|
936
|
-
<tr><td>
|
|
937
|
-
<tr><td>
|
|
938
|
-
<tr><td>
|
|
939
|
-
<tr><td>
|
|
940
|
-
<tr><td>
|
|
941
|
-
<tr><td>
|
|
942
|
-
<tr><td>
|
|
943
|
-
<tr><td>
|
|
944
|
-
<tr><td>
|
|
945
|
-
<tr><td
|
|
946
|
-
<tr><td>
|
|
947
|
-
<tr><td>
|
|
948
|
-
<tr><td>Logo,
|
|
949
|
-
<tr><td>
|
|
950
|
-
<tr><td>
|
|
951
|
-
<tr><td>3D
|
|
952
|
-
<tr><td>
|
|
953
|
-
<tr><td>
|
|
954
|
-
<tr><td>React/Next
|
|
955
|
-
<tr><td>
|
|
956
|
-
<tr><td>Expo build,
|
|
957
|
-
<tr><td>Core Web Vitals,
|
|
958
|
-
<tr><td>CLAUDE.md
|
|
959
|
-
<tr><td>"
|
|
960
|
-
<tr><td
|
|
961
|
-
<tr><td>
|
|
1105
|
+
<tr><td>Every code change</td><td class="f">ponytail:ponytail</td></tr>
|
|
1106
|
+
<tr><td>Critical flow (auth, payment, data)</td><td class="f">mattpocock-skills:tdd</td></tr>
|
|
1107
|
+
<tr><td>Debugging</td><td class="f">mattpocock-skills:diagnosing-bugs · /freeze <folder></td></tr>
|
|
1108
|
+
<tr><td>Questioning the idea and big plans</td><td class="f">mattpocock-skills:grilling</td></tr>
|
|
1109
|
+
<tr><td>Glossary, decision record, data model</td><td class="f">mattpocock-skills:domain-modeling</td></tr>
|
|
1110
|
+
<tr><td>Module boundaries, architecture</td><td class="f">mattpocock-skills:codebase-design</td></tr>
|
|
1111
|
+
<tr><td>Manual setup (DNS, dashboard, store)</td><td class="f">mattpocock-skills:wizard</td></tr>
|
|
1112
|
+
<tr><td>Information that can change: version, price, law, competitor</td><td class="f">source-research · Context7</td></tr>
|
|
1113
|
+
<tr><td>Interface by style direction</td><td class="f">taste-skill:*</td></tr>
|
|
1114
|
+
<tr><td>Product context, design system, critique/audit/polish</td><td class="f">impeccable:impeccable</td></tr>
|
|
1115
|
+
<tr><td>Palette, typeface, tokens</td><td class="f">ui-ux-pro-max:*</td></tr>
|
|
1116
|
+
<tr><td>Every text the user sees</td><td class="f">humanizer:humanizer</td></tr>
|
|
1117
|
+
<tr><td>Logo, icon, brand pack</td><td class="f">logo-design</td></tr>
|
|
1118
|
+
<tr><td>In-app motion</td><td class="f">ui-motion</td></tr>
|
|
1119
|
+
<tr><td>Scroll animation (bold direction)</td><td class="f">gsap-skills</td></tr>
|
|
1120
|
+
<tr><td>3D scene (if chosen)</td><td class="f">threejs-fundamentals · threejs-performance · threejs-react-three-fiber</td></tr>
|
|
1121
|
+
<tr><td>Promo video</td><td class="f">motion-video</td></tr>
|
|
1122
|
+
<tr><td>Status blocks, progress notes</td><td class="f">caveman:caveman</td></tr>
|
|
1123
|
+
<tr><td>React/Next performance · React Native</td><td class="f">react-best-practices · composition-patterns · react-native-guidelines</td></tr>
|
|
1124
|
+
<tr><td>Database schema, queries, indexes</td><td class="f">postgres-best-practices · supabase</td></tr>
|
|
1125
|
+
<tr><td>Expo build, upgrade, store</td><td class="f">expo</td></tr>
|
|
1126
|
+
<tr><td>Core Web Vitals, accessibility, SEO</td><td class="f">web-quality-skills</td></tr>
|
|
1127
|
+
<tr><td>CLAUDE.md audit · session lessons</td><td class="f">claude-md-improver · /revise-claude-md</td></tr>
|
|
1128
|
+
<tr><td>"Don't do this again" → a lasting rule</td><td class="f">/hookify</td></tr>
|
|
1129
|
+
<tr><td>Review · audit · debt list</td><td class="f">ponytail-review · ponytail-audit · ponytail-debt</td></tr>
|
|
1130
|
+
<tr><td>Deep security scan</td><td class="f">/claude-security · Trail of Bits</td></tr>
|
|
962
1131
|
</tbody>
|
|
963
1132
|
</table></div>
|
|
964
|
-
<div class="note"><b>
|
|
965
|
-
<div class="note"><b>
|
|
1133
|
+
<div class="note"><b>Context packs:</b> The skill list is capped at 1% of the context; when it overflows, skills get missed. The core plugins are always on; the design, security, release and video packs come off, and the related command asks to turn them on when needed (<code>/tools</code>). Adding a new plugin is a technical decision; third-party skills are read before they are installed.</div>
|
|
1134
|
+
<div class="note"><b>Deliberately left out:</b> superpowers, gstack, spec-kit, BMAD, GSD and OpenSpec would replace the kit's question, plan and board flow; their good ideas were worked into the kit's own rules. claude-mem and Serena do the same job as the kit's progress file and code map.</div>
|
|
966
1135
|
</section>
|
|
967
1136
|
|
|
968
1137
|
<section id="araclar">
|
|
969
|
-
<p class="path">
|
|
970
|
-
<h2>Codex
|
|
971
|
-
<p class="lead">TillerHand Claude Code
|
|
972
|
-
<pre class="term">npx tillerhand init --tool codex <span class="c">#
|
|
973
|
-
<span class="c">#
|
|
1138
|
+
<p class="path">With another tool</p>
|
|
1139
|
+
<h2>Codex and Antigravity</h2>
|
|
1140
|
+
<p class="lead">TillerHand was written for Claude Code. The rules, commands and guardrails also work in OpenAI Codex and Google Antigravity. The board runs on a single model; the question UI, the status line and the commit gate are not available in these tools.</p>
|
|
1141
|
+
<pre class="term">npx tillerhand init --tool codex <span class="c"># or antigravity, or claude,codex</span>
|
|
1142
|
+
<span class="c"># add a tool to an existing project</span>
|
|
974
1143
|
/kit-update --tool claude,codex</pre>
|
|
975
1144
|
<div class="table-wrap"><table>
|
|
976
|
-
<thead><tr><th>
|
|
1145
|
+
<thead><tr><th>Part</th><th>Claude Code</th><th>Codex</th><th>Antigravity</th></tr></thead>
|
|
977
1146
|
<tbody>
|
|
978
|
-
<tr><td>
|
|
979
|
-
<tr><td>
|
|
980
|
-
<tr><td>
|
|
981
|
-
<tr><td>"
|
|
982
|
-
<tr><td>
|
|
983
|
-
<tr><td>
|
|
984
|
-
<tr><td>
|
|
1147
|
+
<tr><td>Rules</td><td>CLAUDE.md (imports AGENTS.md)</td><td>AGENTS.md</td><td>AGENTS.md</td></tr>
|
|
1148
|
+
<tr><td>Commands</td><td class="f">/start, /build…</td><td>Skill: <code>$start</code> or <code>/skills</code></td><td>Skill: <code>/start</code></td></tr>
|
|
1149
|
+
<tr><td>Guardrails</td><td>.claude/settings.json</td><td>.codex/hooks.json</td><td>.agents/hooks.json</td></tr>
|
|
1150
|
+
<tr><td>"Ask" decision</td><td>Approval dialog</td><td>Blocked; the AI asks you, and if you approve you do the action yourself</td><td>Approval dialog</td></tr>
|
|
1151
|
+
<tr><td>Questions with options</td><td>AskUserQuestion</td><td>Numbered plain text</td><td>ask_question</td></tr>
|
|
1152
|
+
<tr><td>Board and council</td><td>Separate agents and models</td><td>One model takes the roles in turn</td><td>One model</td></tr>
|
|
1153
|
+
<tr><td>Test separation</td><td>Enforced by a hook: only test-writer writes to a test file</td><td>A written rule (no agent identity)</td><td>A written rule (no agent identity)</td></tr>
|
|
1154
|
+
<tr><td>Status line, limit, dashboard refresh, commit gate</td><td>Yes</td><td>No</td><td>No</td></tr>
|
|
985
1155
|
</tbody>
|
|
986
1156
|
</table></div>
|
|
987
|
-
<div class="note">
|
|
1157
|
+
<div class="note">The commands have a single source (<code>.claude/commands/</code>); the copies under <code>.agents/skills/</code> are generated by <code>init</code>, <code>install</code> and <code>update</code>. Codex runs the project's hooks only when you trust the folder and approve them with <code>/hooks</code>; do this in the first session. On first use, try writing a secret to see the guardrails work.</div>
|
|
988
1158
|
</section>
|
|
989
1159
|
|
|
990
1160
|
<section id="komutlar">
|
|
991
1161
|
<p class="path">.claude/commands</p>
|
|
992
|
-
<h2>
|
|
1162
|
+
<h2>Commands</h2>
|
|
993
1163
|
<div class="table-wrap"><table>
|
|
994
|
-
<thead><tr><th>
|
|
1164
|
+
<thead><tr><th>Command</th><th>What it does</th></tr></thead>
|
|
995
1165
|
<tbody>
|
|
996
|
-
<tr><td class="f">/start [
|
|
997
|
-
<tr><td class="f">/adopt</td><td>
|
|
998
|
-
<tr><td class="f">/plan-task [
|
|
999
|
-
<tr><td class="f">/build [
|
|
1000
|
-
<tr><td class="f">/design [
|
|
1001
|
-
<tr><td class="f">/review-changes [
|
|
1002
|
-
<tr><td class="f">/fix-bug [
|
|
1003
|
-
<tr><td class="f">/qa [
|
|
1004
|
-
<tr><td class="f">/freeze <
|
|
1005
|
-
<tr><td class="f">/rollback [
|
|
1006
|
-
<tr><td class="f">/findings-<
|
|
1007
|
-
<tr><td class="f">/board [setup|convene|council]</td><td>
|
|
1008
|
-
<tr><td class="f">/ask-mode [on|off] [
|
|
1009
|
-
<tr><td class="f">/dashboard</td><td>
|
|
1010
|
-
<tr><td class="f">/wrap-up</td><td
|
|
1011
|
-
<tr><td class="f">/release [first]</td><td>
|
|
1012
|
-
<tr><td class="f">/maintain [weekly|monthly|quarterly]</td><td>
|
|
1013
|
-
<tr><td class="f">/user-feedback</td><td>
|
|
1014
|
-
<tr><td class="f">/retro</td><td>
|
|
1015
|
-
<tr><td class="f">/research [
|
|
1016
|
-
<tr><td class="f">/handoff [devral]</td><td>
|
|
1017
|
-
<tr><td class="f">/tools [ac|kapat|olc|komutlar]</td><td>
|
|
1018
|
-
<tr><td class="f">/kit-update</td><td>
|
|
1166
|
+
<tr><td class="f">/start [idea]</td><td>The nine-step wizard: idea, type, install, technology, architecture, board, design, roadmap</td></tr>
|
|
1167
|
+
<tr><td class="f">/adopt</td><td>Brings an existing project into the kit: scans it, derives the docs from the code, rewrites AGENTS.md and CLAUDE.md, and builds an alignment roadmap with critical-flow tests and a feature-by-feature move</td></tr>
|
|
1168
|
+
<tr><td class="f">/plan-task [task]</td><td>Asks the decision points, produces a plan with the board's opinion, gets approval; writes a spec for work of 3+ files</td></tr>
|
|
1169
|
+
<tr><td class="f">/build [task]</td><td>A separate agent (<code>test-writer</code>) writes the acceptance and adversarial tests first, then the code; stops if a new decision comes up; proof (desktop and mobile screenshots on an interface) and the board review</td></tr>
|
|
1170
|
+
<tr><td class="f">/design [scope]</td><td>Design decisions with visual previews, and applying them</td></tr>
|
|
1171
|
+
<tr><td class="f">/review-changes [range]</td><td>code-reviewer + security-auditor + ponytail-review; asks what to fix with a multi-select</td></tr>
|
|
1172
|
+
<tr><td class="f">/fix-bug [symptom]</td><td>Reproduce, prove, bug spec; <code>test-writer</code> writes the red test, then fix, gate; suggests a rule if the same error class repeats</td></tr>
|
|
1173
|
+
<tr><td class="f">/qa [criteria]</td><td>Runs the interface criteria in the browser as Playwright tests; the report comes from the test result, a card on the dashboard</td></tr>
|
|
1174
|
+
<tr><td class="f">/freeze <folder> | off</td><td>Locks editing to a single folder; the work doesn't spread to other files</td></tr>
|
|
1175
|
+
<tr><td class="f">/rollback [point]</td><td>Safely returns to the last working state: unfinished work is stashed, history is not deleted</td></tr>
|
|
1176
|
+
<tr><td class="f">/findings-<type></td><td>tech · business · security · ux · perf · legal · all: a scored findings report</td></tr>
|
|
1177
|
+
<tr><td class="f">/board [setup|convene|council]</td><td>Sets up and convenes the expert board; <code>council <question></code> runs the decision council</td></tr>
|
|
1178
|
+
<tr><td class="f">/ask-mode [on|off] [topic]</td><td>Manages the question mode</td></tr>
|
|
1179
|
+
<tr><td class="f">/dashboard</td><td>A detailed report and control panel</td></tr>
|
|
1180
|
+
<tr><td class="f">/wrap-up</td><td>Progress, decisions, CHANGELOG and dashboard; closes the session</td></tr>
|
|
1181
|
+
<tr><td class="f">/release [first]</td><td>Go-live checks; <code>first</code> walks you through hosting, domain, backup and rollback for your provider</td></tr>
|
|
1182
|
+
<tr><td class="f">/maintain [weekly|monthly|quarterly]</td><td>Regular maintenance</td></tr>
|
|
1183
|
+
<tr><td class="f">/user-feedback</td><td>Sorts user feedback into themes and has you add them to the roadmap</td></tr>
|
|
1184
|
+
<tr><td class="f">/retro</td><td>Writes the lessons into the project; kit suggestions go to a branch in the TillerHand repo</td></tr>
|
|
1185
|
+
<tr><td class="f">/research [topic]</td><td>Articles, similar projects on GitHub and competing products; a difference table; chosen features go into the PRD</td></tr>
|
|
1186
|
+
<tr><td class="f">/handoff [devral]</td><td>Hands the project to another person or account, or takes it over; continues from the same place</td></tr>
|
|
1187
|
+
<tr><td class="f">/tools [ac|kapat|olc|komutlar]</td><td>Shows, turns on or turns off context packs; measures the skill load; makes the command list light or full</td></tr>
|
|
1188
|
+
<tr><td class="f">/kit-update</td><td>Brings the project to TillerHand's latest version; asks about conflicts; adds a tool with <code>--tool</code> and an add-on with <code>--addons</code></td></tr>
|
|
1189
|
+
<tr><td class="f">/language [language]</td><td>Changes the conversation language (Turkish, English or another language); refreshes the translation of the hook messages and the dashboard</td></tr>
|
|
1019
1190
|
</tbody>
|
|
1020
1191
|
</table></div>
|
|
1021
1192
|
</section>
|
|
1022
1193
|
|
|
1023
1194
|
<section id="kit">
|
|
1024
|
-
<p class="path">TillerHand
|
|
1025
|
-
<h2>
|
|
1026
|
-
<p class="lead">
|
|
1027
|
-
<div class="flow" role="list" aria-label="Kit
|
|
1195
|
+
<p class="path">TillerHand is a project too</p>
|
|
1196
|
+
<h2>Updates and maintenance</h2>
|
|
1197
|
+
<p class="lead">Lessons learned in projects flow back into the kit; new versions of the kit reach projects safely.</p>
|
|
1198
|
+
<div class="flow" role="list" aria-label="Kit feedback loop">
|
|
1028
1199
|
<span role="listitem">/retro</span><i aria-hidden="true">→</i>
|
|
1029
|
-
<span role="listitem">TillerHand
|
|
1030
|
-
<span role="listitem">
|
|
1200
|
+
<span role="listitem">a branch in the TillerHand repo</span><i aria-hidden="true">→</i>
|
|
1201
|
+
<span role="listitem">approve push / PR</span><i aria-hidden="true">→</i>
|
|
1031
1202
|
<span role="listitem">VERSION + CHANGELOG + tag</span><i aria-hidden="true">→</i>
|
|
1032
1203
|
<span role="listitem">/kit-update</span>
|
|
1033
1204
|
</div>
|
|
1034
1205
|
<div class="table-wrap"><table>
|
|
1035
|
-
<thead><tr><th>
|
|
1206
|
+
<thead><tr><th>File type</th><th>What happens on update</th></tr></thead>
|
|
1036
1207
|
<tbody>
|
|
1037
|
-
<tr><td>
|
|
1038
|
-
<tr><td>
|
|
1039
|
-
<tr><td>Codex
|
|
1040
|
-
<tr><td>
|
|
1208
|
+
<tr><td>The kit's files: commands, agents, hooks, decision-protocol, skills, security checklist, release-checklist, deploy-setup, maintenance, privacy-kvkk</td><td>Replaced with the new one if you didn't change it. If you did, yours stays, the new version arrives as <code>.kit-new</code>, and you are asked how to merge it.</td></tr>
|
|
1209
|
+
<tr><td>The project's files: AGENTS.md, CLAUDE.md, PRD, stack, design, settings.json…</td><td>Not touched. The "adapt by hand" items in the CHANGELOG are asked one by one.</td></tr>
|
|
1210
|
+
<tr><td>Codex and Antigravity skill copies (<code>.agents/skills/</code>)</td><td>Regenerated from the commands on every update.</td></tr>
|
|
1211
|
+
<tr><td>A file newly added to the kit</td><td>Added if the project doesn't have it. If you deleted it on purpose before, it is not brought back.</td></tr>
|
|
1041
1212
|
</tbody>
|
|
1042
1213
|
</table></div>
|
|
1043
|
-
<div class="note"><b>
|
|
1214
|
+
<div class="note"><b>Evaluation:</b> <code>node kit/eval/run.mjs</code> runs the same task with and without the kit and scores it with hidden acceptance and adversarial tests. The latest measurement is above, in <a href="#olcum">Results</a>.</div>
|
|
1044
1215
|
</section>
|
|
1045
1216
|
|
|
1046
1217
|
<section id="kurallar">
|
|
1047
|
-
<p class="path">
|
|
1048
|
-
<h2>
|
|
1218
|
+
<p class="path">In every project</p>
|
|
1219
|
+
<h2>Golden rules</h2>
|
|
1049
1220
|
<ol class="rules">
|
|
1050
|
-
<li><b>
|
|
1051
|
-
<li><b>
|
|
1052
|
-
<li><b
|
|
1053
|
-
<li><b>
|
|
1054
|
-
<li><b>
|
|
1055
|
-
<li><b
|
|
1056
|
-
<li><b>
|
|
1057
|
-
<li><b>"
|
|
1058
|
-
<li><b
|
|
1059
|
-
<li><b>
|
|
1060
|
-
<li><b>
|
|
1061
|
-
<li><b>
|
|
1221
|
+
<li><b>You make the decisions.</b><span>The AI recommends and gives reasons; the choice is yours. On a topic where you haven't said "don't ask", it doesn't choose on its own.</span></li>
|
|
1222
|
+
<li><b>Choose design by seeing it.</b><span>You pick the screen in the preview, not a style described in words.</span></li>
|
|
1223
|
+
<li><b>Write first, then have it coded.</b><span>No code without a PRD and an out-of-scope list.</span></li>
|
|
1224
|
+
<li><b>One task, one session.</b><span>Split a big task.</span></li>
|
|
1225
|
+
<li><b>Every working step is a commit.</b><span>If the AI loses its way, you go back to there.</span></li>
|
|
1226
|
+
<li><b>Go live on day one.</b><span>Have the deploy pipeline and CI working from the start.</span></li>
|
|
1227
|
+
<li><b>Context lives in files.</b><span>Make <code>/wrap-up</code> and <code>/clear</code> a habit.</span></li>
|
|
1228
|
+
<li><b>Proof, not "it works".</b><span>A screenshot, a request/response, test output.</span></li>
|
|
1229
|
+
<li><b>The two-attempt rule.</b><span>If the same error isn't solved in two attempts, stop, go back, and re-plan.</span></li>
|
|
1230
|
+
<li><b>Secrets never go to the client.</b><span>Everything that goes to the browser and the mobile bundle is public.</span></li>
|
|
1231
|
+
<li><b>A backup you haven't tested isn't a backup.</b><span>Try the restore before launch.</span></li>
|
|
1232
|
+
<li><b>Turn a repeated error into a rule.</b><span>Write it to the kit with <code>/retro</code>; if you can, turn it into a hook or a CI step.</span></li>
|
|
1062
1233
|
</ol>
|
|
1063
1234
|
</section>
|
|
1064
1235
|
|
|
@@ -1070,19 +1241,84 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
|
|
|
1070
1241
|
<footer>
|
|
1071
1242
|
<div class="container">
|
|
1072
1243
|
<a class="brand" href="#top" style="font-size:16px"><svg class="mark" style="width:22px;height:22px"><use href="#mark"/></svg>TillerHand</a>
|
|
1073
|
-
<span>
|
|
1244
|
+
<span>Version 3.47.1 · <a href="https://github.com/burakdogrul/TillerHand">GitHub</a> · <a href="https://github.com/burakdogrul/TillerHand/blob/main/LICENSE">MIT license</a> · The KVKK section is a checklist, not legal advice.</span>
|
|
1074
1245
|
</div>
|
|
1075
1246
|
</footer>
|
|
1076
1247
|
|
|
1077
1248
|
<script>
|
|
1078
1249
|
document.querySelectorAll('.copy').forEach((b) => b.addEventListener('click', async () => {
|
|
1079
|
-
try { await navigator.clipboard.writeText(document.getElementById(b.dataset.copy).textContent); b.textContent = '
|
|
1250
|
+
try { await navigator.clipboard.writeText(document.getElementById(b.dataset.copy).textContent); b.textContent = 'Copied'; setTimeout(() => (b.textContent = 'Copy'), 1500); } catch {}
|
|
1080
1251
|
}));
|
|
1081
1252
|
const links = [...document.querySelectorAll('.side a')];
|
|
1082
1253
|
const spy = new IntersectionObserver((entries) => {
|
|
1083
1254
|
for (const e of entries) if (e.isIntersecting) links.forEach((a) => a.classList.toggle('on', a.hash === '#' + e.target.id));
|
|
1084
1255
|
}, { rootMargin: '-20% 0px -70% 0px' });
|
|
1085
1256
|
document.querySelectorAll('.doc section').forEach((s) => spy.observe(s));
|
|
1257
|
+
|
|
1258
|
+
// Setup picker: the path (new / existing) changes the next step, the place (terminal / Claude) changes the command
|
|
1259
|
+
const setup = { path: 'new', via: 'term' };
|
|
1260
|
+
const cmd = document.getElementById('cmd');
|
|
1261
|
+
const next = document.querySelector('.setup .next');
|
|
1262
|
+
function renderSetup() {
|
|
1263
|
+
cmd.textContent = setup.via === 'term' ? 'npx tillerhand init' : 'run npx tillerhand init in this folder';
|
|
1264
|
+
cmd.parentElement.classList.toggle('chat', setup.via === 'chat');
|
|
1265
|
+
const where = setup.via === 'term' ? 'Run it in the project folder.' : 'In the Claude app, select the project folder and type this.';
|
|
1266
|
+
next.innerHTML = setup.path === 'new'
|
|
1267
|
+
? `${where} Then open a new session in the same folder and type <code>/start your idea</code>.`
|
|
1268
|
+
: `${where} Your files are not overwritten. Then type <code>/adopt</code> in a new session; the code is scanned and the docs are derived from it.`;
|
|
1269
|
+
}
|
|
1270
|
+
document.querySelectorAll('.seg button').forEach((b) => b.addEventListener('click', () => {
|
|
1271
|
+
setup.path = b.dataset.path;
|
|
1272
|
+
document.querySelectorAll('.seg button').forEach((x) => x.setAttribute('aria-selected', String(x === b)));
|
|
1273
|
+
renderSetup();
|
|
1274
|
+
}));
|
|
1275
|
+
document.querySelectorAll('.via button').forEach((b) => b.addEventListener('click', () => {
|
|
1276
|
+
setup.via = b.dataset.via;
|
|
1277
|
+
document.querySelectorAll('.via button').forEach((x) => x.setAttribute('aria-pressed', String(x === b)));
|
|
1278
|
+
renderSetup();
|
|
1279
|
+
}));
|
|
1280
|
+
|
|
1281
|
+
// Reading progress
|
|
1282
|
+
const bar = document.querySelector('.progress');
|
|
1283
|
+
let ticking = false;
|
|
1284
|
+
addEventListener('scroll', () => {
|
|
1285
|
+
if (ticking) return;
|
|
1286
|
+
ticking = true;
|
|
1287
|
+
requestAnimationFrame(() => {
|
|
1288
|
+
const max = document.documentElement.scrollHeight - innerHeight;
|
|
1289
|
+
bar.style.transform = `scaleX(${max > 0 ? scrollY / max : 0})`;
|
|
1290
|
+
ticking = false;
|
|
1291
|
+
});
|
|
1292
|
+
}, { passive: true });
|
|
1293
|
+
|
|
1294
|
+
// Hero demo: it types, the question arrives, the recommended option is picked, the board opinion drops in; with reduced motion the final state stays
|
|
1295
|
+
const demo = document.querySelector('.demo');
|
|
1296
|
+
if (demo && !matchMedia('(prefers-reduced-motion: reduce)').matches) {
|
|
1297
|
+
const typed = demo.querySelector('.typed'), text = typed.textContent;
|
|
1298
|
+
const parts = [...demo.querySelectorAll('[data-s]')], rec = demo.querySelector('.opt.rec');
|
|
1299
|
+
const wait = (ms) => new Promise((r) => setTimeout(r, ms));
|
|
1300
|
+
const visible = () => new Promise((r) => {
|
|
1301
|
+
const io = new IntersectionObserver(([e]) => { if (e.isIntersecting && !document.hidden) { io.disconnect(); r(); } });
|
|
1302
|
+
io.observe(demo);
|
|
1303
|
+
});
|
|
1304
|
+
(async function loop() {
|
|
1305
|
+
for (;;) {
|
|
1306
|
+
await visible();
|
|
1307
|
+
demo.classList.add('run');
|
|
1308
|
+
parts.forEach((p) => p.classList.remove('in'));
|
|
1309
|
+
rec.classList.remove('picked');
|
|
1310
|
+
typed.textContent = '';
|
|
1311
|
+
for (const ch of text) { typed.textContent += ch; await wait(38); }
|
|
1312
|
+
await wait(500);
|
|
1313
|
+
for (let s = 1; s <= 8; s++) {
|
|
1314
|
+
parts.filter((p) => +p.dataset.s === s).forEach((p) => p.classList.add('in'));
|
|
1315
|
+
if (s === 4) { await wait(700); rec.classList.add('picked'); }
|
|
1316
|
+
await wait(s < 5 ? 380 : 260);
|
|
1317
|
+
}
|
|
1318
|
+
await wait(5200);
|
|
1319
|
+
}
|
|
1320
|
+
})();
|
|
1321
|
+
}
|
|
1086
1322
|
</script>
|
|
1087
1323
|
</body>
|
|
1088
1324
|
</html>
|