@tacuchi/agent-workflow-cli 5.5.1 → 5.7.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.
@@ -0,0 +1,22 @@
1
+ import type { ParsedArgs } from "../../cli/parser.js";
2
+ import type { CliContext } from "../../cli/types.js";
3
+ import type { CommandResult } from "../../domain/types.js";
4
+ export interface BootstrapStep {
5
+ name: "doctor" | "uninstall-legacy" | "install-skill" | "next-steps";
6
+ status: "ok" | "skipped" | "error";
7
+ data?: unknown;
8
+ message?: string;
9
+ }
10
+ export interface BootstrapNextStep {
11
+ harness: "claude-code" | "codex";
12
+ detected: boolean;
13
+ install_command: string;
14
+ description: string;
15
+ }
16
+ export interface SelfBootstrapData {
17
+ steps: BootstrapStep[];
18
+ next_steps: BootstrapNextStep[];
19
+ summary: string;
20
+ }
21
+ export declare function selfBootstrap(args: ParsedArgs, ctx: CliContext): Promise<CommandResult<SelfBootstrapData>>;
22
+ //# sourceMappingURL=bootstrap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../../src/application/self/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAS3D,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,QAAQ,GAAG,kBAAkB,GAAG,eAAe,GAAG,YAAY,CAAC;IACrE,MAAM,EAAE,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC;IACnC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC;IACjC,QAAQ,EAAE,OAAO,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,aAAa,EAAE,CAAC;IACvB,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,aAAa,CACjC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,aAAa,CAAC,iBAAiB,CAAC,CAAC,CA4D3C"}
@@ -0,0 +1,115 @@
1
+ import { selfDoctor } from "./doctor-self.js";
2
+ import { selfInstallSkill, } from "./install-skill.js";
3
+ import { selfUninstallSkill } from "./uninstall-skill.js";
4
+ export async function selfBootstrap(args, ctx) {
5
+ const dryRun = args.flags.has("--dry-run");
6
+ const steps = [];
7
+ const doctorResult = await selfDoctor(ctx);
8
+ if (!doctorResult.ok || !doctorResult.data) {
9
+ steps.push({
10
+ name: "doctor",
11
+ status: "error",
12
+ message: doctorResult.error?.message ?? "unknown doctor error",
13
+ });
14
+ return failedResult(steps, "doctor failed; aborted bootstrap");
15
+ }
16
+ const doctorData = doctorResult.data;
17
+ steps.push({ name: "doctor", status: "ok", data: doctorData.skill });
18
+ const hasLegacy = doctorData.skill.targets.some((t) => t.legacy_leftover === true);
19
+ if (hasLegacy) {
20
+ const uninstallArgs = buildUninstallArgs(dryRun);
21
+ const uninstallResult = await selfUninstallSkill(uninstallArgs, ctx);
22
+ if (!uninstallResult.ok || !uninstallResult.data) {
23
+ steps.push({
24
+ name: "uninstall-legacy",
25
+ status: "error",
26
+ message: uninstallResult.error?.message ?? "unknown uninstall error",
27
+ });
28
+ return failedResult(steps, "uninstall-legacy failed; aborted bootstrap");
29
+ }
30
+ const uninstallData = uninstallResult.data;
31
+ steps.push({ name: "uninstall-legacy", status: "ok", data: uninstallData });
32
+ }
33
+ else {
34
+ steps.push({ name: "uninstall-legacy", status: "skipped", message: "no legacy leftover" });
35
+ }
36
+ const installArgs = buildInstallArgs(dryRun);
37
+ const installResult = await selfInstallSkill(installArgs, ctx);
38
+ if (!installResult.ok || !installResult.data) {
39
+ steps.push({
40
+ name: "install-skill",
41
+ status: "error",
42
+ message: installResult.error?.message ?? "unknown install error",
43
+ });
44
+ return failedResult(steps, "install-skill failed; aborted bootstrap");
45
+ }
46
+ const installData = installResult.data;
47
+ steps.push({ name: "install-skill", status: "ok", data: installData });
48
+ const nextSteps = buildNextSteps(installData.dests);
49
+ steps.push({ name: "next-steps", status: "ok", data: nextSteps });
50
+ const summary = composeSummary(steps, nextSteps);
51
+ return {
52
+ ok: true,
53
+ data: {
54
+ steps,
55
+ next_steps: nextSteps,
56
+ summary,
57
+ },
58
+ exitCode: 0,
59
+ };
60
+ }
61
+ function buildUninstallArgs(dryRun) {
62
+ return {
63
+ rest: [],
64
+ plugin: {},
65
+ flags: new Set(dryRun ? ["--legacy", "--dry-run"] : ["--legacy"]),
66
+ values: new Map([["target", "all"]]),
67
+ valuesMulti: new Map(),
68
+ };
69
+ }
70
+ function buildInstallArgs(dryRun) {
71
+ return {
72
+ rest: [],
73
+ plugin: {},
74
+ flags: new Set(dryRun ? ["--force", "--dry-run"] : ["--force"]),
75
+ values: new Map([["target", "all"]]),
76
+ valuesMulti: new Map(),
77
+ };
78
+ }
79
+ function buildNextSteps(dests) {
80
+ return [
81
+ {
82
+ harness: "claude-code",
83
+ detected: dests.some((d) => d.target === "claude"),
84
+ install_command: "/plugin marketplace add <marketplace-url>; /plugin install qtc",
85
+ description: "En Claude Code: agregá el marketplace si aún no está, después instalá el plugin 'qtc'.",
86
+ },
87
+ {
88
+ harness: "codex",
89
+ detected: dests.some((d) => d.target === "codex"),
90
+ install_command: "codex plugin install <marketplace-url>#qtc",
91
+ description: "En Codex: instalá el plugin 'qtc' desde el marketplace y reiniciá la app para refrescar el cache.",
92
+ },
93
+ ];
94
+ }
95
+ function composeSummary(steps, nextSteps) {
96
+ const ok = steps.filter((s) => s.status === "ok").length;
97
+ const skipped = steps.filter((s) => s.status === "skipped").length;
98
+ const detected = nextSteps.filter((n) => n.detected).map((n) => n.harness);
99
+ const detectedFragment = detected.length > 0
100
+ ? `Harnesses detectados: ${detected.join(", ")}.`
101
+ : "Sin harnesses detectados — instalá Claude Code o Codex y volvé a correr.";
102
+ return `Bootstrap completo: ${ok} pasos OK, ${skipped} saltados. ${detectedFragment} Ver next_steps[] para los comandos de instalación del plugin.`;
103
+ }
104
+ function failedResult(steps, summary) {
105
+ return {
106
+ ok: true,
107
+ data: {
108
+ steps,
109
+ next_steps: [],
110
+ summary,
111
+ },
112
+ exitCode: 1,
113
+ };
114
+ }
115
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../../../src/application/self/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,18 @@
1
1
  import type { CliContext } from "../../cli/types.js";
