superskill 0.2.2 → 0.2.4

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 (141) hide show
  1. package/.claude-plugin/marketplace.json +23 -0
  2. package/.claude-plugin/plugin.json +12 -0
  3. package/.mcp.json +9 -0
  4. package/LICENSE-COMMERCIAL.md +46 -0
  5. package/dist/setup/configure.js +21 -1
  6. package/dist/setup/configure.js.map +1 -1
  7. package/dist/setup/teardown.js +13 -5
  8. package/dist/setup/teardown.js.map +1 -1
  9. package/package.json +7 -1
  10. package/dist/commands/brainstorm.test.d.ts +0 -1
  11. package/dist/commands/brainstorm.test.js +0 -110
  12. package/dist/commands/brainstorm.test.js.map +0 -1
  13. package/dist/commands/context.test.d.ts +0 -1
  14. package/dist/commands/context.test.js +0 -230
  15. package/dist/commands/context.test.js.map +0 -1
  16. package/dist/commands/decide.test.d.ts +0 -1
  17. package/dist/commands/decide.test.js +0 -109
  18. package/dist/commands/decide.test.js.map +0 -1
  19. package/dist/commands/graph.test.d.ts +0 -1
  20. package/dist/commands/graph.test.js +0 -215
  21. package/dist/commands/graph.test.js.map +0 -1
  22. package/dist/commands/learn.test.d.ts +0 -1
  23. package/dist/commands/learn.test.js +0 -241
  24. package/dist/commands/learn.test.js.map +0 -1
  25. package/dist/commands/read.test.d.ts +0 -1
  26. package/dist/commands/read.test.js +0 -48
  27. package/dist/commands/read.test.js.map +0 -1
  28. package/dist/commands/resume.test.d.ts +0 -1
  29. package/dist/commands/resume.test.js +0 -243
  30. package/dist/commands/resume.test.js.map +0 -1
  31. package/dist/commands/search.test.d.ts +0 -1
  32. package/dist/commands/search.test.js +0 -61
  33. package/dist/commands/search.test.js.map +0 -1
  34. package/dist/commands/session.test.d.ts +0 -1
  35. package/dist/commands/session.test.js +0 -231
  36. package/dist/commands/session.test.js.map +0 -1
  37. package/dist/commands/skill/index.test.d.ts +0 -1
  38. package/dist/commands/skill/index.test.js +0 -137
  39. package/dist/commands/skill/index.test.js.map +0 -1
  40. package/dist/commands/skill/install.test.d.ts +0 -1
  41. package/dist/commands/skill/install.test.js +0 -225
  42. package/dist/commands/skill/install.test.js.map +0 -1
  43. package/dist/commands/skill/list.test.d.ts +0 -1
  44. package/dist/commands/skill/list.test.js +0 -101
  45. package/dist/commands/skill/list.test.js.map +0 -1
  46. package/dist/commands/skill/schema.test.d.ts +0 -1
  47. package/dist/commands/skill/schema.test.js +0 -142
  48. package/dist/commands/skill/schema.test.js.map +0 -1
  49. package/dist/commands/skill/validate.test.d.ts +0 -1
  50. package/dist/commands/skill/validate.test.js +0 -171
  51. package/dist/commands/skill/validate.test.js.map +0 -1
  52. package/dist/commands/task.test.d.ts +0 -1
  53. package/dist/commands/task.test.js +0 -395
  54. package/dist/commands/task.test.js.map +0 -1
  55. package/dist/commands/todo.test.d.ts +0 -1
  56. package/dist/commands/todo.test.js +0 -324
  57. package/dist/commands/todo.test.js.map +0 -1
  58. package/dist/commands/write.test.d.ts +0 -1
  59. package/dist/commands/write.test.js +0 -79
  60. package/dist/commands/write.test.js.map +0 -1
  61. package/dist/config.test.d.ts +0 -1
  62. package/dist/config.test.js +0 -147
  63. package/dist/config.test.js.map +0 -1
  64. package/dist/core/executor.test.d.ts +0 -1
  65. package/dist/core/executor.test.js +0 -206
  66. package/dist/core/executor.test.js.map +0 -1
  67. package/dist/core/registry.test.d.ts +0 -1
  68. package/dist/core/registry.test.js +0 -213
  69. package/dist/core/registry.test.js.map +0 -1
  70. package/dist/integration/coordination.test.d.ts +0 -1
  71. package/dist/integration/coordination.test.js +0 -286
  72. package/dist/integration/coordination.test.js.map +0 -1
  73. package/dist/integration/project-artifacts.test.d.ts +0 -1
  74. package/dist/integration/project-artifacts.test.js +0 -275
  75. package/dist/integration/project-artifacts.test.js.map +0 -1
  76. package/dist/integration/registry-graph.test.d.ts +0 -1
  77. package/dist/integration/registry-graph.test.js +0 -157
  78. package/dist/integration/registry-graph.test.js.map +0 -1
  79. package/dist/integration/vault-lifecycle.test.d.ts +0 -1
  80. package/dist/integration/vault-lifecycle.test.js +0 -183
  81. package/dist/integration/vault-lifecycle.test.js.map +0 -1
  82. package/dist/lib/auto-number.test.d.ts +0 -1
  83. package/dist/lib/auto-number.test.js +0 -88
  84. package/dist/lib/auto-number.test.js.map +0 -1
  85. package/dist/lib/auto-profile.test.d.ts +0 -1
  86. package/dist/lib/auto-profile.test.js +0 -227
  87. package/dist/lib/auto-profile.test.js.map +0 -1
  88. package/dist/lib/escape-regex.test.d.ts +0 -1
  89. package/dist/lib/escape-regex.test.js +0 -27
  90. package/dist/lib/escape-regex.test.js.map +0 -1
  91. package/dist/lib/frontmatter.test.d.ts +0 -1
  92. package/dist/lib/frontmatter.test.js +0 -192
  93. package/dist/lib/frontmatter.test.js.map +0 -1
  94. package/dist/lib/project-detector.test.d.ts +0 -1
  95. package/dist/lib/project-detector.test.js +0 -117
  96. package/dist/lib/project-detector.test.js.map +0 -1
  97. package/dist/lib/safe-external-path.test.d.ts +0 -1
  98. package/dist/lib/safe-external-path.test.js +0 -99
  99. package/dist/lib/safe-external-path.test.js.map +0 -1
  100. package/dist/lib/search-engine.test.d.ts +0 -1
  101. package/dist/lib/search-engine.test.js +0 -120
  102. package/dist/lib/search-engine.test.js.map +0 -1
  103. package/dist/lib/session-registry.test.d.ts +0 -1
  104. package/dist/lib/session-registry.test.js +0 -199
  105. package/dist/lib/session-registry.test.js.map +0 -1
  106. package/dist/lib/stack-detector.test.d.ts +0 -1
  107. package/dist/lib/stack-detector.test.js +0 -110
  108. package/dist/lib/stack-detector.test.js.map +0 -1
  109. package/dist/lib/token-estimator.test.d.ts +0 -1
  110. package/dist/lib/token-estimator.test.js +0 -65
  111. package/dist/lib/token-estimator.test.js.map +0 -1
  112. package/dist/lib/tool-detector.test.d.ts +0 -1
  113. package/dist/lib/tool-detector.test.js +0 -170
  114. package/dist/lib/tool-detector.test.js.map +0 -1
  115. package/dist/lib/vault-fs.test.d.ts +0 -1
  116. package/dist/lib/vault-fs.test.js +0 -210
  117. package/dist/lib/vault-fs.test.js.map +0 -1
  118. package/dist/setup/configure.test.d.ts +0 -1
  119. package/dist/setup/configure.test.js +0 -112
  120. package/dist/setup/configure.test.js.map +0 -1
  121. package/dist/setup/detect.test.d.ts +0 -1
  122. package/dist/setup/detect.test.js +0 -44
  123. package/dist/setup/detect.test.js.map +0 -1
  124. package/dist/setup/instructions.test.d.ts +0 -1
  125. package/dist/setup/instructions.test.js +0 -84
  126. package/dist/setup/instructions.test.js.map +0 -1
  127. package/dist/setup/json-config.test.d.ts +0 -1
  128. package/dist/setup/json-config.test.js +0 -92
  129. package/dist/setup/json-config.test.js.map +0 -1
  130. package/dist/setup/setup-integration.test.d.ts +0 -1
  131. package/dist/setup/setup-integration.test.js +0 -72
  132. package/dist/setup/setup-integration.test.js.map +0 -1
  133. package/dist/setup/teardown.test.d.ts +0 -1
  134. package/dist/setup/teardown.test.js +0 -105
  135. package/dist/setup/teardown.test.js.map +0 -1
  136. package/dist/setup/toml-config.test.d.ts +0 -1
  137. package/dist/setup/toml-config.test.js +0 -49
  138. package/dist/setup/toml-config.test.js.map +0 -1
  139. package/dist/test-helpers.test.d.ts +0 -1
  140. package/dist/test-helpers.test.js +0 -90
  141. package/dist/test-helpers.test.js.map +0 -1
