tillerhand 3.49.12 → 3.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/hooks/commit-gate.mjs +27 -25
- package/.claude/hooks/destructive-guard.mjs +2 -1
- package/AGENTS.md +1 -1
- package/README.md +2 -2
- package/README.tr.md +2 -2
- package/kit/CHANGELOG.md +8 -0
- package/kit/VERSION +1 -1
- package/kit/guide.html +5 -4
- package/kit/guide.tr.html +5 -4
- package/kit/tools/antigravity/.agents/hooks.json +2 -1
- package/kit/tools/codex/.codex/hooks.json +2 -1
- package/package.json +1 -1
|
@@ -9,7 +9,7 @@ import fs from 'node:fs';
|
|
|
9
9
|
import path from 'node:path';
|
|
10
10
|
import crypto from 'node:crypto';
|
|
11
11
|
import { execSync } from 'node:child_process';
|
|
12
|
-
import { findRoot, isMain, reviewOff } from './shared.mjs';
|
|
12
|
+
import { findRoot, isMain, reviewOff, parseInput, decisionText } from './shared.mjs';
|
|
13
13
|
import { t } from './lang.mjs';
|
|
14
14
|
import { unquote } from './destructive-guard.mjs';
|
|
15
15
|
import { isTestFile, isTestConfig, digest, readRecord } from './test-guard.mjs';
|
|
@@ -174,16 +174,27 @@ export function maskOwnHook(command, dir) {
|
|
|
174
174
|
});
|
|
175
175
|
}
|
|
176
176
|
|
|
177
|
+
// Claude Code stops a tool call with exit code 2 and the reason on stderr; Codex and Antigravity get their JSON decision
|
|
178
|
+
// (shared.decisionText; Codex has no ask, so an ask is a deny there and the user runs the command themselves).
|
|
179
|
+
let tool = 'claude';
|
|
180
|
+
const decideOut = (decision, reason) => { console.log(decisionText(tool, decision, reason)); process.exit(0); };
|
|
181
|
+
function stop(reason) {
|
|
182
|
+
if (tool !== 'claude') decideOut('deny', reason.trim());
|
|
183
|
+
process.stderr.write(reason);
|
|
184
|
+
process.exit(2);
|
|
185
|
+
}
|
|
186
|
+
|
|
177
187
|
async function hook() {
|
|
178
188
|
let command = '', dir = root;
|
|
179
189
|
try {
|
|
180
|
-
const
|
|
190
|
+
const g = parseInput(JSON.parse(fs.readFileSync(0, 'utf8')) ?? {});
|
|
191
|
+
tool = g.tool;
|
|
181
192
|
// A backslash-newline is a line continuation: bash joins the words ("git comm\<newline>it" is git commit), the
|
|
182
193
|
// text rules may also need it as a space ("git commit\<newline>-m x"). Whichever spelling is a commit is checked.
|
|
183
|
-
const raw = String(
|
|
194
|
+
const raw = String(g.command ?? '');
|
|
184
195
|
const joined = raw.replace(/\\\r?\n/g, '');
|
|
185
196
|
command = [joined, unquote(joined)].some((c) => commitPattern(joined).test(c)) ? joined : raw.replace(/\\\r?\n/g, ' ');
|
|
186
|
-
if (
|
|
197
|
+
if (g.dir) dir = g.dir;
|
|
187
198
|
} catch {
|
|
188
199
|
process.exit(0);
|
|
189
200
|
}
|
|
@@ -191,11 +202,7 @@ async function hook() {
|
|
|
191
202
|
// A commit whose message names --skip goes on to the commit checks below (a real --skip chained to a commit is stopped there).
|
|
192
203
|
const open = unquote(command);
|
|
193
204
|
const commit = commitPattern(command);
|
|
194
|
-
if (!commit.test(command) && [command, open].some((c) => /commit-gate\.mjs\b[^;&|\n]*--skip\b/i.test(c)))
|
|
195
|
-
console.log(JSON.stringify({ hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'ask',
|
|
196
|
-
permissionDecisionReason: t(root, 'guard.commit.skipAsk') } }));
|
|
197
|
-
process.exit(0);
|
|
198
|
-
}
|
|
205
|
+
if (!commit.test(command) && [command, open].some((c) => /commit-gate\.mjs\b[^;&|\n]*--skip\b/i.test(c))) decideOut('ask', t(root, 'guard.commit.skipAsk'));
|
|
199
206
|
// The gate command approval gives the commands in AGENTS.md permission to run: the user is asked (also covers spellings the permission list misses).
|
|
200
207
|
// Only this project's commit-gate.mjs --approve is left out (maskOwnHook); both the raw and unquoted text are tested.
|
|
201
208
|
const masked = maskOwnHook(command, dir);
|
|
@@ -203,26 +210,21 @@ async function hook() {
|
|
|
203
210
|
// The prompt reads AGENTS.md now: a chain, an env variable, a node flag or a redirect must not change it after the
|
|
204
211
|
// prompt and get another list approved. Only the exact spelling is accepted.
|
|
205
212
|
if (!/^\s*node\s+(\.\/)?\.claude[\\/]hooks[\\/]gate\.mjs\s+(['"]?)--approve\2\s*$/.test(command)) {
|
|
206
|
-
|
|
207
|
-
permissionDecisionReason: 'The gate command approval runs only with exactly this spelling, on its own (no chain, environment variable, flag or redirect): node .claude/hooks/gate.mjs --approve' } }));
|
|
208
|
-
process.exit(0);
|
|
213
|
+
decideOut('deny', 'The gate command approval runs only with exactly this spelling, on its own (no chain, environment variable, flag or redirect): node .claude/hooks/gate.mjs --approve');
|
|
209
214
|
}
|
|
210
215
|
// Loaded only here: every Bash call runs this hook, and gate.mjs pulls in the dashboard and edit-round modules
|
|
211
216
|
const { approvedCommands, commandList, readAgents, unknownCommandKeys } = await import('./gate.mjs');
|
|
212
217
|
const list = commandList(approvedCommands(root)) || t(root, 'guard.commit.noCommands');
|
|
213
218
|
const unknown = unknownCommandKeys(readAgents(root));
|
|
214
219
|
const note = unknown.length ? `\n${t(root, 'guard.commit.gateUnknownKeys', { keys: unknown.join(', ') })}` : '';
|
|
215
|
-
|
|
216
|
-
permissionDecisionReason: t(root, 'guard.commit.gateApprovalAsk', { list }) + note } }));
|
|
217
|
-
process.exit(0);
|
|
220
|
+
decideOut('ask', t(root, 'guard.commit.gateApprovalAsk', { list }) + note);
|
|
218
221
|
}
|
|
219
222
|
if (!commit.test(command) && !commit.test(open)) process.exit(0);
|
|
220
223
|
if (!hasBoard() || boardReviewOff()) process.exit(0);
|
|
221
224
|
const chain = chainIssue(command, commit.inline ? COMMIT : commit);
|
|
222
225
|
if (chain) {
|
|
223
|
-
|
|
226
|
+
stop(`Commit stopped: ${chain}. The gate reviews the changes as they were before the command runs; run the commit on its own ` +
|
|
224
227
|
'(or only as "git add … && git commit"). Run push and other commands separately.\n');
|
|
225
|
-
process.exit(2);
|
|
226
228
|
}
|
|
227
229
|
|
|
228
230
|
let d;
|
|
@@ -241,19 +243,19 @@ async function hook() {
|
|
|
241
243
|
// Deleted files are left to the guards that ask before a delete. Only code files: snapshots, images and fixtures are
|
|
242
244
|
// written by the test runner, not by Write/Edit. A partially staged test (git apply --cached, skip-worktree) commits an
|
|
243
245
|
// index blob the record does not describe, so it always stops.
|
|
246
|
+
// Only Claude Code records what test-writer wrote; on Codex and Antigravity test separation is a written rule (AGENTS.md)
|
|
244
247
|
const written = readRecord(root);
|
|
245
|
-
const foreign = d.files.filter((f) => isTestFile(f) && isCodeFile(f) && !isTestConfig(f) && d.hashes[f] !== 'deleted' && written[f] !== d.hashes[f]);
|
|
248
|
+
const foreign = tool !== 'claude' ? [] : d.files.filter((f) => isTestFile(f) && isCodeFile(f) && !isTestConfig(f) && d.hashes[f] !== 'deleted' && written[f] !== d.hashes[f]);
|
|
246
249
|
if (foreign.length && !(skipped && approval.signature === d.signature)) {
|
|
247
|
-
|
|
250
|
+
stop(`Commit stopped: test-writer did not write these test files, or they changed after it wrote them, or they were partially staged: ${foreign.join(', ')}.\n` +
|
|
248
251
|
'Only the test-writer agent writes test files with Write/Edit (AGENTS.md rule 7); a test written by patch, script, shell, git mv or Codex/Antigravity does not count.\n' +
|
|
249
252
|
'If a change is needed, have test-writer review the file and rewrite it with Write/Edit. If the user made the change themselves ' +
|
|
250
253
|
'and explicitly asks to skip the review for this commit, use --skip "user request".\n');
|
|
251
|
-
process.exit(2);
|
|
252
254
|
}
|
|
253
255
|
if (approval?.signature === d.signature && (skipped || (gate?.signature === d.signature && gate.passed === true))) process.exit(0);
|
|
254
256
|
if (approval?.signature === d.signature) {
|
|
255
257
|
const failed = gate?.signature === d.signature ? gate.checks.filter((k) => k.status === 'failed').map((k) => k.name) : null;
|
|
256
|
-
|
|
258
|
+
stop(failed && !failed.length && gate.empty
|
|
257
259
|
? 'Commit stopped: the deterministic gate is empty (no check ran). Fill in AGENTS.md → Commands and run the gate again.\n' +
|
|
258
260
|
'If the user explicitly asks for this commit, use --skip "user request".\n'
|
|
259
261
|
: failed
|
|
@@ -261,22 +263,22 @@ async function hook() {
|
|
|
261
263
|
'If the user explicitly asks for an intermediate (WIP) commit, use --skip "user request".\n'
|
|
262
264
|
: 'Commit stopped: the deterministic gate has not run for these changes (or the changes were modified after it ran). ' +
|
|
263
265
|
'Run node .claude/hooks/gate.mjs --run; if nothing is red, renew the board approval and try the commit again.\n');
|
|
264
|
-
process.exit(2);
|
|
265
266
|
}
|
|
266
267
|
|
|
267
268
|
const delta = approval && !skipped ? sinceApproval(approval, d) : [];
|
|
268
|
-
|
|
269
|
+
stop(
|
|
269
270
|
(delta.length && delta.length < d.files.length
|
|
270
271
|
? `Commit stopped: files changed since the last approval (${approval.note}) were not reviewed: ${delta.join(', ')}.\n` +
|
|
271
272
|
'The board looks only at the diff of these files; files approved earlier are not reviewed again.\n'
|
|
272
273
|
: `Commit stopped: the board has not reviewed these changes (${d.files.length} files).\n`) +
|
|
273
274
|
'0. Run the deterministic gate (lint, types, tests, Semgrep) with node .claude/hooks/gate.mjs --run; give its output to the members.\n' +
|
|
274
|
-
|
|
275
|
+
(tool === 'claude'
|
|
276
|
+
? '1. Following .claude/board/rules.md §3, run at most 2 relevant board members for the changed files with model "haiku", on the diff only.\n'
|
|
277
|
+
: '1. Following .claude/board/rules.md §3, read the definitions of at most 2 relevant board members (.claude/agents/board-*.md) and review the diff as those roles yourself (single model).\n') +
|
|
275
278
|
'2. If there is no REJECT: node .claude/hooks/commit-gate.mjs --approve "<members who took part>" and try the commit again.\n' +
|
|
276
279
|
'3. If there is a REJECT, do not commit; ask the user about the finding and the options.\n' +
|
|
277
280
|
'If the user explicitly wants to skip the review for this commit, use --skip "user request".\n'
|
|
278
281
|
);
|
|
279
|
-
process.exit(2);
|
|
280
282
|
}
|
|
281
283
|
|
|
282
284
|
if (isMain(import.meta.url)) {
|
|
@@ -33,7 +33,8 @@ const DESTRUCTIVE = [
|
|
|
33
33
|
[/\bheroku\s+pg:reset\b|\bdrop(Database|Collection)\s*\(|\bdeleteMany\s*\(\s*\{\s*\}\s*\)|\bartisan\s+migrate:(fresh|refresh|reset)\b|\btypeorm\b[^;]*\bschema:drop\b|\bknex\b[^;]*\bmigrate:rollback\b[^;]*--all\b|\bprisma\s+db\s+push\b[^;]*--accept-data-loss\b/i, 'Database data is being deleted or reset'],
|
|
34
34
|
[/\b(terraform|tofu|pulumi)\s+destroy\b/i, 'Cloud infrastructure is being destroyed'],
|
|
35
35
|
// Options may come before the service and between it and the subcommand (aws --profile x s3 --region r rm, heroku -a x apps:destroy)
|
|
36
|
-
|
|
36
|
+
// The flag is looked for once, before the gaps are tried: the rule stays fast on a long repeated input
|
|
37
|
+
[cmdRe(String.raw`\baws(\.exe)?\s(?=_L_\s--recursive\b)_G_s3\s_G_rm\b|\baws(\.exe)?\s(?=_L_\s--force\b)_G_s3\s_G_rb\b|\baws(\.exe)?\s_G_(s3api\s_G_delete-bucket|rds\s_G_delete-db-(instance|cluster)|dynamodb\s_G_delete-table|ec2\s_G_terminate-instances)\b|\bgcloud\s_G_((sql|compute)\s_G_instances\s_G_delete|projects\s_G_delete)\b|\b(gsutil|gcloud)\s(?=_L_\s(-[a-zA-Z]*r|--recursive)\b)_G_(storage\s_G_)?rm\b|\baz\s_G_(group|resource)\s_G_delete\b|\bheroku\s_G_apps:destroy\b|\b(fly|flyctl)\s_G_(apps|volumes)\s_G_destroy\b|\bgh\s_G_repo\s_G_delete\b|\bsupabase\s_G_projects\s_G_delete\b|\bnetlify(-cli)?\s_G_sites:delete\b`), 'Cloud data, an app or a repository is being deleted for good'],
|
|
37
38
|
];
|
|
38
39
|
|
|
39
40
|
// Database addresses other than localhost count as prod (or a shared environment)
|
package/AGENTS.md
CHANGED
|
@@ -37,7 +37,7 @@ The kit was written for Claude Code; these equivalents apply in these two tools:
|
|
|
37
37
|
- **Wherever AskUserQuestion appears:** in Antigravity, the `ask_question` tool. If there is no question tool with options (Codex), write the options as a numbered list, put the recommended one first and mark it "(Recommended)", then wait for the answer. The decision is still the user's.
|
|
38
38
|
- **Subagents** (board members, council, review agents in `.claude/agents/`): If you cannot run them, read the matching definition, assess as that role yourself and state "single model" in the report. The test separation (rule 7) cannot be enforced here by a hook: write the tests with the `test-writer` definition, before you think about the code, and show the red run; do not change the test file while writing the code.
|
|
39
39
|
- **Model and effort** (`docs/workflow/models.md`): Start the subagent with the role's equivalent (Codex: model and reasoning effort in the prompt; Antigravity: `inherit`, `flash` or `pro`). If you cannot, run the role yourself and suggest the model in text.
|
|
40
|
-
- **Protections** (secret block, destructive command shield, structure guard, edit lock, test protection, edit round counter, package gate and the equivalent of the Claude Code permission list) run as hooks: Codex `.codex/hooks.json`, Antigravity `.agents/hooks.json`. Writing to rule and protection files (`AGENTS.md`, `.claude/`, `.codex/`, `.agents/hooks.json`) needs approval. Do not try another route (for example a shell command) around a blocked action; tell the user why.
|
|
40
|
+
- **Protections** (secret block, destructive command shield, structure guard, edit lock, test protection, edit round counter, package gate, commit gate and the equivalent of the Claude Code permission list) run as hooks: Codex `.codex/hooks.json`, Antigravity `.agents/hooks.json`. Writing to rule and protection files (`AGENTS.md`, `.claude/`, `.codex/`, `.agents/hooks.json`) needs approval. Do not try another route (for example a shell command) around a blocked action; tell the user why. The commit gate stops a commit until `node .claude/hooks/gate.mjs --run` is green and the board review (you, as the relevant members) is approved with `commit-gate.mjs --approve`; it does not check who wrote a test file there. Known limit: the shell rules read the command text and can miss unusual spellings.
|
|
41
41
|
- Skills that belong to Claude Code plugins (named `plugin:skill`) do not exist in these tools: skip that step. There is also no limit reading and no status line: the limit stays "-" in the status block.
|
|
42
42
|
<!-- /kit:other-tools -->
|
|
43
43
|
|
package/README.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
8
|
<p align="center">
|
|
9
|
-
<a href="kit/CHANGELOG.md"><img alt="Version" src="https://img.shields.io/badge/version-3.
|
|
9
|
+
<a href="kit/CHANGELOG.md"><img alt="Version" src="https://img.shields.io/badge/version-3.50.0-2a78d6?style=flat-square"></a>
|
|
10
10
|
<a href="LICENSE"><img alt="License: MIT" src="https://img.shields.io/badge/license-MIT-2a78d6?style=flat-square"></a>
|
|
11
11
|
<img alt="Claude Code" src="https://img.shields.io/badge/Claude%20Code-ready-d97757?style=flat-square">
|
|
12
12
|
<img alt="Also Codex and Antigravity" src="https://img.shields.io/badge/also-Codex%20%C2%B7%20Antigravity-5b6577?style=flat-square">
|
|
@@ -277,7 +277,7 @@ Every command, setting, tool and skill is in the **[guide](https://burakdogrul.g
|
|
|
277
277
|
|
|
278
278
|
## Codex and Antigravity
|
|
279
279
|
|
|
280
|
-
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
|
|
280
|
+
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 and status bar are not available; the commit gate works there too. These tools don't report which agent is running, so test separation stays a written rule there. Install with `node <kit>/kit/kit.mjs init --tool codex` (or `antigravity`).
|
|
281
281
|
|
|
282
282
|
## Measured
|
|
283
283
|
|
package/README.tr.md
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
</p>
|
|
7
7
|
|
|
8
8
|
<p align="center">
|
|
9
|
-
<a href="kit/CHANGELOG.md"><img alt="Sürüm" src="https://img.shields.io/badge/s%C3%BCr%C3%BCm-3.
|
|
9
|
+
<a href="kit/CHANGELOG.md"><img alt="Sürüm" src="https://img.shields.io/badge/s%C3%BCr%C3%BCm-3.50.0-2a78d6?style=flat-square"></a>
|
|
10
10
|
<a href="LICENSE"><img alt="Lisans: MIT" src="https://img.shields.io/badge/lisans-MIT-2a78d6?style=flat-square"></a>
|
|
11
11
|
<img alt="Claude Code" src="https://img.shields.io/badge/Claude%20Code-haz%C4%B1r-d97757?style=flat-square">
|
|
12
12
|
<img alt="Codex ve Antigravity" src="https://img.shields.io/badge/ayr%C4%B1ca-Codex%20%C2%B7%20Antigravity-5b6577?style=flat-square">
|
|
@@ -277,7 +277,7 @@ Tüm komutlar, ayarlar, araçlar ve skill'ler **[rehberde](https://burakdogrul.g
|
|
|
277
277
|
|
|
278
278
|
## Codex ve Antigravity
|
|
279
279
|
|
|
280
|
-
Kit Claude Code için yazıldı; kurallar, komutlar ve korumalar OpenAI Codex ve Google Antigravity'de de çalışır. Kurul tek modelle yürür; soru
|
|
280
|
+
Kit Claude Code için yazıldı; kurallar, komutlar ve korumalar OpenAI Codex ve Google Antigravity'de de çalışır. Kurul tek modelle yürür; soru arayüzü ve durum çubuğu bu araçlarda yok, commit kapısı orada da çalışır. Bu araçlar ajan kimliği bildirmediği için test ayrımı orada kural metninde kalır. Kurulum: `node <kit>/kit/kit.mjs init --tool codex` (veya `antigravity`).
|
|
281
281
|
|
|
282
282
|
## Ölçüm
|
|
283
283
|
|
package/kit/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,14 @@
|
|
|
3
3
|
The kit version is in `kit/VERSION`. To update a project, run `/kit-update` in it.
|
|
4
4
|
Items with an "Adapt by hand" note concern files owned by the project; the update does not touch them.
|
|
5
5
|
|
|
6
|
+
## [3.50.0] - 2026-10-30
|
|
7
|
+
|
|
8
|
+
### Added
|
|
9
|
+
- **The commit gate runs on Codex and Antigravity.** A commit stops there too until the deterministic gate (`gate.mjs --run`) is green and the board review is approved with `commit-gate.mjs --approve`; a commit chained to other commands stops as well. The stop comes as the tool's own decision. Since these tools run one model, the AI reviews the diff as the relevant board members itself. `commit-gate.mjs --skip` and the gate command approval are asked on Antigravity and left to you on Codex (it has no approval prompt). Test separation stays a written rule there: these tools do not report which agent wrote a test file.
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
- The cloud deletion rule of the shield no longer slows down on a long repeated command (`aws s3 rm` × 999: 24 ms).
|
|
13
|
+
|
|
6
14
|
## [3.49.12] - 2026-10-30
|
|
7
15
|
|
|
8
16
|
### Security
|
package/kit/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.
|
|
1
|
+
3.50.0
|
package/kit/guide.html
CHANGED
|
@@ -361,7 +361,7 @@ footer .container { display: flex; flex-wrap: wrap; gap: 16px; justify-content:
|
|
|
361
361
|
<section class="hero">
|
|
362
362
|
<div class="container">
|
|
363
363
|
<div>
|
|
364
|
-
<span class="pill"><b>v3.
|
|
364
|
+
<span class="pill"><b>v3.50.0</b> Starter kit for Claude Code · MIT</span>
|
|
365
365
|
<h1>The AI builds.<br><em>You steer.</em></h1>
|
|
366
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
367
|
<div class="setup">
|
|
@@ -1137,7 +1137,7 @@ Next: G-013 password reset · pending decision: email service</pre>
|
|
|
1137
1137
|
<section id="tools">
|
|
1138
1138
|
<p class="path">With another tool</p>
|
|
1139
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
|
|
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 and the status line are not available in these tools. The commit gate works there too.</p>
|
|
1141
1141
|
<pre class="term">npx tillerhand init --tool codex <span class="c"># or antigravity, or claude,codex</span>
|
|
1142
1142
|
<span class="c"># add a tool to an existing project</span>
|
|
1143
1143
|
/kit-update --tool claude,codex</pre>
|
|
@@ -1151,7 +1151,8 @@ Next: G-013 password reset · pending decision: email service</pre>
|
|
|
1151
1151
|
<tr><td>Questions with options</td><td>AskUserQuestion</td><td>Numbered plain text</td><td>ask_question</td></tr>
|
|
1152
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
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
|
|
1154
|
+
<tr><td>Status line, limit, dashboard refresh</td><td>Yes</td><td>No</td><td>No</td></tr>
|
|
1155
|
+
<tr><td>Commit gate</td><td>Yes</td><td>Yes; a stop is a block, the AI reviews as the board itself</td><td>Yes; the AI reviews as the board itself</td></tr>
|
|
1155
1156
|
</tbody>
|
|
1156
1157
|
</table></div>
|
|
1157
1158
|
<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>
|
|
@@ -1241,7 +1242,7 @@ Next: G-013 password reset · pending decision: email service</pre>
|
|
|
1241
1242
|
<footer>
|
|
1242
1243
|
<div class="container">
|
|
1243
1244
|
<a class="brand" href="#top" style="font-size:16px"><svg class="mark" style="width:22px;height:22px"><use href="#mark"/></svg>TillerHand</a>
|
|
1244
|
-
<span>Version 3.
|
|
1245
|
+
<span>Version 3.50.0 · <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>
|
|
1245
1246
|
</div>
|
|
1246
1247
|
</footer>
|
|
1247
1248
|
|
package/kit/guide.tr.html
CHANGED
|
@@ -361,7 +361,7 @@ footer .container { display: flex; flex-wrap: wrap; gap: 16px; justify-content:
|
|
|
361
361
|
<section class="hero">
|
|
362
362
|
<div class="container">
|
|
363
363
|
<div>
|
|
364
|
-
<span class="pill"><b>v3.
|
|
364
|
+
<span class="pill"><b>v3.50.0</b> Claude Code için başlangıç kiti · MIT</span>
|
|
365
365
|
<h1>Kodu AI yazar.<br><em>Dümen sende.</em></h1>
|
|
366
366
|
<p class="sub">TillerHand, Claude Code ile bir ürünü fikirden canlıya ve bakıma kadar götürür. Her önemli kararda AI sana seçenekleri, önerisini ve her seçeneğin bedelini sunar. Bir uzman kurulu işi denetler, korumalar hatayı daha olmadan durdurur.</p>
|
|
367
367
|
<div class="setup">
|
|
@@ -1141,7 +1141,7 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
|
|
|
1141
1141
|
<section id="araclar">
|
|
1142
1142
|
<p class="path">Başka araçla</p>
|
|
1143
1143
|
<h2>Codex ve Antigravity</h2>
|
|
1144
|
-
<p class="lead">TillerHand Claude Code için yazıldı. Kurallar, komutlar ve korumalar OpenAI Codex ve Google Antigravity'de de çalışır. Kurul tek modelle yürür; soru
|
|
1144
|
+
<p class="lead">TillerHand Claude Code için yazıldı. Kurallar, komutlar ve korumalar OpenAI Codex ve Google Antigravity'de de çalışır. Kurul tek modelle yürür; soru arayüzü ve durum çubuğu bu araçlarda yok. Commit kapısı orada da çalışır.</p>
|
|
1145
1145
|
<pre class="term">npx tillerhand init --tool codex <span class="c"># ya da antigravity, ya da claude,codex</span>
|
|
1146
1146
|
<span class="c"># var olan projeye araç eklemek</span>
|
|
1147
1147
|
/kit-update --tool claude,codex</pre>
|
|
@@ -1155,7 +1155,8 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
|
|
|
1155
1155
|
<tr><td>Seçenekli sorular</td><td>AskUserQuestion</td><td>Numaralı düz metin</td><td>ask_question</td></tr>
|
|
1156
1156
|
<tr><td>Kurul ve konsey</td><td>Ayrı ajanlar ve modeller</td><td>Tek model rolleri sırayla üstlenir</td><td>Tek model</td></tr>
|
|
1157
1157
|
<tr><td>Test ayrımı</td><td>Hook zorlar: test dosyasına yalnız test-writer yazar</td><td>Kural metinde (ajan kimliği yok)</td><td>Kural metinde (ajan kimliği yok)</td></tr>
|
|
1158
|
-
<tr><td>Durum çubuğu, limit, pano yenileme
|
|
1158
|
+
<tr><td>Durum çubuğu, limit, pano yenileme</td><td>Var</td><td>Yok</td><td>Yok</td></tr>
|
|
1159
|
+
<tr><td>Commit kapısı</td><td>Var</td><td>Var; durdurma engel olarak gelir, AI kurul rollerini kendisi üstlenir</td><td>Var; AI kurul rollerini kendisi üstlenir</td></tr>
|
|
1159
1160
|
</tbody>
|
|
1160
1161
|
</table></div>
|
|
1161
1162
|
<div class="note">Komutların kaynağı tektir (<code>.claude/commands/</code>); <code>.agents/skills/</code> altındaki kopyaları <code>init</code>, <code>install</code> ve <code>update</code> üretir. Codex proje hook'larını sadece klasöre güvendiğinde ve <code>/hooks</code> ile onayladığında çalıştırır; bunu ilk oturumda yap. İlk kullanımda bir sır yazma denemesiyle korumaların çalıştığını gör.</div>
|
|
@@ -1245,7 +1246,7 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
|
|
|
1245
1246
|
<footer>
|
|
1246
1247
|
<div class="container">
|
|
1247
1248
|
<a class="brand" href="#top" style="font-size:16px"><svg class="mark" style="width:22px;height:22px"><use href="#mark"/></svg>TillerHand</a>
|
|
1248
|
-
<span>Sürüm 3.
|
|
1249
|
+
<span>Sürüm 3.50.0 · <a href="https://github.com/burakdogrul/TillerHand">GitHub</a> · <a href="https://github.com/burakdogrul/TillerHand/blob/main/LICENSE">MIT lisansı</a> · KVKK bölümü kontrol listesidir, hukuki görüş değildir.</span>
|
|
1249
1250
|
</div>
|
|
1250
1251
|
</footer>
|
|
1251
1252
|
|
|
@@ -48,7 +48,8 @@
|
|
|
48
48
|
"hooks": [
|
|
49
49
|
{ "type": "command", "command": "node .claude/hooks/guard-secrets.mjs" },
|
|
50
50
|
{ "type": "command", "command": "node .claude/hooks/destructive-guard.mjs" },
|
|
51
|
-
{ "type": "command", "command": "node .claude/hooks/package-gate.mjs", "timeout": 30 }
|
|
51
|
+
{ "type": "command", "command": "node .claude/hooks/package-gate.mjs", "timeout": 30 },
|
|
52
|
+
{ "type": "command", "command": "node .claude/hooks/commit-gate.mjs" }
|
|
52
53
|
]
|
|
53
54
|
}
|
|
54
55
|
]
|
|
@@ -24,7 +24,8 @@
|
|
|
24
24
|
"hooks": [
|
|
25
25
|
{ "type": "command", "command": "node \"$(git rev-parse --show-toplevel)/.claude/hooks/guard-secrets.mjs\"", "commandWindows": "node .claude/hooks/guard-secrets.mjs" },
|
|
26
26
|
{ "type": "command", "command": "node \"$(git rev-parse --show-toplevel)/.claude/hooks/destructive-guard.mjs\"", "commandWindows": "node .claude/hooks/destructive-guard.mjs" },
|
|
27
|
-
{ "type": "command", "command": "node \"$(git rev-parse --show-toplevel)/.claude/hooks/package-gate.mjs\"", "commandWindows": "node .claude/hooks/package-gate.mjs", "timeout": 30 }
|
|
27
|
+
{ "type": "command", "command": "node \"$(git rev-parse --show-toplevel)/.claude/hooks/package-gate.mjs\"", "commandWindows": "node .claude/hooks/package-gate.mjs", "timeout": 30 },
|
|
28
|
+
{ "type": "command", "command": "node \"$(git rev-parse --show-toplevel)/.claude/hooks/commit-gate.mjs\"", "commandWindows": "node .claude/hooks/commit-gate.mjs" }
|
|
28
29
|
]
|
|
29
30
|
}
|
|
30
31
|
],
|