@tacuchi/agent-workflow-cli 25.3.1 → 25.5.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 (83) hide show
  1. package/README.md +1 -1
  2. package/dist/application/cut-intent-ledger.js +164 -0
  3. package/dist/application/cut-intent-ledger.js.map +1 -0
  4. package/dist/application/doctor/repair-runner.js +35 -2
  5. package/dist/application/doctor/repair-runner.js.map +1 -1
  6. package/dist/application/export-service.js +8 -1
  7. package/dist/application/export-service.js.map +1 -1
  8. package/dist/application/history-publications.js +76 -0
  9. package/dist/application/history-publications.js.map +1 -0
  10. package/dist/application/lineage-service.js +119 -0
  11. package/dist/application/lineage-service.js.map +1 -0
  12. package/dist/application/paths-service.js +8 -0
  13. package/dist/application/paths-service.js.map +1 -1
  14. package/dist/application/persist-service.js +9 -3
  15. package/dist/application/persist-service.js.map +1 -1
  16. package/dist/application/release-pass-ledger.js +285 -0
  17. package/dist/application/release-pass-ledger.js.map +1 -0
  18. package/dist/application/resume-service.js +9 -5
  19. package/dist/application/resume-service.js.map +1 -1
  20. package/dist/application/retirement/prepare.js +2 -2
  21. package/dist/application/retirement/prepare.js.map +1 -1
  22. package/dist/application/retirement/resolve.js.map +1 -1
  23. package/dist/application/self/install-plugin-skills-git.js +28 -1
  24. package/dist/application/self/install-plugin-skills-git.js.map +1 -1
  25. package/dist/application/self/skills-apply.js +623 -0
  26. package/dist/application/self/skills-apply.js.map +1 -0
  27. package/dist/application/self/skills-catalog.js +35 -0
  28. package/dist/application/self/skills-catalog.js.map +1 -0
  29. package/dist/application/self/skills-change.js +479 -0
  30. package/dist/application/self/skills-change.js.map +1 -0
  31. package/dist/application/self/skills-discovery.js +275 -0
  32. package/dist/application/self/skills-discovery.js.map +1 -0
  33. package/dist/application/self/skills-manager.js +69 -499
  34. package/dist/application/self/skills-manager.js.map +1 -1
  35. package/dist/application/self/skills-payload.js +566 -0
  36. package/dist/application/self/skills-payload.js.map +1 -0
  37. package/dist/application/self/skills-registry.js +31 -11
  38. package/dist/application/self/skills-registry.js.map +1 -1
  39. package/dist/application/session-resolver.js +8 -2
  40. package/dist/application/session-resolver.js.map +1 -1
  41. package/dist/application/{retirement/graph.js → workline-graph.js} +18 -12
  42. package/dist/application/workline-graph.js.map +1 -0
  43. package/dist/application/workline-index-service.js +200 -16
  44. package/dist/application/workline-index-service.js.map +1 -1
  45. package/dist/application/workspace-materialization-service.js +40 -4
  46. package/dist/application/workspace-materialization-service.js.map +1 -1
  47. package/dist/application/worktree-service.js +276 -6
  48. package/dist/application/worktree-service.js.map +1 -1
  49. package/dist/cli/commands/cut-intent.js +176 -0
  50. package/dist/cli/commands/cut-intent.js.map +1 -0
  51. package/dist/cli/commands/index.js +10 -0
  52. package/dist/cli/commands/index.js.map +1 -1
  53. package/dist/cli/commands/release-pass.js +192 -0
  54. package/dist/cli/commands/release-pass.js.map +1 -0
  55. package/dist/cli/commands/resume.js +3 -0
  56. package/dist/cli/commands/resume.js.map +1 -1
  57. package/dist/cli/commands/status.js +7 -0
  58. package/dist/cli/commands/status.js.map +1 -1
  59. package/dist/cli/commands/worktree.js +19 -5
  60. package/dist/cli/commands/worktree.js.map +1 -1
  61. package/dist/cli/help-groups.js +11 -0
  62. package/dist/cli/help-groups.js.map +1 -1
  63. package/dist/cli/main.js +27 -3
  64. package/dist/cli/main.js.map +1 -1
  65. package/dist/cli/tui/data/recommended-skills.js +363 -9
  66. package/dist/cli/tui/data/recommended-skills.js.map +1 -1
  67. package/dist/cli/tui/tabs/skills-tab.js +448 -204
  68. package/dist/cli/tui/tabs/skills-tab.js.map +1 -1
  69. package/dist/domain/cut-intent.js +79 -0
  70. package/dist/domain/cut-intent.js.map +1 -0
  71. package/dist/domain/doctor/operations.js +3 -1
  72. package/dist/domain/doctor/operations.js.map +1 -1
  73. package/dist/domain/flow/authority.js +8 -0
  74. package/dist/domain/flow/authority.js.map +1 -1
  75. package/dist/domain/release-pass.js +95 -0
  76. package/dist/domain/release-pass.js.map +1 -0
  77. package/dist/runtime/namespace-resolver.js +3 -10
  78. package/dist/runtime/namespace-resolver.js.map +1 -1
  79. package/dist/runtime/workline-marker.js +70 -0
  80. package/dist/runtime/workline-marker.js.map +1 -0
  81. package/package.json +1 -1
  82. package/skills/w/roles/README.md +2 -0
  83. package/dist/application/retirement/graph.js.map +0 -1
