@ashx-j/lunr 0.2.12 → 0.2.13

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 (43) hide show
  1. package/CHANGELOG.md +7 -1
  2. package/dist/catalog/models.json +1 -1
  3. package/dist/catalog/providers/cloudflare-workers-ai.json +1 -1
  4. package/dist/catalog/providers/fireworks.json +1 -1
  5. package/dist/catalog/providers/opencode-go.json +1 -1
  6. package/dist/catalog/providers/opencode.json +1 -1
  7. package/dist/catalog/providers/openrouter.json +1 -1
  8. package/dist/catalog/providers/together.json +1 -1
  9. package/dist/catalog/publication.json +3 -3
  10. package/dist/core/context-breakdown.d.ts +3 -1
  11. package/dist/core/context-breakdown.d.ts.map +1 -1
  12. package/dist/core/context-breakdown.js +5 -2
  13. package/dist/core/context-breakdown.js.map +1 -1
  14. package/dist/core/settings-manager.d.ts +7 -0
  15. package/dist/core/settings-manager.d.ts.map +1 -1
  16. package/dist/core/settings-manager.js +13 -0
  17. package/dist/core/settings-manager.js.map +1 -1
  18. package/dist/index.d.ts +1 -1
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  22. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  23. package/dist/modes/interactive/components/settings-selector.js +105 -89
  24. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  25. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  26. package/dist/modes/interactive/interactive-mode.js +16 -3
  27. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  28. package/dist/modes/interactive/skill-tag-autocomplete.d.ts +13 -0
  29. package/dist/modes/interactive/skill-tag-autocomplete.d.ts.map +1 -0
  30. package/dist/modes/interactive/skill-tag-autocomplete.js +72 -0
  31. package/dist/modes/interactive/skill-tag-autocomplete.js.map +1 -0
  32. package/docs/settings.md +1 -0
  33. package/docs/skills.md +10 -0
  34. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  35. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  36. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  37. package/examples/extensions/gondolin/package-lock.json +2 -2
  38. package/examples/extensions/gondolin/package.json +1 -1
  39. package/examples/extensions/sandbox/package-lock.json +2 -2
  40. package/examples/extensions/sandbox/package.json +1 -1
  41. package/examples/extensions/with-deps/package-lock.json +2 -2
  42. package/examples/extensions/with-deps/package.json +1 -1
  43. package/package.json +4 -4
