superskill 0.2.2 → 0.2.5

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 (164) 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/CHANGELOG.md +28 -0
  5. package/LICENSE-COMMERCIAL.md +46 -0
  6. package/dist/cli.js +0 -0
  7. package/dist/commands/skill/marketplace.d.ts +1 -0
  8. package/dist/commands/skill/marketplace.js +79 -35
  9. package/dist/commands/skill/marketplace.js.map +1 -1
  10. package/dist/commands/skill/web-discovery.d.ts +36 -0
  11. package/dist/commands/skill/web-discovery.js +196 -0
  12. package/dist/commands/skill/web-discovery.js.map +1 -0
  13. package/dist/core/registry.js +8 -16
  14. package/dist/core/registry.js.map +1 -1
  15. package/dist/mcp-server.js +0 -0
  16. package/dist/setup/configure.js +21 -1
  17. package/dist/setup/configure.js.map +1 -1
  18. package/dist/setup/teardown.js +13 -5
  19. package/dist/setup/teardown.js.map +1 -1
  20. package/package.json +7 -1
  21. package/dist/commands/brainstorm.test.d.ts +0 -1
  22. package/dist/commands/brainstorm.test.js +0 -110
  23. package/dist/commands/brainstorm.test.js.map +0 -1
  24. package/dist/commands/context.test.d.ts +0 -1
  25. package/dist/commands/context.test.js +0 -230
  26. package/dist/commands/context.test.js.map +0 -1
  27. package/dist/commands/decide.test.d.ts +0 -1
  28. package/dist/commands/decide.test.js +0 -109
  29. package/dist/commands/decide.test.js.map +0 -1
  30. package/dist/commands/graph.test.d.ts +0 -1
  31. package/dist/commands/graph.test.js +0 -215
  32. package/dist/commands/graph.test.js.map +0 -1
  33. package/dist/commands/learn.test.d.ts +0 -1
  34. package/dist/commands/learn.test.js +0 -241
  35. package/dist/commands/learn.test.js.map +0 -1
  36. package/dist/commands/read.test.d.ts +0 -1
  37. package/dist/commands/read.test.js +0 -48
  38. package/dist/commands/read.test.js.map +0 -1
  39. package/dist/commands/resume.test.d.ts +0 -1
  40. package/dist/commands/resume.test.js +0 -243
  41. package/dist/commands/resume.test.js.map +0 -1
  42. package/dist/commands/search.test.d.ts +0 -1
  43. package/dist/commands/search.test.js +0 -61
  44. package/dist/commands/search.test.js.map +0 -1
  45. package/dist/commands/session.test.d.ts +0 -1
  46. package/dist/commands/session.test.js +0 -231
  47. package/dist/commands/session.test.js.map +0 -1
  48. package/dist/commands/skill/index.test.d.ts +0 -1
  49. package/dist/commands/skill/index.test.js +0 -137
  50. package/dist/commands/skill/index.test.js.map +0 -1
  51. package/dist/commands/skill/install.test.d.ts +0 -1
  52. package/dist/commands/skill/install.test.js +0 -225
  53. package/dist/commands/skill/install.test.js.map +0 -1
  54. package/dist/commands/skill/list.test.d.ts +0 -1
  55. package/dist/commands/skill/list.test.js +0 -101
  56. package/dist/commands/skill/list.test.js.map +0 -1
  57. package/dist/commands/skill/schema.test.d.ts +0 -1
  58. package/dist/commands/skill/schema.test.js +0 -142
  59. package/dist/commands/skill/schema.test.js.map +0 -1
  60. package/dist/commands/skill/validate.test.d.ts +0 -1
  61. package/dist/commands/skill/validate.test.js +0 -171
  62. package/dist/commands/skill/validate.test.js.map +0 -1
  63. package/dist/commands/task.test.d.ts +0 -1
  64. package/dist/commands/task.test.js +0 -395
  65. package/dist/commands/task.test.js.map +0 -1
  66. package/dist/commands/todo.test.d.ts +0 -1
  67. package/dist/commands/todo.test.js +0 -324
  68. package/dist/commands/todo.test.js.map +0 -1
  69. package/dist/commands/write.test.d.ts +0 -1
  70. package/dist/commands/write.test.js +0 -79
  71. package/dist/commands/write.test.js.map +0 -1
  72. package/dist/config.test.d.ts +0 -1
  73. package/dist/config.test.js +0 -147
  74. package/dist/config.test.js.map +0 -1
  75. package/dist/core/executor.d.ts +0 -11
  76. package/dist/core/executor.js +0 -42
  77. package/dist/core/executor.js.map +0 -1
  78. package/dist/core/executor.test.d.ts +0 -1
  79. package/dist/core/executor.test.js +0 -206
  80. package/dist/core/executor.test.js.map +0 -1
  81. package/dist/core/middleware/error-handler.d.ts +0 -2
  82. package/dist/core/middleware/error-handler.js +0 -29
  83. package/dist/core/middleware/error-handler.js.map +0 -1
  84. package/dist/core/middleware/index.d.ts +0 -2
  85. package/dist/core/middleware/index.js +0 -3
  86. package/dist/core/middleware/index.js.map +0 -1
  87. package/dist/core/middleware/logging.d.ts +0 -2
  88. package/dist/core/middleware/logging.js +0 -18
  89. package/dist/core/middleware/logging.js.map +0 -1
  90. package/dist/core/registry.test.d.ts +0 -1
  91. package/dist/core/registry.test.js +0 -213
  92. package/dist/core/registry.test.js.map +0 -1
  93. package/dist/integration/coordination.test.d.ts +0 -1
  94. package/dist/integration/coordination.test.js +0 -286
  95. package/dist/integration/coordination.test.js.map +0 -1
  96. package/dist/integration/project-artifacts.test.d.ts +0 -1
  97. package/dist/integration/project-artifacts.test.js +0 -275
  98. package/dist/integration/project-artifacts.test.js.map +0 -1
  99. package/dist/integration/registry-graph.test.d.ts +0 -1
  100. package/dist/integration/registry-graph.test.js +0 -157
  101. package/dist/integration/registry-graph.test.js.map +0 -1
  102. package/dist/integration/vault-lifecycle.test.d.ts +0 -1
  103. package/dist/integration/vault-lifecycle.test.js +0 -183
  104. package/dist/integration/vault-lifecycle.test.js.map +0 -1
  105. package/dist/lib/auto-number.test.d.ts +0 -1
  106. package/dist/lib/auto-number.test.js +0 -88
  107. package/dist/lib/auto-number.test.js.map +0 -1
  108. package/dist/lib/auto-profile.test.d.ts +0 -1
  109. package/dist/lib/auto-profile.test.js +0 -227
  110. package/dist/lib/auto-profile.test.js.map +0 -1
  111. package/dist/lib/escape-regex.test.d.ts +0 -1
  112. package/dist/lib/escape-regex.test.js +0 -27
  113. package/dist/lib/escape-regex.test.js.map +0 -1
  114. package/dist/lib/frontmatter.test.d.ts +0 -1
  115. package/dist/lib/frontmatter.test.js +0 -192
  116. package/dist/lib/frontmatter.test.js.map +0 -1
  117. package/dist/lib/project-detector.test.d.ts +0 -1
  118. package/dist/lib/project-detector.test.js +0 -117
  119. package/dist/lib/project-detector.test.js.map +0 -1
  120. package/dist/lib/safe-external-path.test.d.ts +0 -1
  121. package/dist/lib/safe-external-path.test.js +0 -99
  122. package/dist/lib/safe-external-path.test.js.map +0 -1
  123. package/dist/lib/search-engine.test.d.ts +0 -1
  124. package/dist/lib/search-engine.test.js +0 -120
  125. package/dist/lib/search-engine.test.js.map +0 -1
  126. package/dist/lib/session-registry.test.d.ts +0 -1
  127. package/dist/lib/session-registry.test.js +0 -199
  128. package/dist/lib/session-registry.test.js.map +0 -1
  129. package/dist/lib/stack-detector.test.d.ts +0 -1
  130. package/dist/lib/stack-detector.test.js +0 -110
  131. package/dist/lib/stack-detector.test.js.map +0 -1
  132. package/dist/lib/token-estimator.test.d.ts +0 -1
  133. package/dist/lib/token-estimator.test.js +0 -65
  134. package/dist/lib/token-estimator.test.js.map +0 -1
  135. package/dist/lib/tool-detector.test.d.ts +0 -1
  136. package/dist/lib/tool-detector.test.js +0 -170
  137. package/dist/lib/tool-detector.test.js.map +0 -1
  138. package/dist/lib/vault-fs.test.d.ts +0 -1
  139. package/dist/lib/vault-fs.test.js +0 -210
  140. package/dist/lib/vault-fs.test.js.map +0 -1
  141. package/dist/setup/configure.test.d.ts +0 -1
  142. package/dist/setup/configure.test.js +0 -112
  143. package/dist/setup/configure.test.js.map +0 -1
  144. package/dist/setup/detect.test.d.ts +0 -1
  145. package/dist/setup/detect.test.js +0 -44
  146. package/dist/setup/detect.test.js.map +0 -1
  147. package/dist/setup/instructions.test.d.ts +0 -1
  148. package/dist/setup/instructions.test.js +0 -84
  149. package/dist/setup/instructions.test.js.map +0 -1
  150. package/dist/setup/json-config.test.d.ts +0 -1
  151. package/dist/setup/json-config.test.js +0 -92
  152. package/dist/setup/json-config.test.js.map +0 -1
  153. package/dist/setup/setup-integration.test.d.ts +0 -1
  154. package/dist/setup/setup-integration.test.js +0 -72
  155. package/dist/setup/setup-integration.test.js.map +0 -1
  156. package/dist/setup/teardown.test.d.ts +0 -1
  157. package/dist/setup/teardown.test.js +0 -105
  158. package/dist/setup/teardown.test.js.map +0 -1
  159. package/dist/setup/toml-config.test.d.ts +0 -1
  160. package/dist/setup/toml-config.test.js +0 -49
  161. package/dist/setup/toml-config.test.js.map +0 -1
  162. package/dist/test-helpers.test.d.ts +0 -1
  163. package/dist/test-helpers.test.js +0 -90
  164. package/dist/test-helpers.test.js.map +0 -1
