opencode-snippets 2.0.2 → 2.1.1

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 (42) hide show
  1. package/README.md +44 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +106 -2
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/config.d.ts +2 -0
  6. package/dist/src/config.d.ts.map +1 -1
  7. package/dist/src/config.js +12 -2
  8. package/dist/src/config.js.map +1 -1
  9. package/dist/src/constants.d.ts +2 -0
  10. package/dist/src/constants.d.ts.map +1 -1
  11. package/dist/src/constants.js +2 -0
  12. package/dist/src/constants.js.map +1 -1
  13. package/dist/src/expander.d.ts.map +1 -1
  14. package/dist/src/expander.js +4 -1
  15. package/dist/src/expander.js.map +1 -1
  16. package/dist/src/hook-types.d.ts +3 -0
  17. package/dist/src/hook-types.d.ts.map +1 -1
  18. package/dist/src/skill-load-manager.d.ts +10 -0
  19. package/dist/src/skill-load-manager.d.ts.map +1 -0
  20. package/dist/src/skill-load-manager.js +30 -0
  21. package/dist/src/skill-load-manager.js.map +1 -0
  22. package/dist/src/skill-loader.d.ts +8 -1
  23. package/dist/src/skill-loader.d.ts.map +1 -1
  24. package/dist/src/skill-loader.js +66 -17
  25. package/dist/src/skill-loader.js.map +1 -1
  26. package/dist/src/skill-loading.d.ts +11 -0
  27. package/dist/src/skill-loading.d.ts.map +1 -0
  28. package/dist/src/skill-loading.js +122 -0
  29. package/dist/src/skill-loading.js.map +1 -0
  30. package/dist/src/tui-search.d.ts +2 -0
  31. package/dist/src/tui-search.d.ts.map +1 -1
  32. package/dist/src/tui-search.js +61 -16
  33. package/dist/src/tui-search.js.map +1 -1
  34. package/dist/src/tui-trigger.d.ts +2 -0
  35. package/dist/src/tui-trigger.d.ts.map +1 -1
  36. package/dist/src/tui-trigger.js +22 -0
  37. package/dist/src/tui-trigger.js.map +1 -1
  38. package/dist/tui.d.ts.map +1 -1
  39. package/dist/tui.jsx +84 -29
  40. package/dist/tui.jsx.map +1 -1
  41. package/package.json +1 -1
  42. package/skill/snippets/SKILL.md +30 -2
@@ -1,48 +1,97 @@
1
- import { readdir } from "node:fs/promises";
1
+ import { readdir, stat } from "node:fs/promises";
2
2
  import { homedir } from "node:os";
3
- import { join } from "node:path";
3
+ import { dirname, join, resolve } from "node:path";
4
4
  import { importCjs } from "./cjs-interop.js";
5
5
  const matter = await importCjs("gray-matter");
6
6
  import { logger } from "./logger.js";
7
7
  /**
8
- * OpenCode skill directory patterns (in order of priority)
8
+ * OpenCode skill directory patterns.
9
9
  *
10
- * Global paths:
11
- * - ~/.config/opencode/skill/<name>/SKILL.md
10
+ * User requirement: keep behavior aligned with current OpenCode skill discovery.
11
+ * During the 2026-04 parity audit, the archived `opencode-ai/opencode` repo did not
12
+ * contain the modern skill loader, so the authoritative reference was the live docs:
13
+ * https://opencode.ai/docs/skills/
14
+ *
15
+ * Official paths from current OpenCode docs:
12
16
  * - ~/.config/opencode/skills/<name>/SKILL.md
17
+ * - ~/.claude/skills/<name>/SKILL.md
18
+ * - ~/.agents/skills/<name>/SKILL.md
19
+ * - .opencode/skills/<name>/SKILL.md
20
+ * - .claude/skills/<name>/SKILL.md
21
+ * - .agents/skills/<name>/SKILL.md
13
22
  *
14
- * Project paths (higher priority):
23
+ * Compatibility paths we intentionally keep because this repo and local setup still use them:
24
+ * - ~/.config/opencode/skill/<name>/SKILL.md
15
25
  * - .opencode/skill/<name>/SKILL.md
16
- * - .opencode/skills/<name>/SKILL.md
17
- * - .claude/skills/<name>/SKILL.md (Claude Code compatibility)
26
+ *
27
+ * Compatibility paths are loaded before the official `.opencode/skills` variants so the
28
+ * documented OpenCode locations still win if both singular and plural exist side by side.
18
29
  */
