tillerhand 3.49.9 → 3.49.10
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/package-gate.mjs +27 -3
- 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
|
@@ -26,9 +26,20 @@ const POPULAR = {
|
|
|
26
26
|
|
|
27
27
|
// Case-insensitive (the Windows shell is); npm's install aliases (in, ins, isntall, it…) count as install
|
|
28
28
|
const COMMANDS = [
|
|
29
|
-
[/^(npm|pnpm|bun)\s+(i|in|ins|inst|insta|instal|install|isnt|isnta|isntal|isntall|it|add)\b/i, 'npm'], [/^yarn\s+(global\s+)?add\b/i, 'npm'], [/^npx\s+expo\s+install\b/i, 'npm'],
|
|
30
|
-
|
|
29
|
+
[/^(npm|pnpm|bun)\s+(i|in|ins|inst|insta|instal|install|isnt|isnta|isntal|isntall|it|add)\b/i, 'npm'], [/^yarn\s+(global\s+)?add\b/i, 'npm'], [/^(npx\s+)?expo\s+install\b/i, 'npm'],
|
|
30
|
+
// create/init <name> downloads and runs create-<name>; deno takes npm:<name> specifiers
|
|
31
|
+
[/^(npm|pnpm|yarn|bun)\s+(create|init)\b/i, 'npm', 'create'], [/^deno\s+(add|install|run|x)\b/i, 'npm', 'deno'],
|
|
32
|
+
[/^uv\s+(add|pip\s+install|tool\s+install)\b/i, 'pypi'], [/^((python[\d.]*|py)(\s+-\d[\d.]*)?\s+-m\s+)?pip[\d.]*(\s+-\S+)*\s+install\b/i, 'pypi'],
|
|
33
|
+
[/^(poetry|pdm)\s+add\b|^(pipenv|pipx)\s+install\b/i, 'pypi'],
|
|
31
34
|
];
|
|
35
|
+
// create-vite for vite, @scope/create for @scope, @scope/create-x for @scope/x (npm's own mapping)
|
|
36
|
+
function createName(arg) {
|
|
37
|
+
const n = npmName(arg);
|
|
38
|
+
if (!n) return null;
|
|
39
|
+
if (!n.startsWith('@')) return `create-${n}`;
|
|
40
|
+
const [scope, rest] = n.split('/');
|
|
41
|
+
return rest ? `${scope}/create-${rest}` : `${scope}/create`;
|
|
42
|
+
}
|
|
32
43
|
|
|
33
44
|
// Download-and-run: the first positional is the package (the rest are its arguments), or the values of the package flags.
|
|
34
45
|
// local: the runner uses a bin the project already has before downloading (npx, npm exec, bunx); pnpm/yarn dlx always download.
|
|
@@ -72,6 +83,7 @@ function execArgs(args, eco, positional) {
|
|
|
72
83
|
// Also timeout/nice/stdbuf, shell keywords (then, do, else, !) and combined shell flags (bash -lc).
|
|
73
84
|
const WRAPPER = /^(?:\(|\{|!\s*|[A-Za-z_]\w*=\S*\s+|(?:sudo|env|time|nohup|exec|command|xargs|corepack|call|start|then|do|else|ionice|stdbuf)\s+|timeout\s+(?:-\S+\s+)*\S+\s+|nice\s+(?:-n\s*\S+\s+|-\d+\s+)?|(?:bash|sh|zsh|dash|cmd|pwsh|powershell)(?:\.exe)?\s+(?:-\w*c|\/c|\/k|-Command)\s+["']?)/i;
|
|
74
85
|
const SUBCOMMAND = /^(install|i|add|exec|x|dlx|tool|pip|run|global)$/;
|
|
86
|
+
const VALUE_FLAG = /^(--prefix|-C|--dir|--cwd|--workspace|--filter|--registry|--cache|--userconfig)$/i;
|
|
75
87
|
export function normalize(part) {
|
|
76
88
|
let s = part.trim(), prev;
|
|
77
89
|
do { prev = s; s = s.replace(WRAPPER, '').trim(); } while (s !== prev);
|
|
@@ -81,7 +93,10 @@ export function normalize(part) {
|
|
|
81
93
|
const t = s.split(/\s+/);
|
|
82
94
|
if (/^(npm|pnpm|yarn|bun|uv)$/i.test(t[0])) {
|
|
83
95
|
let i = 1;
|
|
84
|
-
|
|
96
|
+
// A flag known to take a value always skips it (npm --prefix x i: x is a folder, not the exec subcommand)
|
|
97
|
+
while (i < t.length && t[i].startsWith('-')) i += VALUE_FLAG.test(t[i]) || (!t[i].includes('=') && t[i + 1] && !t[i + 1].startsWith('-') && !SUBCOMMAND.test(t[i + 1])) ? 2 : 1;
|
|
98
|
+
// yarn workspace <name> add x: the workspace name is not the subcommand
|
|
99
|
+
if (/^yarn$/i.test(t[0]) && /^workspace$/i.test(t[i] ?? '')) i += 2;
|
|
85
100
|
s = [t[0], ...t.slice(i)].join(' ');
|
|
86
101
|
}
|
|
87
102
|
return s;
|
|
@@ -124,6 +139,15 @@ export function findPackages(command) {
|
|
|
124
139
|
}
|
|
125
140
|
continue;
|
|
126
141
|
}
|
|
142
|
+
if (match[2] === 'create') {
|
|
143
|
+
const name = createName(args.find((a) => !a.startsWith('-')) ?? '');
|
|
144
|
+
if (name) result.push({ eco, name });
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
if (match[2] === 'deno') {
|
|
148
|
+
for (const a of args) if (/^npm:/i.test(a)) { const name = npmName(a.slice(4)); if (name) result.push({ eco, name }); }
|
|
149
|
+
continue;
|
|
150
|
+
}
|
|
127
151
|
for (let i = 0; i < args.length; i++) {
|
|
128
152
|
const a = args[i];
|
|
129
153
|
if (a.startsWith('-')) {
|
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.10-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.10-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.10] - 2026-10-30
|
|
7
|
+
|
|
8
|
+
### Security
|
|
9
|
+
- **The package gate checks more install commands:** `npm create <x>` / `npm init <x>` (and the pnpm, yarn, bun versions) check the `create-<x>` package they download and run; `pipx install`, `uv tool install`, `pdm add`, `pipenv install`, a bare `expo install` and Deno `npm:` specifiers are checked too.
|
|
10
|
+
- Flags before the subcommand no longer hide the package: `npm --prefix x i`, `pnpm -C x add`, `yarn --cwd x add`, `yarn workspace web add`, `pip --quiet install`, `py -m pip install`, `python3.12 -m pip install`.
|
|
11
|
+
|
|
6
12
|
## [3.49.9] - 2026-10-30
|
|
7
13
|
|
|
8
14
|
### Security
|
package/kit/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
3.49.
|
|
1
|
+
3.49.10
|
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.10</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.10 · <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.10</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.10 · <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
|
|