@tacuchi/agent-workflow-cli 25.9.0 → 26.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +1 -2
  3. package/dist/application/capability/design-handler.js +94 -0
  4. package/dist/application/capability/design-handler.js.map +1 -1
  5. package/dist/application/capability/dispatcher.js +178 -18
  6. package/dist/application/capability/dispatcher.js.map +1 -1
  7. package/dist/application/capability/durable-effect.js.map +1 -1
  8. package/dist/application/capability/readiness.js +8 -54
  9. package/dist/application/capability/readiness.js.map +1 -1
  10. package/dist/application/capability/resolution.js +124 -192
  11. package/dist/application/capability/resolution.js.map +1 -1
  12. package/dist/application/doctor/prepare.js +0 -3
  13. package/dist/application/doctor/prepare.js.map +1 -1
  14. package/dist/application/doctor/provider-skills.js +21 -132
  15. package/dist/application/doctor/provider-skills.js.map +1 -1
  16. package/dist/application/doctor/repair-runner.js +0 -47
  17. package/dist/application/doctor/repair-runner.js.map +1 -1
  18. package/dist/application/flow/submit.js +1 -1
  19. package/dist/application/flow/submit.js.map +1 -1
  20. package/dist/application/plan-lint-service.js +31 -5
  21. package/dist/application/plan-lint-service.js.map +1 -1
  22. package/dist/application/retirement/attribution.js +1 -2
  23. package/dist/application/retirement/attribution.js.map +1 -1
  24. package/dist/application/self/clean-legacy.js +1 -2
  25. package/dist/application/self/clean-legacy.js.map +1 -1
  26. package/dist/application/self/install-skill.js +5 -49
  27. package/dist/application/self/install-skill.js.map +1 -1
  28. package/dist/application/self/skill-files.js +29 -0
  29. package/dist/application/self/skill-files.js.map +1 -0
  30. package/dist/application/skills-resolver-service.js +5 -91
  31. package/dist/application/skills-resolver-service.js.map +1 -1
  32. package/dist/application/source-boundary-policy.js +10 -2
  33. package/dist/application/source-boundary-policy.js.map +1 -1
  34. package/dist/cli/commands/capability.js +12 -4
  35. package/dist/cli/commands/capability.js.map +1 -1
  36. package/dist/cli/commands/index.js +0 -4
  37. package/dist/cli/commands/index.js.map +1 -1
  38. package/dist/cli/commands/self.js +1 -22
  39. package/dist/cli/commands/self.js.map +1 -1
  40. package/dist/cli/commands/skills.js +4 -11
  41. package/dist/cli/commands/skills.js.map +1 -1
  42. package/dist/cli/help-groups.js +1 -3
  43. package/dist/cli/help-groups.js.map +1 -1
  44. package/dist/cli/tui/app.js +2 -3
  45. package/dist/cli/tui/app.js.map +1 -1
  46. package/dist/cli/tui/components/host-admin-section.js +2 -13
  47. package/dist/cli/tui/components/host-admin-section.js.map +1 -1
  48. package/dist/cli/tui/components/tabs-config.js +1 -2
  49. package/dist/cli/tui/components/tabs-config.js.map +1 -1
  50. package/dist/cli/tui/tui-prefs.js +2 -0
  51. package/dist/cli/tui/tui-prefs.js.map +1 -1
  52. package/dist/dist-manifest.json +60 -204
  53. package/dist/domain/capability/protocol.js +3 -1
  54. package/dist/domain/capability/protocol.js.map +1 -1
  55. package/dist/domain/doctor/operations.js +0 -18
  56. package/dist/domain/doctor/operations.js.map +1 -1
  57. package/dist/domain/flow/authority.js +1 -3
  58. package/dist/domain/flow/authority.js.map +1 -1
  59. package/dist/domain/skills.js +2 -6
  60. package/dist/domain/skills.js.map +1 -1
  61. package/package.json +2 -2
  62. package/skills/w/SKILL.md +9 -16
  63. package/skills/w/exports/README.md +4 -4
  64. package/skills/w/exports/export-diagrams/EXPORT.md +1 -1
  65. package/skills/w/exports/export-scripts/EXPORT.md +1 -1
  66. package/skills/w/harness/HARNESS.md +2 -5
  67. package/skills/w/loops/CHASSIS.md +1 -1
  68. package/skills/w/loops/CODE-POLICIES.md +1 -1
  69. package/skills/w/loops/README.md +2 -2
  70. package/skills/w/loops/quick-loop/LOOP.md +1 -1
  71. package/skills/w/loops/spec-refine-loop/LOOP.md +1 -1
  72. package/skills/w/roles/README.md +11 -47
  73. package/skills/w/roles/design/ROLE.md +3 -1
  74. package/skills/w/roles/diagrams/ROLE.md +1 -1
  75. package/skills/w/roles/git/ROLE.md +1 -1
  76. package/skills/w/roles/research/ROLE.md +1 -1
  77. package/skills/w/roles/sql/ROLE.md +1 -1
  78. package/dist/application/capability/descriptor-loader.js +0 -109
  79. package/dist/application/capability/descriptor-loader.js.map +0 -1
  80. package/dist/application/capability/installed-inventory.js +0 -168
  81. package/dist/application/capability/installed-inventory.js.map +0 -1
  82. package/dist/application/doctor/skills-toml-migrate.js +0 -76
  83. package/dist/application/doctor/skills-toml-migrate.js.map +0 -1
  84. package/dist/application/self/install-plugin-skills-git.js +0 -226
  85. package/dist/application/self/install-plugin-skills-git.js.map +0 -1
  86. package/dist/application/self/install-plugin-skills.js +0 -203
  87. package/dist/application/self/install-plugin-skills.js.map +0 -1
  88. package/dist/application/self/plugin-cache-clear.js +0 -133
  89. package/dist/application/self/plugin-cache-clear.js.map +0 -1
  90. package/dist/application/self/plugin-cache-reload.js +0 -141
  91. package/dist/application/self/plugin-cache-reload.js.map +0 -1
  92. package/dist/application/self/skills-apply.js +0 -623
  93. package/dist/application/self/skills-apply.js.map +0 -1
  94. package/dist/application/self/skills-catalog.js +0 -35
  95. package/dist/application/self/skills-catalog.js.map +0 -1
  96. package/dist/application/self/skills-change.js +0 -479
  97. package/dist/application/self/skills-change.js.map +0 -1
  98. package/dist/application/self/skills-discovery.js +0 -275
  99. package/dist/application/self/skills-discovery.js.map +0 -1
  100. package/dist/application/self/skills-manager.js +0 -253
  101. package/dist/application/self/skills-manager.js.map +0 -1
  102. package/dist/application/self/skills-payload.js +0 -566
  103. package/dist/application/self/skills-payload.js.map +0 -1
  104. package/dist/application/self/skills-registry.js +0 -107
  105. package/dist/application/self/skills-registry.js.map +0 -1
  106. package/dist/application/skill-index-service.js +0 -78
  107. package/dist/application/skill-index-service.js.map +0 -1
  108. package/dist/cli/commands/plugin-cache.js +0 -25
  109. package/dist/cli/commands/plugin-cache.js.map +0 -1
  110. package/dist/cli/commands/skill-index.js +0 -19
  111. package/dist/cli/commands/skill-index.js.map +0 -1
  112. package/dist/cli/tui/data/recommended-skills.js +0 -482
  113. package/dist/cli/tui/data/recommended-skills.js.map +0 -1
  114. package/dist/cli/tui/tabs/skills-tab.js +0 -664
  115. package/dist/cli/tui/tabs/skills-tab.js.map +0 -1