19
- const GLOBAL_SKILL_DIRS = [
20
- join(homedir(), ".config", "opencode", "skill"),
21
- join(homedir(), ".config", "opencode", "skills"),
22
- ];
30
+ function getGlobalSkillDirs(homeDir = homedir()) {
31
+ return [
32
+ join(homeDir, ".config", "opencode", "skill"),
33
+ join(homeDir, ".config", "opencode", "skills"),
34
+ join(homeDir, ".claude", "skills"),
35
+ join(homeDir, ".agents", "skills"),
36
+ ];
37
+ }
23
38
  function getProjectSkillDirs(projectDir) {
24
39
  return [
25
40
  join(projectDir, ".opencode", "skill"),
26
41
  join(projectDir, ".opencode", "skills"),
27
42
  join(projectDir, ".claude", "skills"),
43
+ join(projectDir, ".agents", "skills"),
28
44
  ];
29
45
  }
46
+ async function exists(path) {
47
+ try {
48
+ await stat(path);
49
+ return true;
50
+ }
51
+ catch {
52
+ return false;
53
+ }
54
+ }
55
+ /**
56
+ * OpenCode walks upward from the current working directory until the git worktree.
57
+ * We mirror that so nested apps can inherit repo-root skills while still allowing
58
+ * closer directories to override farther ones.
59
+ */
60
+ async function getProjectSearchRoots(projectDir) {
61
+ const roots = [];
62
+ let dir = resolve(projectDir);
63
+ while (true) {
64
+ roots.push(dir);
65
+ if (await exists(join(dir, ".git"))) {
66
+ break;
67
+ }
68
+ const parent = dirname(dir);
69
+ if (parent === dir) {
70
+ break;
71
+ }
72
+ dir = parent;
73
+ }
74
+ return roots.reverse();
75
+ }
30
76
  /**
31
77
  * Loads all skills from global and project directories
32
78
  *
33
79
  * @param projectDir - Optional project directory path
80
+ * @param options - Test-only overrides for discovery roots
34
81
  * @returns A map of skill names (lowercase) to their SkillInfo
35
82
  */
