@nuomiji/agentbox 0.1.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.
Files changed (108) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +253 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +43 -0
  5. package/dist/cli.js.map +1 -0
  6. package/dist/collector/collector.d.ts +15 -0
  7. package/dist/collector/collector.js +118 -0
  8. package/dist/collector/collector.js.map +1 -0
  9. package/dist/collector/known-layers.d.ts +2 -0
  10. package/dist/collector/known-layers.js +15 -0
  11. package/dist/collector/known-layers.js.map +1 -0
  12. package/dist/collector/probe.d.ts +19 -0
  13. package/dist/collector/probe.js +2 -0
  14. package/dist/collector/probe.js.map +1 -0
  15. package/dist/commands/apply.d.ts +10 -0
  16. package/dist/commands/apply.js +234 -0
  17. package/dist/commands/apply.js.map +1 -0
  18. package/dist/commands/bind.d.ts +8 -0
  19. package/dist/commands/bind.js +78 -0
  20. package/dist/commands/bind.js.map +1 -0
  21. package/dist/commands/collect.d.ts +8 -0
  22. package/dist/commands/collect.js +22 -0
  23. package/dist/commands/collect.js.map +1 -0
  24. package/dist/commands/export.d.ts +6 -0
  25. package/dist/commands/export.js +24 -0
  26. package/dist/commands/export.js.map +1 -0
  27. package/dist/commands/import-simple.d.ts +6 -0
  28. package/dist/commands/import-simple.js +96 -0
  29. package/dist/commands/import-simple.js.map +1 -0
  30. package/dist/commands/import.d.ts +8 -0
  31. package/dist/commands/import.js +108 -0
  32. package/dist/commands/import.js.map +1 -0
  33. package/dist/commands/inspect.d.ts +1 -0
  34. package/dist/commands/inspect.js +21 -0
  35. package/dist/commands/inspect.js.map +1 -0
  36. package/dist/commands/install-skills.d.ts +11 -0
  37. package/dist/commands/install-skills.js +316 -0
  38. package/dist/commands/install-skills.js.map +1 -0
  39. package/dist/commands/pack.d.ts +4 -0
  40. package/dist/commands/pack.js +37 -0
  41. package/dist/commands/pack.js.map +1 -0
  42. package/dist/commands/preview.d.ts +8 -0
  43. package/dist/commands/preview.js +108 -0
  44. package/dist/commands/preview.js.map +1 -0
  45. package/dist/commands/unpack.d.ts +4 -0
  46. package/dist/commands/unpack.js +45 -0
  47. package/dist/commands/unpack.js.map +1 -0
  48. package/dist/core/archive.d.ts +2 -0
  49. package/dist/core/archive.js +46 -0
  50. package/dist/core/archive.js.map +1 -0
  51. package/dist/core/bindings.d.ts +22 -0
  52. package/dist/core/bindings.js +46 -0
  53. package/dist/core/bindings.js.map +1 -0
  54. package/dist/core/env.d.ts +13 -0
  55. package/dist/core/env.js +49 -0
  56. package/dist/core/env.js.map +1 -0
  57. package/dist/core/fs.d.ts +12 -0
  58. package/dist/core/fs.js +233 -0
  59. package/dist/core/fs.js.map +1 -0
  60. package/dist/core/materialize.d.ts +10 -0
  61. package/dist/core/materialize.js +54 -0
  62. package/dist/core/materialize.js.map +1 -0
  63. package/dist/core/redaction.d.ts +25 -0
  64. package/dist/core/redaction.js +184 -0
  65. package/dist/core/redaction.js.map +1 -0
  66. package/dist/core/schemas.d.ts +9 -0
  67. package/dist/core/schemas.js +60 -0
  68. package/dist/core/schemas.js.map +1 -0
  69. package/dist/core/types.d.ts +125 -0
  70. package/dist/core/types.js +2 -0
  71. package/dist/core/types.js.map +1 -0
  72. package/dist/core/yaml.d.ts +1 -0
  73. package/dist/core/yaml.js +8 -0
  74. package/dist/core/yaml.js.map +1 -0
  75. package/dist/import/claude-code.d.ts +3 -0
  76. package/dist/import/claude-code.js +182 -0
  77. package/dist/import/claude-code.js.map +1 -0
  78. package/dist/import/codex.d.ts +3 -0
  79. package/dist/import/codex.js +162 -0
  80. package/dist/import/codex.js.map +1 -0
  81. package/dist/import/compatibility.d.ts +42 -0
  82. package/dist/import/compatibility.js +99 -0
  83. package/dist/import/compatibility.js.map +1 -0
  84. package/dist/import/install-plan.d.ts +43 -0
  85. package/dist/import/install-plan.js +125 -0
  86. package/dist/import/install-plan.js.map +1 -0
  87. package/dist/import/openclaw.d.ts +3 -0
  88. package/dist/import/openclaw.js +128 -0
  89. package/dist/import/openclaw.js.map +1 -0
  90. package/dist/import/portable.d.ts +6 -0
  91. package/dist/import/portable.js +394 -0
  92. package/dist/import/portable.js.map +1 -0
  93. package/dist/import/types.d.ts +21 -0
  94. package/dist/import/types.js +2 -0
  95. package/dist/import/types.js.map +1 -0
  96. package/dist/probes/claude-code.d.ts +9 -0
  97. package/dist/probes/claude-code.js +244 -0
  98. package/dist/probes/claude-code.js.map +1 -0
  99. package/dist/probes/codex.d.ts +10 -0
  100. package/dist/probes/codex.js +219 -0
  101. package/dist/probes/codex.js.map +1 -0
  102. package/dist/probes/cursor.d.ts +9 -0
  103. package/dist/probes/cursor.js +102 -0
  104. package/dist/probes/cursor.js.map +1 -0
  105. package/dist/probes/openclaw.d.ts +9 -0
  106. package/dist/probes/openclaw.js +52 -0
  107. package/dist/probes/openclaw.js.map +1 -0
  108. package/package.json +54 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../src/commands/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function inspectCommand(targetPath: string): Promise<void>;
