@asterxsk/kiln 0.1.0 → 0.2.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/LICENSE +21 -21
- package/README.md +170 -170
- package/agent/AGENTS.md +67 -67
- package/agent/README.md +5 -5
- package/agent/extensions/AGENTS.md +68 -68
- package/agent/extensions/ask-user/index.ts +418 -418
- package/agent/extensions/ask-user/package-lock.json +769 -769
- package/agent/extensions/ask-user/package.json +19 -19
- package/agent/extensions/ask-user/prompt.ts +45 -45
- package/agent/extensions/ask-user/tsconfig.json +7 -7
- package/agent/extensions/background-terminals/docs/implementation-guide.md +942 -942
- package/agent/extensions/background-terminals/index.ts +627 -627
- package/agent/extensions/background-terminals/manager.test.ts +735 -735
- package/agent/extensions/background-terminals/output.test.ts +109 -109
- package/agent/extensions/background-terminals/package-lock.json +769 -769
- package/agent/extensions/background-terminals/package.json +17 -17
- package/agent/extensions/background-terminals/prompt.test.ts +125 -125
- package/agent/extensions/background-terminals/ps.test.ts +82 -82
- package/agent/extensions/background-terminals/result-delivery.test.ts +44 -44
- package/agent/extensions/background-terminals/src/domain.ts +87 -87
- package/agent/extensions/background-terminals/src/manager.ts +907 -907
- package/agent/extensions/background-terminals/src/output.ts +84 -84
- package/agent/extensions/background-terminals/src/prompt.ts +142 -142
- package/agent/extensions/background-terminals/src/result-delivery.ts +27 -27
- package/agent/extensions/background-terminals/src/runtime.ts +36 -36
- package/agent/extensions/background-terminals/src/ui/output-view.ts +79 -79
- package/agent/extensions/background-terminals/src/ui/ps.ts +621 -621
- package/agent/extensions/background-terminals/tsconfig.json +7 -7
- package/agent/extensions/file-search/index.spec.ts +443 -443
- package/agent/extensions/file-search/index.ts +459 -459
- package/agent/extensions/file-search/package-lock.json +2253 -2253
- package/agent/extensions/file-search/package.json +23 -23
- package/agent/extensions/file-search/src/args.ts +122 -122
- package/agent/extensions/file-search/src/binaries.ts +422 -422
- package/agent/extensions/file-search/src/output.ts +126 -126
- package/agent/extensions/file-search/src/process.ts +146 -146
- package/agent/extensions/file-search/src/prompt.ts +52 -52
- package/agent/extensions/file-search/tsconfig.json +7 -7
- package/agent/extensions/modelconf/PLAN.md +915 -915
- package/agent/extensions/modelconf/index.ts +296 -296
- package/agent/extensions/modelconf/src/ui/ModelConfView.ts +1101 -1101
- package/agent/extensions/pi-web-access/CHANGELOG.md +690 -690
- package/agent/extensions/pi-web-access/LICENSE +21 -21
- package/agent/extensions/pi-web-access/README.md +470 -470
- package/agent/extensions/pi-web-access/SECURITY.md +5 -5
- package/agent/extensions/pi-web-access/activity.ts +101 -101
- package/agent/extensions/pi-web-access/auth-fetch.ts +148 -148
- package/agent/extensions/pi-web-access/brightdata-unlocker.ts +272 -272
- package/agent/extensions/pi-web-access/chrome-cookies.ts +669 -669
- package/agent/extensions/pi-web-access/content-find.ts +139 -139
- package/agent/extensions/pi-web-access/credential-source.ts +191 -191
- package/agent/extensions/pi-web-access/data-uri-sanitize.ts +406 -406
- package/agent/extensions/pi-web-access/datalab-pdf-extract.ts +568 -568
- package/agent/extensions/pi-web-access/declared-web-links.ts +173 -173
- package/agent/extensions/pi-web-access/evidence/CONTRACT-EVIDENCE.md +496 -496
- package/agent/extensions/pi-web-access/evidence/contract-probe.mjs +140 -140
- package/agent/extensions/pi-web-access/exa.ts +526 -526
- package/agent/extensions/pi-web-access/extract.ts +1196 -1196
- package/agent/extensions/pi-web-access/feature-config.ts +29 -29
- package/agent/extensions/pi-web-access/fetch-params.ts +111 -111
- package/agent/extensions/pi-web-access/gemini-adc.ts +298 -298
- package/agent/extensions/pi-web-access/gemini-api.ts +353 -353
- package/agent/extensions/pi-web-access/gemini-pdf-extract.ts +108 -108
- package/agent/extensions/pi-web-access/gemini-url-context.ts +128 -128
- package/agent/extensions/pi-web-access/gemini-web-config.ts +101 -101
- package/agent/extensions/pi-web-access/gemini-web.ts +487 -487
- package/agent/extensions/pi-web-access/github-api.ts +197 -197
- package/agent/extensions/pi-web-access/github-extract.ts +746 -746
- package/agent/extensions/pi-web-access/github-issue-pr.ts +700 -700
- package/agent/extensions/pi-web-access/index.ts +1737 -1737
- package/agent/extensions/pi-web-access/package-lock.json +5808 -5808
- package/agent/extensions/pi-web-access/package.json +64 -64
- package/agent/extensions/pi-web-access/page-query.ts +96 -96
- package/agent/extensions/pi-web-access/pdf-extract.ts +409 -409
- package/agent/extensions/pi-web-access/promise-try.d.ts +7 -7
- package/agent/extensions/pi-web-access/query-rewrite.ts +51 -51
- package/agent/extensions/pi-web-access/render-search-error.ts +170 -170
- package/agent/extensions/pi-web-access/rsc-extract.ts +338 -338
- package/agent/extensions/pi-web-access/source-check.ts +282 -282
- package/agent/extensions/pi-web-access/ssrf-protection.ts +526 -526
- package/agent/extensions/pi-web-access/storage.ts +521 -521
- package/agent/extensions/pi-web-access/summary-model-scope.ts +125 -125
- package/agent/extensions/pi-web-access/test/auth-fetch.test.mjs +208 -208
- package/agent/extensions/pi-web-access/test/brightdata-unlocker.test.mjs +840 -840
- package/agent/extensions/pi-web-access/test/chrome-cookie-extraction.test.mjs +441 -441
- package/agent/extensions/pi-web-access/test/config-path.test.mjs +283 -283
- package/agent/extensions/pi-web-access/test/content-find.test.mjs +25 -25
- package/agent/extensions/pi-web-access/test/credential-source.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/data-uri-sanitize.test.mjs +210 -210
- package/agent/extensions/pi-web-access/test/datalab-pdf-extract.test.mjs +552 -552
- package/agent/extensions/pi-web-access/test/declared-web-links.test.mjs +212 -212
- package/agent/extensions/pi-web-access/test/fetch-answer-storage.test.mjs +40 -40
- package/agent/extensions/pi-web-access/test/fetch-cache-storage.test.mjs +334 -334
- package/agent/extensions/pi-web-access/test/fetch-content-domain-policy.test.mjs +95 -95
- package/agent/extensions/pi-web-access/test/fetch-modes.test.mjs +53 -53
- package/agent/extensions/pi-web-access/test/fetch-not-found-guidance.test.mjs +92 -92
- package/agent/extensions/pi-web-access/test/fetch-params.test.mjs +86 -86
- package/agent/extensions/pi-web-access/test/fetch-render-call.test.mjs +34 -34
- package/agent/extensions/pi-web-access/test/fetch-routing.test.mjs +173 -173
- package/agent/extensions/pi-web-access/test/gemini-adc-auth.test.mjs +257 -257
- package/agent/extensions/pi-web-access/test/gemini-api-transport.test.mjs +170 -170
- package/agent/extensions/pi-web-access/test/gemini-pdf-extract.test.mjs +133 -133
- package/agent/extensions/pi-web-access/test/gemini-web-cookie-opt-in.test.mjs +178 -178
- package/agent/extensions/pi-web-access/test/gemini-web-header-overflow.test.mjs +148 -148
- package/agent/extensions/pi-web-access/test/get-search-content.test.mjs +223 -223
- package/agent/extensions/pi-web-access/test/github-extract.test.mjs +378 -378
- package/agent/extensions/pi-web-access/test/github-issue-pr.test.mjs +565 -565
- package/agent/extensions/pi-web-access/test/inline-content-config.test.mjs +99 -99
- package/agent/extensions/pi-web-access/test/lazy-extract-load.test.mjs +118 -118
- package/agent/extensions/pi-web-access/test/local-video-oversize.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/package-typebox-dependency.test.mjs +50 -50
- package/agent/extensions/pi-web-access/test/page-query.test.mjs +51 -51
- package/agent/extensions/pi-web-access/test/pdf-config.test.mjs +140 -140
- package/agent/extensions/pi-web-access/test/pdf-extract.test.mjs +500 -500
- package/agent/extensions/pi-web-access/test/proxy-transport.test.mjs +286 -286
- package/agent/extensions/pi-web-access/test/query-rewrite.test.mjs +52 -52
- package/agent/extensions/pi-web-access/test/rsc-fallback.test.mjs +102 -102
- package/agent/extensions/pi-web-access/test/search-error-render.test.mjs +152 -152
- package/agent/extensions/pi-web-access/test/search-providers.test.mjs +274 -274
- package/agent/extensions/pi-web-access/test/source-check.test.mjs +179 -179
- package/agent/extensions/pi-web-access/test/ssrf-allow-ranges-config.test.mjs +205 -205
- package/agent/extensions/pi-web-access/test/ssrf-protection.test.mjs +456 -456
- package/agent/extensions/pi-web-access/test/tool-registration-config.test.mjs +182 -182
- package/agent/extensions/pi-web-access/test/youtube-extract-errors.test.mjs +64 -64
- package/agent/extensions/pi-web-access/tsconfig.json +11 -11
- package/agent/extensions/pi-web-access/utils.ts +451 -451
- package/agent/extensions/pi-web-access/video-extract.ts +392 -392
- package/agent/extensions/pi-web-access/youtube-extract.ts +328 -328
- package/agent/extensions/shared/activity-status.ts +31 -31
- package/agent/extensions/shared/child-session.test.ts +270 -270
- package/agent/extensions/shared/child-session.ts +148 -148
- package/agent/extensions/shared/context-utilization.test.ts +48 -48
- package/agent/extensions/shared/context-utilization.ts +47 -47
- package/agent/extensions/shared/dashboard-state.ts +99 -99
- package/agent/extensions/shared/tool-call-timeout.test.ts +117 -117
- package/agent/extensions/shared/tool-call-timeout.ts +104 -104
- package/agent/extensions/subagents/by-the-way.test.ts +29 -29
- package/agent/extensions/subagents/claude.test.ts +119 -119
- package/agent/extensions/subagents/codex.test.ts +102 -102
- package/agent/extensions/subagents/context-usage.test.ts +107 -107
- package/agent/extensions/subagents/docs/design-plan.md +568 -568
- package/agent/extensions/subagents/docs/effect-v4-extension-guide.md +354 -354
- package/agent/extensions/subagents/docs/effect-v4-notes.md +571 -571
- package/agent/extensions/subagents/index.ts +779 -779
- package/agent/extensions/subagents/manager.test.ts +276 -276
- package/agent/extensions/subagents/package-lock.json +2244 -2244
- package/agent/extensions/subagents/package.json +19 -19
- package/agent/extensions/subagents/result-delivery.test.ts +27 -27
- package/agent/extensions/subagents/src/backend.ts +73 -73
- package/agent/extensions/subagents/src/backends/claude.ts +701 -701
- package/agent/extensions/subagents/src/backends/codex.ts +1060 -1060
- package/agent/extensions/subagents/src/backends/pi.ts +575 -575
- package/agent/extensions/subagents/src/backends/stub.ts +300 -300
- package/agent/extensions/subagents/src/by-the-way.ts +21 -21
- package/agent/extensions/subagents/src/domain.ts +253 -253
- package/agent/extensions/subagents/src/format.ts +74 -74
- package/agent/extensions/subagents/src/manager.ts +736 -736
- package/agent/extensions/subagents/src/prompt.ts +92 -92
- package/agent/extensions/subagents/src/result-delivery.ts +20 -20
- package/agent/extensions/subagents/src/runtime.ts +53 -53
- package/agent/extensions/subagents/src/ui/takeover.ts +583 -583
- package/agent/extensions/subagents/src/ui/transcript.ts +201 -201
- package/agent/extensions/subagents/takeover.test.ts +29 -29
- package/agent/extensions/subagents/tsconfig.json +7 -7
- package/agent/extensions/todo/AGENTS.md +38 -38
- package/agent/extensions/todo/LICENSE +21 -21
- package/agent/extensions/todo/config.ts +55 -55
- package/agent/extensions/todo/index.ts +151 -151
- package/agent/extensions/todo/locales/de.json +17 -17
- package/agent/extensions/todo/locales/en.json +15 -15
- package/agent/extensions/todo/locales/es.json +17 -17
- package/agent/extensions/todo/locales/fr.json +17 -17
- package/agent/extensions/todo/locales/pt-BR.json +17 -17
- package/agent/extensions/todo/locales/pt.json +17 -17
- package/agent/extensions/todo/locales/ru.json +17 -17
- package/agent/extensions/todo/locales/uk.json +17 -17
- package/agent/extensions/todo/locales/zh.json +17 -17
- package/agent/extensions/todo/package-lock.json +3358 -3358
- package/agent/extensions/todo/package.json +67 -67
- package/agent/extensions/todo/state/i18n-bridge.ts +64 -64
- package/agent/extensions/todo/state/invariants.ts +20 -20
- package/agent/extensions/todo/state/replay.ts +38 -38
- package/agent/extensions/todo/state/selectors.ts +107 -107
- package/agent/extensions/todo/state/state-reducer.ts +326 -326
- package/agent/extensions/todo/state/state.ts +18 -18
- package/agent/extensions/todo/state/store.ts +82 -82
- package/agent/extensions/todo/state/task-graph.ts +57 -57
- package/agent/extensions/todo/todo-overlay.ts +200 -200
- package/agent/extensions/todo/todo.ts +155 -155
- package/agent/extensions/todo/tool/response-envelope.ts +109 -109
- package/agent/extensions/todo/tool/types.ts +206 -206
- package/agent/extensions/todo/view/format.ts +177 -177
- package/agent/install.ps1 +637 -527
- package/agent/install.sh +620 -511
- package/agent/keybindings.json +7 -7
- package/bin/kiln.js +124 -11
- package/package.json +8 -2
- package/agent/extensions/taste/index.ts +0 -443
- package/agent/extensions/taste/install.ps1 +0 -23
- package/agent/extensions/taste/install.sh +0 -21
- /package/agent/extensions/{status line → statusline}/index.ts +0 -0
- /package/agent/extensions/{status line → statusline}/install.ps1 +0 -0
- /package/agent/extensions/{status line → statusline}/install.sh +0 -0
package/agent/keybindings.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
{
|
|
2
|
-
"tui.input.submit": "enter",
|
|
3
|
-
"tui.input.newLine": "shift+enter",
|
|
4
|
-
"app.message.followUp": "alt+f",
|
|
5
|
-
"app.session.toggleSort": [],
|
|
6
|
-
"app.models.save": "alt+s"
|
|
7
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"tui.input.submit": "enter",
|
|
3
|
+
"tui.input.newLine": "shift+enter",
|
|
4
|
+
"app.message.followUp": "alt+f",
|
|
5
|
+
"app.session.toggleSort": [],
|
|
6
|
+
"app.models.save": "alt+s"
|
|
7
|
+
}
|
package/bin/kiln.js
CHANGED
|
@@ -10,6 +10,11 @@
|
|
|
10
10
|
// npm i -g @asterxsk/kiln && kiln --yes
|
|
11
11
|
// bunx @asterxsk/kiln --yes
|
|
12
12
|
// node bin/kiln.js --target /tmp/pi-test --skip-pi --skip-packages --yes
|
|
13
|
+
// node bin/kiln.js --overwrite-settings # replace settings.json (asks by default)
|
|
14
|
+
//
|
|
15
|
+
// Already-installed items are skipped; outdated global packages are updated.
|
|
16
|
+
// Only one timestamped backup (<target>.bak.*) is kept; the clone temp dir
|
|
17
|
+
// under ~/.pi/tmp/kiln-* is always removed.
|
|
13
18
|
//
|
|
14
19
|
// Safe to re-run. Managed files are force-overwritten; per-user files
|
|
15
20
|
// (settings.json, taste.md, auth.json, sessions, etc.) are preserved.
|
|
@@ -40,6 +45,7 @@ function parseArgs(argv) {
|
|
|
40
45
|
branch: process.env.PI_CONFIG_BRANCH || DEFAULT_BRANCH,
|
|
41
46
|
target: process.env.PI_AGENT_DIR || "",
|
|
42
47
|
skipPi: false, skipPackages: false, yes: false, local: false,
|
|
48
|
+
settingsMode: "ask", // ask | overwrite | keep
|
|
43
49
|
};
|
|
44
50
|
for (let i = 0; i < argv.length; i++) {
|
|
45
51
|
const a = argv[i];
|
|
@@ -49,9 +55,11 @@ function parseArgs(argv) {
|
|
|
49
55
|
else if (a === "--skip-pi") o.skipPi = true;
|
|
50
56
|
else if (a === "--skip-packages") o.skipPackages = true;
|
|
51
57
|
else if (a === "--local") o.local = true;
|
|
58
|
+
else if (a === "--overwrite-settings") o.settingsMode = "overwrite";
|
|
59
|
+
else if (a === "--keep-settings") o.settingsMode = "keep";
|
|
52
60
|
else if (a === "--yes" || a === "-y") o.yes = true;
|
|
53
61
|
else if (a === "--help" || a === "-h") {
|
|
54
|
-
console.log("Usage: kiln [--repo URL] [--branch BRANCH] [--target DIR] [--local] [--skip-pi] [--skip-packages] [--yes]");
|
|
62
|
+
console.log("Usage: kiln [--repo URL] [--branch BRANCH] [--target DIR] [--local] [--skip-pi] [--skip-packages] [--overwrite-settings|--keep-settings] [--yes]");
|
|
55
63
|
process.exit(0);
|
|
56
64
|
} else if (a === "--") break;
|
|
57
65
|
else if (a.startsWith("-")) { console.error(`unknown arg: ${a}`); process.exit(1); }
|
|
@@ -118,6 +126,57 @@ function npmStep(step, label, args) {
|
|
|
118
126
|
}
|
|
119
127
|
const npmVer = process.platform === "win32" ? cmdOutShell("npm.cmd --version") : cmdOut("npm", ["--version"]);
|
|
120
128
|
|
|
129
|
+
// Installed global version of a package ("" when not installed).
|
|
130
|
+
function globalPkgVersion(name) {
|
|
131
|
+
const out = process.platform === "win32"
|
|
132
|
+
? cmdOutShell(`npm.cmd ls -g "${name}" --depth=0`)
|
|
133
|
+
: cmdOut("npm", ["ls", "-g", name, "--depth=0"]);
|
|
134
|
+
const m = out.match(new RegExp(name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&") + "@(\\S+)"));
|
|
135
|
+
return m ? m[1].replace(/[^0-9A-Za-z.+-].*$/, "") : "";
|
|
136
|
+
}
|
|
137
|
+
// Latest registry version ("" when offline / unknown).
|
|
138
|
+
function latestPkgVersion(name) {
|
|
139
|
+
const out = process.platform === "win32"
|
|
140
|
+
? cmdOutShell(`npm.cmd view "${name}" version`)
|
|
141
|
+
: cmdOut("npm", ["view", name, "version"]);
|
|
142
|
+
const v = (out || "").split(/\s+/)[0].trim();
|
|
143
|
+
return /^[0-9][0-9A-Za-z.+-]*$/.test(v) ? v : "";
|
|
144
|
+
}
|
|
145
|
+
// Synchronous Y/N prompt (default N). False when non-interactive.
|
|
146
|
+
function askYN(question) {
|
|
147
|
+
try {
|
|
148
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY) return false;
|
|
149
|
+
process.stdout.write(question);
|
|
150
|
+
const buf = Buffer.alloc(16);
|
|
151
|
+
const n = fs.readSync(0, buf, 0, 16);
|
|
152
|
+
const ans = buf.slice(0, n).toString().trim().toLowerCase();
|
|
153
|
+
return ans === "y" || ans === "yes";
|
|
154
|
+
} catch { return false; }
|
|
155
|
+
}
|
|
156
|
+
// Keep only the newest sibling backup (<target>.bak.*); delete the rest.
|
|
157
|
+
function pruneBackups(targetDir, keep) {
|
|
158
|
+
try {
|
|
159
|
+
const parent = path.dirname(targetDir);
|
|
160
|
+
const base = path.basename(targetDir);
|
|
161
|
+
const keepBase = keep ? path.basename(keep) : "";
|
|
162
|
+
for (const b of fs.readdirSync(parent)) {
|
|
163
|
+
if (!b.startsWith(base + ".bak.")) continue;
|
|
164
|
+
if (b === keepBase) continue;
|
|
165
|
+
try { fs.rmSync(path.join(parent, b), { recursive: true, force: true }); } catch {}
|
|
166
|
+
}
|
|
167
|
+
} catch (e) { log(`prune backups failed: ${e.message}`); }
|
|
168
|
+
}
|
|
169
|
+
// Remove stale clone dirs (~/.pi/tmp/kiln-*) except the active one.
|
|
170
|
+
function sweepStaleCloneTmp(tmpBase, active) {
|
|
171
|
+
try {
|
|
172
|
+
for (const e of fs.readdirSync(tmpBase)) {
|
|
173
|
+
if (!e.startsWith("kiln-")) continue;
|
|
174
|
+
if (active && e === path.basename(active)) continue;
|
|
175
|
+
try { fs.rmSync(path.join(tmpBase, e), { recursive: true, force: true }); } catch {}
|
|
176
|
+
}
|
|
177
|
+
} catch {}
|
|
178
|
+
}
|
|
179
|
+
|
|
121
180
|
// Recursive copy, excluding names (node_modules, .git). Returns false on error.
|
|
122
181
|
function copyTree(src, dst, exclude = new Set(["node_modules", ".git"])) {
|
|
123
182
|
try {
|
|
@@ -195,6 +254,23 @@ async function main() {
|
|
|
195
254
|
// ── [1/4] pi ──
|
|
196
255
|
if (args.skipPi) {
|
|
197
256
|
line(` ${C.green}✔${C.reset} ${C.dim}[1/4]${C.reset} Install pi ${C.dim}— skipped${C.reset}`);
|
|
257
|
+
} else if (have("pi")) {
|
|
258
|
+
const installed = globalPkgVersion(PI_PACKAGE) || cmdOut("pi", ["--version"]).replace(/^[vV]/, "").trim();
|
|
259
|
+
const latest = latestPkgVersion(PI_PACKAGE);
|
|
260
|
+
if (installed && latest && installed === latest) {
|
|
261
|
+
line(` ${C.green}✔${C.reset} ${C.dim}[1/4]${C.reset} pi ${C.dim}— already installed (${installed}), skipping${C.reset}`);
|
|
262
|
+
} else if (installed && !latest) {
|
|
263
|
+
line(` ${C.green}✔${C.reset} ${C.dim}[1/4]${C.reset} pi ${C.dim}— already installed (${installed}), skipping version check (offline)${C.reset}`);
|
|
264
|
+
} else {
|
|
265
|
+
const label = installed ? `updating pi ${installed} → ${latest || "latest"} (${PI_PACKAGE})` : `installing pi (${PI_PACKAGE})`;
|
|
266
|
+
const code = await npmStep("1", label, ["install", "-g", `${PI_PACKAGE}@latest`, "--no-audit", "--no-fund", "--min-release-age=0"]);
|
|
267
|
+
if (code === 0) {
|
|
268
|
+
line(` ${C.green}✔${C.reset} ${C.dim}[1/4]${C.reset} ${label} ${C.dim}— ${cmdOut("pi", ["--version"]) || "?"}${C.reset}`);
|
|
269
|
+
} else {
|
|
270
|
+
line(` ${C.red}✖${C.reset} ${C.dim}[1/4]${C.reset} ${label} ${C.red}failed (exit ${code})${C.reset} ${C.dim}see ${tmpLog}${C.reset}`);
|
|
271
|
+
ok = false;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
198
274
|
} else {
|
|
199
275
|
const label = have("pi") ? `updating pi (${PI_PACKAGE})` : `installing pi (${PI_PACKAGE})`;
|
|
200
276
|
const code = await npmStep("1", label, ["install", "-g", `${PI_PACKAGE}@latest`, "--no-audit", "--no-fund", "--min-release-age=0"]);
|
|
@@ -209,23 +285,41 @@ async function main() {
|
|
|
209
285
|
if (args.skipPackages) {
|
|
210
286
|
line(` ${C.green}✔${C.reset} ${C.dim}[2/4]${C.reset} pi packages ${C.dim}— skipped${C.reset}`);
|
|
211
287
|
} else {
|
|
212
|
-
const
|
|
213
|
-
const
|
|
288
|
+
const bare = PACKAGES.map((p) => p.replace(/@latest$/, ""));
|
|
289
|
+
const need = [];
|
|
290
|
+
for (const name of bare) {
|
|
291
|
+
const inst = globalPkgVersion(name);
|
|
292
|
+
const latest = latestPkgVersion(name);
|
|
293
|
+
if (inst && latest && inst === latest) {
|
|
294
|
+
line(`${C.dim} · ${name}@${inst} already installed, skipping${C.reset}`);
|
|
295
|
+
} else if (inst && !latest) {
|
|
296
|
+
line(`${C.dim} · ${name}@${inst} already installed, skipping version check (offline)${C.reset}`);
|
|
297
|
+
} else {
|
|
298
|
+
if (inst) line(`${C.dim} · ${name} ${inst} → ${latest || "latest"} — will update${C.reset}`);
|
|
299
|
+
need.push(`${name}@latest`);
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (!need.length) {
|
|
303
|
+
line(` ${C.green}✔${C.reset} ${C.dim}[2/4]${C.reset} pi packages ${C.dim}— already installed, skipping${C.reset}`);
|
|
304
|
+
} else {
|
|
305
|
+
const label = `installing ${need.join(" ")}`;
|
|
306
|
+
const code = await npmStep("2", label, ["install", "-g", ...need, "--no-audit", "--no-fund"]);
|
|
214
307
|
if (code === 0) line(` ${C.green}✔${C.reset} ${C.dim}[2/4]${C.reset} pi packages ${C.dim}— done${C.reset}`);
|
|
215
308
|
else {
|
|
216
309
|
line(` ${C.yellow}⚠${C.reset} ${C.dim}[2/4]${C.reset} ${label} ${C.yellow}exit ${code} — continuing (pi will auto-install)${C.reset}`);
|
|
217
310
|
line(` ${C.dim}see ${tmpLog}${C.reset}`);
|
|
218
311
|
}
|
|
312
|
+
}
|
|
219
313
|
}
|
|
220
314
|
// ── [3/4] custom config ──
|
|
221
315
|
try {
|
|
222
316
|
const sourceRoot = resolveSourceRoot(args);
|
|
223
317
|
line(`${C.dim} source ${sourceRoot}${C.reset}`);
|
|
224
318
|
fs.mkdirSync(targetDir, { recursive: true });
|
|
225
|
-
|
|
319
|
+
let bak = "";
|
|
226
320
|
if (fs.existsSync(path.join(targetDir, "AGENTS.md")) || fs.existsSync(path.join(targetDir, "extensions"))) {
|
|
227
321
|
const d = new Date(), p2 = (n) => String(n).padStart(2, "0");
|
|
228
|
-
|
|
322
|
+
bak = `${targetDir}.bak.${d.getFullYear()}${p2(d.getMonth() + 1)}${p2(d.getDate())}-${p2(d.getHours())}${p2(d.getMinutes())}${p2(d.getSeconds())}`;
|
|
229
323
|
line(`${C.dim} backup ${targetDir}/extensions → ${bak}${C.reset}`);
|
|
230
324
|
fs.mkdirSync(bak, { recursive: true });
|
|
231
325
|
for (const f of ["AGENTS.md", "keybindings.json", "README.md"]) {
|
|
@@ -240,6 +334,7 @@ async function main() {
|
|
|
240
334
|
copyTree(path.join(extSrc, e.name), path.join(bak, "extensions", e.name));
|
|
241
335
|
}
|
|
242
336
|
}
|
|
337
|
+
pruneBackups(targetDir, bak); // only one backup at a time
|
|
243
338
|
}
|
|
244
339
|
|
|
245
340
|
let copied = 0;
|
|
@@ -251,12 +346,24 @@ async function main() {
|
|
|
251
346
|
copied++;
|
|
252
347
|
}
|
|
253
348
|
let freshSettings = false;
|
|
254
|
-
|
|
255
|
-
|
|
349
|
+
const settingsPath = path.join(targetDir, "settings.json");
|
|
350
|
+
const repoSettings = path.join(sourceRoot, "settings.json");
|
|
351
|
+
if (!fs.existsSync(settingsPath) && fs.existsSync(repoSettings)) {
|
|
352
|
+
fs.copyFileSync(repoSettings, settingsPath);
|
|
256
353
|
line(`${C.dim} created settings.json from repo defaults${C.reset}`);
|
|
257
354
|
freshSettings = true;
|
|
258
|
-
} else if (fs.existsSync(
|
|
259
|
-
|
|
355
|
+
} else if (fs.existsSync(settingsPath)) {
|
|
356
|
+
let mode = args.settingsMode;
|
|
357
|
+
if (mode === "ask" && (args.yes || !process.stdin.isTTY)) mode = "keep";
|
|
358
|
+
if (mode === "ask") mode = askYN(` settings.json exists. Overwrite with repo defaults? [y/N] (Recommended for first-time setup) `) ? "overwrite" : "keep";
|
|
359
|
+
if (mode === "overwrite" && fs.existsSync(repoSettings)) {
|
|
360
|
+
if (bak) { try { fs.copyFileSync(settingsPath, path.join(bak, "settings.json")); } catch {} }
|
|
361
|
+
fs.copyFileSync(repoSettings, settingsPath);
|
|
362
|
+
line(`${C.dim} overwrote settings.json from repo defaults${C.reset}`);
|
|
363
|
+
freshSettings = true;
|
|
364
|
+
} else {
|
|
365
|
+
line(`${C.dim} kept existing settings.json${C.reset}`);
|
|
366
|
+
}
|
|
260
367
|
}
|
|
261
368
|
if (freshSettings) {
|
|
262
369
|
try {
|
|
@@ -300,6 +407,7 @@ async function main() {
|
|
|
300
407
|
|
|
301
408
|
line(` ${C.green}✔${C.reset} ${C.dim}[3/4]${C.reset} custom config ${C.dim}— ${copied} items → ${targetDir}${C.reset}`);
|
|
302
409
|
if (clonedTmp) { fs.rmSync(clonedTmp, { recursive: true, force: true }); clonedTmp = ""; }
|
|
410
|
+
sweepStaleCloneTmp(tmpBase, ""); // delete any leftover kiln-* temp dirs
|
|
303
411
|
const repoReadme = path.resolve(sourceRoot, "..", "README.md");
|
|
304
412
|
const parentReadme = path.resolve(targetDir, "..", "README.md");
|
|
305
413
|
if (repoReadme !== parentReadme && fs.existsSync(repoReadme)) {
|
|
@@ -315,10 +423,15 @@ async function main() {
|
|
|
315
423
|
line(` ${C.yellow}⚠${C.reset} ${C.dim}[4/4]${C.reset} no extensions found at ${extRoot}`);
|
|
316
424
|
} else {
|
|
317
425
|
const failed = [];
|
|
318
|
-
let installed = 0;
|
|
426
|
+
let installed = 0, skipped = 0;
|
|
319
427
|
for (const e of fs.readdirSync(extRoot, { withFileTypes: true })) {
|
|
320
428
|
if (!e.isDirectory() || e.name.endsWith(".md")) continue;
|
|
321
429
|
const dir = path.join(extRoot, e.name), label = `extensions/${e.name}`;
|
|
430
|
+
if (fs.existsSync(path.join(dir, "node_modules"))) {
|
|
431
|
+
line(` ${C.dim} · ${label} — already installed, skipping${C.reset}`);
|
|
432
|
+
skipped++;
|
|
433
|
+
continue;
|
|
434
|
+
}
|
|
322
435
|
const hasPkg = fs.existsSync(path.join(dir, "package.json"));
|
|
323
436
|
const sh = path.join(dir, "install.sh"), ps1 = path.join(dir, "install.ps1");
|
|
324
437
|
let code;
|
|
@@ -337,7 +450,7 @@ async function main() {
|
|
|
337
450
|
if (code === 0) { line(` ${C.green}✔${C.reset} ${C.dim}[4/4]${C.reset} ${label}`); installed++; }
|
|
338
451
|
else { line(` ${C.red}✖${C.reset} ${C.dim}[4/4]${C.reset} ${label} ${C.red}failed (exit ${code})${C.reset}`); failed.push(e.name); }
|
|
339
452
|
}
|
|
340
|
-
if (!failed.length) line(` ${C.green}✔${C.reset} ${C.dim}[4/4]${C.reset} extension deps ${C.dim}— ${installed} installed${C.reset}`);
|
|
453
|
+
if (!failed.length) line(` ${C.green}✔${C.reset} ${C.dim}[4/4]${C.reset} extension deps ${C.dim}— ${installed} installed, ${skipped} skipped${C.reset}`);
|
|
341
454
|
else line(` ${C.yellow}⚠${C.reset} ${C.dim}[4/4]${C.reset} extension deps ${C.yellow}${failed.length} failed:${C.reset} ${failed.join(", ")} ${C.dim}see ${tmpLog}${C.reset}`);
|
|
342
455
|
}
|
|
343
456
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@asterxsk/kiln",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Kiln — versioned pi agent configuration (extensions, defaults, keybindings) with an idempotent cross-platform installer.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -8,7 +8,13 @@
|
|
|
8
8
|
"url": "https://github.com/asterxsk/kiln.git"
|
|
9
9
|
},
|
|
10
10
|
"homepage": "https://github.com/asterxsk/kiln#readme",
|
|
11
|
-
"keywords": [
|
|
11
|
+
"keywords": [
|
|
12
|
+
"pi",
|
|
13
|
+
"agent",
|
|
14
|
+
"coding-agent",
|
|
15
|
+
"installer",
|
|
16
|
+
"config"
|
|
17
|
+
],
|
|
12
18
|
"engines": {
|
|
13
19
|
"node": ">=22.19.0"
|
|
14
20
|
},
|