36
- export async function loadSkills(projectDir) {
83
+ export async function loadSkills(projectDir, options = {}) {
37
84
  const skills = new Map();
38
85
  // Load from global directories first
39
- for (const dir of GLOBAL_SKILL_DIRS) {
86
+ for (const dir of getGlobalSkillDirs(options.homeDir)) {
40
87
  await loadFromDirectory(dir, skills, "global");
41
88
  }
42
- // Load from project directories (overrides global)
89
+ // Load from project directories from git root -> cwd so nearer paths override farther ones.
43
90
  if (projectDir) {
44
- for (const dir of getProjectSkillDirs(projectDir)) {
45
- await loadFromDirectory(dir, skills, "project");
91
+ for (const root of await getProjectSearchRoots(projectDir)) {
92
+ for (const dir of getProjectSkillDirs(root)) {
93
+ await loadFromDirectory(dir, skills, "project");
94
+ }
46
95
  }
47
96
  }
48
97
  logger.debug("Skills loaded", { count: skills.size });
@@ -1 +1 @@
1
- {"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skill-loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"skill-loader.js","sourceRoot":"","sources":["../../src/skill-loader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type SkillRegistry } from "./skill-loader.js";
2
+ import type { SnippetRegistry } from "./types.js";
3
+ export interface SkillLoadResult {
4
+ text: string;
5
+ payloads: string[];
6
+ }
7
+ export declare function expandSkillLoads(text: string, registry: SkillRegistry, snippets: SnippetRegistry, options: {
8
+ expandSkillTagsInContent: boolean;
9
+ extractInject: boolean;
10
+ }): Promise<SkillLoadResult>;
11
+ //# sourceMappingURL=skill-loading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loading.d.ts","sourceRoot":"","sources":["../../src/skill-loading.ts"],"names":[],"mappings":"AAMA,OAAO,EAA4B,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEjF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAIlD,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAUD,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,aAAa,EACvB,QAAQ,EAAE,eAAe,EACzB,OAAO,EAAE;IACP,wBAAwB,EAAE,OAAO,CAAC;IAClC,aAAa,EAAE,OAAO,CAAC;CACxB,GACA,OAAO,CAAC,eAAe,CAAC,CAsC1B"}
@@ -0,0 +1,122 @@
1
+ import { readdir } from "node:fs/promises";
2
+ import { dirname, resolve } from "node:path";
3
+ import { pathToFileURL } from "node:url";
4
+ import { PATTERNS } from "./constants.js";
5
+ import { assembleMessage, expandHashtags } from "./expander.js";
6
+ import { logger } from "./logger.js";
7
+ import { getSkill } from "./skill-loader.js";
8
+ import { expandSkillTags } from "./skill-renderer.js";
9
+ const SKILL_FILE_LIMIT = 10;
10
+ function visibleSkillLoad(skill) {
11
+ return `↳ Loaded ${skill.name}`;
12
+ }
13
+ function pluginNote(skill, marker) {
14
+ return `Plugin note: \`${marker}\` is not instruction. Do not call \`skill\` again for ${skill.name}.`;
15
+ }
16
+ export async function expandSkillLoads(text, registry, snippets, options) {
17
+ PATTERNS.SKILL_LOAD.lastIndex = 0;
18
+ const matches = [...text.matchAll(PATTERNS.SKILL_LOAD)];
19
+ if (matches.length === 0) {
20
+ return { text, payloads: [] };
21
+ }
22
+ let result = "";
23
+ let lastIndex = 0;
24
+ const payloads = [];
25
+ for (const match of matches) {
26
+ const index = match.index ?? 0;
27
+ const token = match[0];
28
+ const parsed = parseSkillName(match[1]);
29
+ result += text.slice(lastIndex, index);
30
+ lastIndex = index + token.length;
31
+ if (!parsed) {
32
+ result += token;
33
+ continue;
34
+ }
35
+ const skill = getSkill(registry, parsed);
36
+ if (!skill) {
37
+ logger.warn(`Skill not found: '${parsed}', leaving syntax unchanged`);
38
+ result += token;
39
+ continue;
40
+ }
41
+ const marker = visibleSkillLoad(skill);
42
+ payloads.push(await buildSkillPayload(skill, registry, snippets, marker, options));
43
+ result += marker;
44
+ }
45
+ result += text.slice(lastIndex);
46
+ return { text: result, payloads };
47
+ }
48
+ function parseSkillName(input) {
49
+ if (!input)
50
+ return null;
51
+ const trimmed = input.trim();
52
+ if (!trimmed)
53
+ return null;
54
+ const quote = trimmed[0];
55
+ if ((quote === '"' || quote === "'") && trimmed.at(-1) === quote) {
56
+ const inner = trimmed.slice(1, -1).trim();
57
+ return inner || null;
58
+ }
59
+ return trimmed;
60
+ }
61
+ async function buildSkillPayload(skill, registry, snippets, marker, options) {
62
+ const dir = dirname(skill.filePath);
63
+ const base = pathToFileURL(dir).href;
64
+ const files = await listSkillFiles(dir, SKILL_FILE_LIMIT);
65
+ const content = renderSkillContent(skill.content, registry, snippets, options);
66
+ return [
67
+ `<skill_content name="${skill.name}">`,
68
+ // User requirement: repeat the exact visible marker in hidden context so the
69
+ // model treats `↳ Loaded ...` as already-resolved state, not as a new tool request.
70
+ pluginNote(skill, marker),
71
+ "",
72
+ `# Skill: ${skill.name}`,
73
+ "",
74
+ content,
75
+ "",
76
+ `Base directory for this skill: ${base}`,
77
+ "Relative paths in this skill (e.g., scripts/, reference/) are relative to this base directory.",
78
+ "Note: file list is sampled.",
79
+ "",
80
+ "<skill_files>",
81
+ files.map((file) => `<file>${file}</file>`).join("\n"),
82
+ "</skill_files>",
83
+ "</skill_content>",
84
+ ].join("\n");
85
+ }
86
+ function renderSkillContent(content, registry, snippets, options) {
87
+ let processed = content;
88
+ if (options.expandSkillTagsInContent) {
89
+ processed = expandSkillTags(processed, registry);
90
+ }
91
+ const expandOptions = {
92
+ extractInject: options.extractInject,
93
+ };
94
+ return assembleMessage(expandHashtags(processed, snippets, new Map(), expandOptions));
95
+ }
96
+ async function listSkillFiles(dir, limit) {
97
+ const files = [];
98
+ await walkSkillFiles(dir, files, limit);
99
+ return files;
100
+ }
101
+ async function walkSkillFiles(dir, files, limit) {
102
+ if (files.length >= limit)
103
+ return;
104
+ const entries = await readdir(dir, { withFileTypes: true, encoding: "utf8" }).catch(() => null);
105
+ if (!entries)
106
+ return;
107
+ for (const entry of entries.toSorted((a, b) => a.name.localeCompare(b.name))) {
108
+ if (files.length >= limit)
109
+ return;
110
+ const filePath = resolve(dir, entry.name);
111
+ if (entry.isDirectory()) {
112
+ await walkSkillFiles(filePath, files, limit);
113
+ continue;
114
+ }
115
+ if (!entry.isFile())
116
+ continue;
117
+ if (filePath.includes("SKILL.md"))
118
+ continue;
119
+ files.push(filePath);
120
+ }
121
+ }
122
+ //# sourceMappingURL=skill-loading.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-loading.js","sourceRoot":"","sources":["../../src/skill-loading.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAsB,cAAc,EAAE,MAAM,eAAe,CAAC;AACpF,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAsC,MAAM,mBAAmB,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAGtD,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAO5B,SAAS,gBAAgB,CAAC,KAAgB;IACxC,OAAO,YAAY,KAAK,CAAC,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,KAAgB,EAAE,MAAc;IAClD,OAAO,kBAAkB,MAAM,0DAA0D,KAAK,CAAC,IAAI,GAAG,CAAC;AACzG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,QAAuB,EACvB,QAAyB,EACzB,OAGC;IAED,QAAQ,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC;IACxD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,MAAM,QAAQ,GAAa,EAAE,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QAExC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACvC,SAAS,GAAG,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;QAEjC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC;YAChB,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,CAAC,IAAI,CAAC,qBAAqB,MAAM,6BAA6B,CAAC,CAAC;YACtE,MAAM,IAAI,KAAK,CAAC;YAChB,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvC,QAAQ,CAAC,IAAI,CAAC,MAAM,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QACnF,MAAM,IAAI,MAAM,CAAC;IACnB,CAAC;IAED,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpC,CAAC;AAED,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,IAAI,CAAC,KAAK,KAAK,GAAG,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,KAAK,EAAE,CAAC;QACjE,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,OAAO,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,KAAgB,EAChB,QAAuB,EACvB,QAAyB,EACzB,MAAc,EACd,OAGC;IAED,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;IACrC,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE/E,OAAO;QACL,wBAAwB,KAAK,CAAC,IAAI,IAAI;QACtC,6EAA6E;QAC7E,oFAAoF;QACpF,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC;QACzB,EAAE;QACF,YAAY,KAAK,CAAC,IAAI,EAAE;QACxB,EAAE;QACF,OAAO;QACP,EAAE;QACF,kCAAkC,IAAI,EAAE;QACxC,gGAAgG;QAChG,6BAA6B;QAC7B,EAAE;QACF,eAAe;QACf,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,IAAI,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACtD,gBAAgB;QAChB,kBAAkB;KACnB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAe,EACf,QAAuB,EACvB,QAAyB,EACzB,OAGC;IAED,IAAI,SAAS,GAAG,OAAO,CAAC;IACxB,IAAI,OAAO,CAAC,wBAAwB,EAAE,CAAC;QACrC,SAAS,GAAG,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,aAAa,GAAkB;QACnC,aAAa,EAAE,OAAO,CAAC,aAAa;KACrC,CAAC;IAEF,OAAO,eAAe,CAAC,cAAc,CAAC,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,aAAa,CAAC,CAAC,CAAC;AACxF,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,KAAa;IACtD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACxC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,GAAW,EAAE,KAAe,EAAE,KAAa;IACvE,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO;IAElC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChG,IAAI,CAAC,OAAO;QAAE,OAAO;IAErB,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC7E,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;YAAE,OAAO;QAElC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,cAAc,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC7C,SAAS;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;YAAE,SAAS;QAC9B,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC;YAAE,SAAS;QAC5C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
@@ -1,9 +1,11 @@
1
+ import type { SkillInfo } from "./skill-loader.js";
1
2
  import type { SnippetInfo } from "./types.js";
2
3
  export interface HighlightPart {
3
4
  text: string;
4
5
  match: boolean;
5
6
  }
6
7
  export declare function filterSnippets(snippets: SnippetInfo[], query: string): SnippetInfo[];
8
+ export declare function filterSkills(skills: SkillInfo[], query: string): SkillInfo[];
7
9
  export declare function matchedAliases(snippet: SnippetInfo, query: string): string[];
8
10
  export declare function snippetDescription(snippet: SnippetInfo): string;
9
11
  export declare function highlightMatches(input: string, query: string): HighlightPart[];
@@ -1 +1 @@
1
- {"version":3,"file":"tui-search.d.ts","sourceRoot":"","sources":["../../src/tui-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AA0BD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAgBpF;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAK5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAE/D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CA0B9E"}
1
+ {"version":3,"file":"tui-search.d.ts","sourceRoot":"","sources":["../../src/tui-search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;CAChB;AA+DD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAgBpF;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,CAgB5E;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAK5E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,WAAW,GAAG,MAAM,CAE/D;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,aAAa,EAAE,CA0B9E"}
@@ -1,30 +1,58 @@
1
- function scoreSnippet(snippet, query) {
2
- if (!query)
3
- return 0;
1
+ function normalizeSearchText(input) {
2
+ return input.toLowerCase().replace(/[^a-z0-9]/g, "");
3
+ }
4
+ function scoreText(input, query) {
5
+ const raw = input.toLowerCase();
4
6
  const needle = query.toLowerCase();
5
- const name = snippet.name.toLowerCase();
6
- const aliases = snippet.aliases.map((alias) => alias.toLowerCase());
7
- const description = (snippet.description || "").toLowerCase();
8
- if (name === needle)
7
+ const compact = normalizeSearchText(input);
8
+ const compactNeedle = normalizeSearchText(query);
9
+ if (raw === needle)
9
10
  return 0;
10
- if (aliases.includes(needle))
11
+ if (compactNeedle && compact === compactNeedle)
11
12
  return 1;
12
- if (name.startsWith(needle))
13
+ if (raw.startsWith(needle))
13
14
  return 2;
14
- if (aliases.some((alias) => alias.startsWith(needle)))
15
+ if (compactNeedle && compact.startsWith(compactNeedle))
15
16
  return 3;
16
- if (name.includes(needle))
17
+ if (raw.includes(needle))
17
18
  return 4;
18
- if (aliases.some((alias) => alias.includes(needle)))
19
+ if (compactNeedle && compact.includes(compactNeedle))
19
20
  return 5;
21
+ return Number.POSITIVE_INFINITY;
22
+ }
23
+ function scoreSnippet(snippet, query) {
24
+ if (!query)
25
+ return 0;
26
+ const description = (snippet.description || "").toLowerCase();
27
+ const score = Math.min(scoreText(snippet.name, query), ...snippet.aliases.map((alias) => scoreText(alias, query)));
28
+ if (Number.isFinite(score))
29
+ return score;
30
+ const needle = query.toLowerCase();
20
31
  if (description.startsWith(needle))
21
32
  return 6;
22
33
  if (description.includes(needle))
23
34
  return 7;
24
35
  return Number.POSITIVE_INFINITY;
25
36
  }
26
- function sourceRank(snippet) {
27
- return snippet.source === "project" ? 0 : 1;
37
+ function sourceRank(item) {
38
+ return item.source === "project" ? 0 : 1;
39
+ }
40
+ function skillTag(skill) {
41
+ return `skill(${skill.name})`;
42
+ }
43
+ function scoreSkill(skill, query) {
44
+ if (!query)
45
+ return 0;
46
+ const description = (skill.description || "").toLowerCase();
47
+ const score = Math.min(scoreText(skill.name, query), scoreText(skillTag(skill), query));
48
+ if (Number.isFinite(score))
49
+ return score;
50
+ const needle = query.toLowerCase();
51
+ if (description.startsWith(needle))
52
+ return 6;
53
+ if (description.includes(needle))
54
+ return 7;
55
+ return Number.POSITIVE_INFINITY;
28
56
  }
29
57
  export function filterSnippets(snippets, query) {
30
58
  return [...snippets]
@@ -43,11 +71,28 @@ export function filterSnippets(snippets, query) {
43
71
  })
44
72
  .map((item) => item.snippet);
45
73
  }
74
+ export function filterSkills(skills, query) {
75
+ return [...skills]
76
+ .map((skill) => ({
77
+ skill,
78
+ score: scoreSkill(skill, query.trim()),
79
+ }))
80
+ .filter((item) => Number.isFinite(item.score))
81
+ .sort((a, b) => {
82
+ if (a.score !== b.score)
83
+ return a.score - b.score;
84
+ const sourceDiff = sourceRank(a.skill) - sourceRank(b.skill);
85
+ if (sourceDiff !== 0)
86
+ return sourceDiff;
87
+ return a.skill.name.localeCompare(b.skill.name);
88
+ })
89
+ .map((item) => item.skill);
90
+ }
46
91
  export function matchedAliases(snippet, query) {
47
- const needle = query.trim().toLowerCase();
92
+ const needle = query.trim();
48
93
  if (!needle)
49
94
  return [];
50
- return snippet.aliases.filter((alias) => alias.toLowerCase().includes(needle));
95
+ return snippet.aliases.filter((alias) => Number.isFinite(scoreText(alias, needle)));
51
96
  }
52
97
  export function snippetDescription(snippet) {
53
98
  return (snippet.description || snippet.content).replace(/\s+/g, " ").trim();
@@ -1 +1 @@
1
- {"version":3,"file":"tui-search.js","sourceRoot":"","sources":["../../src/tui-search.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tui-search.js","sourceRoot":"","sources":["../../src/tui-search.ts"],"names":[],"mappings":"AAQA,SAAS,mBAAmB,CAAC,KAAa;IACxC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,SAAS,CAAC,KAAa,EAAE,KAAa;IAC7C,MAAM,GAAG,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAChC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAC3C,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAEjD,IAAI,GAAG,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IAC7B,IAAI,aAAa,IAAI,OAAO,KAAK,aAAa;QAAE,OAAO,CAAC,CAAC;IACzD,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IACrC,IAAI,aAAa,IAAI,OAAO,CAAC,UAAU,CAAC,aAAa,CAAC;QAAE,OAAO,CAAC,CAAC;IACjE,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IACnC,IAAI,aAAa,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC;QAAE,OAAO,CAAC,CAAC;IAE/D,OAAO,MAAM,CAAC,iBAAiB,CAAC;AAClC,CAAC;AAED,SAAS,YAAY,CAAC,OAAoB,EAAE,KAAa;IACvD,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IAErB,MAAM,WAAW,GAAG,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC9D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CACpB,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAC9B,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAC3D,CAAC;IAEF,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEzC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IAE3C,OAAO,MAAM,CAAC,iBAAiB,CAAC;AAClC,CAAC;AAED,SAAS,UAAU,CAAC,IAAsC;IACxD,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,QAAQ,CAAC,KAAgB;IAChC,OAAO,SAAS,KAAK,CAAC,IAAI,GAAG,CAAC;AAChC,CAAC;AAED,SAAS,UAAU,CAAC,KAAgB,EAAE,KAAa;IACjD,IAAI,CAAC,KAAK;QAAE,OAAO,CAAC,CAAC;IAErB,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC;IAExF,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEzC,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACnC,IAAI,WAAW,CAAC,UAAU,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IAC7C,IAAI,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC;QAAE,OAAO,CAAC,CAAC;IAE3C,OAAO,MAAM,CAAC,iBAAiB,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,QAAuB,EAAE,KAAa;IACnE,OAAO,CAAC,GAAG,QAAQ,CAAC;SACjB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACjB,OAAO;QACP,KAAK,EAAE,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;KAC3C,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QAElD,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;QACjE,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QAExC,OAAO,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,MAAmB,EAAE,KAAa;IAC7D,OAAO,CAAC,GAAG,MAAM,CAAC;SACf,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACf,KAAK;QACL,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;KACvC,CAAC,CAAC;SACF,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAC7C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,IAAI,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;QAElD,MAAM,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;QAC7D,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QAExC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAClD,CAAC,CAAC;SACD,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAoB,EAAE,KAAa;IAChE,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAEvB,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACtF,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAAoB;IACrD,OAAO,CAAC,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,KAAa;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC1C,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAEpD,MAAM,QAAQ,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IACrC,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,OAAO,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC9C,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;YACjB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,MAAM;QACR,CAAC;QAED,IAAI,KAAK,GAAG,KAAK,EAAE,CAAC;YAClB,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,MAAM,GAAG,GAAG,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3D,KAAK,GAAG,GAAG,CAAC;IACd,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC/D,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -8,7 +8,9 @@ export interface HashtagTriggerMatch {
8
8
  export declare function findTrailingHashtagTrigger(input: string): HashtagTriggerMatch | undefined;
9
9
  export declare function replaceTrailingHashtag(input: string, name: string): string | undefined;
10
10
  export declare function insertSnippetTag(input: string, name: string): string;
11
+ export declare function insertSkillLoad(input: string, name: string): string;
11
12
  export declare function preferredSnippetTag(input: string, item: Pick<SnippetInfo, "name" | "aliases">): string;
12
13
  export declare function insertSnippetTrigger(input: string): string;
14
+ export declare function stepSelection(current: number, total: number, delta: -1 | 1): number;
13
15
  export declare function truncateSnippetPreview(input: string, max?: number): string;
14
16
  //# sourceMappingURL=tui-trigger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tui-trigger.d.ts","sourceRoot":"","sources":["../../src/tui-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAazF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKtF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAQpE;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C,MAAM,CAKR;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,MAAM,CAKvE"}
1
+ {"version":3,"file":"tui-trigger.d.ts","sourceRoot":"","sources":["../../src/tui-trigger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,mBAAmB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,MAAM,GAAG,mBAAmB,GAAG,SAAS,CAazF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKtF;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAQpE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAWnE;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,IAAI,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC,GAC1C,MAAM,CAKR;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAO1D;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAQnF;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAM,GAAG,MAAM,CAKvE"}
@@ -28,6 +28,18 @@ export function insertSnippetTag(input, name) {
28
28
  return `${input}#${name} `;
29
29
  return `${input} #${name} `;
30
30
  }
31
+ export function insertSkillLoad(input, name) {
32
+ const match = findTrailingHashtagTrigger(input);
33
+ const load = `#skill(${name}) `;
34
+ if (match) {
35
+ return `${input.slice(0, match.start)}${load}`;
36
+ }
37
+ if (!input)
38
+ return load;
39
+ if (/\s$/.test(input))
40
+ return `${input}${load}`;
41
+ return `${input} ${load}`;
42
+ }
31
43
  export function preferredSnippetTag(input, item) {
32
44
  const query = findTrailingHashtagTrigger(input)?.query.trim();
33
45
  if (!query)
@@ -43,6 +55,16 @@ export function insertSnippetTrigger(input) {
43
55
  return `${input}#`;
44
56
  return `${input} #`;
45
57
  }
58
+ export function stepSelection(current, total, delta) {
59
+ if (total <= 0)
60
+ return 0;
61
+ const next = current + delta;
62
+ if (next < 0)
63
+ return 0;
64
+ if (next >= total)
65
+ return total - 1;
66
+ return next;
67
+ }
46
68
  export function truncateSnippetPreview(input, max = 140) {
47
69
  const text = input.replace(/\s+/g, " ").trim();
48
70
  if (text.length <= max)
@@ -1 +1 @@
1
- {"version":3,"file":"tui-trigger.js","sourceRoot":"","sources":["../../src/tui-trigger.ts"],"names":[],"mappings":"AASA,MAAM,eAAe,GAAG,mBAAmB,CAAC;AAE5C,MAAM,UAAU,0BAA0B,CAAC,KAAa;IACtD,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG;QAAE,OAAO;IAEjB,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IAE1B,OAAO;QACL,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM;QAClC,GAAG,EAAE,KAAK,CAAC,MAAM;QACjB,KAAK;QACL,KAAK;KACN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,IAAY;IAChE,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,CAAC,CAAC;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO;IAEnB,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAa,EAAE,IAAY;IAC1D,MAAM,QAAQ,GAAG,sBAAsB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACrD,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAE9B,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,IAAI,GAAG,CAAC;IAC/B,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC;IAElD,OAAO,GAAG,KAAK,KAAK,IAAI,GAAG,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,KAAa,EACb,IAA2C;IAE3C,MAAM,KAAK,GAAG,0BAA0B,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;IAC9D,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IAE7B,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,IAAI,0BAA0B,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEpD,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,CAAC;IACvB,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,KAAK,GAAG,CAAC;IAE1C,OAAO,GAAG,KAAK,IAAI,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,KAAa,EAAE,GAAG,GAAG,GAAG;IAC7D,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,IAAI,CAAC;IAEpC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC;AAClD,CAAC"}
1
+ {"version":3,"file":"tui-trigger.js","sourceRoot":"","sources":["../../src/tui-trigger.ts"],"names":[],"mappings":"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"}
package/dist/tui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../tui.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,eAAe,EAGhB,MAAM,yBAAyB,CAAC;AAqqBjC,QAAA,MAAM,MAAM,EAAE,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAG3C,CAAC;AAEF,eAAe,MAAM,CAAC"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../tui.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,eAAe,EAGhB,MAAM,yBAAyB,CAAC;AA2vBjC,QAAA,MAAM,MAAM,EAAE,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAG3C,CAAC;AAEF,eAAe,MAAM,CAAC"}