@pentoshi/clai 4.6.2 → 4.8.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.
Files changed (149) hide show
  1. package/README.md +4 -1
  2. package/dist/agent/context-manager.js +13 -3
  3. package/dist/agent/context-manager.js.map +1 -1
  4. package/dist/agent/injected-blocks.d.ts +8 -0
  5. package/dist/agent/injected-blocks.js +26 -0
  6. package/dist/agent/injected-blocks.js.map +1 -0
  7. package/dist/agent/must-continue.js +13 -8
  8. package/dist/agent/must-continue.js.map +1 -1
  9. package/dist/agent/runner.js +91 -21
  10. package/dist/agent/runner.js.map +1 -1
  11. package/dist/agent/tool-call-parser.js +2 -1
  12. package/dist/agent/tool-call-parser.js.map +1 -1
  13. package/dist/agent/tool-history.js +8 -2
  14. package/dist/agent/tool-history.js.map +1 -1
  15. package/dist/app/commands/catalog.js +9 -1
  16. package/dist/app/commands/catalog.js.map +1 -1
  17. package/dist/app/controllers/session-controller.d.ts +1 -0
  18. package/dist/app/controllers/session-controller.js +9 -7
  19. package/dist/app/controllers/session-controller.js.map +1 -1
  20. package/dist/app/controllers/session-persistence.d.ts +6 -0
  21. package/dist/app/controllers/session-persistence.js +9 -0
  22. package/dist/app/controllers/session-persistence.js.map +1 -1
  23. package/dist/classic/app/ClassicApp.js +1 -1
  24. package/dist/classic/app/ClassicApp.js.map +1 -1
  25. package/dist/classic/app/wiring-lifecycle.js +6 -1
  26. package/dist/classic/app/wiring-lifecycle.js.map +1 -1
  27. package/dist/classic/bootstrap/start-classic.d.ts +2 -0
  28. package/dist/classic/bootstrap/start-classic.js +15 -0
  29. package/dist/classic/bootstrap/start-classic.js.map +1 -1
  30. package/dist/classic/chrome/Composer.d.ts +2 -0
  31. package/dist/classic/chrome/Composer.js +2 -1
  32. package/dist/classic/chrome/Composer.js.map +1 -1
  33. package/dist/classic/chrome/composer-controller.d.ts +3 -0
  34. package/dist/classic/chrome/composer-controller.js +21 -1
  35. package/dist/classic/chrome/composer-controller.js.map +1 -1
  36. package/dist/classic/chrome/editor-view.d.ts +5 -0
  37. package/dist/classic/chrome/editor-view.js +54 -4
  38. package/dist/classic/chrome/editor-view.js.map +1 -1
  39. package/dist/commands/update-install.d.ts +10 -1
  40. package/dist/commands/update-install.js +165 -11
  41. package/dist/commands/update-install.js.map +1 -1
  42. package/dist/commands/update.d.ts +2 -2
  43. package/dist/commands/update.js +2 -1
  44. package/dist/commands/update.js.map +1 -1
  45. package/dist/index.js +15 -0
  46. package/dist/index.js.map +1 -1
  47. package/dist/instructions/load.d.ts +19 -0
  48. package/dist/instructions/load.js +123 -0
  49. package/dist/instructions/load.js.map +1 -0
  50. package/dist/instructions/locations.d.ts +23 -0
  51. package/dist/instructions/locations.js +167 -0
  52. package/dist/instructions/locations.js.map +1 -0
  53. package/dist/instructions/record.d.ts +22 -0
  54. package/dist/instructions/record.js +157 -0
  55. package/dist/instructions/record.js.map +1 -0
  56. package/dist/instructions/scaffold.d.ts +8 -0
  57. package/dist/instructions/scaffold.js +70 -0
  58. package/dist/instructions/scaffold.js.map +1 -0
  59. package/dist/modes/ask.js +4 -0
  60. package/dist/modes/ask.js.map +1 -1
  61. package/dist/prompts/embedded.js +1 -1
  62. package/dist/prompts/embedded.js.map +1 -1
  63. package/dist/prompts/index.js +11 -1
  64. package/dist/prompts/index.js.map +1 -1
  65. package/dist/prompts/system.agent.md +8 -7
  66. package/dist/safety/classifier.js +9 -0
  67. package/dist/safety/classifier.js.map +1 -1
  68. package/dist/skills/catalog.d.ts +13 -0
  69. package/dist/skills/catalog.js +119 -0
  70. package/dist/skills/catalog.js.map +1 -0
  71. package/dist/skills/discover.d.ts +8 -0
  72. package/dist/skills/discover.js +203 -0
  73. package/dist/skills/discover.js.map +1 -0
  74. package/dist/skills/format.d.ts +3 -0
  75. package/dist/skills/format.js +29 -0
  76. package/dist/skills/format.js.map +1 -0
  77. package/dist/skills/frontmatter.d.ts +8 -0
  78. package/dist/skills/frontmatter.js +151 -0
  79. package/dist/skills/frontmatter.js.map +1 -0
  80. package/dist/skills/locations.d.ts +10 -0
  81. package/dist/skills/locations.js +174 -0
  82. package/dist/skills/locations.js.map +1 -0
  83. package/dist/skills/mentions.d.ts +9 -0
  84. package/dist/skills/mentions.js +31 -0
  85. package/dist/skills/mentions.js.map +1 -0
  86. package/dist/skills/registry.d.ts +12 -0
  87. package/dist/skills/registry.js +141 -0
  88. package/dist/skills/registry.js.map +1 -0
  89. package/dist/skills/types.d.ts +33 -0
  90. package/dist/skills/types.js +8 -0
  91. package/dist/skills/types.js.map +1 -0
  92. package/dist/tools/definitions.js +40 -0
  93. package/dist/tools/definitions.js.map +1 -1
  94. package/dist/tools/instructions.d.ts +2 -0
  95. package/dist/tools/instructions.js +54 -0
  96. package/dist/tools/instructions.js.map +1 -0
  97. package/dist/tools/registry.js +14 -0
  98. package/dist/tools/registry.js.map +1 -1
  99. package/dist/tools/skills.d.ts +3 -0
  100. package/dist/tools/skills.js +99 -0
  101. package/dist/tools/skills.js.map +1 -0
  102. package/dist/tui-v2/bootstrap/start-tui-v2.d.ts +2 -0
  103. package/dist/tui-v2/bootstrap/start-tui-v2.js +22 -0
  104. package/dist/tui-v2/bootstrap/start-tui-v2.js.map +1 -1
  105. package/dist/tui-v2/composer/composer-editor.js +10 -0
  106. package/dist/tui-v2/composer/composer-editor.js.map +1 -1
  107. package/dist/tui-v2/composer/skill-highlight.d.ts +3 -0
  108. package/dist/tui-v2/composer/skill-highlight.js +63 -0
  109. package/dist/tui-v2/composer/skill-highlight.js.map +1 -0
  110. package/dist/tui-v2/composer/use-draft-actions.d.ts +1 -0
  111. package/dist/tui-v2/composer/use-draft-actions.js +13 -1
  112. package/dist/tui-v2/composer/use-draft-actions.js.map +1 -1
  113. package/dist/ui-core/bootstrap/composition-root.js +3 -0
  114. package/dist/ui-core/bootstrap/composition-root.js.map +1 -1
  115. package/dist/ui-core/bootstrap/exit-epilogue.d.ts +22 -0
  116. package/dist/ui-core/bootstrap/exit-epilogue.js +43 -0
  117. package/dist/ui-core/bootstrap/exit-epilogue.js.map +1 -0
  118. package/dist/ui-core/bootstrap/lifecycle.d.ts +9 -0
  119. package/dist/ui-core/bootstrap/lifecycle.js +16 -0
  120. package/dist/ui-core/bootstrap/lifecycle.js.map +1 -1
  121. package/dist/ui-core/bootstrap/session-resume.d.ts +28 -0
  122. package/dist/ui-core/bootstrap/session-resume.js +163 -0
  123. package/dist/ui-core/bootstrap/session-resume.js.map +1 -0
  124. package/dist/ui-core/commands/command-handlers.js +2 -0
  125. package/dist/ui-core/commands/command-handlers.js.map +1 -1
  126. package/dist/ui-core/commands/config-commands.js +7 -2
  127. package/dist/ui-core/commands/config-commands.js.map +1 -1
  128. package/dist/ui-core/commands/picker-commands.js +4 -60
  129. package/dist/ui-core/commands/picker-commands.js.map +1 -1
  130. package/dist/ui-core/commands/skill-commands.d.ts +3 -0
  131. package/dist/ui-core/commands/skill-commands.js +69 -0
  132. package/dist/ui-core/commands/skill-commands.js.map +1 -0
  133. package/dist/ui-core/composer/composer-action-port.d.ts +3 -0
  134. package/dist/ui-core/composer/composer-action-port.js +14 -0
  135. package/dist/ui-core/composer/composer-action-port.js.map +1 -1
  136. package/dist/ui-core/composer/insert-token.d.ts +1 -0
  137. package/dist/ui-core/composer/insert-token.js +5 -0
  138. package/dist/ui-core/composer/insert-token.js.map +1 -0
  139. package/dist/ui-core/rendering/exit-summary.d.ts +16 -0
  140. package/dist/ui-core/rendering/exit-summary.js +466 -0
  141. package/dist/ui-core/rendering/exit-summary.js.map +1 -0
  142. package/dist/ui-core/rendering/intro-header.js +6 -2
  143. package/dist/ui-core/rendering/intro-header.js.map +1 -1
  144. package/dist/ui-core/rendering/wordmark.d.ts +14 -8
  145. package/dist/ui-core/rendering/wordmark.js +206 -36
  146. package/dist/ui-core/rendering/wordmark.js.map +1 -1
  147. package/dist/version.generated.d.ts +2 -2
  148. package/dist/version.generated.js +2 -2
  149. package/package.json +1 -1