@@ -1,226 +0,0 @@
1
- import { spawn } from "node:child_process";
2
- import { readFile, readdir, rm, stat } from "node:fs/promises";
3
- import { mkdtemp } from "node:fs/promises";
4
- import { tmpdir } from "node:os";
5
- import { join } from "node:path";
6
- import { selfInstallPluginSkills } from "./install-plugin-skills.js";
7
- import { INSTALL_TARGETS } from "./install-skill.js";
8
- const VALID_TARGETS = INSTALL_TARGETS;
9
- export async function installPluginSkillsFromGit(args, ctx) {
10
- const rawUrl = args.values.get("url");
11
- const targetArg = (args.values.get("target") ?? "warp");
12
- const namespace = args.values.get("namespace") ?? "";
13
- const force = args.flags.has("--force");
14
- if (!rawUrl) {
15
- return {
16
- ok: false,
17
- error: { code: "INVALID_INPUT", message: "--url <git-url> es obligatorio." },
18
- exitCode: 1,
19
- };
20
- }
21
- if (!VALID_TARGETS.includes(targetArg)) {
22
- return {
23
- ok: false,
24
- error: {
25
- code: "INVALID_INPUT",
26
- message: `--target debe ser uno de: ${VALID_TARGETS.join(", ")}. Recibido: '${targetArg}'`,
27
- },
28
- exitCode: 1,
29
- };
30
- }
31
- // Split URL#ref (e.g. "https://...git#feature/last")
32
- const hashIdx = rawUrl.indexOf("#");
33
- const url = hashIdx >= 0 ? rawUrl.slice(0, hashIdx) : rawUrl;
34
- const ref = args.values.get("ref") ?? (hashIdx >= 0 ? rawUrl.slice(hashIdx + 1) : undefined);
35
- const tempDir = await mkdtemp(join(tmpdir(), "aw-git-install-"));
36
- try {
37
- try {
38
- await gitClone(url, tempDir, ref);
39
- }
40
- catch (err) {
41
- return {
42
- ok: false,
43
- error: { code: "GIT_CLONE_FAILED", message: err.message },
44
- exitCode: 1,
45
- };
46
- }
47
- const resolvedDir = await resolvePluginDir(tempDir, namespace);
48
- if (!resolvedDir) {
49
- return {
50
- ok: false,
51
- error: {
52
- code: "SOURCE_NOT_FOUND",
53
- message: `No se encontró directorio de skills válido en '${url}'.`,
54
- },
55
- exitCode: 1,
56
- };
57
- }
58
- const innerValues = new Map(args.values);
59
- innerValues.set("from", resolvedDir);
60
- innerValues.set("target", targetArg);
61
- if (namespace)
62
- innerValues.set("namespace", namespace);
63
- const innerArgs = {
64
- ...args,
65
- flags: new Set(force ? ["--force"] : []),
66
- values: innerValues,
67
- };
68
- return selfInstallPluginSkills(innerArgs, ctx);
69
- }
70
- finally {
71
- await rm(tempDir, { recursive: true, force: true }).catch(() => { });
72
- }
73
- }
74
- /** Runs a git subcommand, failing fast. Never allows interactive prompts:
75
- * under the TUI (alt-screen + raw mode) git would ask for credentials/host-key
76
- * on an invisible /dev/tty and hang the busy-lock forever (same fix as
77
- * GitCliAdapter). */
78
- function runGit(args, cwd) {
79
- return new Promise((resolve, reject) => {
80
- const env = {
81
- ...process.env,
82
- GIT_TERMINAL_PROMPT: "0",
83
- GIT_SSH_COMMAND: process.env.GIT_SSH_COMMAND ?? "ssh -oBatchMode=yes",
84
- };
85
- const proc = spawn("git", args, { stdio: "pipe", env, ...(cwd ? { cwd } : {}) });
86
- // Chunks stay as bytes: decoding each one splits multibyte characters at the
87
- // pipe boundary and garbles git's own message.
88
- const stderr = [];
89
- const stdout = [];
90
- proc.stdout?.on("data", (chunk) => {
91
- stdout.push(chunk);
92
- });
93
- proc.stderr?.on("data", (chunk) => {
94
- stderr.push(chunk);
95
- });
96
- proc.on("close", (code) => {
97
- if (code === 0)
98
- resolve(Buffer.concat(stdout).toString("utf8"));
99
- else {
100
- const detail = Buffer.concat(stderr).toString("utf8").trim();
101
- reject(new Error(`git ${args[0]} falló (exit ${code}): ${detail}`));
102
- }
103
- });
104
- proc.on("error", reject);
105
- });
106
- }
107
- // Exported: skills-manager reuses the same shallow clone for register/update.
108
- export async function gitClone(url, dest, ref) {
109
- const gitArgs = ["clone", "--depth=1"];
110
- if (ref)
111
- gitArgs.push("--branch", ref);
112
- gitArgs.push(url, dest);
113
- await runGit(gitArgs);
114
- }
115
- /** Blobless + sparse clone that materializes ONLY the SKILL.md manifests of a
116
- * source — enough to DISCOVER its skills without downloading unrelated repo
117
- * content (a 4 KB skill in a 600 MB repo costs a few MB, not the whole repo).
118
- * On servers that ignore the filter it degrades to a full fetch, still correct.
119
- * Expand a picked skill's full directory later with gitSparseAddSkillDir. */
120
- export async function gitCloneSkillManifests(url, dest, ref) {
121
- const gitArgs = ["clone", "--depth=1", "--filter=blob:none", "--no-checkout"];
122
- if (ref)
123
- gitArgs.push("--branch", ref);
124
- gitArgs.push(url, dest);
125
- await runGit(gitArgs);
126
- // Non-cone so a bare filename pattern matches SKILL.md at any depth (gitignore
127
- // semantics); the `set` writes patterns, the `checkout` populates the tree.
128
- await runGit(["sparse-checkout", "set", "--no-cone", "SKILL.md"], dest);
129
- await runGit(["checkout"], dest);
130
- }
131
- /** Expands the sparse working tree to include one skill's full directory (its
132
- * SKILL.md plus any bundled references/assets), fetching just that dir's blobs. */
133
- export async function gitSparseAddSkillDir(dest, relDir) {
134
- const clean = relDir.replace(/^\/+/, "").replace(/\/+$/, "");
135
- await runGit(["sparse-checkout", "add", `/${clean}/`], dest);
136
- }
137
- /** Expands the sparse working tree to include ONE file — the licence or the
138
- * shared resource a payload needs, without dragging its whole directory. */
139
- export async function gitSparseAddFile(dest, relPath) {
140
- const clean = relPath.replace(/^\/+/, "");
141
- await runGit(["sparse-checkout", "add", `/${clean}`], dest);
142
- }
143
- /** Restores the full working tree — for a source whose repo root IS the skill,
144
- * the whole repo is its payload. */
145
- export async function gitSparseDisable(dest) {
146
- await runGit(["sparse-checkout", "disable"], dest);
147
- }
148
- /**
149
- * Every path of the VERSIONED tree, whatever the working copy materialized.
150
- *
151
- * Discovery over a sparse clone cannot ask the filesystem how many skills a
152
- * source has: the tree on disk is the subset the sparse pattern brought down.
153
- * The commit's own listing has no depth limit and no directory that hides what
154
- * is below it, which is what lets a nested skill be addressed by its path.
155
- */
156
- export async function gitListTreePaths(dest) {
157
- const out = await runGit(["ls-tree", "-r", "HEAD", "--name-only", "-z"], dest);
158
- return out.split("\0").filter((line) => line.length > 0);
159
- }
160
- /** The commit a ref resolved to — resolved ONCE, so the same preparation and
161
- * its application talk about the same bytes even if the branch moves. */
162
- export async function gitResolveCommit(dest) {
163
- return (await runGit(["rev-parse", "HEAD"], dest)).trim();
164
- }
165
- async function resolvePluginDir(cloneDir, namespace) {
166
- // Case 1: marketplace manifest — clone the actual plugin repo
167
- const manifestPath = join(cloneDir, "marketplace-codex.json");
168
- try {
169
- const raw = await readFile(manifestPath, "utf8");
170
- const manifest = JSON.parse(raw);
171
- const plugin = namespace
172
- ? manifest.plugins?.find((p) => p.name === namespace)
173
- : manifest.plugins?.[0];
174
- if (plugin?.source?.url) {
175
- const pluginTempDir = await mkdtemp(join(tmpdir(), "aw-git-plugin-"));
176
- try {
177
- const pluginRef = plugin.source.ref;
178
- await gitClone(plugin.source.url, pluginTempDir, pluginRef);
179
- return await findSkillsRoot(pluginTempDir);
180
- }
181
- catch {
182
- await rm(pluginTempDir, { recursive: true, force: true }).catch(() => { });
183
- return null;
184
- }
185
- }
186
- }
187
- catch {
188
- // Not a marketplace — continue
189
- }
190
- // Case 2: direct plugin repo
191
- return findSkillsRoot(cloneDir);
192
- }
193
- async function findSkillsRoot(dir) {
194
- // Prefer explicit skills/ subdir
195
- const skillsSubdir = join(dir, "skills");
196
- if (await hasValidSkillDirs(skillsSubdir))
197
- return skillsSubdir;
198
- // Fallback: root has skill dirs directly
199
- if (await hasValidSkillDirs(dir))
200
- return dir;
201
- return null;
202
- }
203
- async function hasValidSkillDirs(dir) {
204
- try {
205
- const entries = await readdir(dir);
206
- for (const entry of entries) {
207
- const full = join(dir, entry);
208
- try {
209
- const s = await stat(full);
210
- if (!s.isDirectory())
211
- continue;
212
- const skillMdContent = await readFile(join(full, "SKILL.md"), "utf8");
213
- if (/^---[ \t]*\r?\n[\s\S]*?name:\s*\S/m.test(skillMdContent))
214
- return true;
215
- }
216
- catch {
217
- // not a skill dir
218
- }
219
- }
220
- return false;
221
- }
222
- catch {
223
- return false;
224
- }
225
- }
226
- //# sourceMappingURL=install-plugin-skills-git.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-plugin-skills-git.js","sourceRoot":"","sources":["../../../src/application/self/install-plugin-skills-git.ts"],"names":[],"mappings":"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"}
@@ -1,203 +0,0 @@
1
- import { copyFile, mkdir, readFile, readdir, rm, stat, writeFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import { INSTALL_TARGETS, TARGET_ROOTS } from "./install-targets.js";
4
- const VALID_TARGETS = INSTALL_TARGETS;
5
- export async function selfInstallPluginSkills(args, ctx) {
6
- const fromDir = args.values.get("from");
7
- const targetArg = (args.values.get("target") ?? "warp");
8
- const namespace = args.values.get("namespace") ?? "";
9
- const force = args.flags.has("--force");
10
- const dryRun = args.flags.has("--dry-run");
11
- if (!fromDir) {
12
- return {
13
- ok: false,
14
- error: { code: "INVALID_INPUT", message: "--from <skills-dir> es obligatorio." },
15
- exitCode: 1,
16
- };
17
- }
18
- if (!VALID_TARGETS.includes(targetArg)) {
19
- return {
20
- ok: false,
21
- error: {
22
- code: "INVALID_INPUT",
23
- message: `--target debe ser uno de: ${VALID_TARGETS.join(", ")}. Recibido: '${targetArg}'`,
24
- },
25
- exitCode: 1,
26
- };
27
- }
28
- if (!(await dirExists(fromDir))) {
29
- return {
30
- ok: false,
31
- error: { code: "SOURCE_NOT_FOUND", message: `El directorio --from '${fromDir}' no existe.` },
32
- exitCode: 1,
33
- };
34
- }
35
- const skillDirs = await scanSkillDirs(fromDir);
36
- if (skillDirs.length === 0) {
37
- return {
38
- ok: true,
39
- data: {
40
- status: "nothing",
41
- from: fromDir,
42
- namespace,
43
- target: targetArg,
44
- skills: [],
45
- summary: `No se encontraron skills válidos en '${fromDir}'.`,
46
- },
47
- exitCode: 0,
48
- };
49
- }
50
- const destRoot = join(ctx.env.homeDir(), ...TARGET_ROOTS[targetArg]);
51
- const results = [];
52
- for (const { name: dirName, path: skillSrcDir } of skillDirs) {
53
- const finalName = namespace ? `${namespace}-${dirName}` : dirName;
54
- const dest = join(destRoot, finalName);
55
- const result = await processSkill({
56
- finalName,
57
- skillSrcDir,
58
- dest,
59
- namespace,
60
- force,
61
- dryRun,
62
- });
63
- results.push(result);
64
- }
65
- return buildInstallResult({ results, dryRun, destRoot, fromDir, namespace, target: targetArg });
66
- }
67
- async function processSkill(opts) {
68
- const { finalName, skillSrcDir, dest, namespace, force, dryRun } = opts;
69
- if (dryRun) {
70
- return { skillName: finalName, dest, status: "dry-run" };
71
- }
72
- if (!force && (await dirExists(dest))) {
73
- return {
74
- skillName: finalName,
75
- dest,
76
- status: "skipped",
77
- reason: "ya existe (usa --force para sobreescribir)",
78
- };
79
- }
80
- try {
81
- if (force) {
82
- await rm(dest, { recursive: true, force: true });
83
- }
84
- await copyDir(skillSrcDir, dest);
85
- if (namespace) {
86
- await patchFrontmatterName(join(dest, "SKILL.md"), finalName);
87
- }
88
- return { skillName: finalName, dest, status: "installed" };
89
- }
90
- catch (err) {
91
- return {
92
- skillName: finalName,
93
- dest,
94
- status: "skipped",
95
- reason: `error: ${err.message}`,
96
- };
97
- }
98
- }
99
- // Exported: skills-manager reuses the same scan to register/install standalone
100
- // skills (a valid skill dir = subdir with SKILL.md + name/description frontmatter).
101
- export async function scanSkillDirs(fromDir) {
102
- let entries;
103
- try {
104
- entries = await readdir(fromDir);
105
- }
106
- catch {
107
- return [];
108
- }
109
- const results = [];
110
- for (const entry of entries) {
111
- const full = join(fromDir, entry);
112
- const skillMd = join(full, "SKILL.md");
113
- try {
114
- const s = await stat(full);
115
- if (!s.isDirectory())
116
- continue;
117
- await stat(skillMd);
118
- const content = await readFile(skillMd, "utf8");
119
- if (hasValidFrontmatter(content)) {
120
- results.push({ name: entry, path: full });
121
- }
122
- }
123
- catch {
124
- // not a valid skill dir — skip
125
- }
126
- }
127
- return results;
128
- }
129
- async function patchFrontmatterName(skillMdPath, newName) {
130
- const content = await readFile(skillMdPath, "utf8");
131
- // [^\r\n]* stops before \r on Windows CRLF files so the line ending is preserved.
132
- const patched = content.replace(/^(---\s*\r?\n[\s\S]*?)name:\s*\S[^\r\n]*/m, `$1name: ${newName}`);
133
- if (patched !== content) {
134
- await writeFile(skillMdPath, patched, "utf8");
135
- }
136
- }
137
- // Exported: shared with skills-manager (materializes canonical copies) and
138
- // install-skill (bundle copy). Returns the number of files copied.
139
- export async function copyDir(src, dest) {
140
- await mkdir(dest, { recursive: true });
141
- const entries = await readdir(src, { withFileTypes: true });
142
- let count = 0;
143
- for (const entry of entries) {
144
- if (entry.name === ".git")
145
- continue;
146
- // Never follow symlinks: a hostile repo can commit a link to a user file
147
- // (e.g. ~/.ssh) and copyFile would dereference it when materializing.
148
- if (entry.isSymbolicLink())
149
- continue;
150
- const srcPath = join(src, entry.name);
151
- const destPath = join(dest, entry.name);
152
- if (entry.isDirectory()) {
153
- count += await copyDir(srcPath, destPath);
154
- }
155
- else {
156
- await copyFile(srcPath, destPath);
157
- count += 1;
158
- }
159
- }
160
- return count;
161
- }
162
- // Exported: skills-manager applies the same rule for what counts as a skill
163
- // (SKILL.md with name+description frontmatter) when registering single-dir sources.
164
- export function hasValidFrontmatter(content) {
165
- const match = content.match(/^---[ \t]*\r?\n([\s\S]*?)\r?\n---/);
166
- if (!match)
167
- return false;
168
- const block = match[1] ?? "";
169
- return /^name:\s*\S/m.test(block) && /^description:\s*\S/m.test(block);
170
- }
171
- async function dirExists(p) {
172
- try {
173
- await stat(p);
174
- return true;
175
- }
176
- catch {
177
- return false;
178
- }
179
- }
180
- function buildInstallResult(opts) {
181
- const { results, dryRun, destRoot, fromDir, namespace, target } = opts;
182
- const installed = results.filter((r) => r.status === "installed").length;
183
- const skipped = results.filter((r) => r.status === "skipped").length;
184
- const hasErrors = results.some((r) => r.reason?.startsWith("error:"));
185
- const status = dryRun ? "dry-run" : installed === 0 && skipped > 0 ? "partial" : "installed";
186
- const summary = dryRun
187
- ? `[dry-run] ${results.length} skills se copiarían a ${destRoot}.`
188
- : `${installed} skills instalados, ${skipped} omitidos en ${destRoot}.`;
189
- return {
190
- ok: !hasErrors,
191
- data: { status, from: fromDir, namespace, target, skills: results, summary },
192
- ...(hasErrors
193
- ? {
194
- error: {
195
- code: "INSTALL_PARTIAL",
196
- message: "Algunos skills fallaron. Ver data.skills para detalles.",
197
- },
198
- }
199
- : {}),
200
- exitCode: hasErrors ? 1 : 0,
201
- };
202
- }
203
- //# sourceMappingURL=install-plugin-skills.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"install-plugin-skills.js","sourceRoot":"","sources":["../../../src/application/self/install-plugin-skills.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3F,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIjC,OAAO,EAAE,eAAe,EAAsB,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAkBzF,MAAM,aAAa,GAA6B,eAAe,CAAC;AAEhE,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,IAAgB,EAChB,GAAe;IAEf,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAkB,CAAC;IACzE,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IAE3C,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,qCAAqC,EAAE;YAChF,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE;gBACL,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,6BAA6B,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,SAAS,GAAG;aAC3F;YACD,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,CAAC,MAAM,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QAChC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,yBAAyB,OAAO,cAAc,EAAE;YAC5F,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,EAAE,EAAE,IAAI;YACR,IAAI,EAAE;gBACJ,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,OAAO;gBACb,SAAS;gBACT,MAAM,EAAE,SAAS;gBACjB,MAAM,EAAE,EAAE;gBACV,OAAO,EAAE,wCAAwC,OAAO,IAAI;aAC7D;YACD,QAAQ,EAAE,CAAC;SACZ,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IACrE,MAAM,OAAO,GAAwB,EAAE,CAAC;IAExC,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,SAAS,EAAE,CAAC;QAC7D,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;QACvC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;YAChC,SAAS;YACT,WAAW;YACX,IAAI;YACJ,SAAS;YACT,KAAK;YACL,MAAM;SACP,CAAC,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,kBAAkB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;AAClG,CAAC;AAWD,KAAK,UAAU,YAAY,CAAC,IAAsB;IAChD,MAAM,EAAE,SAAS,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAExE,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,SAAS,EAAE,SAAS;YACpB,IAAI;YACJ,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,4CAA4C;SACrD,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,MAAM,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QAEjC,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,SAAS,CAAC,CAAC;QAChE,CAAC;QAED,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAC7D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,SAAS,EAAE,SAAS;YACpB,IAAI;YACJ,MAAM,EAAE,SAAS;YACjB,MAAM,EAAE,UAAW,GAAa,CAAC,OAAO,EAAE;SAC3C,CAAC;IACJ,CAAC;AACH,CAAC;AAED,+EAA+E;AAC/E,oFAAoF;AACpF,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAe;IACjD,IAAI,OAAiB,CAAC;IACtB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAqC,EAAE,CAAC;IACrD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;gBAAE,SAAS;YAC/B,MAAM,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAChD,IAAI,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,+BAA+B;QACjC,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,WAAmB,EAAE,OAAe;IACtE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IACpD,kFAAkF;IAClF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAC7B,2CAA2C,EAC3C,WAAW,OAAO,EAAE,CACrB,CAAC;IACF,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;QACxB,MAAM,SAAS,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,mEAAmE;AACnE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW,EAAE,IAAY;IACrD,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,SAAS;QACpC,yEAAyE;QACzE,sEAAsE;QACtE,IAAI,KAAK,CAAC,cAAc,EAAE;YAAE,SAAS;QACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,IAAI,MAAM,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC5C,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAClC,KAAK,IAAI,CAAC,CAAC;QACb,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,4EAA4E;AAC5E,oFAAoF;AACpF,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACjE,IAAI,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IACzB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7B,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzE,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,CAAS;IAChC,IAAI,CAAC;QACH,MAAM,IAAI,CAAC,CAAC,CAAC,CAAC;QACd,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,kBAAkB,CAAC,IAO3B;IACC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IACvE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,MAAM,CAAC;IACzE,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,MAAM,CAAC;IACrE,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEtE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC;IAC7F,MAAM,OAAO,GAAG,MAAM;QACpB,CAAC,CAAC,aAAa,OAAO,CAAC,MAAM,0BAA0B,QAAQ,GAAG;QAClE,CAAC,CAAC,GAAG,SAAS,uBAAuB,OAAO,gBAAgB,QAAQ,GAAG,CAAC;IAE1E,OAAO;QACL,EAAE,EAAE,CAAC,SAAS;QACd,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE;QAC5E,GAAG,CAAC,SAAS;YACX,CAAC,CAAC;gBACE,KAAK,EAAE;oBACL,IAAI,EAAE,iBAAiB;oBACvB,OAAO,EAAE,yDAAyD;iBACnE;aACF;YACH,CAAC,CAAC,EAAE,CAAC;QACP,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;KAC5B,CAAC;AACJ,CAAC"}
@@ -1,133 +0,0 @@
1
- import { rm } from "node:fs/promises";
2
- import { join } from "node:path";
3
- import { INSTALL_TARGETS, TARGET_ROOTS } from "./install-targets.js";
4
- // Same single source as install/uninstall: hosts without a plugin cache or
5
- // flattened skills simply report "nothing" instead of rejecting the target.
6
- export const CACHE_TARGETS = INSTALL_TARGETS;
7
- export async function selfClearPluginCache(args, ctx) {
8
- const plugin = args.values.get("plugin");
9
- const targetArg = args.values.get("target");
10
- const dryRun = args.flags.has("--dry-run");
11
- if (!plugin) {
12
- return {
13
- ok: false,
14
- error: { code: "INVALID_INPUT", message: "--plugin <namespace> es obligatorio." },
15
- exitCode: 1,
16
- };
17
- }
18
- if (!targetArg || !CACHE_TARGETS.includes(targetArg)) {
19
- return {
20
- ok: false,
21
- error: {
22
- code: "INVALID_INPUT",
23
- message: `--target debe ser uno de: ${CACHE_TARGETS.join(", ")}. Recibido: '${targetArg ?? "(vacío)"}'`,
24
- },
25
- exitCode: 1,
26
- };
27
- }
28
- const home = ctx.env.homeDir();
29
- const removed = [];
30
- if (targetArg === "claude" || targetArg === "codex") {
31
- removed.push(...(await clearHostCache(ctx, home, targetArg, plugin, dryRun)));
32
- }
33
- else {
34
- removed.push(...(await clearSkillDirs(ctx, home, targetArg, plugin, dryRun)));
35
- }
36
- const status = dryRun ? "dry-run" : removed.length === 0 ? "nothing" : "removed";
37
- const summary = buildSummary(status, targetArg, plugin, removed.length);
38
- return {
39
- ok: true,
40
- data: { status, target: targetArg, plugin, removed, summary },
41
- exitCode: 0,
42
- };
43
- }
44
- async function clearHostCache(ctx, home, target, plugin, dryRun) {
45
- const pluginsRoot = join(home, `.${target}`, "plugins");
46
- const cacheRemovals = await removeCacheDirs(ctx, join(pluginsRoot, "cache"), plugin, dryRun);
47
- const installedRemoval = await removeInstalledEntry(ctx, join(pluginsRoot, "installed_plugins.json"), plugin, dryRun);
48
- return installedRemoval ? [...cacheRemovals, installedRemoval] : cacheRemovals;
49
- }
50
- async function removeCacheDirs(ctx, cacheRoot, plugin, dryRun) {
51
- if (!(await ctx.fs.exists(cacheRoot)))
52
- return [];
53
- const marketplaces = await listSafe(ctx, cacheRoot);
54
- const removals = [];
55
- for (const mp of marketplaces) {
56
- const pluginDir = join(cacheRoot, mp.name, plugin);
57
- if (!(await ctx.fs.exists(pluginDir)))
58
- continue;
59
- if (!dryRun)
60
- await rm(pluginDir, { recursive: true, force: true });
61
- removals.push({ path: pluginDir, kind: "cache" });
62
- }
63
- return removals;
64
- }
65
- async function removeInstalledEntry(ctx, installedPath, plugin, dryRun) {
66
- if (!(await ctx.fs.exists(installedPath)))
67
- return null;
68
- let data;
69
- try {
70
- data = JSON.parse(await ctx.fs.readText(installedPath));
71
- }
72
- catch {
73
- return null;
74
- }
75
- const plugins = (data.plugins ?? {});
76
- const keysToRemove = Object.keys(plugins).filter((k) => k.startsWith(`${plugin}@`));
77
- if (keysToRemove.length === 0)
78
- return null;
79
- if (!dryRun) {
80
- for (const k of keysToRemove)
81
- delete plugins[k];
82
- data.plugins = plugins;
83
- await ctx.fs.writeText(installedPath, `${JSON.stringify(data, null, 2)}\n`);
84
- }
85
- return {
86
- path: `${installedPath} (${keysToRemove.join(", ")})`,
87
- kind: "installed-entry",
88
- };
89
- }
90
- // Exported: plugin-cache-reload shares the same tolerant listing.
91
- export async function listSafe(ctx, path) {
92
- try {
93
- return await ctx.fs.list(path);
94
- }
95
- catch {
96
- return [];
97
- }
98
- }
99
- async function clearSkillDirs(ctx, home, target, plugin, dryRun) {
100
- const removals = [];
101
- const skillsRoot = join(home, ...TARGET_ROOTS[target]);
102
- if (!(await ctx.fs.exists(skillsRoot)))
103
- return removals;
104
- let entries = [];
105
- try {
106
- entries = await ctx.fs.list(skillsRoot);
107
- }
108
- catch {
109
- return removals;
110
- }
111
- const prefix = `${plugin}-`;
112
- for (const entry of entries) {
113
- if (entry.type !== "dir")
114
- continue;
115
- if (!entry.name.startsWith(prefix))
116
- continue;
117
- const full = join(skillsRoot, entry.name);
118
- if (!dryRun)
119
- await rm(full, { recursive: true, force: true });
120
- removals.push({ path: full, kind: "skill-dir" });
121
- }
122
- return removals;
123
- }
124
- function buildSummary(status, target, plugin, count) {
125
- if (status === "dry-run") {
126
- return `[dry-run] se borrarían ${count} item(s) del plugin '${plugin}' en ${target}.`;
127
- }
128
- if (status === "nothing") {
129
- return `Nada que limpiar para '${plugin}' en ${target}.`;
130
- }
131
- return `Limpiados ${count} item(s) del plugin '${plugin}' en ${target}.`;
132
- }
133
- //# sourceMappingURL=plugin-cache-clear.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"plugin-cache-clear.js","sourceRoot":"","sources":["../../../src/application/self/plugin-cache-clear.ts"],"names":[],"mappings":"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"}