loadouts 0.2.5 → 0.3.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 (180) hide show
  1. package/bundled/embedded/opencode/loadouts-runtime.tsx +14461 -0
  2. package/bundled/embedded/pi/loadouts-runtime.ts +14638 -0
  3. package/bundled/extensions/loadouts-runtime/index.ts +14638 -0
  4. package/bundled/extensions/loadouts-runtime/package.json +6 -0
  5. package/bundled/loadouts/opencode-runtime.yaml +7 -0
  6. package/bundled/loadouts/pi-runtime.yaml +5 -0
  7. package/bundled/opencode/commands/loadouts.md +3 -0
  8. package/bundled/opencode/plugins/loadouts-runtime-tui.tsx +14461 -0
  9. package/bundled/opencode/plugins/loadouts-runtime.ts +533 -0
  10. package/bundled/opencode/tui.jsonc +5 -0
  11. package/dist/builtins/agent-transforms.d.ts.map +1 -1
  12. package/dist/builtins/agent-transforms.js +1 -0
  13. package/dist/builtins/agent-transforms.js.map +1 -1
  14. package/dist/builtins/index.d.ts.map +1 -1
  15. package/dist/builtins/index.js +6 -0
  16. package/dist/builtins/index.js.map +1 -1
  17. package/dist/builtins/kinds/extension-dir.d.ts +3 -0
  18. package/dist/builtins/kinds/extension-dir.d.ts.map +1 -0
  19. package/dist/builtins/kinds/extension-dir.js +8 -0
  20. package/dist/builtins/kinds/extension-dir.js.map +1 -0
  21. package/dist/builtins/kinds/opencode-command.d.ts +3 -0
  22. package/dist/builtins/kinds/opencode-command.d.ts.map +1 -0
  23. package/dist/builtins/kinds/opencode-command.js +8 -0
  24. package/dist/builtins/kinds/opencode-command.js.map +1 -0
  25. package/dist/builtins/kinds/opencode-plugin.js +1 -1
  26. package/dist/builtins/kinds/opencode-plugin.js.map +1 -1
  27. package/dist/builtins/kinds/opencode-tui-config.d.ts +3 -0
  28. package/dist/builtins/kinds/opencode-tui-config.d.ts.map +1 -0
  29. package/dist/builtins/kinds/opencode-tui-config.js +8 -0
  30. package/dist/builtins/kinds/opencode-tui-config.js.map +1 -0
  31. package/dist/builtins/tools/opencode.d.ts.map +1 -1
  32. package/dist/builtins/tools/opencode.js +9 -0
  33. package/dist/builtins/tools/opencode.js.map +1 -1
  34. package/dist/builtins/tools/pi.d.ts.map +1 -1
  35. package/dist/builtins/tools/pi.js +2 -1
  36. package/dist/builtins/tools/pi.js.map +1 -1
  37. package/dist/cli/commands/activate.d.ts.map +1 -1
  38. package/dist/cli/commands/activate.js +7 -0
  39. package/dist/cli/commands/activate.js.map +1 -1
  40. package/dist/cli/commands/diff.d.ts +10 -0
  41. package/dist/cli/commands/diff.d.ts.map +1 -1
  42. package/dist/cli/commands/diff.js +71 -30
  43. package/dist/cli/commands/diff.js.map +1 -1
  44. package/dist/cli/commands/info.d.ts +10 -0
  45. package/dist/cli/commands/info.d.ts.map +1 -1
  46. package/dist/cli/commands/info.js +45 -1
  47. package/dist/cli/commands/info.js.map +1 -1
  48. package/dist/cli/commands/list.d.ts +18 -0
  49. package/dist/cli/commands/list.d.ts.map +1 -1
  50. package/dist/cli/commands/list.js +27 -0
  51. package/dist/cli/commands/list.js.map +1 -1
  52. package/dist/cli/commands/status.d.ts +10 -0
  53. package/dist/cli/commands/status.d.ts.map +1 -1
  54. package/dist/cli/commands/status.js +100 -2
  55. package/dist/cli/commands/status.js.map +1 -1
  56. package/dist/cli/commands/sync.d.ts.map +1 -1
  57. package/dist/cli/commands/sync.js +6 -0
  58. package/dist/cli/commands/sync.js.map +1 -1
  59. package/dist/cli/commands/tui.d.ts +3 -0
  60. package/dist/cli/commands/tui.d.ts.map +1 -0
  61. package/dist/cli/commands/tui.js +20 -0
  62. package/dist/cli/commands/tui.js.map +1 -0
  63. package/dist/cli/index.d.ts.map +1 -1
  64. package/dist/cli/index.js +2 -0
  65. package/dist/cli/index.js.map +1 -1
  66. package/dist/core/render.d.ts.map +1 -1
  67. package/dist/core/render.js +48 -7
  68. package/dist/core/render.js.map +1 -1
  69. package/dist/core/resolve.d.ts +1 -1
  70. package/dist/core/resolve.d.ts.map +1 -1
  71. package/dist/core/resolve.js +2 -2
  72. package/dist/core/resolve.js.map +1 -1
  73. package/dist/core/types.d.ts.map +1 -1
  74. package/dist/integrations/opencode-runtime/bridge.d.ts +17 -0
  75. package/dist/integrations/opencode-runtime/bridge.d.ts.map +1 -0
  76. package/dist/integrations/opencode-runtime/bridge.js +60 -0
  77. package/dist/integrations/opencode-runtime/bridge.js.map +1 -0
  78. package/dist/integrations/opencode-runtime/command.d.ts +4 -0
  79. package/dist/integrations/opencode-runtime/command.d.ts.map +1 -0
  80. package/dist/integrations/opencode-runtime/command.js +200 -0
  81. package/dist/integrations/opencode-runtime/command.js.map +1 -0
  82. package/dist/integrations/opencode-runtime/index.d.ts +6 -0
  83. package/dist/integrations/opencode-runtime/index.d.ts.map +1 -0
  84. package/dist/integrations/opencode-runtime/index.js +5 -0
  85. package/dist/integrations/opencode-runtime/index.js.map +1 -0
  86. package/dist/integrations/opencode-runtime/plugin.d.ts +59 -0
  87. package/dist/integrations/opencode-runtime/plugin.d.ts.map +1 -0
  88. package/dist/integrations/opencode-runtime/plugin.js +238 -0
  89. package/dist/integrations/opencode-runtime/plugin.js.map +1 -0
  90. package/dist/integrations/opencode-runtime/state.d.ts +8 -0
  91. package/dist/integrations/opencode-runtime/state.d.ts.map +1 -0
  92. package/dist/integrations/opencode-runtime/state.js +27 -0
  93. package/dist/integrations/opencode-runtime/state.js.map +1 -0
  94. package/dist/integrations/opencode-runtime/types.d.ts +38 -0
  95. package/dist/integrations/opencode-runtime/types.d.ts.map +1 -0
  96. package/dist/integrations/opencode-runtime/types.js +2 -0
  97. package/dist/integrations/opencode-runtime/types.js.map +1 -0
  98. package/dist/lib/gitignore.d.ts.map +1 -1
  99. package/dist/lib/gitignore.js +2 -0
  100. package/dist/lib/gitignore.js.map +1 -1
  101. package/dist/tui/core/actions.d.ts +9 -0
  102. package/dist/tui/core/actions.d.ts.map +1 -0
  103. package/dist/tui/core/actions.js +70 -0
  104. package/dist/tui/core/actions.js.map +1 -0
  105. package/dist/tui/core/data.d.ts +41 -0
  106. package/dist/tui/core/data.d.ts.map +1 -0
  107. package/dist/tui/core/data.js +150 -0
  108. package/dist/tui/core/data.js.map +1 -0
  109. package/dist/tui/core/host.d.ts +21 -0
  110. package/dist/tui/core/host.d.ts.map +1 -0
  111. package/dist/tui/core/host.js +2 -0
  112. package/dist/tui/core/host.js.map +1 -0
  113. package/dist/tui/core/intent.d.ts +80 -0
  114. package/dist/tui/core/intent.d.ts.map +1 -0
  115. package/dist/tui/core/intent.js +2 -0
  116. package/dist/tui/core/intent.js.map +1 -0
  117. package/dist/tui/core/keymap.d.ts +15 -0
  118. package/dist/tui/core/keymap.d.ts.map +1 -0
  119. package/dist/tui/core/keymap.js +36 -0
  120. package/dist/tui/core/keymap.js.map +1 -0
  121. package/dist/tui/core/model.d.ts +53 -0
  122. package/dist/tui/core/model.d.ts.map +1 -0
  123. package/dist/tui/core/model.js +33 -0
  124. package/dist/tui/core/model.js.map +1 -0
  125. package/dist/tui/core/theme.d.ts +15 -0
  126. package/dist/tui/core/theme.d.ts.map +1 -0
  127. package/dist/tui/core/theme.js +11 -0
  128. package/dist/tui/core/theme.js.map +1 -0
  129. package/dist/tui/core/update.d.ts +8 -0
  130. package/dist/tui/core/update.d.ts.map +1 -0
  131. package/dist/tui/core/update.js +192 -0
  132. package/dist/tui/core/update.js.map +1 -0
  133. package/dist/tui/core/view.d.ts +4 -0
  134. package/dist/tui/core/view.d.ts.map +1 -0
  135. package/dist/tui/core/view.js +150 -0
  136. package/dist/tui/core/view.js.map +1 -0
  137. package/dist/tui/core/viewspec.d.ts +44 -0
  138. package/dist/tui/core/viewspec.d.ts.map +1 -0
  139. package/dist/tui/core/viewspec.js +2 -0
  140. package/dist/tui/core/viewspec.js.map +1 -0
  141. package/dist/tui/hosts/_probe/embed-entry.d.ts +5 -0
  142. package/dist/tui/hosts/_probe/embed-entry.d.ts.map +1 -0
  143. package/dist/tui/hosts/_probe/embed-entry.js +8 -0
  144. package/dist/tui/hosts/_probe/embed-entry.js.map +1 -0
  145. package/dist/tui/hosts/pi/embed-entry.d.ts +3 -0
  146. package/dist/tui/hosts/pi/embed-entry.d.ts.map +1 -0
  147. package/dist/tui/hosts/pi/embed-entry.js +219 -0
  148. package/dist/tui/hosts/pi/embed-entry.js.map +1 -0
  149. package/dist/tui/hosts/pi/inject.d.ts +32 -0
  150. package/dist/tui/hosts/pi/inject.d.ts.map +1 -0
  151. package/dist/tui/hosts/pi/inject.js +53 -0
  152. package/dist/tui/hosts/pi/inject.js.map +1 -0
  153. package/dist/tui/hosts/standalone.d.ts +2 -0
  154. package/dist/tui/hosts/standalone.d.ts.map +1 -0
  155. package/dist/tui/hosts/standalone.js +145 -0
  156. package/dist/tui/hosts/standalone.js.map +1 -0
  157. package/dist/tui/skins/pi-tui/input.d.ts +5 -0
  158. package/dist/tui/skins/pi-tui/input.d.ts.map +1 -0
  159. package/dist/tui/skins/pi-tui/input.js +38 -0
  160. package/dist/tui/skins/pi-tui/input.js.map +1 -0
  161. package/dist/tui/skins/pi-tui/pi-theme-adapter.d.ts +4 -0
  162. package/dist/tui/skins/pi-tui/pi-theme-adapter.d.ts.map +1 -0
  163. package/dist/tui/skins/pi-tui/pi-theme-adapter.js +27 -0
  164. package/dist/tui/skins/pi-tui/pi-theme-adapter.js.map +1 -0
  165. package/dist/tui/skins/pi-tui/render.d.ts +35 -0
  166. package/dist/tui/skins/pi-tui/render.d.ts.map +1 -0
  167. package/dist/tui/skins/pi-tui/render.js +154 -0
  168. package/dist/tui/skins/pi-tui/render.js.map +1 -0
  169. package/dist/tui/skins/pi-tui/theme.d.ts +10 -0
  170. package/dist/tui/skins/pi-tui/theme.d.ts.map +1 -0
  171. package/dist/tui/skins/pi-tui/theme.js +58 -0
  172. package/dist/tui/skins/pi-tui/theme.js.map +1 -0
  173. package/docs/authoring.md +53 -1
  174. package/docs/commands.md +4 -0
  175. package/docs/compatibility.md +7 -7
  176. package/docs/concepts.md +4 -2
  177. package/docs/runtime.md +36 -1
  178. package/docs/troubleshooting.md +18 -1
  179. package/docs/tui-architecture.md +501 -0
  180. package/package.json +11 -2