@@ -0,0 +1,151 @@
1
+ const KEY_LINE = /^([A-Za-z][A-Za-z0-9_.-]*):[ \t]*(.*)$/;
2
+ const LIST_ITEM = /^[ \t]*-[ \t]*(.*)$/;
3
+ const EMPTY_FRONTMATTER = {
4
+ fields: {},
5
+ lists: {},
6
+ body: "",
7
+ present: false,
8
+ };
9
+ function unquote(value) {
10
+ const trimmed = value.trim();
11
+ if (trimmed.length < 2)
12
+ return trimmed;
13
+ const first = trimmed[0];
14
+ const last = trimmed[trimmed.length - 1];
15
+ if ((first === '"' && last === '"') || (first === "'" && last === "'")) {
16
+ return trimmed.slice(1, -1).replace(/\\"/g, '"').replace(/\\'/g, "'");
17
+ }
18
+ return trimmed;
19
+ }
20
+ function indentOf(line) {
21
+ let count = 0;
22
+ for (const char of line) {
23
+ if (char === " ")
24
+ count += 1;
25
+ else if (char === "\t")
26
+ count += 2;
27
+ else
28
+ break;
29
+ }
30
+ return count;
31
+ }
32
+ function splitFlowList(value) {
33
+ return value
34
+ .slice(1, -1)
35
+ .split(",")
36
+ .map((part) => unquote(part))
37
+ .filter((part) => part.length > 0);
38
+ }
39
+ export function parseFrontmatter(raw) {
40
+ const text = raw.replace(/^\uFEFF/, "").replace(/\r\n?/g, "\n");
41
+ const lines = text.split("\n");
42
+ let cursor = 0;
43
+ while (cursor < lines.length && lines[cursor].trim().length === 0)
44
+ cursor += 1;
45
+ if (lines[cursor]?.trim() !== "---") {
46
+ return { ...EMPTY_FRONTMATTER, body: text.trim() };
47
+ }
48
+ let end = -1;
49
+ for (let index = cursor + 1; index < lines.length; index += 1) {
50
+ const candidate = lines[index].trim();
51
+ if (candidate === "---" || candidate === "...") {
52
+ end = index;
53
+ break;
54
+ }
55
+ }
56
+ if (end < 0)
57
+ return { ...EMPTY_FRONTMATTER, body: text.trim() };
58
+ const fields = {};
59
+ const lists = {};
60
+ const region = lines.slice(cursor + 1, end);
61
+ for (let index = 0; index < region.length; index += 1) {
62
+ const line = region[index];
63
+ if (line.trim().length === 0 || line.trimStart().startsWith("#"))
64
+ continue;
65
+ if (indentOf(line) > 0)
66
+ continue;
67
+ const match = KEY_LINE.exec(line);
68
+ if (!match)
69
+ continue;
70
+ const key = match[1].toLowerCase();
71
+ const rawValue = match[2] ?? "";
72
+ const scalar = rawValue.trim();
73
+ if (scalar === "|" || scalar === "|-" || scalar === ">" || scalar === ">-") {
74
+ const folded = scalar.startsWith(">");
75
+ const collected = [];
76
+ let look = index + 1;
77
+ while (look < region.length) {
78
+ const next = region[look];
79
+ if (next.trim().length > 0 && indentOf(next) === 0)
80
+ break;
81
+ collected.push(next.trim());
82
+ look += 1;
83
+ }
84
+ index = look - 1;
85
+ const joined = folded
86
+ ? collected.join(" ").replace(/\s+/g, " ").trim()
87
+ : collected.join("\n").trim();
88
+ fields[key] = joined;
89
+ continue;
90
+ }
91
+ if (scalar.startsWith("[") && scalar.endsWith("]")) {
92
+ const items = splitFlowList(scalar);
93
+ lists[key] = items;
94
+ fields[key] = items.join(" ");
95
+ continue;
96
+ }
97
+ if (scalar.length === 0) {
98
+ const items = [];
99
+ const nested = [];
100
+ let look = index + 1;
101
+ while (look < region.length) {
102
+ const next = region[look];
103
+ if (next.trim().length === 0) {
104
+ look += 1;
105
+ continue;
106
+ }
107
+ if (indentOf(next) === 0)
108
+ break;
109
+ const item = LIST_ITEM.exec(next);
110
+ if (item)
111
+ items.push(unquote(item[1] ?? ""));
112
+ else {
113
+ const child = KEY_LINE.exec(next.trim());
114
+ if (child)
115
+ nested.push(`${child[1]}=${unquote(child[2] ?? "")}`);
116
+ }
117
+ look += 1;
118
+ }
119
+ index = look - 1;
120
+ if (items.length > 0) {
121
+ lists[key] = items.filter((item) => item.length > 0);
122
+ fields[key] = lists[key].join(" ");
123
+ }
124
+ else if (nested.length > 0) {
125
+ fields[key] = nested.join(" ");
126
+ }
127
+ continue;
128
+ }
129
+ fields[key] = unquote(scalar);
130
+ }
131
+ return {
132
+ fields,
133
+ lists,
134
+ body: lines.slice(end + 1).join("\n").trim(),
135
+ present: true,
136
+ };
137
+ }
138
+ export function frontmatterList(parsed, key) {
139
+ const direct = parsed.lists[key];
140
+ if (direct && direct.length > 0)
141
+ return [...direct];
142
+ const scalar = parsed.fields[key];
143
+ if (!scalar)
144
+ return undefined;
145
+ const items = scalar
146
+ .split(/[,\s]+/)
147
+ .map((item) => item.trim())
148
+ .filter((item) => item.length > 0);
149
+ return items.length > 0 ? items : undefined;
150
+ }
151
+ //# sourceMappingURL=frontmatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"frontmatter.js","sourceRoot":"","sources":["../../src/skills/frontmatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { SkillRoot } from "./types.js";
2
+ export declare function projectSearchDirs(input: {
3
+ readonly cwd: string;
4
+ readonly projectRoot?: string | undefined;
5
+ }): string[];
6
+ export declare function skillSearchRoots(input: {
7
+ readonly cwd: string;
8
+ readonly projectRoot?: string | undefined;
9
+ }): SkillRoot[];
10
+ export declare function skillSearchLocationHints(): string[];
@@ -0,0 +1,174 @@
1
+ import { existsSync, statSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { delimiter, dirname, join, resolve } from "node:path";
4
+ import { getDataDir } from "../store/paths.js";
5
+ const PROJECT_SUFFIXES = [
6
+ [".clai/skills", "clai"],
7
+ [".claude/skills", "claude"],
8
+ [".agents/skills", "agents"],
9
+ [".agent/skills", "agent"],
10
+ ["agents/skills", "agents"],
11
+ [".github/skills", "copilot"],
12
+ [".opencode/skills", "opencode"],
13
+ [".opencode/skill", "opencode"],
14
+ [".codex/skills", "codex"],
15
+ [".antigravity/skills", "antigravity"],
16
+ [".gemini/skills", "gemini"],
17
+ [".cursor/skills", "cursor"],
18
+ [".windsurf/skills", "windsurf"],
19
+ ["skills", "workspace"],
20
+ ];
21
+ const PROJECT_MARKER_FILES = [
22
+ ".git",
23
+ "package.json",
24
+ "pyproject.toml",
25
+ "go.mod",
26
+ "Cargo.toml",
27
+ "pom.xml",
28
+ "build.gradle",
29
+ "composer.json",
30
+ "Gemfile",
31
+ "requirements.txt",
32
+ "CMakeLists.txt",
33
+ "AGENTS.md",
34
+ ".clai",
35
+ ];
36
+ const MAX_ANCESTOR_LEVELS = 4;
37
+ function xdgConfigHome() {
38
+ const configured = process.env.XDG_CONFIG_HOME?.trim();
39
+ if (configured)
40
+ return resolve(configured);
41
+ return join(homedir(), ".config");
42
+ }
43
+ function userRootSpecs() {
44
+ const home = homedir();
45
+ const xdg = xdgConfigHome();
46
+ const appData = process.env.APPDATA?.trim();
47
+ const localAppData = process.env.LOCALAPPDATA?.trim();
48
+ const specs = [
49
+ [join(getDataDir(), "skills"), "clai"],
50
+ [join(home, ".clai", "skills"), "clai"],
51
+ [join(home, ".claude", "skills"), "claude"],
52
+ [join(home, ".codex", "skills"), "codex"],
53
+ [join(home, ".agents", "skills"), "agents"],
54
+ [join(home, ".agent", "skills"), "agent"],
55
+ [join(home, ".antigravity", "skills"), "antigravity"],
56
+ [join(home, ".gemini", "antigravity", "skills"), "antigravity"],
57
+ [join(home, ".gemini", "skills"), "gemini"],
58
+ [join(home, ".cursor", "skills"), "cursor"],
59
+ [join(home, ".opencode", "skills"), "opencode"],
60
+ [join(home, ".opencode", "skill"), "opencode"],
61
+ [join(xdg, "opencode", "skills"), "opencode"],
62
+ [join(xdg, "opencode", "skill"), "opencode"],
63
+ [join(xdg, "claude", "skills"), "claude"],
64
+ [join(xdg, "codex", "skills"), "codex"],
65
+ [join(xdg, "agents", "skills"), "agents"],
66
+ [join(xdg, "clai", "skills"), "clai"],
67
+ ];
68
+ if (appData) {
69
+ specs.push([join(appData, "opencode", "skills"), "opencode"], [join(appData, "Claude", "skills"), "claude"], [join(appData, "codex", "skills"), "codex"], [join(appData, "clai", "skills"), "clai"]);
70
+ }
71
+ if (localAppData) {
72
+ specs.push([join(localAppData, "antigravity", "skills"), "antigravity"], [join(localAppData, "opencode", "skills"), "opencode"]);
73
+ }
74
+ return specs;
75
+ }
76
+ function extraRootSpecs() {
77
+ const configured = process.env.CLAI_SKILLS_PATH?.trim();
78
+ if (!configured)
79
+ return [];
80
+ return configured
81
+ .split(delimiter)
82
+ .map((part) => part.trim())
83
+ .filter((part) => part.length > 0)
84
+ .map((part) => [resolve(part), "custom"]);
85
+ }
86
+ function isDirectory(path) {
87
+ try {
88
+ return statSync(path).isDirectory();
89
+ }
90
+ catch {
91
+ return false;
92
+ }
93
+ }
94
+ function hasProjectMarker(dir) {
95
+ return PROJECT_MARKER_FILES.some((marker) => existsSync(join(dir, marker)));
96
+ }
97
+ function isBoundary(dir) {
98
+ const home = resolve(homedir());
99
+ const current = resolve(dir);
100
+ return current === home || dirname(current) === current;
101
+ }
102
+ export function projectSearchDirs(input) {
103
+ const seeds = [input.projectRoot, input.cwd]
104
+ .filter((value) => Boolean(value?.trim()))
105
+ .map((value) => resolve(value));
106
+ const out = [];
107
+ const seen = new Set();
108
+ const push = (dir) => {
109
+ const key = process.platform === "win32" ? dir.toLowerCase() : dir;
110
+ if (seen.has(key))
111
+ return;
112
+ seen.add(key);
113
+ out.push(dir);
114
+ };
115
+ for (const seed of seeds) {
116
+ push(seed);
117
+ let current = seed;
118
+ for (let level = 0; level < MAX_ANCESTOR_LEVELS; level += 1) {
119
+ if (isBoundary(current))
120
+ break;
121
+ const parent = dirname(current);
122
+ if (parent === current)
123
+ break;
124
+ current = parent;
125
+ if (isBoundary(current))
126
+ break;
127
+ push(current);
128
+ if (hasProjectMarker(current))
129
+ break;
130
+ }
131
+ }
132
+ return out;
133
+ }
134
+ export function skillSearchRoots(input) {
135
+ const collected = [];
136
+ const seen = new Set();
137
+ const add = (path, tool, scope) => {
138
+ const key = process.platform === "win32" ? path.toLowerCase() : path;
139
+ if (seen.has(key))
140
+ return;
141
+ seen.add(key);
142
+ if (!isDirectory(path))
143
+ return;
144
+ collected.push({ path, tool, scope });
145
+ };
146
+ for (const [path, tool] of extraRootSpecs())
147
+ add(path, tool, "extra");
148
+ for (const dir of projectSearchDirs(input)) {
149
+ for (const [suffix, tool] of PROJECT_SUFFIXES) {
150
+ add(join(dir, ...suffix.split("/")), tool, "project");
151
+ }
152
+ }
153
+ for (const [path, tool] of userRootSpecs())
154
+ add(path, tool, "user");
155
+ return collected;
156
+ }
157
+ export function skillSearchLocationHints() {
158
+ return [
159
+ ".clai/skills",
160
+ ".claude/skills",
161
+ ".agents/skills",
162
+ ".github/skills",
163
+ ".opencode/skills",
164
+ ".codex/skills",
165
+ ".antigravity/skills",
166
+ ".cursor/skills",
167
+ "~/.clai/skills",
168
+ "~/.claude/skills",
169
+ "~/.codex/skills",
170
+ "~/.config/opencode/skills",
171
+ "$CLAI_SKILLS_PATH",
172
+ ];
173
+ }
174
+ //# sourceMappingURL=locations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"locations.js","sourceRoot":"","sources":["../../src/skills/locations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export interface SkillMentionRange {
2
+ readonly start: number;
3
+ readonly end: number;
4
+ readonly name: string;
5
+ }
6
+ export declare function formatSkillToken(name: string): string;
7
+ export declare function findSkillMentions(text: string, known: ReadonlySet<string>): SkillMentionRange[];
8
+ export declare function skillMentionNames(text: string, known: ReadonlySet<string>): string[];
9
+ export declare function hasSkillMention(text: string, known: ReadonlySet<string>): boolean;
@@ -0,0 +1,31 @@
1
+ const TOKEN_RE = /(^|[^\w:/\\.-])skill:([A-Za-z0-9][A-Za-z0-9_-]*)/g;
2
+ export function formatSkillToken(name) {
3
+ return `skill:${name}`;
4
+ }
5
+ export function findSkillMentions(text, known) {
6
+ if (!text || known.size === 0 || !text.includes("skill:"))
7
+ return [];
8
+ const out = [];
9
+ const pattern = new RegExp(TOKEN_RE.source, TOKEN_RE.flags);
10
+ let match;
11
+ while ((match = pattern.exec(text)) !== null) {
12
+ const lead = match[1] ?? "";
13
+ const raw = match[2] ?? "";
14
+ const name = raw.toLowerCase().replace(/_/g, "-");
15
+ if (!known.has(name))
16
+ continue;
17
+ const start = match.index + lead.length;
18
+ out.push({ start, end: start + `skill:${raw}`.length, name });
19
+ }
20
+ return out;
21
+ }
22
+ export function skillMentionNames(text, known) {
23
+ const seen = new Set();
24
+ for (const mention of findSkillMentions(text, known))
25
+ seen.add(mention.name);
26
+ return [...seen];
27
+ }
28
+ export function hasSkillMention(text, known) {
29
+ return findSkillMentions(text, known).length > 0;
30
+ }
31
+ //# sourceMappingURL=mentions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mentions.js","sourceRoot":"","sources":["../../src/skills/mentions.ts"],"names":[],"mappings":"AAMA,MAAM,QAAQ,GAAG,mDAAmD,CAAC;AAErE,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,SAAS,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,KAA0B;IAE1B,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAAE,OAAO,EAAE,CAAC;IACrE,MAAM,GAAG,GAAwB,EAAE,CAAC;IACpC,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5D,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;QAClD,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QACxC,GAAG,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,GAAG,SAAS,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAY,EACZ,KAA0B;IAE1B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,OAAO,IAAI,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC;QAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,KAA0B;IAE1B,OAAO,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type LoadedSkill, type SkillIndex, type SkillMeta } from "./types.js";
2
+ export interface SkillScanInput {
3
+ readonly cwd?: string | undefined;
4
+ readonly projectRoot?: string | undefined;
5
+ }
6
+ export declare function getSkillIndex(input?: SkillScanInput): Promise<SkillIndex>;
7
+ export declare function skillIndexSnapshot(): SkillIndex;
8
+ export declare function skillNamesSnapshot(): ReadonlySet<string>;
9
+ export declare function findSkillInSnapshot(name: string): SkillMeta | undefined;
10
+ export declare function invalidateSkillIndex(): void;
11
+ export declare function loadSkill(name: string, input?: SkillScanInput): Promise<LoadedSkill | undefined>;
12
+ export declare function skillFileSignature(meta: SkillMeta): Promise<string | undefined>;
@@ -0,0 +1,141 @@
1
+ import { readdir, readFile, stat } from "node:fs/promises";
2
+ import { join, relative, sep } from "node:path";
3
+ import { safeCwd } from "../os/cwd.js";
4
+ import { dedupeSkills, discoverSkills, normalizeSkillName } from "./discover.js";
5
+ import { skillSearchRoots } from "./locations.js";
6
+ import { parseFrontmatter } from "./frontmatter.js";
7
+ import { EMPTY_SKILL_INDEX, } from "./types.js";
8
+ const INDEX_TTL_MS = 10_000;
9
+ const MAX_BODY_CHARS = 48 * 1024;
10
+ const MAX_RESOURCES = 40;
11
+ const RESOURCE_DEPTH = 2;
12
+ let cache;
13
+ let inflight;
14
+ function scanKey(input) {
15
+ return `${input.projectRoot ?? ""}\u0000${input.cwd ?? safeCwd()}`;
16
+ }
17
+ function buildIndex(skills, roots, truncated) {
18
+ return {
19
+ skills,
20
+ roots,
21
+ names: new Set(skills.map((skill) => skill.name)),
22
+ scannedAt: Date.now(),
23
+ truncated,
24
+ };
25
+ }
26
+ async function scan(input) {
27
+ const cwd = input.cwd ?? safeCwd();
28
+ const roots = skillSearchRoots({
29
+ cwd,
30
+ ...(input.projectRoot ? { projectRoot: input.projectRoot } : {}),
31
+ });
32
+ if (roots.length === 0)
33
+ return buildIndex([], roots, false);
34
+ const { skills, truncated } = await discoverSkills(roots);
35
+ return buildIndex(dedupeSkills(skills), roots, truncated);
36
+ }
37
+ export async function getSkillIndex(input = {}) {
38
+ const key = scanKey(input);
39
+ const fresh = cache?.key === key && Date.now() - cache.index.scannedAt < INDEX_TTL_MS;
40
+ if (fresh)
41
+ return cache.index;
42
+ if (inflight)
43
+ return inflight;
44
+ inflight = scan(input)
45
+ .then((index) => {
46
+ cache = { key, index };
47
+ return index;
48
+ })
49
+ .catch(() => {
50
+ const fallback = buildIndex([], [], false);
51
+ cache = { key, index: fallback };
52
+ return fallback;
53
+ })
54
+ .finally(() => {
55
+ inflight = undefined;
56
+ });
57
+ return inflight;
58
+ }
59
+ export function skillIndexSnapshot() {
60
+ return cache?.index ?? EMPTY_SKILL_INDEX;
61
+ }
62
+ export function skillNamesSnapshot() {
63
+ return skillIndexSnapshot().names;
64
+ }
65
+ export function findSkillInSnapshot(name) {
66
+ const normalized = normalizeSkillName(name);
67
+ if (!normalized)
68
+ return undefined;
69
+ return skillIndexSnapshot().skills.find((skill) => skill.name === normalized);
70
+ }
71
+ export function invalidateSkillIndex() {
72
+ cache = undefined;
73
+ }
74
+ async function listResources(dir) {
75
+ const out = [];
76
+ const walk = async (current, depth) => {
77
+ if (depth > RESOURCE_DEPTH || out.length >= MAX_RESOURCES)
78
+ return;
79
+ let entries;
80
+ try {
81
+ entries = await readdir(current, { withFileTypes: true });
82
+ }
83
+ catch {
84
+ return;
85
+ }
86
+ for (const entry of entries) {
87
+ if (out.length >= MAX_RESOURCES)
88
+ return;
89
+ const child = join(current, entry.name);
90
+ if (entry.isDirectory()) {
91
+ if (entry.name === "node_modules" || entry.name.startsWith("."))
92
+ continue;
93
+ await walk(child, depth + 1);
94
+ continue;
95
+ }
96
+ if (!entry.isFile())
97
+ continue;
98
+ if (/^skill\.md$/i.test(entry.name))
99
+ continue;
100
+ out.push(relative(dir, child).split(sep).join("/"));
101
+ }
102
+ };
103
+ await walk(dir, 1);
104
+ return out.sort();
105
+ }
106
+ export async function loadSkill(name, input = {}) {
107
+ const index = await getSkillIndex(input);
108
+ const normalized = normalizeSkillName(name);
109
+ const meta = normalized
110
+ ? index.skills.find((skill) => skill.name === normalized)
111
+ : undefined;
112
+ if (!meta)
113
+ return undefined;
114
+ let raw;
115
+ try {
116
+ raw = await readFile(meta.file, "utf8");
117
+ }
118
+ catch {
119
+ return undefined;
120
+ }
121
+ const parsed = parseFrontmatter(raw);
122
+ const source = parsed.present ? parsed.body : raw.trim();
123
+ const truncated = source.length > MAX_BODY_CHARS;
124
+ const body = truncated ? source.slice(0, MAX_BODY_CHARS) : source;
125
+ return {
126
+ meta,
127
+ body,
128
+ resources: await listResources(meta.dir),
129
+ truncated,
130
+ };
131
+ }
132
+ export async function skillFileSignature(meta) {
133
+ try {
134
+ const info = await stat(meta.file);
135
+ return `${meta.file}:${info.mtimeMs}:${info.size}`;
136
+ }
137
+ catch {
138
+ return undefined;
139
+ }
140
+ }
141
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/skills/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export type SkillScope = "project" | "user" | "extra";
2
+ export interface SkillRoot {
3
+ readonly path: string;
4
+ readonly tool: string;
5
+ readonly scope: SkillScope;
6
+ }
7
+ export interface SkillMeta {
8
+ readonly name: string;
9
+ readonly description: string;
10
+ readonly dir: string;
11
+ readonly file: string;
12
+ readonly scope: SkillScope;
13
+ readonly tool: string;
14
+ readonly root: string;
15
+ readonly compatibility?: string | undefined;
16
+ readonly license?: string | undefined;
17
+ readonly allowedTools?: readonly string[] | undefined;
18
+ readonly shadowed?: readonly string[] | undefined;
19
+ }
20
+ export interface SkillIndex {
21
+ readonly skills: readonly SkillMeta[];
22
+ readonly roots: readonly SkillRoot[];
23
+ readonly names: ReadonlySet<string>;
24
+ readonly scannedAt: number;
25
+ readonly truncated: boolean;
26
+ }
27
+ export interface LoadedSkill {
28
+ readonly meta: SkillMeta;
29
+ readonly body: string;
30
+ readonly resources: readonly string[];
31
+ readonly truncated: boolean;
32
+ }
33
+ export declare const EMPTY_SKILL_INDEX: SkillIndex;
@@ -0,0 +1,8 @@
1
+ export const EMPTY_SKILL_INDEX = {
2
+ skills: [],
3
+ roots: [],
4
+ names: new Set(),
5
+ scannedAt: 0,
6
+ truncated: false,
7
+ };
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/skills/types.ts"],"names":[],"mappings":"AAqCA,MAAM,CAAC,MAAM,iBAAiB,GAAe;IAC3C,MAAM,EAAE,EAAE;IACV,KAAK,EAAE,EAAE;IACT,KAAK,EAAE,IAAI,GAAG,EAAU;IACxB,SAAS,EAAE,CAAC;IACZ,SAAS,EAAE,KAAK;CACjB,CAAC"}