superskill 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +42 -0
- package/LICENSE +21 -0
- package/README.md +235 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +1158 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/brainstorm.d.ts +9 -0
- package/dist/commands/brainstorm.js +37 -0
- package/dist/commands/brainstorm.js.map +1 -0
- package/dist/commands/brainstorm.test.d.ts +1 -0
- package/dist/commands/brainstorm.test.js +110 -0
- package/dist/commands/brainstorm.test.js.map +1 -0
- package/dist/commands/context.d.ts +18 -0
- package/dist/commands/context.js +88 -0
- package/dist/commands/context.js.map +1 -0
- package/dist/commands/context.test.d.ts +1 -0
- package/dist/commands/context.test.js +230 -0
- package/dist/commands/context.test.js.map +1 -0
- package/dist/commands/decide.d.ts +12 -0
- package/dist/commands/decide.js +40 -0
- package/dist/commands/decide.js.map +1 -0
- package/dist/commands/decide.test.d.ts +1 -0
- package/dist/commands/decide.test.js +109 -0
- package/dist/commands/decide.test.js.map +1 -0
- package/dist/commands/graph.d.ts +15 -0
- package/dist/commands/graph.js +89 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/graph.test.d.ts +1 -0
- package/dist/commands/graph.test.js +215 -0
- package/dist/commands/graph.test.js.map +1 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.js +257 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/learn.d.ts +25 -0
- package/dist/commands/learn.js +92 -0
- package/dist/commands/learn.js.map +1 -0
- package/dist/commands/learn.test.d.ts +1 -0
- package/dist/commands/learn.test.js +241 -0
- package/dist/commands/learn.test.js.map +1 -0
- package/dist/commands/prune.d.ts +58 -0
- package/dist/commands/prune.js +246 -0
- package/dist/commands/prune.js.map +1 -0
- package/dist/commands/read.d.ts +8 -0
- package/dist/commands/read.js +7 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/read.test.d.ts +1 -0
- package/dist/commands/read.test.js +48 -0
- package/dist/commands/read.test.js.map +1 -0
- package/dist/commands/resume.d.ts +20 -0
- package/dist/commands/resume.js +141 -0
- package/dist/commands/resume.js.map +1 -0
- package/dist/commands/resume.test.d.ts +1 -0
- package/dist/commands/resume.test.js +243 -0
- package/dist/commands/resume.test.js.map +1 -0
- package/dist/commands/search.d.ts +8 -0
- package/dist/commands/search.js +25 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/search.test.d.ts +1 -0
- package/dist/commands/search.test.js +61 -0
- package/dist/commands/search.test.js.map +1 -0
- package/dist/commands/session.d.ts +22 -0
- package/dist/commands/session.js +79 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/session.test.d.ts +1 -0
- package/dist/commands/session.test.js +231 -0
- package/dist/commands/session.test.js.map +1 -0
- package/dist/commands/skill/catalog.d.ts +39 -0
- package/dist/commands/skill/catalog.js +260 -0
- package/dist/commands/skill/catalog.js.map +1 -0
- package/dist/commands/skill/index.d.ts +55 -0
- package/dist/commands/skill/index.js +82 -0
- package/dist/commands/skill/index.js.map +1 -0
- package/dist/commands/skill/index.test.d.ts +1 -0
- package/dist/commands/skill/index.test.js +137 -0
- package/dist/commands/skill/index.test.js.map +1 -0
- package/dist/commands/skill/install.d.ts +14 -0
- package/dist/commands/skill/install.js +108 -0
- package/dist/commands/skill/install.js.map +1 -0
- package/dist/commands/skill/install.test.d.ts +1 -0
- package/dist/commands/skill/install.test.js +225 -0
- package/dist/commands/skill/install.test.js.map +1 -0
- package/dist/commands/skill/list.d.ts +6 -0
- package/dist/commands/skill/list.js +5 -0
- package/dist/commands/skill/list.js.map +1 -0
- package/dist/commands/skill/list.test.d.ts +1 -0
- package/dist/commands/skill/list.test.js +101 -0
- package/dist/commands/skill/list.test.js.map +1 -0
- package/dist/commands/skill/marketplace.d.ts +121 -0
- package/dist/commands/skill/marketplace.js +548 -0
- package/dist/commands/skill/marketplace.js.map +1 -0
- package/dist/commands/skill/schema.d.ts +27 -0
- package/dist/commands/skill/schema.js +55 -0
- package/dist/commands/skill/schema.js.map +1 -0
- package/dist/commands/skill/schema.test.d.ts +1 -0
- package/dist/commands/skill/schema.test.js +142 -0
- package/dist/commands/skill/schema.test.js.map +1 -0
- package/dist/commands/skill/validate.d.ts +10 -0
- package/dist/commands/skill/validate.js +40 -0
- package/dist/commands/skill/validate.js.map +1 -0
- package/dist/commands/skill/validate.test.d.ts +1 -0
- package/dist/commands/skill/validate.test.js +171 -0
- package/dist/commands/skill/validate.test.js.map +1 -0
- package/dist/commands/task.d.ts +34 -0
- package/dist/commands/task.js +160 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/task.test.d.ts +1 -0
- package/dist/commands/task.test.js +395 -0
- package/dist/commands/task.test.js.map +1 -0
- package/dist/commands/todo.d.ts +15 -0
- package/dist/commands/todo.js +99 -0
- package/dist/commands/todo.js.map +1 -0
- package/dist/commands/todo.test.d.ts +1 -0
- package/dist/commands/todo.test.js +324 -0
- package/dist/commands/todo.test.js.map +1 -0
- package/dist/commands/write.d.ts +12 -0
- package/dist/commands/write.js +40 -0
- package/dist/commands/write.js.map +1 -0
- package/dist/commands/write.test.d.ts +1 -0
- package/dist/commands/write.test.js +79 -0
- package/dist/commands/write.test.js.map +1 -0
- package/dist/config.d.ts +15 -0
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -0
- package/dist/config.test.d.ts +1 -0
- package/dist/config.test.js +147 -0
- package/dist/config.test.js.map +1 -0
- package/dist/core/executor.d.ts +11 -0
- package/dist/core/executor.js +42 -0
- package/dist/core/executor.js.map +1 -0
- package/dist/core/executor.test.d.ts +1 -0
- package/dist/core/executor.test.js +206 -0
- package/dist/core/executor.test.js.map +1 -0
- package/dist/core/middleware/error-handler.d.ts +2 -0
- package/dist/core/middleware/error-handler.js +29 -0
- package/dist/core/middleware/error-handler.js.map +1 -0
- package/dist/core/middleware/index.d.ts +2 -0
- package/dist/core/middleware/index.js +3 -0
- package/dist/core/middleware/index.js.map +1 -0
- package/dist/core/middleware/logging.d.ts +2 -0
- package/dist/core/middleware/logging.js +18 -0
- package/dist/core/middleware/logging.js.map +1 -0
- package/dist/core/registry.d.ts +12 -0
- package/dist/core/registry.js +552 -0
- package/dist/core/registry.js.map +1 -0
- package/dist/core/registry.test.d.ts +1 -0
- package/dist/core/registry.test.js +213 -0
- package/dist/core/registry.test.js.map +1 -0
- package/dist/core/types.d.ts +38 -0
- package/dist/core/types.js +2 -0
- package/dist/core/types.js.map +1 -0
- package/dist/integration/coordination.test.d.ts +1 -0
- package/dist/integration/coordination.test.js +286 -0
- package/dist/integration/coordination.test.js.map +1 -0
- package/dist/integration/project-artifacts.test.d.ts +1 -0
- package/dist/integration/project-artifacts.test.js +275 -0
- package/dist/integration/project-artifacts.test.js.map +1 -0
- package/dist/integration/registry-graph.test.d.ts +1 -0
- package/dist/integration/registry-graph.test.js +157 -0
- package/dist/integration/registry-graph.test.js.map +1 -0
- package/dist/integration/vault-lifecycle.test.d.ts +1 -0
- package/dist/integration/vault-lifecycle.test.js +183 -0
- package/dist/integration/vault-lifecycle.test.js.map +1 -0
- package/dist/lib/auto-number.d.ts +10 -0
- package/dist/lib/auto-number.js +33 -0
- package/dist/lib/auto-number.js.map +1 -0
- package/dist/lib/auto-number.test.d.ts +1 -0
- package/dist/lib/auto-number.test.js +88 -0
- package/dist/lib/auto-number.test.js.map +1 -0
- package/dist/lib/auto-profile.d.ts +11 -0
- package/dist/lib/auto-profile.js +123 -0
- package/dist/lib/auto-profile.js.map +1 -0
- package/dist/lib/auto-profile.test.d.ts +1 -0
- package/dist/lib/auto-profile.test.js +227 -0
- package/dist/lib/auto-profile.test.js.map +1 -0
- package/dist/lib/escape-regex.d.ts +4 -0
- package/dist/lib/escape-regex.js +8 -0
- package/dist/lib/escape-regex.js.map +1 -0
- package/dist/lib/escape-regex.test.d.ts +1 -0
- package/dist/lib/escape-regex.test.js +27 -0
- package/dist/lib/escape-regex.test.js.map +1 -0
- package/dist/lib/frontmatter.d.ts +34 -0
- package/dist/lib/frontmatter.js +75 -0
- package/dist/lib/frontmatter.js.map +1 -0
- package/dist/lib/frontmatter.test.d.ts +1 -0
- package/dist/lib/frontmatter.test.js +192 -0
- package/dist/lib/frontmatter.test.js.map +1 -0
- package/dist/lib/project-detector.d.ts +12 -0
- package/dist/lib/project-detector.js +124 -0
- package/dist/lib/project-detector.js.map +1 -0
- package/dist/lib/project-detector.test.d.ts +1 -0
- package/dist/lib/project-detector.test.js +117 -0
- package/dist/lib/project-detector.test.js.map +1 -0
- package/dist/lib/safe-external-path.d.ts +10 -0
- package/dist/lib/safe-external-path.js +47 -0
- package/dist/lib/safe-external-path.js.map +1 -0
- package/dist/lib/safe-external-path.test.d.ts +1 -0
- package/dist/lib/safe-external-path.test.js +99 -0
- package/dist/lib/safe-external-path.test.js.map +1 -0
- package/dist/lib/search-engine.d.ts +19 -0
- package/dist/lib/search-engine.js +164 -0
- package/dist/lib/search-engine.js.map +1 -0
- package/dist/lib/search-engine.test.d.ts +1 -0
- package/dist/lib/search-engine.test.js +120 -0
- package/dist/lib/search-engine.test.js.map +1 -0
- package/dist/lib/session-registry.d.ts +59 -0
- package/dist/lib/session-registry.js +231 -0
- package/dist/lib/session-registry.js.map +1 -0
- package/dist/lib/session-registry.test.d.ts +1 -0
- package/dist/lib/session-registry.test.js +199 -0
- package/dist/lib/session-registry.test.js.map +1 -0
- package/dist/lib/skill-registry.d.ts +13 -0
- package/dist/lib/skill-registry.js +77 -0
- package/dist/lib/skill-registry.js.map +1 -0
- package/dist/lib/stack-detector.d.ts +7 -0
- package/dist/lib/stack-detector.js +184 -0
- package/dist/lib/stack-detector.js.map +1 -0
- package/dist/lib/stack-detector.test.d.ts +1 -0
- package/dist/lib/stack-detector.test.js +110 -0
- package/dist/lib/stack-detector.test.js.map +1 -0
- package/dist/lib/token-estimator.d.ts +19 -0
- package/dist/lib/token-estimator.js +59 -0
- package/dist/lib/token-estimator.js.map +1 -0
- package/dist/lib/token-estimator.test.d.ts +1 -0
- package/dist/lib/token-estimator.test.js +65 -0
- package/dist/lib/token-estimator.test.js.map +1 -0
- package/dist/lib/tool-detector.d.ts +8 -0
- package/dist/lib/tool-detector.js +76 -0
- package/dist/lib/tool-detector.js.map +1 -0
- package/dist/lib/tool-detector.test.d.ts +1 -0
- package/dist/lib/tool-detector.test.js +170 -0
- package/dist/lib/tool-detector.test.js.map +1 -0
- package/dist/lib/vault-fs.d.ts +39 -0
- package/dist/lib/vault-fs.js +184 -0
- package/dist/lib/vault-fs.js.map +1 -0
- package/dist/lib/vault-fs.test.d.ts +1 -0
- package/dist/lib/vault-fs.test.js +210 -0
- package/dist/lib/vault-fs.test.js.map +1 -0
- package/dist/mcp-server.d.ts +2 -0
- package/dist/mcp-server.js +387 -0
- package/dist/mcp-server.js.map +1 -0
- package/dist/setup/clients.d.ts +2 -0
- package/dist/setup/clients.js +109 -0
- package/dist/setup/clients.js.map +1 -0
- package/dist/setup/configure.d.ts +6 -0
- package/dist/setup/configure.js +126 -0
- package/dist/setup/configure.js.map +1 -0
- package/dist/setup/configure.test.d.ts +1 -0
- package/dist/setup/configure.test.js +112 -0
- package/dist/setup/configure.test.js.map +1 -0
- package/dist/setup/detect.d.ts +3 -0
- package/dist/setup/detect.js +24 -0
- package/dist/setup/detect.js.map +1 -0
- package/dist/setup/detect.test.d.ts +1 -0
- package/dist/setup/detect.test.js +44 -0
- package/dist/setup/detect.test.js.map +1 -0
- package/dist/setup/index.d.ts +2 -0
- package/dist/setup/index.js +147 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/instructions.d.ts +4 -0
- package/dist/setup/instructions.js +62 -0
- package/dist/setup/instructions.js.map +1 -0
- package/dist/setup/instructions.test.d.ts +1 -0
- package/dist/setup/instructions.test.js +84 -0
- package/dist/setup/instructions.test.js.map +1 -0
- package/dist/setup/json-config.d.ts +10 -0
- package/dist/setup/json-config.js +43 -0
- package/dist/setup/json-config.js.map +1 -0
- package/dist/setup/json-config.test.d.ts +1 -0
- package/dist/setup/json-config.test.js +92 -0
- package/dist/setup/json-config.test.js.map +1 -0
- package/dist/setup/postinstall.d.ts +2 -0
- package/dist/setup/postinstall.js +22 -0
- package/dist/setup/postinstall.js.map +1 -0
- package/dist/setup/preuninstall.d.ts +2 -0
- package/dist/setup/preuninstall.js +12 -0
- package/dist/setup/preuninstall.js.map +1 -0
- package/dist/setup/setup-integration.test.d.ts +1 -0
- package/dist/setup/setup-integration.test.js +72 -0
- package/dist/setup/setup-integration.test.js.map +1 -0
- package/dist/setup/teardown.d.ts +5 -0
- package/dist/setup/teardown.js +94 -0
- package/dist/setup/teardown.js.map +1 -0
- package/dist/setup/teardown.test.d.ts +1 -0
- package/dist/setup/teardown.test.js +105 -0
- package/dist/setup/teardown.test.js.map +1 -0
- package/dist/setup/toml-config.d.ts +5 -0
- package/dist/setup/toml-config.js +26 -0
- package/dist/setup/toml-config.js.map +1 -0
- package/dist/setup/toml-config.test.d.ts +1 -0
- package/dist/setup/toml-config.test.js +49 -0
- package/dist/setup/toml-config.test.js.map +1 -0
- package/dist/setup/types.d.ts +52 -0
- package/dist/setup/types.js +23 -0
- package/dist/setup/types.js.map +1 -0
- package/dist/test-helpers.d.ts +20 -0
- package/dist/test-helpers.js +47 -0
- package/dist/test-helpers.js.map +1 -0
- package/dist/test-helpers.test.d.ts +1 -0
- package/dist/test-helpers.test.js +90 -0
- package/dist/test-helpers.test.js.map +1 -0
- package/package.json +74 -0
|
@@ -0,0 +1,227 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-profile.test.js","sourceRoot":"","sources":["../../src/lib/auto-profile.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"escape-regex.js","sourceRoot":"","sources":["../../src/lib/escape-regex.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACpD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface Frontmatter {
|
|
2
|
+
type?: string;
|
|
3
|
+
project?: string;
|
|
4
|
+
status?: string;
|
|
5
|
+
created?: string;
|
|
6
|
+
updated?: string;
|
|
7
|
+
tags?: string[];
|
|
8
|
+
related?: string[];
|
|
9
|
+
[key: string]: unknown;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse markdown content with YAML frontmatter.
|
|
13
|
+
*/
|
|
14
|
+
export declare function parseFrontmatter(content: string): {
|
|
15
|
+
data: Frontmatter;
|
|
16
|
+
content: string;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* Serialize frontmatter + content back to markdown.
|
|
20
|
+
*/
|
|
21
|
+
export declare function serializeFrontmatter(data: Frontmatter, content: string): string;
|
|
22
|
+
/**
|
|
23
|
+
* Create frontmatter with defaults for a new note.
|
|
24
|
+
*/
|
|
25
|
+
export declare function createFrontmatter(overrides: Partial<Frontmatter>): Frontmatter;
|
|
26
|
+
/**
|
|
27
|
+
* Merge new frontmatter values into existing frontmatter.
|
|
28
|
+
* Updates the `updated` field automatically.
|
|
29
|
+
*/
|
|
30
|
+
export declare function mergeFrontmatter(existing: Frontmatter, updates: Partial<Frontmatter>): Frontmatter;
|
|
31
|
+
/**
|
|
32
|
+
* Validate frontmatter fields.
|
|
33
|
+
*/
|
|
34
|
+
export declare function validateFrontmatter(data: Frontmatter): string[];
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
// SPDX-License-Identifier: AGPL-3.0-or-later OR Commercial
|
|
2
|
+
import matter from "gray-matter";
|
|
3
|
+
const VALID_TYPES = [
|
|
4
|
+
"context", "adr", "brainstorm", "decision", "todo",
|
|
5
|
+
"incident", "pattern", "evaluation", "index",
|
|
6
|
+
"task", "learning", "session",
|
|
7
|
+
];
|
|
8
|
+
const VALID_STATUSES = [
|
|
9
|
+
"active", "resolved", "deprecated", "draft",
|
|
10
|
+
"backlog", "in-progress", "blocked", "done", "cancelled", "completed",
|
|
11
|
+
];
|
|
12
|
+
/**
|
|
13
|
+
* Parse markdown content with YAML frontmatter.
|
|
14
|
+
*/
|
|
15
|
+
export function parseFrontmatter(content) {
|
|
16
|
+
try {
|
|
17
|
+
const parsed = matter(content);
|
|
18
|
+
return { data: parsed.data, content: parsed.content };
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
// Malformed YAML — return empty frontmatter and raw content
|
|
22
|
+
return { data: {}, content };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Serialize frontmatter + content back to markdown.
|
|
27
|
+
*/
|
|
28
|
+
export function serializeFrontmatter(data, content) {
|
|
29
|
+
return matter.stringify(content, data);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Create frontmatter with defaults for a new note.
|
|
33
|
+
*/
|
|
34
|
+
export function createFrontmatter(overrides) {
|
|
35
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
36
|
+
return {
|
|
37
|
+
type: overrides.type ?? "index",
|
|
38
|
+
status: overrides.status ?? "active",
|
|
39
|
+
created: overrides.created ?? today,
|
|
40
|
+
updated: today,
|
|
41
|
+
...overrides,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Merge new frontmatter values into existing frontmatter.
|
|
46
|
+
* Updates the `updated` field automatically.
|
|
47
|
+
*/
|
|
48
|
+
export function mergeFrontmatter(existing, updates) {
|
|
49
|
+
const today = new Date().toISOString().slice(0, 10);
|
|
50
|
+
return {
|
|
51
|
+
...existing,
|
|
52
|
+
...updates,
|
|
53
|
+
updated: today,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Validate frontmatter fields.
|
|
58
|
+
*/
|
|
59
|
+
export function validateFrontmatter(data) {
|
|
60
|
+
const errors = [];
|
|
61
|
+
if (data.type && !VALID_TYPES.includes(data.type)) {
|
|
62
|
+
errors.push(`Invalid type "${data.type}". Must be one of: ${VALID_TYPES.join(", ")}`);
|
|
63
|
+
}
|
|
64
|
+
if (data.status && !VALID_STATUSES.includes(data.status)) {
|
|
65
|
+
errors.push(`Invalid status "${data.status}". Must be one of: ${VALID_STATUSES.join(", ")}`);
|
|
66
|
+
}
|
|
67
|
+
if (data.tags && !Array.isArray(data.tags)) {
|
|
68
|
+
errors.push(`Tags must be an array`);
|
|
69
|
+
}
|
|
70
|
+
if (data.related && !Array.isArray(data.related)) {
|
|
71
|
+
errors.push(`Related must be an array`);
|
|
72
|
+
}
|
|
73
|
+
return errors;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=frontmatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/lib/frontmatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,192 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"frontmatter.test.js","sourceRoot":"","sources":["../../src/lib/frontmatter.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare function invalidateProjectMapCache(): void;
|
|
2
|
+
/**
|
|
3
|
+
* Detect the project slug from a working directory.
|
|
4
|
+
*
|
|
5
|
+
* Strategy:
|
|
6
|
+
* 1. Strip worktree suffixes from cwd
|
|
7
|
+
* 2. Try exact match in project-map.json
|
|
8
|
+
* 3. Try matching cwd as a subdirectory of a mapped path
|
|
9
|
+
* 4. Try git root as a mapped path
|
|
10
|
+
* 5. Return null if no match
|
|
11
|
+
*/
|
|
12
|
+
export declare function detectProject(cwd: string, vaultPath: string): Promise<string | null>;
|