skill-flow 1.0.8 → 1.3.3

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 (143) hide show
  1. package/README.md +209 -131
  2. package/README.zh.md +170 -131
  3. package/dist/bridge-command.d.ts +9 -0
  4. package/dist/bridge-command.js +422 -0
  5. package/dist/bridge-command.js.map +1 -0
  6. package/dist/cli.js +68 -8
  7. package/dist/cli.js.map +1 -1
  8. package/package.json +11 -2
  9. package/dist/adapters/channel-adapters.d.ts +0 -8
  10. package/dist/adapters/channel-adapters.js +0 -64
  11. package/dist/adapters/channel-adapters.js.map +0 -1
  12. package/dist/domain/types.d.ts +0 -234
  13. package/dist/domain/types.js +0 -2
  14. package/dist/domain/types.js.map +0 -1
  15. package/dist/services/config-coordinator.d.ts +0 -38
  16. package/dist/services/config-coordinator.js +0 -83
  17. package/dist/services/config-coordinator.js.map +0 -1
  18. package/dist/services/deployment-applier.d.ts +0 -10
  19. package/dist/services/deployment-applier.js +0 -84
  20. package/dist/services/deployment-applier.js.map +0 -1
  21. package/dist/services/deployment-planner.d.ts +0 -16
  22. package/dist/services/deployment-planner.js +0 -366
  23. package/dist/services/deployment-planner.js.map +0 -1
  24. package/dist/services/doctor-service.d.ts +0 -7
  25. package/dist/services/doctor-service.js +0 -204
  26. package/dist/services/doctor-service.js.map +0 -1
  27. package/dist/services/inventory-service.d.ts +0 -17
  28. package/dist/services/inventory-service.js +0 -216
  29. package/dist/services/inventory-service.js.map +0 -1
  30. package/dist/services/skill-flow.d.ts +0 -136
  31. package/dist/services/skill-flow.js +0 -1210
  32. package/dist/services/skill-flow.js.map +0 -1
  33. package/dist/services/source-service.d.ts +0 -57
  34. package/dist/services/source-service.js +0 -809
  35. package/dist/services/source-service.js.map +0 -1
  36. package/dist/services/workflow-service.d.ts +0 -5
  37. package/dist/services/workflow-service.js +0 -45
  38. package/dist/services/workflow-service.js.map +0 -1
  39. package/dist/services/workspace-bootstrap-service.d.ts +0 -25
  40. package/dist/services/workspace-bootstrap-service.js +0 -140
  41. package/dist/services/workspace-bootstrap-service.js.map +0 -1
  42. package/dist/state/store.d.ts +0 -35
  43. package/dist/state/store.js +0 -151
  44. package/dist/state/store.js.map +0 -1
  45. package/dist/tests/add-flow-model.test.d.ts +0 -1
  46. package/dist/tests/add-flow-model.test.js +0 -108
  47. package/dist/tests/add-flow-model.test.js.map +0 -1
  48. package/dist/tests/add-flow-ui.test.d.ts +0 -1
  49. package/dist/tests/add-flow-ui.test.js +0 -16
  50. package/dist/tests/add-flow-ui.test.js.map +0 -1
  51. package/dist/tests/add-prepare-flow.test.d.ts +0 -1
  52. package/dist/tests/add-prepare-flow.test.js +0 -166
  53. package/dist/tests/add-prepare-flow.test.js.map +0 -1
  54. package/dist/tests/add-selection-and-find-command.test.d.ts +0 -1
  55. package/dist/tests/add-selection-and-find-command.test.js +0 -89
  56. package/dist/tests/add-selection-and-find-command.test.js.map +0 -1
  57. package/dist/tests/clawhub.test.d.ts +0 -1
  58. package/dist/tests/clawhub.test.js +0 -63
  59. package/dist/tests/clawhub.test.js.map +0 -1
  60. package/dist/tests/cli-utils.test.d.ts +0 -1
  61. package/dist/tests/cli-utils.test.js +0 -24
  62. package/dist/tests/cli-utils.test.js.map +0 -1
  63. package/dist/tests/config-coordinator.test.d.ts +0 -1
  64. package/dist/tests/config-coordinator.test.js +0 -219
  65. package/dist/tests/config-coordinator.test.js.map +0 -1
  66. package/dist/tests/config-integration.test.d.ts +0 -1
  67. package/dist/tests/config-integration.test.js +0 -276
  68. package/dist/tests/config-integration.test.js.map +0 -1
  69. package/dist/tests/config-ui-utils.test.d.ts +0 -1
  70. package/dist/tests/config-ui-utils.test.js +0 -523
  71. package/dist/tests/config-ui-utils.test.js.map +0 -1
  72. package/dist/tests/find-and-naming-utils.test.d.ts +0 -1
  73. package/dist/tests/find-and-naming-utils.test.js +0 -127
  74. package/dist/tests/find-and-naming-utils.test.js.map +0 -1
  75. package/dist/tests/inventory-service-precedence.test.d.ts +0 -1
  76. package/dist/tests/inventory-service-precedence.test.js +0 -42
  77. package/dist/tests/inventory-service-precedence.test.js.map +0 -1
  78. package/dist/tests/skill-flow.test.d.ts +0 -1
  79. package/dist/tests/skill-flow.test.js +0 -991
  80. package/dist/tests/skill-flow.test.js.map +0 -1
  81. package/dist/tests/source-lifecycle.test.d.ts +0 -1
  82. package/dist/tests/source-lifecycle.test.js +0 -644
  83. package/dist/tests/source-lifecycle.test.js.map +0 -1
  84. package/dist/tests/source-parsing-compatibility.test.d.ts +0 -1
  85. package/dist/tests/source-parsing-compatibility.test.js +0 -72
  86. package/dist/tests/source-parsing-compatibility.test.js.map +0 -1
  87. package/dist/tests/target-definitions.test.d.ts +0 -1
  88. package/dist/tests/target-definitions.test.js +0 -51
  89. package/dist/tests/target-definitions.test.js.map +0 -1
  90. package/dist/tests/test-helpers.d.ts +0 -18
  91. package/dist/tests/test-helpers.js +0 -123
  92. package/dist/tests/test-helpers.js.map +0 -1
  93. package/dist/tui/add-flow-model.d.ts +0 -62
  94. package/dist/tui/add-flow-model.js +0 -206
  95. package/dist/tui/add-flow-model.js.map +0 -1
  96. package/dist/tui/add-flow.d.ts +0 -25
  97. package/dist/tui/add-flow.js +0 -534
  98. package/dist/tui/add-flow.js.map +0 -1
  99. package/dist/tui/config-app.d.ts +0 -178
  100. package/dist/tui/config-app.js +0 -1551
  101. package/dist/tui/config-app.js.map +0 -1
  102. package/dist/tui/find-app.d.ts +0 -9
  103. package/dist/tui/find-app.js +0 -150
  104. package/dist/tui/find-app.js.map +0 -1
  105. package/dist/tui/selection-state.d.ts +0 -8
  106. package/dist/tui/selection-state.js +0 -32
  107. package/dist/tui/selection-state.js.map +0 -1
  108. package/dist/utils/builtin-git-sources.d.ts +0 -5
  109. package/dist/utils/builtin-git-sources.js +0 -23
  110. package/dist/utils/builtin-git-sources.js.map +0 -1
  111. package/dist/utils/clawhub.d.ts +0 -41
  112. package/dist/utils/clawhub.js +0 -94
  113. package/dist/utils/clawhub.js.map +0 -1
  114. package/dist/utils/cli.d.ts +0 -2
  115. package/dist/utils/cli.js +0 -19
  116. package/dist/utils/cli.js.map +0 -1
  117. package/dist/utils/constants.d.ts +0 -23
  118. package/dist/utils/constants.js +0 -195
  119. package/dist/utils/constants.js.map +0 -1
  120. package/dist/utils/find-command.d.ts +0 -2
  121. package/dist/utils/find-command.js +0 -29
  122. package/dist/utils/find-command.js.map +0 -1
  123. package/dist/utils/format.d.ts +0 -7
  124. package/dist/utils/format.js +0 -68
  125. package/dist/utils/format.js.map +0 -1
  126. package/dist/utils/fs.d.ts +0 -16
  127. package/dist/utils/fs.js +0 -144
  128. package/dist/utils/fs.js.map +0 -1
  129. package/dist/utils/git.d.ts +0 -3
  130. package/dist/utils/git.js +0 -12
  131. package/dist/utils/git.js.map +0 -1
  132. package/dist/utils/github-catalog.d.ts +0 -1
  133. package/dist/utils/github-catalog.js +0 -25
  134. package/dist/utils/github-catalog.js.map +0 -1
  135. package/dist/utils/naming.d.ts +0 -29
  136. package/dist/utils/naming.js +0 -115
  137. package/dist/utils/naming.js.map +0 -1
  138. package/dist/utils/result.d.ts +0 -4
  139. package/dist/utils/result.js +0 -15
  140. package/dist/utils/result.js.map +0 -1
  141. package/dist/utils/source-id.d.ts +0 -2
  142. package/dist/utils/source-id.js +0 -49
  143. package/dist/utils/source-id.js.map +0 -1