@@ -0,0 +1,275 @@
1
+ // Addressing a skill INSIDE a source (Spec 043 · AC-04): a candidate is
2
+ // identified by (source, resolved ref, path relative to the source root), and
3
+ // its invocable name travels beside that triple instead of being it.
4
+ //
5
+ // Why not the previous by-name discovery: it stopped as soon as the root was
6
+ // itself a skill, walked three levels down and discarded repeated names — so a
7
+ // collection's leaves were unreachable and `plugins/<x>/skills/<x>` fell off
8
+ // the edge. Here the GIT listing is the commit's own tree (no depth, nothing
9
+ // hidden below a recognized root, no dedupe) and the LOCAL walk declares its
10
+ // limits and says when it was cut.
11
+ import { lstat, mkdtemp, readFile, readdir, rm } from "node:fs/promises";
12
+ import { tmpdir } from "node:os";
13
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
14
+ import { gitClone, gitCloneSkillManifests, gitListTreePaths, gitResolveCommit, gitSparseAddFile, gitSparseAddSkillDir, gitSparseDisable, } from "./install-plugin-skills-git.js";
15
+ import { hasValidFrontmatter } from "./install-plugin-skills.js";
16
+ import { resolveSkillSource, skillFrontmatterName } from "./skills-manager.js";
17
+ /** Bounded local walk. A source deeper or wider than this is reported cut. */
18
+ export const LOCAL_WALK_LIMITS = { maxDepth: 6, maxEntries: 5000 };
19
+ const MANIFEST = "SKILL.md";
20
+ /** A path a person typed: it must stay inside the source and cross no link. */
21
+ export async function validateRelativePath(root, relPath) {
22
+ const clean = relPath.replace(/^\/+|\/+$/g, "");
23
+ if (clean.length === 0)
24
+ return { absolute: root };
25
+ if (isAbsolute(relPath)) {
26
+ return { code: "PATH_NOT_RELATIVE", message: `'${relPath}' no es una ruta del origen` };
27
+ }
28
+ const absolute = resolve(root, clean);
29
+ const inside = relative(resolve(root), absolute);
30
+ if (inside.startsWith("..") || isAbsolute(inside)) {
31
+ return { code: "PATH_ESCAPES_SOURCE", message: `'${relPath}' se sale del origen` };
32
+ }
33
+ const crossing = await crossesLink(resolve(root), clean);
34
+ if (crossing !== null) {
35
+ return crossing === "missing"
36
+ ? { code: "PATH_NOT_FOUND", message: `'${relPath}' no existe en el origen` }
37
+ : { code: "PATH_IS_SYMLINK", message: `'${relPath}' cruza un enlace simbólico` };
38
+ }
39
+ return { absolute };
40
+ }
41
+ /** Every segment, not just the leaf: a link halfway down redirects the rest. */
42
+ async function crossesLink(root, clean) {
43
+ let walked = root;
44
+ for (const segment of clean.split("/")) {
45
+ walked = join(walked, segment);
46
+ const stats = await lstat(walked).catch(() => null);
47
+ if (stats === null)
48
+ return "missing";
49
+ if (stats.isSymbolicLink())
50
+ return "symlink";
51
+ }
52
+ return null;
53
+ }
54
+ /** Candidate at an explicit path — the way in that no exploration limit gates. */
55
+ export async function candidateAtPath(root, relPath) {
56
+ const validated = await validateRelativePath(root, relPath);
57
+ if ("code" in validated)
58
+ return validated;
59
+ const manifest = join(validated.absolute, MANIFEST);
60
+ const content = await readFile(manifest, "utf8").catch(() => null);
61
+ if (content === null || !hasValidFrontmatter(content)) {
62
+ return {
63
+ code: "MANIFEST_ABSENT",
64
+ message: `'${relPath || "."}' no tiene un ${MANIFEST} con name y description`,
65
+ };
66
+ }
67
+ return candidateOf(root, validated.absolute, content);
68
+ }
69
+ function candidateOf(root, dir, content) {
70
+ const rel = relative(resolve(root), resolve(dir)).split(sep).join("/");
71
+ const directory = rel === "" ? basename(resolve(root)) : basename(dir);
72
+ return { path: rel, name: skillFrontmatterName(content) ?? directory, directory };
73
+ }
74
+ /**
75
+ * Bounded walk of a local source. Excludes `.git`, `node_modules` and every
76
+ * symlink (a link's `Dirent` is not a directory), keeps `.claude` eligible —
77
+ * the standard home of a repo's own skills — and, unlike the by-name
78
+ * discovery, does NOT stop at a directory that is already a skill: a
79
+ * collection's leaves are exactly what lives below one.
80
+ */
81
+ async function walkLocalManifests(root, budget) {
82
+ const candidates = [];
83
+ let truncated = false;
84
+ const visit = async (dir, depth) => {
85
+ if (depth > LOCAL_WALK_LIMITS.maxDepth) {
86
+ truncated = true;
87
+ return;
88
+ }
89
+ let entries;
90
+ try {
91
+ entries = await readdir(dir, { withFileTypes: true });
92
+ }
93
+ catch {
94
+ truncated = true;
95
+ return;
96
+ }
97
+ const content = await readFile(join(dir, MANIFEST), "utf8").catch(() => null);
98
+ if (content !== null && hasValidFrontmatter(content)) {
99
+ candidates.push(candidateOf(root, dir, content));
100
+ }
101
+ for (const entry of entries) {
102
+ if (budget.entries <= 0) {
103
+ truncated = true;
104
+ return;
105
+ }
106
+ budget.entries -= 1;
107
+ if (!walkable(entry))
108
+ continue;
109
+ await visit(join(dir, entry.name), depth + 1);
110
+ }
111
+ };
112
+ await visit(resolve(root), 0);
113
+ return { candidates, truncated };
114
+ }
115
+ /**
116
+ * Whether the walk descends into this entry.
117
+ *
118
+ * `.claude` is the one dot-dir kept: it is the standard home of a repo's own
119
+ * skills, so excluding it would hide exactly what somebody is looking for. A
120
+ * symlink's `Dirent` is not a directory, which is how links stay unfollowed.
121
+ */
122
+ function walkable(entry) {
123
+ if (!entry.isDirectory())
124
+ return false;
125
+ if (entry.name === "node_modules" || entry.name === ".git")
126
+ return false;
127
+ return !entry.name.startsWith(".") || entry.name === ".claude";
128
+ }
129
+ /** Files of a local source, under the same declared limits as the manifest
130
+ * walk: it answers "does the source have this?" without following a link. */
131
+ async function walkLocalFiles(root) {
132
+ const base = resolve(root);
133
+ const out = [];
134
+ const pending = [{ dir: base, depth: 0 }];
135
+ let budget = LOCAL_WALK_LIMITS.maxEntries;
136
+ while (pending.length > 0) {
137
+ const next = pending.pop();
138
+ if (next === undefined || next.depth > LOCAL_WALK_LIMITS.maxDepth)
139
+ continue;
140
+ const entries = await readdir(next.dir, { withFileTypes: true }).catch(() => []);
141
+ for (const entry of entries) {
142
+ if (budget <= 0)
143
+ return out.sort();
144
+ budget -= 1;
145
+ const full = join(next.dir, entry.name);
146
+ // A link's `Dirent` is neither a directory nor a file: it falls through.
147
+ if (walkable(entry))
148
+ pending.push({ dir: full, depth: next.depth + 1 });
149
+ else if (entry.isFile())
150
+ out.push(relative(base, full).split(sep).join("/"));
151
+ }
152
+ }
153
+ return out.sort();
154
+ }
155
+ /** Manifests of a git clone, read from the COMMIT's tree. */
156
+ async function gitManifests(root, paths) {
157
+ const candidates = [];
158
+ for (const path of paths) {
159
+ if (path !== MANIFEST && !path.endsWith(`/${MANIFEST}`))
160
+ continue;
161
+ const absolute = join(root, path);
162
+ const content = await readFile(absolute, "utf8").catch(() => null);
163
+ if (content === null || !hasValidFrontmatter(content))
164
+ continue;
165
+ candidates.push(candidateOf(root, dirname(absolute), content));
166
+ }
167
+ return candidates;
168
+ }
169
+ export async function acquireSource(source, ref) {
170
+ const resolved = resolveSkillSource(source, ref);
171
+ if ("error" in resolved)
172
+ return { code: "INVALID_SOURCE", message: resolved.error };
173
+ if (resolved.kind === "local") {
174
+ const stats = await lstat(resolved.path).catch(() => null);
175
+ if (stats === null) {
176
+ return { code: "SOURCE_NOT_FOUND", message: `el path local '${resolved.path}' no existe` };
177
+ }
178
+ if (stats.isSymbolicLink()) {
179
+ return {
180
+ code: "SOURCE_IS_SYMLINK",
181
+ message: `'${resolved.path}' es un enlace simbólico: declará su destino real`,
182
+ };
183
+ }
184
+ const walk = await walkLocalManifests(resolved.path, { entries: LOCAL_WALK_LIMITS.maxEntries });
185
+ return {
186
+ inventory: {
187
+ source: resolved.path,
188
+ kind: "local",
189
+ requestedRef: null,
190
+ resolvedRef: null,
191
+ candidates: walk.candidates,
192
+ truncated: walk.truncated,
193
+ limits: { ...LOCAL_WALK_LIMITS },
194
+ },
195
+ root: resolved.path,
196
+ materialize: async (relPath) => resolve(resolved.path, relPath),
197
+ listPaths: () => walkLocalFiles(resolved.path),
198
+ materializeFile: async (relPath) => {
199
+ const absolute = resolve(resolved.path, relPath);
200
+ return (await lstat(absolute).catch(() => null)) === null ? null : absolute;
201
+ },
202
+ release: async () => { },
203
+ };
204
+ }
205
+ const temp = await mkdtemp(join(tmpdir(), "aw-skill-source-"));
206
+ const release = async () => {
207
+ await rm(temp, { recursive: true, force: true }).catch(() => { });
208
+ };
209
+ // A server that refuses the partial clone falls back to a full one; then the
210
+ // whole tree is already checked out and `materialize` is identity.
211
+ let sparse = true;
212
+ try {
213
+ await gitCloneSkillManifests(resolved.url, temp, resolved.ref);
214
+ }
215
+ catch {
216
+ await rm(temp, { recursive: true, force: true }).catch(() => { });
217
+ try {
218
+ await gitClone(resolved.url, temp, resolved.ref);
219
+ sparse = false;
220
+ }
221
+ catch (err) {
222
+ await release();
223
+ return { code: "GIT_CLONE_FAILED", message: `git clone falló: ${err.message}` };
224
+ }
225
+ }
226
+ try {
227
+ const tree = await gitListTreePaths(temp);
228
+ const candidates = await gitManifests(temp, tree);
229
+ const resolvedRef = await gitResolveCommit(temp);
230
+ return {
231
+ inventory: {
232
+ // The registry records the source the person gave, never the temp dir.
233
+ source: source.split("#")[0] ?? source,
234
+ kind: "git",
235
+ requestedRef: resolved.ref ?? null,
236
+ resolvedRef,
237
+ candidates,
238
+ truncated: false,
239
+ limits: null,
240
+ },
241
+ root: temp,
242
+ materialize: async (relPath) => {
243
+ if (sparse) {
244
+ if (relPath === "")
245
+ await gitSparseDisable(temp);
246
+ else
247
+ await gitSparseAddSkillDir(temp, relPath);
248
+ }
249
+ return resolve(temp, relPath);
250
+ },
251
+ listPaths: async () => tree,
252
+ materializeFile: async (relPath) => {
253
+ if (!tree.includes(relPath))
254
+ return null;
255
+ if (sparse)
256
+ await gitSparseAddFile(temp, relPath);
257
+ return resolve(temp, relPath);
258
+ },
259
+ release,
260
+ };
261
+ }
262
+ catch (err) {
263
+ await release();
264
+ return {
265
+ code: "SOURCE_UNREADABLE",
266
+ message: `no se pudo leer el árbol de '${source}': ${err.message}`,
267
+ };
268
+ }
269
+ }
270
+ /** By-name selection, kept ONLY while it resolves a single option: two skills
271
+ * with the same name in one source are two alternatives, not a coin toss. */
272
+ export function candidatesNamed(inventory, name) {
273
+ return inventory.candidates.filter((c) => c.name === name || c.directory === name);
274
+ }
275
+ //# sourceMappingURL=skills-discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-discovery.js","sourceRoot":"","sources":["../../../src/application/self/skills-discovery.ts"],"names":[],"mappings":"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"}