skillscript-runtime 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 (132) hide show
  1. package/ARCHITECTURE.md +70 -0
  2. package/LICENSE +21 -0
  3. package/README.md +346 -0
  4. package/dist/audit.d.ts +33 -0
  5. package/dist/audit.d.ts.map +1 -0
  6. package/dist/audit.js +76 -0
  7. package/dist/audit.js.map +1 -0
  8. package/dist/bootstrap.d.ts +69 -0
  9. package/dist/bootstrap.d.ts.map +1 -0
  10. package/dist/bootstrap.js +117 -0
  11. package/dist/bootstrap.js.map +1 -0
  12. package/dist/cli.d.ts +3 -0
  13. package/dist/cli.d.ts.map +1 -0
  14. package/dist/cli.js +805 -0
  15. package/dist/cli.js.map +1 -0
  16. package/dist/compile.d.ts +88 -0
  17. package/dist/compile.d.ts.map +1 -0
  18. package/dist/compile.js +544 -0
  19. package/dist/compile.js.map +1 -0
  20. package/dist/connectors/agent-noop.d.ts +23 -0
  21. package/dist/connectors/agent-noop.d.ts.map +1 -0
  22. package/dist/connectors/agent-noop.js +43 -0
  23. package/dist/connectors/agent-noop.js.map +1 -0
  24. package/dist/connectors/agent.d.ts +54 -0
  25. package/dist/connectors/agent.d.ts.map +1 -0
  26. package/dist/connectors/agent.js +21 -0
  27. package/dist/connectors/agent.js.map +1 -0
  28. package/dist/connectors/index.d.ts +13 -0
  29. package/dist/connectors/index.d.ts.map +1 -0
  30. package/dist/connectors/index.js +17 -0
  31. package/dist/connectors/index.js.map +1 -0
  32. package/dist/connectors/local-model.d.ts +41 -0
  33. package/dist/connectors/local-model.d.ts.map +1 -0
  34. package/dist/connectors/local-model.js +106 -0
  35. package/dist/connectors/local-model.js.map +1 -0
  36. package/dist/connectors/mcp.d.ts +22 -0
  37. package/dist/connectors/mcp.d.ts.map +1 -0
  38. package/dist/connectors/mcp.js +31 -0
  39. package/dist/connectors/mcp.js.map +1 -0
  40. package/dist/connectors/memory-store.d.ts +53 -0
  41. package/dist/connectors/memory-store.d.ts.map +1 -0
  42. package/dist/connectors/memory-store.js +169 -0
  43. package/dist/connectors/memory-store.js.map +1 -0
  44. package/dist/connectors/registry.d.ts +74 -0
  45. package/dist/connectors/registry.d.ts.map +1 -0
  46. package/dist/connectors/registry.js +127 -0
  47. package/dist/connectors/registry.js.map +1 -0
  48. package/dist/connectors/skill-store.d.ts +38 -0
  49. package/dist/connectors/skill-store.d.ts.map +1 -0
  50. package/dist/connectors/skill-store.js +314 -0
  51. package/dist/connectors/skill-store.js.map +1 -0
  52. package/dist/connectors/types.d.ts +188 -0
  53. package/dist/connectors/types.d.ts.map +1 -0
  54. package/dist/connectors/types.js +35 -0
  55. package/dist/connectors/types.js.map +1 -0
  56. package/dist/dashboard/server.d.ts +40 -0
  57. package/dist/dashboard/server.d.ts.map +1 -0
  58. package/dist/dashboard/server.js +122 -0
  59. package/dist/dashboard/server.js.map +1 -0
  60. package/dist/dashboard/spa/app.js +375 -0
  61. package/dist/dashboard/spa/index.html +26 -0
  62. package/dist/dashboard/spa/styles.css +99 -0
  63. package/dist/errors.d.ts +111 -0
  64. package/dist/errors.d.ts.map +1 -0
  65. package/dist/errors.js +187 -0
  66. package/dist/errors.js.map +1 -0
  67. package/dist/filters.d.ts +17 -0
  68. package/dist/filters.d.ts.map +1 -0
  69. package/dist/filters.js +40 -0
  70. package/dist/filters.js.map +1 -0
  71. package/dist/index.d.ts +41 -0
  72. package/dist/index.d.ts.map +1 -0
  73. package/dist/index.js +33 -0
  74. package/dist/index.js.map +1 -0
  75. package/dist/lint.d.ts +97 -0
  76. package/dist/lint.d.ts.map +1 -0
  77. package/dist/lint.js +990 -0
  78. package/dist/lint.js.map +1 -0
  79. package/dist/mcp-server.d.ts +93 -0
  80. package/dist/mcp-server.d.ts.map +1 -0
  81. package/dist/mcp-server.js +505 -0
  82. package/dist/mcp-server.js.map +1 -0
  83. package/dist/metrics.d.ts +51 -0
  84. package/dist/metrics.d.ts.map +1 -0
  85. package/dist/metrics.js +107 -0
  86. package/dist/metrics.js.map +1 -0
  87. package/dist/parser.d.ts +160 -0
  88. package/dist/parser.d.ts.map +1 -0
  89. package/dist/parser.js +991 -0
  90. package/dist/parser.js.map +1 -0
  91. package/dist/provenance.d.ts +43 -0
  92. package/dist/provenance.d.ts.map +1 -0
  93. package/dist/provenance.js +58 -0
  94. package/dist/provenance.js.map +1 -0
  95. package/dist/runtime.d.ts +145 -0
  96. package/dist/runtime.d.ts.map +1 -0
  97. package/dist/runtime.js +1071 -0
  98. package/dist/runtime.js.map +1 -0
  99. package/dist/scheduler.d.ts +121 -0
  100. package/dist/scheduler.d.ts.map +1 -0
  101. package/dist/scheduler.js +271 -0
  102. package/dist/scheduler.js.map +1 -0
  103. package/dist/skill-manager.d.ts +121 -0
  104. package/dist/skill-manager.d.ts.map +1 -0
  105. package/dist/skill-manager.js +251 -0
  106. package/dist/skill-manager.js.map +1 -0
  107. package/dist/testing/conformance.d.ts +57 -0
  108. package/dist/testing/conformance.d.ts.map +1 -0
  109. package/dist/testing/conformance.js +365 -0
  110. package/dist/testing/conformance.js.map +1 -0
  111. package/dist/testing/index.d.ts +3 -0
  112. package/dist/testing/index.d.ts.map +1 -0
  113. package/dist/testing/index.js +5 -0
  114. package/dist/testing/index.js.map +1 -0
  115. package/dist/trace.d.ts +141 -0
  116. package/dist/trace.d.ts.map +1 -0
  117. package/dist/trace.js +226 -0
  118. package/dist/trace.js.map +1 -0
  119. package/examples/README.md +56 -0
  120. package/examples/classify-support-ticket.skill.md +30 -0
  121. package/examples/cut-release-tag.skill.md +40 -0
  122. package/examples/doc-qa-with-citations.skill.md +12 -0
  123. package/examples/feedback-sentiment-scan.skill.md +29 -0
  124. package/examples/hello.skill.md +9 -0
  125. package/examples/hello.skill.provenance.json +10 -0
  126. package/examples/morning-brief.skill.md +24 -0
  127. package/examples/programmatic-trace-demo.mjs +89 -0
  128. package/examples/service-health-watch.skill.md +18 -0
  129. package/package.json +100 -0
  130. package/scaffold/config.toml +35 -0
  131. package/scaffold/connectors.json +19 -0
  132. package/scaffold/examples/hello.skill.md +9 -0
