loadouts 0.1.11

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 (261) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +108 -0
  3. package/bundled/loadouts/loadouts.yaml +5 -0
  4. package/bundled/skills/loadout-usage/SKILL.md +110 -0
  5. package/dist/builtins/index.d.ts +14 -0
  6. package/dist/builtins/index.d.ts.map +1 -0
  7. package/dist/builtins/index.js +58 -0
  8. package/dist/builtins/index.js.map +1 -0
  9. package/dist/builtins/kinds/extension.d.ts +3 -0
  10. package/dist/builtins/kinds/extension.d.ts.map +1 -0
  11. package/dist/builtins/kinds/extension.js +9 -0
  12. package/dist/builtins/kinds/extension.js.map +1 -0
  13. package/dist/builtins/kinds/instruction.d.ts +3 -0
  14. package/dist/builtins/kinds/instruction.d.ts.map +1 -0
  15. package/dist/builtins/kinds/instruction.js +8 -0
  16. package/dist/builtins/kinds/instruction.js.map +1 -0
  17. package/dist/builtins/kinds/prompt.d.ts +3 -0
  18. package/dist/builtins/kinds/prompt.d.ts.map +1 -0
  19. package/dist/builtins/kinds/prompt.js +8 -0
  20. package/dist/builtins/kinds/prompt.js.map +1 -0
  21. package/dist/builtins/kinds/rule.d.ts +3 -0
  22. package/dist/builtins/kinds/rule.d.ts.map +1 -0
  23. package/dist/builtins/kinds/rule.js +10 -0
  24. package/dist/builtins/kinds/rule.js.map +1 -0
  25. package/dist/builtins/kinds/skill.d.ts +3 -0
  26. package/dist/builtins/kinds/skill.d.ts.map +1 -0
  27. package/dist/builtins/kinds/skill.js +8 -0
  28. package/dist/builtins/kinds/skill.js.map +1 -0
  29. package/dist/builtins/kinds/theme.d.ts +3 -0
  30. package/dist/builtins/kinds/theme.d.ts.map +1 -0
  31. package/dist/builtins/kinds/theme.js +8 -0
  32. package/dist/builtins/kinds/theme.js.map +1 -0
  33. package/dist/builtins/tools/claude-code.d.ts +3 -0
  34. package/dist/builtins/tools/claude-code.d.ts.map +1 -0
  35. package/dist/builtins/tools/claude-code.js +30 -0
  36. package/dist/builtins/tools/claude-code.js.map +1 -0
  37. package/dist/builtins/tools/codex.d.ts +3 -0
  38. package/dist/builtins/tools/codex.d.ts.map +1 -0
  39. package/dist/builtins/tools/codex.js +17 -0
  40. package/dist/builtins/tools/codex.js.map +1 -0
  41. package/dist/builtins/tools/cursor.d.ts +3 -0
  42. package/dist/builtins/tools/cursor.d.ts.map +1 -0
  43. package/dist/builtins/tools/cursor.js +22 -0
  44. package/dist/builtins/tools/cursor.js.map +1 -0
  45. package/dist/builtins/tools/opencode.d.ts +3 -0
  46. package/dist/builtins/tools/opencode.d.ts.map +1 -0
  47. package/dist/builtins/tools/opencode.js +45 -0
  48. package/dist/builtins/tools/opencode.js.map +1 -0
  49. package/dist/builtins/tools/pi.d.ts +3 -0
  50. package/dist/builtins/tools/pi.d.ts.map +1 -0
  51. package/dist/builtins/tools/pi.js +22 -0
  52. package/dist/builtins/tools/pi.js.map +1 -0
  53. package/dist/cli/commands/activate.d.ts +12 -0
  54. package/dist/cli/commands/activate.d.ts.map +1 -0
  55. package/dist/cli/commands/activate.js +70 -0
  56. package/dist/cli/commands/activate.js.map +1 -0
  57. package/dist/cli/commands/check.d.ts +12 -0
  58. package/dist/cli/commands/check.d.ts.map +1 -0
  59. package/dist/cli/commands/check.js +152 -0
  60. package/dist/cli/commands/check.js.map +1 -0
  61. package/dist/cli/commands/clear.d.ts +12 -0
  62. package/dist/cli/commands/clear.d.ts.map +1 -0
  63. package/dist/cli/commands/clear.js +25 -0
  64. package/dist/cli/commands/clear.js.map +1 -0
  65. package/dist/cli/commands/create.d.ts +11 -0
  66. package/dist/cli/commands/create.d.ts.map +1 -0
  67. package/dist/cli/commands/create.js +113 -0
  68. package/dist/cli/commands/create.js.map +1 -0
  69. package/dist/cli/commands/deactivate.d.ts +12 -0
  70. package/dist/cli/commands/deactivate.d.ts.map +1 -0
  71. package/dist/cli/commands/deactivate.js +67 -0
  72. package/dist/cli/commands/deactivate.js.map +1 -0
  73. package/dist/cli/commands/diff.d.ts +16 -0
  74. package/dist/cli/commands/diff.d.ts.map +1 -0
  75. package/dist/cli/commands/diff.js +144 -0
  76. package/dist/cli/commands/diff.js.map +1 -0
  77. package/dist/cli/commands/docs.d.ts +12 -0
  78. package/dist/cli/commands/docs.d.ts.map +1 -0
  79. package/dist/cli/commands/docs.js +115 -0
  80. package/dist/cli/commands/docs.js.map +1 -0
  81. package/dist/cli/commands/edit.d.ts +11 -0
  82. package/dist/cli/commands/edit.d.ts.map +1 -0
  83. package/dist/cli/commands/edit.js +71 -0
  84. package/dist/cli/commands/edit.js.map +1 -0
  85. package/dist/cli/commands/fallback.d.ts +9 -0
  86. package/dist/cli/commands/fallback.d.ts.map +1 -0
  87. package/dist/cli/commands/fallback.js +35 -0
  88. package/dist/cli/commands/fallback.js.map +1 -0
  89. package/dist/cli/commands/info.d.ts +23 -0
  90. package/dist/cli/commands/info.d.ts.map +1 -0
  91. package/dist/cli/commands/info.js +314 -0
  92. package/dist/cli/commands/info.js.map +1 -0
  93. package/dist/cli/commands/init.d.ts +18 -0
  94. package/dist/cli/commands/init.d.ts.map +1 -0
  95. package/dist/cli/commands/init.js +255 -0
  96. package/dist/cli/commands/init.js.map +1 -0
  97. package/dist/cli/commands/install.d.ts +27 -0
  98. package/dist/cli/commands/install.d.ts.map +1 -0
  99. package/dist/cli/commands/install.js +586 -0
  100. package/dist/cli/commands/install.js.map +1 -0
  101. package/dist/cli/commands/instructions.d.ts +8 -0
  102. package/dist/cli/commands/instructions.d.ts.map +1 -0
  103. package/dist/cli/commands/instructions.js +218 -0
  104. package/dist/cli/commands/instructions.js.map +1 -0
  105. package/dist/cli/commands/kinds.d.ts +6 -0
  106. package/dist/cli/commands/kinds.d.ts.map +1 -0
  107. package/dist/cli/commands/kinds.js +59 -0
  108. package/dist/cli/commands/kinds.js.map +1 -0
  109. package/dist/cli/commands/list.d.ts +12 -0
  110. package/dist/cli/commands/list.d.ts.map +1 -0
  111. package/dist/cli/commands/list.js +182 -0
  112. package/dist/cli/commands/list.js.map +1 -0
  113. package/dist/cli/commands/policy.d.ts +28 -0
  114. package/dist/cli/commands/policy.d.ts.map +1 -0
  115. package/dist/cli/commands/policy.js +50 -0
  116. package/dist/cli/commands/policy.js.map +1 -0
  117. package/dist/cli/commands/remove.d.ts +24 -0
  118. package/dist/cli/commands/remove.d.ts.map +1 -0
  119. package/dist/cli/commands/remove.js +64 -0
  120. package/dist/cli/commands/remove.js.map +1 -0
  121. package/dist/cli/commands/render-engine.d.ts +36 -0
  122. package/dist/cli/commands/render-engine.d.ts.map +1 -0
  123. package/dist/cli/commands/render-engine.js +177 -0
  124. package/dist/cli/commands/render-engine.js.map +1 -0
  125. package/dist/cli/commands/rule.d.ts +11 -0
  126. package/dist/cli/commands/rule.d.ts.map +1 -0
  127. package/dist/cli/commands/rule.js +302 -0
  128. package/dist/cli/commands/rule.js.map +1 -0
  129. package/dist/cli/commands/sanitize.d.ts +14 -0
  130. package/dist/cli/commands/sanitize.d.ts.map +1 -0
  131. package/dist/cli/commands/sanitize.js +62 -0
  132. package/dist/cli/commands/sanitize.js.map +1 -0
  133. package/dist/cli/commands/skill.d.ts +11 -0
  134. package/dist/cli/commands/skill.d.ts.map +1 -0
  135. package/dist/cli/commands/skill.js +380 -0
  136. package/dist/cli/commands/skill.js.map +1 -0
  137. package/dist/cli/commands/status.d.ts +26 -0
  138. package/dist/cli/commands/status.d.ts.map +1 -0
  139. package/dist/cli/commands/status.js +454 -0
  140. package/dist/cli/commands/status.js.map +1 -0
  141. package/dist/cli/commands/sync.d.ts +14 -0
  142. package/dist/cli/commands/sync.d.ts.map +1 -0
  143. package/dist/cli/commands/sync.js +53 -0
  144. package/dist/cli/commands/sync.js.map +1 -0
  145. package/dist/cli/commands/update.d.ts +3 -0
  146. package/dist/cli/commands/update.d.ts.map +1 -0
  147. package/dist/cli/commands/update.js +48 -0
  148. package/dist/cli/commands/update.js.map +1 -0
  149. package/dist/cli/index.d.ts +11 -0
  150. package/dist/cli/index.d.ts.map +1 -0
  151. package/dist/cli/index.js +134 -0
  152. package/dist/cli/index.js.map +1 -0
  153. package/dist/core/config.d.ts +64 -0
  154. package/dist/core/config.d.ts.map +1 -0
  155. package/dist/core/config.js +166 -0
  156. package/dist/core/config.js.map +1 -0
  157. package/dist/core/discovery.d.ts +50 -0
  158. package/dist/core/discovery.d.ts.map +1 -0
  159. package/dist/core/discovery.js +249 -0
  160. package/dist/core/discovery.js.map +1 -0
  161. package/dist/core/fallback.d.ts +23 -0
  162. package/dist/core/fallback.d.ts.map +1 -0
  163. package/dist/core/fallback.js +119 -0
  164. package/dist/core/fallback.js.map +1 -0
  165. package/dist/core/import-discovery.d.ts +56 -0
  166. package/dist/core/import-discovery.d.ts.map +1 -0
  167. package/dist/core/import-discovery.js +304 -0
  168. package/dist/core/import-discovery.js.map +1 -0
  169. package/dist/core/kindLoader.d.ts +119 -0
  170. package/dist/core/kindLoader.d.ts.map +1 -0
  171. package/dist/core/kindLoader.js +141 -0
  172. package/dist/core/kindLoader.js.map +1 -0
  173. package/dist/core/manifest.d.ts +39 -0
  174. package/dist/core/manifest.d.ts.map +1 -0
  175. package/dist/core/manifest.js +167 -0
  176. package/dist/core/manifest.js.map +1 -0
  177. package/dist/core/plugin.d.ts +22 -0
  178. package/dist/core/plugin.d.ts.map +1 -0
  179. package/dist/core/plugin.js +20 -0
  180. package/dist/core/plugin.js.map +1 -0
  181. package/dist/core/registry.d.ts +115 -0
  182. package/dist/core/registry.d.ts.map +1 -0
  183. package/dist/core/registry.js +105 -0
  184. package/dist/core/registry.js.map +1 -0
  185. package/dist/core/render.d.ts +64 -0
  186. package/dist/core/render.d.ts.map +1 -0
  187. package/dist/core/render.js +457 -0
  188. package/dist/core/render.js.map +1 -0
  189. package/dist/core/resolve.d.ts +39 -0
  190. package/dist/core/resolve.d.ts.map +1 -0
  191. package/dist/core/resolve.js +128 -0
  192. package/dist/core/resolve.js.map +1 -0
  193. package/dist/core/schema.d.ts +308 -0
  194. package/dist/core/schema.d.ts.map +1 -0
  195. package/dist/core/schema.js +81 -0
  196. package/dist/core/schema.js.map +1 -0
  197. package/dist/core/scope.d.ts +74 -0
  198. package/dist/core/scope.d.ts.map +1 -0
  199. package/dist/core/scope.js +176 -0
  200. package/dist/core/scope.js.map +1 -0
  201. package/dist/core/template.d.ts +32 -0
  202. package/dist/core/template.d.ts.map +1 -0
  203. package/dist/core/template.js +32 -0
  204. package/dist/core/template.js.map +1 -0
  205. package/dist/core/tokens.d.ts +33 -0
  206. package/dist/core/tokens.d.ts.map +1 -0
  207. package/dist/core/tokens.js +97 -0
  208. package/dist/core/tokens.js.map +1 -0
  209. package/dist/core/types.d.ts +103 -0
  210. package/dist/core/types.d.ts.map +1 -0
  211. package/dist/core/types.js +10 -0
  212. package/dist/core/types.js.map +1 -0
  213. package/dist/index.d.ts +12 -0
  214. package/dist/index.d.ts.map +1 -0
  215. package/dist/index.js +24 -0
  216. package/dist/index.js.map +1 -0
  217. package/dist/lib/artifact-paths.d.ts +39 -0
  218. package/dist/lib/artifact-paths.d.ts.map +1 -0
  219. package/dist/lib/artifact-paths.js +83 -0
  220. package/dist/lib/artifact-paths.js.map +1 -0
  221. package/dist/lib/artifact-table.d.ts +126 -0
  222. package/dist/lib/artifact-table.d.ts.map +1 -0
  223. package/dist/lib/artifact-table.js +263 -0
  224. package/dist/lib/artifact-table.js.map +1 -0
  225. package/dist/lib/editor.d.ts +17 -0
  226. package/dist/lib/editor.d.ts.map +1 -0
  227. package/dist/lib/editor.js +33 -0
  228. package/dist/lib/editor.js.map +1 -0
  229. package/dist/lib/fs.d.ts +87 -0
  230. package/dist/lib/fs.d.ts.map +1 -0
  231. package/dist/lib/fs.js +229 -0
  232. package/dist/lib/fs.js.map +1 -0
  233. package/dist/lib/git.d.ts +13 -0
  234. package/dist/lib/git.d.ts.map +1 -0
  235. package/dist/lib/git.js +28 -0
  236. package/dist/lib/git.js.map +1 -0
  237. package/dist/lib/gitignore.d.ts +26 -0
  238. package/dist/lib/gitignore.d.ts.map +1 -0
  239. package/dist/lib/gitignore.js +97 -0
  240. package/dist/lib/gitignore.js.map +1 -0
  241. package/dist/lib/loadout-column.d.ts +66 -0
  242. package/dist/lib/loadout-column.d.ts.map +1 -0
  243. package/dist/lib/loadout-column.js +66 -0
  244. package/dist/lib/loadout-column.js.map +1 -0
  245. package/dist/lib/output.d.ts +15 -0
  246. package/dist/lib/output.d.ts.map +1 -0
  247. package/dist/lib/output.js +32 -0
  248. package/dist/lib/output.js.map +1 -0
  249. package/dist/lib/scope-indicators.d.ts +60 -0
  250. package/dist/lib/scope-indicators.d.ts.map +1 -0
  251. package/dist/lib/scope-indicators.js +110 -0
  252. package/dist/lib/scope-indicators.js.map +1 -0
  253. package/docs/authoring.md +182 -0
  254. package/docs/commands.md +192 -0
  255. package/docs/concepts.md +114 -0
  256. package/docs/index.md +60 -0
  257. package/docs/quickstart.md +100 -0
  258. package/docs/troubleshooting.md +147 -0
  259. package/docs/visual-language.md +251 -0
  260. package/docs/workflows.md +184 -0
  261. package/package.json +54 -0
