runcastle 0.1.0 → 1.0.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/README.md +47 -0
- package/bin/runcastle.js +5580 -0
- package/drizzle/0000_amused_bruce_banner.sql +74 -0
- package/drizzle/0001_mapped_feature_flag.sql +1 -0
- package/drizzle/0002_waypoints.sql +14 -0
- package/drizzle/0003_project_closed_at.sql +1 -0
- package/drizzle/0004_events_project_id.sql +28 -0
- package/drizzle/0005_project_setting_overrides.sql +2 -0
- package/drizzle/meta/0000_snapshot.json +466 -0
- package/drizzle/meta/0001_snapshot.json +474 -0
- package/drizzle/meta/0002_snapshot.json +568 -0
- package/drizzle/meta/0003_snapshot.json +575 -0
- package/drizzle/meta/0004_snapshot.json +582 -0
- package/drizzle/meta/0005_snapshot.json +596 -0
- package/drizzle/meta/_journal.json +48 -0
- package/hook-client.ts +67 -0
- package/index.js +5424 -0
- package/package.json +24 -30
- package/pty-host.cjs +186 -0
- package/sandcastle-template/Containerfile +33 -0
- package/sandcastle-template/Dockerfile +33 -0
- package/skills/burner/implement-ticket.md +42 -0
- package/skills/burner/research-waypoint.md +45 -0
- package/skills/packs/README.md +50 -0
- package/skills/packs/runcastle/.claude-plugin/plugin.json +6 -0
- package/skills/packs/runcastle/skills/converge/SKILL.md +51 -0
- package/skills/packs/runcastle/skills/ideate/SKILL.md +81 -0
- package/skills/packs/runcastle/skills/qa/SKILL.md +30 -0
- package/skills/packs/runcastle/skills/spec/SKILL.md +43 -0
- package/skills/packs/runcastle/skills/tickets/SKILL.md +52 -0
- package/skills/packs/runcastle/skills/waypoint/SKILL.md +54 -0
- package/web/assets/index-CKZ5Z7vc.css +1 -0
- package/web/assets/index-YBuT7tTz.js +108 -0
- package/web/index.html +13 -0
- package/dist/add-PRGLHAVL.js +0 -298
- package/dist/add-PRGLHAVL.js.map +0 -1
- package/dist/chunk-44KDPUYJ.js +0 -49
- package/dist/chunk-44KDPUYJ.js.map +0 -1
- package/dist/chunk-5VPKMXSV.js +0 -190
- package/dist/chunk-5VPKMXSV.js.map +0 -1
- package/dist/chunk-6CWCR5SO.js +0 -24
- package/dist/chunk-6CWCR5SO.js.map +0 -1
- package/dist/chunk-AHRTPV2C.js +0 -1082
- package/dist/chunk-AHRTPV2C.js.map +0 -1
- package/dist/chunk-LP5MV76P.js +0 -33
- package/dist/chunk-LP5MV76P.js.map +0 -1
- package/dist/chunk-OJ356IMJ.js +0 -136
- package/dist/chunk-OJ356IMJ.js.map +0 -1
- package/dist/chunk-PRNBOQHW.js +0 -32
- package/dist/chunk-PRNBOQHW.js.map +0 -1
- package/dist/chunk-SNUH2UT6.js +0 -95
- package/dist/chunk-SNUH2UT6.js.map +0 -1
- package/dist/chunk-UCYVC3H6.js +0 -108
- package/dist/chunk-UCYVC3H6.js.map +0 -1
- package/dist/chunk-Y5P5BQWF.js +0 -136
- package/dist/chunk-Y5P5BQWF.js.map +0 -1
- package/dist/chunk-ZQ3BK4ZD.js +0 -134
- package/dist/chunk-ZQ3BK4ZD.js.map +0 -1
- package/dist/index.js +0 -94
- package/dist/index.js.map +0 -1
- package/dist/info-U6AZZ2TV.js +0 -78
- package/dist/info-U6AZZ2TV.js.map +0 -1
- package/dist/init-MOJNLWXK.js +0 -212
- package/dist/init-MOJNLWXK.js.map +0 -1
- package/dist/logout-YPGZ6BB6.js +0 -27
- package/dist/logout-YPGZ6BB6.js.map +0 -1
- package/dist/publish-W37Y6TO6.js +0 -211
- package/dist/publish-W37Y6TO6.js.map +0 -1
- package/dist/search-2KNAXPM5.js +0 -55
- package/dist/search-2KNAXPM5.js.map +0 -1
- package/dist/update-NIIUPL2E.js +0 -123
- package/dist/update-NIIUPL2E.js.map +0 -1
- package/dist/validate-GFDSEVPV.js +0 -12
- package/dist/validate-GFDSEVPV.js.map +0 -1
package/dist/update-NIIUPL2E.js
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
downloadFromRegistry,
|
|
3
|
-
readLockfile,
|
|
4
|
-
writeLockEntry
|
|
5
|
-
} from "./chunk-UCYVC3H6.js";
|
|
6
|
-
import {
|
|
7
|
-
mapTarget,
|
|
8
|
-
resolveInsideRoot,
|
|
9
|
-
sha256Hex
|
|
10
|
-
} from "./chunk-Y5P5BQWF.js";
|
|
11
|
-
import {
|
|
12
|
-
RealGitHubClient
|
|
13
|
-
} from "./chunk-OJ356IMJ.js";
|
|
14
|
-
import {
|
|
15
|
-
RegistryClient,
|
|
16
|
-
getFetch
|
|
17
|
-
} from "./chunk-5VPKMXSV.js";
|
|
18
|
-
import {
|
|
19
|
-
resolveRegistry
|
|
20
|
-
} from "./chunk-LP5MV76P.js";
|
|
21
|
-
import "./chunk-AHRTPV2C.js";
|
|
22
|
-
import "./chunk-6CWCR5SO.js";
|
|
23
|
-
import {
|
|
24
|
-
emitJson,
|
|
25
|
-
isJsonMode,
|
|
26
|
-
log,
|
|
27
|
-
pc
|
|
28
|
-
} from "./chunk-PRNBOQHW.js";
|
|
29
|
-
|
|
30
|
-
// src/commands/update.ts
|
|
31
|
-
import fs from "fs";
|
|
32
|
-
import path from "path";
|
|
33
|
-
function onDiskSha(projectRoot, target) {
|
|
34
|
-
const abs = path.join(projectRoot, ...target.split("/"));
|
|
35
|
-
if (!fs.existsSync(abs)) return null;
|
|
36
|
-
return sha256Hex(new Uint8Array(fs.readFileSync(abs)));
|
|
37
|
-
}
|
|
38
|
-
async function updateCommand(opts) {
|
|
39
|
-
const cwd = opts.cwd ?? process.cwd();
|
|
40
|
-
const fetchImpl = getFetch(opts.fetchImpl);
|
|
41
|
-
const github = new RealGitHubClient({ fetchImpl });
|
|
42
|
-
const lock = await readLockfile(cwd);
|
|
43
|
-
if (lock.installs.length === 0) {
|
|
44
|
-
if (isJsonMode()) emitJson({ ok: true, reports: [] });
|
|
45
|
-
else log(pc.dim("No installs recorded in .sandcastle/runcastle.lock.json \u2014 nothing to update."));
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
const reports = [];
|
|
49
|
-
for (const entry of lock.installs) {
|
|
50
|
-
if (entry.source.startsWith("github:") || !entry.author) {
|
|
51
|
-
reports.push({ slug: entry.slug, from: entry.version, to: entry.version, updated: [], skippedModified: [], status: "skipped-github" });
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
const registry = new RegistryClient({ baseUrl: resolveRegistry(opts.registry ?? entry.registry), fetchImpl });
|
|
55
|
-
const record = await registry.getWorkflow(entry.author, entry.slug);
|
|
56
|
-
if (record.version === entry.version) {
|
|
57
|
-
reports.push({ slug: entry.slug, from: entry.version, to: record.version, updated: [], skippedModified: [], status: "up-to-date" });
|
|
58
|
-
continue;
|
|
59
|
-
}
|
|
60
|
-
const downloaded = await downloadFromRegistry(record, registry, github, fetchImpl);
|
|
61
|
-
const updated = [];
|
|
62
|
-
const skippedModified = [];
|
|
63
|
-
const newFiles = { ...entry.files };
|
|
64
|
-
for (const d of downloaded) {
|
|
65
|
-
const target = mapTarget(d.path, entry.dir);
|
|
66
|
-
const recorded = entry.files[target];
|
|
67
|
-
const disk = onDiskSha(cwd, target);
|
|
68
|
-
if (disk !== null && recorded !== void 0 && disk !== recorded) {
|
|
69
|
-
skippedModified.push(target);
|
|
70
|
-
continue;
|
|
71
|
-
}
|
|
72
|
-
if (disk === d.sha256) {
|
|
73
|
-
newFiles[target] = d.sha256;
|
|
74
|
-
continue;
|
|
75
|
-
}
|
|
76
|
-
const abs = resolveInsideRoot(cwd, target);
|
|
77
|
-
fs.mkdirSync(path.dirname(abs), { recursive: true });
|
|
78
|
-
fs.writeFileSync(abs, d.bytes);
|
|
79
|
-
updated.push(target);
|
|
80
|
-
newFiles[target] = d.sha256;
|
|
81
|
-
}
|
|
82
|
-
const next = {
|
|
83
|
-
...entry,
|
|
84
|
-
version: record.version,
|
|
85
|
-
sha: record.commitSha,
|
|
86
|
-
files: newFiles,
|
|
87
|
-
installedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
88
|
-
};
|
|
89
|
-
await writeLockEntry(cwd, next);
|
|
90
|
-
reports.push({
|
|
91
|
-
slug: entry.slug,
|
|
92
|
-
from: entry.version,
|
|
93
|
-
to: record.version,
|
|
94
|
-
updated,
|
|
95
|
-
skippedModified,
|
|
96
|
-
status: "updated"
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
if (isJsonMode()) {
|
|
100
|
-
emitJson({ ok: true, reports });
|
|
101
|
-
return;
|
|
102
|
-
}
|
|
103
|
-
for (const r of reports) {
|
|
104
|
-
if (r.status === "up-to-date") {
|
|
105
|
-
log(`${pc.dim("\xB7")} ${r.slug} ${pc.dim(`is up to date (${r.from})`)}`);
|
|
106
|
-
} else if (r.status === "skipped-github") {
|
|
107
|
-
log(`${pc.dim("\xB7")} ${r.slug} ${pc.dim("installed from github: \u2014 re-run `runcastle add github:\u2026` to update")}`);
|
|
108
|
-
} else {
|
|
109
|
-
log(`${pc.green("\u2191")} ${r.slug} ${pc.dim(`${r.from} \u2192 ${r.to}`)}`);
|
|
110
|
-
for (const f of r.updated) log(` ${pc.green("updated")} ${f}`);
|
|
111
|
-
for (const f of r.skippedModified) log(` ${pc.yellow("skipped")} ${f} ${pc.dim("(locally modified \u2014 resolve manually)")}`);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
const anyModified = reports.some((r) => r.skippedModified.length > 0);
|
|
115
|
-
if (anyModified) {
|
|
116
|
-
log("");
|
|
117
|
-
log(pc.yellow("Some files were locally modified and left untouched. Diff them against the new version and merge by hand."));
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
export {
|
|
121
|
-
updateCommand
|
|
122
|
-
};
|
|
123
|
-
//# sourceMappingURL=update-NIIUPL2E.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/update.ts"],"sourcesContent":["// `runcastle update` (spec §5.6, minimal v1). Read the lockfile, check for newer\n// versions, auto-update files that are UNMODIFIED since install, and REFUSE to\n// touch locally-modified files (telling the user to resolve them manually).\n\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { emitJson, isJsonMode, log, pc } from \"../lib/output.js\";\nimport { resolveRegistry } from \"../lib/config.js\";\nimport { RegistryClient } from \"../lib/registry.js\";\nimport { RealGitHubClient } from \"../lib/github.js\";\nimport { downloadFromRegistry } from \"../lib/download.js\";\nimport { sha256Hex } from \"../lib/checksum.js\";\nimport { getFetch, type FetchLike } from \"../lib/http.js\";\nimport { readLockfile, writeLockEntry, type LockEntry } from \"../lib/lockfile.js\";\nimport { mapTarget, resolveInsideRoot } from \"../lib/installer.js\";\n\nexport interface UpdateOptions {\n registry?: string;\n json?: boolean;\n fetchImpl?: FetchLike;\n cwd?: string;\n}\n\ninterface UpdateReport {\n slug: string;\n from: string;\n to: string;\n updated: string[];\n skippedModified: string[];\n status: \"updated\" | \"up-to-date\" | \"skipped-github\" | \"no-op\";\n}\n\nfunction onDiskSha(projectRoot: string, target: string): string | null {\n const abs = path.join(projectRoot, ...target.split(\"/\"));\n if (!fs.existsSync(abs)) return null;\n return sha256Hex(new Uint8Array(fs.readFileSync(abs)));\n}\n\nexport async function updateCommand(opts: UpdateOptions): Promise<void> {\n const cwd = opts.cwd ?? process.cwd();\n const fetchImpl = getFetch(opts.fetchImpl);\n const github = new RealGitHubClient({ fetchImpl });\n const lock = await readLockfile(cwd);\n\n if (lock.installs.length === 0) {\n if (isJsonMode()) emitJson({ ok: true, reports: [] });\n else log(pc.dim(\"No installs recorded in .sandcastle/runcastle.lock.json — nothing to update.\"));\n return;\n }\n\n const reports: UpdateReport[] = [];\n\n for (const entry of lock.installs) {\n if (entry.source.startsWith(\"github:\") || !entry.author) {\n reports.push({ slug: entry.slug, from: entry.version, to: entry.version, updated: [], skippedModified: [], status: \"skipped-github\" });\n continue;\n }\n const registry = new RegistryClient({ baseUrl: resolveRegistry(opts.registry ?? entry.registry), fetchImpl });\n const record = await registry.getWorkflow(entry.author, entry.slug);\n if (record.version === entry.version) {\n reports.push({ slug: entry.slug, from: entry.version, to: record.version, updated: [], skippedModified: [], status: \"up-to-date\" });\n continue;\n }\n\n const downloaded = await downloadFromRegistry(record, registry, github, fetchImpl);\n const updated: string[] = [];\n const skippedModified: string[] = [];\n const newFiles: Record<string, string> = { ...entry.files };\n\n for (const d of downloaded) {\n const target = mapTarget(d.path, entry.dir);\n const recorded = entry.files[target];\n const disk = onDiskSha(cwd, target);\n // Locally modified: on-disk differs from what we installed last time.\n if (disk !== null && recorded !== undefined && disk !== recorded) {\n skippedModified.push(target);\n continue;\n }\n if (disk === d.sha256) {\n // already identical to the new bytes\n newFiles[target] = d.sha256;\n continue;\n }\n // Defense-in-depth: never write outside the project (§8 / C1).\n const abs = resolveInsideRoot(cwd, target);\n fs.mkdirSync(path.dirname(abs), { recursive: true });\n fs.writeFileSync(abs, d.bytes);\n updated.push(target);\n newFiles[target] = d.sha256;\n }\n\n // Persist the new version/sha; skipped files retain their recorded checksum.\n const next: LockEntry = {\n ...entry,\n version: record.version,\n sha: record.commitSha,\n files: newFiles,\n installedAt: new Date().toISOString(),\n };\n await writeLockEntry(cwd, next);\n\n reports.push({\n slug: entry.slug,\n from: entry.version,\n to: record.version,\n updated,\n skippedModified,\n status: \"updated\",\n });\n }\n\n if (isJsonMode()) {\n emitJson({ ok: true, reports });\n return;\n }\n\n for (const r of reports) {\n if (r.status === \"up-to-date\") {\n log(`${pc.dim(\"·\")} ${r.slug} ${pc.dim(`is up to date (${r.from})`)}`);\n } else if (r.status === \"skipped-github\") {\n log(`${pc.dim(\"·\")} ${r.slug} ${pc.dim(\"installed from github: — re-run `runcastle add github:…` to update\")}`);\n } else {\n log(`${pc.green(\"↑\")} ${r.slug} ${pc.dim(`${r.from} → ${r.to}`)}`);\n for (const f of r.updated) log(` ${pc.green(\"updated\")} ${f}`);\n for (const f of r.skippedModified) log(` ${pc.yellow(\"skipped\")} ${f} ${pc.dim(\"(locally modified — resolve manually)\")}`);\n }\n }\n const anyModified = reports.some((r) => r.skippedModified.length > 0);\n if (anyModified) {\n log(\"\");\n log(pc.yellow(\"Some files were locally modified and left untouched. Diff them against the new version and merge by hand.\"));\n }\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
runValidation,
|
|
3
|
-
validateCommand
|
|
4
|
-
} from "./chunk-SNUH2UT6.js";
|
|
5
|
-
import "./chunk-AHRTPV2C.js";
|
|
6
|
-
import "./chunk-6CWCR5SO.js";
|
|
7
|
-
import "./chunk-PRNBOQHW.js";
|
|
8
|
-
export {
|
|
9
|
-
runValidation,
|
|
10
|
-
validateCommand
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=validate-GFDSEVPV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|