@mrclrchtr/supi-code-intelligence 2.0.6 → 2.2.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 (169) hide show
  1. package/README.md +88 -4
  2. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  3. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  4. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  5. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  6. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  7. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  8. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  9. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  10. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  11. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  12. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  13. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  14. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  15. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  16. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  17. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  18. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  19. package/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  20. package/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  21. package/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  22. package/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  23. package/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  24. package/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  25. package/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  26. package/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  27. package/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  28. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  29. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  30. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  31. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  32. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  33. package/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  34. package/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  35. package/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  36. package/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  37. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  38. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  39. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  40. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  41. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  42. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  43. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  44. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  45. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  46. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  47. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  48. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  49. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  50. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  51. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  52. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  53. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  54. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  55. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  56. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  57. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  58. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  59. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  60. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  61. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  62. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  63. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  64. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  65. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  66. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  67. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  68. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  69. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  70. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  71. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  72. package/node_modules/@mrclrchtr/supi-lsp/package.json +3 -3
  73. package/node_modules/@mrclrchtr/supi-lsp/src/config/lsp-settings.ts +1 -1
  74. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  75. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  76. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  77. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  78. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  79. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  80. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  81. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  82. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  83. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  84. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  85. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  86. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  87. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  88. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  89. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  90. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  91. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/package.json +2 -2
  92. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/README.md +32 -23
  93. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/package.json +2 -1
  94. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/config.ts +22 -8
  95. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/prompt-surface.ts +357 -0
  96. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config.ts +2 -3
  97. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/debug-registry.ts +0 -5
  98. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/prompt-surface.ts +4 -0
  99. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/scoped-settings-list.ts +372 -0
  100. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-action-menu.ts +101 -0
  101. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-command.ts +1 -1
  102. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-registry.ts +55 -27
  103. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-schema.ts +464 -0
  104. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-submenus.ts +124 -0
  105. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings/settings-ui.ts +72 -285
  106. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings-ui.ts +2 -5
  107. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/settings.ts +27 -5
  108. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/tool-framework.ts +10 -0
  109. package/node_modules/@mrclrchtr/supi-tree-sitter/package.json +3 -3
  110. package/package.json +5 -5
  111. package/src/analysis/evidence.ts +13 -0
  112. package/src/analysis/instruction-files.ts +194 -0
  113. package/src/analysis/search/pattern.ts +24 -13
  114. package/src/analysis/search/ripgrep.ts +92 -7
  115. package/src/app/app.ts +6 -1
  116. package/src/config.ts +42 -0
  117. package/src/extension.ts +9 -1
  118. package/src/session/capability-adapter.ts +218 -0
  119. package/src/session/session.ts +106 -1
  120. package/src/session/target-workflow.ts +430 -0
  121. package/src/substrate/lsp/diagnostic-injection.ts +0 -15
  122. package/src/substrate/lsp/settings.ts +101 -175
  123. package/src/tool/find/execute.ts +23 -10
  124. package/src/tool/find/orchestrate.ts +67 -54
  125. package/src/tool/find/semantic-search.ts +30 -16
  126. package/src/tool/graph/collect-relation.ts +2 -1
  127. package/src/tool/graph/execute.ts +40 -12
  128. package/src/tool/graph/markdown-base.ts +5 -37
  129. package/src/tool/graph/orchestrate.ts +9 -35
  130. package/src/tool/graph/tui.ts +2 -0
  131. package/src/tool/guidance.ts +27 -38
  132. package/src/tool/health/markdown.ts +12 -70
  133. package/src/tool/health/orchestrate.ts +5 -13
  134. package/src/tool/impact/analysis.ts +0 -27
  135. package/src/tool/impact/change-set-impact.ts +3 -2
  136. package/src/tool/impact/execute.ts +27 -0
  137. package/src/tool/impact/file-level-impact.ts +3 -2
  138. package/src/tool/impact/result.ts +2 -21
  139. package/src/tool/impact/single-impact.ts +3 -2
  140. package/src/tool/infra/error-results.ts +18 -196
  141. package/src/tool/infra/pipeline.ts +24 -1
  142. package/src/tool/inspect/markdown.ts +4 -41
  143. package/src/tool/inspect/orchestrate.ts +27 -28
  144. package/src/tool/orientation/mode.ts +53 -2
  145. package/src/tool/orientation/orchestrate.ts +5 -8
  146. package/src/tool/orientation/precise-target.ts +65 -69
  147. package/src/tool/refactor-apply/orchestrate.ts +2 -7
  148. package/src/tool/refactor-plan/orchestrate.ts +31 -39
  149. package/src/tool/resolve/markdown.ts +5 -6
  150. package/src/tool/resolve/orchestrate.ts +7 -103
  151. package/src/tool/result/errors.ts +199 -0
  152. package/src/tool/result/find.ts +29 -0
  153. package/src/tool/result/graph.ts +93 -0
  154. package/src/tool/result/health.ts +94 -0
  155. package/src/tool/result/impact.ts +50 -0
  156. package/src/tool/result/inspect.ts +60 -0
  157. package/src/tool/result/orientation.ts +30 -0
  158. package/src/tool/result/refactor.ts +35 -0
  159. package/src/tool/result/resolve.ts +114 -0
  160. package/src/tool/result/types.ts +191 -0
  161. package/src/tool/schemas.ts +39 -28
  162. package/src/types/details.ts +17 -185
  163. package/src/ui/tui/common.ts +45 -1
  164. package/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
  165. package/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
  166. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
  167. package/node_modules/@mrclrchtr/supi-lsp/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
  168. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-code-runtime/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
  169. package/node_modules/@mrclrchtr/supi-tree-sitter/node_modules/@mrclrchtr/supi-core/src/config/config-settings.ts +0 -188