@@ -1,227 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
- import { mkdtemp, writeFile, rm } from "fs/promises";
3
- import { join } from "path";
4
- import { tmpdir } from "os";
5
- import { autoDetect, getRelevantDomains } from "./auto-profile.js";
6
- async function mkTmp() {
7
- return mkdtemp(join(tmpdir(), "auto-profile-"));
8
- }
9
- function withEnv(overrides, fn) {
10
- const original = {};
11
- for (const key of Object.keys(overrides)) {
12
- original[key] = process.env[key];
13
- if (overrides[key] === undefined) {
14
- delete process.env[key];
15
- }
16
- else {
17
- process.env[key] = overrides[key];
18
- }
19
- }
20
- const restore = () => {
21
- for (const key of Object.keys(original)) {
22
- if (original[key] === undefined) {
23
- delete process.env[key];
24
- }
25
- else {
26
- process.env[key] = original[key];
27
- }
28
- }
29
- };
30
- const result = fn();
31
- if (result instanceof Promise) {
32
- return result.finally(restore);
33
- }
34
- restore();
35
- return result;
36
- }
37
- describe("autoDetect", () => {
38
- let dir;
39
- beforeEach(async () => {
40
- dir = await mkTmp();
41
- });
42
- afterEach(async () => {
43
- await rm(dir, { recursive: true, force: true });
44
- });
45
- it("returns ecc-first for a Go project", async () => {
46
- await writeFile(join(dir, "go.mod"), `module example.com/app\n\ngo 1.21\n`);
47
- const config = await autoDetect(dir);
48
- expect(config.profile).toBe("ecc-first");
49
- expect(config.detectedStack.primary).toBe("go");
50
- });
51
- it("returns ecc-first for a Python project", async () => {
52
- await writeFile(join(dir, "requirements.txt"), `flask==2.3.0\n`);
53
- const config = await autoDetect(dir);
54
- expect(config.profile).toBe("ecc-first");
55
- expect(config.detectedStack.languages).toContain("python");
56
- });
57
- it("returns ecc-first for a Django project", async () => {
58
- await writeFile(join(dir, "requirements.txt"), `Django==4.2.0\n`);
59
- const config = await autoDetect(dir);
60
- expect(config.profile).toBe("ecc-first");
61
- expect(config.detectedStack.frameworks).toContain("django");
62
- });
63
- it("returns ecc-first for a React TypeScript project", async () => {
64
- await writeFile(join(dir, "package.json"), JSON.stringify({ dependencies: { react: "^18.0.0", "react-dom": "^18.0.0" } }));
65
- const config = await autoDetect(dir);
66
- expect(config.profile).toBe("ecc-first");
67
- expect(config.detectedStack.frameworks).toContain("react");
68
- });
69
- it("returns superpowers-first for an empty/unknown project", async () => {
70
- const config = await autoDetect(dir);
71
- expect(config.profile).toBe("superpowers-first");
72
- expect(config.detectedStack.primary).toBe("unknown");
73
- });
74
- it("returns full size for context >= 500k (e.g. claude-opus-4-6)", async () => {
75
- await writeFile(join(dir, "go.mod"), `module example.com/app\n\ngo 1.21\n`);
76
- await withEnv({ CLAUDE_CODE: "1", ANTHROPIC_MODEL: "claude-opus-4-6" }, async () => {
77
- const config = await autoDetect(dir);
78
- expect(config.size).toBe("full");
79
- expect(config.detectedTool.contextWindow).toBe(1_000_000);
80
- });
81
- });
82
- it("returns standard size for context 100k-499k (e.g. claude-sonnet-4-6)", async () => {
83
- await writeFile(join(dir, "go.mod"), `module example.com/app\n\ngo 1.21\n`);
84
- await withEnv({ CLAUDE_CODE: "1", ANTHROPIC_MODEL: "claude-sonnet-4-6" }, async () => {
85
- const config = await autoDetect(dir);
86
- expect(config.size).toBe("standard");
87
- expect(config.detectedTool.contextWindow).toBe(200_000);
88
- });
89
- });
90
- it("returns compact size for context < 100k", async () => {
91
- await writeFile(join(dir, "go.mod"), `module example.com/app\n\ngo 1.21\n`);
92
- // Unknown tool → 128k, but let's test with a hypothetical small context
93
- // We can't easily set context window below 100k without a known tool,
94
- // so we test that unknown tool gets 128k → standard
95
- const config = await autoDetect(dir);
96
- // Default 128k → standard
97
- expect(["standard", "compact"]).toContain(config.size);
98
- });
99
- it("includes reason string with stack and tool info", async () => {
100
- await writeFile(join(dir, "go.mod"), `module example.com/app\n\ngo 1.21\n`);
101
- await withEnv({ CLAUDE_CODE: "1" }, async () => {
102
- const config = await autoDetect(dir);
103
- expect(config.reason).toContain("go");
104
- expect(config.reason).toContain("claude-code");
105
- });
106
- });
107
- it("uses process.cwd() when no path provided", async () => {
108
- // Just verify it doesn't throw — cwd may be any kind of project
109
- const config = await autoDetect();
110
- expect(config.profile).toBeDefined();
111
- expect(config.size).toBeDefined();
112
- });
113
- it("detects Spring Boot as ecc-first", async () => {
114
- await writeFile(join(dir, "pom.xml"), `<project><dependencies><dependency><groupId>org.springframework.boot</groupId></dependency></dependencies></project>`);
115
- const config = await autoDetect(dir);
116
- expect(config.profile).toBe("ecc-first");
117
- expect(config.detectedStack.frameworks).toContain("spring-boot");
118
- });
119
- });
120
- // ── helpers ──────────────────────────────────────────
121
- function makeStack(overrides) {
122
- return {
123
- languages: [],
124
- frameworks: [],
125
- buildTools: [],
126
- primary: "unknown",
127
- ...overrides,
128
- };
129
- }
130
- const BASE_DOMAINS = [
131
- "tdd", "code-review", "verification", "planning", "security", "debugging",
132
- "meta", "git-workflow", "agent-orchestration", "agent-engineering",
133
- "brainstorming", "shipping",
134
- ];
135
- describe("getRelevantDomains", () => {
136
- it("always includes base domains for any specific stack", () => {
137
- const domains = getRelevantDomains(makeStack({ languages: ["go"], primary: "go" }));
138
- for (const d of BASE_DOMAINS) {
139
- expect(domains).toContain(d);
140
- }
141
- });
142
- it("Go project includes go, api-design, backend-patterns and excludes django/spring/frontend", () => {
143
- const domains = getRelevantDomains(makeStack({ languages: ["go"], primary: "go" }));
144
- expect(domains).toContain("go");
145
- expect(domains).toContain("api-design");
146
- expect(domains).toContain("backend-patterns");
147
- expect(domains).not.toContain("django");
148
- expect(domains).not.toContain("spring-boot");
149
- expect(domains).not.toContain("frontend-design");
150
- expect(domains).not.toContain("3d-animation");
151
- });
152
- it("React project includes frontend-design and 3d-animation, excludes go/django/spring", () => {
153
- const domains = getRelevantDomains(makeStack({
154
- languages: ["typescript"],
155
- frameworks: ["react"],
156
- primary: "typescript",
157
- }));
158
- expect(domains).toContain("frontend-design");
159
- expect(domains).toContain("3d-animation");
160
- expect(domains).not.toContain("go");
161
- expect(domains).not.toContain("django");
162
- expect(domains).not.toContain("spring-boot");
163
- });
164
- it("Django project includes django, python, database", () => {
165
- const domains = getRelevantDomains(makeStack({
166
- languages: ["python"],
167
- frameworks: ["django"],
168
- primary: "python",
169
- }));
170
- expect(domains).toContain("django");
171
- expect(domains).toContain("python");
172
- expect(domains).toContain("database");
173
- expect(domains).not.toContain("go");
174
- expect(domains).not.toContain("spring-boot");
175
- });
176
- it("Spring Boot project includes spring-boot, java, database", () => {
177
- const domains = getRelevantDomains(makeStack({
178
- languages: ["java"],
179
- frameworks: ["spring-boot"],
180
- primary: "java",
181
- }));
182
- expect(domains).toContain("spring-boot");
183
- expect(domains).toContain("java");
184
- expect(domains).toContain("database");
185
- expect(domains).not.toContain("django");
186
- expect(domains).not.toContain("go");
187
- });
188
- it("unknown stack returns all domains (no filtering)", () => {
189
- const allDomains = getRelevantDomains(makeStack({ primary: "unknown" }));
190
- // Should include language-specific domains that would normally be filtered
191
- expect(allDomains).toContain("go");
192
- expect(allDomains).toContain("django");
193
- expect(allDomains).toContain("spring-boot");
194
- expect(allDomains).toContain("content-business");
195
- expect(allDomains).toContain("3d-animation");
196
- });
197
- it("Java (non-Spring) project includes java but not spring-boot", () => {
198
- const domains = getRelevantDomains(makeStack({
199
- languages: ["java"],
200
- frameworks: [],
201
- primary: "java",
202
- }));
203
- expect(domains).toContain("java");
204
- expect(domains).not.toContain("spring-boot");
205
- });
206
- it("Swift project includes swift", () => {
207
- const domains = getRelevantDomains(makeStack({
208
- languages: ["swift"],
209
- primary: "swift",
210
- }));
211
- expect(domains).toContain("swift");
212
- expect(domains).not.toContain("go");
213
- });
214
- it("C++ project includes cpp", () => {
215
- const domains = getRelevantDomains(makeStack({
216
- languages: ["cpp"],
217
- primary: "cpp",
218
- }));
219
- expect(domains).toContain("cpp");
220
- expect(domains).not.toContain("go");
221
- });
222
- it("content-business excluded when a specific tech stack is detected", () => {
223
- const domains = getRelevantDomains(makeStack({ languages: ["go"], primary: "go" }));
224
- expect(domains).not.toContain("content-business");
225
- });
226
- });
227
- //# sourceMappingURL=auto-profile.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-profile.test.js","sourceRoot":"","sources":["../../src/lib/auto-profile.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,27 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { escapeRegex } from "./escape-regex.js";
3
- describe("escapeRegex", () => {
4
- const cases = [
5
- { name: "empty string", input: "", expected: "" },
6
- { name: "normal string", input: "hello", expected: "hello" },
7
- { name: "dot", input: "a.b", expected: "a\\.b" },
8
- { name: "asterisk", input: "a*b", expected: "a\\*b" },
9
- { name: "plus", input: "a+b", expected: "a\\+b" },
10
- { name: "question", input: "a?b", expected: "a\\?b" },
11
- { name: "caret", input: "a^b", expected: "a\\^b" },
12
- { name: "dollar", input: "a$b", expected: "a\\$b" },
13
- { name: "braces", input: "a{b}", expected: "a\\{b\\}" },
14
- { name: "parentheses", input: "a(b)", expected: "a\\(b\\)" },
15
- { name: "pipe", input: "a|b", expected: "a\\|b" },
16
- { name: "brackets", input: "a[b]", expected: "a\\[b\\]" },
17
- { name: "backslash", input: "a\\b", expected: "a\\\\b" },
18
- { name: "multiple special chars", input: "a.b*c+d?e^f$g{h}i(j)j|k[l]m\\n", expected: "a\\.b\\*c\\+d\\?e\\^f\\$g\\{h\\}i\\(j\\)j\\|k\\[l\\]m\\\\n" },
19
- { name: "regex pattern", input: ".*+?^${}()|[]\\", expected: "\\.\\*\\+\\?\\^\\$\\{\\}\\(\\)\\|\\[\\]\\\\" },
20
- ];
21
- for (const c of cases) {
22
- it(c.name, () => {
23
- expect(escapeRegex(c.input)).toBe(c.expected);
24
- });
25
- }
26
- });
27
- //# sourceMappingURL=escape-regex.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"escape-regex.test.js","sourceRoot":"","sources":["../../src/lib/escape-regex.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,MAAM,KAAK,GAAG;QACZ,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE;QACjD,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE;QAC5D,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;QAChD,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;QACrD,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;QACjD,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;QACrD,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;QAClD,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;QACnD,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE;QACvD,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE;QAC5D,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE;QACjD,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE;QACzD,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE;QACxD,EAAE,IAAI,EAAE,wBAAwB,EAAE,KAAK,EAAE,gCAAgC,EAAE,QAAQ,EAAE,4DAA4D,EAAE;QACnJ,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,iBAAiB,EAAE,QAAQ,EAAE,6CAA6C,EAAE;KAC7G,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE;YACd,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QAChD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,192 +0,0 @@
1
- import { describe, it, expect, beforeEach, vi, afterEach } from "vitest";
2
- import { parseFrontmatter, serializeFrontmatter, createFrontmatter, mergeFrontmatter, validateFrontmatter } from "./frontmatter.js";
3
- describe("parseFrontmatter", () => {
4
- const cases = [
5
- {
6
- name: "with frontmatter",
7
- input: "---\ntitle: Test\nstatus: active\n---\n\nContent here",
8
- expectedData: { title: "Test", status: "active" },
9
- expectedContent: "\nContent here",
10
- },
11
- {
12
- name: "without frontmatter",
13
- input: "# Just markdown\n\nNo frontmatter",
14
- expectedData: {},
15
- expectedContent: "# Just markdown\n\nNo frontmatter",
16
- },
17
- {
18
- name: "empty string",
19
- input: "",
20
- expectedData: {},
21
- expectedContent: "",
22
- },
23
- {
24
- name: "only frontmatter dashes",
25
- input: "---\n---\n",
26
- expectedData: {},
27
- expectedContent: "",
28
- },
29
- {
30
- name: "malformed YAML",
31
- input: "---\ninvalid: [unclosed\n---\nContent",
32
- expectedData: {},
33
- expectedContent: "---\ninvalid: [unclosed\n---\nContent",
34
- },
35
- {
36
- name: "with array field",
37
- input: "---\ntags:\n - tag1\n - tag2\n---\nContent",
38
- expectedData: { tags: ["tag1", "tag2"] },
39
- expectedContent: "Content",
40
- },
41
- {
42
- name: "with nested object",
43
- input: "---\nmeta:\n key: value\n---\nContent",
44
- expectedData: { meta: { key: "value" } },
45
- expectedContent: "Content",
46
- },
47
- ];
48
- for (const c of cases) {
49
- it(c.name, () => {
50
- const result = parseFrontmatter(c.input);
51
- expect(result.data).toEqual(c.expectedData);
52
- expect(result.content).toBe(c.expectedContent);
53
- });
54
- }
55
- });
56
- describe("serializeFrontmatter", () => {
57
- it("serializes with content", () => {
58
- const data = { type: "adr", status: "active" };
59
- const content = "# My ADR\n\nContent";
60
- const result = serializeFrontmatter(data, content);
61
- expect(result).toContain("---");
62
- expect(result).toContain("type: adr");
63
- expect(result).toContain("status: active");
64
- expect(result).toContain("# My ADR");
65
- });
66
- it("serializes with empty content", () => {
67
- const data = { type: "task" };
68
- const result = serializeFrontmatter(data, "");
69
- expect(result).toContain("type: task");
70
- });
71
- it("serializes array fields", () => {
72
- const data = { tags: ["a", "b"] };
73
- const result = serializeFrontmatter(data, "content");
74
- expect(result).toContain("tags:");
75
- expect(result).toContain("- a");
76
- expect(result).toContain("- b");
77
- });
78
- });
79
- describe("createFrontmatter", () => {
80
- beforeEach(() => {
81
- vi.useFakeTimers();
82
- vi.setSystemTime(new Date("2024-01-15"));
83
- });
84
- afterEach(() => {
85
- vi.useRealTimers();
86
- });
87
- it("creates frontmatter with defaults", () => {
88
- const result = createFrontmatter({});
89
- expect(result.type).toBe("index");
90
- expect(result.status).toBe("active");
91
- expect(result.created).toBe("2024-01-15");
92
- expect(result.updated).toBe("2024-01-15");
93
- });
94
- it("overrides defaults", () => {
95
- const result = createFrontmatter({ type: "adr", status: "draft" });
96
- expect(result.type).toBe("adr");
97
- expect(result.status).toBe("draft");
98
- });
99
- it("preserves custom fields", () => {
100
- const result = createFrontmatter({ custom: "value" });
101
- expect(result.custom).toBe("value");
102
- });
103
- it("uses provided created date", () => {
104
- const result = createFrontmatter({ created: "2023-12-01" });
105
- expect(result.created).toBe("2023-12-01");
106
- expect(result.updated).toBe("2024-01-15");
107
- });
108
- });
109
- describe("mergeFrontmatter", () => {
110
- beforeEach(() => {
111
- vi.useFakeTimers();
112
- vi.setSystemTime(new Date("2024-01-15"));
113
- });
114
- afterEach(() => {
115
- vi.useRealTimers();
116
- });
117
- it("merges new fields", () => {
118
- const existing = { type: "adr", status: "draft" };
119
- const result = mergeFrontmatter(existing, { status: "active" });
120
- expect(result.type).toBe("adr");
121
- expect(result.status).toBe("active");
122
- });
123
- it("adds new fields", () => {
124
- const existing = { type: "task" };
125
- const result = mergeFrontmatter(existing, { tags: ["urgent"] });
126
- expect(result.type).toBe("task");
127
- expect(result.tags).toEqual(["urgent"]);
128
- });
129
- it("updates the updated timestamp", () => {
130
- const existing = { type: "adr", updated: "2023-01-01" };
131
- const result = mergeFrontmatter(existing, {});
132
- expect(result.updated).toBe("2024-01-15");
133
- });
134
- it("preserves existing fields not in updates", () => {
135
- const existing = { type: "adr", project: "test", created: "2023-01-01" };
136
- const result = mergeFrontmatter(existing, { status: "done" });
137
- expect(result.type).toBe("adr");
138
- expect(result.project).toBe("test");
139
- expect(result.created).toBe("2023-01-01");
140
- expect(result.status).toBe("done");
141
- });
142
- });
143
- describe("validateFrontmatter", () => {
144
- it("returns empty array for valid frontmatter", () => {
145
- const data = { type: "adr", status: "active" };
146
- expect(validateFrontmatter(data)).toEqual([]);
147
- });
148
- it("returns error for invalid type", () => {
149
- const data = { type: "invalid" };
150
- const errors = validateFrontmatter(data);
151
- expect(errors.length).toBe(1);
152
- expect(errors[0]).toContain("Invalid type");
153
- });
154
- it("returns error for invalid status", () => {
155
- const data = { status: "invalid" };
156
- const errors = validateFrontmatter(data);
157
- expect(errors.length).toBe(1);
158
- expect(errors[0]).toContain("Invalid status");
159
- });
160
- it("returns error when tags is not array", () => {
161
- const data = { tags: "not-array" };
162
- const errors = validateFrontmatter(data);
163
- expect(errors.length).toBe(1);
164
- expect(errors[0]).toContain("Tags must be an array");
165
- });
166
- it("returns error when related is not array", () => {
167
- const data = { related: "not-array" };
168
- const errors = validateFrontmatter(data);
169
- expect(errors.length).toBe(1);
170
- expect(errors[0]).toContain("Related must be an array");
171
- });
172
- it("returns multiple errors", () => {
173
- const data = { type: "bad", status: "worse", tags: "nope" };
174
- const errors = validateFrontmatter(data);
175
- expect(errors.length).toBe(3);
176
- });
177
- it("accepts all valid types", () => {
178
- const validTypes = ["context", "adr", "brainstorm", "decision", "todo", "incident", "pattern", "evaluation", "index", "task", "learning", "session"];
179
- for (const type of validTypes) {
180
- const errors = validateFrontmatter({ type });
181
- expect(errors).toEqual([]);
182
- }
183
- });
184
- it("accepts all valid statuses", () => {
185
- const validStatuses = ["active", "resolved", "deprecated", "draft", "backlog", "in-progress", "blocked", "done", "cancelled", "completed"];
186
- for (const status of validStatuses) {
187
- const errors = validateFrontmatter({ status });
188
- expect(errors).toEqual([]);
189
- }
190
- });
191
- });
192
- //# sourceMappingURL=frontmatter.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"frontmatter.test.js","sourceRoot":"","sources":["../../src/lib/frontmatter.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,117 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
- import { mkdir, writeFile, rm } from "fs/promises";
3
- import { tmpdir } from "os";
4
- import { join } from "path";
5
- import { detectProject, invalidateProjectMapCache } from "./project-detector.js";
6
- describe("project-detector", () => {
7
- let vaultRoot;
8
- let originalCwd;
9
- beforeEach(async () => {
10
- vaultRoot = join(tmpdir(), `project-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
11
- await mkdir(vaultRoot, { recursive: true });
12
- originalCwd = process.cwd();
13
- invalidateProjectMapCache();
14
- });
15
- afterEach(async () => {
16
- process.chdir(originalCwd);
17
- await rm(vaultRoot, { recursive: true, force: true });
18
- invalidateProjectMapCache();
19
- });
20
- describe("detectProject", () => {
21
- it("returns null when no project-map.json", async () => {
22
- const result = await detectProject("/nonexistent/path", vaultRoot);
23
- expect(result).toBeNull();
24
- });
25
- it("detects project from exact cwd match in project-map.json", async () => {
26
- const projectMap = { "/Users/test/myproject": "myproject" };
27
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify(projectMap));
28
- invalidateProjectMapCache();
29
- const result = await detectProject("/Users/test/myproject", vaultRoot);
30
- expect(result).toBe("myproject");
31
- });
32
- it("detects project from subdirectory of mapped path", async () => {
33
- const projectMap = { "/Users/test/myproject": "myproject" };
34
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify(projectMap));
35
- invalidateProjectMapCache();
36
- const result = await detectProject("/Users/test/myproject/src/components", vaultRoot);
37
- expect(result).toBe("myproject");
38
- });
39
- it("returns null for unmapped path", async () => {
40
- const projectMap = { "/Users/test/other": "other" };
41
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify(projectMap));
42
- invalidateProjectMapCache();
43
- const result = await detectProject("/Users/test/unmapped", vaultRoot);
44
- expect(result).toBeNull();
45
- });
46
- it("handles invalid JSON in project-map.json", async () => {
47
- await writeFile(join(vaultRoot, "project-map.json"), "not valid json {{{");
48
- invalidateProjectMapCache();
49
- const result = await detectProject("/any/path", vaultRoot);
50
- expect(result).toBeNull();
51
- });
52
- it("handles non-object project-map.json", async () => {
53
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify(["array", "not", "object"]));
54
- invalidateProjectMapCache();
55
- const result = await detectProject("/any/path", vaultRoot);
56
- expect(result).toBeNull();
57
- });
58
- it("strips .worktrees suffix from cwd", async () => {
59
- const projectMap = { "/Users/test/myproject": "myproject" };
60
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify(projectMap));
61
- invalidateProjectMapCache();
62
- const result = await detectProject("/Users/test/myproject/.worktrees/feat-x", vaultRoot);
63
- expect(result).toBe("myproject");
64
- });
65
- it("strips .claude/worktrees suffix from cwd", async () => {
66
- const projectMap = { "/Users/test/myproject": "myproject" };
67
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify(projectMap));
68
- invalidateProjectMapCache();
69
- const result = await detectProject("/Users/test/myproject/.claude/worktrees/feat/name", vaultRoot);
70
- expect(result).toBe("myproject");
71
- });
72
- it("strips .claude-worktrees suffix from cwd", async () => {
73
- const projectMap = { "/Users/test/myproject": "myproject" };
74
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify(projectMap));
75
- invalidateProjectMapCache();
76
- const result = await detectProject("/Users/test/myproject/.claude-worktrees/feat-name", vaultRoot);
77
- expect(result).toBe("myproject");
78
- });
79
- it("ignores non-string values in project-map.json", async () => {
80
- const projectMap = {
81
- "/Users/test/good": "good",
82
- "/Users/test/bad": 123,
83
- "/Users/test/also-bad": null
84
- };
85
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify(projectMap));
86
- invalidateProjectMapCache();
87
- const goodResult = await detectProject("/Users/test/good", vaultRoot);
88
- expect(goodResult).toBe("good");
89
- const badResult = await detectProject("/Users/test/bad", vaultRoot);
90
- expect(badResult).toBeNull();
91
- });
92
- it("caches project-map.json", async () => {
93
- const projectMap = { "/Users/test/cached": "cached" };
94
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify(projectMap));
95
- invalidateProjectMapCache();
96
- await detectProject("/Users/test/cached", vaultRoot);
97
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify({ "/Users/test/other": "other" }));
98
- const result = await detectProject("/Users/test/cached", vaultRoot);
99
- expect(result).toBe("cached");
100
- });
101
- it("cache invalidates for different vault path", async () => {
102
- const projectMap1 = { "/Users/test/path1": "project1" };
103
- await writeFile(join(vaultRoot, "project-map.json"), JSON.stringify(projectMap1));
104
- invalidateProjectMapCache();
105
- const vaultRoot2 = join(tmpdir(), `project-test-2-${Date.now()}`);
106
- await mkdir(vaultRoot2, { recursive: true });
107
- const projectMap2 = { "/Users/test/path1": "project2" };
108
- await writeFile(join(vaultRoot2, "project-map.json"), JSON.stringify(projectMap2));
109
- const result1 = await detectProject("/Users/test/path1", vaultRoot);
110
- const result2 = await detectProject("/Users/test/path1", vaultRoot2);
111
- expect(result1).toBe("project1");
112
- expect(result2).toBe("project2");
113
- await rm(vaultRoot2, { recursive: true, force: true });
114
- });
115
- });
116
- });
117
- //# sourceMappingURL=project-detector.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"project-detector.test.js","sourceRoot":"","sources":["../../src/lib/project-detector.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};