tillerhand 3.43.0 → 3.47.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/.claude/agents/board-chair.md +20 -20
  2. package/.claude/agents/code-reviewer.md +20 -20
  3. package/.claude/agents/council-advisor.md +14 -14
  4. package/.claude/agents/security-auditor.md +30 -30
  5. package/.claude/agents/test-writer.md +22 -22
  6. package/.claude/board/board-ai.md +25 -25
  7. package/.claude/board/board-api.md +25 -25
  8. package/.claude/board/board-architect.md +28 -28
  9. package/.claude/board/board-devops.md +25 -25
  10. package/.claude/board/board-mobile.md +25 -25
  11. package/.claude/board/board-performance.md +24 -24
  12. package/.claude/board/board-privacy.md +25 -25
  13. package/.claude/board/board-product.md +26 -26
  14. package/.claude/board/board-qa.md +28 -28
  15. package/.claude/board/board-ux.md +26 -26
  16. package/.claude/board/council.md +76 -76
  17. package/.claude/board/rules.md +61 -61
  18. package/.claude/claude-security-guidance.md +10 -10
  19. package/.claude/commands/adopt.md +70 -69
  20. package/.claude/commands/ask-mode.md +9 -9
  21. package/.claude/commands/board.md +15 -15
  22. package/.claude/commands/build.md +47 -47
  23. package/.claude/commands/dashboard.md +17 -17
  24. package/.claude/commands/design.md +31 -31
  25. package/.claude/commands/findings-all.md +14 -14
  26. package/.claude/commands/findings-business.md +7 -7
  27. package/.claude/commands/findings-legal.md +7 -7
  28. package/.claude/commands/findings-perf.md +7 -7
  29. package/.claude/commands/findings-security.md +9 -9
  30. package/.claude/commands/findings-tech.md +7 -7
  31. package/.claude/commands/findings-ux.md +7 -7
  32. package/.claude/commands/fix-bug.md +15 -15
  33. package/.claude/commands/freeze.md +8 -8
  34. package/.claude/commands/handoff.md +38 -38
  35. package/.claude/commands/kit-update.md +17 -14
  36. package/.claude/commands/language.md +13 -0
  37. package/.claude/commands/maintain.md +19 -19
  38. package/.claude/commands/plan-task.md +32 -32
  39. package/.claude/commands/qa.md +17 -17
  40. package/.claude/commands/release.md +40 -40
  41. package/.claude/commands/research.md +31 -31
  42. package/.claude/commands/retro.md +32 -32
  43. package/.claude/commands/review-changes.md +15 -15
  44. package/.claude/commands/rollback.md +24 -24
  45. package/.claude/commands/start.md +116 -113
  46. package/.claude/commands/tools.md +11 -11
  47. package/.claude/commands/user-feedback.md +11 -11
  48. package/.claude/commands/wrap-up.md +18 -18
  49. package/.claude/findings/lenses/business.md +24 -24
  50. package/.claude/findings/lenses/legal.md +29 -29
  51. package/.claude/findings/lenses/perf.md +19 -19
  52. package/.claude/findings/lenses/security.md +30 -30
  53. package/.claude/findings/lenses/tech.md +23 -23
  54. package/.claude/findings/lenses/ux.md +19 -19
  55. package/.claude/findings/protocol.md +54 -54
  56. package/.claude/findings/report-template.md +30 -30
  57. package/.claude/hooks/budget.mjs +7 -7
  58. package/.claude/hooks/checkpoint.mjs +12 -12
  59. package/.claude/hooks/commit-gate.mjs +38 -37
  60. package/.claude/hooks/cost.mjs +2 -2
  61. package/.claude/hooks/council.mjs +3 -3
  62. package/.claude/hooks/dashboard-data.mjs +3 -2
  63. package/.claude/hooks/dashboard.mjs +164 -149
  64. package/.claude/hooks/destructive-guard.mjs +74 -64
  65. package/.claude/hooks/edit-rounds.mjs +3 -3
  66. package/.claude/hooks/flow.mjs +10 -10
  67. package/.claude/hooks/freeze-guard.mjs +27 -23
  68. package/.claude/hooks/gate.mjs +25 -25
  69. package/.claude/hooks/guard-secrets.mjs +11 -11
  70. package/.claude/hooks/lang.mjs +114 -0
  71. package/.claude/hooks/messages.mjs +495 -0
  72. package/.claude/hooks/models.mjs +14 -11
  73. package/.claude/hooks/notify.mjs +3 -2
  74. package/.claude/hooks/package-gate.mjs +17 -15
  75. package/.claude/hooks/plugins-sync.mjs +9 -9
  76. package/.claude/hooks/prefs.mjs +19 -19
  77. package/.claude/hooks/preview.mjs +11 -11
  78. package/.claude/hooks/progress.mjs +14 -14
  79. package/.claude/hooks/qa-report.mjs +11 -10
  80. package/.claude/hooks/reminder.mjs +6 -3
  81. package/.claude/hooks/session-start.mjs +23 -17
  82. package/.claude/hooks/shared.mjs +1 -1
  83. package/.claude/hooks/status-read.mjs +5 -4
  84. package/.claude/hooks/statusline.mjs +14 -11
  85. package/.claude/hooks/structure-guard.mjs +9 -9
  86. package/.claude/hooks/test-guard.mjs +12 -12
  87. package/.claude/hooks/tools.mjs +28 -29
  88. package/.claude/hooks/usage.mjs +18 -15
  89. package/.claude/output-styles/anlatici.md +28 -28
  90. package/.claude/security-patterns.json +3 -3
  91. package/.claude/settings.json +2 -0
  92. package/.claude/skills/logo-design/SKILL.md +42 -42
  93. package/.claude/skills/motion-video/SKILL.md +52 -52
  94. package/.claude/skills/source-research/SKILL.md +35 -35
  95. package/.claude/skills/ui-motion/SKILL.md +38 -38
  96. package/.github/workflows/kit-tests.yml +7 -7
  97. package/.github/workflows/npm-publish.yml +16 -16
  98. package/AGENTS.md +56 -56
  99. package/CHANGELOG.md +7 -7
  100. package/CLAUDE.md +5 -5
  101. package/README.md +199 -172
  102. package/README.tr.md +292 -0
  103. package/docs/architecture/overview.md +31 -31
  104. package/docs/architecture/stack.md +2 -2
  105. package/docs/archive/README.md +4 -4
  106. package/docs/decisions/adr-template.md +14 -14
  107. package/docs/decisions/log.md +10 -10
  108. package/docs/findings/README.md +13 -13
  109. package/docs/findings/config.md +13 -13
  110. package/docs/legal/privacy-kvkk.md +1 -1
  111. package/docs/operations/accounts.md +25 -25
  112. package/docs/operations/deploy-setup.md +64 -64
  113. package/docs/operations/feature-flags.md +17 -17
  114. package/docs/operations/maintenance.md +48 -48
  115. package/docs/operations/release-checklist.md +61 -61
  116. package/docs/operations/spend-alarms.md +28 -28
  117. package/docs/product/feedback.md +9 -8
  118. package/docs/product/glossary.md +16 -16
  119. package/docs/product/launch.md +28 -28
  120. package/docs/product/prd.md +43 -42
  121. package/docs/product/roadmap.md +31 -30
  122. package/docs/product/specs/_template.md +13 -12
  123. package/docs/product/unit-economics.md +23 -22
  124. package/docs/quality/metrics.md +14 -14
  125. package/docs/quality/retros.md +11 -11
  126. package/docs/quality/test-plan.md +48 -48
  127. package/docs/security/checklist.md +57 -57
  128. package/docs/workflow/board.md +7 -7
  129. package/docs/workflow/cost-log.md +4 -4
  130. package/docs/workflow/decision-protocol.md +70 -70
  131. package/docs/workflow/learning.md +4 -4
  132. package/docs/workflow/mcp-catalog.md +31 -31
  133. package/docs/workflow/models.md +35 -35
  134. package/docs/workflow/progress.md +7 -7
  135. package/docs/workflow/skills.md +108 -108
  136. package/docs/workflow/usage-limits.md +62 -62
  137. package/kit/CHANGELOG.md +876 -841
  138. package/kit/VERSION +1 -1
  139. package/kit/guide.html +713 -477
  140. package/kit/guide.tr.html +1328 -0
  141. package/kit/kit.mjs +56 -54
  142. package/kit/project/README.md +29 -29
  143. package/kit/project/gitignore +12 -12
  144. package/kit/templates/addons/ai/.env.example.append +5 -5
  145. package/kit/templates/addons/ai/ai/evals/README.md +11 -11
  146. package/kit/templates/addons/ai/ai/evals/cases.jsonl +2 -2
  147. package/kit/templates/addons/ai/ai/prompts/README.md +8 -8
  148. package/kit/templates/addons/ai/docs/ai/guide.md +56 -56
  149. package/kit/templates/backend/.claude/hooks/format.mjs +1 -1
  150. package/kit/templates/backend/.claude/structure.json +1 -1
  151. package/kit/templates/backend/.env.example +6 -6
  152. package/kit/templates/backend/.github/dependabot.yml +1 -1
  153. package/kit/templates/backend/.github/workflows/ci.yml +13 -13
  154. package/kit/templates/backend/.github/workflows/claude-ci-fix.yml +19 -19
  155. package/kit/templates/backend/.github/workflows/claude-maintenance.yml +18 -18
  156. package/kit/templates/backend/.github/workflows/live-monitoring.yml +14 -14
  157. package/kit/templates/backend/.pre-commit-config.yaml +3 -3
  158. package/kit/templates/backend/docs/architecture/stack.md +98 -98
  159. package/kit/templates/backend/docs/architecture/structure.md +34 -34
  160. package/kit/templates/mobile/.claude/structure.json +1 -1
  161. package/kit/templates/mobile/.env.example +6 -6
  162. package/kit/templates/mobile/.github/dependabot.yml +2 -2
  163. package/kit/templates/mobile/.github/workflows/ci.yml +18 -18
  164. package/kit/templates/mobile/.github/workflows/claude-ci-fix.yml +19 -19
  165. package/kit/templates/mobile/.github/workflows/claude-maintenance.yml +18 -18
  166. package/kit/templates/mobile/.gitignore.append +2 -2
  167. package/kit/templates/mobile/docs/architecture/stack.md +113 -113
  168. package/kit/templates/mobile/docs/architecture/structure.md +33 -33
  169. package/kit/templates/mobile/docs/design/design-guide.md +37 -37
  170. package/kit/templates/mobile/tests/security/rls.mjs +22 -22
  171. package/kit/templates/web-saas/.claude/structure.json +1 -1
  172. package/kit/templates/web-saas/.env.example +11 -11
  173. package/kit/templates/web-saas/.github/dependabot.yml +3 -3
  174. package/kit/templates/web-saas/.github/workflows/ci.yml +20 -20
  175. package/kit/templates/web-saas/.github/workflows/claude-ci-fix.yml +19 -19
  176. package/kit/templates/web-saas/.github/workflows/claude-maintenance.yml +18 -18
  177. package/kit/templates/web-saas/.github/workflows/live-monitoring.yml +12 -12
  178. package/kit/templates/web-saas/docs/architecture/stack.md +116 -116
  179. package/kit/templates/web-saas/docs/architecture/structure.md +44 -44
  180. package/kit/templates/web-saas/docs/design/design-guide.md +38 -38
  181. package/kit/templates/web-saas/tests/live/smoke.spec.ts +4 -4
  182. package/kit/templates/web-saas/tests/security/rls.mjs +22 -22
  183. package/kit/tools/codex/.codex/hooks.json +1 -1
  184. package/package.json +2 -2
  185. package/README.en.md +0 -267