2
2
  import type { CommandResult } from "../../domain/types.js";
3
+ import { type InstallTarget } from "./install-skill.js";
4
+ export interface SkillTargetReport {
5
+ target: InstallTarget;
6
+ path: string;
7
+ installed: boolean;
8
+ legacy_leftover?: boolean;
9
+ legacy_leftover_path?: string;
10
+ legacy_leftover_warning?: string;
11
+ lock_present?: boolean;
12
+ lock_canonical_entry?: boolean;
13
+ lock_legacy_entry?: boolean;
14
+ lock_warning?: string;
15
+ }
3
16
  export interface SelfDoctorReport {
4
17
  cli_version: string;
5
18
  namespace: {
@@ -20,10 +33,7 @@ export interface SelfDoctorReport {
20
33
  };
21
34
  skill: {
22
35
  installed: boolean;
23
- path: string;
24
- legacy_leftover?: boolean;
25
- legacy_leftover_path?: string;
26
- legacy_leftover_warning?: string;
36
+ targets: SkillTargetReport[];
27
37
  };
28
38
  }
29
39
  export declare function selfDoctor(ctx: CliContext): Promise<CommandResult<SelfDoctorReport>>;
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-self.d.ts","sourceRoot":"","sources":["../../../src/application/self/doctor-self.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,KAAK,EAAE;QACL,SAAS,EAAE,OAAO,CAAC;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,eAAe,CAAC,EAAE,OAAO,CAAC;QAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;QAC9B,uBAAuB,CAAC,EAAE,MAAM,CAAC;KAClC,CAAC;CACH;AAID,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAyC1F"}
1
+ {"version":3,"file":"doctor-self.d.ts","sourceRoot":"","sources":["../../../src/application/self/doctor-self.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAEL,KAAK,aAAa,EAInB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,QAAQ,EAAE,MAAM,CAAC;QACjB,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;IACF,OAAO,EAAE;QACP,YAAY,EAAE,MAAM,CAAC;QACrB,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,KAAK,EAAE;QACL,SAAS,EAAE,OAAO,CAAC;QACnB,OAAO,EAAE,iBAAiB,EAAE,CAAC;KAC9B,CAAC;CACH;AAID,wBAAsB,UAAU,CAAC,GAAG,EAAE,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC,CAqC1F"}
@@ -1,11 +1,16 @@
1
1
  import { createRequire } from "node:module";
2
2
  import { join } from "node:path";
3
- const LEGACY_SKILL_DIR = "agent-workflow-manager";
3
+ import { AGENTS_LOCK_REL, LEGACY_SKILL_NAME, SKILL_DIR_NAME, TARGET_ROOTS, } from "./install-skill.js";
4
+ const FS_TARGETS = ["claude", "codex"];
4
5
  export async function selfDoctor(ctx) {
5
- const skillPath = join(ctx.env.homeDir(), ".claude", "skills", "agent-workflow");
6
- const skillInstalled = await ctx.fs.exists(skillPath);
7
- const legacyPath = join(ctx.env.homeDir(), ".claude", "skills", LEGACY_SKILL_DIR);
8
- const legacyLeftover = await ctx.fs.exists(legacyPath);
6
+ const home = ctx.env.homeDir();
7
+ const targetReports = [];
8
+ for (const target of FS_TARGETS) {
9
+ targetReports.push(await reportFsTarget(ctx, home, target));
10
+ }
11
+ const agentsReport = await reportAgentsTarget(ctx, home);
12
+ if (agentsReport)
13
+ targetReports.push(agentsReport);
9
14
  return {
10
15
  ok: true,
11
16
  data: {
@@ -27,20 +32,76 @@ export async function selfDoctor(ctx) {
27
32
  ...(ctx.runtime.displayName ? { display_name: ctx.runtime.displayName } : {}),
28
33
  },
29
34
  skill: {
30
- installed: skillInstalled,
31
- path: skillPath,
32
- ...(legacyLeftover
33
- ? {
34
- legacy_leftover: true,
35
- legacy_leftover_path: legacyPath,
36
- legacy_leftover_warning: `Skill legacy detectada en ${legacyPath}. Reemplazada por '${skillPath}' tras el rename de agent-workflow-manager → agent-workflow. Recomendado: mv ${legacyPath} ${legacyPath}.bak (preserva evidencia) y cuando estés tranquilo, rm -rf el .bak.`,
37
- }
38
- : {}),
35
+ installed: targetReports.some((t) => t.installed),
36
+ targets: targetReports,
39
37
  },
40
38
  },
41
39
  exitCode: 0,
42
40
  };
43
41
  }
42
+ async function reportFsTarget(ctx, home, target) {
43
+ const skillPath = join(home, ...TARGET_ROOTS[target], SKILL_DIR_NAME);
44
+ const legacyPath = join(home, ...TARGET_ROOTS[target], LEGACY_SKILL_NAME);
45
+ const installed = await ctx.fs.exists(skillPath);
46
+ const legacyLeftover = await ctx.fs.exists(legacyPath);
47
+ return {
48
+ target,
49
+ path: skillPath,
50
+ installed,
51
+ ...(legacyLeftover
52
+ ? {
53
+ legacy_leftover: true,
54
+ legacy_leftover_path: legacyPath,
55
+ legacy_leftover_warning: legacyWarning(legacyPath, skillPath),
56
+ }
57
+ : {}),
58
+ };
59
+ }
60
+ async function reportAgentsTarget(ctx, home) {
61
+ const agentsRoot = join(home, ...TARGET_ROOTS.agents.slice(0, 1));
62
+ if (!(await ctx.fs.exists(agentsRoot)))
63
+ return null;
64
+ const skillPath = join(home, ...TARGET_ROOTS.agents, SKILL_DIR_NAME);
65
+ const legacyPath = join(home, ...TARGET_ROOTS.agents, LEGACY_SKILL_NAME);
66
+ const installed = await ctx.fs.exists(skillPath);
67
+ const legacyLeftover = await ctx.fs.exists(legacyPath);
68
+ const lockPath = join(home, ...AGENTS_LOCK_REL);
69
+ const lockPresent = await ctx.fs.exists(lockPath);
70
+ let lockCanonical;
71
+ let lockLegacy;
72
+ let lockWarning;
73
+ if (lockPresent) {
74
+ try {
75
+ const raw = await ctx.fs.readText(lockPath);
76
+ const parsed = JSON.parse(raw);
77
+ const skills = parsed.skills ?? {};
78
+ lockCanonical = Object.hasOwn(skills, SKILL_DIR_NAME);
79
+ lockLegacy = Object.hasOwn(skills, LEGACY_SKILL_NAME);
80
+ }
81
+ catch (err) {
82
+ lockWarning = `Could not parse ${lockPath}: ${err.message}. Skipping lock-based detection — filesystem scan still reliable.`;
83
+ }
84
+ }
85
+ return {
86
+ target: "agents",
87
+ path: skillPath,
88
+ installed,
89
+ ...(legacyLeftover
90
+ ? {
91
+ legacy_leftover: true,
92
+ legacy_leftover_path: legacyPath,
93
+ legacy_leftover_warning: legacyWarning(legacyPath, skillPath),
94
+ }
95
+ : {}),
96
+ lock_present: lockPresent,
97
+ ...(lockCanonical !== undefined ? { lock_canonical_entry: lockCanonical } : {}),
98
+ ...(lockLegacy !== undefined ? { lock_legacy_entry: lockLegacy } : {}),
99
+ ...(lockWarning ? { lock_warning: lockWarning } : {}),
100
+ };
101
+ }
102
+ function legacyWarning(legacyPath, skillPath) {
103
+ return `Skill legacy detectada en ${legacyPath}. Reemplazada por '${skillPath}' tras el rename de agent-workflow-manager → agent-workflow. Usá 'agent-workflow self uninstall-skill --legacy' para limpiar.`;
104
+ }
44
105
  function readPackageVersion() {
45
106
  try {
46
107
  const require = createRequire(import.meta.url);
@@ -1 +1 @@
1
- {"version":3,"file":"doctor-self.js","sourceRoot":"","sources":["../../../src/application/self/doctor-self.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AA4BjC,MAAM,gBAAgB,GAAG,wBAAwB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAe;IAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IACjF,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAEtD,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,gBAAgB,CAAC,CAAC;IAClF,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEvD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE;YACJ,WAAW,EAAE,kBAAkB,EAAE;YACjC,SAAS,EAAE;gBACT,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS;gBAC9B,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM;aAC7B;YACD,KAAK,EAAE;gBACL,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE;gBAC/B,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC7B,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE;aAC1C;YACD,OAAO,EAAE;gBACP,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW;gBACrC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;gBAC7B,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;gBAC1B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9E;YACD,KAAK,EAAE;gBACL,SAAS,EAAE,cAAc;gBACzB,IAAI,EAAE,SAAS;gBACf,GAAG,CAAC,cAAc;oBAChB,CAAC,CAAC;wBACE,eAAe,EAAE,IAAI;wBACrB,oBAAoB,EAAE,UAAU;wBAChC,uBAAuB,EAAE,6BAA6B,UAAU,sBAAsB,SAAS,gFAAgF,UAAU,IAAI,UAAU,qEAAqE;qBAC7Q;oBACH,CAAC,CAAC,EAAE,CAAC;aACR;SACF;QACD,QAAQ,EAAE,CAAC;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAyB,CAAC;QACrE,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"doctor-self.js","sourceRoot":"","sources":["../../../src/application/self/doctor-self.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAGjC,OAAO,EACL,eAAe,EAEf,iBAAiB,EACjB,cAAc,EACd,YAAY,GACb,MAAM,oBAAoB,CAAC;AAoC5B,MAAM,UAAU,GAA6B,CAAC,QAAQ,EAAE,OAAO,CAAU,CAAC;AAE1E,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAe;IAC9C,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;IAC/B,MAAM,aAAa,GAAwB,EAAE,CAAC;IAE9C,KAAK,MAAM,MAAM,IAAI,UAAU,EAAE,CAAC;QAChC,aAAa,CAAC,IAAI,CAAC,MAAM,cAAc,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,YAAY,GAAG,MAAM,kBAAkB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACzD,IAAI,YAAY;QAAE,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAEnD,OAAO;QACL,EAAE,EAAE,IAAI;QACR,IAAI,EAAE;YACJ,WAAW,EAAE,kBAAkB,EAAE;YACjC,SAAS,EAAE;gBACT,KAAK,EAAE,GAAG,CAAC,SAAS,CAAC,SAAS;gBAC9B,MAAM,EAAE,GAAG,CAAC,SAAS,CAAC,MAAM;aAC7B;YACD,KAAK,EAAE;gBACL,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE;gBAC/B,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE;gBAC7B,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE;aAC1C;YACD,OAAO,EAAE;gBACP,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW;gBACrC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;gBAC7B,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;gBAC1B,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1E,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC9E;YACD,KAAK,EAAE;gBACL,SAAS,EAAE,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjD,OAAO,EAAE,aAAa;aACvB;SACF;QACD,QAAQ,EAAE,CAAC;KACZ,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,GAAe,EACf,IAAY,EACZ,MAAqB;IAErB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC,CAAC;IACtE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAC1E,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEvD,OAAO;QACL,MAAM;QACN,IAAI,EAAE,SAAS;QACf,SAAS;QACT,GAAG,CAAC,cAAc;YAChB,CAAC,CAAC;gBACE,eAAe,EAAE,IAAI;gBACrB,oBAAoB,EAAE,UAAU;gBAChC,uBAAuB,EAAE,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC;aAC9D;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAC/B,GAAe,EACf,IAAY;IAEZ,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAClE,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAEpD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACrE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,YAAY,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACzE,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAEvD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE,GAAG,eAAe,CAAC,CAAC;IAChD,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAClD,IAAI,aAAkC,CAAC;IACvC,IAAI,UAA+B,CAAC;IACpC,IAAI,WAA+B,CAAC;IAEpC,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyC,CAAC;YACvE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC;YACnC,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YACtD,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,WAAW,GAAG,mBAAmB,QAAQ,KAAM,GAAa,CAAC,OAAO,mEAAmE,CAAC;QAC1I,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,SAAS;QACf,SAAS;QACT,GAAG,CAAC,cAAc;YAChB,CAAC,CAAC;gBACE,eAAe,EAAE,IAAI;gBACrB,oBAAoB,EAAE,UAAU;gBAChC,uBAAuB,EAAE,aAAa,CAAC,UAAU,EAAE,SAAS,CAAC;aAC9D;YACH,CAAC,CAAC,EAAE,CAAC;QACP,YAAY,EAAE,WAAW;QACzB,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/E,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,iBAAiB,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,UAAkB,EAAE,SAAiB;IAC1D,OAAO,6BAA6B,UAAU,sBAAsB,SAAS,+HAA+H,CAAC;AAC/M,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/C,MAAM,GAAG,GAAG,OAAO,CAAC,uBAAuB,CAAyB,CAAC;QACrE,OAAO,GAAG,CAAC,OAAO,IAAI,SAAS,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
@@ -3,23 +3,24 @@ import type { CliContext } from "../../cli/types.js";
3
3
  import type { CommandResult } from "../../domain/types.js";
4
4
  export declare const SKILL_DIR_NAME = "agent-workflow";
5
5
  export declare const BUNDLED_SKILL_REL_PATH = "skills/agent-workflow";
6
+ export type InstallTarget = "claude" | "codex" | "agents";
7
+ export declare const TARGET_ROOTS: Record<InstallTarget, readonly string[]>;
8
+ export declare const AGENTS_LOCK_REL: readonly [".agents", ".skill-lock.json"];
9
+ export declare const LEGACY_SKILL_NAME = "agent-workflow-manager";
10
+ export interface SelfInstallTargetResult {
11
+ target: InstallTarget;
12
+ dest: string;
13
+ status: "installed" | "dry-run" | "skipped";
14
+ overwrote_existing: boolean;
15
+ files_copied?: number;
16
+ error?: string;
17
+ }
6
18
  export interface SelfInstallSkillData {
7
- status: "installed" | "dry-run";
19
+ status: "installed" | "dry-run" | "partial";
8
20
  source: string;
9
21
  source_kind: "path" | "bundled";
10
- dest: string;
11
- files_copied?: number;
12
- overwrote_existing?: boolean;
22
+ dests: SelfInstallTargetResult[];
13
23
  }
14
24
  export declare function selfInstallSkill(args: ParsedArgs, ctx: CliContext, resolveBundled?: () => Promise<string | null>): Promise<CommandResult<SelfInstallSkillData>>;
15
- /**
16
- * Resolve the bundled skill path by walking up from this module's directory
17
- * until a `skills/agent-workflow/SKILL.md` is found. Returns the directory
18
- * containing SKILL.md, or null if no candidate is reachable.
19
- *
20
- * Works in both dist (`dist/application/self/install-skill.js`) and dev
21
- * (`src/application/self/install-skill.ts` via a runner) layouts because the
22
- * walk-up looks for the marker file rather than a fixed depth.
23
- */
24
25
  export declare function resolveBundledSkillPath(): Promise<string | null>;
25
26
  //# sourceMappingURL=install-skill.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../../src/application/self/install-skill.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,sBAAsB,0BAA6B,CAAC;AAEjE,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IAChC,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,UAAU,EACf,cAAc,GAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAA2B,GACrE,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CAuH9C;AAiCD;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBtE"}
1
+ {"version":3,"file":"install-skill.d.ts","sourceRoot":"","sources":["../../../src/application/self/install-skill.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,eAAO,MAAM,cAAc,mBAAmB,CAAC;AAC/C,eAAO,MAAM,sBAAsB,0BAA6B,CAAC;AAEjE,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE1D,eAAO,MAAM,YAAY,EAAE,MAAM,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAIjE,CAAC;AAEF,eAAO,MAAM,eAAe,0CAA2C,CAAC;AACxE,eAAO,MAAM,iBAAiB,2BAA2B,CAAC;AAE1D,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,kBAAkB,EAAE,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,WAAW,GAAG,SAAS,GAAG,SAAS,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;IAChC,KAAK,EAAE,uBAAuB,EAAE,CAAC;CAClC;AAMD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,UAAU,EACf,cAAc,GAAE,MAAM,OAAO,CAAC,MAAM,GAAG,IAAI,CAA2B,GACrE,OAAO,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC,CA8E9C;AAuID,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBtE"}
@@ -3,49 +3,37 @@ import { dirname, join } from "node:path";
3
3
  import { fileURLToPath } from "node:url";
4
4
  export const SKILL_DIR_NAME = "agent-workflow";
5
5
  export const BUNDLED_SKILL_REL_PATH = `skills/${SKILL_DIR_NAME}`;
6
+ export const TARGET_ROOTS = {
7
+ claude: [".claude", "skills"],
8
+ codex: [".codex", "skills"],
9
+ agents: [".agents", "skills"],
10
+ };
11
+ export const AGENTS_LOCK_REL = [".agents", ".skill-lock.json"];
12
+ export const LEGACY_SKILL_NAME = "agent-workflow-manager";
13
+ const TARGET_CHOICES = ["claude", "codex", "agents", "all"];
14
+ const ALL_INSTALL_TARGETS = ["claude", "codex"];
6
15
  export async function selfInstallSkill(args, ctx, resolveBundled = resolveBundledSkillPath) {
7
16
  const force = args.flags.has("--force");
8
17
  const dryRun = args.flags.has("--dry-run");
9
- const fromArg = args.values.get("from");
10
- const dest = join(ctx.env.homeDir(), ".claude", "skills", SKILL_DIR_NAME);
11
- let sourceArg;
12
- let sourceKind;
13
- if (fromArg !== undefined) {
14
- if (looksLikeRemoteUrl(fromArg)) {
15
- return {
16
- ok: false,
17
- error: {
18
- code: "INVALID_SOURCE",
19
- message: "--from must be a local filesystem path. Remote URLs are no longer supported — the skill is bundled inside the CLI tarball. Drop --from to install the bundled skill, or pass a local checkout path.",
20
- },
21
- exitCode: 1,
22
- };
23
- }
24
- sourceArg = fromArg;
25
- sourceKind = "path";
26
- }
27
- else {
28
- const bundled = await resolveBundled();
29
- if (bundled === null) {
30
- return {
31
- ok: false,
32
- error: {
33
- code: "BUNDLED_NOT_FOUND",
34
- message: `Bundled skill not found relative to the CLI install. This usually means you are running from a dev checkout without a build, or the tarball is missing 'skills/'. Use --from <local-path> to override.`,
35
- },
36
- exitCode: 1,
37
- };
38
- }
39
- sourceArg = bundled;
40
- sourceKind = "bundled";
41
- }
42
- const destExists = await ctx.fs.exists(dest);
43
- if (destExists && !force && !dryRun) {
18
+ const targetArg = args.values.get("target") ?? "all";
19
+ const targetsResult = resolveTargets(targetArg);
20
+ if (!targetsResult.ok)
21
+ return targetsResult.result;
22
+ const targets = targetsResult.value;
23
+ const sourceResult = await resolveSource(args.values.get("from"), resolveBundled);
24
+ if (!sourceResult.ok)
25
+ return sourceResult.result;
26
+ const { sourceArg, sourceKind } = sourceResult.value;
27
+ const destByTarget = buildDestByTarget(ctx.env.homeDir());
28
+ const existingTargets = await Promise.all(targets.map(async (t) => ({ target: t, exists: await ctx.fs.exists(destByTarget[t]) })));
29
+ const blocking = existingTargets.filter((t) => t.exists && !force && !dryRun);
30
+ if (blocking.length > 0) {
31
+ const names = blocking.map((t) => destByTarget[t.target]).join(", ");
44
32
  return {
45
33
  ok: false,
46
34
  error: {
47
35
  code: "DEST_EXISTS",
48
- message: `Destination ${dest} already exists. Use --force to overwrite or --dry-run to preview.`,
36
+ message: `Destination already exists: ${names}. Use --force to overwrite, --dry-run to preview, or --target <claude|codex> to install only one.`,
49
37
  },
50
38
  exitCode: 1,
51
39
  };
@@ -57,14 +45,104 @@ export async function selfInstallSkill(args, ctx, resolveBundled = resolveBundle
57
45
  status: "dry-run",
58
46
  source: sourceArg,
59
47
  source_kind: sourceKind,
60
- dest,
61
- overwrote_existing: destExists,
48
+ dests: existingTargets.map((t) => ({
49
+ target: t.target,
50
+ dest: destByTarget[t.target],
51
+ status: "dry-run",
52
+ overwrote_existing: t.exists,
53
+ })),
62
54
  },
63
55
  exitCode: 0,
64
56
  };
65
57
  }
66
- const sourceExists = await ctx.fs.exists(sourceArg);
67
- if (!sourceExists) {
58
+ const validation = await validateSourceContents(sourceArg, ctx);
59
+ if (validation)
60
+ return validation;
61
+ const results = [];
62
+ for (const t of existingTargets) {
63
+ const dest = destByTarget[t.target];
64
+ if (t.exists && force) {
65
+ await rm(dest, { recursive: true, force: true });
66
+ }
67
+ const filesCopied = await copyTree(sourceArg, dest);
68
+ results.push({
69
+ target: t.target,
70
+ dest,
71
+ status: "installed",
72
+ overwrote_existing: t.exists,
73
+ files_copied: filesCopied,
74
+ });
75
+ }
76
+ return {
77
+ ok: true,
78
+ data: {
79
+ status: "installed",
80
+ source: sourceArg,
81
+ source_kind: sourceKind,
82
+ dests: results,
83
+ },
84
+ exitCode: 0,
85
+ };
86
+ }
87
+ function resolveTargets(targetArg) {
88
+ if (!TARGET_CHOICES.includes(targetArg)) {
89
+ return {
90
+ ok: false,
91
+ result: {
92
+ ok: false,
93
+ error: {
94
+ code: "INVALID_TARGET",
95
+ message: `--target must be one of: ${TARGET_CHOICES.join(", ")}. Got '${targetArg}'.`,
96
+ },
97
+ exitCode: 1,
98
+ },
99
+ };
100
+ }
101
+ const targets = targetArg === "all" ? [...ALL_INSTALL_TARGETS] : [targetArg];
102
+ return { ok: true, value: targets };
103
+ }
104
+ async function resolveSource(fromArg, resolveBundled) {
105
+ if (fromArg !== undefined) {
106
+ if (looksLikeRemoteUrl(fromArg)) {
107
+ return {
108
+ ok: false,
109
+ result: {
110
+ ok: false,
111
+ error: {
112
+ code: "INVALID_SOURCE",
113
+ message: "--from must be a local filesystem path. Remote URLs are no longer supported — the skill is bundled inside the CLI tarball. Drop --from to install the bundled skill, or pass a local checkout path.",
114
+ },
115
+ exitCode: 1,
116
+ },
117
+ };
118
+ }
119
+ return { ok: true, value: { sourceArg: fromArg, sourceKind: "path" } };
120
+ }
121
+ const bundled = await resolveBundled();
122
+ if (bundled === null) {
123
+ return {
124
+ ok: false,
125
+ result: {
126
+ ok: false,
127
+ error: {
128
+ code: "BUNDLED_NOT_FOUND",
129
+ message: `Bundled skill not found relative to the CLI install. This usually means you are running from a dev checkout without a build, or the tarball is missing 'skills/'. Use --from <local-path> to override.`,
130
+ },
131
+ exitCode: 1,
132
+ },
133
+ };
134
+ }
135
+ return { ok: true, value: { sourceArg: bundled, sourceKind: "bundled" } };
136
+ }
137
+ function buildDestByTarget(home) {
138
+ return {
139
+ claude: join(home, ...TARGET_ROOTS.claude, SKILL_DIR_NAME),
140
+ codex: join(home, ...TARGET_ROOTS.codex, SKILL_DIR_NAME),
141
+ agents: join(home, ...TARGET_ROOTS.agents, SKILL_DIR_NAME),
142
+ };
143
+ }
144
+ async function validateSourceContents(sourceArg, ctx) {
145
+ if (!(await ctx.fs.exists(sourceArg))) {
68
146
  return {
69
147
  ok: false,
70
148
  error: {
@@ -74,8 +152,7 @@ export async function selfInstallSkill(args, ctx, resolveBundled = resolveBundle
74
152
  exitCode: 1,
75
153
  };
76
154
  }
77
- const stagingDir = sourceArg;
78
- const skillPath = join(stagingDir, "SKILL.md");
155
+ const skillPath = join(sourceArg, "SKILL.md");
79
156
  if (!(await ctx.fs.exists(skillPath))) {
80
157
  return {
81
158
  ok: false,
@@ -97,29 +174,8 @@ export async function selfInstallSkill(args, ctx, resolveBundled = resolveBundle
97
174
  exitCode: 1,
98
175
  };
99
176
  }
100
- if (destExists && force) {
101
- await rm(dest, { recursive: true, force: true });
102
- }
103
- const filesCopied = await copyTree(stagingDir, dest);
104
- return {
105
- ok: true,
106
- data: {
107
- status: "installed",
108
- source: sourceArg,
109
- source_kind: sourceKind,
110
- dest,
111
- files_copied: filesCopied,
112
- overwrote_existing: destExists,
113
- },
114
- exitCode: 0,
115
- };
177
+ return null;
116
178
  }
117
- /**
118
- * Reject `--from` values that look like a remote URL up front so users get a
119
- * clear error instead of a confusing "path does not exist". The skill is
120
- * bundled-only since v3.0.2 — the standalone repo `Tacuchi/agent-workflow-manager`
121
- * is no longer maintained.
122
- */
123
179
  function looksLikeRemoteUrl(value) {
124
180
  return /^(https?:\/\/|git@|ssh:\/\/|git:\/\/)/.test(value);
125
181
  }
@@ -144,15 +200,6 @@ async function copyTree(src, dest) {
144
200
  });
145
201
  return count;
146
202
  }
147
- /**
148
- * Resolve the bundled skill path by walking up from this module's directory
149
- * until a `skills/agent-workflow/SKILL.md` is found. Returns the directory
150
- * containing SKILL.md, or null if no candidate is reachable.
151
- *
152
- * Works in both dist (`dist/application/self/install-skill.js`) and dev
153
- * (`src/application/self/install-skill.ts` via a runner) layouts because the
154
- * walk-up looks for the marker file rather than a fixed depth.
155
- */
156
203
  export async function resolveBundledSkillPath() {
157
204
  const here = dirname(fileURLToPath(import.meta.url));
158
205
  let current = here;
@@ -1 +1 @@
1
- {"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../../src/application/self/install-skill.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../../src/application/self/install-skill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { ParsedArgs } from "../../cli/parser.js";
2
+ import type { CliContext } from "../../cli/types.js";
3
+ import type { CommandResult } from "../../domain/types.js";
4
+ import { type InstallTarget } from "./install-skill.js";
5
+ export type UninstallTargetChoice = InstallTarget | "all";
6
+ export interface UninstallRemoval {
7
+ target: InstallTarget;
8
+ path: string;
9
+ kind: "canonical" | "legacy";
10
+ status: "removed" | "dry-run" | "skipped";
11
+ reason?: string;
12
+ }
13
+ export interface SelfUninstallSkillData {
14
+ status: "removed" | "dry-run" | "noop";
15
+ removed: UninstallRemoval[];
16
+ lock_updated: boolean;
17
+ lock_path?: string;
18
+ lock_warning?: string;
19
+ }
20
+ export declare function selfUninstallSkill(args: ParsedArgs, ctx: CliContext): Promise<CommandResult<SelfUninstallSkillData>>;
21
+ //# sourceMappingURL=uninstall-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall-skill.d.ts","sourceRoot":"","sources":["../../../src/application/self/uninstall-skill.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAEL,KAAK,aAAa,EAInB,MAAM,oBAAoB,CAAC;AAE5B,MAAM,MAAM,qBAAqB,GAAG,aAAa,GAAG,KAAK,CAAC;AAE1D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,WAAW,GAAG,QAAQ,CAAC;IAC7B,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,CAAC;IAC1C,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,sBAAsB;IACrC,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,MAAM,CAAC;IACvC,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC5B,YAAY,EAAE,OAAO,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAKD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,GAAG,EAAE,UAAU,GACd,OAAO,CAAC,aAAa,CAAC,sBAAsB,CAAC,CAAC,CAwChD"}
@@ -0,0 +1,105 @@
1
+ import { rm, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { AGENTS_LOCK_REL, LEGACY_SKILL_NAME, SKILL_DIR_NAME, TARGET_ROOTS, } from "./install-skill.js";
4
+ const TARGET_CHOICES = ["claude", "codex", "agents", "all"];
5
+ const ALL_TARGETS = ["claude", "codex", "agents"];
6
+ export async function selfUninstallSkill(args, ctx) {
7
+ const dryRun = args.flags.has("--dry-run");
8
+ const includeLegacy = args.flags.has("--legacy");
9
+ const targetArg = (args.values.get("target") ?? "all");
10
+ if (!TARGET_CHOICES.includes(targetArg)) {
11
+ return {
12
+ ok: false,
13
+ error: {
14
+ code: "INVALID_TARGET",
15
+ message: `--target must be one of: ${TARGET_CHOICES.join(", ")}. Got '${targetArg}'.`,
16
+ },
17
+ exitCode: 1,
18
+ };
19
+ }
20
+ const targets = targetArg === "all" ? [...ALL_TARGETS] : [targetArg];
21
+ const home = ctx.env.homeDir();
22
+ const removals = [];
23
+ for (const target of targets) {
24
+ removals.push(...(await removeFromTarget(ctx, home, target, includeLegacy, dryRun)));
25
+ }
26
+ const lockResult = targets.includes("agents")
27
+ ? await updateAgentsLock(ctx, home, includeLegacy, dryRun)
28
+ : { updated: false };
29
+ return {
30
+ ok: true,
31
+ data: {
32
+ status: resolveStatus(dryRun, removals.length),
33
+ removed: removals,
34
+ lock_updated: lockResult.updated,
35
+ ...(lockResult.path ? { lock_path: lockResult.path } : {}),
36
+ ...(lockResult.warning ? { lock_warning: lockResult.warning } : {}),
37
+ },
38
+ exitCode: 0,
39
+ };
40
+ }
41
+ async function removeFromTarget(ctx, home, target, includeLegacy, dryRun) {
42
+ const out = [];
43
+ const canonical = join(home, ...TARGET_ROOTS[target], SKILL_DIR_NAME);
44
+ if (await ctx.fs.exists(canonical)) {
45
+ if (!dryRun)
46
+ await rm(canonical, { recursive: true, force: true });
47
+ out.push({
48
+ target,
49
+ path: canonical,
50
+ kind: "canonical",
51
+ status: dryRun ? "dry-run" : "removed",
52
+ });
53
+ }
54
+ if (includeLegacy) {
55
+ const legacy = join(home, ...TARGET_ROOTS[target], LEGACY_SKILL_NAME);
56
+ if (await ctx.fs.exists(legacy)) {
57
+ if (!dryRun)
58
+ await rm(legacy, { recursive: true, force: true });
59
+ out.push({
60
+ target,
61
+ path: legacy,
62
+ kind: "legacy",
63
+ status: dryRun ? "dry-run" : "removed",
64
+ });
65
+ }
66
+ }
67
+ return out;
68
+ }
69
+ function resolveStatus(dryRun, removedCount) {
70
+ if (dryRun)
71
+ return "dry-run";
72
+ return removedCount === 0 ? "noop" : "removed";
73
+ }
74
+ async function updateAgentsLock(ctx, home, includeLegacy, dryRun) {
75
+ const lockPath = join(home, ...AGENTS_LOCK_REL);
76
+ if (!(await ctx.fs.exists(lockPath)))
77
+ return { updated: false };
78
+ let parsed;
79
+ try {
80
+ parsed = JSON.parse(await ctx.fs.readText(lockPath));
81
+ }
82
+ catch (err) {
83
+ return {
84
+ updated: false,
85
+ path: lockPath,
86
+ warning: `Could not parse ${lockPath}: ${err.message}. Lock left untouched.`,
87
+ };
88
+ }
89
+ const skills = (parsed.skills ?? {});
90
+ const before = Object.keys(skills);
91
+ const namesToRemove = [SKILL_DIR_NAME, ...(includeLegacy ? [LEGACY_SKILL_NAME] : [])];
92
+ for (const name of namesToRemove) {
93
+ delete skills[name];
94
+ }
95
+ const after = Object.keys(skills);
96
+ const changed = before.length !== after.length;
97
+ if (!changed)
98
+ return { updated: false, path: lockPath };
99
+ if (!dryRun) {
100
+ parsed.skills = skills;
101
+ await writeFile(lockPath, `${JSON.stringify(parsed, null, 2)}\n`, "utf8");
102
+ }
103
+ return { updated: true, path: lockPath };
104
+ }
105
+ //# sourceMappingURL=uninstall-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uninstall-skill.js","sourceRoot":"","sources":["../../../src/application/self/uninstall-skill.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"self.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/self.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAKjD,eAAO,MAAM,WAAW,EAAE,UAoCzB,CAAC"}
1
+ {"version":3,"file":"self.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/self.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAYjD,eAAO,MAAM,WAAW,EAAE,UAyCzB,CAAC"}
@@ -1,11 +1,20 @@
1
+ import { selfBootstrap } from "../../application/self/bootstrap.js";
1
2
  import { selfDoctor } from "../../application/self/doctor-self.js";
2
3
  import { selfInstallSkill } from "../../application/self/install-skill.js";
3
4
  import { selfNamespace } from "../../application/self/namespace-info.js";
5
+ import { selfUninstallSkill } from "../../application/self/uninstall-skill.js";
4
6
  import { selfUpdate } from "../../application/self/update-self.js";
5
- const SELF_SUBCOMMANDS = ["namespace", "doctor", "update", "install-skill"];
7
+ const SELF_SUBCOMMANDS = [
8
+ "namespace",
9
+ "doctor",
10
+ "update",
11
+ "install-skill",
12
+ "uninstall-skill",
13
+ "bootstrap",
14
+ ];
6
15
  export const selfCommand = {
7
16
  name: "self",
8
- describe: "Manage the agent-workflow CLI itself (namespace, doctor, update, install-skill).",
17
+ describe: "Manage the agent-workflow CLI itself (namespace, doctor, update, install-skill, uninstall-skill, bootstrap).",
9
18
  async execute(args, ctx) {
10
19
  const sub = args.rest[0];
11
20
  switch (sub) {
@@ -17,13 +26,17 @@ export const selfCommand = {
17
26
  return selfUpdate(args, ctx);
18
27
  case "install-skill":
19
28
  return selfInstallSkill(args, ctx);
29
+ case "uninstall-skill":
30
+ return selfUninstallSkill(args, ctx);
31
+ case "bootstrap":
32
+ return selfBootstrap(args, ctx);
20
33
  case undefined:
21
34
  case "":
22
35
  return {
23
36
  ok: true,
24
37
  data: {
25
38
  subcommands: [...SELF_SUBCOMMANDS],
26
- help_hint: "uso: aw self <subcommand>. Ej: 'aw self doctor' o 'aw self update --dry-run'",
39
+ help_hint: "uso: aw self <subcommand>. Ej: 'aw self bootstrap' (instalación limpia guiada) o 'aw self doctor'.",
27
40
  },
28
41
  exitCode: 0,
29
42
  };
@@ -1 +1 @@
1
- {"version":3,"file":"self.js","sourceRoot":"","sources":["../../../src/cli/commands/self.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAMnE,MAAM,gBAAgB,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,eAAe,CAAU,CAAC;AAErF,MAAM,CAAC,MAAM,WAAW,GAAe;IACrC,IAAI,EAAE,MAAM;IACZ,QAAQ,EAAE,kFAAkF;IAC5F,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,WAAW;gBACd,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;YAC5B,KAAK,QAAQ;gBACX,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;YACzB,KAAK,QAAQ;gBACX,OAAO,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC/B,KAAK,eAAe;gBAClB,OAAO,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACrC,KAAK,SAAS,CAAC;YACf,KAAK,EAAE;gBACL,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE;wBACJ,WAAW,EAAE,CAAC,GAAG,gBAAgB,CAAC;wBAClC,SAAS,EACP,8EAA8E;qBACjF;oBACD,QAAQ,EAAE,CAAC;iBACZ,CAAC;YACJ;gBACE,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE;wBACL,IAAI,EAAE,eAAe;wBACrB,OAAO,EAAE,6BAA6B,GAAG,iBAAiB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;qBACxF;oBACD,QAAQ,EAAE,CAAC;iBACZ,CAAC;QACN,CAAC;IACH,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"self.js","sourceRoot":"","sources":["../../../src/cli/commands/self.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,yCAAyC,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,2CAA2C,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,uCAAuC,CAAC;AAMnE,MAAM,gBAAgB,GAAG;IACvB,WAAW;IACX,QAAQ;IACR,QAAQ;IACR,eAAe;IACf,iBAAiB;IACjB,WAAW;CACH,CAAC;AAEX,MAAM,CAAC,MAAM,WAAW,GAAe;IACrC,IAAI,EAAE,MAAM;IACZ,QAAQ,EACN,8GAA8G;IAChH,KAAK,CAAC,OAAO,CAAC,IAAgB,EAAE,GAAe;QAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,QAAQ,GAAG,EAAE,CAAC;YACZ,KAAK,WAAW;gBACd,OAAO,aAAa,CAAC,GAAG,CAAC,CAAC;YAC5B,KAAK,QAAQ;gBACX,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC;YACzB,KAAK,QAAQ;gBACX,OAAO,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAC/B,KAAK,eAAe;gBAClB,OAAO,gBAAgB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACrC,KAAK,iBAAiB;gBACpB,OAAO,kBAAkB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YACvC,KAAK,WAAW;gBACd,OAAO,aAAa,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAClC,KAAK,SAAS,CAAC;YACf,KAAK,EAAE;gBACL,OAAO;oBACL,EAAE,EAAE,IAAI;oBACR,IAAI,EAAE;wBACJ,WAAW,EAAE,CAAC,GAAG,gBAAgB,CAAC;wBAClC,SAAS,EACP,oGAAoG;qBACvG;oBACD,QAAQ,EAAE,CAAC;iBACZ,CAAC;YACJ;gBACE,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE;wBACL,IAAI,EAAE,eAAe;wBACrB,OAAO,EAAE,6BAA6B,GAAG,iBAAiB,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG;qBACxF;oBACD,QAAQ,EAAE,CAAC;iBACZ,CAAC;QACN,CAAC;IACH,CAAC;CACF,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@tacuchi/agent-workflow-cli",
3
- "version": "5.5.1",
4
- "description": "Agnostic runtime CLI for session-lifecycle workflows. Auto-detects namespace from any `.<ns>/sessions/` dir in CWD; falls back to 'agent-workflow'. Plugins like `qtc-workflow-plugin` reclaim a fixed namespace via SessionStart hook (writes to `~/.config/agent-workflow/namespace`). Bundles the universal `agent-workflow` skill in the tarball — `self install-skill` copies it from the bundled location to `~/.claude/skills/agent-workflow/`. Override the source with `--from <local-path>` for skill development.",
3
+ "version": "5.7.0",
4
+ "description": "Agnostic runtime CLI for session-lifecycle workflows. Auto-detects namespace from any `.<ns>/sessions/` dir in CWD; falls back to 'agent-workflow'. Plugins like `qtc-workflow-plugin` reclaim a fixed namespace via SessionStart hook (writes to `~/.config/agent-workflow/namespace`). Bundles the universal `agent-workflow` skill in the tarball — `self install-skill` copies it from the bundled location to `~/.claude/skills/agent-workflow/` and `~/.codex/skills/agent-workflow/` (dual-target by default; opt-out with `--target claude|codex`). Override the source with `--from <local-path>` for skill development.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "agent-workflow": "./dist/cli/main.js",