@@ -0,0 +1,13 @@
1
+ import { type AutocompleteProvider } from "@ashx-j/lunr-tui";
2
+ import type { SkillTagCharacter } from "../../core/settings-manager.ts";
3
+ export interface SkillTagAutocompleteSkill {
4
+ name: string;
5
+ description?: string;
6
+ }
7
+ export interface WrapSkillTagAutocompleteOptions {
8
+ character: SkillTagCharacter;
9
+ skills: readonly SkillTagAutocompleteSkill[];
10
+ }
11
+ export declare function extractSkillTagPrefix(textBeforeCursor: string, character: SkillTagCharacter): string | null;
12
+ export declare function wrapSkillTagAutocomplete(inner: AutocompleteProvider, options: WrapSkillTagAutocompleteOptions): AutocompleteProvider;
13
+ //# sourceMappingURL=skill-tag-autocomplete.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-tag-autocomplete.d.ts","sourceRoot":"","sources":["../../../src/modes/interactive/skill-tag-autocomplete.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,oBAAoB,EAGzB,MAAM,wBAAwB,CAAC;AAChC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AAExE,MAAM,WAAW,yBAAyB;IACzC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,+BAA+B;IAC/C,SAAS,EAAE,iBAAiB,CAAC;IAC7B,MAAM,EAAE,SAAS,yBAAyB,EAAE,CAAC;CAC7C;AAED,wBAAgB,qBAAqB,CAAC,gBAAgB,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,GAAG,MAAM,GAAG,IAAI,CAsB3G;AAED,wBAAgB,wBAAwB,CACvC,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,+BAA+B,GACtC,oBAAoB,CAoDtB","sourcesContent":["import {\n\ttype AutocompleteItem,\n\ttype AutocompleteProvider,\n\ttype AutocompleteSuggestions,\n\tfuzzyFilter,\n} from \"@ashx-j/lunr-tui\";\nimport type { SkillTagCharacter } from \"../../core/settings-manager.ts\";\n\nexport interface SkillTagAutocompleteSkill {\n\tname: string;\n\tdescription?: string;\n}\n\nexport interface WrapSkillTagAutocompleteOptions {\n\tcharacter: SkillTagCharacter;\n\tskills: readonly SkillTagAutocompleteSkill[];\n}\n\nexport function extractSkillTagPrefix(textBeforeCursor: string, character: SkillTagCharacter): string | null {\n\tif (textBeforeCursor.trimStart().startsWith(\"/\")) {\n\t\treturn null;\n\t}\n\n\tlet tokenStart = 0;\n\tfor (let i = textBeforeCursor.length - 1; i >= 0; i--) {\n\t\tconst ch = textBeforeCursor[i];\n\t\tif (ch === \" \" || ch === \"\\t\") {\n\t\t\ttokenStart = i + 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst token = textBeforeCursor.slice(tokenStart);\n\tif (!token.startsWith(character)) {\n\t\treturn null;\n\t}\n\tif (character === \"~\" && (token.startsWith(\"~/\") || token.startsWith(\"~\\\\\"))) {\n\t\treturn null;\n\t}\n\treturn token;\n}\n\nexport function wrapSkillTagAutocomplete(\n\tinner: AutocompleteProvider,\n\toptions: WrapSkillTagAutocompleteOptions,\n): AutocompleteProvider {\n\tconst triggerCharacters = [...new Set([options.character, ...(inner.triggerCharacters ?? [])])];\n\n\treturn {\n\t\ttriggerCharacters,\n\t\tasync getSuggestions(lines, cursorLine, cursorCol, suggestionOptions): Promise<AutocompleteSuggestions | null> {\n\t\t\tconst currentLine = lines[cursorLine] || \"\";\n\t\t\tconst textBeforeCursor = currentLine.slice(0, cursorCol);\n\t\t\tconst prefix = extractSkillTagPrefix(textBeforeCursor, options.character);\n\t\t\tif (prefix === null) {\n\t\t\t\treturn inner.getSuggestions(lines, cursorLine, cursorCol, suggestionOptions);\n\t\t\t}\n\n\t\t\tconst query = prefix.slice(options.character.length);\n\t\t\tconst filtered = fuzzyFilter([...options.skills], query, (skill) => skill.name);\n\t\t\tif (filtered.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tprefix,\n\t\t\t\titems: filtered.map((skill) => {\n\t\t\t\t\tconst item: AutocompleteItem = {\n\t\t\t\t\t\tvalue: `${options.character}${skill.name}`,\n\t\t\t\t\t\tlabel: skill.name,\n\t\t\t\t\t};\n\t\t\t\t\tif (skill.description) {\n\t\t\t\t\t\titem.description = skill.description;\n\t\t\t\t\t}\n\t\t\t\t\treturn item;\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\tapplyCompletion(lines, cursorLine, cursorCol, item, prefix) {\n\t\t\tif (!prefix.startsWith(options.character)) {\n\t\t\t\treturn inner.applyCompletion(lines, cursorLine, cursorCol, item, prefix);\n\t\t\t}\n\n\t\t\tconst currentLine = lines[cursorLine] || \"\";\n\t\t\tconst beforePrefix = currentLine.slice(0, Math.max(0, cursorCol - prefix.length));\n\t\t\tconst afterCursor = currentLine.slice(cursorCol);\n\t\t\tconst completed = `${item.value} `;\n\t\t\tconst newLines = [...lines];\n\t\t\tnewLines[cursorLine] = `${beforePrefix}${completed}${afterCursor}`;\n\t\t\treturn {\n\t\t\t\tlines: newLines,\n\t\t\t\tcursorLine,\n\t\t\t\tcursorCol: beforePrefix.length + completed.length,\n\t\t\t};\n\t\t},\n\t\tshouldTriggerFileCompletion: inner.shouldTriggerFileCompletion?.bind(inner),\n\t};\n}\n"]}
@@ -0,0 +1,72 @@
1
+ import { fuzzyFilter, } from "@ashx-j/lunr-tui";
2
+ export function extractSkillTagPrefix(textBeforeCursor, character) {
3
+ if (textBeforeCursor.trimStart().startsWith("/")) {
4
+ return null;
5
+ }
6
+ let tokenStart = 0;
7
+ for (let i = textBeforeCursor.length - 1; i >= 0; i--) {
8
+ const ch = textBeforeCursor[i];
9
+ if (ch === " " || ch === "\t") {
10
+ tokenStart = i + 1;
11
+ break;
12
+ }
13
+ }
14
+ const token = textBeforeCursor.slice(tokenStart);
15
+ if (!token.startsWith(character)) {
16
+ return null;
17
+ }
18
+ if (character === "~" && (token.startsWith("~/") || token.startsWith("~\\"))) {
19
+ return null;
20
+ }
21
+ return token;
22
+ }
23
+ export function wrapSkillTagAutocomplete(inner, options) {
24
+ const triggerCharacters = [...new Set([options.character, ...(inner.triggerCharacters ?? [])])];
25
+ return {
26
+ triggerCharacters,
27
+ async getSuggestions(lines, cursorLine, cursorCol, suggestionOptions) {
28
+ const currentLine = lines[cursorLine] || "";
29
+ const textBeforeCursor = currentLine.slice(0, cursorCol);
30
+ const prefix = extractSkillTagPrefix(textBeforeCursor, options.character);
31
+ if (prefix === null) {
32
+ return inner.getSuggestions(lines, cursorLine, cursorCol, suggestionOptions);
33
+ }
34
+ const query = prefix.slice(options.character.length);
35
+ const filtered = fuzzyFilter([...options.skills], query, (skill) => skill.name);
36
+ if (filtered.length === 0) {
37
+ return null;
38
+ }
39
+ return {
40
+ prefix,
41
+ items: filtered.map((skill) => {
42
+ const item = {
43
+ value: `${options.character}${skill.name}`,
44
+ label: skill.name,
45
+ };
46
+ if (skill.description) {
47
+ item.description = skill.description;
48
+ }
49
+ return item;
50
+ }),
51
+ };
52
+ },
53
+ applyCompletion(lines, cursorLine, cursorCol, item, prefix) {
54
+ if (!prefix.startsWith(options.character)) {
55
+ return inner.applyCompletion(lines, cursorLine, cursorCol, item, prefix);
56
+ }
57
+ const currentLine = lines[cursorLine] || "";
58
+ const beforePrefix = currentLine.slice(0, Math.max(0, cursorCol - prefix.length));
59
+ const afterCursor = currentLine.slice(cursorCol);
60
+ const completed = `${item.value} `;
61
+ const newLines = [...lines];
62
+ newLines[cursorLine] = `${beforePrefix}${completed}${afterCursor}`;
63
+ return {
64
+ lines: newLines,
65
+ cursorLine,
66
+ cursorCol: beforePrefix.length + completed.length,
67
+ };
68
+ },
69
+ shouldTriggerFileCompletion: inner.shouldTriggerFileCompletion?.bind(inner),
70
+ };
71
+ }
72
+ //# sourceMappingURL=skill-tag-autocomplete.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-tag-autocomplete.js","sourceRoot":"","sources":["../../../src/modes/interactive/skill-tag-autocomplete.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n\ttype AutocompleteItem,\n\ttype AutocompleteProvider,\n\ttype AutocompleteSuggestions,\n\tfuzzyFilter,\n} from \"@ashx-j/lunr-tui\";\nimport type { SkillTagCharacter } from \"../../core/settings-manager.ts\";\n\nexport interface SkillTagAutocompleteSkill {\n\tname: string;\n\tdescription?: string;\n}\n\nexport interface WrapSkillTagAutocompleteOptions {\n\tcharacter: SkillTagCharacter;\n\tskills: readonly SkillTagAutocompleteSkill[];\n}\n\nexport function extractSkillTagPrefix(textBeforeCursor: string, character: SkillTagCharacter): string | null {\n\tif (textBeforeCursor.trimStart().startsWith(\"/\")) {\n\t\treturn null;\n\t}\n\n\tlet tokenStart = 0;\n\tfor (let i = textBeforeCursor.length - 1; i >= 0; i--) {\n\t\tconst ch = textBeforeCursor[i];\n\t\tif (ch === \" \" || ch === \"\\t\") {\n\t\t\ttokenStart = i + 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tconst token = textBeforeCursor.slice(tokenStart);\n\tif (!token.startsWith(character)) {\n\t\treturn null;\n\t}\n\tif (character === \"~\" && (token.startsWith(\"~/\") || token.startsWith(\"~\\\\\"))) {\n\t\treturn null;\n\t}\n\treturn token;\n}\n\nexport function wrapSkillTagAutocomplete(\n\tinner: AutocompleteProvider,\n\toptions: WrapSkillTagAutocompleteOptions,\n): AutocompleteProvider {\n\tconst triggerCharacters = [...new Set([options.character, ...(inner.triggerCharacters ?? [])])];\n\n\treturn {\n\t\ttriggerCharacters,\n\t\tasync getSuggestions(lines, cursorLine, cursorCol, suggestionOptions): Promise<AutocompleteSuggestions | null> {\n\t\t\tconst currentLine = lines[cursorLine] || \"\";\n\t\t\tconst textBeforeCursor = currentLine.slice(0, cursorCol);\n\t\t\tconst prefix = extractSkillTagPrefix(textBeforeCursor, options.character);\n\t\t\tif (prefix === null) {\n\t\t\t\treturn inner.getSuggestions(lines, cursorLine, cursorCol, suggestionOptions);\n\t\t\t}\n\n\t\t\tconst query = prefix.slice(options.character.length);\n\t\t\tconst filtered = fuzzyFilter([...options.skills], query, (skill) => skill.name);\n\t\t\tif (filtered.length === 0) {\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\treturn {\n\t\t\t\tprefix,\n\t\t\t\titems: filtered.map((skill) => {\n\t\t\t\t\tconst item: AutocompleteItem = {\n\t\t\t\t\t\tvalue: `${options.character}${skill.name}`,\n\t\t\t\t\t\tlabel: skill.name,\n\t\t\t\t\t};\n\t\t\t\t\tif (skill.description) {\n\t\t\t\t\t\titem.description = skill.description;\n\t\t\t\t\t}\n\t\t\t\t\treturn item;\n\t\t\t\t}),\n\t\t\t};\n\t\t},\n\t\tapplyCompletion(lines, cursorLine, cursorCol, item, prefix) {\n\t\t\tif (!prefix.startsWith(options.character)) {\n\t\t\t\treturn inner.applyCompletion(lines, cursorLine, cursorCol, item, prefix);\n\t\t\t}\n\n\t\t\tconst currentLine = lines[cursorLine] || \"\";\n\t\t\tconst beforePrefix = currentLine.slice(0, Math.max(0, cursorCol - prefix.length));\n\t\t\tconst afterCursor = currentLine.slice(cursorCol);\n\t\t\tconst completed = `${item.value} `;\n\t\t\tconst newLines = [...lines];\n\t\t\tnewLines[cursorLine] = `${beforePrefix}${completed}${afterCursor}`;\n\t\t\treturn {\n\t\t\t\tlines: newLines,\n\t\t\t\tcursorLine,\n\t\t\t\tcursorCol: beforePrefix.length + completed.length,\n\t\t\t};\n\t\t},\n\t\tshouldTriggerFileCompletion: inner.shouldTriggerFileCompletion?.bind(inner),\n\t};\n}\n"]}
package/docs/settings.md CHANGED
@@ -265,6 +265,7 @@ Paths in `~/.lunr/agent/settings.json` resolve relative to `~/.lunr/agent`. Path
265
265
  | `prompts` | string[] | `[]` | Local prompt template paths or directories |
