@chiralkit/cli 0.1.0-alpha.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 -0
- package/README.md +97 -0
- package/dist/add.d.ts +4 -0
- package/dist/add.js +118 -0
- package/dist/add.js.map +1 -0
- package/dist/agents/subprocess.d.ts +10 -0
- package/dist/agents/subprocess.js +43 -0
- package/dist/agents/subprocess.js.map +1 -0
- package/dist/automation/index.d.ts +14 -0
- package/dist/automation/index.js +129 -0
- package/dist/automation/index.js.map +1 -0
- package/dist/automation/install.d.ts +19 -0
- package/dist/automation/install.js +116 -0
- package/dist/automation/install.js.map +1 -0
- package/dist/automation/parsers/audit-report.d.ts +2 -0
- package/dist/automation/parsers/audit-report.js +42 -0
- package/dist/automation/parsers/audit-report.js.map +1 -0
- package/dist/automation/parsers/exit-code.d.ts +2 -0
- package/dist/automation/parsers/exit-code.js +6 -0
- package/dist/automation/parsers/exit-code.js.map +1 -0
- package/dist/automation/parsers/index.d.ts +10 -0
- package/dist/automation/parsers/index.js +13 -0
- package/dist/automation/parsers/index.js.map +1 -0
- package/dist/automation/parsers/observer-snapshot.d.ts +2 -0
- package/dist/automation/parsers/observer-snapshot.js +30 -0
- package/dist/automation/parsers/observer-snapshot.js.map +1 -0
- package/dist/automation/parsers/plan-report.d.ts +2 -0
- package/dist/automation/parsers/plan-report.js +53 -0
- package/dist/automation/parsers/plan-report.js.map +1 -0
- package/dist/automation/parsers/refinement-report.d.ts +2 -0
- package/dist/automation/parsers/refinement-report.js +149 -0
- package/dist/automation/parsers/refinement-report.js.map +1 -0
- package/dist/automation/parsers/types.d.ts +7 -0
- package/dist/automation/parsers/types.js +2 -0
- package/dist/automation/parsers/types.js.map +1 -0
- package/dist/automation/run.d.ts +25 -0
- package/dist/automation/run.js +68 -0
- package/dist/automation/run.js.map +1 -0
- package/dist/automation/schema.d.ts +130 -0
- package/dist/automation/schema.js +46 -0
- package/dist/automation/schema.js.map +1 -0
- package/dist/automation/status.d.ts +16 -0
- package/dist/automation/status.js +56 -0
- package/dist/automation/status.js.map +1 -0
- package/dist/automation/verifiers/index.d.ts +7 -0
- package/dist/automation/verifiers/index.js +5 -0
- package/dist/automation/verifiers/index.js.map +1 -0
- package/dist/automation/verifiers/shell.d.ts +5 -0
- package/dist/automation/verifiers/shell.js +17 -0
- package/dist/automation/verifiers/shell.js.map +1 -0
- package/dist/automation/verifiers/types.d.ts +12 -0
- package/dist/automation/verifiers/types.js +2 -0
- package/dist/automation/verifiers/types.js.map +1 -0
- package/dist/backlog/add.d.ts +10 -0
- package/dist/backlog/add.js +30 -0
- package/dist/backlog/add.js.map +1 -0
- package/dist/backlog/index.d.ts +1 -0
- package/dist/backlog/index.js +53 -0
- package/dist/backlog/index.js.map +1 -0
- package/dist/config.d.ts +26 -0
- package/dist/config.js +110 -0
- package/dist/config.js.map +1 -0
- package/dist/detect.d.ts +2 -0
- package/dist/detect.js +26 -0
- package/dist/detect.js.map +1 -0
- package/dist/doctor-invariants.d.ts +6 -0
- package/dist/doctor-invariants.js +50 -0
- package/dist/doctor-invariants.js.map +1 -0
- package/dist/doctor.d.ts +13 -0
- package/dist/doctor.js +281 -0
- package/dist/doctor.js.map +1 -0
- package/dist/generate.d.ts +1 -0
- package/dist/generate.js +275 -0
- package/dist/generate.js.map +1 -0
- package/dist/generator/agent.d.ts +8 -0
- package/dist/generator/agent.js +66 -0
- package/dist/generator/agent.js.map +1 -0
- package/dist/generator/api.d.ts +7 -0
- package/dist/generator/api.js +42 -0
- package/dist/generator/api.js.map +1 -0
- package/dist/generator/config.d.ts +23 -0
- package/dist/generator/config.js +121 -0
- package/dist/generator/config.js.map +1 -0
- package/dist/generator/parse-response.d.ts +5 -0
- package/dist/generator/parse-response.js +58 -0
- package/dist/generator/parse-response.js.map +1 -0
- package/dist/generator/prompt.d.ts +9 -0
- package/dist/generator/prompt.js +166 -0
- package/dist/generator/prompt.js.map +1 -0
- package/dist/generator/request.d.ts +17 -0
- package/dist/generator/request.js +15 -0
- package/dist/generator/request.js.map +1 -0
- package/dist/generators/prompts/stencil.md +45 -0
- package/dist/generators/prompts/vue.md +54 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +102 -0
- package/dist/index.js.map +1 -0
- package/dist/init.d.ts +1 -0
- package/dist/init.js +89 -0
- package/dist/init.js.map +1 -0
- package/dist/installers/context.d.ts +4 -0
- package/dist/installers/context.js +120 -0
- package/dist/installers/context.js.map +1 -0
- package/dist/installers/index.d.ts +7 -0
- package/dist/installers/index.js +22 -0
- package/dist/installers/index.js.map +1 -0
- package/dist/installers/installer.d.ts +12 -0
- package/dist/installers/installer.js +30 -0
- package/dist/installers/installer.js.map +1 -0
- package/dist/installers/stencil/django-template/installer.d.ts +10 -0
- package/dist/installers/stencil/django-template/installer.js +77 -0
- package/dist/installers/stencil/django-template/installer.js.map +1 -0
- package/dist/installers/stencil/react/installer.d.ts +9 -0
- package/dist/installers/stencil/react/installer.js +22 -0
- package/dist/installers/stencil/react/installer.js.map +1 -0
- package/dist/installers/stencil/react/manifest.json +17 -0
- package/dist/installers/types.d.ts +24 -0
- package/dist/installers/types.js +2 -0
- package/dist/installers/types.js.map +1 -0
- package/dist/lock.d.ts +25 -0
- package/dist/lock.js +86 -0
- package/dist/lock.js.map +1 -0
- package/dist/manifest.d.ts +1 -0
- package/dist/manifest.js +93 -0
- package/dist/manifest.js.map +1 -0
- package/dist/pm/audit.d.ts +36 -0
- package/dist/pm/audit.js +147 -0
- package/dist/pm/audit.js.map +1 -0
- package/dist/pm/backlog.d.ts +3 -0
- package/dist/pm/backlog.js +123 -0
- package/dist/pm/backlog.js.map +1 -0
- package/dist/pm/brief.d.ts +4 -0
- package/dist/pm/brief.js +18 -0
- package/dist/pm/brief.js.map +1 -0
- package/dist/pm/git.d.ts +3 -0
- package/dist/pm/git.js +43 -0
- package/dist/pm/git.js.map +1 -0
- package/dist/pm/grid.d.ts +8 -0
- package/dist/pm/grid.js +16 -0
- package/dist/pm/grid.js.map +1 -0
- package/dist/pm/index.d.ts +25 -0
- package/dist/pm/index.js +199 -0
- package/dist/pm/index.js.map +1 -0
- package/dist/pm/observe.d.ts +55 -0
- package/dist/pm/observe.js +177 -0
- package/dist/pm/observe.js.map +1 -0
- package/dist/pm/plan.d.ts +54 -0
- package/dist/pm/plan.js +151 -0
- package/dist/pm/plan.js.map +1 -0
- package/dist/pm/refinement-worktree.d.ts +31 -0
- package/dist/pm/refinement-worktree.js +160 -0
- package/dist/pm/refinement-worktree.js.map +1 -0
- package/dist/pm/refinement.d.ts +79 -0
- package/dist/pm/refinement.js +326 -0
- package/dist/pm/refinement.js.map +1 -0
- package/dist/pm/render.d.ts +2 -0
- package/dist/pm/render.js +39 -0
- package/dist/pm/render.js.map +1 -0
- package/dist/pm/roadmap-rings.d.ts +7 -0
- package/dist/pm/roadmap-rings.js +31 -0
- package/dist/pm/roadmap-rings.js.map +1 -0
- package/dist/pm/roadmap.d.ts +2 -0
- package/dist/pm/roadmap.js +118 -0
- package/dist/pm/roadmap.js.map +1 -0
- package/dist/pm/snapshot.d.ts +10 -0
- package/dist/pm/snapshot.js +129 -0
- package/dist/pm/snapshot.js.map +1 -0
- package/dist/pm/types.d.ts +99 -0
- package/dist/pm/types.js +29 -0
- package/dist/pm/types.js.map +1 -0
- package/dist/registry-layout.d.ts +18 -0
- package/dist/registry-layout.js +122 -0
- package/dist/registry-layout.js.map +1 -0
- package/dist/scaffold-registry.d.ts +10 -0
- package/dist/scaffold-registry.js +283 -0
- package/dist/scaffold-registry.js.map +1 -0
- package/dist/scaffold.d.ts +1 -0
- package/dist/scaffold.js +32 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/spec-from-react.d.ts +11 -0
- package/dist/spec-from-react.js +522 -0
- package/dist/spec-from-react.js.map +1 -0
- package/dist/spec-from-stencil.d.ts +7 -0
- package/dist/spec-from-stencil.js +275 -0
- package/dist/spec-from-stencil.js.map +1 -0
- package/dist/spec.d.ts +1 -0
- package/dist/spec.js +60 -0
- package/dist/spec.js.map +1 -0
- package/dist/tokens-map.d.ts +11 -0
- package/dist/tokens-map.js +43 -0
- package/dist/tokens-map.js.map +1 -0
- package/dist/update.d.ts +39 -0
- package/dist/update.js +490 -0
- package/dist/update.js.map +1 -0
- package/dist/workspace-init.d.ts +9 -0
- package/dist/workspace-init.js +119 -0
- package/dist/workspace-init.js.map +1 -0
- package/package.json +53 -0
package/dist/update.js
ADDED
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { createInterface } from "node:readline/promises";
|
|
3
|
+
import { join, resolve } from "node:path";
|
|
4
|
+
import { parseModule, } from "@chiralkit/registry-schema";
|
|
5
|
+
import { resolveKitsRoot } from "@chiralkit/kits";
|
|
6
|
+
import { CONFIG_DIR, readConfig } from "./config.js";
|
|
7
|
+
import { hashFile, legacyLockExists, legacyLockMigrationHint, lockExists, LOCK_FILE, lockKey, parseLockKey, readLock, sha256, toRelativePosix, writeLock, } from "./lock.js";
|
|
8
|
+
import { MODULE_ENVELOPE_FILENAME, TYPE_TO_FAMILY, parseTypeFlag, walkAllKitRegistries, } from "./registry-layout.js";
|
|
9
|
+
export async function runUpdate(argv) {
|
|
10
|
+
const opts = {};
|
|
11
|
+
opts.check = argv.includes("--check");
|
|
12
|
+
opts.yes = argv.includes("--yes");
|
|
13
|
+
opts.type = parseTypeFlag(argv, (msg) => {
|
|
14
|
+
console.error(msg);
|
|
15
|
+
process.exit(1);
|
|
16
|
+
});
|
|
17
|
+
const positional = argv.filter((a, i) => !a.startsWith("--") &&
|
|
18
|
+
argv[i - 1] !== "--type");
|
|
19
|
+
opts.moduleFilter = positional[0];
|
|
20
|
+
return runUpdateWith(opts);
|
|
21
|
+
}
|
|
22
|
+
// Public entry for tests. Split from runUpdate so tests can pass
|
|
23
|
+
// pre-parsed options + inject prompt/clock behavior.
|
|
24
|
+
export async function runUpdateWith(opts) {
|
|
25
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
26
|
+
const config = await readConfig(cwd);
|
|
27
|
+
if (!(await lockExists(cwd))) {
|
|
28
|
+
const hint = (await legacyLockExists(cwd))
|
|
29
|
+
? legacyLockMigrationHint(cwd)
|
|
30
|
+
: `run 'chiralkit lock --init' first.`;
|
|
31
|
+
console.error(`No ${CONFIG_DIR}/${LOCK_FILE} — ${hint}`);
|
|
32
|
+
return 2;
|
|
33
|
+
}
|
|
34
|
+
const lock = await readLock(cwd);
|
|
35
|
+
const kitsRoot = opts.kitsRoot ?? resolveKitsRoot();
|
|
36
|
+
const registryModules = await walkAllKitRegistries(kitsRoot);
|
|
37
|
+
const targets = selectTargets(lock, opts.moduleFilter, opts.type);
|
|
38
|
+
if (targets instanceof Error) {
|
|
39
|
+
console.error(targets.message);
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
const plans = [];
|
|
43
|
+
for (const [key, locked] of targets) {
|
|
44
|
+
const parsed = parseLockKey(key);
|
|
45
|
+
const ref = findRegistryRef(registryModules, parsed.name, parsed.type);
|
|
46
|
+
if (!ref) {
|
|
47
|
+
console.error(`Module '${parsed.name}' (type '${parsed.type}') is in ${CONFIG_DIR}/${LOCK_FILE} but no longer exists in any kit registry under ${kitsRoot}.`);
|
|
48
|
+
return 1;
|
|
49
|
+
}
|
|
50
|
+
const registryEnvelope = await readEnvelope(ref);
|
|
51
|
+
if (registryEnvelope.metadata.version === locked.version) {
|
|
52
|
+
continue; // up to date
|
|
53
|
+
}
|
|
54
|
+
plans.push(await computePlan(key, parsed, locked, registryEnvelope, ref, config, cwd));
|
|
55
|
+
}
|
|
56
|
+
if (plans.length === 0) {
|
|
57
|
+
console.log(opts.moduleFilter
|
|
58
|
+
? `'${opts.moduleFilter}' is up to date.`
|
|
59
|
+
: "Everything up to date.");
|
|
60
|
+
return 0;
|
|
61
|
+
}
|
|
62
|
+
const rendered = renderPlans(plans);
|
|
63
|
+
process.stdout.write(rendered);
|
|
64
|
+
if (opts.check)
|
|
65
|
+
return 1;
|
|
66
|
+
const confirmed = opts.yes ||
|
|
67
|
+
(await (opts.confirm ?? defaultConfirm)(`\nApply ${plans.length} update${plans.length === 1 ? "" : "s"}? [y/N] `));
|
|
68
|
+
if (!confirmed) {
|
|
69
|
+
console.log("Aborted. Nothing written.");
|
|
70
|
+
return 0;
|
|
71
|
+
}
|
|
72
|
+
const now = (opts.now ?? (() => new Date().toISOString()))();
|
|
73
|
+
for (const plan of plans) {
|
|
74
|
+
await applyPlan(plan, lock, config, cwd, now, kitsRoot);
|
|
75
|
+
}
|
|
76
|
+
await writeLock(cwd, lock);
|
|
77
|
+
console.log(`\nUpdated ${plans.length} module${plans.length === 1 ? "" : "s"}. Lock refreshed.`);
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
function selectTargets(lock, filter, type) {
|
|
81
|
+
const entries = Object.entries(lock.modules);
|
|
82
|
+
if (!filter)
|
|
83
|
+
return entries;
|
|
84
|
+
const matches = entries.filter(([k]) => {
|
|
85
|
+
const p = parseLockKey(k);
|
|
86
|
+
return p.name === filter && (type === undefined || p.type === type);
|
|
87
|
+
});
|
|
88
|
+
if (matches.length === 0) {
|
|
89
|
+
return new Error(type
|
|
90
|
+
? `Module '${filter}' (type '${type}') is not in ${CONFIG_DIR}/${LOCK_FILE}.`
|
|
91
|
+
: `Module '${filter}' is not in ${CONFIG_DIR}/${LOCK_FILE}.`);
|
|
92
|
+
}
|
|
93
|
+
if (matches.length > 1) {
|
|
94
|
+
const types = matches.map(([k]) => parseLockKey(k).type).join(", ");
|
|
95
|
+
return new Error(`Module '${filter}' exists in multiple families in the lock (${types}). Pass --type <t> to disambiguate.`);
|
|
96
|
+
}
|
|
97
|
+
return matches;
|
|
98
|
+
}
|
|
99
|
+
function findRegistryRef(refs, name, type) {
|
|
100
|
+
const family = TYPE_TO_FAMILY[type];
|
|
101
|
+
return refs.find((r) => r.name === name && r.family === family);
|
|
102
|
+
}
|
|
103
|
+
async function readEnvelope(ref) {
|
|
104
|
+
const raw = await readFile(ref.envelopePath, "utf8");
|
|
105
|
+
return parseModule(JSON.parse(raw));
|
|
106
|
+
}
|
|
107
|
+
async function computePlan(key, parsed, locked, registryEnvelope, ref, config, cwd) {
|
|
108
|
+
// For v0/ui-component we already have the set of installed files in the
|
|
109
|
+
// lock (locked.files). We diff each of those against the registry's
|
|
110
|
+
// corresponding source file, add files that are new in the registry,
|
|
111
|
+
// and remove files that vanished. The registry's per-file source path
|
|
112
|
+
// is derived by mirroring the installer's rule: read the manifest for
|
|
113
|
+
// the component and re-run destination substitution — but crucially,
|
|
114
|
+
// the flat set of destination paths comes from the LOCK, and the
|
|
115
|
+
// matching sources come from the registry's module folder.
|
|
116
|
+
//
|
|
117
|
+
// Concretely: for now we constrain "changes" to the set of destinations
|
|
118
|
+
// the lock already tracks. We recompute their hashes against the
|
|
119
|
+
// registry sources by mapping dest → basename → registry file. The
|
|
120
|
+
// registry envelope's `files` map (spec.files) tells us the src side.
|
|
121
|
+
const changes = [];
|
|
122
|
+
const localEdits = [];
|
|
123
|
+
const spec = registryEnvelope.spec;
|
|
124
|
+
const registrySources = await collectRegistrySources(ref, spec);
|
|
125
|
+
// Match lock destinations to registry sources by basename. Basename is
|
|
126
|
+
// stable across stacks in v0 because add.ts + the Stencil installers
|
|
127
|
+
// both keep the same file names.
|
|
128
|
+
const registryByBase = new Map();
|
|
129
|
+
for (const src of registrySources) {
|
|
130
|
+
const base = src.split("/").pop();
|
|
131
|
+
registryByBase.set(base, src);
|
|
132
|
+
}
|
|
133
|
+
const lockedByBase = new Map();
|
|
134
|
+
for (const rel of Object.keys(locked.files)) {
|
|
135
|
+
const base = rel.split("/").pop();
|
|
136
|
+
lockedByBase.set(base, rel);
|
|
137
|
+
}
|
|
138
|
+
// Modified + local-edits detection for files that are in both.
|
|
139
|
+
for (const [base, rel] of lockedByBase) {
|
|
140
|
+
const src = registryByBase.get(base);
|
|
141
|
+
const absLocal = join(cwd, rel);
|
|
142
|
+
if (!src) {
|
|
143
|
+
changes.push({ kind: "removed", relPath: rel, patch: "" });
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
const registryContent = await readFile(src, "utf8");
|
|
147
|
+
let onDisk = null;
|
|
148
|
+
try {
|
|
149
|
+
onDisk = await readFile(absLocal, "utf8");
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
onDisk = null; // consumer deleted the file; treat as modified
|
|
153
|
+
}
|
|
154
|
+
const registryHash = sha256(registryContent);
|
|
155
|
+
if (onDisk !== null) {
|
|
156
|
+
const onDiskHash = sha256(onDisk);
|
|
157
|
+
if (onDiskHash !== locked.files[rel]) {
|
|
158
|
+
localEdits.push({
|
|
159
|
+
relPath: rel,
|
|
160
|
+
patch: unifiedDiff("lock", rel, "", onDisk),
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
if (onDiskHash !== registryHash) {
|
|
164
|
+
changes.push({
|
|
165
|
+
kind: "modified",
|
|
166
|
+
relPath: rel,
|
|
167
|
+
patch: unifiedDiff(rel, rel, onDisk, registryContent),
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
changes.push({
|
|
173
|
+
kind: "modified",
|
|
174
|
+
relPath: rel,
|
|
175
|
+
patch: `(file missing on disk; will be re-created)\n`,
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
// Files new in the registry that the lock didn't have. Preserve the
|
|
180
|
+
// consumer's paths.components/ prefix by mapping base → dest.
|
|
181
|
+
for (const [base, src] of registryByBase) {
|
|
182
|
+
if (lockedByBase.has(base))
|
|
183
|
+
continue;
|
|
184
|
+
const relDest = deriveDest(base, config.paths);
|
|
185
|
+
changes.push({ kind: "added", relPath: relDest, patch: "" });
|
|
186
|
+
void src;
|
|
187
|
+
}
|
|
188
|
+
return {
|
|
189
|
+
key,
|
|
190
|
+
name: parsed.name,
|
|
191
|
+
type: parsed.type,
|
|
192
|
+
fromVersion: locked.version,
|
|
193
|
+
toVersion: registryEnvelope.metadata.version,
|
|
194
|
+
changes,
|
|
195
|
+
localEdits,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
// Walk the registry module folder and return absolute paths of every
|
|
199
|
+
// source file that add would potentially copy. For Stencil-authored
|
|
200
|
+
// ui-components under the reversed-symlink layout, sources live under
|
|
201
|
+
// `implementations/stencil/*` (per ADR 0002). We include those AND, when
|
|
202
|
+
// present, any pre-built React wrapper under `implementations/react/*`.
|
|
203
|
+
// v0 approximation: we scan the module dir recursively and skip
|
|
204
|
+
// module.json and spec.json (envelope files, never installed).
|
|
205
|
+
async function collectRegistrySources(ref, _spec) {
|
|
206
|
+
const { readdir, stat } = await import("node:fs/promises");
|
|
207
|
+
const out = [];
|
|
208
|
+
async function walk(dir) {
|
|
209
|
+
let entries;
|
|
210
|
+
try {
|
|
211
|
+
entries = await readdir(dir, { withFileTypes: true });
|
|
212
|
+
}
|
|
213
|
+
catch {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
for (const e of entries) {
|
|
217
|
+
const p = join(dir, e.name);
|
|
218
|
+
if (e.isDirectory()) {
|
|
219
|
+
await walk(p);
|
|
220
|
+
}
|
|
221
|
+
else if (e.isFile() || e.isSymbolicLink()) {
|
|
222
|
+
try {
|
|
223
|
+
const s = await stat(p);
|
|
224
|
+
if (s.isFile())
|
|
225
|
+
out.push(p);
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
/* dangling symlink; skip */
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
await walk(ref.moduleDir);
|
|
234
|
+
return out.filter((p) => {
|
|
235
|
+
const base = p.split("/").pop();
|
|
236
|
+
return base !== MODULE_ENVELOPE_FILENAME && base !== "spec.json";
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
function deriveDest(basename, paths) {
|
|
240
|
+
// v0 heuristic: everything lands under paths.components. Assets vs.
|
|
241
|
+
// components split arrives when we ship a non-JS/CSS asset in the
|
|
242
|
+
// registry.
|
|
243
|
+
return `${paths.components}/${basename}`;
|
|
244
|
+
}
|
|
245
|
+
function renderPlans(plans) {
|
|
246
|
+
const lines = [];
|
|
247
|
+
for (const plan of plans) {
|
|
248
|
+
lines.push(`\n${plan.name} ${plan.fromVersion} → ${plan.toVersion}`);
|
|
249
|
+
for (const edit of plan.localEdits) {
|
|
250
|
+
lines.push(` ! ${edit.relPath} has local edits since install`);
|
|
251
|
+
if (edit.patch)
|
|
252
|
+
lines.push(indent(edit.patch, " "));
|
|
253
|
+
}
|
|
254
|
+
for (const c of plan.changes) {
|
|
255
|
+
const marker = c.kind === "added" ? "+" : c.kind === "removed" ? "-" : "~";
|
|
256
|
+
lines.push(` ${marker} ${c.relPath}${c.kind === "added" ? " (new file)" : c.kind === "removed" ? " (removed)" : ""}`);
|
|
257
|
+
if (c.patch)
|
|
258
|
+
lines.push(indent(c.patch, " "));
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
return lines.join("\n") + "\n";
|
|
262
|
+
}
|
|
263
|
+
function indent(block, prefix) {
|
|
264
|
+
return block
|
|
265
|
+
.split("\n")
|
|
266
|
+
.map((l) => (l.length > 0 ? prefix + l : l))
|
|
267
|
+
.join("\n");
|
|
268
|
+
}
|
|
269
|
+
// Zero-dep unified diff. Uses a straightforward LCS to keep the
|
|
270
|
+
// implementation reviewable — file sizes here are small kits, not
|
|
271
|
+
// megabyte-scale sources. Format matches GNU `diff -u` closely enough to
|
|
272
|
+
// read; consumer of the string is a human, not another diff tool.
|
|
273
|
+
export function unifiedDiff(fromLabel, toLabel, a, b) {
|
|
274
|
+
const aLines = a.split("\n");
|
|
275
|
+
const bLines = b.split("\n");
|
|
276
|
+
const lcs = buildLcs(aLines, bLines);
|
|
277
|
+
const ops = walkLcs(aLines, bLines, lcs);
|
|
278
|
+
return renderUnified(fromLabel, toLabel, aLines, bLines, ops);
|
|
279
|
+
}
|
|
280
|
+
function buildLcs(a, b) {
|
|
281
|
+
const m = a.length;
|
|
282
|
+
const n = b.length;
|
|
283
|
+
const dp = Array.from({ length: m + 1 }, () => new Array(n + 1).fill(0));
|
|
284
|
+
for (let i = m - 1; i >= 0; i--) {
|
|
285
|
+
for (let j = n - 1; j >= 0; j--) {
|
|
286
|
+
dp[i][j] = a[i] === b[j] ? dp[i + 1][j + 1] + 1 : Math.max(dp[i + 1][j], dp[i][j + 1]);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
return dp;
|
|
290
|
+
}
|
|
291
|
+
function walkLcs(a, b, dp) {
|
|
292
|
+
const ops = [];
|
|
293
|
+
let i = 0;
|
|
294
|
+
let j = 0;
|
|
295
|
+
while (i < a.length && j < b.length) {
|
|
296
|
+
if (a[i] === b[j]) {
|
|
297
|
+
ops.push({ kind: "eq", aIdx: i, bIdx: j });
|
|
298
|
+
i++;
|
|
299
|
+
j++;
|
|
300
|
+
}
|
|
301
|
+
else if (dp[i + 1][j] >= dp[i][j + 1]) {
|
|
302
|
+
ops.push({ kind: "del", aIdx: i, bIdx: j });
|
|
303
|
+
i++;
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
ops.push({ kind: "add", aIdx: i, bIdx: j });
|
|
307
|
+
j++;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
while (i < a.length) {
|
|
311
|
+
ops.push({ kind: "del", aIdx: i, bIdx: j });
|
|
312
|
+
i++;
|
|
313
|
+
}
|
|
314
|
+
while (j < b.length) {
|
|
315
|
+
ops.push({ kind: "add", aIdx: i, bIdx: j });
|
|
316
|
+
j++;
|
|
317
|
+
}
|
|
318
|
+
return ops;
|
|
319
|
+
}
|
|
320
|
+
function renderUnified(fromLabel, toLabel, a, b, ops) {
|
|
321
|
+
const contextBefore = 2;
|
|
322
|
+
const contextAfter = 2;
|
|
323
|
+
const hunks = [];
|
|
324
|
+
const changed = ops
|
|
325
|
+
.map((op, idx) => ({ op, idx }))
|
|
326
|
+
.filter((x) => x.op.kind !== "eq");
|
|
327
|
+
if (changed.length === 0) {
|
|
328
|
+
return `--- ${fromLabel}\n+++ ${toLabel}\n(no textual diff)\n`;
|
|
329
|
+
}
|
|
330
|
+
let cursor = 0;
|
|
331
|
+
while (cursor < changed.length) {
|
|
332
|
+
let end = cursor;
|
|
333
|
+
while (end + 1 < changed.length &&
|
|
334
|
+
changed[end + 1].idx - changed[end].idx <= contextBefore + contextAfter) {
|
|
335
|
+
end++;
|
|
336
|
+
}
|
|
337
|
+
const start = Math.max(0, changed[cursor].idx - contextBefore);
|
|
338
|
+
const stop = Math.min(ops.length, changed[end].idx + 1 + contextAfter);
|
|
339
|
+
const hunk = ops.slice(start, stop);
|
|
340
|
+
let aStart = -1;
|
|
341
|
+
let bStart = -1;
|
|
342
|
+
let aCount = 0;
|
|
343
|
+
let bCount = 0;
|
|
344
|
+
const body = [];
|
|
345
|
+
for (const op of hunk) {
|
|
346
|
+
if (aStart === -1 && op.kind !== "add")
|
|
347
|
+
aStart = op.aIdx;
|
|
348
|
+
if (bStart === -1 && op.kind !== "del")
|
|
349
|
+
bStart = op.bIdx;
|
|
350
|
+
if (op.kind === "eq") {
|
|
351
|
+
body.push(` ${a[op.aIdx]}`);
|
|
352
|
+
aCount++;
|
|
353
|
+
bCount++;
|
|
354
|
+
}
|
|
355
|
+
else if (op.kind === "del") {
|
|
356
|
+
body.push(`-${a[op.aIdx]}`);
|
|
357
|
+
aCount++;
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
body.push(`+${b[op.bIdx]}`);
|
|
361
|
+
bCount++;
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
if (aStart === -1)
|
|
365
|
+
aStart = 0;
|
|
366
|
+
if (bStart === -1)
|
|
367
|
+
bStart = 0;
|
|
368
|
+
hunks.push(`@@ -${aStart + 1},${aCount} +${bStart + 1},${bCount} @@`);
|
|
369
|
+
hunks.push(...body);
|
|
370
|
+
cursor = end + 1;
|
|
371
|
+
}
|
|
372
|
+
return `--- ${fromLabel}\n+++ ${toLabel}\n${hunks.join("\n")}\n`;
|
|
373
|
+
}
|
|
374
|
+
async function applyPlan(plan, lock, config, cwd, now, kitsRoot) {
|
|
375
|
+
void config;
|
|
376
|
+
const locked = lock.modules[plan.key];
|
|
377
|
+
// Re-read registry sources and copy them into place.
|
|
378
|
+
const registryModules = await walkAllKitRegistries(kitsRoot);
|
|
379
|
+
const ref = findRegistryRef(registryModules, plan.name, plan.type);
|
|
380
|
+
const registryEnvelope = await readEnvelope(ref);
|
|
381
|
+
const sources = await collectRegistrySources(ref, registryEnvelope.spec);
|
|
382
|
+
const registryByBase = new Map();
|
|
383
|
+
for (const s of sources)
|
|
384
|
+
registryByBase.set(s.split("/").pop(), s);
|
|
385
|
+
const nextFiles = {};
|
|
386
|
+
for (const c of plan.changes) {
|
|
387
|
+
const base = c.relPath.split("/").pop();
|
|
388
|
+
if (c.kind === "removed") {
|
|
389
|
+
// v1 keeps the physical file — remove is signalled in the plan but
|
|
390
|
+
// the consumer decides whether to delete stale files themselves.
|
|
391
|
+
// Simpler than gating a destructive branch behind a flag.
|
|
392
|
+
continue;
|
|
393
|
+
}
|
|
394
|
+
const src = registryByBase.get(base);
|
|
395
|
+
if (!src)
|
|
396
|
+
continue;
|
|
397
|
+
const registryContent = await readFile(src, "utf8");
|
|
398
|
+
const abs = join(cwd, c.relPath);
|
|
399
|
+
await writeFile(abs, registryContent, "utf8");
|
|
400
|
+
nextFiles[toRelativePosix(cwd, abs)] = sha256(registryContent);
|
|
401
|
+
}
|
|
402
|
+
// Keep entries for locked files that were not touched by this plan
|
|
403
|
+
// (nothing changed for them; hash stays what it was).
|
|
404
|
+
for (const [rel, hash] of Object.entries(locked.files)) {
|
|
405
|
+
if (!(rel in nextFiles))
|
|
406
|
+
nextFiles[rel] = hash;
|
|
407
|
+
}
|
|
408
|
+
lock.modules[plan.key] = {
|
|
409
|
+
type: plan.type,
|
|
410
|
+
version: plan.toVersion,
|
|
411
|
+
installed_at: now,
|
|
412
|
+
files: nextFiles,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
async function defaultConfirm(prompt) {
|
|
416
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
417
|
+
try {
|
|
418
|
+
const answer = (await rl.question(prompt)).trim().toLowerCase();
|
|
419
|
+
return answer === "y" || answer === "yes";
|
|
420
|
+
}
|
|
421
|
+
finally {
|
|
422
|
+
rl.close();
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
export async function runLock(argv) {
|
|
426
|
+
if (argv[0] !== "--init") {
|
|
427
|
+
console.error("Usage: chiralkit lock --init");
|
|
428
|
+
return 1;
|
|
429
|
+
}
|
|
430
|
+
return runLockInit({});
|
|
431
|
+
}
|
|
432
|
+
export async function runLockInit(opts) {
|
|
433
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
434
|
+
const config = await readConfig(cwd);
|
|
435
|
+
if (await lockExists(cwd)) {
|
|
436
|
+
console.error(`${CONFIG_DIR}/${LOCK_FILE} already exists in ${cwd}. Delete it first if you want to re-snapshot.`);
|
|
437
|
+
return 1;
|
|
438
|
+
}
|
|
439
|
+
if (await legacyLockExists(cwd)) {
|
|
440
|
+
console.error(legacyLockMigrationHint(cwd));
|
|
441
|
+
return 1;
|
|
442
|
+
}
|
|
443
|
+
const registryModules = await walkAllKitRegistries(opts.kitsRoot ?? resolveKitsRoot());
|
|
444
|
+
const now = (opts.now ?? (() => new Date().toISOString()))();
|
|
445
|
+
const lock = { modules: {} };
|
|
446
|
+
const componentsAbs = resolve(cwd, config.paths.components);
|
|
447
|
+
const installedBases = await listInstalledBases(componentsAbs);
|
|
448
|
+
for (const ref of registryModules) {
|
|
449
|
+
const envelope = await readEnvelope(ref);
|
|
450
|
+
if (envelope.type !== "ui-component")
|
|
451
|
+
continue;
|
|
452
|
+
const spec = envelope.spec;
|
|
453
|
+
const sources = await collectRegistrySources(ref, spec);
|
|
454
|
+
const registryBases = sources.map((s) => s.split("/").pop());
|
|
455
|
+
const matching = registryBases.filter((b) => installedBases.has(b));
|
|
456
|
+
if (matching.length === 0)
|
|
457
|
+
continue;
|
|
458
|
+
const files = {};
|
|
459
|
+
for (const base of matching) {
|
|
460
|
+
const rel = deriveDest(base, config.paths);
|
|
461
|
+
const abs = join(cwd, rel);
|
|
462
|
+
files[toRelativePosix(cwd, abs)] = await hashFile(abs);
|
|
463
|
+
}
|
|
464
|
+
lock.modules[lockKey(ref.name, envelope.type)] = {
|
|
465
|
+
type: envelope.type,
|
|
466
|
+
version: envelope.metadata.version,
|
|
467
|
+
installed_at: now,
|
|
468
|
+
files,
|
|
469
|
+
};
|
|
470
|
+
}
|
|
471
|
+
await writeLock(cwd, lock);
|
|
472
|
+
const count = Object.keys(lock.modules).length;
|
|
473
|
+
console.log(`Wrote ${CONFIG_DIR}/${LOCK_FILE} with ${count} module${count === 1 ? "" : "s"}.`);
|
|
474
|
+
return 0;
|
|
475
|
+
}
|
|
476
|
+
async function listInstalledBases(dir) {
|
|
477
|
+
const out = new Set();
|
|
478
|
+
const { readdir } = await import("node:fs/promises");
|
|
479
|
+
try {
|
|
480
|
+
const entries = await readdir(dir, { withFileTypes: true });
|
|
481
|
+
for (const e of entries)
|
|
482
|
+
if (e.isFile())
|
|
483
|
+
out.add(e.name);
|
|
484
|
+
}
|
|
485
|
+
catch {
|
|
486
|
+
/* dir does not exist → empty set */
|
|
487
|
+
}
|
|
488
|
+
return out;
|
|
489
|
+
}
|
|
490
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../src/update.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export type WorkspaceInitResult = {
|
|
2
|
+
initialized: true;
|
|
3
|
+
projectId: string;
|
|
4
|
+
} | {
|
|
5
|
+
initialized: false;
|
|
6
|
+
projectId: string;
|
|
7
|
+
alreadyInitialized: true;
|
|
8
|
+
};
|
|
9
|
+
export declare function runWorkspaceInit(argv?: string[], cwd?: string): Promise<WorkspaceInitResult>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { access, mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
|
+
import { join } from 'node:path';
|
|
4
|
+
import { workspaceProjectSchema, workspaceConfigSchema, } from '@chiralkit/registry-schema';
|
|
5
|
+
import { generateUuidV7, parseEnvelope } from '@chiralkit/event-log';
|
|
6
|
+
const DEFAULT_ADAPTER = 'teammate-cli-claude-code';
|
|
7
|
+
const DEFAULT_AGENT = 'ck-chat';
|
|
8
|
+
export async function runWorkspaceInit(argv = [], cwd = process.cwd()) {
|
|
9
|
+
const adapterId = readFlag(argv, '--adapter') ?? DEFAULT_ADAPTER;
|
|
10
|
+
const agent = readFlag(argv, '--agent') ?? DEFAULT_AGENT;
|
|
11
|
+
assertGitRepo(cwd);
|
|
12
|
+
const wsDir = join(cwd, '.chiralkit', 'workspace');
|
|
13
|
+
const projectPath = join(wsDir, 'project.json');
|
|
14
|
+
const configPath = join(wsDir, 'config.json');
|
|
15
|
+
const eventsPath = join(wsDir, 'events.jsonl');
|
|
16
|
+
const gitignorePath = join(wsDir, '.gitignore');
|
|
17
|
+
if (await pathExists(projectPath)) {
|
|
18
|
+
const existing = workspaceProjectSchema.parse(JSON.parse(await readFile(projectPath, 'utf8')));
|
|
19
|
+
console.warn(`.chiralkit/workspace/ already initialized (projectId ${existing.projectId}); no-op.`);
|
|
20
|
+
return { initialized: false, projectId: existing.projectId, alreadyInitialized: true };
|
|
21
|
+
}
|
|
22
|
+
await mkdir(wsDir, { recursive: true });
|
|
23
|
+
const projectId = generateUuidV7();
|
|
24
|
+
const gitName = readGitConfig(cwd, 'user.name');
|
|
25
|
+
const gitEmail = readGitConfig(cwd, 'user.email');
|
|
26
|
+
const createdAt = new Date().toISOString();
|
|
27
|
+
const project = workspaceProjectSchema.parse({
|
|
28
|
+
projectId,
|
|
29
|
+
createdAt,
|
|
30
|
+
initializedBy: { gitName, gitEmail },
|
|
31
|
+
});
|
|
32
|
+
const instanceId = `${agent}-main`;
|
|
33
|
+
const config = workspaceConfigSchema.parse({
|
|
34
|
+
adapterId,
|
|
35
|
+
adapterConfig: { cliPath: 'claude-code', extraArgs: [], turnTimeoutMs: 300_000 },
|
|
36
|
+
agentInstances: [{
|
|
37
|
+
id: instanceId,
|
|
38
|
+
moduleRef: `@chiralkit/agents/${agent}`,
|
|
39
|
+
version: '0.0.0',
|
|
40
|
+
scope: 'contributor',
|
|
41
|
+
}],
|
|
42
|
+
defaultAgentInstanceId: instanceId,
|
|
43
|
+
});
|
|
44
|
+
const initEvent = parseEnvelope({
|
|
45
|
+
id: generateUuidV7(),
|
|
46
|
+
projectId,
|
|
47
|
+
ts: new Date().toISOString(),
|
|
48
|
+
type: 'project.initialized',
|
|
49
|
+
schemaVersion: 1,
|
|
50
|
+
actor: { kind: 'human', id: gitEmail },
|
|
51
|
+
payload: { repoPath: cwd, createdBy: { gitName, gitEmail } },
|
|
52
|
+
});
|
|
53
|
+
const attachEvent = parseEnvelope({
|
|
54
|
+
id: generateUuidV7(),
|
|
55
|
+
projectId,
|
|
56
|
+
ts: new Date().toISOString(),
|
|
57
|
+
type: 'agent.instance.attached',
|
|
58
|
+
schemaVersion: 1,
|
|
59
|
+
actor: { kind: 'human', id: gitEmail },
|
|
60
|
+
payload: {
|
|
61
|
+
instanceId,
|
|
62
|
+
moduleRef: `@chiralkit/agents/${agent}`,
|
|
63
|
+
gitSha: readHeadSha(cwd),
|
|
64
|
+
scope: 'contributor',
|
|
65
|
+
},
|
|
66
|
+
});
|
|
67
|
+
await writeFile(projectPath, JSON.stringify(project, null, 2) + '\n', 'utf8');
|
|
68
|
+
await writeFile(configPath, JSON.stringify(config, null, 2) + '\n', 'utf8');
|
|
69
|
+
await writeFile(gitignorePath, 'events.jsonl\nruns/\n', 'utf8');
|
|
70
|
+
await writeFile(eventsPath, JSON.stringify(initEvent) + '\n' + JSON.stringify(attachEvent) + '\n', 'utf8');
|
|
71
|
+
console.log(`Initialized .chiralkit/workspace/ (projectId ${projectId})`);
|
|
72
|
+
console.log(` adapterId: ${adapterId}`);
|
|
73
|
+
console.log(` defaultAgentInstanceId: ${instanceId}`);
|
|
74
|
+
return { initialized: true, projectId };
|
|
75
|
+
}
|
|
76
|
+
function readFlag(argv, name) {
|
|
77
|
+
const i = argv.indexOf(name);
|
|
78
|
+
if (i < 0)
|
|
79
|
+
return undefined;
|
|
80
|
+
const v = argv[i + 1];
|
|
81
|
+
if (!v || v.startsWith('--'))
|
|
82
|
+
throw new Error(`${name} requires a value`);
|
|
83
|
+
return v;
|
|
84
|
+
}
|
|
85
|
+
async function pathExists(p) {
|
|
86
|
+
try {
|
|
87
|
+
await access(p);
|
|
88
|
+
return true;
|
|
89
|
+
}
|
|
90
|
+
catch {
|
|
91
|
+
return false;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
function assertGitRepo(cwd) {
|
|
95
|
+
try {
|
|
96
|
+
execSync('git rev-parse --show-toplevel', { cwd, stdio: 'pipe' });
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
throw new Error('ck workspace init: not a git repository (run `git init` first)');
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function readGitConfig(cwd, key) {
|
|
103
|
+
try {
|
|
104
|
+
const raw = execSync(`git config ${key}`, { cwd, stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
|
|
105
|
+
return raw || 'unknown';
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return 'unknown';
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
function readHeadSha(cwd) {
|
|
112
|
+
try {
|
|
113
|
+
return execSync('git rev-parse HEAD', { cwd, stdio: ['ignore', 'pipe', 'ignore'] }).toString().trim();
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
return '0000000000000000000000000000000000000000';
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=workspace-init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace-init.js","sourceRoot":"","sources":["../src/workspace-init.ts"],"names":[],"mappings":"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"}
|