@@ -0,0 +1,150 @@
1
+ import * as path from "node:path";
2
+ import * as os from "node:os";
3
+ import { listLoadouts, parseLoadoutDefinition, parseRootConfig } from "../../core/config.js";
4
+ import { collectCatalogRoots, collectRootsWithSources, } from "../../core/discovery.js";
5
+ import { loadState, detectDrift } from "../../core/manifest.js";
6
+ import { planRender } from "../../core/render.js";
7
+ import { resolveLoadout } from "../../core/resolve.js";
8
+ import { getArtifactName, sortArtifacts } from "../../lib/artifact-table.js";
9
+ import { fileExists } from "../../lib/fs.js";
10
+ const DRIFT_PRIORITY = {
11
+ ok: 0,
12
+ modified: 1,
13
+ unlinked: 2,
14
+ misdirected: 3,
15
+ missing: 4,
16
+ broken: 5,
17
+ };
18
+ export async function loadDashboardData(cwd = process.cwd()) {
19
+ const { entries, warnings } = await collectCatalogRoots(cwd);
20
+ const ownerStates = ownerStateMap(entries);
21
+ const seenByOwner = new Map();
22
+ const rows = [];
23
+ const issues = [];
24
+ for (const entry of entries) {
25
+ const seen = seenByOwner.get(entry.owner) ?? new Set();
26
+ seenByOwner.set(entry.owner, seen);
27
+ for (const name of listLoadouts(entry.root.path)) {
28
+ if (seen.has(name))
29
+ continue;
30
+ seen.add(name);
31
+ const ownerState = ownerStates.get(entry.owner);
32
+ const scope = ownerState?.scope ?? scopeFromRoot(entry.root);
33
+ const id = `${scope}:${name}`;
34
+ const filePath = loadoutDefinitionPath(entry.root.path, name);
35
+ try {
36
+ const definition = parseLoadoutDefinition(filePath);
37
+ const chain = collectRootsWithSources(entry.root, false, entry.owner !== "bundled").roots;
38
+ const rootConfig = parseRootConfig(entry.root.path);
39
+ const resolved = resolveLoadout(name, chain, rootConfig);
40
+ const slots = sortArtifacts(resolved.items.map((item) => ({
41
+ kind: item.kind,
42
+ name: getArtifactName(item.relativePath, item.kind),
43
+ relativePath: item.relativePath,
44
+ tools: item.tools,
45
+ })));
46
+ const tools = Array.from(new Set(slots.flatMap((slot) => slot.tools))).sort();
47
+ const active = ownerState?.active.has(name) ?? false;
48
+ const issue = active && ownerState
49
+ ? await loadActiveIssue(ownerState, name, chain)
50
+ : undefined;
51
+ const status = issue ? "drift" : active ? "active" : "available";
52
+ const row = {
53
+ id,
54
+ name,
55
+ scope,
56
+ description: definition.description,
57
+ status,
58
+ activation: active ? "filesystem" : null,
59
+ counts: countSlots(slots),
60
+ tools,
61
+ issue,
62
+ filePath,
63
+ slots,
64
+ };
65
+ rows.push(row);
66
+ if (issue)
67
+ issues.push({ rowId: id, text: issue });
68
+ }
69
+ catch (err) {
70
+ const text = err instanceof Error ? err.message : String(err);
71
+ rows.push({
72
+ id,
73
+ name,
74
+ scope,
75
+ status: "broken",
76
+ activation: null,
77
+ counts: { rules: 0, skills: 0, instructions: 0, extensions: 0 },
78
+ tools: [],
79
+ issue: text,
80
+ filePath,
81
+ slots: [],
82
+ });
83
+ issues.push({ rowId: id, text });
84
+ }
85
+ }
86
+ }
87
+ return {
88
+ rows: sortRows(rows),
89
+ active: rows.filter((row) => row.activation).map((row) => row.name),
90
+ tools: Array.from(new Set(rows.flatMap((row) => row.tools))).sort(),
91
+ issues,
92
+ warnings,
93
+ };
94
+ }
95
+ function ownerStateMap(entries) {
96
+ const map = new Map();
97
+ for (const owner of ["project", "global"]) {
98
+ const primary = entries.find((entry) => entry.owner === owner && entry.root.level === owner);
99
+ if (!primary)
100
+ continue;
101
+ map.set(owner, {
102
+ active: new Set(loadState(primary.root.path)?.active ?? []),
103
+ configPath: primary.root.path,
104
+ projectRoot: owner === "project" ? path.dirname(primary.root.path) : os.homedir(),
105
+ scope: owner,
106
+ });
107
+ }
108
+ return map;
109
+ }
110
+ async function loadActiveIssue(state, name, roots) {
111
+ const applied = loadState(state.configPath);
112
+ if (!applied)
113
+ return "active state missing";
114
+ const loadout = resolveLoadout(name, roots, parseRootConfig(state.configPath));
115
+ const plan = await planRender(loadout, state.projectRoot, state.scope, state.configPath);
116
+ if (plan.errors.length > 0)
117
+ return plan.errors[0];
118
+ if (plan.shadowed.length > 0)
119
+ return `${plan.shadowed.length} shadowed output(s)`;
120
+ const targets = new Set(plan.outputs.map((output) => output.spec.targetPath));
121
+ const sourcePaths = new Set(plan.outputs.map((output) => output.spec.sourcePath));
122
+ const added = plan.outputs.some((output) => !applied.entries.some((entry) => entry.targetPath === output.spec.targetPath));
123
+ const removed = applied.entries.some((entry) => !targets.has(entry.targetPath));
124
+ if (added || removed)
125
+ return "configuration drift";
126
+ const worst = detectDrift(applied, state.projectRoot)
127
+ .filter((result) => sourcePaths.has(result.entry.sourcePath))
128
+ .sort((a, b) => DRIFT_PRIORITY[b.status] - DRIFT_PRIORITY[a.status])[0];
129
+ return worst && worst.status !== "ok" ? `output ${worst.status}` : undefined;
130
+ }
131
+ function countSlots(slots) {
132
+ return {
133
+ rules: slots.filter((slot) => slot.kind === "rule").length,
134
+ skills: slots.filter((slot) => slot.kind === "skill").length,
135
+ instructions: slots.filter((slot) => slot.kind === "instruction").length,
136
+ extensions: slots.filter((slot) => slot.kind === "extension" || slot.kind === "extension-dir").length,
137
+ };
138
+ }
139
+ function loadoutDefinitionPath(root, name) {
140
+ const yamlPath = path.join(root, "loadouts", `${name}.yaml`);
141
+ return fileExists(yamlPath) ? yamlPath : path.join(root, "loadouts", `${name}.yml`);
142
+ }
143
+ function scopeFromRoot(root) {
144
+ return root.level === "global" ? "global" : "project";
145
+ }
146
+ function sortRows(rows) {
147
+ const order = { active: 0, drift: 1, available: 2, broken: 3 };
148
+ return [...rows].sort((a, b) => order[a.status] - order[b.status] || a.name.localeCompare(b.name));
149
+ }
150
+ //# sourceMappingURL=data.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.js","sourceRoot":"","sources":["../../../src/tui/core/data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import type { DashboardData } from "./data.js";
2
+ import type { ThemeTokens } from "./theme.js";
3
+ export interface HostContext {
4
+ theme(): ThemeTokens;
5
+ requestRender(): void;
6
+ exit(): void;
7
+ openEditor(path: string): Promise<void>;
8
+ data: DashboardData;
9
+ runtime?: RuntimeInjector;
10
+ }
11
+ export interface RuntimeStatus {
12
+ active: string[];
13
+ scope: "local" | "global";
14
+ updatedAt?: string;
15
+ }
16
+ export interface RuntimeInjector {
17
+ activate(names: string[], scope: "local" | "global"): Promise<void>;
18
+ deactivate(): Promise<void>;
19
+ status(): RuntimeStatus;
20
+ }
21
+ //# sourceMappingURL=host.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.d.ts","sourceRoot":"","sources":["../../../src/tui/core/host.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,WAAW;IAC1B,KAAK,IAAI,WAAW,CAAC;IACrB,aAAa,IAAI,IAAI,CAAC;IACtB,IAAI,IAAI,IAAI,CAAC;IACb,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxC,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,KAAK,EAAE,OAAO,GAAG,QAAQ,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,OAAO,GAAG,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,IAAI,aAAa,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=host.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"host.js","sourceRoot":"","sources":["../../../src/tui/core/host.ts"],"names":[],"mappings":""}
@@ -0,0 +1,80 @@
1
+ import type { ActivationMode, ScopeFilter } from "./model.js";
2
+ export type Intent = {
3
+ t: "move";
4
+ delta: number;
5
+ } | {
6
+ t: "section";
7
+ dir: 1 | -1;
8
+ } | {
9
+ t: "toggle";
10
+ } | {
11
+ t: "activate";
12
+ } | {
13
+ t: "deactivate";
14
+ } | {
15
+ t: "sync";
16
+ } | {
17
+ t: "clear";
18
+ } | {
19
+ t: "diffPreview";
20
+ } | {
21
+ t: "edit";
22
+ } | {
23
+ t: "enter";
24
+ } | {
25
+ t: "filterStart";
26
+ } | {
27
+ t: "filterInput";
28
+ text: string;
29
+ } | {
30
+ t: "filterChar";
31
+ char: string;
32
+ } | {
33
+ t: "filterBackspace";
34
+ } | {
35
+ t: "filterCommit";
36
+ } | {
37
+ t: "filterCancel";
38
+ } | {
39
+ t: "cycleScope";
40
+ } | {
41
+ t: "cycleTool";
42
+ } | {
43
+ t: "cycleMode";
44
+ } | {
45
+ t: "undo";
46
+ } | {
47
+ t: "refresh";
48
+ } | {
49
+ t: "openHelp";
50
+ } | {
51
+ t: "closeOverlay";
52
+ } | {
53
+ t: "quit";
54
+ } | {
55
+ t: "effectDone";
56
+ effect: Effect["t"];
57
+ ok: boolean;
58
+ message?: string;
59
+ data?: string[];
60
+ };
61
+ export type Effect = {
62
+ t: "apply";
63
+ targetSet: string[];
64
+ mode: ActivationMode;
65
+ scope: ScopeFilter;
66
+ } | {
67
+ t: "clear";
68
+ mode: ActivationMode;
69
+ scope: ScopeFilter;
70
+ } | {
71
+ t: "plan";
72
+ targetSet: string[];
73
+ scope: ScopeFilter;
74
+ } | {
75
+ t: "reload";
76
+ } | {
77
+ t: "editFile";
78
+ path: string;
79
+ };
80
+ //# sourceMappingURL=intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../../src/tui/core/intent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,MAAM,MAAM,GACd;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC5B;IAAE,CAAC,EAAE,SAAS,CAAC;IAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAA;CAAE,GAC7B;IAAE,CAAC,EAAE,QAAQ,CAAA;CAAE,GACf;IAAE,CAAC,EAAE,UAAU,CAAA;CAAE,GACjB;IAAE,CAAC,EAAE,YAAY,CAAA;CAAE,GACnB;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACb;IAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GACd;IAAE,CAAC,EAAE,aAAa,CAAA;CAAE,GACpB;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACb;IAAE,CAAC,EAAE,OAAO,CAAA;CAAE,GACd;IAAE,CAAC,EAAE,aAAa,CAAA;CAAE,GACpB;IAAE,CAAC,EAAE,aAAa,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,CAAC,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,CAAC,EAAE,iBAAiB,CAAA;CAAE,GACxB;IAAE,CAAC,EAAE,cAAc,CAAA;CAAE,GACrB;IAAE,CAAC,EAAE,cAAc,CAAA;CAAE,GACrB;IAAE,CAAC,EAAE,YAAY,CAAA;CAAE,GACnB;IAAE,CAAC,EAAE,WAAW,CAAA;CAAE,GAClB;IAAE,CAAC,EAAE,WAAW,CAAA;CAAE,GAClB;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACb;IAAE,CAAC,EAAE,SAAS,CAAA;CAAE,GAChB;IAAE,CAAC,EAAE,UAAU,CAAA;CAAE,GACjB;IAAE,CAAC,EAAE,cAAc,CAAA;CAAE,GACrB;IAAE,CAAC,EAAE,MAAM,CAAA;CAAE,GACb;IACE,CAAC,EAAE,YAAY,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;IACpB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;CACjB,CAAC;AAEN,MAAM,MAAM,MAAM,GACd;IAAE,CAAC,EAAE,OAAO,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GAC7E;IAAE,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,cAAc,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACxD;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,EAAE,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,GACtD;IAAE,CAAC,EAAE,QAAQ,CAAA;CAAE,GACf;IAAE,CAAC,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intent.js","sourceRoot":"","sources":["../../../src/tui/core/intent.ts"],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import type { Intent } from "./intent.js";
2
+ export interface KeyBinding {
3
+ keys: string[];
4
+ label: string;
5
+ intent: Intent;
6
+ hint?: boolean;
7
+ mode?: "normal" | "filter";
8
+ }
9
+ export declare const keymap: KeyBinding[];
10
+ export declare function intentForKey(key: string): Intent | undefined;
11
+ export declare function footerKeyHints(): {
12
+ key: string;
13
+ label: string;
14
+ }[];
15
+ //# sourceMappingURL=keymap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymap.d.ts","sourceRoot":"","sources":["../../../src/tui/core/keymap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC5B;AAED,eAAO,MAAM,MAAM,EAAE,UAAU,EA0B9B,CAAC;AAEF,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE5D;AAED,wBAAgB,cAAc,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAAE,CAIjE"}
@@ -0,0 +1,36 @@
1
+ export const keymap = [
2
+ { keys: ["j", "down"], label: "move down", intent: { t: "move", delta: 1 } },
3
+ { keys: ["k", "up"], label: "move up", intent: { t: "move", delta: -1 } },
4
+ { keys: ["tab"], label: "next section", intent: { t: "section", dir: 1 } },
5
+ { keys: ["shift+tab"], label: "prev section", intent: { t: "section", dir: -1 } },
6
+ { keys: ["space"], label: "toggle", intent: { t: "toggle" }, hint: true },
7
+ { keys: ["a"], label: "activate", intent: { t: "activate" }, hint: true },
8
+ { keys: ["d"], label: "deactivate", intent: { t: "deactivate" }, hint: true },
9
+ { keys: ["s"], label: "sync", intent: { t: "sync" }, hint: true },
10
+ { keys: ["x"], label: "clear", intent: { t: "clear" }, hint: true },
11
+ { keys: ["enter"], label: "details", intent: { t: "enter" } },
12
+ { keys: ["D"], label: "diff", intent: { t: "diffPreview" }, hint: true },
13
+ { keys: ["e"], label: "edit", intent: { t: "edit" }, hint: true },
14
+ { keys: ["m"], label: "mode", intent: { t: "cycleMode" } },
15
+ { keys: ["g"], label: "scope", intent: { t: "cycleScope" } },
16
+ { keys: ["t"], label: "tool", intent: { t: "cycleTool" } },
17
+ { keys: ["/"], label: "find", intent: { t: "filterStart" }, hint: true },
18
+ { keys: ["u"], label: "undo", intent: { t: "undo" }, hint: true },
19
+ { keys: ["r"], label: "refresh", intent: { t: "refresh" } },
20
+ { keys: ["?"], label: "help", intent: { t: "openHelp" }, hint: true },
21
+ { keys: ["esc"], label: "close/cancel", intent: { t: "closeOverlay" } },
22
+ { keys: ["q"], label: "quit", intent: { t: "quit" } },
23
+ { keys: ["printable"], label: "filter text", intent: { t: "filterChar", char: "" }, mode: "filter" },
24
+ { keys: ["backspace"], label: "delete filter char", intent: { t: "filterBackspace" }, mode: "filter" },
25
+ { keys: ["enter"], label: "commit filter", intent: { t: "filterCommit" }, mode: "filter" },
26
+ { keys: ["esc"], label: "cancel filter", intent: { t: "filterCancel" }, mode: "filter" },
27
+ ];
28
+ export function intentForKey(key) {
29
+ return keymap.find((binding) => binding.mode !== "filter" && binding.keys.includes(key))?.intent;
30
+ }
31
+ export function footerKeyHints() {
32
+ return keymap
33
+ .filter((binding) => binding.mode !== "filter" && binding.hint)
34
+ .map((binding) => ({ key: binding.keys[0], label: binding.label }));
35
+ }
36
+ //# sourceMappingURL=keymap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keymap.js","sourceRoot":"","sources":["../../../src/tui/core/keymap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { DashboardData, LoadoutRow } from "./data.js";
2
+ export type Section = "active" | "available" | "issues";
3
+ export type ActivationMode = "filesystem" | "runtime";
4
+ export type ScopeFilter = "global" | "project";
5
+ export interface DetailModel {
6
+ rowId: string;
7
+ }
8
+ export interface UndoSnapshot {
9
+ rows: LoadoutRow[];
10
+ sections: Record<Section, string[]>;
11
+ cursor: {
12
+ section: Section;
13
+ index: number;
14
+ };
15
+ targetSet: string[];
16
+ scope: ScopeFilter;
17
+ }
18
+ export interface Model {
19
+ rows: LoadoutRow[];
20
+ sections: Record<Section, string[]>;
21
+ cursor: {
22
+ section: Section;
23
+ index: number;
24
+ };
25
+ filter: {
26
+ text: string;
27
+ scope?: ScopeFilter;
28
+ tool?: string;
29
+ };
30
+ filtering: boolean;
31
+ mode: ActivationMode;
32
+ scope: ScopeFilter;
33
+ staged?: Set<string>;
34
+ undo?: UndoSnapshot;
35
+ detail?: DetailModel;
36
+ overlay?: "help" | "diff" | "confirm" | null;
37
+ busy?: {
38
+ label: string;
39
+ } | null;
40
+ lastResult?: {
41
+ text: string;
42
+ variant: "info" | "success" | "error";
43
+ };
44
+ diffLines?: string[];
45
+ quitRequested?: boolean;
46
+ }
47
+ export declare function createInitialModel(data: DashboardData, options?: {
48
+ mode?: ActivationMode;
49
+ scope?: ScopeFilter;
50
+ }): Model;
51
+ export declare function buildSections(rows: LoadoutRow[]): Record<Section, string[]>;
52
+ export declare function firstCursor(sections: Record<Section, string[]>): Model["cursor"];
53
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/tui/core/model.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE3D,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;AACxD,MAAM,MAAM,cAAc,GAAG,YAAY,GAAG,SAAS,CAAC;AACtD,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE/C,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACpC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,KAAK,EAAE,WAAW,CAAC;CACpB;AAED,MAAM,WAAW,KAAK;IACpB,IAAI,EAAE,UAAU,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACpC,MAAM,EAAE;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAC5C,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,WAAW,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,WAAW,CAAC;IACnB,MAAM,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC;IAC7C,IAAI,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAChC,UAAU,CAAC,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAA;KAAE,CAAC;IACrE,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,aAAa,EACnB,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,cAAc,CAAC;IAAC,KAAK,CAAC,EAAE,WAAW,CAAA;CAAO,GAC3D,KAAK,CAiBP;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,CAM3E;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAKhF"}
@@ -0,0 +1,33 @@
1
+ export function createInitialModel(data, options = {}) {
2
+ const sections = buildSections(data.rows);
3
+ return {
4
+ rows: data.rows,
5
+ sections,
6
+ cursor: firstCursor(sections),
7
+ filter: { text: "" },
8
+ filtering: false,
9
+ mode: options.mode ?? "filesystem",
10
+ scope: options.scope ?? "project",
11
+ staged: new Set(),
12
+ overlay: null,
13
+ busy: null,
14
+ lastResult: data.issues.length
15
+ ? { text: `${data.issues.length} issue(s) detected`, variant: "error" }
16
+ : undefined,
17
+ };
18
+ }
19
+ export function buildSections(rows) {
20
+ return {
21
+ active: rows.filter((r) => r.status === "active" || r.status === "drift").map((r) => r.id),
22
+ available: rows.filter((r) => r.status === "available").map((r) => r.id),
23
+ issues: rows.filter((r) => r.status === "broken").map((r) => r.id),
24
+ };
25
+ }
26
+ export function firstCursor(sections) {
27
+ for (const section of ["active", "available", "issues"]) {
28
+ if (sections[section].length > 0)
29
+ return { section, index: 0 };
30
+ }
31
+ return { section: "active", index: 0 };
32
+ }
33
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/tui/core/model.ts"],"names":[],"mappings":"AAoCA,MAAM,UAAU,kBAAkB,CAChC,IAAmB,EACnB,UAA0D,EAAE;IAE5D,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,OAAO;QACL,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,QAAQ;QACR,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC;QAC7B,MAAM,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE;QACpB,SAAS,EAAE,KAAK;QAChB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,YAAY;QAClC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,SAAS;QACjC,MAAM,EAAE,IAAI,GAAG,EAAE;QACjB,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI;QACV,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM;YAC5B,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,oBAAoB,EAAE,OAAO,EAAE,OAAO,EAAE;YACvE,CAAC,CAAC,SAAS;KACd,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,IAAkB;IAC9C,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1F,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxE,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,QAAmC;IAC7D,KAAK,MAAM,OAAO,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,CAAU,EAAE,CAAC;QACjE,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACzC,CAAC"}
@@ -0,0 +1,15 @@
1
+ export type StyleToken = "text" | "muted" | "dim" | "accent" | "success" | "error" | "warning" | "border";
2
+ export interface ThemeTokens {
3
+ text: string;
4
+ muted: string;
5
+ dim: string;
6
+ accent: string;
7
+ success: string;
8
+ error: string;
9
+ warning: string;
10
+ border: string;
11
+ background?: string;
12
+ selectedBackground?: string;
13
+ }
14
+ export declare const defaultThemeTokens: ThemeTokens;
15
+ //# sourceMappingURL=theme.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.d.ts","sourceRoot":"","sources":["../../../src/tui/core/theme.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,OAAO,GACP,KAAK,GACL,QAAQ,GACR,SAAS,GACT,OAAO,GACP,SAAS,GACT,QAAQ,CAAC;AAEb,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,eAAO,MAAM,kBAAkB,EAAE,WAShC,CAAC"}
@@ -0,0 +1,11 @@
1
+ export const defaultThemeTokens = {
2
+ text: "text",
3
+ muted: "muted",
4
+ dim: "dim",
5
+ accent: "accent",
6
+ success: "success",
7
+ error: "error",
8
+ warning: "warning",
9
+ border: "border",
10
+ };
11
+ //# sourceMappingURL=theme.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"theme.js","sourceRoot":"","sources":["../../../src/tui/core/theme.ts"],"names":[],"mappings":"AAuBA,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC7C,IAAI,EAAE,MAAM;IACZ,KAAK,EAAE,OAAO;IACd,GAAG,EAAE,KAAK;IACV,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,SAAS;IAClB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,SAAS;IAClB,MAAM,EAAE,QAAQ;CACjB,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type Model } from "./model.js";
2
+ import type { Effect, Intent } from "./intent.js";
3
+ export interface UpdateResult {
4
+ model: Model;
5
+ effect?: Effect;
6
+ }
7
+ export declare function update(model: Model, intent: Intent): UpdateResult;
8
+ //# sourceMappingURL=update.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../../src/tui/core/update.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,KAAK,EAAkC,MAAM,YAAY,CAAC;AACpG,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAGlD,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAID,wBAAgB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,YAAY,CA0BjE"}