@clossys/launcher 0.1.1
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/CHANGELOG.md +27 -0
- package/LICENSE +21 -0
- package/README.md +132 -0
- package/dist/check-cli.d.ts +14 -0
- package/dist/check-cli.d.ts.map +1 -0
- package/dist/check-cli.js +161 -0
- package/dist/check-cli.js.map +1 -0
- package/dist/cli.d.ts +14 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +90 -0
- package/dist/cli.js.map +1 -0
- package/dist/core.d.ts +29 -0
- package/dist/core.d.ts.map +1 -0
- package/dist/core.js +500 -0
- package/dist/core.js.map +1 -0
- package/dist/host.d.ts +4 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +65 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +106 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +66 -0
- package/skeleton/.clossys/inventory.json +4 -0
- package/skeleton/.clossys/workspace.json +6 -0
- package/skeleton/README.md +29 -0
- package/skeleton/package.json +13 -0
- package/src/check-cli.ts +179 -0
- package/src/cli.ts +92 -0
- package/src/core.ts +570 -0
- package/src/host.ts +63 -0
- package/src/index.ts +28 -0
- package/src/types.ts +114 -0
package/dist/core.js
ADDED
|
@@ -0,0 +1,500 @@
|
|
|
1
|
+
import { dirname, join, resolve, sep } from "node:path";
|
|
2
|
+
import { fileURLToPath } from "node:url";
|
|
3
|
+
export const DEFAULT_REPOSITORY_NAME = "workspace";
|
|
4
|
+
export const WORKSPACE_MARKER_REL = ".clossys/workspace.json";
|
|
5
|
+
export const WORKSPACE_INVENTORY_REL = ".clossys/inventory.json";
|
|
6
|
+
export const ADVISOR_PACKAGE = "@clossys/advisor";
|
|
7
|
+
const OWNER = /^[A-Za-z0-9](?:[A-Za-z0-9-]{0,37}[A-Za-z0-9])?$/;
|
|
8
|
+
const REPO = /^[A-Za-z0-9._-]+$/;
|
|
9
|
+
const SKELETON_FILES = [
|
|
10
|
+
"README.md",
|
|
11
|
+
"package.json",
|
|
12
|
+
".gitignore",
|
|
13
|
+
WORKSPACE_MARKER_REL,
|
|
14
|
+
WORKSPACE_INVENTORY_REL,
|
|
15
|
+
];
|
|
16
|
+
/** Written at generate time so this package never ships a nested AGENTS.md. */
|
|
17
|
+
export const CONSUMER_AGENTS_MD = `# Account workspace
|
|
18
|
+
|
|
19
|
+
This repository is the account hub for Foundry packages. It inventories
|
|
20
|
+
where packages are installed and coordinates engagement. It is not a
|
|
21
|
+
product application and does not need the whole catalogue installed here.
|
|
22
|
+
|
|
23
|
+
Open this folder in your coding agent. Advisor is read-only until you
|
|
24
|
+
approve a next action.
|
|
25
|
+
|
|
26
|
+
Run \`npx @clossys/launcher\` again to resume. Public npm reads
|
|
27
|
+
need no token.
|
|
28
|
+
`;
|
|
29
|
+
export const CONSUMER_CLAUDE_MD = `@AGENTS.md
|
|
30
|
+
`;
|
|
31
|
+
function isRecord(value) {
|
|
32
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
function isText(value) {
|
|
35
|
+
return typeof value === "string" && value.trim() !== "";
|
|
36
|
+
}
|
|
37
|
+
function refuse(state, message) {
|
|
38
|
+
return { action: "refuse", state, message };
|
|
39
|
+
}
|
|
40
|
+
function repoNameFromSlug(slug, fallback) {
|
|
41
|
+
const parts = slug.split("/");
|
|
42
|
+
const name = parts.length === 2 ? parts[1] : slug;
|
|
43
|
+
return name && REPO.test(name) ? name : fallback;
|
|
44
|
+
}
|
|
45
|
+
/** Parses a GitHub git remote. Any other host is rejected. */
|
|
46
|
+
export function parseGitHubRemote(url) {
|
|
47
|
+
const trimmed = url.trim();
|
|
48
|
+
if (trimmed === "")
|
|
49
|
+
return null;
|
|
50
|
+
const ssh = trimmed.match(/^git@github\.com:([^/]+)\/([^/]+?)(?:\.git)?$/i);
|
|
51
|
+
if (ssh?.[1] && ssh[2]) {
|
|
52
|
+
const owner = ssh[1];
|
|
53
|
+
const repository = ssh[2].replace(/\.git$/i, "");
|
|
54
|
+
if (OWNER.test(owner) && REPO.test(repository))
|
|
55
|
+
return { owner, repository };
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const parsed = new URL(trimmed);
|
|
60
|
+
if (parsed.hostname.toLowerCase() !== "github.com")
|
|
61
|
+
return null;
|
|
62
|
+
const parts = parsed.pathname.replace(/^\//, "").replace(/\.git$/i, "").split("/").filter(Boolean);
|
|
63
|
+
const owner = parts[0];
|
|
64
|
+
const repository = parts[1];
|
|
65
|
+
if (!owner || !repository || !OWNER.test(owner) || !REPO.test(repository))
|
|
66
|
+
return null;
|
|
67
|
+
return { owner, repository };
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** True when the marker is a v1 account-hub document. */
|
|
74
|
+
export function isHubDocument(value) {
|
|
75
|
+
if (!isRecord(value) || value.schemaVersion !== 1 || value.kind !== "account-hub")
|
|
76
|
+
return false;
|
|
77
|
+
if (!isText(value.owner) || !OWNER.test(value.owner))
|
|
78
|
+
return false;
|
|
79
|
+
if (!isText(value.repository))
|
|
80
|
+
return false;
|
|
81
|
+
const parsed = value.repository.includes("/")
|
|
82
|
+
? { owner: value.repository.split("/")[0], repository: value.repository.split("/")[1] }
|
|
83
|
+
: null;
|
|
84
|
+
if (!parsed?.owner || !parsed.repository || parsed.owner !== value.owner || !REPO.test(parsed.repository))
|
|
85
|
+
return false;
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
function readHub(host, directory) {
|
|
89
|
+
const raw = host.readText(join(directory, WORKSPACE_MARKER_REL));
|
|
90
|
+
if (raw === null)
|
|
91
|
+
return undefined;
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(raw);
|
|
94
|
+
return isHubDocument(parsed) ? parsed : undefined;
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
return undefined;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/** Classifies a generated hub inventory (packed template skeleton/.clossys/inventory.json; the generated path does not ship) without inventing repositories. */
|
|
101
|
+
export function inspectInventory(raw) {
|
|
102
|
+
if (raw === null)
|
|
103
|
+
return { status: "missing", count: 0 };
|
|
104
|
+
try {
|
|
105
|
+
const parsed = JSON.parse(raw);
|
|
106
|
+
if (!isRecord(parsed) || parsed.schemaVersion !== 1 || !Array.isArray(parsed.repositories)) {
|
|
107
|
+
return { status: "empty", count: 0 };
|
|
108
|
+
}
|
|
109
|
+
const count = parsed.repositories.length;
|
|
110
|
+
return { status: count > 0 ? "populated" : "empty", count };
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
return { status: "empty", count: 0 };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
function looksLikeFoundry(host, directory) {
|
|
117
|
+
const manifestRaw = host.readText(join(directory, "package.json"));
|
|
118
|
+
if (manifestRaw !== null) {
|
|
119
|
+
try {
|
|
120
|
+
const manifest = JSON.parse(manifestRaw);
|
|
121
|
+
if (isRecord(manifest) && manifest.name === "foundry-packages")
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
catch {
|
|
125
|
+
/* not a manifest */
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return host.exists(join(directory, "packages", "advisor", "package.json")) && host.exists(join(directory, "docs", "LIFECYCLE.md"));
|
|
129
|
+
}
|
|
130
|
+
function directoryEntries(host, directory) {
|
|
131
|
+
if (!host.isDirectory(directory))
|
|
132
|
+
return [];
|
|
133
|
+
return host.readDir(directory).filter((name) => name !== "." && name !== "..");
|
|
134
|
+
}
|
|
135
|
+
function isEffectivelyEmpty(entries) {
|
|
136
|
+
return entries.every((name) => name === ".git" || name === ".DS_Store");
|
|
137
|
+
}
|
|
138
|
+
function stdoutLines(result) {
|
|
139
|
+
if (result.status !== 0)
|
|
140
|
+
return [];
|
|
141
|
+
return result.stdout.split(/\r?\n/).map((line) => line.trim()).filter(Boolean);
|
|
142
|
+
}
|
|
143
|
+
function commandAvailable(host, command) {
|
|
144
|
+
const result = host.run(command, ["--version"]);
|
|
145
|
+
return result.status === 0;
|
|
146
|
+
}
|
|
147
|
+
/** Collects GitHub owner, cwd shape, default-hub presence, and the public Advisor pin. */
|
|
148
|
+
export function observeWorkspace(host) {
|
|
149
|
+
const cwd = host.cwd;
|
|
150
|
+
const ghAvailable = commandAvailable(host, "gh");
|
|
151
|
+
const gitAvailable = commandAvailable(host, "git");
|
|
152
|
+
const entries = directoryEntries(host, cwd);
|
|
153
|
+
const git = host.isDirectory(join(cwd, ".git"));
|
|
154
|
+
let githubOwner;
|
|
155
|
+
let githubRepository;
|
|
156
|
+
if (git && gitAvailable) {
|
|
157
|
+
const remote = host.run("git", ["remote", "get-url", "origin"], { cwd });
|
|
158
|
+
const parsed = parseGitHubRemote(remote.stdout.trim());
|
|
159
|
+
if (parsed) {
|
|
160
|
+
githubOwner = parsed.owner;
|
|
161
|
+
githubRepository = parsed.repository;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
const candidates = new Set();
|
|
165
|
+
const envOwnerRaw = host.env.CLOSSYS_OWNER?.trim();
|
|
166
|
+
const envOwner = envOwnerRaw && OWNER.test(envOwnerRaw) ? envOwnerRaw : undefined;
|
|
167
|
+
if (ghAvailable) {
|
|
168
|
+
const user = host.run("gh", ["api", "user", "--jq", ".login"]);
|
|
169
|
+
const login = user.stdout.trim();
|
|
170
|
+
if (user.status === 0 && OWNER.test(login))
|
|
171
|
+
candidates.add(login);
|
|
172
|
+
for (const org of stdoutLines(host.run("gh", ["org", "list"]))) {
|
|
173
|
+
if (OWNER.test(org))
|
|
174
|
+
candidates.add(org);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
if (githubOwner)
|
|
178
|
+
candidates.add(githubOwner);
|
|
179
|
+
let remoteDefaultHub;
|
|
180
|
+
let advisorVersion;
|
|
181
|
+
const ownerGuess = envOwner ?? (candidates.size === 1 ? [...candidates][0] : githubOwner);
|
|
182
|
+
if (ghAvailable && ownerGuess) {
|
|
183
|
+
const viewed = host.run("gh", ["repo", "view", `${ownerGuess}/${DEFAULT_REPOSITORY_NAME}`, "--json", "name"]);
|
|
184
|
+
if (viewed.status === 0)
|
|
185
|
+
remoteDefaultHub = { owner: ownerGuess, repository: DEFAULT_REPOSITORY_NAME };
|
|
186
|
+
}
|
|
187
|
+
const viewedAdvisor = host.run("npm", ["view", ADVISOR_PACKAGE, "version"]);
|
|
188
|
+
const version = viewedAdvisor.stdout.trim();
|
|
189
|
+
if (viewedAdvisor.status === 0 && /^\d+\.\d+\.\d+$/.test(version))
|
|
190
|
+
advisorVersion = version;
|
|
191
|
+
const cwdObservation = {
|
|
192
|
+
absolutePath: cwd,
|
|
193
|
+
empty: isEffectivelyEmpty(entries),
|
|
194
|
+
git,
|
|
195
|
+
...(githubOwner === undefined ? {} : { githubOwner }),
|
|
196
|
+
...(githubRepository === undefined ? {} : { githubRepository }),
|
|
197
|
+
...(readHub(host, cwd) === undefined ? {} : { hub: readHub(host, cwd) }),
|
|
198
|
+
looksLikeFoundry: looksLikeFoundry(host, cwd),
|
|
199
|
+
inventory: inspectInventory(host.readText(join(cwd, WORKSPACE_INVENTORY_REL))),
|
|
200
|
+
};
|
|
201
|
+
return {
|
|
202
|
+
cwd: cwdObservation,
|
|
203
|
+
ownerCandidates: [...candidates].sort(),
|
|
204
|
+
...(envOwner === undefined ? {} : { envOwner }),
|
|
205
|
+
...(remoteDefaultHub === undefined ? {} : { remoteDefaultHub }),
|
|
206
|
+
...(advisorVersion === undefined ? {} : { advisorVersion }),
|
|
207
|
+
ghAvailable,
|
|
208
|
+
gitAvailable,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
function resolveOwner(observation, host) {
|
|
212
|
+
if (observation.envOwner)
|
|
213
|
+
return { owner: observation.envOwner };
|
|
214
|
+
if (observation.ownerCandidates.length === 1) {
|
|
215
|
+
const owner = observation.ownerCandidates[0];
|
|
216
|
+
if (owner)
|
|
217
|
+
return { owner };
|
|
218
|
+
}
|
|
219
|
+
if (observation.ownerCandidates.length > 1) {
|
|
220
|
+
const picked = host.isTTY
|
|
221
|
+
? host.prompt("Which GitHub owner should hold the account workspace hub?", observation.ownerCandidates)
|
|
222
|
+
: null;
|
|
223
|
+
if (picked && observation.ownerCandidates.includes(picked))
|
|
224
|
+
return { owner: picked };
|
|
225
|
+
return refuse("indeterminate", `multiple GitHub owners are visible (${observation.ownerCandidates.join(", ")}); re-run from a terminal to pick one`);
|
|
226
|
+
}
|
|
227
|
+
return refuse("indeterminate", "cannot infer a GitHub owner; authenticate `gh` or set CLOSSYS_OWNER");
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Decides create, resume, or adopt from a cwd observation.
|
|
231
|
+
* Appointing means: run this from the GitHub repository that should own the hub.
|
|
232
|
+
*/
|
|
233
|
+
function resolveAdoptInventory(host, cwd, inventoryPath) {
|
|
234
|
+
if (cwd.inventory?.status === "populated")
|
|
235
|
+
return {};
|
|
236
|
+
const trimmed = inventoryPath?.trim();
|
|
237
|
+
if (!trimmed) {
|
|
238
|
+
return refuse("violated", "appointing requires a populated generated hub inventory (packed template skeleton/.clossys/inventory.json; the generated path does not ship), or --inventory <path> to a populated inventory document");
|
|
239
|
+
}
|
|
240
|
+
const resolved = resolve(cwd.absolutePath, trimmed);
|
|
241
|
+
const imported = inspectInventory(host.readText(resolved));
|
|
242
|
+
if (imported.status !== "populated") {
|
|
243
|
+
return refuse("violated", "--inventory must point at a populated inventory document (schemaVersion 1, nonempty repositories)");
|
|
244
|
+
}
|
|
245
|
+
return { inventorySource: resolved };
|
|
246
|
+
}
|
|
247
|
+
export function planWorkspace(observation, host, options = {}) {
|
|
248
|
+
const { cwd } = observation;
|
|
249
|
+
if (cwd.looksLikeFoundry) {
|
|
250
|
+
return refuse("violated", "refusing to scaffold a hub inside the Foundry supplier tree; run from the GitHub repository you want to appoint, or from an empty directory");
|
|
251
|
+
}
|
|
252
|
+
if (cwd.hub) {
|
|
253
|
+
return {
|
|
254
|
+
action: "resume",
|
|
255
|
+
owner: cwd.hub.owner,
|
|
256
|
+
repository: repoNameFromSlug(cwd.hub.repository, DEFAULT_REPOSITORY_NAME),
|
|
257
|
+
directory: cwd.absolutePath,
|
|
258
|
+
clone: false,
|
|
259
|
+
};
|
|
260
|
+
}
|
|
261
|
+
if (cwd.git && cwd.githubOwner && cwd.githubRepository) {
|
|
262
|
+
if (!observation.advisorVersion) {
|
|
263
|
+
return refuse("indeterminate", `cannot read a public ${ADVISOR_PACKAGE} version from the npm registry`);
|
|
264
|
+
}
|
|
265
|
+
const imported = resolveAdoptInventory(host, cwd, options.inventoryPath);
|
|
266
|
+
if ("action" in imported)
|
|
267
|
+
return imported;
|
|
268
|
+
return {
|
|
269
|
+
action: "adopt",
|
|
270
|
+
owner: cwd.githubOwner,
|
|
271
|
+
repository: cwd.githubRepository,
|
|
272
|
+
directory: cwd.absolutePath,
|
|
273
|
+
advisorVersion: observation.advisorVersion,
|
|
274
|
+
...(imported.inventorySource === undefined ? {} : { inventorySource: imported.inventorySource }),
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
if (cwd.git) {
|
|
278
|
+
return refuse("violated", "GitHub-only: the current repository has no github.com origin remote to appoint");
|
|
279
|
+
}
|
|
280
|
+
if (!cwd.empty) {
|
|
281
|
+
return refuse("violated", "the current directory is not empty and is not a GitHub repository; run from the repo you want to appoint, or from an empty directory");
|
|
282
|
+
}
|
|
283
|
+
const ownerResult = resolveOwner(observation, host);
|
|
284
|
+
if ("action" in ownerResult)
|
|
285
|
+
return ownerResult;
|
|
286
|
+
if (observation.remoteDefaultHub && observation.remoteDefaultHub.owner === ownerResult.owner) {
|
|
287
|
+
return {
|
|
288
|
+
action: "resume",
|
|
289
|
+
owner: observation.remoteDefaultHub.owner,
|
|
290
|
+
repository: observation.remoteDefaultHub.repository,
|
|
291
|
+
directory: cwd.absolutePath,
|
|
292
|
+
clone: true,
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
if (!observation.ghAvailable) {
|
|
296
|
+
return refuse("indeterminate", "`gh` is required to create a GitHub repository for a new hub");
|
|
297
|
+
}
|
|
298
|
+
if (!observation.advisorVersion) {
|
|
299
|
+
return refuse("indeterminate", `cannot read a public ${ADVISOR_PACKAGE} version from the npm registry`);
|
|
300
|
+
}
|
|
301
|
+
return {
|
|
302
|
+
action: "create",
|
|
303
|
+
owner: ownerResult.owner,
|
|
304
|
+
repository: DEFAULT_REPOSITORY_NAME,
|
|
305
|
+
directory: cwd.absolutePath,
|
|
306
|
+
advisorVersion: observation.advisorVersion,
|
|
307
|
+
};
|
|
308
|
+
}
|
|
309
|
+
function containedPath(root, relativePath) {
|
|
310
|
+
const resolved = resolve(root, relativePath);
|
|
311
|
+
const prefix = root.endsWith(sep) ? root : `${root}${sep}`;
|
|
312
|
+
if (resolved !== root && !resolved.startsWith(prefix)) {
|
|
313
|
+
throw new Error(`refusing to write outside the hub directory: ${relativePath}`);
|
|
314
|
+
}
|
|
315
|
+
return resolved;
|
|
316
|
+
}
|
|
317
|
+
function substitute(contents, plan) {
|
|
318
|
+
return contents
|
|
319
|
+
.replaceAll("__OWNER__", plan.owner)
|
|
320
|
+
.replaceAll("__REPOSITORY_NAME__", plan.repository)
|
|
321
|
+
.replaceAll("__ADVISOR_VERSION__", plan.advisorVersion ?? "0.0.0");
|
|
322
|
+
}
|
|
323
|
+
function writeSkeletonFile(host, directory, relativePath, contents) {
|
|
324
|
+
const target = containedPath(directory, relativePath);
|
|
325
|
+
host.mkdirp(dirname(target));
|
|
326
|
+
host.writeText(target, contents);
|
|
327
|
+
}
|
|
328
|
+
function pinString(value) {
|
|
329
|
+
return typeof value === "string" && value.trim() !== "" ? value.trim() : undefined;
|
|
330
|
+
}
|
|
331
|
+
function clossysNames(bucket, extra) {
|
|
332
|
+
if (!isRecord(bucket))
|
|
333
|
+
return undefined;
|
|
334
|
+
let advisor;
|
|
335
|
+
for (const [name, version] of Object.entries(bucket)) {
|
|
336
|
+
if (name === ADVISOR_PACKAGE) {
|
|
337
|
+
advisor = pinString(version);
|
|
338
|
+
continue;
|
|
339
|
+
}
|
|
340
|
+
if (name.startsWith("@clossys/"))
|
|
341
|
+
extra.add(name);
|
|
342
|
+
}
|
|
343
|
+
return advisor;
|
|
344
|
+
}
|
|
345
|
+
/** Leaves an existing Advisor pin in whichever bucket it already occupies. */
|
|
346
|
+
function mergeAdvisorPin(host, directory, skeletonRoot, advisorVersion, repository) {
|
|
347
|
+
const path = join(directory, "package.json");
|
|
348
|
+
const raw = host.readText(path);
|
|
349
|
+
if (raw === null) {
|
|
350
|
+
const skeleton = host.readText(join(skeletonRoot, "package.json"));
|
|
351
|
+
if (skeleton === null)
|
|
352
|
+
throw new Error("missing skeleton package.json");
|
|
353
|
+
writeSkeletonFile(host, directory, "package.json", substitute(skeleton, { owner: repository, repository, advisorVersion }));
|
|
354
|
+
return;
|
|
355
|
+
}
|
|
356
|
+
let manifest;
|
|
357
|
+
try {
|
|
358
|
+
const parsed = JSON.parse(raw);
|
|
359
|
+
if (!isRecord(parsed))
|
|
360
|
+
throw new Error("package.json is not an object");
|
|
361
|
+
manifest = parsed;
|
|
362
|
+
}
|
|
363
|
+
catch {
|
|
364
|
+
throw new Error("existing package.json is unreadable JSON");
|
|
365
|
+
}
|
|
366
|
+
const extra = new Set();
|
|
367
|
+
const inDependencies = clossysNames(manifest.dependencies, extra);
|
|
368
|
+
const inDevDependencies = clossysNames(manifest.devDependencies, extra);
|
|
369
|
+
if (inDependencies !== undefined || inDevDependencies !== undefined)
|
|
370
|
+
return;
|
|
371
|
+
const devDependencies = isRecord(manifest.devDependencies) ? { ...manifest.devDependencies } : {};
|
|
372
|
+
devDependencies[ADVISOR_PACKAGE] = advisorVersion;
|
|
373
|
+
manifest.devDependencies = devDependencies;
|
|
374
|
+
host.writeText(path, `${JSON.stringify(manifest, null, 2)}\n`);
|
|
375
|
+
}
|
|
376
|
+
function copySkeleton(host, skeletonRoot, plan) {
|
|
377
|
+
for (const relativePath of SKELETON_FILES) {
|
|
378
|
+
const source = host.readText(join(skeletonRoot, relativePath));
|
|
379
|
+
if (source === null)
|
|
380
|
+
throw new Error(`missing skeleton file ${relativePath}`);
|
|
381
|
+
writeSkeletonFile(host, plan.directory, relativePath, substitute(source, plan));
|
|
382
|
+
}
|
|
383
|
+
writeSkeletonFile(host, plan.directory, "AGENTS.md", CONSUMER_AGENTS_MD);
|
|
384
|
+
writeSkeletonFile(host, plan.directory, "CLAUDE.md", CONSUMER_CLAUDE_MD);
|
|
385
|
+
}
|
|
386
|
+
function adoptHubFiles(host, skeletonRoot, plan) {
|
|
387
|
+
const marker = {
|
|
388
|
+
schemaVersion: 1,
|
|
389
|
+
kind: "account-hub",
|
|
390
|
+
owner: plan.owner,
|
|
391
|
+
repository: `${plan.owner}/${plan.repository}`,
|
|
392
|
+
};
|
|
393
|
+
writeSkeletonFile(host, plan.directory, WORKSPACE_MARKER_REL, `${JSON.stringify(marker, null, 2)}\n`);
|
|
394
|
+
if ("inventorySource" in plan && typeof plan.inventorySource === "string") {
|
|
395
|
+
const raw = host.readText(plan.inventorySource);
|
|
396
|
+
if (raw === null || inspectInventory(raw).status !== "populated") {
|
|
397
|
+
throw new Error("inventory source is not a populated inventory document");
|
|
398
|
+
}
|
|
399
|
+
writeSkeletonFile(host, plan.directory, WORKSPACE_INVENTORY_REL, raw.endsWith("\n") ? raw : `${raw}\n`);
|
|
400
|
+
}
|
|
401
|
+
if (host.readText(join(plan.directory, "AGENTS.md")) === null) {
|
|
402
|
+
writeSkeletonFile(host, plan.directory, "AGENTS.md", CONSUMER_AGENTS_MD);
|
|
403
|
+
}
|
|
404
|
+
if (host.readText(join(plan.directory, "CLAUDE.md")) === null) {
|
|
405
|
+
writeSkeletonFile(host, plan.directory, "CLAUDE.md", CONSUMER_CLAUDE_MD);
|
|
406
|
+
}
|
|
407
|
+
if (host.readText(join(plan.directory, "README.md")) === null) {
|
|
408
|
+
const readme = host.readText(join(skeletonRoot, "README.md"));
|
|
409
|
+
if (readme !== null)
|
|
410
|
+
writeSkeletonFile(host, plan.directory, "README.md", substitute(readme, plan));
|
|
411
|
+
}
|
|
412
|
+
if (host.readText(join(plan.directory, ".gitignore")) === null) {
|
|
413
|
+
const ignore = host.readText(join(skeletonRoot, ".gitignore"));
|
|
414
|
+
if (ignore !== null)
|
|
415
|
+
writeSkeletonFile(host, plan.directory, ".gitignore", ignore);
|
|
416
|
+
}
|
|
417
|
+
mergeAdvisorPin(host, plan.directory, skeletonRoot, plan.advisorVersion, plan.repository);
|
|
418
|
+
}
|
|
419
|
+
function requireZero(result, label) {
|
|
420
|
+
if (result.status !== 0) {
|
|
421
|
+
throw new Error(`${label} failed (${result.status}): ${result.stderr.trim() || result.stdout.trim() || "no output"}`);
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
/** Read-only pin and inventory report. Does not install or uninstall. */
|
|
425
|
+
export function reportHubHealth(host, directory, liveAdvisorVersion) {
|
|
426
|
+
const extra = new Set();
|
|
427
|
+
let dependencies;
|
|
428
|
+
let devDependencies;
|
|
429
|
+
const manifestRaw = host.readText(join(directory, "package.json"));
|
|
430
|
+
if (manifestRaw !== null) {
|
|
431
|
+
try {
|
|
432
|
+
const parsed = JSON.parse(manifestRaw);
|
|
433
|
+
if (isRecord(parsed)) {
|
|
434
|
+
dependencies = clossysNames(parsed.dependencies, extra);
|
|
435
|
+
devDependencies = clossysNames(parsed.devDependencies, extra);
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
catch {
|
|
439
|
+
/* unreadable manifest is reported as missing pins */
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
return {
|
|
443
|
+
marker: readHub(host, directory) === undefined ? "missing" : "present",
|
|
444
|
+
inventory: inspectInventory(host.readText(join(directory, WORKSPACE_INVENTORY_REL))),
|
|
445
|
+
advisorPin: {
|
|
446
|
+
...(dependencies === undefined ? {} : { dependencies }),
|
|
447
|
+
...(devDependencies === undefined ? {} : { devDependencies }),
|
|
448
|
+
...(liveAdvisorVersion === undefined ? {} : { live: liveAdvisorVersion }),
|
|
449
|
+
},
|
|
450
|
+
dualPin: dependencies !== undefined && devDependencies !== undefined,
|
|
451
|
+
extraClossys: [...extra].sort(),
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
export function formatHubHealth(report) {
|
|
455
|
+
const pinParts = [];
|
|
456
|
+
if (report.advisorPin.dependencies !== undefined)
|
|
457
|
+
pinParts.push(`dependencies ${report.advisorPin.dependencies}`);
|
|
458
|
+
if (report.advisorPin.devDependencies !== undefined)
|
|
459
|
+
pinParts.push(`devDependencies ${report.advisorPin.devDependencies}`);
|
|
460
|
+
const pin = pinParts.length === 0 ? "missing" : pinParts.join(" and ");
|
|
461
|
+
const live = report.advisorPin.live === undefined ? "" : `; live ${report.advisorPin.live}`;
|
|
462
|
+
const extra = report.extraClossys.length === 0 ? "none" : report.extraClossys.join(", ");
|
|
463
|
+
const inventory = report.inventory.status === "populated" ? `populated (${report.inventory.count})` : report.inventory.status;
|
|
464
|
+
return [
|
|
465
|
+
`hub marker: ${report.marker}`,
|
|
466
|
+
`inventory: ${inventory}`,
|
|
467
|
+
`advisor pin: ${pin}${live}`,
|
|
468
|
+
`dual pin: ${report.dualPin ? "yes" : "no"}`,
|
|
469
|
+
`extra @clossys/*: ${extra}`,
|
|
470
|
+
`health: ${JSON.stringify(report)}`,
|
|
471
|
+
].join("\n");
|
|
472
|
+
}
|
|
473
|
+
function withHealth(host, directory, headline, liveAdvisorVersion) {
|
|
474
|
+
const health = reportHubHealth(host, directory, liveAdvisorVersion);
|
|
475
|
+
return {
|
|
476
|
+
state: "satisfied",
|
|
477
|
+
message: `${headline}\n${formatHubHealth(health)}`,
|
|
478
|
+
health,
|
|
479
|
+
};
|
|
480
|
+
}
|
|
481
|
+
/** Applies a create, resume, or adopt plan through the host. Resume does not write. */
|
|
482
|
+
export function applyWorkspacePlan(host, plan, skeletonRoot) {
|
|
483
|
+
if (plan.action === "resume") {
|
|
484
|
+
if (plan.clone) {
|
|
485
|
+
requireZero(host.run("gh", ["repo", "clone", `${plan.owner}/${plan.repository}`, plan.directory]), "gh repo clone");
|
|
486
|
+
}
|
|
487
|
+
return withHealth(host, plan.directory, `resumed ${plan.owner}/${plan.repository} as the account hub\nOpen this folder in your coding agent. Advisor stays read-only until you approve a next action.`);
|
|
488
|
+
}
|
|
489
|
+
if (plan.action === "create") {
|
|
490
|
+
copySkeleton(host, skeletonRoot, plan);
|
|
491
|
+
requireZero(host.run("gh", ["repo", "create", `${plan.owner}/${plan.repository}`, "--private", "--source", plan.directory, "--remote", "origin", "--push"], { cwd: plan.directory }), "gh repo create");
|
|
492
|
+
return withHealth(host, plan.directory, `created ${plan.owner}/${plan.repository} as the account hub\nOpen this folder in your coding agent. Advisor stays read-only until you approve a next action.`, plan.advisorVersion);
|
|
493
|
+
}
|
|
494
|
+
adoptHubFiles(host, skeletonRoot, plan);
|
|
495
|
+
return withHealth(host, plan.directory, `appointed ${plan.owner}/${plan.repository} as the account hub\nExisting project files were kept. This hub inventories engagement; it does not install the catalogue into the repo.`, plan.advisorVersion);
|
|
496
|
+
}
|
|
497
|
+
export function skeletonRootFromModule(moduleUrl) {
|
|
498
|
+
return resolve(dirname(fileURLToPath(moduleUrl)), "..", "skeleton");
|
|
499
|
+
}
|
|
500
|
+
//# sourceMappingURL=core.js.map
|
package/dist/core.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
package/dist/host.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAiB,aAAa,EAAE,MAAM,YAAY,CAAC;AAkC/D,kDAAkD;AAClD,wBAAgB,cAAc,CAAC,GAAG,SAAgB,EAAE,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG,aAAa,CAyBvG"}
|
package/dist/host.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, readSync, statSync, writeFileSync } from "node:fs";
|
|
3
|
+
function run(command, args, options) {
|
|
4
|
+
const result = spawnSync(command, [...args], {
|
|
5
|
+
cwd: options?.cwd,
|
|
6
|
+
encoding: "utf8",
|
|
7
|
+
timeout: 60_000,
|
|
8
|
+
maxBuffer: 2_000_000,
|
|
9
|
+
});
|
|
10
|
+
return {
|
|
11
|
+
status: result.status,
|
|
12
|
+
stdout: result.stdout ?? "",
|
|
13
|
+
stderr: result.stderr ?? "",
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function prompt(message, choices) {
|
|
17
|
+
if (!process.stdin.isTTY || !process.stdout.isTTY || choices.length === 0)
|
|
18
|
+
return null;
|
|
19
|
+
process.stdout.write(`${message}\n`);
|
|
20
|
+
for (const [index, choice] of choices.entries())
|
|
21
|
+
process.stdout.write(` ${index + 1}. ${choice}\n`);
|
|
22
|
+
process.stdout.write("Enter a number: ");
|
|
23
|
+
const buffer = Buffer.alloc(256);
|
|
24
|
+
let bytes = 0;
|
|
25
|
+
try {
|
|
26
|
+
bytes = readSync(0, buffer, 0, buffer.length, null);
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const answer = buffer.toString("utf8", 0, bytes).trim();
|
|
32
|
+
const index = Number.parseInt(answer, 10);
|
|
33
|
+
if (!Number.isInteger(index) || index < 1 || index > choices.length)
|
|
34
|
+
return null;
|
|
35
|
+
return choices[index - 1] ?? null;
|
|
36
|
+
}
|
|
37
|
+
/** Node-backed host used by the installed CLI. */
|
|
38
|
+
export function createNodeHost(cwd = process.cwd(), env = process.env) {
|
|
39
|
+
return {
|
|
40
|
+
cwd,
|
|
41
|
+
env,
|
|
42
|
+
isTTY: Boolean(process.stdin.isTTY && process.stdout.isTTY),
|
|
43
|
+
now: () => new Date().toISOString(),
|
|
44
|
+
exists: (path) => existsSync(path),
|
|
45
|
+
isDirectory: (path) => existsSync(path) && statSync(path).isDirectory(),
|
|
46
|
+
readText: (path) => {
|
|
47
|
+
try {
|
|
48
|
+
return readFileSync(path, "utf8");
|
|
49
|
+
}
|
|
50
|
+
catch {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
writeText: (path, contents) => {
|
|
55
|
+
writeFileSync(path, contents, "utf8");
|
|
56
|
+
},
|
|
57
|
+
mkdirp: (path) => {
|
|
58
|
+
mkdirSync(path, { recursive: true });
|
|
59
|
+
},
|
|
60
|
+
readDir: (path) => readdirSync(path),
|
|
61
|
+
run,
|
|
62
|
+
prompt,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=host.js.map
|
package/dist/host.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host.js","sourceRoot":"","sources":["../src/host.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Consumer-owned workspace hub scaffolder: create, resume, or appoint a GitHub repository. */
|
|
2
|
+
export { applyWorkspacePlan, formatHubHealth, inspectInventory, isHubDocument, observeWorkspace, parseGitHubRemote, planWorkspace, reportHubHealth, DEFAULT_REPOSITORY_NAME, WORKSPACE_INVENTORY_REL, WORKSPACE_MARKER_REL, } from "./core.js";
|
|
3
|
+
export type { CommandResult, CwdObservation, HubDocument, HubHealthReport, InventoryObservation, WorkspaceApplyResult, WorkspaceDecision, WorkspaceHost, WorkspaceObservation, WorkspacePlan, WorkspaceRefusal, WorkspaceState, } from "./types.js";
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,WAAW,CAAC;AACnB,YAAY,EACV,aAAa,EACb,cAAc,EACd,WAAW,EACX,eAAe,EACf,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,aAAa,EACb,oBAAoB,EACpB,aAAa,EACb,gBAAgB,EAChB,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
/** Consumer-owned workspace hub scaffolder: create, resume, or appoint a GitHub repository. */
|
|
2
|
+
export { applyWorkspacePlan, formatHubHealth, inspectInventory, isHubDocument, observeWorkspace, parseGitHubRemote, planWorkspace, reportHubHealth, DEFAULT_REPOSITORY_NAME, WORKSPACE_INVENTORY_REL, WORKSPACE_MARKER_REL, } from "./core.js";
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAC/F,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,eAAe,EACf,uBAAuB,EACvB,uBAAuB,EACvB,oBAAoB,GACrB,MAAM,WAAW,CAAC"}
|