@sporesec/arcana 2.2.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 (181) hide show
  1. package/dist/cli.d.ts +3 -0
  2. package/dist/cli.d.ts.map +1 -0
  3. package/dist/cli.js +219 -0
  4. package/dist/cli.js.map +1 -0
  5. package/dist/commands/audit.d.ts +17 -0
  6. package/dist/commands/audit.d.ts.map +1 -0
  7. package/dist/commands/audit.js +157 -0
  8. package/dist/commands/audit.js.map +1 -0
  9. package/dist/commands/audit.test.d.ts +2 -0
  10. package/dist/commands/audit.test.d.ts.map +1 -0
  11. package/dist/commands/audit.test.js +217 -0
  12. package/dist/commands/audit.test.js.map +1 -0
  13. package/dist/commands/clean.d.ts +5 -0
  14. package/dist/commands/clean.d.ts.map +1 -0
  15. package/dist/commands/clean.js +125 -0
  16. package/dist/commands/clean.js.map +1 -0
  17. package/dist/commands/config.d.ts +4 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +135 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/create.d.ts +2 -0
  22. package/dist/commands/create.d.ts.map +1 -0
  23. package/dist/commands/create.js +100 -0
  24. package/dist/commands/create.js.map +1 -0
  25. package/dist/commands/doctor.d.ts +6 -0
  26. package/dist/commands/doctor.d.ts.map +1 -0
  27. package/dist/commands/doctor.js +213 -0
  28. package/dist/commands/doctor.js.map +1 -0
  29. package/dist/commands/info.d.ts +5 -0
  30. package/dist/commands/info.d.ts.map +1 -0
  31. package/dist/commands/info.js +114 -0
  32. package/dist/commands/info.js.map +1 -0
  33. package/dist/commands/init.d.ts +13 -0
  34. package/dist/commands/init.d.ts.map +1 -0
  35. package/dist/commands/init.js +216 -0
  36. package/dist/commands/init.js.map +1 -0
  37. package/dist/commands/install.d.ts +8 -0
  38. package/dist/commands/install.d.ts.map +1 -0
  39. package/dist/commands/install.js +404 -0
  40. package/dist/commands/install.js.map +1 -0
  41. package/dist/commands/list.d.ts +8 -0
  42. package/dist/commands/list.d.ts.map +1 -0
  43. package/dist/commands/list.js +100 -0
  44. package/dist/commands/list.js.map +1 -0
  45. package/dist/commands/providers.d.ts +6 -0
  46. package/dist/commands/providers.d.ts.map +1 -0
  47. package/dist/commands/providers.js +103 -0
  48. package/dist/commands/providers.js.map +1 -0
  49. package/dist/commands/scan.d.ts +5 -0
  50. package/dist/commands/scan.d.ts.map +1 -0
  51. package/dist/commands/scan.js +110 -0
  52. package/dist/commands/scan.js.map +1 -0
  53. package/dist/commands/search.d.ts +6 -0
  54. package/dist/commands/search.d.ts.map +1 -0
  55. package/dist/commands/search.js +58 -0
  56. package/dist/commands/search.js.map +1 -0
  57. package/dist/commands/stats.d.ts +4 -0
  58. package/dist/commands/stats.d.ts.map +1 -0
  59. package/dist/commands/stats.js +143 -0
  60. package/dist/commands/stats.js.map +1 -0
  61. package/dist/commands/uninstall.d.ts +6 -0
  62. package/dist/commands/uninstall.d.ts.map +1 -0
  63. package/dist/commands/uninstall.js +163 -0
  64. package/dist/commands/uninstall.js.map +1 -0
  65. package/dist/commands/update.d.ts +7 -0
  66. package/dist/commands/update.d.ts.map +1 -0
  67. package/dist/commands/update.js +348 -0
  68. package/dist/commands/update.js.map +1 -0
  69. package/dist/commands/validate.d.ts +6 -0
  70. package/dist/commands/validate.d.ts.map +1 -0
  71. package/dist/commands/validate.js +140 -0
  72. package/dist/commands/validate.js.map +1 -0
  73. package/dist/index.d.ts +3 -0
  74. package/dist/index.d.ts.map +1 -0
  75. package/dist/index.js +39 -0
  76. package/dist/index.js.map +1 -0
  77. package/dist/interactive.d.ts +2 -0
  78. package/dist/interactive.d.ts.map +1 -0
  79. package/dist/interactive.js +812 -0
  80. package/dist/interactive.js.map +1 -0
  81. package/dist/providers/arcana.d.ts +5 -0
  82. package/dist/providers/arcana.d.ts.map +1 -0
  83. package/dist/providers/arcana.js +11 -0
  84. package/dist/providers/arcana.js.map +1 -0
  85. package/dist/providers/base.d.ts +11 -0
  86. package/dist/providers/base.d.ts.map +1 -0
  87. package/dist/providers/base.js +10 -0
  88. package/dist/providers/base.js.map +1 -0
  89. package/dist/providers/github.d.ts +25 -0
  90. package/dist/providers/github.d.ts.map +1 -0
  91. package/dist/providers/github.js +146 -0
  92. package/dist/providers/github.js.map +1 -0
  93. package/dist/registry.d.ts +9 -0
  94. package/dist/registry.d.ts.map +1 -0
  95. package/dist/registry.js +71 -0
  96. package/dist/registry.js.map +1 -0
  97. package/dist/types.d.ts +67 -0
  98. package/dist/types.d.ts.map +1 -0
  99. package/dist/types.js +2 -0
  100. package/dist/types.js.map +1 -0
  101. package/dist/utils/atomic.d.ts +2 -0
  102. package/dist/utils/atomic.d.ts.map +1 -0
  103. package/dist/utils/atomic.js +20 -0
  104. package/dist/utils/atomic.js.map +1 -0
  105. package/dist/utils/atomic.test.d.ts +2 -0
  106. package/dist/utils/atomic.test.d.ts.map +1 -0
  107. package/dist/utils/atomic.test.js +31 -0
  108. package/dist/utils/atomic.test.js.map +1 -0
  109. package/dist/utils/cache.d.ts +4 -0
  110. package/dist/utils/cache.d.ts.map +1 -0
  111. package/dist/utils/cache.js +47 -0
  112. package/dist/utils/cache.js.map +1 -0
  113. package/dist/utils/config.d.ts +6 -0
  114. package/dist/utils/config.d.ts.map +1 -0
  115. package/dist/utils/config.js +90 -0
  116. package/dist/utils/config.js.map +1 -0
  117. package/dist/utils/config.test.d.ts +2 -0
  118. package/dist/utils/config.test.d.ts.map +1 -0
  119. package/dist/utils/config.test.js +38 -0
  120. package/dist/utils/config.test.js.map +1 -0
  121. package/dist/utils/errors.d.ts +6 -0
  122. package/dist/utils/errors.d.ts.map +1 -0
  123. package/dist/utils/errors.js +11 -0
  124. package/dist/utils/errors.js.map +1 -0
  125. package/dist/utils/frontmatter.d.ts +12 -0
  126. package/dist/utils/frontmatter.d.ts.map +1 -0
  127. package/dist/utils/frontmatter.js +172 -0
  128. package/dist/utils/frontmatter.js.map +1 -0
  129. package/dist/utils/frontmatter.test.d.ts +2 -0
  130. package/dist/utils/frontmatter.test.d.ts.map +1 -0
  131. package/dist/utils/frontmatter.test.js +152 -0
  132. package/dist/utils/frontmatter.test.js.map +1 -0
  133. package/dist/utils/fs.d.ts +16 -0
  134. package/dist/utils/fs.d.ts.map +1 -0
  135. package/dist/utils/fs.js +118 -0
  136. package/dist/utils/fs.js.map +1 -0
  137. package/dist/utils/fs.test.d.ts +2 -0
  138. package/dist/utils/fs.test.d.ts.map +1 -0
  139. package/dist/utils/fs.test.js +145 -0
  140. package/dist/utils/fs.test.js.map +1 -0
  141. package/dist/utils/help.d.ts +6 -0
  142. package/dist/utils/help.d.ts.map +1 -0
  143. package/dist/utils/help.js +117 -0
  144. package/dist/utils/help.js.map +1 -0
  145. package/dist/utils/help.test.d.ts +2 -0
  146. package/dist/utils/help.test.d.ts.map +1 -0
  147. package/dist/utils/help.test.js +66 -0
  148. package/dist/utils/help.test.js.map +1 -0
  149. package/dist/utils/history.d.ts +10 -0
  150. package/dist/utils/history.d.ts.map +1 -0
  151. package/dist/utils/history.js +58 -0
  152. package/dist/utils/history.js.map +1 -0
  153. package/dist/utils/http.d.ts +17 -0
  154. package/dist/utils/http.d.ts.map +1 -0
  155. package/dist/utils/http.js +165 -0
  156. package/dist/utils/http.js.map +1 -0
  157. package/dist/utils/http.test.d.ts +2 -0
  158. package/dist/utils/http.test.d.ts.map +1 -0
  159. package/dist/utils/http.test.js +55 -0
  160. package/dist/utils/http.test.js.map +1 -0
  161. package/dist/utils/parallel.d.ts +2 -0
  162. package/dist/utils/parallel.d.ts.map +1 -0
  163. package/dist/utils/parallel.js +17 -0
  164. package/dist/utils/parallel.js.map +1 -0
  165. package/dist/utils/scanner.d.ts +27 -0
  166. package/dist/utils/scanner.d.ts.map +1 -0
  167. package/dist/utils/scanner.js +195 -0
  168. package/dist/utils/scanner.js.map +1 -0
  169. package/dist/utils/ui.d.ts +27 -0
  170. package/dist/utils/ui.d.ts.map +1 -0
  171. package/dist/utils/ui.js +99 -0
  172. package/dist/utils/ui.js.map +1 -0
  173. package/dist/utils/ui.test.d.ts +2 -0
  174. package/dist/utils/ui.test.d.ts.map +1 -0
  175. package/dist/utils/ui.test.js +31 -0
  176. package/dist/utils/ui.test.js.map +1 -0
  177. package/dist/utils/validate.d.ts +2 -0
  178. package/dist/utils/validate.d.ts.map +1 -0
  179. package/dist/utils/validate.js +7 -0
  180. package/dist/utils/validate.js.map +1 -0
  181. package/package.json +62 -0
