tillerhand 3.49.0 → 3.49.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/hooks/commit-gate.mjs +4 -2
- package/.claude/hooks/dashboard.mjs +1 -1
- package/.claude/hooks/gate.mjs +3 -2
- package/.claude/hooks/messages.mjs +1 -0
- package/.claude/i18n/tr.json +1 -0
- package/README.md +1 -1
- package/README.tr.md +1 -1
- package/kit/CHANGELOG.md +6 -0
- package/kit/VERSION +1 -1
- package/kit/guide.html +2 -2
- package/kit/guide.tr.html +2 -2
- package/package.json +1 -1
|
@@ -205,10 +205,12 @@ async function hook() {
|
|
|
205
205
|
process.exit(0);
|
|
206
206
|
}
|
|
207
207
|
// Loaded only here: every Bash call runs this hook, and gate.mjs pulls in the dashboard and edit-round modules
|
|
208
|
-
const { approvedCommands, commandList } = await import('./gate.mjs');
|
|
208
|
+
const { approvedCommands, commandList, readAgents, unknownCommandKeys } = await import('./gate.mjs');
|
|
209
209
|
const list = commandList(approvedCommands(root)) || t(root, 'guard.commit.noCommands');
|
|
210
|
+
const unknown = unknownCommandKeys(readAgents(root));
|
|
211
|
+
const note = unknown.length ? `\n${t(root, 'guard.commit.gateUnknownKeys', { keys: unknown.join(', ') })}` : '';
|
|
210
212
|
console.log(JSON.stringify({ hookSpecificOutput: { hookEventName: 'PreToolUse', permissionDecision: 'ask',
|
|
211
|
-
permissionDecisionReason: t(root, 'guard.commit.gateApprovalAsk', { list }) } }));
|
|
213
|
+
permissionDecisionReason: t(root, 'guard.commit.gateApprovalAsk', { list }) + note } }));
|
|
212
214
|
process.exit(0);
|
|
213
215
|
}
|
|
214
216
|
if (!commit.test(command) && !commit.test(open)) process.exit(0);
|
|
@@ -212,7 +212,7 @@ const TOPICS = ['product', 'tech', 'design', 'content', 'data', 'security', 'cos
|
|
|
212
212
|
const topicKey = (topic = '') => topic.trim().toLowerCase();
|
|
213
213
|
|
|
214
214
|
// The command to paste into Claude: "`/build G-013` …" or "/wrap-up and /clear" → first command, without its <placeholder> or note
|
|
215
|
-
const cmdOf = (s = '') => { const m = String(s).match(/`(\/[^`\n]+)`/) ?? String(s).match(/^(\/.*)$/); return m ? m[1].split(/\s+\S+\s
|
|
215
|
+
const cmdOf = (s = '') => { const m = String(s).match(/`(\/[^`\n]+)`/) ?? String(s).match(/^(\/.*)$/); return m ? m[1].split(/\s+\S+\s+\/[\w:-]+(?![\w:/-]|\.\w)| and | to |\s*\(/)[0].replace(/\s*[[<].*$/, '').trim() : ''; };
|
|
216
216
|
const copyBtn = (s) => { const c = cmdOf(s); return c ? ` <button class="copy-cmd" type="button" data-cmd="${e(c)}" aria-label="${e(L('dashboard.copyAria', { command: c }))}">${e(L('dashboard.copy'))}</button>` : ''; };
|
|
217
217
|
const alertRow = (x) => `<li class="${x.sev}"><span class="ic" aria-hidden="true">${SEV[x.sev][0]}</span><span><span class="sr-only">${L(SEV[x.sev][1])}: </span>${md(x.text)}</span>${x.action ? `<span class="action">→ ${md(x.action)}${copyBtn(x.action)}</span>` : ''}</li>`;
|
|
218
218
|
const kpi = (label, value, sub = '', bar = '') => `<div class="kpi"><div class="kpi-l">${e(label)}</div><div class="kpi-v">${value}</div>${bar}<div class="kpi-s">${sub}</div></div>`;
|
package/.claude/hooks/gate.mjs
CHANGED
|
@@ -162,7 +162,8 @@ export function absPathCheck(root, files) {
|
|
|
162
162
|
return { name, status: 'passed', ...(notes.length && { note: `${notes.length} lines have a path that looks like a user folder; fix it if it is machine-specific (does not block)`, output: list(notes) }) };
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
-
export const approvalNeeded = (list) => `command approval needed\nAGENTS.md → Commands is new or changed; these commands do not run unapproved:\n${commandList(list)}\n` +
|
|
165
|
+
export const approvalNeeded = (list, unknown = []) => `command approval needed\nAGENTS.md → Commands is new or changed; these commands do not run unapproved:\n${commandList(list)}\n` +
|
|
166
|
+
(unknown.length ? `Keys the gate does not read (they never run; use dev, preview, test, lint, type check, build): ${unknown.join(', ')}\n` : '') +
|
|
166
167
|
'Show the commands to the user and ask. If they approve: node .claude/hooks/gate.mjs --approve, then run the command again.';
|
|
167
168
|
|
|
168
169
|
// Spec drift (F-23): a "must not change" behavior whose test is missing or red stops the gate; no result is only a note
|
|
@@ -190,7 +191,7 @@ export function runGate(root) {
|
|
|
190
191
|
let signature = null, files = [];
|
|
191
192
|
try { ({ signature, files } = changes()); } catch { /* not a git repo: the commands still run */ }
|
|
192
193
|
const list = approvedCommands(root);
|
|
193
|
-
if (!isApproved(root, list)) return { passed: false, text: `## Gate · ${approvalNeeded(list)}` };
|
|
194
|
+
if (!isApproved(root, list)) return { passed: false, text: `## Gate · ${approvalNeeded(list, unknownCommandKeys(readAgents(root)))}` };
|
|
194
195
|
const checks = [...list.filter((k) => CHECKS.includes(k.name)).map((k) => check(root, k)), semgrep(root, files)];
|
|
195
196
|
const empty = !checks.some((k) => CHECKS.includes(k.name) && k.status === 'passed'); // Semgrep alone does not fill a gate
|
|
196
197
|
const spec = specCheck(root, start); // after the test command, which may have refreshed the JUnit report; it does not fill an empty gate
|
|
@@ -381,6 +381,7 @@ export const MESSAGES = {
|
|
|
381
381
|
'guard.commit.skipAsk': { en: 'Commit gate: --skip bypasses the board review and the deterministic gate. Approve only if the user explicitly asks.' },
|
|
382
382
|
'guard.commit.noCommands': { en: '(no commands defined)' },
|
|
383
383
|
'guard.commit.gateApprovalAsk': { en: 'Gate command approval: from now on the gate runs these commands from AGENTS.md → Commands every time:\n{list}\nApprove only if you trust them.' },
|
|
384
|
+
'guard.commit.gateUnknownKeys': { en: 'These keys under AGENTS.md → Commands do not run (the gate reads dev, preview, test, lint, type check, build): {keys}' },
|
|
384
385
|
'guard.destructive.approvalSuffix': { en: '{reason}. User approval required.' },
|
|
385
386
|
'guard.destructive.prodDeploy': { en: 'Deploy to the prod environment' },
|
|
386
387
|
'guard.destructive.promoteRollback': { en: 'The prod environment is changing (promote/rollback)' },
|
package/.claude/i18n/tr.json
CHANGED
|
@@ -378,6 +378,7 @@
|
|
|
378
378
|
"guard.commit.skipAsk": "Commit kapısı: --skip kurul denetimini ve deterministik kapıyı aşar. Sadece kullanıcı açıkça isterse onayla.",
|
|
379
379
|
"guard.commit.noCommands": "(tanımlı komut yok)",
|
|
380
380
|
"guard.commit.gateApprovalAsk": "Kapı komut onayı: AGENTS.md → Commands bölümündeki şu komutlar bundan sonra her kapıda çalışır:\n{list}\nGüvendiğin komutlarsa onayla.",
|
|
381
|
+
"guard.commit.gateUnknownKeys": "AGENTS.md → Commands altındaki şu anahtarlar çalışmaz (kapı dev, preview, test, lint, type check, build okur): {keys}",
|
|
381
382
|
"guard.destructive.approvalSuffix": "{reason}. Kullanıcı onayı gerekli.",
|
|
382
383
|
"guard.destructive.prodDeploy": "Prod ortamına deploy",
|
|
383
384
|
"guard.destructive.promoteRollback": "Prod ortamı değişiyor (promote/rollback)",
|
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.49.
|
|
9
|
+
<a href="kit/CHANGELOG.md"><img alt="Version" src="https://img.shields.io/badge/version-3.49.1-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">
|
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.49.
|
|
9
|
+
<a href="kit/CHANGELOG.md"><img alt="Sürüm" src="https://img.shields.io/badge/s%C3%BCr%C3%BCm-3.49.1-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">
|
package/kit/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
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.49.1] - 2026-10-29
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
- **The gate command approval names keys that will not run.** A key under `## Commands` the gate does not read (for example `tip kontrol:` instead of `type check:`) is listed in the approval dialog and in the gate's "command approval needed" text, so a skipped check is visible before you approve.
|
|
10
|
+
- The dashboard's copy button keeps a path in the command (`/fix-bug login fails on /api/login`, `/fix-bug blank page in /index.html`); only a second slash command (`then /clear`) cuts it.
|
|
11
|
+
|
|
6
12
|
## [3.49.0] - 2026-10-29
|
|
7
13
|
|
|
8
14
|
### Changed
|
package/kit/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.49.
|
|
1
|
+
3.49.1
|
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.49.
|
|
364
|
+
<span class="pill"><b>v3.49.1</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">
|
|
@@ -1241,7 +1241,7 @@ Next: G-013 password reset · pending decision: email service</pre>
|
|
|
1241
1241
|
<footer>
|
|
1242
1242
|
<div class="container">
|
|
1243
1243
|
<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.49.
|
|
1244
|
+
<span>Version 3.49.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>
|
|
1245
1245
|
</div>
|
|
1246
1246
|
</footer>
|
|
1247
1247
|
|
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.49.
|
|
364
|
+
<span class="pill"><b>v3.49.1</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">
|
|
@@ -1245,7 +1245,7 @@ Sıradaki: G-013 şifre sıfırlama · bekleyen karar: e-posta servisi</pre>
|
|
|
1245
1245
|
<footer>
|
|
1246
1246
|
<div class="container">
|
|
1247
1247
|
<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.49.
|
|
1248
|
+
<span>Sürüm 3.49.1 · <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
1249
|
</div>
|
|
1250
1250
|
</footer>
|
|
1251
1251
|
|