@@ -0,0 +1,263 @@
1
+ /**
2
+ * Shared artifact table rendering utilities.
3
+ *
4
+ * All commands that display artifact information should use these utilities
5
+ * to maintain visual consistency. See docs/visual-language.md for the full spec.
6
+ */
7
+ import chalk from "chalk";
8
+ import { extractRelativePath } from "./artifact-paths.js";
9
+ // Sort order for artifact kinds in display
10
+ // Prioritizes context-heavy kinds first, then alphabetical for the rest
11
+ export const KIND_SORT_ORDER = {
12
+ instruction: 0,
13
+ rule: 1,
14
+ skill: 2,
15
+ prompt: 3, // slash commands
16
+ // Everything else gets 100, sorted alphabetically within that tier
17
+ };
18
+ /**
19
+ * Extract artifact display name from a relative path.
20
+ *
21
+ * Examples:
22
+ * skills/codebase-layout → codebase-layout
23
+ * skills/codebase-layout/SKILL.md → codebase-layout
24
+ * rules/agent-definitions.md → agent-definitions
25
+ * instructions/AGENTS.base.md → AGENTS.base.md
26
+ */
27
+ export function getArtifactName(relativePath, kind) {
28
+ // For skills, extract the skill directory name
29
+ if (kind === "skill") {
30
+ const match = relativePath.match(/^skills\/([^/]+)/);
31
+ if (match)
32
+ return match[1];
33
+ }
34
+ // For rules, strip the rules/ prefix and .md extension
35
+ if (kind === "rule") {
36
+ const match = relativePath.match(/^rules\/(.+)\.md$/);
37
+ if (match)
38
+ return match[1];
39
+ }
40
+ // For instructions, extract AGENTS.<loadout>.md filename
41
+ if (kind === "instruction") {
42
+ // Handle instructions/AGENTS.<loadout>.md -> AGENTS.<loadout>.md
43
+ const dirMatch = relativePath.match(/^instructions\/(AGENTS\.[^/]+\.md)$/);
44
+ if (dirMatch)
45
+ return dirMatch[1];
46
+ // Handle legacy AGENTS.md at root
47
+ const rootMatch = relativePath.match(/^([^/]+\.md)$/);
48
+ if (rootMatch)
49
+ return rootMatch[1];
50
+ }
51
+ // For extensions, strip the extensions/ prefix
52
+ if (kind === "extension") {
53
+ const match = relativePath.match(/^extensions\/(.+)$/);
54
+ if (match)
55
+ return match[1];
56
+ }
57
+ // Fallback: return the path as-is
58
+ return relativePath;
59
+ }
60
+ /**
61
+ * Sort artifacts by kind priority, then alphabetically by name.
62
+ */
63
+ export function sortArtifacts(items) {
64
+ return [...items].sort((a, b) => {
65
+ const orderA = KIND_SORT_ORDER[a.kind] ?? 100;
66
+ const orderB = KIND_SORT_ORDER[b.kind] ?? 100;
67
+ if (orderA !== orderB)
68
+ return orderA - orderB;
69
+ // Within same priority tier, sort by kind name then artifact name
70
+ if (a.kind !== b.kind)
71
+ return a.kind.localeCompare(b.kind);
72
+ return a.name.localeCompare(b.name);
73
+ });
74
+ }
75
+ /**
76
+ * Truncate a string with leading ellipsis if too long.
77
+ */
78
+ export function truncatePath(str, maxLen) {
79
+ if (str.length <= maxLen)
80
+ return str;
81
+ return "…" + str.slice(-(maxLen - 1));
82
+ }
83
+ export function getToolColumns(tools) {
84
+ return tools.map((t) => ({ tool: t, width: Math.max(t.length, 2) }));
85
+ }
86
+ /**
87
+ * Render table header row.
88
+ */
89
+ export function renderHeader(kindWidth, nameWidth, toolCols, extraHeaders = []) {
90
+ const kindH = chalk.dim("kind".padEnd(kindWidth));
91
+ const nameH = chalk.dim("artifact".padEnd(nameWidth));
92
+ const extraH = extraHeaders.map((h) => chalk.dim(h.label.padStart(h.width)) + " ").join("");
93
+ const toolH = toolCols.map((c) => chalk.dim(c.tool)).join(" ");
94
+ console.log(` ${kindH} ${nameH} ${extraH}${toolH}`);
95
+ }
96
+ /**
97
+ * Render table separator row.
98
+ */
99
+ export function renderSeparator(kindWidth, nameWidth, toolCols, extraWidths = []) {
100
+ const parts = [
101
+ "─".repeat(kindWidth),
102
+ "─".repeat(nameWidth),
103
+ ...extraWidths.map((w) => "─".repeat(w)),
104
+ toolCols.map((c) => "─".repeat(c.width)).join(" "),
105
+ ];
106
+ console.log(chalk.dim(` ${parts.join(" ")}`));
107
+ }
108
+ /**
109
+ * Calculate dynamic column widths for kind and name columns.
110
+ */
111
+ export function calculateColumnWidths(artifacts, minKindWidth = 4, maxNameWidth = 35) {
112
+ const kindWidth = Math.max(minKindWidth, "kind".length, ...artifacts.map((a) => a.kind.length));
113
+ const maxNameLen = Math.max("artifact".length, ...artifacts.map((a) => a.name.length));
114
+ const nameWidth = Math.min(maxNameLen, maxNameWidth);
115
+ return { kindWidth, nameWidth };
116
+ }
117
+ export const CHANGE_SYMBOLS = {
118
+ added: { symbol: "+", color: chalk.green },
119
+ updated: { symbol: "~", color: chalk.yellow },
120
+ removed: { symbol: "-", color: chalk.red },
121
+ unchanged: { symbol: "✓", color: chalk.green },
122
+ shadowed: { symbol: "?", color: chalk.yellow },
123
+ };
124
+ // Mode abbreviations for dry-run display
125
+ export const MODE_ABBREV = {
126
+ symlink: "sym",
127
+ copy: "copy",
128
+ generate: "gen",
129
+ };
130
+ /**
131
+ * Group outputs by source artifact (sourcePath).
132
+ * Returns artifacts sorted by kind priority then name.
133
+ */
134
+ export function groupOutputsByArtifact(outputs) {
135
+ const bySource = new Map();
136
+ for (const { spec, change } of outputs) {
137
+ const key = spec.sourcePath;
138
+ if (!bySource.has(key)) {
139
+ const relativePath = extractRelativePath(spec.sourcePath);
140
+ bySource.set(key, {
141
+ kind: spec.kind,
142
+ name: getArtifactName(relativePath, spec.kind),
143
+ sourcePath: spec.sourcePath,
144
+ outputs: new Map(),
145
+ overallChange: "unchanged",
146
+ });
147
+ }
148
+ const artifact = bySource.get(key);
149
+ artifact.outputs.set(spec.tool, {
150
+ tool: spec.tool,
151
+ targetPath: spec.targetPath,
152
+ mode: spec.mode,
153
+ change,
154
+ });
155
+ // Update overall change to worst status
156
+ artifact.overallChange = worstChange(artifact.overallChange, change);
157
+ }
158
+ // Convert to array and sort
159
+ const artifacts = Array.from(bySource.values());
160
+ return sortArtifacts(artifacts);
161
+ }
162
+ /**
163
+ * Determine the "worst" change type (for overall status).
164
+ */
165
+ function worstChange(a, b) {
166
+ const priority = {
167
+ unchanged: 0,
168
+ added: 1,
169
+ updated: 2,
170
+ shadowed: 3,
171
+ removed: 4,
172
+ };
173
+ return priority[b] > priority[a] ? b : a;
174
+ }
175
+ /**
176
+ * Render a change table showing artifacts as rows and tools as columns.
177
+ * Cells show change indicators (+, ~, -, ✓) or mode abbreviations.
178
+ */
179
+ export function renderChangeTable(artifacts, tools, options = {}) {
180
+ if (artifacts.length === 0) {
181
+ console.log(chalk.dim(" No changes."));
182
+ return;
183
+ }
184
+ const { showMode = false, showAction = false } = options;
185
+ const { kindWidth, nameWidth } = calculateColumnWidths(artifacts);
186
+ const toolCols = getToolColumns(tools);
187
+ const ACTION_W = 8;
188
+ // ── Header ───────────────────────────────────────────────────────────────
189
+ const kindH = chalk.dim("kind".padEnd(kindWidth));
190
+ const nameH = chalk.dim("artifact".padEnd(nameWidth));
191
+ const toolH = toolCols.map((c) => chalk.dim(c.tool)).join(" ");
192
+ const actionH = showAction ? " " + chalk.dim("action") : "";
193
+ console.log(` ${kindH} ${nameH} ${toolH}${actionH}`);
194
+ // ── Separator ─────────────────────────────────────────────────────────────
195
+ const sepParts = [
196
+ "─".repeat(kindWidth),
197
+ "─".repeat(nameWidth),
198
+ toolCols.map((c) => "─".repeat(c.width)).join(" "),
199
+ ];
200
+ if (showAction)
201
+ sepParts.push("─".repeat(ACTION_W));
202
+ console.log(chalk.dim(` ${sepParts.join(" ")}`));
203
+ // ── Rows ──────────────────────────────────────────────────────────────────
204
+ for (const artifact of artifacts) {
205
+ const kindCell = chalk.dim(artifact.kind.padEnd(kindWidth));
206
+ const nameCell = truncatePath(artifact.name, nameWidth).padEnd(nameWidth);
207
+ // Tool cells
208
+ const toolCells = toolCols
209
+ .map((c) => {
210
+ const output = artifact.outputs.get(c.tool);
211
+ if (!output) {
212
+ return chalk.dim("—") + " ".repeat(c.width - 1);
213
+ }
214
+ if (showMode) {
215
+ // Show mode abbreviation
216
+ const abbrev = MODE_ABBREV[output.mode];
217
+ const padded = abbrev.padEnd(c.width);
218
+ return output.change === "unchanged"
219
+ ? chalk.dim(padded)
220
+ : chalk.cyan(padded);
221
+ }
222
+ else {
223
+ // Show change symbol
224
+ const { symbol, color } = CHANGE_SYMBOLS[output.change];
225
+ return color(symbol) + " ".repeat(c.width - 1);
226
+ }
227
+ })
228
+ .join(" ");
229
+ // Action cell (overall change)
230
+ let actionCell = "";
231
+ if (showAction) {
232
+ const { color } = CHANGE_SYMBOLS[artifact.overallChange];
233
+ actionCell = " " + color(artifact.overallChange);
234
+ }
235
+ console.log(` ${kindCell} ${nameCell} ${toolCells}${actionCell}`);
236
+ }
237
+ }
238
+ /**
239
+ * Render a summary line for changes.
240
+ */
241
+ export function renderChangeSummary(added, updated, removed) {
242
+ const total = added + updated + removed;
243
+ if (total === 0) {
244
+ console.log(chalk.green("✓"), "All outputs in sync");
245
+ return;
246
+ }
247
+ const parts = [];
248
+ if (added > 0)
249
+ parts.push(`${added} added`);
250
+ if (updated > 0)
251
+ parts.push(`${updated} updated`);
252
+ if (removed > 0)
253
+ parts.push(`${removed} removed`);
254
+ console.log(chalk.green("✓"), `${total} changes: ${parts.join(", ")}`);
255
+ }
256
+ /**
257
+ * Render a dry-run summary.
258
+ */
259
+ export function renderDryRunSummary(totalOutputs, totalTools) {
260
+ console.log();
261
+ console.log(chalk.dim(` ${totalOutputs} outputs to ${totalTools} tools`));
262
+ }
263
+ //# sourceMappingURL=artifact-table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"artifact-table.js","sourceRoot":"","sources":["../../src/lib/artifact-table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shared editor utilities for opening files in $EDITOR.
3
+ */
4
+ export interface EditorOptions {
5
+ /** Working directory for the editor process */
6
+ cwd?: string;
7
+ /** Callback when editor exits successfully */
8
+ onSuccess?: () => void;
9
+ }
10
+ /**
11
+ * Open a file in the user's preferred editor.
12
+ *
13
+ * Uses $EDITOR, falling back to $VISUAL, then vim.
14
+ * The editor is spawned with the given cwd so file trees show the loadout directory.
15
+ */
16
+ export declare function openInEditor(filePath: string, options?: EditorOptions): Promise<void>;
17
+ //# sourceMappingURL=editor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/lib/editor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,8CAA8C;IAC9C,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;CACxB;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAC1B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,aAAkB,GAC1B,OAAO,CAAC,IAAI,CAAC,CAuBf"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Shared editor utilities for opening files in $EDITOR.
3
+ */
4
+ import { spawn } from "node:child_process";
5
+ /**
6
+ * Open a file in the user's preferred editor.
7
+ *
8
+ * Uses $EDITOR, falling back to $VISUAL, then vim.
9
+ * The editor is spawned with the given cwd so file trees show the loadout directory.
10
+ */
11
+ export function openInEditor(filePath, options = {}) {
12
+ const editor = process.env.EDITOR || process.env.VISUAL || "vim";
13
+ return new Promise((resolve, reject) => {
14
+ const child = spawn(editor, [filePath], {
15
+ stdio: "inherit",
16
+ cwd: options.cwd,
17
+ shell: true,
18
+ });
19
+ child.on("error", (err) => {
20
+ reject(new Error(`Failed to launch editor '${editor}': ${err.message}`));
21
+ });
22
+ child.on("close", (code) => {
23
+ if (code === 0) {
24
+ options.onSuccess?.();
25
+ resolve();
26
+ }
27
+ else {
28
+ reject(new Error(`Editor exited with code ${code}`));
29
+ }
30
+ });
31
+ });
32
+ }
33
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/lib/editor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAS3C;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,UAAyB,EAAE;IAE3B,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC;IAEjE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE;YACtC,KAAK,EAAE,SAAS;YAChB,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,MAAM,CAAC,IAAI,KAAK,CAAC,4BAA4B,MAAM,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;gBACtB,OAAO,EAAE,CAAC;YACZ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;YACvD,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Filesystem helpers
3
+ */
4
+ /**
5
+ * Ensure a directory exists, creating parent directories as needed.
6
+ */
7
+ export declare function ensureDir(dirPath: string): void;
8
+ /**
9
+ * Write content to a file, creating parent directories as needed.
10
+ */
11
+ export declare function writeFile(filePath: string, content: string): void;
12
+ /**
13
+ * Read a file as UTF-8 string.
14
+ */
15
+ export declare function readFile(filePath: string): string;
16
+ /**
17
+ * Check if a file exists.
18
+ */
19
+ export declare function fileExists(filePath: string): boolean;
20
+ /**
21
+ * Check if a path is a directory.
22
+ */
23
+ export declare function isDirectory(filePath: string): boolean;
24
+ /**
25
+ * Check if a path is a symlink.
26
+ */
27
+ export declare function isSymlink(filePath: string): boolean;
28
+ /**
29
+ * Read the target of a symlink and resolve to absolute path.
30
+ * Returns null if not a symlink or on error.
31
+ */
32
+ export declare function readSymlinkTarget(linkPath: string): string | null;
33
+ /**
34
+ * Check if any parent directory in a path is a symlink.
35
+ * Returns the first symlinked parent path, or null if none.
36
+ */
37
+ export declare function findSymlinkParent(filePath: string): string | null;
38
+ /**
39
+ * Create a symlink (relative if possible).
40
+ * Idempotent: if symlink already exists with correct target, does nothing.
41
+ */
42
+ export declare function createSymlink(target: string, linkPath: string): void;
43
+ /**
44
+ * Remove a file or symlink.
45
+ */
46
+ export declare function removeFile(filePath: string): void;
47
+ /**
48
+ * Remove a directory recursively.
49
+ */
50
+ export declare function removeDir(dirPath: string): void;
51
+ /**
52
+ * Copy a file.
53
+ */
54
+ export declare function copyFile(src: string, dest: string): void;
55
+ /**
56
+ * Copy a directory recursively.
57
+ */
58
+ export declare function copyDir(src: string, dest: string): void;
59
+ /**
60
+ * Hash file content (SHA-256).
61
+ */
62
+ export declare function hashContent(content: string): string;
63
+ /**
64
+ * Hash a file.
65
+ */
66
+ export declare function hashFile(filePath: string): string;
67
+ /**
68
+ * Hash a directory (concatenate all file hashes).
69
+ */
70
+ export declare function hashDir(dirPath: string): string;
71
+ /**
72
+ * List files in a directory (non-recursive).
73
+ */
74
+ export declare function listFiles(dirPath: string): string[];
75
+ /**
76
+ * List files matching a pattern in a directory.
77
+ */
78
+ export declare function listFilesWithExtension(dirPath: string, extension: string): string[];
79
+ /**
80
+ * Make a file executable (chmod +x).
81
+ */
82
+ export declare function makeExecutable(filePath: string): void;
83
+ /**
84
+ * Walk a directory recursively and return all file paths relative to the root.
85
+ */
86
+ export declare function walkDir(dirPath: string): string[];
87
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/lib/fs.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAE/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAGjE;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAMnD;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAYjE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAgBjE;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAuBpE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAIjD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAGxD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAcvD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGjD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAiB/C;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAGnD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAChB,MAAM,EAAE,CAEV;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAErD;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAkBjD"}
package/dist/lib/fs.js ADDED
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Filesystem helpers
3
+ */
4
+ import * as fs from "node:fs";
5
+ import * as path from "node:path";
6
+ import * as crypto from "node:crypto";
7
+ /**
8
+ * Ensure a directory exists, creating parent directories as needed.
9
+ */
10
+ export function ensureDir(dirPath) {
11
+ fs.mkdirSync(dirPath, { recursive: true });
12
+ }
13
+ /**
14
+ * Write content to a file, creating parent directories as needed.
15
+ */
16
+ export function writeFile(filePath, content) {
17
+ ensureDir(path.dirname(filePath));
18
+ fs.writeFileSync(filePath, content, "utf-8");
19
+ }
20
+ /**
21
+ * Read a file as UTF-8 string.
22
+ */
23
+ export function readFile(filePath) {
24
+ return fs.readFileSync(filePath, "utf-8");
25
+ }
26
+ /**
27
+ * Check if a file exists.
28
+ */
29
+ export function fileExists(filePath) {
30
+ return fs.existsSync(filePath);
31
+ }
32
+ /**
33
+ * Check if a path is a directory.
34
+ */
35
+ export function isDirectory(filePath) {
36
+ return fs.existsSync(filePath) && fs.statSync(filePath).isDirectory();
37
+ }
38
+ /**
39
+ * Check if a path is a symlink.
40
+ */
41
+ export function isSymlink(filePath) {
42
+ try {
43
+ return fs.lstatSync(filePath).isSymbolicLink();
44
+ }
45
+ catch {
46
+ return false;
47
+ }
48
+ }
49
+ /**
50
+ * Read the target of a symlink and resolve to absolute path.
51
+ * Returns null if not a symlink or on error.
52
+ */
53
+ export function readSymlinkTarget(linkPath) {
54
+ try {
55
+ if (!isSymlink(linkPath))
56
+ return null;
57
+ const target = fs.readlinkSync(linkPath);
58
+ // Resolve relative symlink targets against the link's directory
59
+ if (path.isAbsolute(target)) {
60
+ return target;
61
+ }
62
+ return path.resolve(path.dirname(linkPath), target);
63
+ }
64
+ catch {
65
+ return null;
66
+ }
67
+ }
68
+ /**
69
+ * Check if any parent directory in a path is a symlink.
70
+ * Returns the first symlinked parent path, or null if none.
71
+ */
72
+ export function findSymlinkParent(filePath) {
73
+ const parts = filePath.split(path.sep).filter(Boolean);
74
+ let current = filePath.startsWith(path.sep) ? path.sep : "";
75
+ // Check all parents except the final component (which may legitimately be a symlink)
76
+ for (let i = 0; i < parts.length - 1; i++) {
77
+ current = path.join(current, parts[i]);
78
+ try {
79
+ if (fs.lstatSync(current).isSymbolicLink()) {
80
+ return current;
81
+ }
82
+ }
83
+ catch {
84
+ // Path doesn't exist yet, that's fine
85
+ }
86
+ }
87
+ return null;
88
+ }
89
+ /**
90
+ * Create a symlink (relative if possible).
91
+ * Idempotent: if symlink already exists with correct target, does nothing.
92
+ */
93
+ export function createSymlink(target, linkPath) {
94
+ ensureDir(path.dirname(linkPath));
95
+ // Use relative path for the symlink, resolving any symlinks in the
96
+ // parent directory to ensure correct relative path calculation
97
+ const linkDir = path.dirname(linkPath);
98
+ const realLinkDir = fs.realpathSync(linkDir);
99
+ const relativeTarget = path.relative(realLinkDir, target);
100
+ // Check if symlink already exists with correct target
101
+ if (isSymlink(linkPath)) {
102
+ const existingTarget = fs.readlinkSync(linkPath);
103
+ if (existingTarget === relativeTarget) {
104
+ return; // Already correct, nothing to do
105
+ }
106
+ // Wrong target, remove and recreate
107
+ fs.unlinkSync(linkPath);
108
+ }
109
+ else if (fs.existsSync(linkPath)) {
110
+ // Something else exists (file/dir), remove it
111
+ fs.unlinkSync(linkPath);
112
+ }
113
+ fs.symlinkSync(relativeTarget, linkPath);
114
+ }
115
+ /**
116
+ * Remove a file or symlink.
117
+ */
118
+ export function removeFile(filePath) {
119
+ if (fs.existsSync(filePath)) {
120
+ fs.unlinkSync(filePath);
121
+ }
122
+ }
123
+ /**
124
+ * Remove a directory recursively.
125
+ */
126
+ export function removeDir(dirPath) {
127
+ if (fs.existsSync(dirPath)) {
128
+ fs.rmSync(dirPath, { recursive: true });
129
+ }
130
+ }
131
+ /**
132
+ * Copy a file.
133
+ */
134
+ export function copyFile(src, dest) {
135
+ ensureDir(path.dirname(dest));
136
+ fs.copyFileSync(src, dest);
137
+ }
138
+ /**
139
+ * Copy a directory recursively.
140
+ */
141
+ export function copyDir(src, dest) {
142
+ ensureDir(dest);
143
+ const entries = fs.readdirSync(src, { withFileTypes: true });
144
+ for (const entry of entries) {
145
+ const srcPath = path.join(src, entry.name);
146
+ const destPath = path.join(dest, entry.name);
147
+ if (entry.isDirectory()) {
148
+ copyDir(srcPath, destPath);
149
+ }
150
+ else {
151
+ copyFile(srcPath, destPath);
152
+ }
153
+ }
154
+ }
155
+ /**
156
+ * Hash file content (SHA-256).
157
+ */
158
+ export function hashContent(content) {
159
+ return `sha256:${crypto.createHash("sha256").update(content).digest("hex")}`;
160
+ }
161
+ /**
162
+ * Hash a file.
163
+ */
164
+ export function hashFile(filePath) {
165
+ const content = readFile(filePath);
166
+ return hashContent(content);
167
+ }
168
+ /**
169
+ * Hash a directory (concatenate all file hashes).
170
+ */
171
+ export function hashDir(dirPath) {
172
+ const hashes = [];
173
+ function walk(dir) {
174
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
175
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
176
+ const fullPath = path.join(dir, entry.name);
177
+ if (entry.isDirectory()) {
178
+ walk(fullPath);
179
+ }
180
+ else {
181
+ hashes.push(hashFile(fullPath));
182
+ }
183
+ }
184
+ }
185
+ walk(dirPath);
186
+ return hashContent(hashes.join("\n"));
187
+ }
188
+ /**
189
+ * List files in a directory (non-recursive).
190
+ */
191
+ export function listFiles(dirPath) {
192
+ if (!isDirectory(dirPath))
193
+ return [];
194
+ return fs.readdirSync(dirPath);
195
+ }
196
+ /**
197
+ * List files matching a pattern in a directory.
198
+ */
199
+ export function listFilesWithExtension(dirPath, extension) {
200
+ return listFiles(dirPath).filter((f) => f.endsWith(extension));
201
+ }
202
+ /**
203
+ * Make a file executable (chmod +x).
204
+ */
205
+ export function makeExecutable(filePath) {
206
+ fs.chmodSync(filePath, 0o755);
207
+ }
208
+ /**
209
+ * Walk a directory recursively and return all file paths relative to the root.
210
+ */
211
+ export function walkDir(dirPath) {
212
+ const results = [];
213
+ function walk(dir, prefix) {
214
+ const entries = fs.readdirSync(dir, { withFileTypes: true });
215
+ for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {
216
+ const fullPath = path.join(dir, entry.name);
217
+ const relativePath = prefix ? path.join(prefix, entry.name) : entry.name;
218
+ if (entry.isDirectory()) {
219
+ walk(fullPath, relativePath);
220
+ }
221
+ else {
222
+ results.push(relativePath);
223
+ }
224
+ }
225
+ }
226
+ walk(dirPath, "");
227
+ return results;
228
+ }
229
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/lib/fs.ts"],"names":[],"mappings":"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"}