@@ -0,0 +1,217 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import { mkdtempSync, writeFileSync, mkdirSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
+ import { auditSkill } from "./audit.js";
6
+ function makeTempSkill(name, content, extraDirs = []) {
7
+ const base = mkdtempSync(join(tmpdir(), "arcana-test-"));
8
+ const skillDir = join(base, name);
9
+ mkdirSync(skillDir, { recursive: true });
10
+ writeFileSync(join(skillDir, "SKILL.md"), content, "utf-8");
11
+ for (const dir of extraDirs) {
12
+ mkdirSync(join(skillDir, dir), { recursive: true });
13
+ }
14
+ return skillDir;
15
+ }
16
+ describe("auditSkill", () => {
17
+ it("returns WEAK with score 0 when SKILL.md doesn't exist", () => {
18
+ const base = mkdtempSync(join(tmpdir(), "arcana-test-"));
19
+ const skillDir = join(base, "empty");
20
+ mkdirSync(skillDir, { recursive: true });
21
+ const result = auditSkill(skillDir, "empty");
22
+ expect(result.rating).toBe("WEAK");
23
+ expect(result.score).toBe(0);
24
+ expect(result.checks).toHaveLength(1);
25
+ expect(result.checks[0].passed).toBe(false);
26
+ expect(result.checks[0].name).toBe("SKILL.md exists");
27
+ });
28
+ it("returns low score when SKILL.md has only frontmatter, no body", () => {
29
+ const content = "---\nname: test-skill\ndescription: " + "A".repeat(100) + "\n---\n";
30
+ const skillDir = makeTempSkill("test-skill", content);
31
+ const result = auditSkill(skillDir, "test-skill");
32
+ expect(result.score).toBeLessThan(40);
33
+ expect(result.rating).toBe("WEAK");
34
+ const headingCheck = result.checks.find(c => c.name.includes("headings"));
35
+ expect(headingCheck?.passed).toBe(false);
36
+ });
37
+ it("scores correctly for description length check (80-1024 chars)", () => {
38
+ const shortDesc = "A".repeat(50);
39
+ const goodDesc = "A".repeat(100);
40
+ const longDesc = "A".repeat(2000);
41
+ const shortContent = `---\nname: short\ndescription: ${shortDesc}\n---\n## Heading\n${"Body line\n".repeat(60)}`;
42
+ const goodContent = `---\nname: good\ndescription: ${goodDesc}\n---\n## Heading\n${"Body line\n".repeat(60)}`;
43
+ const longContent = `---\nname: long\ndescription: ${longDesc}\n---\n## Heading\n${"Body line\n".repeat(60)}`;
44
+ const shortDir = makeTempSkill("short", shortContent);
45
+ const goodDir = makeTempSkill("good", goodContent);
46
+ const longDir = makeTempSkill("long", longContent);
47
+ const shortResult = auditSkill(shortDir, "short");
48
+ const goodResult = auditSkill(goodDir, "good");
49
+ const longResult = auditSkill(longDir, "long");
50
+ const shortDescCheck = shortResult.checks.find(c => c.name.includes("Description length"));
51
+ const goodDescCheck = goodResult.checks.find(c => c.name.includes("Description length"));
52
+ const longDescCheck = longResult.checks.find(c => c.name.includes("Description length"));
53
+ expect(shortDescCheck?.passed).toBe(false);
54
+ expect(goodDescCheck?.passed).toBe(true);
55
+ expect(longDescCheck?.passed).toBe(false);
56
+ });
57
+ it("counts ## headings correctly", () => {
58
+ const noHeadings = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n${"Body\n".repeat(60)}`;
59
+ const twoHeadings = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## First\nContent\n## Second\nContent\n${"Body\n".repeat(50)}`;
60
+ const threeHeadings = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## First\n## Second\n## Third\n${"Body\n".repeat(50)}`;
61
+ const noDir = makeTempSkill("no", noHeadings);
62
+ const twoDir = makeTempSkill("two", twoHeadings);
63
+ const threeDir = makeTempSkill("three", threeHeadings);
64
+ const noResult = auditSkill(noDir, "no");
65
+ const twoResult = auditSkill(twoDir, "two");
66
+ const threeResult = auditSkill(threeDir, "three");
67
+ const noCheck = noResult.checks.find(c => c.name.includes("headings"));
68
+ const twoCheck = twoResult.checks.find(c => c.name.includes("headings"));
69
+ const threeCheck = threeResult.checks.find(c => c.name.includes("headings"));
70
+ expect(noCheck?.passed).toBe(false);
71
+ expect(noCheck?.detail).toBe("0 headings");
72
+ expect(twoCheck?.passed).toBe(true);
73
+ expect(twoCheck?.detail).toBe("2 headings");
74
+ expect(threeCheck?.passed).toBe(true);
75
+ expect(threeCheck?.detail).toBe("3 headings");
76
+ });
77
+ it("counts code blocks correctly", () => {
78
+ const noCode = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## Heading\n${"Body\n".repeat(60)}`;
79
+ const oneBlock = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## Heading\n\`\`\`js\ncode\n\`\`\`\n${"Body\n".repeat(50)}`;
80
+ const twoBlocks = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## Heading\n\`\`\`js\ncode\n\`\`\`\n## Second\n\`\`\`ts\nmore\n\`\`\`\n${"Body\n".repeat(50)}`;
81
+ const noDir = makeTempSkill("no", noCode);
82
+ const oneDir = makeTempSkill("one", oneBlock);
83
+ const twoDir = makeTempSkill("two", twoBlocks);
84
+ const noResult = auditSkill(noDir, "no");
85
+ const oneResult = auditSkill(oneDir, "one");
86
+ const twoResult = auditSkill(twoDir, "two");
87
+ const noCheck = noResult.checks.find(c => c.name.includes("code examples"));
88
+ const oneCheck = oneResult.checks.find(c => c.name.includes("code examples"));
89
+ const twoCheck = twoResult.checks.find(c => c.name.includes("code examples"));
90
+ expect(noCheck?.passed).toBe(false);
91
+ expect(noCheck?.detail).toBe("0 blocks");
92
+ expect(oneCheck?.passed).toBe(false);
93
+ expect(oneCheck?.detail).toBe("1 blocks");
94
+ expect(twoCheck?.passed).toBe(true);
95
+ expect(twoCheck?.detail).toBe("2 blocks");
96
+ });
97
+ it("detects BAD/GOOD patterns", () => {
98
+ const noPairs = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## Heading\n${"Body\n".repeat(60)}`;
99
+ const withBAD = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## Heading\nBAD example:\n\`\`\`\ncode\n\`\`\`\nGOOD example:\n\`\`\`\ncode\n\`\`\`\n${"Body\n".repeat(50)}`;
100
+ const withBEFORE = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## Heading\nBEFORE:\n\`\`\`\ncode\n\`\`\`\nAFTER:\n\`\`\`\ncode\n\`\`\`\n${"Body\n".repeat(50)}`;
101
+ const withDO = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## Heading\nDON'T do this:\n\`\`\`\ncode\n\`\`\`\nDO this instead:\n\`\`\`\ncode\n\`\`\`\n${"Body\n".repeat(50)}`;
102
+ const noDir = makeTempSkill("no", noPairs);
103
+ const badDir = makeTempSkill("bad", withBAD);
104
+ const beforeDir = makeTempSkill("before", withBEFORE);
105
+ const doDir = makeTempSkill("do", withDO);
106
+ const noResult = auditSkill(noDir, "no");
107
+ const badResult = auditSkill(badDir, "bad");
108
+ const beforeResult = auditSkill(beforeDir, "before");
109
+ const doResult = auditSkill(doDir, "do");
110
+ const noCheck = noResult.checks.find(c => c.name.includes("BAD/GOOD"));
111
+ const badCheck = badResult.checks.find(c => c.name.includes("BAD/GOOD"));
112
+ const beforeCheck = beforeResult.checks.find(c => c.name.includes("BAD/GOOD"));
113
+ const doCheck = doResult.checks.find(c => c.name.includes("BAD/GOOD"));
114
+ expect(noCheck?.passed).toBe(false);
115
+ expect(badCheck?.passed).toBe(true);
116
+ expect(beforeCheck?.passed).toBe(true);
117
+ expect(doCheck?.passed).toBe(true);
118
+ });
119
+ it("detects capabilities list anti-pattern (>20 bullets, <3 code blocks)", () => {
120
+ const goodList = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## Heading\n${Array(10).fill("- Item\n").join("")}\`\`\`\ncode\n\`\`\`\n\`\`\`\ncode\n\`\`\`\n${"Body\n".repeat(40)}`;
121
+ const capList = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## Capabilities\n${Array(25).fill("- Feature\n").join("")}\`\`\`\ncode\n\`\`\`\n${"Body\n".repeat(30)}`;
122
+ const goodDir = makeTempSkill("good", goodList);
123
+ const capDir = makeTempSkill("cap", capList);
124
+ const goodResult = auditSkill(goodDir, "good");
125
+ const capResult = auditSkill(capDir, "cap");
126
+ const goodCheck = goodResult.checks.find(c => c.name.includes("capabilities list"));
127
+ const capCheck = capResult.checks.find(c => c.name.includes("capabilities list"));
128
+ expect(goodCheck?.passed).toBe(true);
129
+ expect(capCheck?.passed).toBe(false);
130
+ expect(capCheck?.detail).toContain("25 bullets");
131
+ expect(capCheck?.detail).toContain("1 code blocks");
132
+ });
133
+ it("returns PERFECT for well-structured skill with all checks passing", () => {
134
+ const perfectSkill = `---
135
+ name: perfect-skill
136
+ description: ${" ".repeat(0)}This is a well-structured skill description that meets all the length requirements and provides clear information about what the skill does. It's detailed enough to be useful but not so long that it becomes unwieldy.
137
+ ---
138
+
139
+ ## Overview
140
+
141
+ This skill demonstrates best practices.
142
+
143
+ \`\`\`js
144
+ // Example 1
145
+ function good() {
146
+ return true;
147
+ }
148
+ \`\`\`
149
+
150
+ ## Usage Patterns
151
+
152
+ BAD example:
153
+ \`\`\`js
154
+ const x = 1;
155
+ \`\`\`
156
+
157
+ GOOD example:
158
+ \`\`\`js
159
+ const meaningfulName = 1;
160
+ \`\`\`
161
+
162
+ ## Additional Details
163
+
164
+ More content here to ensure we have enough lines.
165
+ ${Array(30).fill("Content line for length.\n").join("")}
166
+ `;
167
+ const skillDir = makeTempSkill("perfect-skill", perfectSkill, ["scripts", "references"]);
168
+ const result = auditSkill(skillDir, "perfect-skill");
169
+ expect(result.rating).toBe("PERFECT");
170
+ expect(result.score).toBeGreaterThanOrEqual(85);
171
+ for (const check of result.checks) {
172
+ expect(check.passed).toBe(true);
173
+ }
174
+ });
175
+ it("checks reasonable length (50-500 lines)", () => {
176
+ const shortSkill = `---\nname: short\ndescription: ${"A".repeat(100)}\n---\n## Heading\n\`\`\`\ncode\n\`\`\`\n\`\`\`\ncode\n\`\`\`\n${Array(10).fill("Line\n").join("")}`;
177
+ const goodSkill = `---\nname: good\ndescription: ${"A".repeat(100)}\n---\n## Heading\n\`\`\`\ncode\n\`\`\`\n\`\`\`\ncode\n\`\`\`\n${Array(80).fill("Line\n").join("")}`;
178
+ const longSkill = `---\nname: long\ndescription: ${"A".repeat(100)}\n---\n## Heading\n\`\`\`\ncode\n\`\`\`\n\`\`\`\ncode\n\`\`\`\n${Array(550).fill("Line\n").join("")}`;
179
+ const shortDir = makeTempSkill("short", shortSkill);
180
+ const goodDir = makeTempSkill("good", goodSkill);
181
+ const longDir = makeTempSkill("long", longSkill);
182
+ const shortResult = auditSkill(shortDir, "short");
183
+ const goodResult = auditSkill(goodDir, "good");
184
+ const longResult = auditSkill(longDir, "long");
185
+ const shortCheck = shortResult.checks.find(c => c.name.includes("Reasonable length"));
186
+ const goodCheck = goodResult.checks.find(c => c.name.includes("Reasonable length"));
187
+ const longCheck = longResult.checks.find(c => c.name.includes("Reasonable length"));
188
+ expect(shortCheck?.passed).toBe(false);
189
+ expect(goodCheck?.passed).toBe(true);
190
+ expect(longCheck?.passed).toBe(false);
191
+ });
192
+ it("detects scripts/ and references/ directories", () => {
193
+ const content = `---\nname: test\ndescription: ${"A".repeat(100)}\n---\n## Heading\n\`\`\`\ncode\n\`\`\`\n\`\`\`\ncode\n\`\`\`\n${Array(60).fill("Line\n").join("")}`;
194
+ const noExtras = makeTempSkill("no-extras", content);
195
+ const withScripts = makeTempSkill("with-scripts", content, ["scripts"]);
196
+ const withRefs = makeTempSkill("with-refs", content, ["references"]);
197
+ const withBoth = makeTempSkill("with-both", content, ["scripts", "references"]);
198
+ const noResult = auditSkill(noExtras, "no-extras");
199
+ const scriptsResult = auditSkill(withScripts, "with-scripts");
200
+ const refsResult = auditSkill(withRefs, "with-refs");
201
+ const bothResult = auditSkill(withBoth, "with-both");
202
+ const noCheck = noResult.checks.find(c => c.name.includes("scripts/ or references/"));
203
+ const scriptsCheck = scriptsResult.checks.find(c => c.name.includes("scripts/ or references/"));
204
+ const refsCheck = refsResult.checks.find(c => c.name.includes("scripts/ or references/"));
205
+ const bothCheck = bothResult.checks.find(c => c.name.includes("scripts/ or references/"));
206
+ expect(noCheck?.passed).toBe(false);
207
+ expect(noCheck?.detail).toBe("none");
208
+ expect(scriptsCheck?.passed).toBe(true);
209
+ expect(scriptsCheck?.detail).toBe("scripts");
210
+ expect(refsCheck?.passed).toBe(true);
211
+ expect(refsCheck?.detail).toBe("references");
212
+ expect(bothCheck?.passed).toBe(true);
213
+ expect(bothCheck?.detail).toContain("scripts");
214
+ expect(bothCheck?.detail).toContain("references");
215
+ });
216
+ });
217
+ //# sourceMappingURL=audit.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audit.test.js","sourceRoot":"","sources":["../../src/commands/audit.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export declare function cleanCommand(opts: {
2
+ dryRun?: boolean;
3
+ json?: boolean;
4
+ }): Promise<void>;
5
+ //# sourceMappingURL=clean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.d.ts","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAOA,wBAAsB,YAAY,CAAC,IAAI,EAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA2G5F"}
@@ -0,0 +1,125 @@
1
+ import { existsSync, readdirSync, rmSync, statSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { ui, banner } from "../utils/ui.js";
5
+ import { getDirSize, listSymlinks } from "../utils/fs.js";
6
+ import { clearHistory } from "../utils/history.js";
7
+ export async function cleanCommand(opts) {
8
+ if (!opts.json)
9
+ banner();
10
+ const dryRun = opts.dryRun ?? false;
11
+ if (dryRun && !opts.json)
12
+ console.log(ui.warn(" DRY RUN - no files will be deleted\n"));
13
+ let totalReclaimed = 0;
14
+ let actions = 0;
15
+ const removedSymlinks = [];
16
+ const removedProjects = [];
17
+ const removedCacheFiles = [];
18
+ // 1. Clean broken symlinks
19
+ const failedSymlinks = [];
20
+ for (const link of listSymlinks().filter(s => s.broken)) {
21
+ if (!dryRun) {
22
+ try {
23
+ rmSync(link.fullPath);
24
+ }
25
+ catch (err) {
26
+ if (!opts.json)
27
+ console.log(` ${ui.warn("Could not remove symlink:")} ${link.name} ${ui.dim(`(${err instanceof Error ? err.message : "unknown error"})`)}`);
28
+ failedSymlinks.push(link.name);
29
+ continue;
30
+ }
31
+ }
32
+ if (!opts.json)
33
+ console.log(` ${ui.dim("Remove broken symlink:")} ${link.name}`);
34
+ removedSymlinks.push(link.name);
35
+ actions++;
36
+ }
37
+ // 2. Clean orphaned Claude project dirs
38
+ const projectsDir = join(homedir(), ".claude", "projects");
39
+ if (existsSync(projectsDir)) {
40
+ for (const entry of readdirSync(projectsDir)) {
41
+ const projDir = join(projectsDir, entry);
42
+ if (!statSync(projDir).isDirectory())
43
+ continue;
44
+ // Skip memory/ and other special dirs
45
+ if (entry === "memory" || entry.startsWith("."))
46
+ continue;
47
+ // Check for session data staleness (no files modified in 90+ days)
48
+ let newest = 0;
49
+ try {
50
+ for (const file of readdirSync(projDir)) {
51
+ const stat = statSync(join(projDir, file));
52
+ if (stat.mtimeMs > newest)
53
+ newest = stat.mtimeMs;
54
+ }
55
+ }
56
+ catch {
57
+ continue;
58
+ }
59
+ const daysOld = (Date.now() - newest) / (1000 * 60 * 60 * 24);
60
+ if (daysOld > 90) {
61
+ const size = getDirSize(projDir);
62
+ totalReclaimed += size;
63
+ const mb = (size / (1024 * 1024)).toFixed(1);
64
+ if (!dryRun)
65
+ rmSync(projDir, { recursive: true, force: true });
66
+ if (!opts.json)
67
+ console.log(` ${ui.dim("Remove stale project data:")} ${entry} ${ui.dim(`(${mb} MB, ${Math.floor(daysOld)}d old)`)}`);
68
+ removedProjects.push({ name: entry, sizeMB: mb, daysOld: Math.floor(daysOld) });
69
+ actions++;
70
+ }
71
+ }
72
+ }
73
+ // 3. Clear action history
74
+ if (!dryRun)
75
+ clearHistory();
76
+ if (!opts.json)
77
+ console.log(` ${ui.dim("Clear action history")}`);
78
+ actions++;
79
+ // 4. Clean disk cache
80
+ const cacheDir = join(homedir(), ".arcana", "cache");
81
+ if (existsSync(cacheDir)) {
82
+ for (const file of readdirSync(cacheDir)) {
83
+ if (!dryRun) {
84
+ try {
85
+ rmSync(join(cacheDir, file), { force: true });
86
+ }
87
+ catch {
88
+ continue;
89
+ }
90
+ }
91
+ if (!opts.json)
92
+ console.log(` ${ui.dim("Remove cached data:")} ${file}`);
93
+ removedCacheFiles.push(file);
94
+ actions++;
95
+ }
96
+ }
97
+ if (opts.json) {
98
+ const result = {
99
+ dryRun,
100
+ actions,
101
+ reclaimedMB: Number((totalReclaimed / (1024 * 1024)).toFixed(1)),
102
+ removedSymlinks,
103
+ removedProjects,
104
+ removedCacheFiles,
105
+ };
106
+ if (failedSymlinks.length > 0)
107
+ result.failedSymlinks = failedSymlinks;
108
+ console.log(JSON.stringify(result));
109
+ return;
110
+ }
111
+ console.log();
112
+ if (actions > 0) {
113
+ const mb = (totalReclaimed / (1024 * 1024)).toFixed(1);
114
+ const verb = dryRun ? "Would reclaim" : "Reclaimed";
115
+ console.log(ui.success(` ${actions} items cleaned. ${verb} ${mb} MB.`));
116
+ }
117
+ else {
118
+ console.log(ui.dim(" Checked:"));
119
+ console.log(ui.dim(` - Broken symlinks in ~/.claude/skills/: ${removedSymlinks.length} found`));
120
+ console.log(ui.dim(` - Stale project data in ~/.claude/projects/: ${removedProjects.length} found`));
121
+ console.log(ui.success(" Nothing to clean."));
122
+ }
123
+ console.log();
124
+ }
125
+ //# sourceMappingURL=clean.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean.js","sourceRoot":"","sources":["../../src/commands/clean.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAA0C;IAC3E,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,MAAM,EAAE,CAAC;IAEzB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,KAAK,CAAC;IACpC,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,wCAAwC,CAAC,CAAC,CAAC;IAEzF,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,MAAM,eAAe,GAAa,EAAE,CAAC;IACrC,MAAM,eAAe,GAAwD,EAAE,CAAC;IAChF,MAAM,iBAAiB,GAAa,EAAE,CAAC;IAEvC,2BAA2B;IAC3B,MAAM,cAAc,GAAa,EAAE,CAAC;IACpC,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC;gBACH,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACxB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,CAAC,IAAI,CAAC,IAAI;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,IAAI,CAAC,2BAA2B,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7J,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC/B,SAAS;YACX,CAAC;QACH,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClF,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,wCAAwC;IACxC,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC;IAC3D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE;gBAAE,SAAS;YAE/C,sCAAsC;YACtC,IAAI,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;gBAAE,SAAS;YAE1D,mEAAmE;YACnE,IAAI,MAAM,GAAG,CAAC,CAAC;YACf,IAAI,CAAC;gBACH,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;oBAC3C,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM;wBAAE,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;gBACnD,CAAC;YACH,CAAC;YAAC,MAAM,CAAC;gBAAC,SAAS;YAAC,CAAC;YAErB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;YAC9D,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;gBACjB,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;gBACjC,cAAc,IAAI,IAAI,CAAC;gBACvB,MAAM,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAC7C,IAAI,CAAC,MAAM;oBAAE,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC/D,IAAI,CAAC,IAAI,CAAC,IAAI;oBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,4BAA4B,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;gBACvI,eAAe,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBAChF,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;IACH,CAAC;IAED,0BAA0B;IAC1B,IAAI,CAAC,MAAM;QAAE,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC,IAAI,CAAC,IAAI;QAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC;IACnE,OAAO,EAAE,CAAC;IAEV,sBAAsB;IACtB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACrD,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,WAAW,CAAC,QAAQ,CAAC,EAAE,CAAC;YACzC,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,IAAI,CAAC;oBACH,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;gBAChD,CAAC;gBAAC,MAAM,CAAC;oBAAC,SAAS;gBAAC,CAAC;YACvB,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,IAAI;gBAAE,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC1E,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7B,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,MAAM,GAA4B;YACtC,MAAM;YACN,OAAO;YACP,WAAW,EAAE,MAAM,CAAC,CAAC,cAAc,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAChE,eAAe;YACf,eAAe;YACf,iBAAiB;SAClB,CAAC;QACF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC;QACtE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;QACpC,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,EAAE,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;QAChB,MAAM,EAAE,GAAG,CAAC,cAAc,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,OAAO,mBAAmB,IAAI,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IAC3E,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,6CAA6C,eAAe,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;QACjG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,kDAAkD,eAAe,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAC;QACtG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,qBAAqB,CAAC,CAAC,CAAC;IACjD,CAAC;IACD,OAAO,CAAC,GAAG,EAAE,CAAC;AAChB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export declare function configCommand(action: string | undefined, value: string | undefined, opts?: {
2
+ json?: boolean;
3
+ }): Promise<void>;
4
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"AAUA,wBAAsB,aAAa,CACjC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,MAAM,GAAG,SAAS,EACzB,IAAI,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GACxB,OAAO,CAAC,IAAI,CAAC,CAgIf"}
@@ -0,0 +1,135 @@
1
+ import { existsSync, rmSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ import { loadConfig, saveConfig } from "../utils/config.js";
5
+ import { ui, banner, table } from "../utils/ui.js";
6
+ import { clearProviderCache } from "../registry.js";
7
+ const VALID_KEYS = ["defaultProvider", "installDir"];
8
+ export async function configCommand(action, value, opts) {
9
+ if (!opts?.json) {
10
+ banner();
11
+ }
12
+ // arcana config list (or no args)
13
+ if (!action || action === "list") {
14
+ const config = loadConfig();
15
+ if (opts?.json) {
16
+ console.log(JSON.stringify({ config }));
17
+ return;
18
+ }
19
+ console.log(ui.bold(" Configuration\n"));
20
+ const envInstallDir = process.env.ARCANA_INSTALL_DIR;
21
+ const envProvider = process.env.ARCANA_DEFAULT_PROVIDER;
22
+ const rows = [
23
+ [ui.dim("defaultProvider"), config.defaultProvider + (envProvider ? ` ${ui.warn("(overridden by ARCANA_DEFAULT_PROVIDER)")}` : "")],
24
+ [ui.dim("installDir"), config.installDir + (envInstallDir ? ` ${ui.warn("(overridden by ARCANA_INSTALL_DIR)")}` : "")],
25
+ [ui.dim("providers"), config.providers.map(p => p.name).join(", ")],
26
+ ];
27
+ table(rows);
28
+ console.log();
29
+ const configPath = join(homedir(), ".arcana", "config.json");
30
+ console.log(ui.dim(` Config file: ${configPath}`));
31
+ console.log(ui.dim(` ${existsSync(configPath) ? "Custom config" : "Using defaults"}`));
32
+ console.log();
33
+ return;
34
+ }
35
+ // arcana config path
36
+ if (action === "path") {
37
+ if (value && !opts?.json) {
38
+ console.log(ui.warn(` 'path' does not take a value (ignoring "${value}")`));
39
+ }
40
+ const configPath = join(homedir(), ".arcana", "config.json");
41
+ if (opts?.json) {
42
+ console.log(JSON.stringify({ path: configPath, exists: existsSync(configPath) }));
43
+ }
44
+ else {
45
+ console.log(` ${configPath}`);
46
+ console.log(ui.dim(` ${existsSync(configPath) ? "Custom config" : "Using defaults (file does not exist)"}`));
47
+ console.log();
48
+ }
49
+ return;
50
+ }
51
+ // arcana config reset
52
+ if (action === "reset") {
53
+ const configPath = join(homedir(), ".arcana", "config.json");
54
+ const existed = existsSync(configPath);
55
+ if (existed) {
56
+ try {
57
+ rmSync(configPath, { force: true });
58
+ }
59
+ catch (err) {
60
+ if (opts?.json) {
61
+ console.log(JSON.stringify({ action: "reset", success: false, error: err instanceof Error ? err.message : "Failed to remove config" }));
62
+ }
63
+ else {
64
+ console.log(ui.error(` Failed to reset config: ${err instanceof Error ? err.message : "unknown error"}`));
65
+ console.log();
66
+ }
67
+ process.exit(1);
68
+ }
69
+ clearProviderCache();
70
+ }
71
+ if (opts?.json) {
72
+ console.log(JSON.stringify({ action: "reset", success: true, existed }));
73
+ }
74
+ else {
75
+ console.log(existed ? ui.success(" Config reset to defaults") : ui.dim(" Already using defaults"));
76
+ console.log();
77
+ }
78
+ return;
79
+ }
80
+ // arcana config <key> [value]
81
+ if (!VALID_KEYS.includes(action)) {
82
+ if (opts?.json) {
83
+ console.log(JSON.stringify({ error: `Unknown config key: ${action}`, validKeys: [...VALID_KEYS] }));
84
+ }
85
+ else {
86
+ console.log(ui.error(` Unknown config key: ${action}`));
87
+ console.log(ui.dim(` Valid keys: ${VALID_KEYS.join(", ")}`));
88
+ console.log();
89
+ }
90
+ process.exit(1);
91
+ }
92
+ const config = loadConfig();
93
+ const key = action;
94
+ if (value === undefined) {
95
+ // Get value
96
+ if (opts?.json) {
97
+ console.log(JSON.stringify({ action: "get", key, value: config[key] }));
98
+ }
99
+ else {
100
+ console.log(` ${key} = ${config[key]}`);
101
+ console.log();
102
+ }
103
+ return;
104
+ }
105
+ // Set value
106
+ if (key === "installDir") {
107
+ if (value === "") {
108
+ console.log(ui.error(" installDir cannot be empty"));
109
+ console.log();
110
+ process.exit(1);
111
+ }
112
+ const { isAbsolute } = await import("node:path");
113
+ if (!isAbsolute(value)) {
114
+ console.log(ui.warn(` Warning: "${value}" is not an absolute path`));
115
+ }
116
+ }
117
+ if (key === "defaultProvider") {
118
+ const providerNames = config.providers.map(p => p.name);
119
+ if (!providerNames.includes(value)) {
120
+ console.log(ui.error(` Provider '${value}' not configured. Add it first with: arcana providers --add owner/repo`));
121
+ console.log();
122
+ process.exit(1);
123
+ }
124
+ }
125
+ config[key] = value;
126
+ saveConfig(config);
127
+ if (opts?.json) {
128
+ console.log(JSON.stringify({ action: "set", key, value }));
129
+ }
130
+ else {
131
+ console.log(ui.success(` Set ${key} = ${value}`));
132
+ console.log();
133
+ }
134
+ }
135
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function createCommand(name: string): Promise<void>;
2
+ //# sourceMappingURL=create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AA+CA,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA6D/D"}