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,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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7E,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,KAAK,GAAG;QACZ,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC,EAAE;QAChD,EAAE,IAAI,EAAE,YAAY,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,EAAE;QACnD,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE;QACvD,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC3D,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE;QAC3D,EAAE,IAAI,EAAE,oBAAoB,EAAE,KAAK,EAAE,2BAA2B,EAAE,QAAQ,EAAE,CAAC,EAAE;QAC/E,EAAE,IAAI,EAAE,uBAAuB,EAAE,KAAK,EAAE,sBAAsB,EAAE,QAAQ,EAAE,CAAC,EAAE;KAC9E,CAAC;IAEF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE;YACd,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,IAAI,GAAG,YAAY,CAAC;QAC1B,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACrD,MAAM,IAAI,GAAG,4OAA4O,CAAC;QAC1P,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,sCAAsC,CAAC;QACpD,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,IAAI,GAAG,wCAAwC,CAAC;QACtD,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,IAAI,GAAG,MAAM,CAAC;QACpB,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,GAAG,EAAE;QAC3C,MAAM,IAAI,GAAG,8EAA8E,CAAC;QAC5F,MAAM,MAAM,GAAG,qBAAqB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAA6B,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAEjE,qEAAqE;AACrE,sEAAsE;AACtE,MAAM,aAAa,GAAG;IACpB,aAAa;IACb,wBAAwB;IACxB,sBAAsB;IACtB,wBAAwB;IACxB,wBAAwB;IACxB,mBAAmB;IACnB,iBAAiB;IACjB,cAAc;CACf,CAAC;AACF,MAAM,iBAAiB,GAAG,CAAC,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;AAExE,SAAS,eAAe;IACtB,MAAM,KAAK,GAAuC,EAAE,CAAC;IACrD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,SAAS,GACb,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC3B,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;QACnD,IAAI,SAAS,EAAE,CAAC;YACd,KAAK,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC9B,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,cAAc,CAAC,KAAyC;IAC/D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,SAA6C,EAAE,EAAc;IAC5E,wEAAwE;IACxE,4EAA4E;IAC5E,MAAM,QAAQ,GAAG,eAAe,EAAE,CAAC;IAEnC,mDAAmD;IACnD,MAAM,QAAQ,GAAuC,EAAE,CAAC;IACxD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;QACzC,QAAQ,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,SAAS,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YACjC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1B,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAW,CAAC;QAC9C,CAAC;IACH,CAAC;IACD,IAAI,CAAC;QACH,EAAE,EAAE,CAAC;IACP,CAAC;YAAS,CAAC;QACT,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAChC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YACnC,CAAC;QACH,CAAC;QACD,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAGD,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC1B,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,6BAA6B,EAAE,GAAG,EAAE;YACrC,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE;gBACjC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;YAChD,OAAO,CAAC,EAAE,sBAAsB,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE;gBACrD,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,oCAAoC,EAAE,GAAG,EAAE;YAC5C,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,eAAe,EAAE,iBAAiB,EAAE,EAAE,GAAG,EAAE;gBACrE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACxC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;gBAC7C,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,6CAA6C,EAAE,GAAG,EAAE;YACrD,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,eAAe,EAAE,mBAAmB,EAAE,EAAE,GAAG,EAAE;gBACvE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;YAC1C,OAAO,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE;gBAC3C,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;YACzC,OAAO,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE;gBACzC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;gBACrC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAChC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,OAAO,CAAC,EAAE,aAAa,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE;gBACnC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;YACvC,OAAO,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE,GAAG,EAAE;gBACrC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,gCAAgC,EAAE,GAAG,EAAE;YACxC,OAAO,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE;gBACzC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;YACnD,OAAO,CAAC,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,gBAAgB,EAAE,EAAE,GAAG,EAAE;gBACzE,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC/C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;QAClC,EAAE,CAAC,gDAAgD,EAAE,GAAG,EAAE;YACxD,wDAAwD;YACxD,OAAO,CAAC,EAAE,EAAE,GAAG,EAAE;gBACf,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;YAC3D,wCAAwC;YACxC,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE;gBACjC,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;gBAC5B,kEAAkE;gBAClE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;gBACxC,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC7C,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACvC,EAAE,CAAC,qBAAqB,EAAE,GAAG,EAAE;YAC7B,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC3D,MAAM,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChD,MAAM,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -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 {};