@@ -12,9 +12,9 @@ import assert from 'node:assert/strict';
12
12
  import { execFileSync } from 'node:child_process';
13
13
  import { randomUUID } from 'node:crypto';
14
14
 
15
- // { name: 'notes', owner: 'user_id', sample: () => ({ title: 'gizli not' }) } (if the key column is not "id": key: 'note_id')
15
+ // { name: 'notes', owner: 'user_id', sample: () => ({ title: 'secret note' }) } (if the key column is not "id": key: 'note_id')
16
16
  const TABLES = [];
17
- // { name: 'plans', sample: () => ({ name: 'deneme' }) }
17
+ // { name: 'plans', sample: () => ({ name: 'trial' }) }
18
18
  const PUBLIC_TABLES = [];
19
19
 
20
20
  const API = process.env.API_URL;
@@ -23,10 +23,10 @@ const SERVICE = process.env.SERVICE_ROLE_KEY ?? process.env.SECRET_KEY;
23
23
  const DB = process.env.DB_URL;
24
24
 
25
25
  const isLocal = (u) => { try { return ['localhost', '127.0.0.1', '[::1]'].includes(new URL(u).hostname); } catch { return false; } };
26
- if (!API || !ANON || !SERVICE) throw new Error('API_URL, ANON_KEY ve SERVICE_ROLE_KEY yok: önce yerel Supabase\'i başlat ve "supabase status -o env" çıktısını ortama aktar.');
26
+ if (!API || !ANON || !SERVICE) throw new Error('API_URL, ANON_KEY and SERVICE_ROLE_KEY are missing: start the local Supabase first and export the output of "supabase status -o env" to the environment.');
27
27
  // If CI skips the table list, a table with RLS off passes unnoticed