@@ -147,9 +147,9 @@ function buildExpandedView(
147
147
  if (lists && lists.length > 0) {
148
148
  container.addChild(new Spacer(1));
149
149
  renderEvidenceLines(container, lists, theme);
150
- container.addChild(new Spacer(1));
151
150
  }
152
151
 
152
+ renderStructuredDetailBody(container, data, theme);
153
153
  renderMarkdownDetail(container, result, theme);
154
154
 
155
155
  return container;
@@ -189,6 +189,50 @@ export function buildSimpleCompact(
189
189
  return new Text(segments.join(` ${dot} `), 0, 0);
190
190
  }
191
191
 
192
+ export function renderStructuredDetailBody(
193
+ container: Container,
194
+ data: Record<string, unknown> | undefined,
195
+ theme: Theme,
196
+ ): void {
197
+ if (!data) return;
198
+ const lines = structuredDetailLines(data);
199
+ if (lines.length === 0) return;
200
+ container.addChild(new Spacer(1));
201
+ for (const line of lines) {
202
+ container.addChild(new Text(theme.fg("muted", line), 0, 0));
203
+ }
204
+ }
205
+
206
+ function structuredDetailLines(data: Record<string, unknown>): string[] {
207
+ const lines: string[] = [];
208
+ const focusTarget = data.focusTarget;
209
+ if (typeof focusTarget === "string" && focusTarget.length > 0) {
210
+ lines.push(`target: ${focusTarget}`);
211
+ }
212
+
213
+ const unavailable = data.unavailableSections;
214
+ if (Array.isArray(unavailable) && unavailable.length > 0) {
215
+ lines.push(`unavailable: ${unavailable.join(", ")}`);
216
+ }
217
+
218
+ const checkNext = data.checkNext;
219
+ if (Array.isArray(checkNext) && checkNext.length > 0) {
220
+ lines.push(`check next: ${checkNext.slice(0, 3).join(" · ")}`);
221
+ }
222
+
223
+ const likelyTests = data.likelyTests;
224
+ if (Array.isArray(likelyTests) && likelyTests.length > 0) {
225
+ lines.push(`likely tests: ${likelyTests.slice(0, 3).join(" · ")}`);
226
+ }
227
+
228
+ const nextQueries = data.nextQueries;
229
+ if (Array.isArray(nextQueries) && nextQueries.length > 0) {
230
+ lines.push(`next: ${nextQueries.slice(0, 2).join(" · ")}`);
231
+ }
232
+
233
+ return lines;
234
+ }
235
+
192
236
  export function buildSimpleHeader(
193
237
  data: Record<string, unknown> | undefined,
194
238
  theme: Theme,
@@ -1,188 +0,0 @@
1
- // Config-aware settings helper for SuPi config-backed settings sections.
2
- // Wraps registerSettings() and centralizes selected-scope loading + scoped persistence.
3
- //
4
- // Setting items can declare a `configType` ("boolean" | "number" | "stringList")
5
- // to enable auto-generated persistChange. When all items have a configType,
6
- // the persistChange callback can be omitted.
7
-
8
- import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
9
- import type { SettingItem } from "@earendil-works/pi-tui";
10
- import type { SettingsScope } from "../settings/settings-registry.ts";
11
- import { registerSettings } from "../settings/settings-registry.ts";
12
- import { loadSupiConfigForScope, removeSupiConfigKey, writeSupiConfig } from "./config.ts";
13
-
14
- // ── Types ──────────────────────────────────────────────────────────────────
15
-
16
- /**
17
- * Supported config value types for declarative persistChange.
18
- *
19
- * - `"boolean"`: maps "on" → true, "off" → false
20
- * - `"number"`: parses integer via Number.parseInt, falls back to unset on invalid
21
- * - `"stringList"`: splits on comma, trims whitespace, unsets on empty
22
- */
23
- export type ConfigSettingType = "boolean" | "number" | "stringList";
24
-
25
- /**
26
- * Extended setting item that can declare its config type for auto-generated
27
- * persistence handling.
28
- */
29
- export interface ConfigSettingItem extends SettingItem {
30
- /**
31
- * When set, persistChange for this item is auto-generated.
32
- * All items must declare a configType for auto-generation to activate.
33
- */
34
- configType?: ConfigSettingType;
35
- }
36
-
37
- /**
38
- * Helpers provided to the persistChange callback for writing or removing
39
- * scoped config values.
40
- */
41
- export interface ConfigSettingsHelpers {
42
- /** Write a key to the selected scope's config section. */
43
- set(key: string, value: unknown): void;
44
- /** Remove a key from the selected scope's config section. */
45
- unset(key: string): void;
46
- }
47
-
48
- export interface ConfigSettingsOptions<T> {
49
- /** Extension identifier — e.g. "lsp", "claude-md" */
50
- id: string;
51
- /** Human-readable label shown in the UI */
52
- label: string;
53
- /** SuPi config section name — e.g. "lsp", "claude-md" */
54
- section: string;
55
- /** Default config values */
56
- defaults: T;
57
- /**
58
- * Build SettingItem[] from scoped config. Called by loadValues.
59
- *
60
- * Items can include a `configType` property for auto-generated
61
- * persistChange handling. When ALL items declare a configType,
62
- * the `persistChange` callback can be omitted.
63
- */
64
- buildItems: (
65
- settings: T,
66
- scope: SettingsScope,
67
- cwd: string,
68
- ctx?: ExtensionContext,
69
- ) => ConfigSettingItem[];
70
- /**
71
- * Handle a settings change with scoped persistence helpers.
72
- *
73
- * Optional when all items returned by `buildItems` declare a `configType`.
74
- * Required when any item lacks a `configType`.
75
- */
76
- persistChange?: (
77
- scope: SettingsScope,
78
- cwd: string,
79
- settingId: string,
80
- value: string,
81
- helpers: ConfigSettingsHelpers,
82
- ) => void;
83
- /** Optional home directory for config resolution (testing). */
84
- homeDir?: string;
85
- }
86
-
87
- // ── Auto-generated persistChange ───────────────────────────────────────────
88
-
89
- function autoPersistChange(
90
- settingId: string,
91
- value: string,
92
- helpers: ConfigSettingsHelpers,
93
- items: ConfigSettingItem[],
94
- ): void {
95
- const item = items.find((i) => i.id === settingId);
96
- if (!item?.configType) return;
97
-
98
- switch (item.configType) {
99
- case "boolean": {
100
- helpers.set(settingId, value === "on");
101
- break;
102
- }
103
- case "number": {
104
- const num = Number.parseInt(value, 10);
105
- if (Number.isFinite(num) && num > 0) {
106
- helpers.set(settingId, num);
107
- } else {
108
- helpers.unset(settingId);
109
- }
110
- break;
111
- }
112
- case "stringList": {
113
- const names = value
114
- .split(",")
115
- .map((s) => s.trim())
116
- .filter((s) => s.length > 0);
117
- if (names.length > 0) {
118
- helpers.set(settingId, names);
119
- } else {
120
- helpers.unset(settingId);
121
- }
122
- break;
123
- }
124
- }
125
- }
126
-
127
- function areAllItemsDeclarative(items: ConfigSettingItem[]): boolean {
128
- return items.length > 0 && items.every((i) => i.configType !== undefined);
129
- }
130
-
131
- // ── Registration ───────────────────────────────────────────────────────────
132
-
133
- /**
134
- * Register a config-backed settings section.
135
- *
136
- * Loads display values from the selected scope only (`defaults <- selected scope`)
137
- * instead of merged effective runtime config. Provides scoped `set` / `unset`
138
- * persistence helpers so extensions don't need to wire `writeSupiConfig` /
139
- * `removeSupiConfigKey` by hand.
140
- *
141
- * When every item returned by `buildItems` declares a `configType`, the
142
- * `persistChange` callback is optional and will be auto-generated.
143
- */
144
- export function registerConfigSettings<T>(options: ConfigSettingsOptions<T>): void {
145
- let cachedItems: ConfigSettingItem[] | undefined;
146
-
147
- registerSettings({
148
- id: options.id,
149
- label: options.label,
150
- loadValues: (scope, cwd, ctx) => {
151
- const settings = loadSupiConfigForScope(options.section, cwd, options.defaults, {
152
- scope,
153
- homeDir: options.homeDir,
154
- });
155
- const items = options.buildItems(settings, scope, cwd, ctx);
156
- cachedItems = items;
157
- return items;
158
- },
159
- persistChange: (scope, cwd, settingId, value) => {
160
- const helpers: ConfigSettingsHelpers = {
161
- set: (key, val) => {
162
- writeSupiConfig(
163
- { section: options.section, scope, cwd },
164
- { [key]: val },
165
- { homeDir: options.homeDir },
166
- );
167
- },
168
- unset: (key) => {
169
- removeSupiConfigKey({ section: options.section, scope, cwd }, key, {
170
- homeDir: options.homeDir,
171
- });
172
- },
173
- };
174
-
175
- // Use manual persistChange when provided
176
- if (options.persistChange) {
177
- options.persistChange(scope, cwd, settingId, value, helpers);
178
- return;
179
- }
180
-
181
- // Auto-generate when all items are declarative
182
- const items = cachedItems ?? options.buildItems(options.defaults, scope, cwd, undefined);
183
- if (areAllItemsDeclarative(items)) {
184
- autoPersistChange(settingId, value, helpers, items);
185
- }
186
- },
187
- });
188
- }
@@ -1,188 +0,0 @@
1
- // Config-aware settings helper for SuPi config-backed settings sections.
2
- // Wraps registerSettings() and centralizes selected-scope loading + scoped persistence.
3
- //
4
- // Setting items can declare a `configType` ("boolean" | "number" | "stringList")
5
- // to enable auto-generated persistChange. When all items have a configType,
6
- // the persistChange callback can be omitted.
7
-
8
- import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
9
- import type { SettingItem } from "@earendil-works/pi-tui";
10
- import type { SettingsScope } from "../settings/settings-registry.ts";
11
- import { registerSettings } from "../settings/settings-registry.ts";
12
- import { loadSupiConfigForScope, removeSupiConfigKey, writeSupiConfig } from "./config.ts";
13
-
14
- // ── Types ──────────────────────────────────────────────────────────────────
15
-
16
- /**
17
- * Supported config value types for declarative persistChange.
18
- *
19
- * - `"boolean"`: maps "on" → true, "off" → false
20
- * - `"number"`: parses integer via Number.parseInt, falls back to unset on invalid
21
- * - `"stringList"`: splits on comma, trims whitespace, unsets on empty
22
- */
23
- export type ConfigSettingType = "boolean" | "number" | "stringList";
24
-
25
- /**
26
- * Extended setting item that can declare its config type for auto-generated
27
- * persistence handling.
28
- */
29
- export interface ConfigSettingItem extends SettingItem {
30
- /**
31
- * When set, persistChange for this item is auto-generated.
32
- * All items must declare a configType for auto-generation to activate.
33
- */
34
- configType?: ConfigSettingType;
35
- }
36
-
37
- /**
38
- * Helpers provided to the persistChange callback for writing or removing
39
- * scoped config values.
40
- */
41
- export interface ConfigSettingsHelpers {
42
- /** Write a key to the selected scope's config section. */
43
- set(key: string, value: unknown): void;
44
- /** Remove a key from the selected scope's config section. */
45
- unset(key: string): void;
46
- }
47
-
48
- export interface ConfigSettingsOptions<T> {
49
- /** Extension identifier — e.g. "lsp", "claude-md" */
50
- id: string;
51
- /** Human-readable label shown in the UI */
52
- label: string;
53
- /** SuPi config section name — e.g. "lsp", "claude-md" */
54
- section: string;
55
- /** Default config values */
56
- defaults: T;
57
- /**
58
- * Build SettingItem[] from scoped config. Called by loadValues.
59
- *
60
- * Items can include a `configType` property for auto-generated
61
- * persistChange handling. When ALL items declare a configType,
62
- * the `persistChange` callback can be omitted.
63
- */
64
- buildItems: (
65
- settings: T,
66
- scope: SettingsScope,
67
- cwd: string,
68
- ctx?: ExtensionContext,
69
- ) => ConfigSettingItem[];
70
- /**
71
- * Handle a settings change with scoped persistence helpers.
72
- *
73
- * Optional when all items returned by `buildItems` declare a `configType`.
74
- * Required when any item lacks a `configType`.
75
- */
76
- persistChange?: (
77
- scope: SettingsScope,
78
- cwd: string,
79
- settingId: string,
80
- value: string,
81
- helpers: ConfigSettingsHelpers,
82
- ) => void;
83
- /** Optional home directory for config resolution (testing). */
84
- homeDir?: string;
85
- }
86
-
87
- // ── Auto-generated persistChange ───────────────────────────────────────────
88
-
89
- function autoPersistChange(
90
- settingId: string,
91
- value: string,
92
- helpers: ConfigSettingsHelpers,
93
- items: ConfigSettingItem[],
94
- ): void {
95
- const item = items.find((i) => i.id === settingId);
96
- if (!item?.configType) return;
97
-
98
- switch (item.configType) {
99
- case "boolean": {
100
- helpers.set(settingId, value === "on");
101
- break;
102
- }
103
- case "number": {
104
- const num = Number.parseInt(value, 10);
105
- if (Number.isFinite(num) && num > 0) {
106
- helpers.set(settingId, num);
107
- } else {
108
- helpers.unset(settingId);
109
- }
110
- break;
111
- }
112
- case "stringList": {
113
- const names = value
114
- .split(",")
115
- .map((s) => s.trim())
116
- .filter((s) => s.length > 0);
117
- if (names.length > 0) {
118
- helpers.set(settingId, names);
119
- } else {
120
- helpers.unset(settingId);
121
- }
122
- break;
123
- }
124
- }
125
- }
126
-
127
- function areAllItemsDeclarative(items: ConfigSettingItem[]): boolean {
128
- return items.length > 0 && items.every((i) => i.configType !== undefined);
129
- }
130
-
131
- // ── Registration ───────────────────────────────────────────────────────────
132
-
133
- /**
134
- * Register a config-backed settings section.
135
- *
136
- * Loads display values from the selected scope only (`defaults <- selected scope`)
137
- * instead of merged effective runtime config. Provides scoped `set` / `unset`
138
- * persistence helpers so extensions don't need to wire `writeSupiConfig` /
139
- * `removeSupiConfigKey` by hand.
140
- *
141
- * When every item returned by `buildItems` declares a `configType`, the
142
- * `persistChange` callback is optional and will be auto-generated.
143
- */
144
- export function registerConfigSettings<T>(options: ConfigSettingsOptions<T>): void {
145
- let cachedItems: ConfigSettingItem[] | undefined;
146
-
147
- registerSettings({
148
- id: options.id,
149
- label: options.label,
150
- loadValues: (scope, cwd, ctx) => {
151
- const settings = loadSupiConfigForScope(options.section, cwd, options.defaults, {
152
- scope,
153
- homeDir: options.homeDir,
154
- });
155
- const items = options.buildItems(settings, scope, cwd, ctx);
156
- cachedItems = items;
157
- return items;
158
- },
159
- persistChange: (scope, cwd, settingId, value) => {
160
- const helpers: ConfigSettingsHelpers = {
161
- set: (key, val) => {
162
- writeSupiConfig(
163
- { section: options.section, scope, cwd },
164
- { [key]: val },
165
- { homeDir: options.homeDir },
166
- );
167
- },
168
- unset: (key) => {
169
- removeSupiConfigKey({ section: options.section, scope, cwd }, key, {
170
- homeDir: options.homeDir,
171
- });
172
- },
173
- };
174
-
175
- // Use manual persistChange when provided
176
- if (options.persistChange) {
177
- options.persistChange(scope, cwd, settingId, value, helpers);
178
- return;
179
- }
180
-
181
- // Auto-generate when all items are declarative
182
- const items = cachedItems ?? options.buildItems(options.defaults, scope, cwd, undefined);
183
- if (areAllItemsDeclarative(items)) {
184
- autoPersistChange(settingId, value, helpers, items);
185
- }
186
- },
187
- });
188
- }
@@ -1,188 +0,0 @@
1
- // Config-aware settings helper for SuPi config-backed settings sections.
2
- // Wraps registerSettings() and centralizes selected-scope loading + scoped persistence.
3
- //
4
- // Setting items can declare a `configType` ("boolean" | "number" | "stringList")
5
- // to enable auto-generated persistChange. When all items have a configType,
6
- // the persistChange callback can be omitted.
7
-
8
- import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
9
- import type { SettingItem } from "@earendil-works/pi-tui";
10
- import type { SettingsScope } from "../settings/settings-registry.ts";
11
- import { registerSettings } from "../settings/settings-registry.ts";
12
- import { loadSupiConfigForScope, removeSupiConfigKey, writeSupiConfig } from "./config.ts";
13
-
14
- // ── Types ──────────────────────────────────────────────────────────────────
15
-
16
- /**
17
- * Supported config value types for declarative persistChange.
18
- *
19
- * - `"boolean"`: maps "on" → true, "off" → false
20
- * - `"number"`: parses integer via Number.parseInt, falls back to unset on invalid
21
- * - `"stringList"`: splits on comma, trims whitespace, unsets on empty
22
- */
23
- export type ConfigSettingType = "boolean" | "number" | "stringList";
24
-
25
- /**
26
- * Extended setting item that can declare its config type for auto-generated
27
- * persistence handling.
28
- */
29
- export interface ConfigSettingItem extends SettingItem {
30
- /**
31
- * When set, persistChange for this item is auto-generated.
32
- * All items must declare a configType for auto-generation to activate.
33
- */
34
- configType?: ConfigSettingType;
35
- }
36
-
37
- /**
38
- * Helpers provided to the persistChange callback for writing or removing
39
- * scoped config values.
40
- */
41
- export interface ConfigSettingsHelpers {
42
- /** Write a key to the selected scope's config section. */
43
- set(key: string, value: unknown): void;
44
- /** Remove a key from the selected scope's config section. */
45
- unset(key: string): void;
46
- }
47
-
48
- export interface ConfigSettingsOptions<T> {
49
- /** Extension identifier — e.g. "lsp", "claude-md" */
50
- id: string;
51
- /** Human-readable label shown in the UI */
52
- label: string;
53
- /** SuPi config section name — e.g. "lsp", "claude-md" */
54
- section: string;
55
- /** Default config values */
56
- defaults: T;
57
- /**
58
- * Build SettingItem[] from scoped config. Called by loadValues.
59
- *
60
- * Items can include a `configType` property for auto-generated
61
- * persistChange handling. When ALL items declare a configType,
62
- * the `persistChange` callback can be omitted.
63
- */
64
- buildItems: (
65
- settings: T,
66
- scope: SettingsScope,
67
- cwd: string,
68
- ctx?: ExtensionContext,
69
- ) => ConfigSettingItem[];
70
- /**
71
- * Handle a settings change with scoped persistence helpers.
72
- *
73
- * Optional when all items returned by `buildItems` declare a `configType`.
74
- * Required when any item lacks a `configType`.
75
- */
76
- persistChange?: (
77
- scope: SettingsScope,
78
- cwd: string,
79
- settingId: string,
80
- value: string,
81
- helpers: ConfigSettingsHelpers,
82
- ) => void;
83
- /** Optional home directory for config resolution (testing). */
84
- homeDir?: string;
85
- }
86
-
87
- // ── Auto-generated persistChange ───────────────────────────────────────────
88
-
89
- function autoPersistChange(
90
- settingId: string,
91
- value: string,
92
- helpers: ConfigSettingsHelpers,
93
- items: ConfigSettingItem[],
94
- ): void {
95
- const item = items.find((i) => i.id === settingId);
96
- if (!item?.configType) return;
97
-
98
- switch (item.configType) {
99
- case "boolean": {
100
- helpers.set(settingId, value === "on");
101
- break;
102
- }
103
- case "number": {
104
- const num = Number.parseInt(value, 10);
105
- if (Number.isFinite(num) && num > 0) {
106
- helpers.set(settingId, num);
107
- } else {
108
- helpers.unset(settingId);
109
- }
110
- break;
111
- }
112
- case "stringList": {
113
- const names = value
114
- .split(",")
115
- .map((s) => s.trim())
116
- .filter((s) => s.length > 0);
117
- if (names.length > 0) {
118
- helpers.set(settingId, names);
119
- } else {
120
- helpers.unset(settingId);
121
- }
122
- break;
123
- }
124
- }
125
- }
126
-
127
- function areAllItemsDeclarative(items: ConfigSettingItem[]): boolean {
128
- return items.length > 0 && items.every((i) => i.configType !== undefined);
129
- }
130
-
131
- // ── Registration ───────────────────────────────────────────────────────────
132
-
133
- /**
134
- * Register a config-backed settings section.
135
- *
136
- * Loads display values from the selected scope only (`defaults <- selected scope`)
137
- * instead of merged effective runtime config. Provides scoped `set` / `unset`
138
- * persistence helpers so extensions don't need to wire `writeSupiConfig` /
139
- * `removeSupiConfigKey` by hand.
140
- *
141
- * When every item returned by `buildItems` declares a `configType`, the
142
- * `persistChange` callback is optional and will be auto-generated.
143
- */
144
- export function registerConfigSettings<T>(options: ConfigSettingsOptions<T>): void {
145
- let cachedItems: ConfigSettingItem[] | undefined;
146
-
147
- registerSettings({
148
- id: options.id,
149
- label: options.label,
150
- loadValues: (scope, cwd, ctx) => {
151
- const settings = loadSupiConfigForScope(options.section, cwd, options.defaults, {
152
- scope,
153
- homeDir: options.homeDir,
154
- });
155
- const items = options.buildItems(settings, scope, cwd, ctx);
156
- cachedItems = items;
157
- return items;
158
- },
159
- persistChange: (scope, cwd, settingId, value) => {
160
- const helpers: ConfigSettingsHelpers = {
161
- set: (key, val) => {
162
- writeSupiConfig(
163
- { section: options.section, scope, cwd },
164
- { [key]: val },
165
- { homeDir: options.homeDir },
166
- );
167
- },
168
- unset: (key) => {
169
- removeSupiConfigKey({ section: options.section, scope, cwd }, key, {
170
- homeDir: options.homeDir,
171
- });
172
- },
173
- };
174
-
175
- // Use manual persistChange when provided
176
- if (options.persistChange) {
177
- options.persistChange(scope, cwd, settingId, value, helpers);
178
- return;
179
- }
180
-
181
- // Auto-generate when all items are declarative
182
- const items = cachedItems ?? options.buildItems(options.defaults, scope, cwd, undefined);
183
- if (areAllItemsDeclarative(items)) {
184
- autoPersistChange(settingId, value, helpers, items);
185
- }
186
- },
187
- });
188
- }