@@ -1,16 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { ADD_BADGE_TEXT, getAddLoadingLabel } from "../tui/add-flow.js";
3
- describe("add flow ui", () => {
4
- test("uses the skill flow badge title", () => {
5
- expect(ADD_BADGE_TEXT).toBe(" skill flow ");
6
- });
7
- test("maps loading phases to visible progress labels", () => {
8
- expect(getAddLoadingLabel("loading")).toBe("Preparing source and discovering skills...");
9
- expect(getAddLoadingLabel("agents-loading")).toBe("Loading available agents...");
10
- expect(getAddLoadingLabel("applying")).toBe("Applying selected skills and agents...");
11
- expect(getAddLoadingLabel("rolling-back")).toBe("Rolling back imported source...");
12
- expect(getAddLoadingLabel("skills")).toBeUndefined();
13
- expect(getAddLoadingLabel("done")).toBeUndefined();
14
- });
15
- });
16
- //# sourceMappingURL=add-flow-ui.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-flow-ui.test.js","sourceRoot":"","sources":["../../src/tests/add-flow-ui.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,IAAI,CAAC,iCAAiC,EAAE,GAAG,EAAE;QAC3C,MAAM,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACzF,MAAM,CAAC,kBAAkB,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;QACjF,MAAM,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC;QACtF,MAAM,CAAC,kBAAkB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QACnF,MAAM,CAAC,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACrD,MAAM,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,166 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { SkillFlowApp } from "../services/skill-flow.js";
3
- import { createRepo, skillDoc, useSkillFlowSandbox } from "./test-helpers.js";
4
- describe.sequential("add prepare flow", () => {
5
- const sandbox = useSkillFlowSandbox();
6
- test("prepareAddSource imports the source without binding all detected agents", async () => {
7
- const repoPath = await createRepo(sandbox.sandboxRoot, {
8
- "browse/SKILL.md": skillDoc("browse", "Browser flow."),
9
- "review/SKILL.md": skillDoc("review", "Review flow."),
10
- });
11
- const app = new SkillFlowApp();
12
- const result = await app.prepareAddSource(repoPath);
13
- expect(result.ok).toBe(true);
14
- if (!result.ok) {
15
- return;
16
- }
17
- expect(result.data.projected).toBe(false);
18
- expect(result.data.availableTargets).toContain("claude-code");
19
- expect(result.data.draft.enabledTargets).toContain("claude-code");
20
- expect(result.data.draft.selectedLeafIds).toEqual([
21
- `${result.data.sourceId}:browse`,
22
- `${result.data.sourceId}:review`,
23
- ]);
24
- const manifest = await app.store.readManifest();
25
- expect(manifest.bindings[result.data.sourceId]?.targets).toEqual({});
26
- });
27
- test("prepareAddSource keeps path as a preselection boundary only", async () => {
28
- const repoPath = await createRepo(sandbox.sandboxRoot, {
29
- "skills/find-skills/SKILL.md": skillDoc("find-skills", "Find skills."),
30
- "skills/review/SKILL.md": skillDoc("review", "Review code."),
31
- });
32
- const app = new SkillFlowApp();
33
- const result = await app.prepareAddSource(repoPath, { path: "./skills/find-skills/" });
34
- expect(result.ok).toBe(true);
35
- if (!result.ok) {
36
- return;
37
- }
38
- expect(result.data.leafs.map((leaf) => leaf.relativePath)).toEqual([
39
- "skills/find-skills",
40
- "skills/review",
41
- ]);
42
- expect(result.data.draft.selectedLeafIds).toEqual([
43
- `${result.data.sourceId}:skills/find-skills`,
44
- ]);
45
- });
46
- test("prepareAddSource supports explicit skill and agent preselection", async () => {
47
- const repoPath = await createRepo(sandbox.sandboxRoot, {
48
- "skills/find-skills/SKILL.md": skillDoc("find-skills", "Find skills."),
49
- "skills/review/SKILL.md": skillDoc("review", "Review code."),
50
- });
51
- const app = new SkillFlowApp();
52
- const result = await app.prepareAddSource(repoPath, {
53
- skillNames: ["review"],
54
- agentTargets: ["codex", "openclaw"],
55
- });
56
- expect(result.ok).toBe(true);
57
- if (!result.ok) {
58
- return;
59
- }
60
- expect(result.data.draft.enabledTargets).toEqual(["codex", "openclaw"]);
61
- expect(result.data.draft.selectedLeafIds).toEqual([
62
- `${result.data.sourceId}:skills/review`,
63
- ]);
64
- });
65
- test("rollbackPreparedSource removes a prepared source before any deployment exists", async () => {
66
- const repoPath = await createRepo(sandbox.sandboxRoot, {
67
- "browse/SKILL.md": skillDoc("browse", "Browser flow."),
68
- });
69
- const app = new SkillFlowApp();
70
- const prepared = await app.prepareAddSource(repoPath);
71
- expect(prepared.ok).toBe(true);
72
- if (!prepared.ok) {
73
- return;
74
- }
75
- const rollback = await app.rollbackPreparedSource(prepared.data.sourceId);
76
- expect(rollback.ok).toBe(true);
77
- if (!rollback.ok) {
78
- return;
79
- }
80
- const manifest = await app.store.readManifest();
81
- expect(manifest.sources).toHaveLength(0);
82
- expect(manifest.bindings[prepared.data.sourceId]).toBeUndefined();
83
- });
84
- test("prepareAddSource rejects ambiguous skill selectors", async () => {
85
- const repoPath = await createRepo(sandbox.sandboxRoot, {
86
- "skills/review/SKILL.md": skillDoc("review", "Review flow."),
87
- "nested/review/SKILL.md": skillDoc("review", "Another review flow."),
88
- });
89
- const app = new SkillFlowApp();
90
- const result = await app.prepareAddSource(repoPath, {
91
- skillNames: ["review"],
92
- });
93
- expect(result.ok).toBe(false);
94
- if (result.ok) {
95
- return;
96
- }
97
- expect(result.errors[0]?.code).toBe("ADD_SKILL_SELECTOR_AMBIGUOUS");
98
- });
99
- test("prepareAddSource rejects unavailable agent selectors", async () => {
100
- const repoPath = await createRepo(sandbox.sandboxRoot, {
101
- "review/SKILL.md": skillDoc("review", "Review flow."),
102
- });
103
- const app = new SkillFlowApp();
104
- const result = await app.prepareAddSource(repoPath, {
105
- agentTargets: ["not-real"],
106
- });
107
- expect(result.ok).toBe(false);
108
- if (result.ok) {
109
- return;
110
- }
111
- expect(result.errors[0]?.code).toBe("ADD_AGENT_NOT_AVAILABLE");
112
- });
113
- test("applyDraft keeps imported source when no skills or agents are selected", async () => {
114
- const repoPath = await createRepo(sandbox.sandboxRoot, {
115
- "review/SKILL.md": skillDoc("review", "Review flow."),
116
- });
117
- const app = new SkillFlowApp();
118
- const prepared = await app.prepareAddSource(repoPath, { skipTargetDetection: true });
119
- expect(prepared.ok).toBe(true);
120
- if (!prepared.ok) {
121
- return;
122
- }
123
- const applied = await app.applyDraft(prepared.data.sourceId, {
124
- selectedLeafIds: [],
125
- enabledTargets: [],
126
- });
127
- expect(applied.ok).toBe(true);
128
- if (!applied.ok) {
129
- return;
130
- }
131
- const { manifest, lockFile } = await app.store.readState();
132
- expect(manifest.sources.some((source) => source.id === prepared.data.sourceId)).toBe(true);
133
- expect(manifest.bindings[prepared.data.sourceId]?.targets).toEqual({});
134
- expect(lockFile.deployments.some((deployment) => deployment.sourceId === prepared.data.sourceId)).toBe(false);
135
- });
136
- test("config bootstrap keeps selected skills when add is saved with no enabled agents", async () => {
137
- const repoPath = await createRepo(sandbox.sandboxRoot, {
138
- "browse/SKILL.md": skillDoc("browse", "Browser flow."),
139
- "review/SKILL.md": skillDoc("review", "Review flow."),
140
- });
141
- const app = new SkillFlowApp();
142
- const prepared = await app.prepareAddSource(repoPath, { skipTargetDetection: true });
143
- expect(prepared.ok).toBe(true);
144
- if (!prepared.ok) {
145
- return;
146
- }
147
- const applied = await app.applyDraft(prepared.data.sourceId, {
148
- selectedLeafIds: [...prepared.data.draft.selectedLeafIds],
149
- enabledTargets: [],
150
- });
151
- expect(applied.ok).toBe(true);
152
- if (!applied.ok) {
153
- return;
154
- }
155
- const boot = await app.configCoordinator.bootstrapWorkspaceState();
156
- expect(boot.ok).toBe(true);
157
- if (!boot.ok) {
158
- return;
159
- }
160
- expect(boot.data.initialDrafts[prepared.data.sourceId]).toEqual({
161
- enabledTargets: [],
162
- selectedLeafIds: [...prepared.data.draft.selectedLeafIds].sort(),
163
- });
164
- });
165
- });
166
- //# sourceMappingURL=add-prepare-flow.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-prepare-flow.test.js","sourceRoot":"","sources":["../../src/tests/add-prepare-flow.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,89 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { SkillFlowApp } from "../services/skill-flow.js";
3
- import { buildFindCommand } from "../utils/find-command.js";
4
- import { createRepo, skillDoc, useSkillFlowSandbox } from "./test-helpers.js";
5
- describe.sequential("add selection and find command regression", () => {
6
- const sandbox = useSkillFlowSandbox();
7
- test("normalizes subpath imports and warns when only part of a group is preselected", async () => {
8
- const repoPath = await createRepo(sandbox.sandboxRoot, {
9
- "skills/find-skills/SKILL.md": skillDoc("find-skills", "Find skills."),
10
- "skills/review/SKILL.md": skillDoc("review", "Review code."),
11
- });
12
- const app = new SkillFlowApp();
13
- const result = await app.addSource(repoPath, { path: "./skills/find-skills/" });
14
- expect(result.ok).toBe(true);
15
- if (!result.ok) {
16
- return;
17
- }
18
- expect(result.data.manifest.requestedPath).toBe("skills/find-skills");
19
- expect(result.data.manifest.selectionMode).toBe("partial");
20
- expect(result.data.leafCount).toBe(2);
21
- expect(result.warnings).toEqual([
22
- {
23
- code: "ADD_SELECTION_PRESELECTED",
24
- message: "Preselected 1 of 2 skills under 'skills/find-skills'; the full skills group was imported.",
25
- },
26
- ]);
27
- const manifest = await app.store.readManifest();
28
- expect(manifest.sources[0]?.requestedPath).toBe("skills/find-skills");
29
- expect(manifest.sources[0]?.selectionMode).toBe("partial");
30
- expect(manifest.bindings[result.data.manifest.id]?.targets["claude-code"]?.leafIds).toEqual([
31
- `${result.data.manifest.id}:skills/find-skills`,
32
- ]);
33
- });
34
- test("treats no-op root paths as a full-group import", async () => {
35
- const repoPath = await createRepo(sandbox.sandboxRoot, {
36
- "SKILL.md": skillDoc("root", "Root skill."),
37
- });
38
- const app = new SkillFlowApp();
39
- const result = await app.addSource(repoPath, { path: "." });
40
- expect(result.ok).toBe(true);
41
- if (!result.ok) {
42
- return;
43
- }
44
- expect(result.data.manifest.requestedPath).toBeUndefined();
45
- expect(result.data.manifest.selectionMode).toBe("all");
46
- expect(result.warnings.some((warning) => warning.code === "ADD_SELECTION_PRESELECTED")).toBe(false);
47
- const manifest = await app.store.readManifest();
48
- expect(manifest.sources[0]?.requestedPath).toBeUndefined();
49
- expect(manifest.sources[0]?.selectionMode).toBe("all");
50
- expect(manifest.bindings[result.data.manifest.id]?.targets["claude-code"]?.leafIds).toEqual([
51
- `${result.data.manifest.id}:.`,
52
- ]);
53
- });
54
- test("builds predictable follow-up add commands from search candidates", () => {
55
- expect(buildFindCommand({
56
- id: "builtin:root",
57
- title: "skills",
58
- description: "Root skills",
59
- source: "builtin-git",
60
- sourceLabel: "skills(@anthropics)",
61
- sourceId: "anthropics-skills",
62
- sourceKind: "git",
63
- locator: "https://github.com/anthropics/skills.git",
64
- installed: false,
65
- action: {
66
- type: "add-git",
67
- locator: "https://github.com/anthropics/skills.git",
68
- requestedPath: ".",
69
- },
70
- })).toBe("skill-flow add https://github.com/anthropics/skills.git");
71
- expect(buildFindCommand({
72
- id: "builtin:path",
73
- title: "find-skills",
74
- description: "Find skills",
75
- source: "builtin-git",
76
- sourceLabel: "skills(@anthropics)",
77
- sourceId: "anthropics-skills",
78
- sourceKind: "git",
79
- locator: "https://github.com/anthropics/skills.git",
80
- installed: false,
81
- action: {
82
- type: "add-git",
83
- locator: "https://github.com/anthropics/skills.git",
84
- requestedPath: "./skills/find-skills/",
85
- },
86
- })).toBe("skill-flow add https://github.com/anthropics/skills.git --path skills/find-skills");
87
- });
88
- });
89
- //# sourceMappingURL=add-selection-and-find-command.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"add-selection-and-find-command.test.js","sourceRoot":"","sources":["../../src/tests/add-selection-and-find-command.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,63 +0,0 @@
1
- import { describe, expect, test, vi, beforeEach } from "vitest";
2
- import { installClawHubSkill, searchClawHubSkills, } from "../utils/clawhub.js";
3
- const execFileMock = vi.hoisted(() => vi.fn());
4
- vi.mock("node:child_process", () => ({
5
- execFile: Object.assign(execFileMock, {
6
- [Symbol.for("nodejs.util.promisify.custom")](_command, _args, _options) {
7
- return new Promise((resolve, reject) => {
8
- execFileMock(_command, _args, _options, (error, stdout, stderr) => {
9
- if (error) {
10
- reject(error);
11
- return;
12
- }
13
- resolve({ stdout, stderr });
14
- });
15
- });
16
- },
17
- }),
18
- }));
19
- describe("clawhub utils", () => {
20
- beforeEach(() => {
21
- execFileMock.mockReset();
22
- });
23
- test("parses the actual clawhub search output shape", async () => {
24
- execFileMock.mockImplementation((_command, _args, _options, callback) => {
25
- callback(null, [
26
- "- Searching",
27
- "summarize Summarize (4.030)",
28
- "20206-02-10-clawhub-summarize-1-0-0 20206 02 10 Clawhub Summarize 1.0.0 (3.596)",
29
- "summarize-pro Summarize Pro (3.579)",
30
- "summarize-file Summarize File (3.551)",
31
- "summarize-1-0-0 Summarize 1.0.0 (3.540)",
32
- ].join("\n"), "");
33
- });
34
- await expect(searchClawHubSkills("summarize", 5)).resolves.toEqual([
35
- { slug: "summarize", title: "Summarize", score: 4.03 },
36
- {
37
- slug: "20206-02-10-clawhub-summarize-1-0-0",
38
- title: "20206 02 10 Clawhub Summarize 1.0.0",
39
- score: 3.596,
40
- },
41
- { slug: "summarize-pro", title: "Summarize Pro", score: 3.579 },
42
- { slug: "summarize-file", title: "Summarize File", score: 3.551 },
43
- { slug: "summarize-1-0-0", title: "Summarize 1.0.0", score: 3.54 },
44
- ]);
45
- });
46
- test("surfaces suspicious install failures as an explicit security block", async () => {
47
- execFileMock.mockImplementation((_command, _args, _options, callback) => {
48
- const error = Object.assign(new Error("Command failed"), {
49
- stderr: [
50
- "Error: Use --force to install suspicious skills in non-interactive mode",
51
- '⚠️ Warning: "agent-browser" is flagged as suspicious by VirusTotal Code Insight.',
52
- ].join("\n"),
53
- });
54
- callback(error, "", error.stderr);
55
- });
56
- const result = installClawHubSkill("agent-browser");
57
- await expect(result).rejects.toMatchObject({
58
- name: "ClawHubSecurityBlockError",
59
- message: "ClawHub security block: 'agent-browser' is flagged as suspicious. Use --force to install suspicious skills in non-interactive mode.",
60
- });
61
- });
62
- });
63
- //# sourceMappingURL=clawhub.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"clawhub.test.js","sourceRoot":"","sources":["../../src/tests/clawhub.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,24 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { filterAddWarnings, resolveAddSourceLocator } from "../utils/cli.js";
3
- describe("cli utils", () => {
4
- test("leaves direct source locators unchanged without a catalog override", () => {
5
- expect(resolveAddSourceLocator("JimLiu/baoyu-skills")).toBe("JimLiu/baoyu-skills");
6
- });
7
- test("maps --from clawhub sources to clawhub locators", () => {
8
- expect(resolveAddSourceLocator("find-skills-skill", "clawhub")).toBe("clawhub:find-skills-skill");
9
- expect(resolveAddSourceLocator("clawhub:find-skills-skill", "clawhub")).toBe("clawhub:find-skills-skill");
10
- });
11
- test("rejects unsupported source catalogs", () => {
12
- expect(() => resolveAddSourceLocator("find-skills-skill", "github")).toThrow("Unsupported source catalog 'github'.");
13
- });
14
- test("filters generated duplicate add warnings but keeps other warnings", () => {
15
- expect(filterAddWarnings([
16
- ".agents/skills/adapt: Duplicate skill content skipped because source/skills/adapt was discovered first",
17
- ".codex/skills/animate: Duplicate skill content skipped because source/skills/animate was discovered first",
18
- "source/skills/broken: Missing title",
19
- ])).toEqual([
20
- "source/skills/broken: Missing title",
21
- ]);
22
- });
23
- });
24
- //# sourceMappingURL=cli-utils.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cli-utils.test.js","sourceRoot":"","sources":["../../src/tests/cli-utils.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,IAAI,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC9E,MAAM,CAAC,uBAAuB,CAAC,qBAAqB,CAAC,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACrF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,uBAAuB,CAAC,mBAAmB,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAClE,2BAA2B,CAC5B,CAAC;QACF,MAAM,CAAC,uBAAuB,CAAC,2BAA2B,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAC1E,2BAA2B,CAC5B,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG,EAAE,CAAC,uBAAuB,CAAC,mBAAmB,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAC1E,sCAAsC,CACvC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mEAAmE,EAAE,GAAG,EAAE;QAC7E,MAAM,CACJ,iBAAiB,CAAC;YAChB,wGAAwG;YACxG,2GAA2G;YAC3G,qCAAqC;SACtC,CAAC,CACH,CAAC,OAAO,CAAC;YACR,qCAAqC;SACtC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,219 +0,0 @@
1
- import { describe, expect, test, vi } from "vitest";
2
- import { ConfigCoordinator } from "../services/config-coordinator.js";
3
- const manifest = {
4
- schemaVersion: 1,
5
- sources: [
6
- {
7
- id: "alpha",
8
- locator: "/tmp/alpha",
9
- kind: "local",
10
- displayName: "alpha",
11
- addedAt: "2026-03-23T00:00:00.000Z",
12
- },
13
- {
14
- id: "beta",
15
- locator: "/tmp/beta",
16
- kind: "local",
17
- displayName: "beta",
18
- addedAt: "2026-03-23T00:00:00.000Z",
19
- },
20
- ],
21
- bindings: {
22
- alpha: {
23
- targets: {
24
- codex: {
25
- enabled: true,
26
- leafIds: ["alpha:browse"],
27
- },
28
- },
29
- },
30
- beta: {
31
- targets: {},
32
- },
33
- },
34
- };
35
- const lockFile = {
36
- schemaVersion: 1,
37
- sources: [],
38
- leafInventory: [
39
- {
40
- id: "alpha:browse",
41
- sourceId: "alpha",
42
- name: "browse",
43
- linkName: "browse",
44
- title: "browse",
45
- description: "Browse things.",
46
- relativePath: "browse",
47
- absolutePath: "/tmp/alpha/browse",
48
- skillFilePath: "/tmp/alpha/browse/SKILL.md",
49
- contentHash: "hash-alpha",
50
- metadataWarnings: [],
51
- valid: true,
52
- },
53
- ],
54
- deployments: [],
55
- };
56
- const audit = {
57
- status: "HEALTHY",
58
- issues: [],
59
- };
60
- const summaries = [
61
- {
62
- source: manifest.sources[0],
63
- lock: undefined,
64
- leafs: [lockFile.leafInventory[0]],
65
- bindings: manifest.bindings.alpha,
66
- activeTargetCount: 1,
67
- health: "ACTIVE",
68
- issueCounts: { warning: 0, error: 0 },
69
- },
70
- {
71
- source: manifest.sources[1],
72
- lock: undefined,
73
- leafs: [],
74
- bindings: manifest.bindings.beta,
75
- activeTargetCount: 0,
76
- health: "INACTIVE",
77
- issueCounts: { warning: 0, error: 0 },
78
- },
79
- ];
80
- describe("ConfigCoordinator", () => {
81
- test("boots config and derives initial drafts from normalized summaries", async () => {
82
- const coordinator = new ConfigCoordinator({
83
- store: {
84
- init: vi.fn().mockResolvedValue(undefined),
85
- readManifest: vi.fn(),
86
- },
87
- doctorService: {
88
- run: vi.fn().mockResolvedValue({ ok: true, data: audit, warnings: [], errors: [] }),
89
- },
90
- workflowService: {
91
- getSummaries: vi.fn().mockReturnValue(summaries),
92
- },
93
- getAvailableTargets: vi.fn().mockResolvedValue(["codex"]),
94
- pruneMissingCheckouts: vi.fn().mockResolvedValue({
95
- ok: true,
96
- data: { removedSourceIds: [] },
97
- warnings: [],
98
- errors: [],
99
- }),
100
- getConfigData: vi.fn().mockResolvedValue({
101
- ok: true,
102
- data: { manifest, lockFile, summaries },
103
- warnings: [],
104
- errors: [],
105
- }),
106
- });
107
- const result = await coordinator.bootstrapWorkspaceState();
108
- expect(result.ok).toBe(true);
109
- if (!result.ok) {
110
- return;
111
- }
112
- expect(result.data.bootStatus).toEqual({
113
- phase: "success",
114
- updatedSourceIds: [],
115
- failedSources: [],
116
- });
117
- expect(result.data.initialDrafts).toEqual({
118
- alpha: {
119
- enabledTargets: ["codex"],
120
- selectedLeafIds: ["alpha:browse"],
121
- },
122
- beta: {
123
- enabledTargets: [],
124
- selectedLeafIds: [],
125
- },
126
- });
127
- });
128
- test("keeps config boot usable when prune removes missing groups", async () => {
129
- const onEvent = vi.fn();
130
- const coordinator = new ConfigCoordinator({
131
- store: {
132
- init: vi.fn().mockResolvedValue(undefined),
133
- readManifest: vi.fn(),
134
- },
135
- doctorService: {
136
- run: vi.fn().mockResolvedValue({ ok: true, data: audit, warnings: [], errors: [] }),
137
- },
138
- workflowService: {
139
- getSummaries: vi.fn().mockReturnValue(summaries),
140
- },
141
- getAvailableTargets: vi.fn().mockResolvedValue(["codex"]),
142
- pruneMissingCheckouts: vi.fn().mockResolvedValue({
143
- ok: true,
144
- data: { removedSourceIds: ["beta"] },
145
- warnings: [],
146
- errors: [],
147
- }),
148
- getConfigData: vi.fn().mockResolvedValue({
149
- ok: true,
150
- data: { manifest, lockFile, summaries },
151
- warnings: [],
152
- errors: [],
153
- }),
154
- });
155
- const result = await coordinator.bootstrapWorkspaceState(onEvent);
156
- expect(result.ok).toBe(true);
157
- if (!result.ok) {
158
- return;
159
- }
160
- expect(result.data.bootStatus).toEqual({
161
- phase: "success",
162
- updatedSourceIds: [],
163
- failedSources: [],
164
- });
165
- expect(onEvent).toHaveBeenCalledWith({
166
- phase: "refresh-sources",
167
- level: "warning",
168
- message: "Removed 1 missing group from config state.",
169
- });
170
- });
171
- test("restores selected skills from binding even when enabled targets are empty", async () => {
172
- const summariesWithLocalOnly = [
173
- {
174
- ...summaries[0],
175
- bindings: {
176
- selectedLeafIds: ["alpha:browse"],
177
- targets: {},
178
- },
179
- activeTargetCount: 0,
180
- health: "INACTIVE",
181
- },
182
- ];
183
- const coordinator = new ConfigCoordinator({
184
- store: {
185
- init: vi.fn().mockResolvedValue(undefined),
186
- readManifest: vi.fn(),
187
- },
188
- doctorService: {
189
- run: vi.fn().mockResolvedValue({ ok: true, data: audit, warnings: [], errors: [] }),
190
- },
191
- workflowService: {
192
- getSummaries: vi.fn().mockReturnValue(summariesWithLocalOnly),
193
- },
194
- getAvailableTargets: vi.fn().mockResolvedValue(["codex"]),
195
- pruneMissingCheckouts: vi.fn().mockResolvedValue({
196
- ok: true,
197
- data: { removedSourceIds: [] },
198
- warnings: [],
199
- errors: [],
200
- }),
201
- getConfigData: vi.fn().mockResolvedValue({
202
- ok: true,
203
- data: { manifest, lockFile, summaries: summariesWithLocalOnly },
204
- warnings: [],
205
- errors: [],
206
- }),
207
- });
208
- const result = await coordinator.bootstrapWorkspaceState();
209
- expect(result.ok).toBe(true);
210
- if (!result.ok) {
211
- return;
212
- }
213
- expect(result.data.initialDrafts.alpha).toEqual({
214
- enabledTargets: [],
215
- selectedLeafIds: ["alpha:browse"],
216
- });
217
- });
218
- });
219
- //# sourceMappingURL=config-coordinator.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config-coordinator.test.js","sourceRoot":"","sources":["../../src/tests/config-coordinator.test.ts"],"names":[],"mappings":"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"}