266
266
  | `themes` | string[] | `[]` | Local theme file paths or directories |
267
267
  | `enableSkillCommands` | boolean | `true` | Register skills as `/skill:name` commands |
268
+ | `skillTagCharacter` | `"+" \| "~" \| "$"` | `"+"` | Character that lists skills mid-message after a space |
268
269
 
269
270
  Arrays support glob patterns and exclusions. Use `!pattern` to exclude. Use `+path` to force-include an exact path and `-path` to force-exclude an exact path.
270
271
 
package/docs/skills.md CHANGED
@@ -89,6 +89,16 @@ Toggle skill commands via `/settings` in interactive mode or in `settings.json`:
89
89
  }
90
90
  ```
91
91
 
92
+ ### Skill tags
93
+
94
+ `/settings` → Skill tag picks `+`, `~`, or `$` (default `+`). After a space — or at the start of a line — that character lists loaded skills, the same picker `/` opens at the start of the TUI. Completing inserts a tag; it does not expand SKILL.md the way `/skill:name` does.
95
+
96
+ ```text
97
+ Please use +pdf-tools on this file
98
+ ```
99
+
100
+ `xyz+` does not open the list. `xyz +` does. When the tag character is `~`, `~/path` still completes as a file path.
101
+
92
102
  ## Skill Structure
93
103
 
94
104
  A skill is a directory with a `SKILL.md` file. Everything else is freeform.
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-custom-provider",
9
- "version": "0.2.12",
9
+ "version": "0.2.13",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sdk": "^0.52.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-anthropic",
3
3
  "private": true,
4
- "version": "0.2.12",
4
+ "version": "0.2.13",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-custom-provider-gitlab-duo",
3
3
  "private": true,
4
- "version": "0.2.12",
4
+ "version": "0.2.13",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-gondolin",
9
- "version": "0.2.12",
9
+ "version": "0.2.13",
10
10
  "dependencies": {
11
11
  "@earendil-works/gondolin": "0.12.0"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-gondolin",
3
3
  "private": true,
4
- "version": "0.2.12",
4
+ "version": "0.2.13",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-sandbox",
9
- "version": "0.2.12",
9
+ "version": "0.2.13",
10
10
  "dependencies": {
11
11
  "@anthropic-ai/sandbox-runtime": "^0.0.26"
12
12
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-sandbox",
3
3
  "private": true,
4
- "version": "0.2.12",
4
+ "version": "0.2.13",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "pi-extension-with-deps",
9
- "version": "0.2.12",
9
+ "version": "0.2.13",
10
10
  "dependencies": {
11
11
  "ms": "^2.1.3"
12
12
  },
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "pi-extension-with-deps",
3
3
  "private": true,
4
- "version": "0.2.12",
4
+ "version": "0.2.13",
5
5
  "type": "module",
6
6
  "scripts": {
7
7
  "clean": "echo 'nothing to clean'",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ashx-j/lunr",
3
- "version": "0.2.12",
3
+ "version": "0.2.13",
4
4
  "description": "lunR — terminal coding agent CLI with read, bash, edit, write tools and session management",
5
5
  "type": "module",
6
6
  "piConfig": {
@@ -37,9 +37,9 @@
37
37
  "shrinkwrap": "node ../../scripts/generate-coding-agent-shrinkwrap.mjs"
38
38
  },
39
39
  "dependencies": {
40
- "@ashx-j/lunr-agent": "^0.2.12",
41
- "@ashx-j/lunr-ai": "^0.2.12",
42
- "@ashx-j/lunr-tui": "^0.2.12",
40
+ "@ashx-j/lunr-agent": "^0.2.13",
41
+ "@ashx-j/lunr-ai": "^0.2.13",
42
+ "@ashx-j/lunr-tui": "^0.2.13",
43
43
  "@modelcontextprotocol/ext-apps": "^1.7.4",
44
44
  "@modelcontextprotocol/sdk": "1.30.0",
45
45
  "@mozilla/readability": "^0.6.0",