28
- if (!DB && process.env.CI) throw new Error(`DB_URL yok: CI'da tablo listesi atlanamaz. "supabase status -o env" çıktısındaki DB_URL'yi ortama aktar.`);
29
- if (!isLocal(API) || (DB && !isLocal(DB))) throw new Error(`RLS testi sadece yerel Supabase'e karşı çalışır; ${new URL(API).hostname} yerel değil. Dev veya prod projesine karşı çalıştırma.`);
28
+ if (!DB && process.env.CI) throw new Error(`DB_URL is missing: CI cannot skip the table list. Export DB_URL from the output of "supabase status -o env" to the environment.`);
29
+ if (!isLocal(API) || (DB && !isLocal(DB))) throw new Error(`The RLS test only runs against a local Supabase; ${new URL(API).hostname} is not local. Do not run it against a dev or prod project.`);
30
30
 
31
31
  let client, admin, users;
32
32
  const newUser = async () => {
@@ -49,51 +49,51 @@ before(async () => {
49
49
  after(async () => { for (const k of users ?? []) await admin.auth.admin.deleteUser(k.id); });
50
50
 
51
51
  function publicTables(t) {
52
- if (!DB) return t.skip('DB_URL yok; tablo listesi atlandı') ?? null;
52
+ if (!DB) return t.skip('DB_URL is missing; table list skipped') ?? null;
53
53
  try {
54
54
  return execFileSync('psql', [DB, '-At', '-F', ':', '-c', "select tablename, rowsecurity from pg_tables where schemaname = 'public'"], { encoding: 'utf8' })
55
55
  .split('\n').filter(Boolean).map((s) => { const [name, rls] = s.split(':'); return { name, rls: rls === 't' }; });
56
56
  } catch (e) {
57
- if (e.code === 'ENOENT' && !process.env.CI) return t.skip('psql kurulu değil; CI\'da çalışır') ?? null;
57
+ if (e.code === 'ENOENT' && !process.env.CI) return t.skip('psql is not installed; it runs in CI') ?? null;
58
58
  throw e;
59
59
  }
60
60
  }
61
61
 
62
- test('SALDIRI: RLS bütün public tablolarda RLS açık', (t) => {
62
+ test('SALDIRI: RLS is on for every public table', (t) => {
63
63
  const tables = publicTables(t);
64
64
  if (!tables) return;
65
- assert.deepEqual(tables.filter((x) => !x.rls).map((x) => x.name), [], 'RLS kapalı tablo: "alter table ... enable row level security" ve politika yaz');
65
+ assert.deepEqual(tables.filter((x) => !x.rls).map((x) => x.name), [], 'table with RLS off: write "alter table ... enable row level security" and a policy');
66
66
  });
67
67
 
68
- test('SALDIRI: RLS bütün public tablolar bu teste kayıtlı', (t) => {
68
+ test('SALDIRI: RLS every public table is registered in this test', (t) => {
69
69
  const tables = publicTables(t);
70
70
  if (!tables) return;
71
71
  const registered = new Set([...TABLES, ...PUBLIC_TABLES].map((x) => x.name));
72
- assert.deepEqual(tables.map((x) => x.name).filter((name) => !registered.has(name)), [], 'Yeni tabloyu tests/security/rls.mjs → TABLES (veya PUBLIC_TABLES) listesine ekle');
72
+ assert.deepEqual(tables.map((x) => x.name).filter((name) => !registered.has(name)), [], 'Add the new table to the TABLES (or PUBLIC_TABLES) list in tests/security/rls.mjs');
73
73
  });
74
74
 
75
75
  for (const { name, owner, sample, key = 'id' } of TABLES) {
76
- test(`SALDIRI: RLS ${name} başka kullanıcıya ve anonime kapalı`, async () => {
76
+ test(`SALDIRI: RLS ${name} is closed to other users and to anonymous`, async () => {
77
77
  const [a, b] = users;
78
78
  const anon = client(ANON);
79
79
  const { data: row, error } = await a.c.from(name).insert({ ...sample(), [owner]: a.id }).select().single();
80
80
  assert.ifError(error); // the owner must be able to write their own row; if not, sample() or the policy is missing
81
81
  const id = row[key];
82
82
 
83
- assert.equal((await anon.from(name).select().eq(key, id)).data?.length ?? 0, 0, 'anonim okuyabiliyor');
84
- assert.equal((await b.c.from(name).select().eq(key, id)).data?.length ?? 0, 0, 'başka kullanıcı okuyabiliyor');
85
- assert.equal((await b.c.from(name).update({ ...sample(), [owner]: b.id }).eq(key, id).select()).data?.length ?? 0, 0, 'başka kullanıcı güncelleyebiliyor');
86
- assert.equal((await b.c.from(name).delete().eq(key, id).select()).data?.length ?? 0, 0, 'başka kullanıcı silebiliyor');
83
+ assert.equal((await anon.from(name).select().eq(key, id)).data?.length ?? 0, 0, 'anonymous can read');
84
+ assert.equal((await b.c.from(name).select().eq(key, id)).data?.length ?? 0, 0, 'another user can read');
85
+ assert.equal((await b.c.from(name).update({ ...sample(), [owner]: b.id }).eq(key, id).select()).data?.length ?? 0, 0, 'another user can update');
86
+ assert.equal((await b.c.from(name).delete().eq(key, id).select()).data?.length ?? 0, 0, 'another user can delete');
87
87
  // Even with 0 rows returned the change may have applied (with no select policy): the row is read again
88
- assert.deepEqual((await admin.from(name).select().eq(key, id).single()).data, row, 'başka kullanıcı satırı değiştirmiş veya silmiş');
89
- assert.ok((await b.c.from(name).insert({ ...sample(), [owner]: a.id })).error, 'başka kullanıcı onun adına yazabiliyor');
90
- assert.ok((await anon.from(name).insert({ ...sample(), [owner]: a.id })).error, 'anonim yazabiliyor');
88
+ assert.deepEqual((await admin.from(name).select().eq(key, id).single()).data, row, 'another user changed or deleted the row');
89
+ assert.ok((await b.c.from(name).insert({ ...sample(), [owner]: a.id })).error, 'another user can write on their behalf');
90
+ assert.ok((await anon.from(name).insert({ ...sample(), [owner]: a.id })).error, 'anonymous can write');
91
91
  });
92
92
  }
93
93
 
94
94
  for (const { name, sample } of PUBLIC_TABLES) {
95
- test(`SALDIRI: RLS ${name} herkese açık ama yazmaya kapalı`, async () => {
96
- assert.ok((await client(ANON).from(name).insert(sample())).error, 'anonim yazabiliyor');
97
- assert.ok((await users[1].c.from(name).insert(sample())).error, 'giriş yapmış kullanıcı yazabiliyor');
95
+ test(`SALDIRI: RLS ${name} is public to read but closed to writes`, async () => {
96
+ assert.ok((await client(ANON).from(name).insert(sample())).error, 'anonymous can write');
97
+ assert.ok((await users[1].c.from(name).insert(sample())).error, 'a signed-in user can write');
98
98
  });
99
99
  }
@@ -1,5 +1,5 @@
1
1
  {
2
- "description": "Vibe Coding Kit korumaları (Codex). Betikler .claude/hooks/ altında; Claude Code ile ortak. Codex proje hook'larını ancak .codex/ klasörüne güvenip /hooks ile onayladıktan sonra çalıştırır.",
2
+ "description": "Vibe Coding Kit guards (Codex). The scripts live under .claude/hooks/ and are shared with Claude Code. Codex runs project hooks only after you trust the .codex/ folder and approve them with /hooks.",
3
3
  "hooks": {
4
4
  "SessionStart": [
5
5
  {
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tillerhand",
3
- "version": "3.43.0",
4
- "description": "Claude Code, Codex ve Antigravity için Türkçe vibe coding kiti: kurallar, komutlar, korumalar ve proje şablonları.",
3
+ "version": "3.47.0",
4
+ "description": "Vibe coding kit for Claude Code, Codex and Antigravity: rules, commands, guards and project templates.",
5
5
  "license": "MIT",
6
6
  "type": "module",
7
7
  "bin": {
package/README.en.md DELETED
@@ -1,267 +0,0 @@
1
- <p align="center">
2
- <picture>
3
- <source media="(prefers-color-scheme: dark)" srcset="kit/assets/banner-dark.svg">
4
- <img src="kit/assets/banner-light.svg" alt="TillerHand: AI builds. You steer." width="100%">
5
- </picture>
6
- </p>
7
-
8
- <p align="center">
9
- <a href="kit/CHANGELOG.md"><img alt="Version" src="https://img.shields.io/badge/version-3.43.0-2a78d6?style=flat-square"></a>
10
- <a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-2a78d6?style=flat-square"></a>
11
- <img alt="Claude Code" src="https://img.shields.io/badge/Claude%20Code-ready-d97757?style=flat-square">
12
- <img alt="Also Codex and Antigravity" src="https://img.shields.io/badge/also-Codex%20%C2%B7%20Antigravity-5b6577?style=flat-square">
13
- <img alt="Node.js 18+" src="https://img.shields.io/badge/Node.js-18%2B-3c873a?style=flat-square">
14
- </p>
15
-
16
- <p align="center">
17
- <a href="README.md">Türkçe</a> · <b>English</b> · <a href="https://burakdogrul.github.io/TillerHand/kit/guide.html"><b>Read the guide →</b></a>
18
- </p>
19
-
20
- <p align="center">
21
- <a href="#step-by-step-for-beginners">Step by step</a> ·
22
- <a href="#quick-start">Quick start</a> ·
23
- <a href="#how-it-works">How it works</a> ·
24
- <a href="#expert-board">Board</a> ·
25
- <a href="#guardrails">Guardrails</a> ·
26
- <a href="#commands">Commands</a> ·
27
- <a href="#license">License</a>
28
- </p>
29
-
30
- ---
31
-
32
- **TillerHand** is a starter kit that takes a product from idea to production and maintenance with [Claude Code](https://claude.com/claude-code). The AI writes the code; **you make the decisions**. At every important step it lays out the options, when each one is the better choice, and what it recommends. An **expert board** reviews the work, **guardrails** stop dangerous actions before they happen, and the project always stays in a **clean folder structure**.
33
-
34
- > The kit's commands, prompts and documents are in Turkish.
35
-
36
- | | |
37
- |---|---|
38
- | **Question-driven** | Product, technical, design, data, security and cost decisions come as reasoned options. Design questions come with visual previews. |
39
- | **Expert board** | Product, Architect, Security, UX, Privacy, QA and other members review the plan, each task, each commit and each phase. |
40
- | **Tests first** | Acceptance tests are written before the code and start red. Nothing is called done without proof that it works. |
41
- | **Findings reports** | The top 20 findings for tech, business, security, UX, performance and legal; scored, with how to fix them. |
42
- | **Guardrails** | Secrets, destructive commands, unapproved prod deploys, weakened tests and stray files are stopped before they happen. |
43
- | **Dashboard** | `dashboard.html`: status, what needs attention, decisions, board, findings, quality, operations, usage. |
44
- | **Usage-aware** | Reads the 5-hour and weekly limits and plans work around them. It warns; it never stops the work. |
45
- | **Sourced facts** | Anything that changes (versions, prices, regulations) is checked against a primary source, with link and date. |
46
- | **Rollback** | `/rollback` returns to the last working state; history is kept, unfinished work is saved. |
47
- | **Narrator mode** | Optionally explains every change in plain language, as if to someone who doesn't code. |
48
- | **Learns how you work** | Picks up how you like to work (tone, questions, reports, code style). Preferences you approve apply to all your projects and stay on your computer. |
49
- | **Model per role** | You pick the model and effort for planning, coding, review and docs at the start of each task. Coding, review and doc work go to subagents running on your choice. |
50
-
51
- ## Step by step for beginners
52
-
53
- You don't need to know how to code. Claude handles git, the terminal and installs; you describe what you want and make the choices.
54
-
55
- **1. Setup (once)**
56
- - Accounts: [GitHub](https://github.com) (free) and a Claude **Pro** or **Max** subscription.
57
- - Apps: the [Claude desktop app](https://claude.com/download), [Node.js](https://nodejs.org) (LTS), [Git](https://git-scm.com/downloads).
58
-
59
- **2. Create your project**
60
- 1. Make a folder for your project and select it in the **Code** tab of the Claude desktop app.
61
- 2. Install the kit. Pick one:
62
- - Tell Claude: `run npx tillerhand init in this folder`.
63
- - Or use the plugin, in order: `/plugin marketplace add burakdogrul/TillerHand`, `/plugin install tillerhand@tillerhand`, `/tillerhand:init`.
64
- 3. **Start a new session** in the same folder. The kit's commands and guardrails load in the new session.
65
-
66
- **3. Start**
67
-
68
- ```
69
- /start An invoicing and payment tracker for freelancers
70
- ```
71
-
72
- Claude asks its questions one by one. **The first option is always the recommended one**; pick it if you're unsure. Already have a project? Type `/adopt` instead of `/start`: Claude scans the code, derives the docs from it and brings the project into the kit's structure step by step.
73
-
74
- **4. Every day**
75
-
76
- | When | What to type |
77
- |---|---|
78
- | Starting work | `/build` (picks up the next task and tests it) |
79
- | Checking status | `where are we?` or `/dashboard` |
80
- | Something breaks | `/rollback` |
81
- | Stopping | `/wrap-up`, then `/clear` |
82
-
83
- **Good to know**
84
- - **Limits:** Pro has 5-hour and weekly limits. Claude warns at 90%, 95% and 99%; if a limit runs out, continue with `/build` once it resets.
85
- - **Approval:** Database, design and cost decisions are never made without asking. Deleting data, payments and going live always need your approval.
86
- - **Handoff:** Leaving the project to someone else? Use `/handoff`; they continue from the same point with `/handoff devral`.
87
-
88
- ## Quick start
89
-
90
- **Requirements:** [Claude Code](https://claude.com/claude-code), Git, Node.js 18+
91
-
92
- There are three ways to install. All three set the kit up in the project the same way; pick one.
93
-
94
- **1. npm (recommended):** the shortest path from a terminal.
95
-
96
- ```bash
97
- mkdir my-app && cd my-app
98
- npx tillerhand init
99
- claude
100
- ```
101
-
102
- **2. Claude Code plugin:** no terminal, all inside Claude Code. The plugin only runs the install; the kit is still copied into the project as files. You can turn the plugin off afterwards.
103
-
104
- ```text
105
- /plugin marketplace add burakdogrul/TillerHand
106
- /plugin install tillerhand@tillerhand
107
- /tillerhand:init
108
- ```
109
-
110
- **3. git:** to read, change or contribute to the kit source. The kit stays in a `vibe-kit/` folder inside the project and goes into `.gitignore`.
111
-
112
- ```bash
113
- git clone https://github.com/burakdogrul/TillerHand.git vibe-kit
114
- node vibe-kit/kit/kit.mjs init
115
- ```
116
-
117
- - On first launch Claude Code offers to install the kit's skill plugins; accept.
118
- - Kit in another folder: `node <kit>/kit/kit.mjs init --project <project>`.
119
- - For Codex or Antigravity: `npx tillerhand init --tool codex` (several: `--tool claude,codex`).
120
- - Recommended: a code map ([codebase-memory-mcp](https://github.com/DeusData/codebase-memory-mcp)). The AI queries the code instead of reading it file by file, which saves tokens. `/start` offers to install it.
121
-
122
- ## How it works
123
-
124
- ```mermaid
125
- flowchart LR
126
- A["/start<br/>idea → plan"] --> B["Phase 0<br/>setup, CI, first deploy"]
127
- B --> C{"Each task"}
128
- C --> D["/plan-task<br/>decisions + board"]
129
- D --> E["/build<br/>acceptance tests first"]
130
- E --> F["/review-changes<br/>+ commit gate"]
131
- F --> G["/wrap-up"]
132
- G --> C
133
- C -->|"end of phase"| H["/findings-*<br/>/board convene<br/>/retro"]
134
- H --> I["/release first"]
135
- I --> J["/maintain"]
136
- ```
137
-
138
- **The `/start` wizard** turns an idea into a plan in nine steps:
139
-
140
- | Step | What happens |
141
- |---|---|
142
- | 0 Setup | Profile, planning depth, dashboard, limits |
143
- | 1 Idea | The idea is challenged and a PRD is written |
144
- | 2 Type | Web/SaaS, mobile or backend; any AI features |
145
- | 3 Install | The chosen type and folder map are put in place |
146
- | 4 Stack | The type's decision catalog: database, auth, hosting… |
147
- | 5 Architecture | Data model, roles, services, unit economics |
148
- | 6 Board | The expert board is set up (cost is shown first) |
149
- | 7 Design | Style, color and type chosen from visual previews |
150
- | 8 Roadmap | Prioritized tasks, each led by its acceptance tests |
151
- | 9 Wrap-up | Summary and the first task |
152
-
153
- **Decision protocol:** Each decision point offers 2-4 options; the recommended one comes first, and each option says when it's the better choice and what it costs. For decisions that are hard to reverse (database, auth, payments, data model) the board weighs in first. Decisions are logged in `docs/decisions/log.md` and never asked twice.
154
-
155
- ## Expert board
156
-
157
- Board agents are generated for your project based on its type. The board advises; if it raises a critical finding (a veto), the work isn't done until you decide.
158
-
159
- | Type | Suggested board |
160
- |---|---|
161
- | Web / SaaS | Product · Architect · Security · UX · Performance · Privacy · QA |
162
- | Mobile | Product · Architect · Security · UX · Mobile Platform · Privacy · QA |
163
- | Backend | Product · Architect · Security · API · DevOps · QA |
164
-
165
- | Meeting | When |
166
- |---|---|
167
- | Plan | End of `/plan-task` |
168
- | Task review | End of `/build` |
169
- | Commit | Every commit (light, diff only) |
170
- | Phase end, launch | `/board convene`, `/release first` |
171
-
172
- For important decisions a **council** runs: different models answer the same question independently, rank each other anonymously, and a chair writes the outcome. Code does the counting; the final call is still yours.
173
-
174
- ## Findings reports
175
-
176
- Scans the project through an expert's eyes and writes the **top 20 findings** with evidence, a 0-100 score and a fix to `docs/findings/`. Each report is compared with the previous one and shown as a trend on the dashboard.
177
-
178
- | Command | Perspective | Example finding |
179
- |---|---|---|
180
- | `/findings-tech` | Senior architect | N+1 queries, duplicated authorization checks |
181
- | `/findings-business` | Industry expert | Missing refund rule, a feature competitors treat as standard |
182
- | `/findings-security` | Attacker | IDOR, a key leaked to the client |
183
- | `/findings-ux` | UX researcher | No empty state, low contrast |
184
- | `/findings-perf` | Performance and FinOps | Large bundle, unbounded AI cost |
185
- | `/findings-legal` | Compliance expert | Missing consent, personal data not in the inventory |
186
- | `/findings-all` | All of them, in parallel | One summary and a shared fix plan |
187
-
188
- ## Project structure
189
-
190
- Every project starts in this layout and stays in it. Code is organized by feature: everything for a feature lives under `features/<feature>/`.
191
-
192
- ```
193
- .
194
- ├── .claude/ # commands, agents, hooks, board, folder map
195
- ├── .github/ # CI, Dependabot
196
- ├── docs/
197
- │ ├── product/ # PRD, roadmap, glossary, launch
198
- │ ├── architecture/ # overview, stack, structure
199
- │ ├── decisions/ # decision log and ADRs
200
- │ ├── quality/ # test plan, metrics, retros
201
- │ ├── security/ # security checklist
202
- │ ├── operations/ # release, deploy setup, maintenance, accounts
203
- │ └── findings/ # findings reports
204
- ├── src/ or app/ # feature-based code
205
- ├── tests/
206
- └── AGENTS.md · CLAUDE.md · README.md · CHANGELOG.md
207
- ```
208
-
209
- A new file outside the map is asked about, clutter like `*.bak` and `*-old.*` is blocked, and CI checks the structure on every PR.
210
-
211
- ## Guardrails
212
-
213
- | Guardrail | What it does |
214
- |---|---|
215
- | Secret guard | Blocks API keys written into code or docs |
216
- | Destructive-command shield | Blocks `DROP`, unconditional `DELETE`, `db reset`; asks before prod deploys and rollbacks |
217
- | Package gate | Blocks packages that don't exist (on install and on `npx`, `uvx` runs); asks about very new ones or lookalikes of popular ones |
218
- | Structure guard | Asks about files outside the map, blocks clutter files |
219
- | Test guard | Asks before a test is deleted, skipped or weakened |
220
- | Deterministic gate | No commit until lint, type check, tests and Semgrep have run; catches machine-specific paths written into code |
221
- | Commit gate | No commit without a board review and a green gate |
222
- | Edit lock | With `/freeze <folder>` on, the AI writes only inside that folder |
223
- | Scope shield | Asks before writing to a file outside the approved plan |
224
- | Config approval | Rule and guard files never change without your approval |
225
- | Dev/prod split | The AI and the local setup connect to the dev database only |
226
-
227
- ## Commands
228
-
229
- | Command | What it does |
230
- |---|---|
231
- | `/start [idea]` | Nine-step kickoff wizard |
232
- | `/adopt` | Brings an existing project into the kit with an alignment roadmap |
233
- | `/plan-task [task]` | Asks the decisions, plans with the board |
234
- | `/build [task]` | Acceptance tests first, then code, proof and board review |
235
- | `/design` | Design decisions with visual previews |
236
- | `/review-changes` | Independent review and security agents |
237
- | `/fix-bug [symptom]` | Root cause, red test, fix |
238
- | `/qa` | Runs the UI criteria in a real browser |
239
- | `/findings-<type>` | Findings reports |
240
- | `/board` | Sets up and convenes the board; `council <question>` runs the council |
241
- | `/dashboard` | Dashboard |
242
- | `/rollback` | Returns to the last working state |
243
- | `/freeze <folder>` | Locks edits to one folder |
244
- | `/wrap-up` | Closes the session and saves progress |
245
- | `/release [first]` | Launch checks; `first` also walks you through hosting, domain, backups and rollback |
246
- | `/maintain` | Weekly, monthly and quarterly maintenance |
247
- | `/retro` | Writes lessons back to the project and the kit |
248
- | `/handoff` | Hands the project over or takes it over |
249
- | `/kit-update` | Updates the project to the latest kit |
250
-
251
- Every command, setting, tool and skill is in the **[guide](https://burakdogrul.github.io/TillerHand/kit/guide.html)**.
252
-
253
- ## Codex and Antigravity
254
-
255
- The kit is built for Claude Code; its rules, commands and guardrails also work in OpenAI Codex and Google Antigravity. There the board runs on a single model, and the question UI, status bar and commit gate are not available. Install with `node <kit>/kit/kit.mjs init --tool codex` (or `antigravity`).
256
-
257
- ## Measured
258
-
259
- The same tasks were run with and without the kit through `claude -p` and scored with hidden tests (3.18.2, Sonnet, 6 tasks, 24 runs per condition):
260
-
261
- - Both conditions passed every hidden test.
262
- - The kit's tests caught **63%** of bugs deliberately injected into the code; the tests written without the kit caught **31%**.
263
- - With the kit, tests came before the code in every run; without it, in none.
264
-
265
- ## License
266
-
267
- [MIT](LICENSE) © 2026 Burak Doğrul