@@ -1,65 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { estimateTokens, truncateToTokenBudget } from "./token-estimator.js";
3
- describe("estimateTokens", () => {
4
- const cases = [
5
- { name: "empty string", input: "", expected: 0 },
6
- { name: "short text", input: "hello", expected: 2 },
7
- { name: "exactly 4 chars", input: "abcd", expected: 2 },
8
- { name: "exactly 8 chars", input: "abcdefgh", expected: 3 },
9
- { name: "long text", input: "a".repeat(100), expected: 29 },
10
- { name: "code with brackets", input: "function() { return []; }", expected: 8 },
11
- { name: "markdown with headers", input: "# Title\n\nParagraph", expected: 6 },
12
- ];
13
- for (const c of cases) {
14
- it(c.name, () => {
15
- expect(estimateTokens(c.input)).toBe(c.expected);
16
- });
17
- }
18
- });
19
- describe("truncateToTokenBudget", () => {
20
- it("returns unchanged text when under budget", () => {
21
- const text = "Short text";
22
- const result = truncateToTokenBudget(text, 100);
23
- expect(result.text).toBe(text);
24
- expect(result.truncated).toBe(false);
25
- });
26
- it("truncates at section boundary when possible", () => {
27
- const text = "Intro content that is long enough to take up some tokens before we hit the section.\n\n## Section 1\nThis is the content for section one with enough text to matter.\n\n## Section 2\nContent for section two that will be truncated away.";
28
- const result = truncateToTokenBudget(text, 25);
29
- expect(result.truncated).toBe(true);
30
- expect(result.text).toContain("Intro content");
31
- expect(result.text).not.toContain("Section 2");
32
- expect(result.text).toContain("[truncated");
33
- });
34
- it("truncates at paragraph boundary when no section", () => {
35
- const text = "Para 1\n\nPara 2\n\nPara 3\n\nPara 4";
36
- const result = truncateToTokenBudget(text, 5);
37
- expect(result.truncated).toBe(true);
38
- expect(result.text).toContain("[truncated");
39
- });
40
- it("truncates at newline when no paragraph boundary", () => {
41
- const text = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5";
42
- const result = truncateToTokenBudget(text, 5);
43
- expect(result.truncated).toBe(true);
44
- expect(result.text).toContain("[truncated");
45
- });
46
- it("includes truncation suffix", () => {
47
- const text = "a".repeat(1000);
48
- const result = truncateToTokenBudget(text, 10);
49
- expect(result.text).toContain("[truncated");
50
- expect(result.text).toContain("vault_project_context");
51
- });
52
- it("handles text shorter than budget", () => {
53
- const text = "Tiny";
54
- const result = truncateToTokenBudget(text, 1000);
55
- expect(result.text).toBe(text);
56
- expect(result.truncated).toBe(false);
57
- });
58
- it("handles markdown with frontmatter", () => {
59
- const text = "---\ntitle: Test\n---\n\n# Title\n\nContent here\n\n## Section\nMore content";
60
- const result = truncateToTokenBudget(text, 10);
61
- expect(result.truncated).toBe(true);
62
- expect(result.text).toContain("[truncated");
63
- });
64
- });
65
- //# sourceMappingURL=token-estimator.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-estimator.test.js","sourceRoot":"","sources":["../../src/lib/token-estimator.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,170 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { detectTool, CONTEXT_WINDOWS } from "./tool-detector.js";
3
- // All environment keys that could trigger a specific tool detection.
4
- // When testing one tool we need to clear all others (and vice versa).
5
- const ALL_TOOL_KEYS = [
6
- "CLAUDE_CODE",
7
- "CLAUDE_CODE_VAULT_PATH",
8
- "CLAUDE_CODE_WORKTREE",
9
- "CLAUDE_CODE_SESSION_ID",
10
- "CLAUDE_CODE_ENTRYPOINT",
11
- "CLAUDE_CODE_MODEL",
12
- "ANTHROPIC_MODEL",
13
- "CLAUDE_MODEL",
14
- ];
15
- const ALL_TOOL_PREFIXES = ["OPENCODE_", "CURSOR_", "CODEX_", "GEMINI_"];
16
- function clearAllToolEnv() {
17
- const saved = {};
18
- for (const key of Object.keys(process.env)) {
19
- const isToolKey = ALL_TOOL_KEYS.includes(key) ||
20
- ALL_TOOL_PREFIXES.some((p) => key.startsWith(p));
21
- if (isToolKey) {
22
- saved[key] = process.env[key];
23
- delete process.env[key];
24
- }
25
- }
26
- return saved;
27
- }
28
- function restoreToolEnv(saved) {
29
- for (const [key, value] of Object.entries(saved)) {
30
- if (value === undefined) {
31
- delete process.env[key];
32
- }
33
- else {
34
- process.env[key] = value;
35
- }
36
- }
37
- }
38
- function withEnv(overrides, fn) {
39
- // First clear ALL tool env vars to prevent cross-contamination from the
40
- // host environment (e.g. CLAUDE_CODE_VAULT_PATH set by Claude Code itself).
41
- const savedAll = clearAllToolEnv();
42
- // Then apply only the vars specified by this test.
43
- const original = {};
44
- for (const key of Object.keys(overrides)) {
45
- original[key] = process.env[key];
46
- if (overrides[key] === undefined) {
47
- delete process.env[key];
48
- }
49
- else {
50
- process.env[key] = overrides[key];
51
- }
52
- }
53
- try {
54
- fn();
55
- }
56
- finally {
57
- for (const key of Object.keys(original)) {
58
- if (original[key] === undefined) {
59
- delete process.env[key];
60
- }
61
- else {
62
- process.env[key] = original[key];
63
- }
64
- }
65
- restoreToolEnv(savedAll);
66
- }
67
- }
68
- describe("detectTool", () => {
69
- describe("claude-code detection", () => {
70
- it("detects CLAUDE_CODE env var", () => {
71
- withEnv({ CLAUDE_CODE: "1" }, () => {
72
- const result = detectTool();
73
- expect(result.tool).toBe("claude-code");
74
- });
75
- });
76
- it("detects CLAUDE_CODE_VAULT_PATH env var", () => {
77
- withEnv({ CLAUDE_CODE_VAULT_PATH: "/some/path" }, () => {
78
- const result = detectTool();
79
- expect(result.tool).toBe("claude-code");
80
- });
81
- });
82
- it("detects model from ANTHROPIC_MODEL", () => {
83
- withEnv({ CLAUDE_CODE: "1", ANTHROPIC_MODEL: "claude-opus-4-6" }, () => {
84
- const result = detectTool();
85
- expect(result.tool).toBe("claude-code");
86
- expect(result.model).toBe("claude-opus-4-6");
87
- expect(result.contextWindow).toBe(1_000_000);
88
- });
89
- });
90
- it("detects claude-sonnet-4-6 with 200k context", () => {
91
- withEnv({ CLAUDE_CODE: "1", ANTHROPIC_MODEL: "claude-sonnet-4-6" }, () => {
92
- const result = detectTool();
93
- expect(result.contextWindow).toBe(200_000);
94
- });
95
- });
96
- });
97
- describe("opencode detection", () => {
98
- it("detects OPENCODE_ prefix env var", () => {
99
- withEnv({ OPENCODE_SESSION: "abc123" }, () => {
100
- const result = detectTool();
101
- expect(result.tool).toBe("opencode");
102
- });
103
- });
104
- it("reads model from OPENCODE_MODEL", () => {
105
- withEnv({ OPENCODE_MODEL: "gpt-4o" }, () => {
106
- const result = detectTool();
107
- expect(result.tool).toBe("opencode");
108
- expect(result.model).toBe("gpt-4o");
109
- expect(result.contextWindow).toBe(128_000);
110
- });
111
- });
112
- });
113
- describe("cursor detection", () => {
114
- it("detects CURSOR_ prefix env var", () => {
115
- withEnv({ CURSOR_EDITOR: "1" }, () => {
116
- const result = detectTool();
117
- expect(result.tool).toBe("cursor");
118
- });
119
- });
120
- });
121
- describe("codex detection", () => {
122
- it("detects CODEX_ prefix env var", () => {
123
- withEnv({ CODEX_SESSION: "xyz" }, () => {
124
- const result = detectTool();
125
- expect(result.tool).toBe("codex");
126
- });
127
- });
128
- });
129
- describe("gemini-cli detection", () => {
130
- it("detects GEMINI_ prefix env var", () => {
131
- withEnv({ GEMINI_API_KEY: "key123" }, () => {
132
- const result = detectTool();
133
- expect(result.tool).toBe("gemini-cli");
134
- });
135
- });
136
- it("reads gemini model and returns 1M context", () => {
137
- withEnv({ GEMINI_API_KEY: "key123", GEMINI_MODEL: "gemini-2.5-pro" }, () => {
138
- const result = detectTool();
139
- expect(result.contextWindow).toBe(1_000_000);
140
- });
141
- });
142
- });
143
- describe("unknown / fallback", () => {
144
- it("returns unknown tool when no matching env vars", () => {
145
- // withEnv with empty overrides clears all tool env vars
146
- withEnv({}, () => {
147
- const result = detectTool();
148
- expect(result.tool).toBe("unknown");
149
- expect(result.contextWindow).toBe(128_000);
150
- });
151
- });
152
- it("uses 128000 as default context when model unknown", () => {
153
- // Set CLAUDE_CODE but no model env vars
154
- withEnv({ CLAUDE_CODE: "1" }, () => {
155
- const result = detectTool();
156
- // ANTHROPIC_MODEL / CLAUDE_MODEL are not set (cleared by withEnv)
157
- expect(result.tool).toBe("claude-code");
158
- expect(result.contextWindow).toBe(128_000);
159
- });
160
- });
161
- });
162
- describe("CONTEXT_WINDOWS mapping", () => {
163
- it("exports the mapping", () => {
164
- expect(CONTEXT_WINDOWS["claude-opus-4-6"]).toBe(1_000_000);
165
- expect(CONTEXT_WINDOWS["gpt-4o"]).toBe(128_000);
166
- expect(CONTEXT_WINDOWS["default"]).toBe(128_000);
167
- });
168
- });
169
- });
170
- //# sourceMappingURL=tool-detector.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-detector.test.js","sourceRoot":"","sources":["../../src/lib/tool-detector.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,210 +0,0 @@
1
- import { describe, it, expect, beforeEach, afterEach } from "vitest";
2
- import { mkdir, writeFile, rm, symlink } from "fs/promises";
3
- import { homedir } from "os";
4
- import { join } from "path";
5
- import { VaultFS, VaultError } from "./vault-fs.js";
6
- describe("VaultFS", () => {
7
- let vaultRoot;
8
- let vaultFs;
9
- beforeEach(async () => {
10
- vaultRoot = join(homedir(), `.vault-test-${Date.now()}-${Math.random().toString(36).slice(2)}`);
11
- await mkdir(vaultRoot, { recursive: true });
12
- vaultFs = new VaultFS(vaultRoot);
13
- });
14
- afterEach(async () => {
15
- await rm(vaultRoot, { recursive: true, force: true });
16
- });
17
- describe("read", () => {
18
- it("reads existing file", async () => {
19
- await writeFile(join(vaultRoot, "test.md"), "content");
20
- const result = await vaultFs.read("test.md");
21
- expect(result).toBe("content");
22
- });
23
- it("throws FILE_NOT_FOUND for missing file", async () => {
24
- await expect(vaultFs.read("missing.md")).rejects.toThrow(VaultError);
25
- await expect(vaultFs.read("missing.md")).rejects.toMatchObject({ code: "FILE_NOT_FOUND" });
26
- });
27
- it("rejects traversal attack with ..", async () => {
28
- await expect(vaultFs.read("../outside.md")).rejects.toThrow(VaultError);
29
- await expect(vaultFs.read("../outside.md")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
30
- });
31
- it("rejects absolute path starting with /", async () => {
32
- await expect(vaultFs.read("/etc/passwd")).rejects.toThrow(VaultError);
33
- await expect(vaultFs.read("/etc/passwd")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
34
- });
35
- it("rejects absolute path starting with ~", async () => {
36
- await expect(vaultFs.read("~/secret")).rejects.toThrow(VaultError);
37
- await expect(vaultFs.read("~/secret")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
38
- });
39
- it("rejects personal vault segment", async () => {
40
- await expect(vaultFs.read("personal/notes.md")).rejects.toThrow(VaultError);
41
- await expect(vaultFs.read("personal/notes.md")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
42
- });
43
- it("rejects personal vault segment case-insensitive", async () => {
44
- await expect(vaultFs.read("Personal/notes.md")).rejects.toThrow(VaultError);
45
- await expect(vaultFs.read("PERSONAL/notes.md")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
46
- });
47
- it("rejects non-ASCII characters", async () => {
48
- await expect(vaultFs.read("test-日本語.md")).rejects.toThrow(VaultError);
49
- await expect(vaultFs.read("test-日本語.md")).rejects.toMatchObject({ code: "PERMISSION_DENIED" });
50
- });
51
- it("reads from nested directory", async () => {
52
- await mkdir(join(vaultRoot, "subdir"), { recursive: true });
53
- await writeFile(join(vaultRoot, "subdir/nested.md"), "nested content");
54
- const result = await vaultFs.read("subdir/nested.md");
55
- expect(result).toBe("nested content");
56
- });
57
- });
58
- describe("write", () => {
59
- it("creates new file", async () => {
60
- const result = await vaultFs.write("new.md", "content");
61
- expect(result.path).toBe("new.md");
62
- expect(result.bytes).toBe(7);
63
- const content = await vaultFs.read("new.md");
64
- expect(content).toBe("content");
65
- });
66
- it("creates nested directories", async () => {
67
- await vaultFs.write("deep/nested/path/file.md", "deep content");
68
- const content = await vaultFs.read("deep/nested/path/file.md");
69
- expect(content).toBe("deep content");
70
- });
71
- it("overwrites existing file", async () => {
72
- await vaultFs.write("existing.md", "old");
73
- await vaultFs.write("existing.md", "new content");
74
- const content = await vaultFs.read("existing.md");
75
- expect(content).toBe("new content");
76
- });
77
- it("reports correct byte count for UTF-8", async () => {
78
- const result = await vaultFs.write("utf8.md", "hello");
79
- expect(result.bytes).toBe(5);
80
- });
81
- });
82
- describe("append", () => {
83
- it("appends to existing file", async () => {
84
- await vaultFs.write("append.md", "line1\n");
85
- const result = await vaultFs.append("append.md", "line2\n");
86
- expect(result.bytes).toBe(6);
87
- const content = await vaultFs.read("append.md");
88
- expect(content).toBe("line1\nline2\n");
89
- });
90
- it("throws FILE_NOT_FOUND when appending to missing file", async () => {
91
- await expect(vaultFs.append("missing.md", "content")).rejects.toMatchObject({ code: "FILE_NOT_FOUND" });
92
- });
93
- });
94
- describe("list", () => {
95
- beforeEach(async () => {
96
- await vaultFs.write("file1.md", "1");
97
- await vaultFs.write("file2.md", "2");
98
- await vaultFs.write("subdir/file3.md", "3");
99
- await vaultFs.write("subdir/deep/file4.md", "4");
100
- await writeFile(join(vaultRoot, ".hidden"), "hidden");
101
- });
102
- it("lists files at depth 1", async () => {
103
- const result = await vaultFs.list(".", 1);
104
- expect(result).toContain("./file1.md");
105
- expect(result).toContain("./file2.md");
106
- expect(result).toContain("./subdir/");
107
- expect(result).not.toContain("./subdir/file3.md");
108
- });
109
- it("lists files at depth 2", async () => {
110
- const result = await vaultFs.list(".", 2);
111
- expect(result).toContain("./file1.md");
112
- expect(result).toContain("./subdir/file3.md");
113
- expect(result).toContain("./subdir/deep/");
114
- expect(result).not.toContain("./subdir/deep/file4.md");
115
- });
116
- it("excludes hidden files", async () => {
117
- const result = await vaultFs.list(".", 1);
118
- expect(result).not.toContain(".hidden");
119
- });
120
- it("excludes .obsidian directory", async () => {
121
- await mkdir(join(vaultRoot, ".obsidian"));
122
- await writeFile(join(vaultRoot, ".obsidian/config"), "config");
123
- const result = await vaultFs.list(".", 2);
124
- expect(result.some(p => p.includes(".obsidian"))).toBe(false);
125
- });
126
- it("skips symlinks", async () => {
127
- await symlink(join(vaultRoot, "file1.md"), join(vaultRoot, "link.md"));
128
- const result = await vaultFs.list(".", 1);
129
- expect(result).toContain("./file1.md");
130
- expect(result).not.toContain("./link.md");
131
- });
132
- it("throws FILE_NOT_FOUND for missing directory", async () => {
133
- await expect(vaultFs.list("missing-dir", 1)).rejects.toThrow(VaultError);
134
- await expect(vaultFs.list("missing-dir", 1)).rejects.toMatchObject({ code: "FILE_NOT_FOUND" });
135
- });
136
- });
137
- describe("delete", () => {
138
- it("deletes existing file", async () => {
139
- await vaultFs.write("to-delete.md", "content");
140
- await vaultFs.delete("to-delete.md");
141
- expect(await vaultFs.exists("to-delete.md")).toBe(false);
142
- });
143
- it("throws FILE_NOT_FOUND for missing file", async () => {
144
- await expect(vaultFs.delete("missing.md")).rejects.toThrow(VaultError);
145
- await expect(vaultFs.delete("missing.md")).rejects.toMatchObject({ code: "FILE_NOT_FOUND" });
146
- });
147
- });
148
- describe("move", () => {
149
- it("moves existing file", async () => {
150
- await vaultFs.write("old.md", "content");
151
- const result = await vaultFs.move("old.md", "new.md");
152
- expect(result.from).toBe("old.md");
153
- expect(result.to).toBe("new.md");
154
- expect(await vaultFs.exists("old.md")).toBe(false);
155
- const content = await vaultFs.read("new.md");
156
- expect(content).toBe("content");
157
- });
158
- it("moves to nested path creating directories", async () => {
159
- await vaultFs.write("move-me.md", "content");
160
- await vaultFs.move("move-me.md", "deep/nested/moved.md");
161
- expect(await vaultFs.exists("move-me.md")).toBe(false);
162
- const content = await vaultFs.read("deep/nested/moved.md");
163
- expect(content).toBe("content");
164
- });
165
- it("throws FILE_NOT_FOUND for missing source", async () => {
166
- await expect(vaultFs.move("missing.md", "target.md")).rejects.toThrow(VaultError);
167
- await expect(vaultFs.move("missing.md", "target.md")).rejects.toMatchObject({ code: "FILE_NOT_FOUND" });
168
- });
169
- });
170
- describe("exists", () => {
171
- it("returns true for existing file", async () => {
172
- await vaultFs.write("exists.md", "content");
173
- expect(await vaultFs.exists("exists.md")).toBe(true);
174
- });
175
- it("returns false for missing file", async () => {
176
- expect(await vaultFs.exists("missing.md")).toBe(false);
177
- });
178
- it("returns true for directory", async () => {
179
- await mkdir(join(vaultRoot, "mydir"));
180
- expect(await vaultFs.exists("mydir")).toBe(true);
181
- });
182
- });
183
- describe("verifyNoSymlinkEscape", () => {
184
- it("allows regular file", async () => {
185
- await writeFile(join(vaultRoot, "regular.md"), "content");
186
- await expect(vaultFs.verifyNoSymlinkEscape("regular.md")).resolves.toBeUndefined();
187
- });
188
- it("allows symlink inside vault", async () => {
189
- await writeFile(join(vaultRoot, "target.md"), "content");
190
- await symlink(join(vaultRoot, "target.md"), join(vaultRoot, "link.md"));
191
- await expect(vaultFs.verifyNoSymlinkEscape("link.md")).resolves.toBeUndefined();
192
- });
193
- it("rejects symlink escaping vault", async () => {
194
- const outsideDir = join(homedir(), `.outside-${Date.now()}`);
195
- await mkdir(outsideDir, { recursive: true });
196
- await writeFile(join(outsideDir, "outside.md"), "outside");
197
- await symlink(join(outsideDir, "outside.md"), join(vaultRoot, "escape.md"));
198
- try {
199
- await vaultFs.read("escape.md");
200
- expect.fail("Should have thrown");
201
- }
202
- catch (e) {
203
- expect(e).toBeInstanceOf(VaultError);
204
- expect(e.code).toBe("PERMISSION_DENIED");
205
- }
206
- await rm(outsideDir, { recursive: true, force: true });
207
- });
208
- });
209
- });
210
- //# sourceMappingURL=vault-fs.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"vault-fs.test.js","sourceRoot":"","sources":["../../src/lib/vault-fs.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};
@@ -1,112 +0,0 @@
1
- import { describe, it, expect, vi, beforeEach } from "vitest";
2
- import { existsSync, readFileSync, writeFileSync } from "fs";
3
- import { buildMcpEntry, configureClient } from "./configure.js";
4
- import { readJsonConfig, writeJsonConfig, addMcpEntry } from "./json-config.js";
5
- import { insertTomlBlock } from "./toml-config.js";
6
- import { writeMarkdownInstruction, writeMdcInstruction } from "./instructions.js";
7
- import { CLIENT_REGISTRY } from "./clients.js";
8
- vi.mock("./json-config.js");
9
- vi.mock("./toml-config.js");
10
- vi.mock("./instructions.js");
11
- vi.mock("fs", () => ({
12
- existsSync: vi.fn(),
13
- readFileSync: vi.fn(),
14
- writeFileSync: vi.fn(),
15
- mkdirSync: vi.fn(),
16
- }));
17
- const mockExists = vi.mocked(existsSync);
18
- beforeEach(() => vi.resetAllMocks());
19
- function makeDetected(slug) {
20
- const config = CLIENT_REGISTRY.find((c) => c.slug === slug);
21
- return {
22
- config,
23
- mcpConfigPath: `/home/${slug}/config`,
24
- instructionPath: `/home/${slug}/instruction`,
25
- };
26
- }
27
- describe("buildMcpEntry", () => {
28
- it("builds string command entry for standard clients", () => {
29
- const entry = buildMcpEntry("string", "env", "~/Vaults/ai");
30
- expect(entry).toEqual({
31
- command: "npx",
32
- args: ["-y", "superskill"],
33
- env: { VAULT_PATH: "~/Vaults/ai" },
34
- });
35
- });
36
- it("builds array command entry for OpenCode", () => {
37
- const entry = buildMcpEntry("array", "environment", "~/Vaults/ai", { type: "local" });
38
- expect(entry).toEqual({
39
- type: "local",
40
- command: ["npx", "-y", "superskill"],
41
- environment: { VAULT_PATH: "~/Vaults/ai" },
42
- });
43
- });
44
- });
45
- describe("configureClient", () => {
46
- it("configures JSON client with MCP entry and markdown instruction", () => {
47
- vi.mocked(readJsonConfig).mockReturnValue({ mcpServers: {} });
48
- vi.mocked(addMcpEntry).mockReturnValue({ config: { mcpServers: { "superskill": {} } }, alreadyExists: false });
49
- vi.mocked(writeMarkdownInstruction).mockReturnValue("created");
50
- const result = configureClient(makeDetected("claude-code"), "~/Vaults/ai");
51
- expect(result.mcpConfigured).toBe(true);
52
- expect(result.instructionConfigured).toBe(true);
53
- });
54
- it("skips when MCP entry already exists", () => {
55
- vi.mocked(readJsonConfig).mockReturnValue({ mcpServers: { "superskill": {} } });
56
- vi.mocked(addMcpEntry).mockReturnValue({ config: {}, alreadyExists: true });
57
- vi.mocked(writeMarkdownInstruction).mockReturnValue("exists");
58
- const result = configureClient(makeDetected("claude-code"), "~/Vaults/ai");
59
- expect(result.mcpConfigured).toBe(false);
60
- expect(result.skipped).toContain("already exists");
61
- });
62
- it("returns error for invalid JSON", () => {
63
- vi.mocked(readJsonConfig).mockReturnValue(null);
64
- const result = configureClient(makeDetected("claude-code"), "~/Vaults/ai");
65
- expect(result.error).toContain("Invalid JSON");
66
- });
67
- it("handles dry run", () => {
68
- const result = configureClient(makeDetected("claude-code"), "~/Vaults/ai", { dryRun: true });
69
- expect(result.mcpConfigured).toBe(true);
70
- expect(result.instructionConfigured).toBe(true);
71
- expect(writeJsonConfig).not.toHaveBeenCalled();
72
- });
73
- it("configures TOML client (Codex)", () => {
74
- mockExists.mockReturnValue(false);
75
- vi.mocked(insertTomlBlock).mockReturnValue("toml content");
76
- vi.mocked(writeMarkdownInstruction).mockReturnValue("created");
77
- const result = configureClient(makeDetected("codex"), "~/Vaults/ai");
78
- expect(result.mcpConfigured).toBe(true);
79
- expect(writeFileSync).toHaveBeenCalled();
80
- });
81
- it("skips TOML when block already exists", () => {
82
- mockExists.mockReturnValue(true);
83
- vi.mocked(readFileSync).mockReturnValue("existing toml");
84
- vi.mocked(insertTomlBlock).mockReturnValue(null);
85
- vi.mocked(writeMarkdownInstruction).mockReturnValue("created");
86
- const result = configureClient(makeDetected("codex"), "~/Vaults/ai");
87
- expect(result.skipped).toContain("already exists");
88
- });
89
- it("configures mdc-file strategy (Cursor)", () => {
90
- vi.mocked(readJsonConfig).mockReturnValue({});
91
- vi.mocked(addMcpEntry).mockReturnValue({ config: {}, alreadyExists: false });
92
- const result = configureClient(makeDetected("cursor"), "~/Vaults/ai");
93
- expect(result.instructionConfigured).toBe(true);
94
- expect(writeMdcInstruction).toHaveBeenCalled();
95
- });
96
- it("handles none instruction strategy", () => {
97
- vi.mocked(readJsonConfig).mockReturnValue({});
98
- vi.mocked(addMcpEntry).mockReturnValue({ config: {}, alreadyExists: false });
99
- const result = configureClient(makeDetected("claude-desktop"), "~/Vaults/ai");
100
- expect(result.mcpConfigured).toBe(true);
101
- expect(result.instructionConfigured).toBe(false);
102
- });
103
- it("configures config-array strategy (OpenCode)", () => {
104
- vi.mocked(readJsonConfig).mockReturnValue({});
105
- vi.mocked(addMcpEntry).mockReturnValue({ config: {}, alreadyExists: false });
106
- mockExists.mockReturnValue(true);
107
- const result = configureClient(makeDetected("opencode"), "~/Vaults/ai");
108
- expect(result.instructionConfigured).toBe(true);
109
- expect(writeFileSync).toHaveBeenCalled();
110
- });
111
- });
112
- //# sourceMappingURL=configure.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"configure.test.js","sourceRoot":"","sources":["../../src/setup/configure.test.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export {};