@@ -0,0 +1,21 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parse } from "yaml";
4
+ export async function inspectCommand(targetPath) {
5
+ const root = path.resolve(targetPath);
6
+ const manifestPath = path.join(root, "box.yaml");
7
+ const resolvedPath = path.join(root, "resolved.yaml");
8
+ const manifest = parse(await readFile(manifestPath, "utf8"));
9
+ const resolved = parse(await readFile(resolvedPath, "utf8"));
10
+ process.stdout.write(`Name: ${manifest.metadata.name}\n`);
11
+ process.stdout.write(`Source host: ${manifest.metadata.sourceHost}\n`);
12
+ process.stdout.write(`Created at: ${manifest.metadata.createdAt}\n`);
13
+ process.stdout.write(`Suggested targets: ${manifest.compatibility.suggestedTargets.join(", ")}\n`);
14
+ process.stdout.write(`Bindings: ${resolved.bindings.length}\n`);
15
+ process.stdout.write(`Host artifacts: ${resolved.hostArtifacts.length}\n`);
16
+ process.stdout.write(`Enabled layer files:\n`);
17
+ for (const [layerName, layerRef] of Object.entries(manifest.layers)) {
18
+ process.stdout.write(`- ${layerName}: ${layerRef.path} (${layerRef.portability})\n`);
19
+ }
20
+ }
21
+ //# sourceMappingURL=inspect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inspect.js","sourceRoot":"","sources":["../../src/commands/inspect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAG7B,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,UAAkB;IACrD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACjD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,CAAC;IAEtD,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAgB,CAAC;IAC5E,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAqB,CAAC;IAEjF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,QAAQ,CAAC,QAAQ,CAAC,UAAU,IAAI,CAAC,CAAC;IACvE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,eAAe,QAAQ,CAAC,QAAQ,CAAC,SAAS,IAAI,CAAC,CAAC;IACrE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,QAAQ,CAAC,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,QAAQ,CAAC,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IAChE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,QAAQ,CAAC,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC;IAC3E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAE/C,KAAK,MAAM,CAAC,SAAS,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACpE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,SAAS,KAAK,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,WAAW,KAAK,CAAC,CAAC;IACvF,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { InstallScope } from "../core/materialize.js";
2
+ export interface InstallSkillsCommandOptions {
3
+ execute?: boolean;
4
+ targetRoot?: string;
5
+ realHome?: boolean;
6
+ projectRoot?: string;
7
+ scope?: InstallScope;
8
+ force?: boolean;
9
+ only?: string[];
10
+ }
11
+ export declare function installSkillsCommand(inputPath: string, options: InstallSkillsCommandOptions): Promise<void>;
@@ -0,0 +1,316 @@
1
+ import { cp, mkdir, mkdtemp, readFile, rm, stat, symlink, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { tmpdir } from "node:os";
4
+ import { spawn } from "node:child_process";
5
+ import { parse } from "yaml";
6
+ import { describeMaterializationMode, getDefaultInstallScope, resolvePortablePath } from "../core/materialize.js";
7
+ import { pathExists } from "../core/fs.js";
8
+ import { toYaml } from "../core/yaml.js";
9
+ import { resolveSkillTargetStrategy } from "../import/install-plan.js";
10
+ export async function installSkillsCommand(inputPath, options) {
11
+ const planPath = await resolvePlanPath(inputPath);
12
+ const parsedPlan = parse(await readFile(planPath, "utf8"));
13
+ const scope = options.scope ?? parsedPlan.scope ?? getDefaultInstallScope(parsedPlan.targetHost);
14
+ const plan = withScopeOverride(parsedPlan, scope);
15
+ const selectedEntries = selectEntries(plan.entries, options.only ?? []);
16
+ const resolutionContext = getResolutionContext(planPath, options);
17
+ validateResolutionContext(resolutionContext, options.execute === true);
18
+ if (selectedEntries.length === 0) {
19
+ throw new Error("No matching skill entries were found in the install plan.");
20
+ }
21
+ if (!options.execute) {
22
+ printDryRun(planPath, plan, selectedEntries, resolutionContext);
23
+ return;
24
+ }
25
+ const reportRoot = getReportRoot(planPath, resolutionContext);
26
+ await mkdir(reportRoot, { recursive: true });
27
+ const reportEntries = [];
28
+ for (const entry of selectedEntries) {
29
+ const reportEntry = await installSkillEntry(entry, resolutionContext, options.force === true);
30
+ reportEntries.push(reportEntry);
31
+ }
32
+ const report = {
33
+ apiVersion: "agentbox/v0.1",
34
+ kind: "SkillInstallReport",
35
+ planPath,
36
+ executed: true,
37
+ targetRoot: reportRoot,
38
+ installedCount: reportEntries.filter((entry) => entry.status === "installed").length,
39
+ skippedCount: reportEntries.filter((entry) => entry.status === "skipped").length,
40
+ entries: reportEntries
41
+ };
42
+ const reportPath = path.join(reportRoot, "agentbox-skill-install-report.yaml");
43
+ await writeFile(reportPath, toYaml(report), "utf8");
44
+ const activationMapPath = path.join(reportRoot, "agentbox-skill-activation-map.yaml");
45
+ await writeFile(activationMapPath, toYaml(buildActivationMap(reportRoot, selectedEntries, reportEntries)), "utf8");
46
+ process.stdout.write(`Skill install plan executed: ${planPath}\n`);
47
+ process.stdout.write(`Target scope: ${scope}\n`);
48
+ process.stdout.write(`Mode: ${describeMaterializationMode(resolutionContext)}\n`);
49
+ process.stdout.write(`Installed: ${report.installedCount}\n`);
50
+ process.stdout.write(`Skipped: ${report.skippedCount}\n`);
51
+ process.stdout.write(`Report: ${reportPath}\n`);
52
+ process.stdout.write(`Activation map: ${activationMapPath}\n`);
53
+ const failedEntries = reportEntries.filter((entry) => entry.status === "failed");
54
+ if (failedEntries.length > 0) {
55
+ throw new Error(`Skill installation failed for: ${failedEntries.map((entry) => entry.skillName).join(", ")}`);
56
+ }
57
+ }
58
+ async function resolvePlanPath(inputPath) {
59
+ const resolved = path.resolve(inputPath);
60
+ const info = await stat(resolved);
61
+ if (info.isFile()) {
62
+ return resolved;
63
+ }
64
+ const candidates = [
65
+ path.join(resolved, "skill-install-plan.yaml"),
66
+ path.join(resolved, "agentbox-skill-install-plan.yaml")
67
+ ];
68
+ for (const candidate of candidates) {
69
+ if (await pathExists(candidate)) {
70
+ return candidate;
71
+ }
72
+ }
73
+ throw new Error(`No skill install plan was found under: ${resolved}`);
74
+ }
75
+ function selectEntries(entries, only) {
76
+ if (only.length === 0) {
77
+ return entries;
78
+ }
79
+ const allowed = new Set(only);
80
+ return entries.filter((entry) => allowed.has(entry.skillName));
81
+ }
82
+ function printDryRun(planPath, plan, entries, resolutionContext) {
83
+ process.stdout.write(`Skill install dry-run: ${planPath}\n`);
84
+ process.stdout.write(`Source host: ${plan.sourceHost}\n`);
85
+ process.stdout.write(`Target host: ${plan.targetHost}\n`);
86
+ process.stdout.write(`Target scope: ${plan.scope}\n`);
87
+ process.stdout.write(`Mode: ${describeMaterializationMode(resolutionContext)}\n`);
88
+ for (const entry of entries) {
89
+ process.stdout.write(`- ${entry.skillName}: ${entry.installStrategy}\n`);
90
+ process.stdout.write(` source: ${entry.source.sourceUrl ?? "(manual)"}\n`);
91
+ process.stdout.write(` target folder: ${resolvePortablePath(path.join(entry.target.downloadRoot, entry.target.targetFolderName), resolutionContext)}\n`);
92
+ }
93
+ process.stdout.write("Use --execute to materialize these skills.\n");
94
+ }
95
+ async function installSkillEntry(entry, resolutionContext, force) {
96
+ const notes = [...entry.notes];
97
+ const downloadRoot = resolvePortablePath(entry.target.downloadRoot, resolutionContext);
98
+ const activationRoot = resolvePortablePath(entry.target.activationRoot, resolutionContext);
99
+ const destinationPath = path.join(downloadRoot, entry.target.targetFolderName);
100
+ if (entry.status === "manual-review" || entry.installStrategy === "manual" || !entry.source.sourceUrl) {
101
+ notes.push("Skipped automatic installation because this skill requires manual review.");
102
+ return {
103
+ skillName: entry.skillName,
104
+ status: "skipped",
105
+ destination: destinationPath,
106
+ activationRoot,
107
+ activationPath: null,
108
+ activationStatus: "not-applicable",
109
+ notes
110
+ };
111
+ }
112
+ if ((await pathExists(destinationPath)) && !force) {
113
+ notes.push("Skipped because destination already exists. Re-run with --force to replace it.");
114
+ return {
115
+ skillName: entry.skillName,
116
+ status: "skipped",
117
+ destination: destinationPath,
118
+ activationRoot,
119
+ activationPath: path.join(activationRoot, entry.target.targetFolderName),
120
+ activationStatus: "not-applicable",
121
+ notes
122
+ };
123
+ }
124
+ const tempRoot = await mkdtemp(path.join(tmpdir(), "agentbox-skill-"));
125
+ const cloneDir = path.join(tempRoot, "repo");
126
+ try {
127
+ await runGitClone(entry.source.sourceUrl, cloneDir);
128
+ const skillSourceDir = resolveSkillSourceDir(cloneDir, entry.source.skillPath);
129
+ if (!(await pathExists(skillSourceDir))) {
130
+ throw new Error(`Skill path not found after clone: ${skillSourceDir}`);
131
+ }
132
+ if (await pathExists(destinationPath)) {
133
+ await rm(destinationPath, { recursive: true, force: true });
134
+ }
135
+ await mkdir(downloadRoot, { recursive: true });
136
+ await cp(skillSourceDir, destinationPath, { recursive: true });
137
+ const activation = await activateInstalledSkill(entry, destinationPath, activationRoot, force);
138
+ notes.push(...activation.notes);
139
+ if (entry.source.expectedHash) {
140
+ notes.push(`Expected skill hash preserved for later verification: ${entry.source.expectedHash}`);
141
+ }
142
+ return {
143
+ skillName: entry.skillName,
144
+ status: "installed",
145
+ destination: destinationPath,
146
+ activationRoot,
147
+ activationPath: activation.activationPath,
148
+ activationStatus: activation.activationStatus,
149
+ notes
150
+ };
151
+ }
152
+ catch (error) {
153
+ notes.push(error instanceof Error ? error.message : String(error));
154
+ return {
155
+ skillName: entry.skillName,
156
+ status: "failed",
157
+ destination: destinationPath,
158
+ activationRoot,
159
+ activationPath: path.join(activationRoot, entry.target.targetFolderName),
160
+ activationStatus: "failed",
161
+ notes
162
+ };
163
+ }
164
+ finally {
165
+ await rm(tempRoot, { recursive: true, force: true });
166
+ }
167
+ }
168
+ async function activateInstalledSkill(entry, destinationPath, activationRoot, force) {
169
+ const notes = [];
170
+ if (entry.target.activationMode === "workspace-local" || samePath(activationRoot, path.dirname(destinationPath))) {
171
+ await mkdir(activationRoot, { recursive: true });
172
+ notes.push(`Skill is already installed in activation scope at ${destinationPath}.`);
173
+ return {
174
+ activationPath: destinationPath,
175
+ activationStatus: entry.target.activationMode === "workspace-local" ? "copied" : "reserved",
176
+ notes
177
+ };
178
+ }
179
+ const activationPath = path.join(activationRoot, entry.target.targetFolderName);
180
+ await mkdir(activationRoot, { recursive: true });
181
+ if (await pathExists(activationPath)) {
182
+ if (!force) {
183
+ notes.push(`Activation path already exists at ${activationPath}; preserving existing host-visible entry.`);
184
+ return {
185
+ activationPath,
186
+ activationStatus: "reserved",
187
+ notes
188
+ };
189
+ }
190
+ await rm(activationPath, { recursive: true, force: true });
191
+ }
192
+ try {
193
+ const linkType = process.platform === "win32" ? "junction" : "dir";
194
+ await symlink(destinationPath, activationPath, linkType);
195
+ notes.push(`Created host-visible skill link at ${activationPath}.`);
196
+ return {
197
+ activationPath,
198
+ activationStatus: "linked",
199
+ notes
200
+ };
201
+ }
202
+ catch (error) {
203
+ await cp(destinationPath, activationPath, { recursive: true });
204
+ notes.push(`Link creation failed, so AgentBox copied the skill into the activation root instead: ${error instanceof Error ? error.message : String(error)}`);
205
+ return {
206
+ activationPath,
207
+ activationStatus: "copied",
208
+ notes
209
+ };
210
+ }
211
+ }
212
+ function resolveSkillSourceDir(repoRoot, skillPath) {
213
+ if (!skillPath) {
214
+ return repoRoot;
215
+ }
216
+ const normalized = skillPath.replace(/[\\/]+/g, path.sep);
217
+ const folder = path.dirname(normalized);
218
+ if (folder === "." || folder === "") {
219
+ return repoRoot;
220
+ }
221
+ return path.join(repoRoot, folder);
222
+ }
223
+ async function runGitClone(sourceUrl, destination) {
224
+ await mkdir(path.dirname(destination), { recursive: true });
225
+ await new Promise((resolve, reject) => {
226
+ const child = spawn("git", ["clone", "--depth", "1", sourceUrl, destination], {
227
+ stdio: ["ignore", "pipe", "pipe"]
228
+ });
229
+ let stderr = "";
230
+ child.stderr.on("data", (chunk) => {
231
+ stderr += String(chunk);
232
+ });
233
+ child.on("error", reject);
234
+ child.on("close", (code) => {
235
+ if (code === 0) {
236
+ resolve();
237
+ return;
238
+ }
239
+ reject(new Error(stderr.trim() || `git clone failed with exit code ${code}`));
240
+ });
241
+ });
242
+ }
243
+ function buildActivationMap(targetRoot, selectedEntries, reportEntries) {
244
+ const reportBySkill = new Map(reportEntries.map((entry) => [entry.skillName, entry]));
245
+ return {
246
+ apiVersion: "agentbox/v0.1",
247
+ kind: "SkillActivationMap",
248
+ targetRoot,
249
+ entries: selectedEntries.map((planEntry) => {
250
+ const reportEntry = reportBySkill.get(planEntry.skillName);
251
+ return {
252
+ skillName: planEntry.skillName,
253
+ activationMode: planEntry.target.activationMode,
254
+ sourcePath: reportEntry?.destination ?? null,
255
+ activationRoot: reportEntry?.activationRoot ?? null,
256
+ activationPath: reportEntry?.activationPath ?? null,
257
+ activationStatus: reportEntry?.activationStatus ?? "not-applicable"
258
+ };
259
+ })
260
+ };
261
+ }
262
+ function samePath(left, right) {
263
+ const normalizedLeft = path.resolve(left);
264
+ const normalizedRight = path.resolve(right);
265
+ return process.platform === "win32"
266
+ ? normalizedLeft.toLowerCase() === normalizedRight.toLowerCase()
267
+ : normalizedLeft === normalizedRight;
268
+ }
269
+ function withScopeOverride(plan, scope) {
270
+ if (plan.scope === scope) {
271
+ return plan;
272
+ }
273
+ const targetStrategy = resolveSkillTargetStrategy(plan.targetHost, scope);
274
+ return {
275
+ ...plan,
276
+ scope,
277
+ targetStrategy,
278
+ entries: plan.entries.map((entry) => ({
279
+ ...entry,
280
+ target: {
281
+ ...entry.target,
282
+ scope,
283
+ downloadRoot: targetStrategy.downloadRoot,
284
+ activationRoot: targetStrategy.activationRoot,
285
+ activationMode: targetStrategy.activationMode
286
+ }
287
+ }))
288
+ };
289
+ }
290
+ function getResolutionContext(planPath, options) {
291
+ if (options.realHome) {
292
+ return {
293
+ mode: "real-home",
294
+ projectRoot: options.projectRoot
295
+ };
296
+ }
297
+ return {
298
+ mode: "sandbox",
299
+ targetRoot: options.targetRoot ?? path.join(path.dirname(planPath), "installed-skills")
300
+ };
301
+ }
302
+ function validateResolutionContext(context, isExecute) {
303
+ if (!isExecute) {
304
+ return;
305
+ }
306
+ if (context.mode === "real-home" && !context.projectRoot) {
307
+ process.stdout.write("Real-home install will use only user-scope paths unless a project root is provided.\n");
308
+ }
309
+ }
310
+ function getReportRoot(planPath, context) {
311
+ if (context.mode === "sandbox") {
312
+ return path.resolve(context.targetRoot ?? path.join(path.dirname(planPath), "installed-skills"));
313
+ }
314
+ return path.join(path.dirname(planPath), "real-home-install-report");
315
+ }
316
+ //# sourceMappingURL=install-skills.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install-skills.js","sourceRoot":"","sources":["../../src/commands/install-skills.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export interface PackCommandOptions {
2
+ output?: string;
3
+ }
4
+ export declare function packCommand(snapshotPath: string, options: PackCommandOptions): Promise<void>;
@@ -0,0 +1,37 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parse } from "yaml";
4
+ import { createArchiveFromDirectory } from "../core/archive.js";
5
+ import { pathExists } from "../core/fs.js";
6
+ export async function packCommand(snapshotPath, options) {
7
+ const inputDir = path.resolve(snapshotPath);
8
+ await assertSnapshotDirectory(inputDir);
9
+ const manifest = await readManifest(inputDir);
10
+ const outputFile = resolveOutputFile(inputDir, manifest, options.output);
11
+ await createArchiveFromDirectory(inputDir, outputFile);
12
+ process.stdout.write(`Packed snapshot: ${inputDir}\n`);
13
+ process.stdout.write(`Bundle written to: ${outputFile}\n`);
14
+ }
15
+ async function assertSnapshotDirectory(inputDir) {
16
+ const requiredFiles = ["box.yaml", "resolved.yaml", "sources.yaml"];
17
+ for (const filename of requiredFiles) {
18
+ const exists = await pathExists(path.join(inputDir, filename));
19
+ if (!exists) {
20
+ throw new Error(`Missing required snapshot file: ${filename}`);
21
+ }
22
+ }
23
+ }
24
+ async function readManifest(inputDir) {
25
+ const manifestPath = path.join(inputDir, "box.yaml");
26
+ const raw = await readFile(manifestPath, "utf8");
27
+ return parse(raw);
28
+ }
29
+ function resolveOutputFile(inputDir, manifest, requestedOutput) {
30
+ if (requestedOutput) {
31
+ const resolved = path.resolve(requestedOutput);
32
+ return resolved.endsWith(".agentbox") ? resolved : `${resolved}.agentbox`;
33
+ }
34
+ const safeName = manifest.metadata.name.replace(/[^a-zA-Z0-9._-]+/g, "-");
35
+ return path.join(path.dirname(inputDir), `${safeName}.agentbox`);
36
+ }
37
+ //# sourceMappingURL=pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/commands/pack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,0BAA0B,EAAE,MAAM,oBAAoB,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAO3C,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,YAAoB,EAAE,OAA2B;IACjF,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5C,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACzE,MAAM,0BAA0B,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IAEvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,QAAQ,IAAI,CAAC,CAAC;IACvD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,UAAU,IAAI,CAAC,CAAC;AAC7D,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,QAAgB;IACrD,MAAM,aAAa,GAAG,CAAC,UAAU,EAAE,eAAe,EAAE,cAAc,CAAC,CAAC;IACpE,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,EAAE,CAAC,CAAC;QACjE,CAAC;IACH,CAAC;AACH,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACjD,OAAO,KAAK,CAAC,GAAG,CAAgB,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CAAC,QAAgB,EAAE,QAAqB,EAAE,eAAwB;IAC1F,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;QAC/C,OAAO,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,WAAW,CAAC;IAC5E,CAAC;IAED,MAAM,QAAQ,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,GAAG,CAAC,CAAC;IAC1E,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,GAAG,QAAQ,WAAW,CAAC,CAAC;AACnE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { InstallScope } from "../core/materialize.js";
2
+ import type { SupportedHost } from "../core/types.js";
3
+ export interface PreviewCommandOptions {
4
+ host: SupportedHost;
5
+ output?: string;
6
+ scope?: InstallScope;
7
+ }
8
+ export declare function previewCommand(stagingPath: string, options: PreviewCommandOptions): Promise<void>;
@@ -0,0 +1,108 @@
1
+ import { mkdir, readFile, writeFile } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { parse } from "yaml";
4
+ import { resolveBindings } from "../core/bindings.js";
5
+ import { parseEnvObject } from "../core/env.js";
6
+ import { pathExists } from "../core/fs.js";
7
+ import { toYaml } from "../core/yaml.js";
8
+ import { buildCompatibilityReport } from "../import/compatibility.js";
9
+ import { generateClaudeCodePreview } from "../import/claude-code.js";
10
+ import { generateCodexPreview } from "../import/codex.js";
11
+ import { buildSkillInstallPlan } from "../import/install-plan.js";
12
+ import { generateOpenClawPreview } from "../import/openclaw.js";
13
+ export async function previewCommand(stagingPath, options) {
14
+ const root = path.resolve(stagingPath);
15
+ const resolvedPath = path.join(root, "resolved.yaml");
16
+ const bindingsPath = path.join(root, "bindings.env");
17
+ if (!(await pathExists(resolvedPath))) {
18
+ throw new Error(`resolved.yaml not found in: ${root}`);
19
+ }
20
+ const resolved = parse(await readFile(resolvedPath, "utf8"));
21
+ const bindings = (await pathExists(bindingsPath))
22
+ ? parseEnvObject(await readFile(bindingsPath, "utf8"))
23
+ : {};
24
+ const outputDir = path.resolve(options.output ?? path.join(root, "import-preview"));
25
+ await mkdir(outputDir, { recursive: true });
26
+ const context = {
27
+ sourceHost: resolved.host.id,
28
+ targetHost: options.host,
29
+ bindings
30
+ };
31
+ const result = await generatePreviewForTarget(outputDir, resolved, context);
32
+ const bindingResolution = resolveBindings(resolved.bindings, resolvedBindingsTemplate(resolved), [
33
+ {
34
+ kind: "explicit",
35
+ name: "bindings.env",
36
+ values: bindings
37
+ }
38
+ ]);
39
+ const skillInstallPlan = buildSkillInstallPlan(resolved, context.sourceHost, context.targetHost, {
40
+ scope: options.scope
41
+ });
42
+ const skillInstallPlanPath = path.join(outputDir, "skill-install-plan.yaml");
43
+ await writeFile(skillInstallPlanPath, toYaml(skillInstallPlan), "utf8");
44
+ const compatibilityReport = buildCompatibilityReport({
45
+ resolved,
46
+ sourceHost: context.sourceHost,
47
+ targetHost: context.targetHost,
48
+ bindingResolution,
49
+ preview: result,
50
+ skillInstallPlan
51
+ });
52
+ const compatibilityReportPath = path.join(outputDir, "compatibility-report.yaml");
53
+ await writeFile(compatibilityReportPath, toYaml(compatibilityReport), "utf8");
54
+ const generatedFiles = [...result.generatedFiles, skillInstallPlanPath, compatibilityReportPath];
55
+ const warnings = [...new Set([...result.warnings, ...skillInstallPlan.warnings, ...compatibilityReport.warnings])];
56
+ const planEntries = [
57
+ ...result.plan,
58
+ {
59
+ sourceLayer: "skills",
60
+ targetPath: skillInstallPlanPath,
61
+ action: "create-preview",
62
+ risk: "low",
63
+ notes: ["Portable skill reconstruction plan with source URLs, expected hashes, and target host install hints."]
64
+ },
65
+ {
66
+ sourceLayer: "bindings, compatibility",
67
+ targetPath: compatibilityReportPath,
68
+ action: "create-preview",
69
+ risk: "low",
70
+ notes: ["Compatibility summary covering binding readiness, manual migration steps, and blocked layers."]
71
+ }
72
+ ];
73
+ await writeFile(path.join(outputDir, "import-report.yaml"), toYaml({
74
+ sourceHost: context.sourceHost,
75
+ targetHost: result.targetHost,
76
+ targetScope: skillInstallPlan.scope,
77
+ generatedFiles,
78
+ warnings
79
+ }), "utf8");
80
+ await writeFile(path.join(outputDir, "write-plan.yaml"), toYaml({
81
+ sourceHost: context.sourceHost,
82
+ targetHost: result.targetHost,
83
+ targetScope: skillInstallPlan.scope,
84
+ mode: "preview-only",
85
+ entries: planEntries,
86
+ warnings
87
+ }), "utf8");
88
+ process.stdout.write(`Import preview generated for host: ${options.host}\n`);
89
+ process.stdout.write(`Preview directory: ${result.outputDir}\n`);
90
+ process.stdout.write(`Generated files: ${generatedFiles.length}\n`);
91
+ process.stdout.write(`Warnings: ${warnings.length}\n`);
92
+ }
93
+ function resolvedBindingsTemplate(resolved) {
94
+ return Object.fromEntries(resolved.bindings.map((binding) => [binding.key, ""]));
95
+ }
96
+ async function generatePreviewForTarget(outputDir, resolved, context) {
97
+ if (context.targetHost === "codex") {
98
+ return generateCodexPreview(outputDir, resolved, context);
99
+ }
100
+ if (context.targetHost === "claude-code") {
101
+ return generateClaudeCodePreview(outputDir, resolved, context);
102
+ }
103
+ if (context.targetHost === "openclaw") {
104
+ return generateOpenClawPreview(outputDir, resolved, context);
105
+ }
106
+ throw new Error(`Import preview target is not implemented yet: ${context.targetHost}`);
107
+ }
108
+ //# sourceMappingURL=preview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export interface UnpackCommandOptions {
2
+ output?: string;
3
+ }
4
+ export declare function unpackCommand(bundlePath: string, options: UnpackCommandOptions): Promise<void>;
@@ -0,0 +1,45 @@
1
+ import path from "node:path";
2
+ import { extractArchiveToDirectory } from "../core/archive.js";
3
+ import { pathExists } from "../core/fs.js";
4
+ export async function unpackCommand(bundlePath, options) {
5
+ const inputFile = path.resolve(bundlePath);
6
+ const outputDir = resolveOutputDir(inputFile, options.output);
7
+ if (!(await pathExists(inputFile))) {
8
+ throw new Error(`Bundle not found: ${inputFile}`);
9
+ }
10
+ await extractArchiveToDirectory(inputFile, outputDir);
11
+ await assertExtractedSnapshot(outputDir);
12
+ process.stdout.write(`Unpacked bundle: ${inputFile}\n`);
13
+ process.stdout.write(`Staging directory: ${outputDir}\n`);
14
+ }
15
+ function resolveOutputDir(inputFile, requestedOutput) {
16
+ if (requestedOutput) {
17
+ return path.resolve(requestedOutput);
18
+ }
19
+ const parsed = path.parse(inputFile);
20
+ const baseName = parsed.ext === ".agentbox" ? parsed.name : parsed.base;
21
+ return path.join(parsed.dir, `${baseName}.unpacked`);
22
+ }
23
+ async function assertExtractedSnapshot(outputDir) {
24
+ const requiredFiles = [
25
+ "box.yaml",
26
+ "resolved.yaml",
27
+ "sources.yaml",
28
+ "bindings.template.env"
29
+ ];
30
+ for (const filename of requiredFiles) {
31
+ const exists = await pathExists(path.join(outputDir, filename));
32
+ if (!exists) {
33
+ throw new Error(`Unpacked bundle is missing required file: ${filename}`);
34
+ }
35
+ }
36
+ const layersDir = path.join(outputDir, "layers");
37
+ const metaDir = path.join(outputDir, "meta");
38
+ if (!(await pathExists(layersDir))) {
39
+ throw new Error("Unpacked bundle is missing layers directory.");
40
+ }
41
+ if (!(await pathExists(metaDir))) {
42
+ throw new Error("Unpacked bundle is missing meta directory.");
43
+ }
44
+ }
45
+ //# sourceMappingURL=unpack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpack.js","sourceRoot":"","sources":["../../src/commands/unpack.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAM3C,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAAkB,EAAE,OAA6B;IACnF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC3C,MAAM,SAAS,GAAG,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IAE9D,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,yBAAyB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAEzC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,oBAAoB,SAAS,IAAI,CAAC,CAAC;IACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,SAAS,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,gBAAgB,CAAC,SAAiB,EAAE,eAAwB;IACnE,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACvC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACrC,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC;IACxE,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,QAAQ,WAAW,CAAC,CAAC;AACvD,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,SAAiB;IACtD,MAAM,aAAa,GAAG;QACpB,UAAU;QACV,eAAe;QACf,cAAc;QACd,uBAAuB;KACxB,CAAC;IAEF,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,6CAA6C,QAAQ,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IACD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAChE,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function createArchiveFromDirectory(inputDir: string, outputFile: string): Promise<void>;
2
+ export declare function extractArchiveToDirectory(inputFile: string, outputDir: string): Promise<void>;