freeturtle 0.1.29 → 0.1.31
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/dist/bin/freeturtle.js +26 -2
- package/dist/bin/freeturtle.js.map +1 -1
- package/dist/src/approval.test.d.ts +1 -0
- package/dist/src/approval.test.js +110 -0
- package/dist/src/approval.test.js.map +1 -0
- package/dist/src/cli/daemon-utils.d.ts +3 -0
- package/dist/src/cli/daemon-utils.js +49 -0
- package/dist/src/cli/daemon-utils.js.map +1 -0
- package/dist/src/cli/daemon-utils.test.d.ts +1 -0
- package/dist/src/cli/daemon-utils.test.js +46 -0
- package/dist/src/cli/daemon-utils.test.js.map +1 -0
- package/dist/src/cli/restart.d.ts +1 -0
- package/dist/src/cli/restart.js +23 -0
- package/dist/src/cli/restart.js.map +1 -0
- package/dist/src/cli/skills.d.ts +1 -0
- package/dist/src/cli/skills.js +28 -0
- package/dist/src/cli/skills.js.map +1 -0
- package/dist/src/cli/stop.d.ts +1 -0
- package/dist/src/cli/stop.js +11 -0
- package/dist/src/cli/stop.js.map +1 -0
- package/dist/src/cli/update.js +12 -56
- package/dist/src/cli/update.js.map +1 -1
- package/dist/src/config.d.ts +2 -0
- package/dist/src/config.js +9 -0
- package/dist/src/config.js.map +1 -1
- package/dist/src/config.test.d.ts +1 -0
- package/dist/src/config.test.js +34 -0
- package/dist/src/config.test.js.map +1 -0
- package/dist/src/daemon.js +7 -1
- package/dist/src/daemon.js.map +1 -1
- package/dist/src/modules/loader.js +12 -0
- package/dist/src/modules/loader.js.map +1 -1
- package/dist/src/modules/shell/index.d.ts +12 -0
- package/dist/src/modules/shell/index.js +298 -0
- package/dist/src/modules/shell/index.js.map +1 -0
- package/dist/src/modules/shell/index.test.d.ts +1 -0
- package/dist/src/modules/shell/index.test.js +65 -0
- package/dist/src/modules/shell/index.test.js.map +1 -0
- package/dist/src/policy.js +2 -0
- package/dist/src/policy.js.map +1 -1
- package/dist/src/policy.test.d.ts +1 -0
- package/dist/src/policy.test.js +57 -0
- package/dist/src/policy.test.js.map +1 -0
- package/dist/src/redaction.test.d.ts +1 -0
- package/dist/src/redaction.test.js +32 -0
- package/dist/src/redaction.test.js.map +1 -0
- package/dist/src/reliability.test.d.ts +1 -0
- package/dist/src/reliability.test.js +30 -0
- package/dist/src/reliability.test.js.map +1 -0
- package/dist/src/rpc/protocol.test.d.ts +1 -0
- package/dist/src/rpc/protocol.test.js +47 -0
- package/dist/src/rpc/protocol.test.js.map +1 -0
- package/dist/src/runner.d.ts +3 -0
- package/dist/src/runner.js +13 -1
- package/dist/src/runner.js.map +1 -1
- package/dist/src/skills/index.d.ts +3 -0
- package/dist/src/skills/index.js +3 -0
- package/dist/src/skills/index.js.map +1 -0
- package/dist/src/skills/loader.d.ts +33 -0
- package/dist/src/skills/loader.js +211 -0
- package/dist/src/skills/loader.js.map +1 -0
- package/dist/src/skills/parser.d.ts +13 -0
- package/dist/src/skills/parser.js +84 -0
- package/dist/src/skills/parser.js.map +1 -0
- package/dist/src/skills/types.d.ts +52 -0
- package/dist/src/skills/types.js +7 -0
- package/dist/src/skills/types.js.map +1 -0
- package/package.json +8 -3
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { requiresApproval, parsePolicy, getDefaultPolicy } from "./policy.js";
|
|
3
|
+
describe("requiresApproval", () => {
|
|
4
|
+
it("requires approval for run_command", () => {
|
|
5
|
+
expect(requiresApproval(undefined, "run_command", { command: "ls" })).toBe(true);
|
|
6
|
+
});
|
|
7
|
+
it("requires approval for delete_cast", () => {
|
|
8
|
+
expect(requiresApproval(undefined, "delete_cast", {})).toBe(true);
|
|
9
|
+
});
|
|
10
|
+
it("requires approval for write_file to soul.md", () => {
|
|
11
|
+
expect(requiresApproval(undefined, "write_file", { path: "soul.md" })).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
it("requires approval for edit_file to config.md", () => {
|
|
14
|
+
expect(requiresApproval(undefined, "edit_file", { path: "config.md" })).toBe(true);
|
|
15
|
+
});
|
|
16
|
+
it("requires approval for write_file to .env", () => {
|
|
17
|
+
expect(requiresApproval(undefined, "write_file", { path: ".env" })).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
it("does not require approval for read_file", () => {
|
|
20
|
+
expect(requiresApproval(undefined, "read_file", { path: "soul.md" })).toBe(false);
|
|
21
|
+
});
|
|
22
|
+
it("does not require approval for regular write_file", () => {
|
|
23
|
+
expect(requiresApproval(undefined, "write_file", { path: "memory/notes.md" })).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
it("does not require approval for manage_process", () => {
|
|
26
|
+
expect(requiresApproval(undefined, "manage_process", { action: "list" })).toBe(false);
|
|
27
|
+
});
|
|
28
|
+
it("requires approval for commit_file to main branch", () => {
|
|
29
|
+
expect(requiresApproval(undefined, "commit_file", { branch: "main" })).toBe(true);
|
|
30
|
+
});
|
|
31
|
+
it("does not require approval for commit_file to feature branch with custom policy", () => {
|
|
32
|
+
const policy = getDefaultPolicy();
|
|
33
|
+
policy.github.approval_required_branches = ["main"];
|
|
34
|
+
expect(requiresApproval(policy, "commit_file", { branch: "feature/test" })).toBe(false);
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
describe("parsePolicy", () => {
|
|
38
|
+
it("returns defaults for empty input", () => {
|
|
39
|
+
const policy = parsePolicy({});
|
|
40
|
+
expect(policy.approvals.timeout_seconds).toBe(300);
|
|
41
|
+
expect(policy.approvals.fail_mode).toBe("deny");
|
|
42
|
+
expect(policy.github.approval_required_branches).toEqual(["main"]);
|
|
43
|
+
});
|
|
44
|
+
it("parses comma-separated lists", () => {
|
|
45
|
+
const policy = parsePolicy({
|
|
46
|
+
github: { allowed_repos: "repo1, repo2, repo3" },
|
|
47
|
+
});
|
|
48
|
+
expect(policy.github.allowed_repos).toEqual(["repo1", "repo2", "repo3"]);
|
|
49
|
+
});
|
|
50
|
+
it("parses approval timeout", () => {
|
|
51
|
+
const policy = parsePolicy({
|
|
52
|
+
approvals: { timeout_seconds: "600" },
|
|
53
|
+
});
|
|
54
|
+
expect(policy.approvals.timeout_seconds).toBe(600);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
//# sourceMappingURL=policy.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.test.js","sourceRoot":"","sources":["../../src/policy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { redact } from "./redaction.js";
|
|
3
|
+
describe("redact", () => {
|
|
4
|
+
it("redacts string values that look like secrets", () => {
|
|
5
|
+
const input = { api_key: "sk-abc123xyz", name: "test" };
|
|
6
|
+
const result = redact(input);
|
|
7
|
+
expect(result.api_key).toBe("***");
|
|
8
|
+
expect(result.name).toBe("test");
|
|
9
|
+
});
|
|
10
|
+
it("redacts nested objects", () => {
|
|
11
|
+
const input = { config: { password: "hunter2" } };
|
|
12
|
+
const result = redact(input);
|
|
13
|
+
const config = result.config;
|
|
14
|
+
expect(config.password).toBe("***");
|
|
15
|
+
});
|
|
16
|
+
it("handles non-object inputs", () => {
|
|
17
|
+
expect(redact("hello")).toBe("hello");
|
|
18
|
+
expect(redact(42)).toBe(42);
|
|
19
|
+
expect(redact(null)).toBeNull();
|
|
20
|
+
});
|
|
21
|
+
it("redacts keys containing 'token'", () => {
|
|
22
|
+
const input = { access_token: "eyJhbGci..." };
|
|
23
|
+
const result = redact(input);
|
|
24
|
+
expect(result.access_token).toBe("***");
|
|
25
|
+
});
|
|
26
|
+
it("redacts keys containing 'secret'", () => {
|
|
27
|
+
const input = { client_secret: "abc123" };
|
|
28
|
+
const result = redact(input);
|
|
29
|
+
expect(result.client_secret).toBe("***");
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=redaction.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"redaction.test.js","sourceRoot":"","sources":["../../src/redaction.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAExC,QAAQ,CAAC,QAAQ,EAAE,GAAG,EAAE;IACtB,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,KAAK,GAAG,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAA4B,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wBAAwB,EAAE,GAAG,EAAE;QAChC,MAAM,KAAK,GAAG,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAA4B,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAiC,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,KAAK,GAAG,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;QAC9C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAA4B,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,KAAK,GAAG,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;QAC1C,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAA4B,CAAC;QACxD,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { withRetry } from "./reliability.js";
|
|
3
|
+
describe("withRetry", () => {
|
|
4
|
+
it("returns on first success", async () => {
|
|
5
|
+
const result = await withRetry(() => Promise.resolve("ok"), {
|
|
6
|
+
maxRetries: 3,
|
|
7
|
+
baseDelayMs: 10,
|
|
8
|
+
maxDelayMs: 100,
|
|
9
|
+
timeoutMs: 5000,
|
|
10
|
+
});
|
|
11
|
+
expect(result).toBe("ok");
|
|
12
|
+
});
|
|
13
|
+
it("retries on transient failure then succeeds", async () => {
|
|
14
|
+
let attempt = 0;
|
|
15
|
+
const result = await withRetry(() => {
|
|
16
|
+
attempt++;
|
|
17
|
+
if (attempt < 3)
|
|
18
|
+
throw new Error("ECONNRESET");
|
|
19
|
+
return Promise.resolve("recovered");
|
|
20
|
+
}, { maxRetries: 5, baseDelayMs: 10, maxDelayMs: 50, timeoutMs: 5000 });
|
|
21
|
+
expect(result).toBe("recovered");
|
|
22
|
+
expect(attempt).toBe(3);
|
|
23
|
+
});
|
|
24
|
+
it("throws after max retries", async () => {
|
|
25
|
+
await expect(withRetry(() => {
|
|
26
|
+
throw new Error("always fails");
|
|
27
|
+
}, { maxRetries: 2, baseDelayMs: 10, maxDelayMs: 50, timeoutMs: 5000 })).rejects.toThrow("always fails");
|
|
28
|
+
});
|
|
29
|
+
});
|
|
30
|
+
//# sourceMappingURL=reliability.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reliability.test.js","sourceRoot":"","sources":["../../src/reliability.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAE7C,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC1D,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,EAAE;YACf,UAAU,EAAE,GAAG;YACf,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;QAC1D,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,SAAS,CAC5B,GAAG,EAAE;YACH,OAAO,EAAE,CAAC;YACV,IAAI,OAAO,GAAG,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;YAC/C,OAAO,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACtC,CAAC,EACD,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CACpE,CAAC;QACF,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,MAAM,CACV,SAAS,CACP,GAAG,EAAE;YACH,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,CAAC;QAClC,CAAC,EACD,EAAE,UAAU,EAAE,CAAC,EAAE,WAAW,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CACpE,CACF,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;IACpC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { makeRequest, makeResponse, makeError, parseFrame, } from "./protocol.js";
|
|
3
|
+
describe("RPC protocol", () => {
|
|
4
|
+
it("creates a request frame", () => {
|
|
5
|
+
const req = makeRequest("status", { verbose: true });
|
|
6
|
+
expect(req.type).toBe("req");
|
|
7
|
+
expect(req.method).toBe("status");
|
|
8
|
+
expect(req.params).toEqual({ verbose: true });
|
|
9
|
+
expect(req.id).toBeTruthy();
|
|
10
|
+
});
|
|
11
|
+
it("creates a success response frame", () => {
|
|
12
|
+
const res = makeResponse("req-1", { status: "ok" });
|
|
13
|
+
expect(res.type).toBe("res");
|
|
14
|
+
expect(res.id).toBe("req-1");
|
|
15
|
+
expect(res.ok).toBe(true);
|
|
16
|
+
expect(res.result).toEqual({ status: "ok" });
|
|
17
|
+
});
|
|
18
|
+
it("creates an error response frame", () => {
|
|
19
|
+
const res = makeError("req-1", "something broke");
|
|
20
|
+
expect(res.type).toBe("res");
|
|
21
|
+
expect(res.id).toBe("req-1");
|
|
22
|
+
expect(res.ok).toBe(false);
|
|
23
|
+
expect(res.error).toBe("something broke");
|
|
24
|
+
});
|
|
25
|
+
it("round-trips a request through parseFrame", () => {
|
|
26
|
+
const req = makeRequest("send", { message: "hello" });
|
|
27
|
+
const json = JSON.stringify(req);
|
|
28
|
+
const parsed = parseFrame(json);
|
|
29
|
+
expect(parsed).toEqual(req);
|
|
30
|
+
});
|
|
31
|
+
it("round-trips a response through parseFrame", () => {
|
|
32
|
+
const res = makeResponse("id-1", "ok");
|
|
33
|
+
const json = JSON.stringify(res);
|
|
34
|
+
const parsed = parseFrame(json);
|
|
35
|
+
expect(parsed).toEqual(res);
|
|
36
|
+
});
|
|
37
|
+
it("returns null for invalid JSON", () => {
|
|
38
|
+
expect(parseFrame("not json")).toBeNull();
|
|
39
|
+
});
|
|
40
|
+
it("returns null for non-object JSON", () => {
|
|
41
|
+
expect(parseFrame('"hello"')).toBeNull();
|
|
42
|
+
});
|
|
43
|
+
it("returns null for missing type field", () => {
|
|
44
|
+
expect(parseFrame('{"id":"1","method":"foo"}')).toBeNull();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
//# sourceMappingURL=protocol.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.test.js","sourceRoot":"","sources":["../../../src/rpc/protocol.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,YAAY,EACZ,SAAS,EACT,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,GAAG,GAAG,SAAS,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC7B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0CAA0C,EAAE,GAAG,EAAE;QAClD,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2CAA2C,EAAE,GAAG,EAAE;QACnD,MAAM,GAAG,GAAG,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjC,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAChC,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,GAAG,EAAE;QACvC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,GAAG,EAAE;QAC1C,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC3C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,UAAU,CAAC,2BAA2B,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
package/dist/src/runner.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import type { FreeTurtleModule } from "./modules/types.js";
|
|
|
3
3
|
import type { Logger } from "./logger.js";
|
|
4
4
|
import type { PolicyConfig } from "./policy.js";
|
|
5
5
|
import { ApprovalManager } from "./approval.js";
|
|
6
|
+
import type { LoadedSkill } from "./skills/types.js";
|
|
6
7
|
export interface TaskConfig {
|
|
7
8
|
name: string;
|
|
8
9
|
prompt: string;
|
|
@@ -19,6 +20,7 @@ export declare class TaskRunner {
|
|
|
19
20
|
private dir;
|
|
20
21
|
private llm;
|
|
21
22
|
private modules;
|
|
23
|
+
private skills;
|
|
22
24
|
private logger;
|
|
23
25
|
private policy?;
|
|
24
26
|
private approvalManager;
|
|
@@ -29,6 +31,7 @@ export declare class TaskRunner {
|
|
|
29
31
|
constructor(dir: string, llm: LLMClient, modules: FreeTurtleModule[], logger: Logger, options?: {
|
|
30
32
|
policy?: PolicyConfig;
|
|
31
33
|
onApprovalNeeded?: ApprovalNotifier;
|
|
34
|
+
skills?: LoadedSkill[];
|
|
32
35
|
});
|
|
33
36
|
runTask(task: TaskConfig): Promise<TaskResult>;
|
|
34
37
|
runMessage(message: string, channel: string, images?: import("./channels/types.js").MessageImage[]): Promise<string>;
|
package/dist/src/runner.js
CHANGED
|
@@ -7,10 +7,12 @@ import { PolicyDeniedError, requiresApproval } from "./policy.js";
|
|
|
7
7
|
import { ApprovalManager } from "./approval.js";
|
|
8
8
|
import { AuditLogger } from "./audit.js";
|
|
9
9
|
import { redact } from "./redaction.js";
|
|
10
|
+
import { buildSkillsPrompt } from "./skills/index.js";
|
|
10
11
|
export class TaskRunner {
|
|
11
12
|
dir;
|
|
12
13
|
llm;
|
|
13
14
|
modules;
|
|
15
|
+
skills;
|
|
14
16
|
logger;
|
|
15
17
|
policy;
|
|
16
18
|
approvalManager;
|
|
@@ -22,6 +24,7 @@ export class TaskRunner {
|
|
|
22
24
|
this.dir = dir;
|
|
23
25
|
this.llm = llm;
|
|
24
26
|
this.modules = modules;
|
|
27
|
+
this.skills = options?.skills ?? [];
|
|
25
28
|
this.logger = logger;
|
|
26
29
|
this.policy = options?.policy;
|
|
27
30
|
this.approvalManager = new ApprovalManager(dir);
|
|
@@ -162,7 +165,16 @@ export class TaskRunner {
|
|
|
162
165
|
if (heartbeatChecklist) {
|
|
163
166
|
parts.push("### Heartbeat Checklist\n" + heartbeatChecklist + "\n");
|
|
164
167
|
}
|
|
165
|
-
|
|
168
|
+
// Inject Agent Skills index (OpenClaw / ClawHub / Claude Code compatible)
|
|
169
|
+
// Progressive disclosure: only name/description/location go into the prompt.
|
|
170
|
+
// The LLM reads the full SKILL.md via read_file when a skill matches.
|
|
171
|
+
if (this.skills.length > 0) {
|
|
172
|
+
const skillsPrompt = buildSkillsPrompt(this.skills);
|
|
173
|
+
if (skillsPrompt) {
|
|
174
|
+
parts.push(skillsPrompt + "\n");
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
parts.push("---\n", "## Instructions\n", "- You are an autonomous AI CEO. You act on behalf of the project described in your identity.", "- When you post, match the voice and style described in your identity.", "- Log important actions and observations.", "- If you are unsure about something, say so rather than guessing.", `- The current date and time is: ${new Date().toISOString()}`, "", "## Self-Modification", "- You can read and modify your own files using read_file, write_file, edit_file, and list_files.", "- Your identity is in soul.md — you can update your voice, goals, knowledge, and values.", "- Your configuration is in config.md — you can change cron schedules, enable/disable modules and channels.", "- Your memory is in workspace/memory/ — you can write persistent notes, logs, and data.", "- Changes to soul.md, config.md, and .env require founder approval. Memory writes do not.", "- When the founder asks you to change your behavior, update the relevant file so the change persists.", "- Config changes (cron, modules, channels) take effect on next restart.", "", "## Task Workflow", "- To create a task: call create_task with the details the founder provides. If a required parameter is missing, ask the founder before calling.", "- After a task is created, tell the founder the submission instructions: contributors email with the keyword in the subject and their ETH wallet address in the body.", "- Contributors submit via EMAIL only — they do NOT interact with the blockchain.", "- To review and pay out a task: call review_task_submissions, then search Gmail for the keyword, evaluate submissions, then YOU call submit_on_behalf_of(task_id, winner_wallet_address) to record the submission onchain, then YOU call approve_task_submission(task_id, submission_index) to release payment.", "- NEVER tell contributors to submit onchain or call any contract function. You handle ALL onchain operations on their behalf.", "", "## Tool Call Style", "- When a first-class tool exists for an action, use the tool directly instead of asking the founder to do it manually.", "- Do not narrate routine tool calls — just call the tool.", "- NEVER say you 'cannot run commands', 'don't have shell access', or 'need system access'. You DO have these tools. Use them.", "", "## Shell Access", "- You have a run_command tool that executes shell commands on the server.", "- Use it to install packages (npm install, pip install, apt install), run scripts, check system status, or any CLI operation.", "- run_command requires founder approval before executing — the founder will be asked to confirm.", "- For long-running commands, set background=true and use manage_process to check on them.", "- When the founder asks you to install something, call run_command immediately. Do not explain how to install it — just do it.");
|
|
166
178
|
return parts.join("\n");
|
|
167
179
|
}
|
|
168
180
|
collectTools() {
|
package/dist/src/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/skills/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7F,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill loader — discovers and loads Agent Skills from the filesystem.
|
|
3
|
+
*
|
|
4
|
+
* Follows the same progressive disclosure model as OpenClaw:
|
|
5
|
+
* - Only name/description/location are injected into the system prompt
|
|
6
|
+
* - Full SKILL.md body is loaded on-demand via the read_file tool
|
|
7
|
+
* - XML format for the available_skills block
|
|
8
|
+
*
|
|
9
|
+
* Scan order (highest to lowest precedence):
|
|
10
|
+
* 1. Workspace skills: <workspace>/skills/
|
|
11
|
+
* 2. Managed skills: ~/.freeturtle/skills/ (shared across agents)
|
|
12
|
+
* 3. Extra dirs: Configured via skills.extra_dirs in config.md
|
|
13
|
+
*
|
|
14
|
+
* Compatible with OpenClaw, Claude Code, and ClawHub-installed skills.
|
|
15
|
+
* Skills installed via `clawhub install` into <workspace>/skills/ are picked up automatically.
|
|
16
|
+
*/
|
|
17
|
+
import type { LoadedSkill, SkillsConfig } from "./types.js";
|
|
18
|
+
import type { Logger } from "../logger.js";
|
|
19
|
+
export declare function loadSkills(workspaceDir: string, config?: SkillsConfig, logger?: Logger): Promise<LoadedSkill[]>;
|
|
20
|
+
/**
|
|
21
|
+
* Build the skills section for the system prompt.
|
|
22
|
+
*
|
|
23
|
+
* Uses the same progressive disclosure model as OpenClaw:
|
|
24
|
+
* - Only name/description/location are injected (not the full body)
|
|
25
|
+
* - The LLM reads the full SKILL.md via read_file when a skill matches
|
|
26
|
+
* - XML format for the available_skills block
|
|
27
|
+
* - Token budget enforcement via character limits
|
|
28
|
+
*/
|
|
29
|
+
export declare function buildSkillsPrompt(skills: LoadedSkill[]): string;
|
|
30
|
+
/** @deprecated Use buildSkillsPrompt instead */
|
|
31
|
+
export declare function buildSkillIndex(skills: LoadedSkill[]): string;
|
|
32
|
+
/** @deprecated Skills are now loaded on-demand via read_file */
|
|
33
|
+
export declare function getSkillPrompt(skill: LoadedSkill): string;
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill loader — discovers and loads Agent Skills from the filesystem.
|
|
3
|
+
*
|
|
4
|
+
* Follows the same progressive disclosure model as OpenClaw:
|
|
5
|
+
* - Only name/description/location are injected into the system prompt
|
|
6
|
+
* - Full SKILL.md body is loaded on-demand via the read_file tool
|
|
7
|
+
* - XML format for the available_skills block
|
|
8
|
+
*
|
|
9
|
+
* Scan order (highest to lowest precedence):
|
|
10
|
+
* 1. Workspace skills: <workspace>/skills/
|
|
11
|
+
* 2. Managed skills: ~/.freeturtle/skills/ (shared across agents)
|
|
12
|
+
* 3. Extra dirs: Configured via skills.extra_dirs in config.md
|
|
13
|
+
*
|
|
14
|
+
* Compatible with OpenClaw, Claude Code, and ClawHub-installed skills.
|
|
15
|
+
* Skills installed via `clawhub install` into <workspace>/skills/ are picked up automatically.
|
|
16
|
+
*/
|
|
17
|
+
import { readdir, readFile, stat } from "node:fs/promises";
|
|
18
|
+
import { join, basename } from "node:path";
|
|
19
|
+
import { homedir } from "node:os";
|
|
20
|
+
import { parseSkillMd } from "./parser.js";
|
|
21
|
+
const SKILL_FILENAME = "SKILL.md";
|
|
22
|
+
// Limits aligned with OpenClaw defaults
|
|
23
|
+
const MAX_SKILLS_IN_PROMPT = 150;
|
|
24
|
+
const MAX_PROMPT_CHARS = 30_000;
|
|
25
|
+
const MAX_SKILL_FILE_BYTES = 256 * 1024; // 256 KB
|
|
26
|
+
const MAX_SKILLS_PER_SOURCE = 200;
|
|
27
|
+
export async function loadSkills(workspaceDir, config, logger) {
|
|
28
|
+
if (config && !config.enabled) {
|
|
29
|
+
logger?.info("Skills disabled in config");
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
const skills = [];
|
|
33
|
+
const seenNames = new Set();
|
|
34
|
+
// 1. Workspace skills (highest precedence)
|
|
35
|
+
const workspaceSkillsDir = join(workspaceDir, "skills");
|
|
36
|
+
await scanSkillDir(workspaceSkillsDir, "workspace", skills, seenNames, logger);
|
|
37
|
+
// 2. Managed skills (shared across agents)
|
|
38
|
+
const managedDir = join(homedir(), ".freeturtle", "skills");
|
|
39
|
+
if (managedDir !== workspaceSkillsDir) {
|
|
40
|
+
await scanSkillDir(managedDir, "managed", skills, seenNames, logger);
|
|
41
|
+
}
|
|
42
|
+
// 3. Extra directories from config
|
|
43
|
+
if (config?.extra_dirs) {
|
|
44
|
+
for (const dir of config.extra_dirs) {
|
|
45
|
+
await scanSkillDir(dir, "extra", skills, seenNames, logger);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (skills.length > 0) {
|
|
49
|
+
logger?.info(`Loaded ${skills.length} skill(s): ${skills.map((s) => s.name).join(", ")}`);
|
|
50
|
+
}
|
|
51
|
+
return skills;
|
|
52
|
+
}
|
|
53
|
+
async function scanSkillDir(dir, source, skills, seenNames, logger) {
|
|
54
|
+
let entries;
|
|
55
|
+
try {
|
|
56
|
+
entries = await readdir(dir);
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// Directory doesn't exist — that's fine
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
let loadedFromSource = 0;
|
|
63
|
+
for (const entry of entries) {
|
|
64
|
+
if (loadedFromSource >= MAX_SKILLS_PER_SOURCE) {
|
|
65
|
+
logger?.warn(`Hit max skills per source (${MAX_SKILLS_PER_SOURCE}) for ${dir}`);
|
|
66
|
+
break;
|
|
67
|
+
}
|
|
68
|
+
const skillDir = join(dir, entry);
|
|
69
|
+
// Must be a directory
|
|
70
|
+
try {
|
|
71
|
+
const s = await stat(skillDir);
|
|
72
|
+
if (!s.isDirectory())
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
continue;
|
|
77
|
+
}
|
|
78
|
+
// Must contain SKILL.md
|
|
79
|
+
const skillMdPath = join(skillDir, SKILL_FILENAME);
|
|
80
|
+
let raw;
|
|
81
|
+
try {
|
|
82
|
+
const s = await stat(skillMdPath);
|
|
83
|
+
if (s.size > MAX_SKILL_FILE_BYTES) {
|
|
84
|
+
logger?.warn(`SKILL.md in ${skillDir} exceeds ${MAX_SKILL_FILE_BYTES / 1024}KB — skipping`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
raw = await readFile(skillMdPath, "utf-8");
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
// Parse the SKILL.md
|
|
93
|
+
const parsed = parseSkillMd(raw);
|
|
94
|
+
if (!parsed) {
|
|
95
|
+
logger?.warn(`Invalid SKILL.md in ${skillDir} — skipping`);
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
// Skill name: frontmatter.name or directory name
|
|
99
|
+
const name = parsed.frontmatter.name || basename(skillDir);
|
|
100
|
+
// Validate name format (Agent Skills spec: lowercase alphanumeric + hyphens)
|
|
101
|
+
if (!/^[a-z0-9][a-z0-9-]*[a-z0-9]$|^[a-z0-9]$/.test(name)) {
|
|
102
|
+
logger?.warn(`Skill "${name}" has invalid name format — skipping`);
|
|
103
|
+
continue;
|
|
104
|
+
}
|
|
105
|
+
// Higher-precedence skills shadow lower ones
|
|
106
|
+
if (seenNames.has(name)) {
|
|
107
|
+
logger?.info(`Skill "${name}" from ${source} shadowed by higher-precedence source`);
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
seenNames.add(name);
|
|
111
|
+
const allowedToolsRaw = parsed.frontmatter["allowed-tools"];
|
|
112
|
+
const allowedTools = allowedToolsRaw
|
|
113
|
+
? allowedToolsRaw.split(/\s+/).filter((t) => t.length > 0)
|
|
114
|
+
: [];
|
|
115
|
+
skills.push({
|
|
116
|
+
name,
|
|
117
|
+
description: parsed.frontmatter.description || "",
|
|
118
|
+
body: parsed.body,
|
|
119
|
+
frontmatter: parsed.frontmatter,
|
|
120
|
+
dir: skillDir,
|
|
121
|
+
source,
|
|
122
|
+
modelInvocable: parsed.frontmatter["disable-model-invocation"] !== true,
|
|
123
|
+
userInvocable: parsed.frontmatter["user-invocable"] !== false,
|
|
124
|
+
allowedTools,
|
|
125
|
+
});
|
|
126
|
+
loadedFromSource++;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Compact a file path by replacing the home directory with ~.
|
|
131
|
+
* Saves tokens in the system prompt (same as OpenClaw).
|
|
132
|
+
*/
|
|
133
|
+
function compactPath(p) {
|
|
134
|
+
const home = homedir();
|
|
135
|
+
if (p.startsWith(home)) {
|
|
136
|
+
return "~" + p.slice(home.length);
|
|
137
|
+
}
|
|
138
|
+
return p;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Build the skills section for the system prompt.
|
|
142
|
+
*
|
|
143
|
+
* Uses the same progressive disclosure model as OpenClaw:
|
|
144
|
+
* - Only name/description/location are injected (not the full body)
|
|
145
|
+
* - The LLM reads the full SKILL.md via read_file when a skill matches
|
|
146
|
+
* - XML format for the available_skills block
|
|
147
|
+
* - Token budget enforcement via character limits
|
|
148
|
+
*/
|
|
149
|
+
export function buildSkillsPrompt(skills) {
|
|
150
|
+
const eligible = skills.filter((s) => s.modelInvocable);
|
|
151
|
+
if (eligible.length === 0)
|
|
152
|
+
return "";
|
|
153
|
+
// Apply limits: max skills in prompt
|
|
154
|
+
const capped = eligible.slice(0, MAX_SKILLS_IN_PROMPT);
|
|
155
|
+
const header = [
|
|
156
|
+
"## Skills (mandatory)",
|
|
157
|
+
"",
|
|
158
|
+
"Before replying, scan the <available_skills> descriptions below.",
|
|
159
|
+
"- If exactly one skill clearly applies: read its SKILL.md at the given location with `read_file`, then follow its instructions.",
|
|
160
|
+
"- If multiple could apply: choose the most specific one, then read and follow it.",
|
|
161
|
+
"- If none clearly apply: do not read any SKILL.md.",
|
|
162
|
+
"- Never read more than one skill up front; only read after selecting.",
|
|
163
|
+
"- When a skill file references a relative path, resolve it against the skill directory (parent of SKILL.md).",
|
|
164
|
+
"",
|
|
165
|
+
].join("\n");
|
|
166
|
+
// Build XML block, enforcing character budget
|
|
167
|
+
const xmlOpen = "<available_skills>\n";
|
|
168
|
+
const xmlClose = "</available_skills>";
|
|
169
|
+
let promptChars = header.length + xmlOpen.length + xmlClose.length;
|
|
170
|
+
const skillEntries = [];
|
|
171
|
+
for (const skill of capped) {
|
|
172
|
+
const location = compactPath(join(skill.dir, SKILL_FILENAME));
|
|
173
|
+
const entry = [
|
|
174
|
+
" <skill>",
|
|
175
|
+
` <name>${escapeXml(skill.name)}</name>`,
|
|
176
|
+
` <description>${escapeXml(skill.description)}</description>`,
|
|
177
|
+
` <location>${escapeXml(location)}</location>`,
|
|
178
|
+
" </skill>",
|
|
179
|
+
].join("\n");
|
|
180
|
+
if (promptChars + entry.length + 1 > MAX_PROMPT_CHARS) {
|
|
181
|
+
break;
|
|
182
|
+
}
|
|
183
|
+
skillEntries.push(entry);
|
|
184
|
+
promptChars += entry.length + 1; // +1 for newline
|
|
185
|
+
}
|
|
186
|
+
if (skillEntries.length === 0)
|
|
187
|
+
return "";
|
|
188
|
+
return header + xmlOpen + skillEntries.join("\n") + "\n" + xmlClose;
|
|
189
|
+
}
|
|
190
|
+
function escapeXml(s) {
|
|
191
|
+
return s
|
|
192
|
+
.replace(/&/g, "&")
|
|
193
|
+
.replace(/</g, "<")
|
|
194
|
+
.replace(/>/g, ">")
|
|
195
|
+
.replace(/"/g, """);
|
|
196
|
+
}
|
|
197
|
+
// --- Deprecated, kept for backward compat ---
|
|
198
|
+
/** @deprecated Use buildSkillsPrompt instead */
|
|
199
|
+
export function buildSkillIndex(skills) {
|
|
200
|
+
return buildSkillsPrompt(skills);
|
|
201
|
+
}
|
|
202
|
+
/** @deprecated Skills are now loaded on-demand via read_file */
|
|
203
|
+
export function getSkillPrompt(skill) {
|
|
204
|
+
const parts = [`## Skill: ${skill.name}`, ""];
|
|
205
|
+
if (skill.frontmatter.compatibility) {
|
|
206
|
+
parts.push(`Compatibility: ${skill.frontmatter.compatibility}`, "");
|
|
207
|
+
}
|
|
208
|
+
parts.push(skill.body);
|
|
209
|
+
return parts.join("\n");
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../../../src/skills/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SKILL.md frontmatter parser.
|
|
3
|
+
* Parses YAML frontmatter between --- markers without external dependencies.
|
|
4
|
+
*/
|
|
5
|
+
import type { SkillFrontmatter } from "./types.js";
|
|
6
|
+
/**
|
|
7
|
+
* Parse a SKILL.md file into frontmatter + body.
|
|
8
|
+
* Returns null if the file doesn't have valid frontmatter.
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseSkillMd(raw: string): {
|
|
11
|
+
frontmatter: SkillFrontmatter;
|
|
12
|
+
body: string;
|
|
13
|
+
} | null;
|