@@ -0,0 +1,74 @@
1
+ import type { SkillStore, SkillStoreClass, MemoryStore, MemoryStoreClass, LocalModel, LocalModelClass, McpConnector, McpConnectorClass, StaticCapabilities } from "./types.js";
2
+ import type { AgentConnector, AgentConnectorClass } from "./agent.js";
3
+ export declare class Registry {
4
+ private skillStores;
5
+ private memoryStores;
6
+ private localModels;
7
+ private mcpConnectors;
8
+ private agentConnectors;
9
+ registerSkillStore(name: string, instance: SkillStore): void;
10
+ registerMemoryStore(name: string, instance: MemoryStore): void;
11
+ registerLocalModel(name: string, instance: LocalModel): void;
12
+ registerMcpConnector(name: string, instance: McpConnector): void;
13
+ registerAgentConnector(name: string, instance: AgentConnector): void;
14
+ getSkillStore(name?: string): SkillStore;
15
+ getMemoryStore(name?: string): MemoryStore;
16
+ getLocalModel(name?: string): LocalModel;
17
+ getMcpConnector(name?: string): McpConnector;
18
+ /**
19
+ * Returns the registered AgentConnector or a transparent `NoOpAgentConnector`
20
+ * when none is wired. Unlike the other `get*` methods, this never throws —
21
+ * the no-op fallback lets `# Output: prompt-context:` dispatch resolve
22
+ * cleanly in test/dev environments without an explicit substrate setup.
23
+ * Adopters wire a real impl for production via `registerAgentConnector`.
24
+ */
25
+ getAgentConnector(name?: string): AgentConnector;
26
+ getSkillStoreClass(name?: string): SkillStoreClass;
27
+ getMemoryStoreClass(name?: string): MemoryStoreClass;
28
+ getLocalModelClass(name?: string): LocalModelClass;
29
+ getMcpConnectorClass(name?: string): McpConnectorClass;
30
+ getAgentConnectorClass(name?: string): AgentConnectorClass;
31
+ listSkillStoreClasses(): SkillStoreClass[];
32
+ listMemoryStoreClasses(): MemoryStoreClass[];
33
+ listLocalModelClasses(): LocalModelClass[];
34
+ listMcpConnectorClasses(): McpConnectorClass[];
35
+ listAgentConnectorClasses(): AgentConnectorClass[];
36
+ listSkillStores(): Array<{
37
+ name: string;
38
+ instance: SkillStore;
39
+ ctor: SkillStoreClass;
40
+ }>;
41
+ listMemoryStores(): Array<{
42
+ name: string;
43
+ instance: MemoryStore;
44
+ ctor: MemoryStoreClass;
45
+ }>;
46
+ listLocalModels(): Array<{
47
+ name: string;
48
+ instance: LocalModel;
49
+ ctor: LocalModelClass;
50
+ }>;
51
+ listMcpConnectors(): Array<{
52
+ name: string;
53
+ instance: McpConnector;
54
+ ctor: McpConnectorClass;
55
+ }>;
56
+ listAgentConnectors(): Array<{
57
+ name: string;
58
+ instance: AgentConnector;
59
+ ctor: AgentConnectorClass;
60
+ }>;
61
+ /**
62
+ * Static capabilities for every registered connector class, deduplicated
63
+ * by class identity. The linter's primary input — it builds the combined
64
+ * feature set from this and validates skill `# Requires:` clauses
65
+ * without ever calling `manifest()` or constructing additional instances.
66
+ */
67
+ getAllStaticCapabilities(): StaticCapabilities[];
68
+ hasSkillStore(name?: string): boolean;
69
+ hasMemoryStore(name?: string): boolean;
70
+ hasLocalModel(name?: string): boolean;
71
+ hasMcpConnector(name?: string): boolean;
72
+ hasAgentConnector(name?: string): boolean;
73
+ }
74
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,eAAe,EACf,WAAW,EACX,gBAAgB,EAChB,UAAU,EACV,eAAe,EACf,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA4BtE,qBAAa,QAAQ;IACnB,OAAO,CAAC,WAAW,CAAyD;IAC5E,OAAO,CAAC,YAAY,CAA2D;IAC/E,OAAO,CAAC,WAAW,CAAyD;IAC5E,OAAO,CAAC,aAAa,CAA6D;IAClF,OAAO,CAAC,eAAe,CAAiE;IAIxF,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI;IAI5D,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,IAAI;IAI9D,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,UAAU,GAAG,IAAI;IAI5D,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI;IAIhE,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,IAAI;IAMpE,aAAa,CAAC,IAAI,SAAY,GAAG,UAAU;IAG3C,cAAc,CAAC,IAAI,SAAY,GAAG,WAAW;IAG7C,aAAa,CAAC,IAAI,SAAY,GAAG,UAAU;IAG3C,eAAe,CAAC,IAAI,SAAY,GAAG,YAAY;IAG/C;;;;;;OAMG;IACH,iBAAiB,CAAC,IAAI,SAAY,GAAG,cAAc;IAQnD,kBAAkB,CAAC,IAAI,SAAY,GAAG,eAAe;IAGrD,mBAAmB,CAAC,IAAI,SAAY,GAAG,gBAAgB;IAGvD,kBAAkB,CAAC,IAAI,SAAY,GAAG,eAAe;IAGrD,oBAAoB,CAAC,IAAI,SAAY,GAAG,iBAAiB;IAGzD,sBAAsB,CAAC,IAAI,SAAY,GAAG,mBAAmB;IAQ7D,qBAAqB,IAAI,eAAe,EAAE;IAC1C,sBAAsB,IAAI,gBAAgB,EAAE;IAC5C,qBAAqB,IAAI,eAAe,EAAE;IAC1C,uBAAuB,IAAI,iBAAiB,EAAE;IAC9C,yBAAyB,IAAI,mBAAmB,EAAE;IAOlD,eAAe,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC;IACvF,gBAAgB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAA;KAAE,CAAC;IAC1F,eAAe,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,UAAU,CAAC;QAAC,IAAI,EAAE,eAAe,CAAA;KAAE,CAAC;IACvF,iBAAiB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,iBAAiB,CAAA;KAAE,CAAC;IAC7F,mBAAmB,IAAI,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,cAAc,CAAC;QAAC,IAAI,EAAE,mBAAmB,CAAA;KAAE,CAAC;IAInG;;;;;OAKG;IACH,wBAAwB,IAAI,kBAAkB,EAAE;IAYhD,aAAa,CAAC,IAAI,SAAY,GAAG,OAAO;IACxC,cAAc,CAAC,IAAI,SAAY,GAAG,OAAO;IACzC,aAAa,CAAC,IAAI,SAAY,GAAG,OAAO;IACxC,eAAe,CAAC,IAAI,SAAY,GAAG,OAAO;IAC1C,iBAAiB,CAAC,IAAI,SAAY,GAAG,OAAO;CAC7C"}
@@ -0,0 +1,127 @@
1
+ import { NoOpAgentConnector } from "./agent-noop.js";
2
+ export class Registry {
3
+ skillStores = new Map();
4
+ memoryStores = new Map();
5
+ localModels = new Map();
6
+ mcpConnectors = new Map();
7
+ agentConnectors = new Map();
8
+ // ─── Register ───────────────────────────────────────────────────────────
9
+ registerSkillStore(name, instance) {
10
+ this.skillStores.set(name, { instance, ctor: ctorOf(instance) });
11
+ }
12
+ registerMemoryStore(name, instance) {
13
+ this.memoryStores.set(name, { instance, ctor: ctorOf(instance) });
14
+ }
15
+ registerLocalModel(name, instance) {
16
+ this.localModels.set(name, { instance, ctor: ctorOf(instance) });
17
+ }
18
+ registerMcpConnector(name, instance) {
19
+ this.mcpConnectors.set(name, { instance, ctor: ctorOf(instance) });
20
+ }
21
+ registerAgentConnector(name, instance) {
22
+ this.agentConnectors.set(name, { instance, ctor: ctorOf(instance) });
23
+ }
24
+ // ─── Get instance (runtime dispatch) ────────────────────────────────────
25
+ getSkillStore(name = "primary") {
26
+ return must(this.skillStores, name, "SkillStore").instance;
27
+ }
28
+ getMemoryStore(name = "primary") {
29
+ return must(this.memoryStores, name, "MemoryStore").instance;
30
+ }
31
+ getLocalModel(name = "default") {
32
+ return must(this.localModels, name, "LocalModel").instance;
33
+ }
34
+ getMcpConnector(name = "primary") {
35
+ return must(this.mcpConnectors, name, "McpConnector").instance;
36
+ }
37
+ /**
38
+ * Returns the registered AgentConnector or a transparent `NoOpAgentConnector`
39
+ * when none is wired. Unlike the other `get*` methods, this never throws —
40
+ * the no-op fallback lets `# Output: prompt-context:` dispatch resolve
41
+ * cleanly in test/dev environments without an explicit substrate setup.
42
+ * Adopters wire a real impl for production via `registerAgentConnector`.
43
+ */
44
+ getAgentConnector(name = "primary") {
45
+ const entry = this.agentConnectors.get(name);
46
+ if (entry !== undefined)
47
+ return entry.instance;
48
+ return DEFAULT_AGENT_CONNECTOR;
49
+ }
50
+ // ─── Get class (linter offline lookup) ──────────────────────────────────
51
+ getSkillStoreClass(name = "primary") {
52
+ return must(this.skillStores, name, "SkillStore").ctor;
53
+ }
54
+ getMemoryStoreClass(name = "primary") {
55
+ return must(this.memoryStores, name, "MemoryStore").ctor;
56
+ }
57
+ getLocalModelClass(name = "default") {
58
+ return must(this.localModels, name, "LocalModel").ctor;
59
+ }
60
+ getMcpConnectorClass(name = "primary") {
61
+ return must(this.mcpConnectors, name, "McpConnector").ctor;
62
+ }
63
+ getAgentConnectorClass(name = "primary") {
64
+ const entry = this.agentConnectors.get(name);
65
+ if (entry !== undefined)
66
+ return entry.ctor;
67
+ return NoOpAgentConnector;
68
+ }
69
+ // ─── List distinct classes per kind ─────────────────────────────────────
70
+ listSkillStoreClasses() { return distinct(this.skillStores); }
71
+ listMemoryStoreClasses() { return distinct(this.memoryStores); }
72
+ listLocalModelClasses() { return distinct(this.localModels); }
73
+ listMcpConnectorClasses() { return distinct(this.mcpConnectors); }
74
+ listAgentConnectorClasses() { return distinct(this.agentConnectors); }
75
+ // ─── Enumerate registered instances by name ──────────────────────────────
76
+ // Discovery surface for runtime_capabilities (MCP tool, v0.2.1) — pairs
77
+ // the registered name with the per-instance ctor for staticCapabilities()
78
+ // calls. Excludes the implicit NoOp agent-connector fallback.
79
+ listSkillStores() { return entries(this.skillStores); }
80
+ listMemoryStores() { return entries(this.memoryStores); }
81
+ listLocalModels() { return entries(this.localModels); }
82
+ listMcpConnectors() { return entries(this.mcpConnectors); }
83
+ listAgentConnectors() { return entries(this.agentConnectors); }
84
+ // ─── Aggregate view for the linter ──────────────────────────────────────
85
+ /**
86
+ * Static capabilities for every registered connector class, deduplicated
87
+ * by class identity. The linter's primary input — it builds the combined
88
+ * feature set from this and validates skill `# Requires:` clauses
89
+ * without ever calling `manifest()` or constructing additional instances.
90
+ */
91
+ getAllStaticCapabilities() {
92
+ return [
93
+ ...this.listSkillStoreClasses().map((c) => c.staticCapabilities()),
94
+ ...this.listMemoryStoreClasses().map((c) => c.staticCapabilities()),
95
+ ...this.listLocalModelClasses().map((c) => c.staticCapabilities()),
96
+ ...this.listMcpConnectorClasses().map((c) => c.staticCapabilities()),
97
+ ...this.listAgentConnectorClasses().map((c) => c.staticCapabilities()),
98
+ ];
99
+ }
100
+ // ─── Existence checks ───────────────────────────────────────────────────
101
+ hasSkillStore(name = "primary") { return this.skillStores.has(name); }
102
+ hasMemoryStore(name = "primary") { return this.memoryStores.has(name); }
103
+ hasLocalModel(name = "default") { return this.localModels.has(name); }
104
+ hasMcpConnector(name = "primary") { return this.mcpConnectors.has(name); }
105
+ hasAgentConnector(name = "primary") { return this.agentConnectors.has(name); }
106
+ }
107
+ const DEFAULT_AGENT_CONNECTOR = new NoOpAgentConnector();
108
+ function ctorOf(instance) {
109
+ return instance.constructor;
110
+ }
111
+ function must(map, name, kind) {
112
+ const entry = map.get(name);
113
+ if (entry === undefined) {
114
+ throw new Error(`${kind} '${name}' not registered. Registered: ${Array.from(map.keys()).join(", ") || "(none)"}.`);
115
+ }
116
+ return entry;
117
+ }
118
+ function distinct(map) {
119
+ const seen = new Set();
120
+ for (const entry of map.values())
121
+ seen.add(entry.ctor);
122
+ return Array.from(seen);
123
+ }
124
+ function entries(map) {
125
+ return Array.from(map.entries()).map(([name, e]) => ({ name, instance: e.instance, ctor: e.ctor }));
126
+ }
127
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/connectors/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { SkillStore, SkillSource, SkillMeta, SkillStatus, SkillFilter, VersionInfo, StaticCapabilities, ManifestInfo } from "./types.js";
2
+ /**
3
+ * Filesystem-backed SkillStore. Skills live as `*.skill.md` files under a
4
+ * directory. Per-skill version history lives in a sidecar `*.versions.jsonl`
5
+ * (append-only, one JSON object per line).
6
+ *
7
+ * Limitations of the filesystem substrate (acknowledged):
8
+ * - `load(name, version)` cannot return historical bytes — only the current
9
+ * file content is on disk. If `version` is supplied and doesn't match
10
+ * the current file's hash, throws `VersionNotFoundError`. A
11
+ * content-addressed substrate (git-backed, S3, etc.) would preserve
12
+ * bytes per version.
13
+ * - `versions()` reads the `.jsonl` sidecar if present, else synthesizes
14
+ * one entry from the file's mtime (for legacy files written before
15
+ * T2's versioning landed).
16
+ * - `query()` reads every file's headers on each call. Fine for small
17
+ * stores; a larger substrate caches metadata.
18
+ *
19
+ * `version` string format: first 12 chars of `content_hash` — short, stable,
20
+ * shareable. Consumers MUST treat `version` as opaque (equality only).
21
+ */
22
+ export declare class FilesystemSkillStore implements SkillStore {
23
+ private readonly rootDir;
24
+ static staticCapabilities(): StaticCapabilities;
25
+ constructor(rootDir: string);
26
+ manifest(): Promise<ManifestInfo>;
27
+ load(name: string, version?: string): Promise<SkillSource>;
28
+ query(filter?: SkillFilter): Promise<SkillMeta[]>;
29
+ metadata(name: string): Promise<SkillMeta>;
30
+ versions(name: string): Promise<VersionInfo[]>;
31
+ store(name: string, source: string, metadata?: Partial<SkillMeta>): Promise<VersionInfo>;
32
+ delete(name: string): Promise<void>;
33
+ update_status(name: string, status: SkillStatus): Promise<VersionInfo>;
34
+ private pathFor;
35
+ private versionsPathFor;
36
+ private buildMeta;
37
+ }
38
+ //# sourceMappingURL=skill-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-store.d.ts","sourceRoot":"","sources":["../../src/connectors/skill-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,UAAU,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,WAAW,EACX,WAAW,EACX,kBAAkB,EAClB,YAAY,EACb,MAAM,YAAY,CAAC;AAKpB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,oBAAqB,YAAW,UAAU;IAgBzC,OAAO,CAAC,QAAQ,CAAC,OAAO;IAfpC,MAAM,CAAC,kBAAkB,IAAI,kBAAkB;gBAelB,OAAO,EAAE,MAAM;IAEtC,QAAQ,IAAI,OAAO,CAAC,YAAY,CAAC;IAUjC,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IA0B1D,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA0BjD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC;IAa1C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;IAmC9C,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC;IAuBxF,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAenC,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IA4B5E,OAAO,CAAC,OAAO;IAIf,OAAO,CAAC,eAAe;YAIT,SAAS;CAkBxB"}
@@ -0,0 +1,314 @@
1
+ import { readFile, readdir, writeFile, mkdir, stat, unlink, appendFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { createHash } from "node:crypto";
4
+ import { SkillNotFoundError, VersionNotFoundError, StorageConflictError } from "../errors.js";
5
+ const CONTRACT_VERSION = "1.0.0";
6
+ /**
7
+ * Filesystem-backed SkillStore. Skills live as `*.skill.md` files under a
8
+ * directory. Per-skill version history lives in a sidecar `*.versions.jsonl`
9
+ * (append-only, one JSON object per line).
10
+ *
11
+ * Limitations of the filesystem substrate (acknowledged):
12
+ * - `load(name, version)` cannot return historical bytes — only the current
13
+ * file content is on disk. If `version` is supplied and doesn't match
14
+ * the current file's hash, throws `VersionNotFoundError`. A
15
+ * content-addressed substrate (git-backed, S3, etc.) would preserve
16
+ * bytes per version.
17
+ * - `versions()` reads the `.jsonl` sidecar if present, else synthesizes
18
+ * one entry from the file's mtime (for legacy files written before
19
+ * T2's versioning landed).
20
+ * - `query()` reads every file's headers on each call. Fine for small
21
+ * stores; a larger substrate caches metadata.
22
+ *
23
+ * `version` string format: first 12 chars of `content_hash` — short, stable,
24
+ * shareable. Consumers MUST treat `version` as opaque (equality only).
25
+ */
26
+ export class FilesystemSkillStore {
27
+ rootDir;
28
+ static staticCapabilities() {
29
+ return {
30
+ connector_type: "skill_store",
31
+ implementation: "FilesystemSkillStore",
32
+ contract_version: CONTRACT_VERSION,
33
+ features: {
34
+ supports_writes: true,
35
+ supports_versioning: true,
36
+ supports_tag_filter: false,
37
+ supports_audit_trail: true,
38
+ supports_atomic_status_transitions: false,
39
+ },
40
+ };
41
+ }
42
+ constructor(rootDir) {
43
+ this.rootDir = rootDir;
44
+ }
45
+ async manifest() {
46
+ return {
47
+ capabilities_version: "1",
48
+ manifest: {
49
+ kind: "filesystem",
50
+ root_dir: this.rootDir,
51
+ },
52
+ };
53
+ }
54
+ async load(name, version) {
55
+ const path = this.pathFor(name);
56
+ let source;
57
+ try {
58
+ source = await readFile(path, "utf8");
59
+ }
60
+ catch (err) {
61
+ if (err.code === "ENOENT") {
62
+ throw new SkillNotFoundError(name, "FilesystemSkillStore");
63
+ }
64
+ throw err;
65
+ }
66
+ const content_hash = hashSource(source);
67
+ const versionLabel = shortHash(content_hash);
68
+ if (version !== undefined && version !== versionLabel) {
69
+ throw new VersionNotFoundError(name, version, "FilesystemSkillStore");
70
+ }
71
+ const meta = await this.buildMeta(name, source);
72
+ return {
73
+ name,
74
+ version: versionLabel,
75
+ content_hash,
76
+ source,
77
+ metadata: meta,
78
+ };
79
+ }
80
+ async query(filter) {
81
+ let entries;
82
+ try {
83
+ entries = await readdir(this.rootDir);
84
+ }
85
+ catch (err) {
86
+ if (err.code === "ENOENT")
87
+ return [];
88
+ throw err;
89
+ }
90
+ const metas = [];
91
+ for (const entry of entries) {
92
+ // `.skill.md` is the source convention (committed, authored). The
93
+ // bare `.skill` extension is reserved for compiled artifacts emitted
94
+ // alongside `.skill.provenance.json` sidecars — derived, gitignored.
95
+ if (!entry.endsWith(".skill.md"))
96
+ continue;
97
+ const name = entry.slice(0, -".skill.md".length);
98
+ try {
99
+ const source = await readFile(join(this.rootDir, entry), "utf8");
100
+ metas.push(await this.buildMeta(name, source));
101
+ }
102
+ catch {
103
+ // Unreadable file — skip.
104
+ }
105
+ }
106
+ metas.sort((a, b) => a.name.localeCompare(b.name));
107
+ return applyFilter(metas, filter);
108
+ }
109
+ async metadata(name) {
110
+ let source;
111
+ try {
112
+ source = await readFile(this.pathFor(name), "utf8");
113
+ }
114
+ catch (err) {
115
+ if (err.code === "ENOENT") {
116
+ throw new SkillNotFoundError(name, "FilesystemSkillStore");
117
+ }
118
+ throw err;
119
+ }
120
+ return this.buildMeta(name, source);
121
+ }
122
+ async versions(name) {
123
+ const sidecar = this.versionsPathFor(name);
124
+ let lines;
125
+ try {
126
+ const body = await readFile(sidecar, "utf8");
127
+ lines = body.split("\n").filter((l) => l.trim() !== "");
128
+ }
129
+ catch (err) {
130
+ if (err.code !== "ENOENT")
131
+ throw err;
132
+ // No sidecar — verify the skill file itself exists. If neither
133
+ // exists, it's a not-found. If the file exists but no sidecar,
134
+ // synthesize a single legacy entry from current state.
135
+ const meta = await this.metadata(name).catch((e) => {
136
+ if (e instanceof SkillNotFoundError)
137
+ throw e;
138
+ throw e;
139
+ });
140
+ const fileStat = await stat(this.pathFor(name));
141
+ return [{
142
+ name,
143
+ version: meta.version,
144
+ content_hash: meta.content_hash,
145
+ status: meta.status,
146
+ changed_at: Math.floor(fileStat.mtimeMs / 1000),
147
+ }];
148
+ }
149
+ const out = [];
150
+ for (const line of lines) {
151
+ try {
152
+ out.push(JSON.parse(line));
153
+ }
154
+ catch {
155
+ // Skip malformed; resilient to partial-write tear at append time.
156
+ }
157
+ }
158
+ return out;
159
+ }
160
+ async store(name, source, metadata) {
161
+ if (!/^[A-Za-z0-9][\w\-.]*$/.test(name)) {
162
+ throw new StorageConflictError(name, "name contains characters unsafe for filesystem path", "FilesystemSkillStore");
163
+ }
164
+ await mkdir(this.rootDir, { recursive: true });
165
+ const content_hash = hashSource(source);
166
+ const version = shortHash(content_hash);
167
+ const status = metadata?.status ?? extractStatus(source) ?? "Draft";
168
+ const nowSec = Math.floor(Date.now() / 1000);
169
+ await writeFile(this.pathFor(name), source, "utf8");
170
+ const info = {
171
+ name,
172
+ version,
173
+ content_hash,
174
+ status,
175
+ changed_at: nowSec,
176
+ ...(metadata?.author !== undefined ? { changed_by: metadata.author } : {}),
177
+ };
178
+ await appendFile(this.versionsPathFor(name), JSON.stringify(info) + "\n", "utf8");
179
+ return info;
180
+ }
181
+ async delete(name) {
182
+ let removed = false;
183
+ for (const p of [this.pathFor(name), this.versionsPathFor(name)]) {
184
+ try {
185
+ await unlink(p);
186
+ removed = true;
187
+ }
188
+ catch (err) {
189
+ if (err.code !== "ENOENT")
190
+ throw err;
191
+ }
192
+ }
193
+ if (!removed) {
194
+ throw new SkillNotFoundError(name, "FilesystemSkillStore");
195
+ }
196
+ }
197
+ async update_status(name, status) {
198
+ const path = this.pathFor(name);
199
+ let source;
200
+ try {
201
+ source = await readFile(path, "utf8");
202
+ }
203
+ catch (err) {
204
+ if (err.code === "ENOENT") {
205
+ throw new SkillNotFoundError(name, "FilesystemSkillStore");
206
+ }
207
+ throw err;
208
+ }
209
+ const previous_status = extractStatus(source) ?? "Draft";
210
+ const updated = rewriteStatusHeader(source, status);
211
+ await writeFile(path, updated, "utf8");
212
+ const content_hash = hashSource(updated);
213
+ const version = shortHash(content_hash);
214
+ const info = {
215
+ name,
216
+ version,
217
+ content_hash,
218
+ status,
219
+ previous_status,
220
+ changed_at: Math.floor(Date.now() / 1000),
221
+ };
222
+ await appendFile(this.versionsPathFor(name), JSON.stringify(info) + "\n", "utf8");
223
+ return info;
224
+ }
225
+ pathFor(name) {
226
+ return join(this.rootDir, `${name}.skill.md`);
227
+ }
228
+ versionsPathFor(name) {
229
+ return join(this.rootDir, `${name}.versions.jsonl`);
230
+ }
231
+ async buildMeta(name, source) {
232
+ const content_hash = hashSource(source);
233
+ const version = shortHash(content_hash);
234
+ const status = extractStatus(source) ?? "Draft";
235
+ const description = extractHeader(source, "Description");
236
+ const fileStat = await stat(this.pathFor(name)).catch(() => null);
237
+ const updated_at = fileStat ? Math.floor(fileStat.mtimeMs / 1000) : 0;
238
+ const meta = {
239
+ name,
240
+ version,
241
+ content_hash,
242
+ status,
243
+ created_at: updated_at,
244
+ updated_at,
245
+ };
246
+ if (description !== null)
247
+ meta.description = description;
248
+ return meta;
249
+ }
250
+ }
251
+ function hashSource(source) {
252
+ return createHash("sha256").update(source, "utf8").digest("hex");
253
+ }
254
+ function shortHash(content_hash) {
255
+ return content_hash.slice(0, 12);
256
+ }
257
+ function extractHeader(body, key) {
258
+ const re = new RegExp(`^#\\s*${key}\\s*:\\s*(.+?)\\s*$`, "m");
259
+ const m = re.exec(body);
260
+ return m ? m[1] : null;
261
+ }
262
+ function extractStatus(source) {
263
+ const raw = extractHeader(source, "Status");
264
+ if (raw === null)
265
+ return null;
266
+ const lower = raw.toLowerCase();
267
+ if (lower === "draft")
268
+ return "Draft";
269
+ if (lower === "approved")
270
+ return "Approved";
271
+ if (lower === "disabled")
272
+ return "Disabled";
273
+ return null;
274
+ }
275
+ /**
276
+ * Rewrite or insert the `# Status:` header. If absent, inserts after the
277
+ * `# Skill:` line (or at the top of the file as a fallback).
278
+ */
279
+ function rewriteStatusHeader(source, status) {
280
+ const re = /^#\s*Status\s*:\s*.+?\s*$/m;
281
+ if (re.test(source)) {
282
+ return source.replace(re, `# Status: ${status}`);
283
+ }
284
+ const skillLineRe = /^(#\s*Skill\s*:\s*.+?)\s*$/m;
285
+ if (skillLineRe.test(source)) {
286
+ return source.replace(skillLineRe, `$1\n# Status: ${status}`);
287
+ }
288
+ return `# Status: ${status}\n${source}`;
289
+ }
290
+ function applyFilter(metas, filter) {
291
+ if (filter === undefined)
292
+ return metas;
293
+ let out = metas;
294
+ if (filter.status !== undefined) {
295
+ const wanted = Array.isArray(filter.status) ? filter.status : [filter.status];
296
+ out = out.filter((m) => wanted.includes(m.status));
297
+ }
298
+ if (filter.name_pattern !== undefined) {
299
+ const pat = new RegExp(filter.name_pattern);
300
+ out = out.filter((m) => pat.test(m.name));
301
+ }
302
+ if (filter.since !== undefined) {
303
+ const since = filter.since;
304
+ out = out.filter((m) => m.updated_at >= since);
305
+ }
306
+ if (filter.offset !== undefined) {
307
+ out = out.slice(filter.offset);
308
+ }
309
+ if (filter.limit !== undefined) {
310
+ out = out.slice(0, filter.limit);
311
+ }
312
+ return out;
313
+ }
314
+ //# sourceMappingURL=skill-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-store.js","sourceRoot":"","sources":["../../src/connectors/skill-store.ts"],"names":[],"mappings":"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"}