tillerhand 3.49.4 → 3.49.6
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/destructive-guard.mjs +8 -6
- package/.claude/hooks/preview.mjs +2 -2
- package/README.md +1 -1
- package/README.tr.md +1 -1
- package/kit/CHANGELOG.md +10 -0
- package/kit/VERSION +1 -1
- package/kit/guide.html +2 -2
- package/kit/guide.tr.html +2 -2
- package/package.json +1 -1
|
@@ -265,18 +265,20 @@ const ENV_NAMES = ['.env', '.env.local', '.env.production', '.env.development',
|
|
|
265
265
|
// Glob match (* ? [..] [!..]) by dynamic programming, not a regex: no throw on an unclosed [ (bash reads it as a
|
|
266
266
|
// plain [) and no backtracking blow-up on ********. Case-insensitive, like the Windows file system.
|
|
267
267
|
export function globMatch(glob, name) {
|
|
268
|
+
// Only plain bracket sets ([nm], [!x]) are parsed. A range, class, equivalence class, collating symbol, escape,
|
|
269
|
+
// nested or empty set ([a-z], [[:alpha:]], [[=n=]], [[.n.]], []n]) counts as a match: asked, never guessed
|
|
270
|
+
for (let i = glob.indexOf('['); i > -1; i = glob.indexOf('[', i + 1)) {
|
|
271
|
+
const end = glob.indexOf(']', i + 1);
|
|
272
|
+
if (end > -1 && !/^[!^]?[\w.]+$/.test(glob.slice(i + 1, end))) return true;
|
|
273
|
+
}
|
|
268
274
|
const tokens = [];
|
|
269
275
|
for (let i = 0; i < glob.length; i++) {
|
|
270
|
-
const c = glob[i];
|
|
271
|
-
let end = c === '[' ? glob.indexOf(']', i + 2) : -1;
|
|
272
|
-
// [[:alpha:]]: the class's own ] does not close the set
|
|
273
|
-
if (end > -1 && glob.slice(i + 1, end).includes('[:')) end = glob.indexOf(']', end + 1);
|
|
276
|
+
const c = glob[i], end = c === '[' ? glob.indexOf(']', i + 1) : -1;
|
|
274
277
|
if (c === '*') { if (tokens.at(-1) !== '*') tokens.push('*'); }
|
|
275
278
|
else if (c === '?') tokens.push((x) => true);
|
|
276
279
|
else if (end > -1) {
|
|
277
280
|
const body = glob.slice(i + 1, end).toLowerCase(), neg = /^[!^]/.test(body), set = neg ? body.slice(1) : body;
|
|
278
|
-
|
|
279
|
-
tokens.push(/[-\\]|\[:/.test(set) ? () => true : (x) => set.includes(x) !== neg);
|
|
281
|
+
tokens.push((x) => set.includes(x) !== neg);
|
|
280
282
|
i = end;
|
|
281
283
|
} else tokens.push((x) => x === c.toLowerCase());
|
|
282
284
|
}
|
|
@@ -9,7 +9,7 @@ import fs from 'node:fs';
|
|
|
9
9
|
import os from 'node:os';
|
|
10
10
|
import path from 'node:path';
|
|
11
11
|
import { spawn, spawnSync } from 'node:child_process';
|
|
12
|
-
import { approvedCommands, approvalNeeded, isApproved } from './gate.mjs';
|
|
12
|
+
import { approvedCommands, approvalNeeded, isApproved, unknownCommandKeys, readAgents } from './gate.mjs';
|
|
13
13
|
import { findRoot, isMain } from './shared.mjs';
|
|
14
14
|
|
|
15
15
|
const CLI = 'npx -y @playwright/cli@0.1.22';
|
|
@@ -56,7 +56,7 @@ export async function preview(root, task) {
|
|
|
56
56
|
const url = command('preview'), dev = command('dev');
|
|
57
57
|
if (!url) return fail('AGENTS.md → Commands has no `preview:` line, or it is empty. Add it (example: `preview: http://localhost:3000`) or produce the evidence by hand in this task.');
|
|
58
58
|
if (!LOCAL.test(url)) return fail(`the preview address must be local (http://localhost:<port>, 127.0.0.1 or [::1]). Now: ${url}`);
|
|
59
|
-
if (!isApproved(root, list)) return { code: 1, text: `Preview · ${approvalNeeded(list)}` };
|
|
59
|
+
if (!isApproved(root, list)) return { code: 1, text: `Preview · ${approvalNeeded(list, unknownCommandKeys(readAgents(root)))}` };
|
|
60
60
|
const dir = `.previews/${String(task || 'latest').replace(/[^\w-]/g, '-')}`;
|
|
61
61
|
// A linked folder from the repo would send the files elsewhere
|
|
62
62
|
for (const d of ['.previews', dir]) {
|
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.6-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.6-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,16 @@
|
|
|
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.6] - 2026-10-30
|
|
7
|
+
|
|
8
|
+
### Fixed
|
|
9
|
+
- `/preview` before the command approval names the `## Commands` keys the gate does not read (`deploy:`…), like the gate run and the approval prompt already do.
|
|
10
|
+
|
|
11
|
+
## [3.49.5] - 2026-10-30
|
|
12
|
+
|
|
13
|
+
### Security
|
|
14
|
+
- A `.env` glob with an equivalence class or collating symbol (`cat .e[[=n=]]v`, `.e[[.n.]]v`) is asked. The glob check now parses only plain bracket sets (`[nm]`, `[!x]`); any other bracket form counts as a match and asks, instead of being guessed.
|
|
15
|
+
|
|
6
16
|
## [3.49.4] - 2026-10-30
|
|
7
17
|
|
|
8
18
|
### Security
|
package/kit/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.49.
|
|
1
|
+
3.49.6
|
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.6</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.6 · <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.6</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.6 · <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
|
|