loadouts 0.1.11 → 0.1.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/cli/commands/activate.d.ts.map +1 -1
  2. package/dist/cli/commands/activate.js +1 -0
  3. package/dist/cli/commands/activate.js.map +1 -1
  4. package/dist/cli/commands/check.d.ts.map +1 -1
  5. package/dist/cli/commands/check.js +1 -0
  6. package/dist/cli/commands/check.js.map +1 -1
  7. package/dist/cli/commands/deactivate.d.ts.map +1 -1
  8. package/dist/cli/commands/deactivate.js +1 -0
  9. package/dist/cli/commands/deactivate.js.map +1 -1
  10. package/dist/cli/commands/diff.d.ts.map +1 -1
  11. package/dist/cli/commands/diff.js +1 -0
  12. package/dist/cli/commands/diff.js.map +1 -1
  13. package/dist/cli/commands/edit.d.ts.map +1 -1
  14. package/dist/cli/commands/edit.js +1 -0
  15. package/dist/cli/commands/edit.js.map +1 -1
  16. package/dist/cli/commands/info.d.ts.map +1 -1
  17. package/dist/cli/commands/info.js +1 -0
  18. package/dist/cli/commands/info.js.map +1 -1
  19. package/dist/cli/commands/init.d.ts.map +1 -1
  20. package/dist/cli/commands/init.js +5 -0
  21. package/dist/cli/commands/init.js.map +1 -1
  22. package/dist/cli/commands/install.d.ts.map +1 -1
  23. package/dist/cli/commands/install.js +3 -0
  24. package/dist/cli/commands/install.js.map +1 -1
  25. package/dist/cli/commands/list.d.ts.map +1 -1
  26. package/dist/cli/commands/list.js +1 -0
  27. package/dist/cli/commands/list.js.map +1 -1
  28. package/dist/cli/commands/rule.d.ts.map +1 -1
  29. package/dist/cli/commands/rule.js +11 -0
  30. package/dist/cli/commands/rule.js.map +1 -1
  31. package/dist/cli/commands/skill.d.ts.map +1 -1
  32. package/dist/cli/commands/skill.js +11 -0
  33. package/dist/cli/commands/skill.js.map +1 -1
  34. package/dist/cli/commands/status.d.ts.map +1 -1
  35. package/dist/cli/commands/status.js +1 -0
  36. package/dist/cli/commands/status.js.map +1 -1
  37. package/dist/cli/commands/update.d.ts.map +1 -1
  38. package/dist/cli/commands/update.js +32 -0
  39. package/dist/cli/commands/update.js.map +1 -1
  40. package/dist/cli/index.d.ts.map +1 -1
  41. package/dist/cli/index.js +45 -15
  42. package/dist/cli/index.js.map +1 -1
  43. package/dist/core/fallback.d.ts +2 -2
  44. package/dist/core/fallback.d.ts.map +1 -1
  45. package/dist/core/fallback.js +16 -6
  46. package/dist/core/fallback.js.map +1 -1
  47. package/dist/core/render.d.ts +0 -1
  48. package/dist/core/render.d.ts.map +1 -1
  49. package/dist/core/render.js +8 -14
  50. package/dist/core/render.js.map +1 -1
  51. package/dist/lib/artifact-paths.d.ts.map +1 -1
  52. package/dist/lib/artifact-paths.js +7 -2
  53. package/dist/lib/artifact-paths.js.map +1 -1
  54. package/dist/lib/artifact-table.d.ts +1 -1
  55. package/dist/lib/artifact-table.d.ts.map +1 -1
  56. package/dist/lib/artifact-table.js +33 -13
  57. package/dist/lib/artifact-table.js.map +1 -1
  58. package/dist/lib/gitignore.d.ts +57 -12
  59. package/dist/lib/gitignore.d.ts.map +1 -1
  60. package/dist/lib/gitignore.js +207 -37
  61. package/dist/lib/gitignore.js.map +1 -1
  62. package/package.json +1 -1
@@ -1,44 +1,54 @@
1
1
  /**
2
- * Gitignore management — update .gitignore with loadout-managed paths.
2
+ * Gitignore management — per-target .gitignore files.
3
+ *
4
+ * Each tool's output directory (e.g., .claude/, .cursor/) gets its own
5
+ * .gitignore with paths relative to that directory. This ensures:
6
+ *
7
+ * - All artifacts are ignored regardless of activation state
8
+ * - Global scope is supported (same mechanism, absolute target dirs)
9
+ * - The project root .gitignore is not cluttered with tool-specific paths
10
+ *
11
+ * Gitignore is part of the artifact lifecycle (add/delete/import), not the
12
+ * render pipeline. Updates happen when artifacts are created or removed,
13
+ * not when loadouts are activated or synced.
3
14
  *
4
15
  * Uses markers to identify the managed section:
5
- * # <loadout>
16
+ * # <loadouts>
6
17
  * ...managed paths...
7
- * # </loadout>
18
+ * # </loadouts>
8
19
  */
9
20
  import * as path from "node:path";
10
- import { fileExists, readFile, writeFile } from "./fs.js";
21
+ import * as os from "node:os";
22
+ import { fileExists, readFile, writeFile, listFiles, listFilesWithExtension, isDirectory, } from "./fs.js";
23
+ import { registry } from "../core/registry.js";
24
+ import { expandTemplate } from "../core/template.js";
11
25
  const START_MARKER = "# <loadouts>";
12
26
  const END_MARKER = "# </loadouts>";
13
27
  const HEADER_COMMENT = "# Auto-generated by loadouts. Do not edit this section.";
28
+ // Legacy markers from old naming convention
29
+ const LEGACY_START_MARKER = "# <loadout>";
30
+ const LEGACY_END_MARKER = "# </loadout>";
31
+ // Paths always ignored within .loadouts/
32
+ const LOADOUTS_STATE_PATHS = [".fallback-applied", ".state.json"];
33
+ // ---------------------------------------------------------------------------
34
+ // Core write function
35
+ // ---------------------------------------------------------------------------
14
36
  /**
15
- * Update .gitignore with loadout-managed paths.
16
- *
17
- * - Creates .gitignore if it doesn't exist
18
- * - Adds or updates the managed section between markers
19
- * - Preserves all user content outside the markers
20
- * - Removes the section entirely if managedPaths is empty
37
+ * Low-level: write the managed section to a specific .gitignore file path.
21
38
  */
22
- export function updateGitignore(projectRoot, managedPaths) {
23
- const gitignorePath = path.join(projectRoot, ".gitignore");
24
- // Always include the state file
25
- const allPaths = [".loadouts/.state.json", ...managedPaths];
39
+ function updateGitignoreFile(gitignorePath, managedPaths) {
26
40
  // Sort and deduplicate
27
- const uniquePaths = [...new Set(allPaths)].sort();
28
- // Build the managed section content
41
+ const uniquePaths = [...new Set(managedPaths)].sort();
29
42
  const managedSection = uniquePaths.length > 0
30
43
  ? `${START_MARKER}\n${HEADER_COMMENT}\n${uniquePaths.join("\n")}\n${END_MARKER}`
31
44
  : "";
32
45
  if (!fileExists(gitignorePath)) {
33
- // Create new .gitignore with just the managed section
34
46
  if (managedSection) {
35
47
  writeFile(gitignorePath, managedSection + "\n");
36
48
  }
37
49
  return;
38
50
  }
39
- // Read existing content
40
51
  const content = readFile(gitignorePath);
41
- // Find existing managed section
42
52
  const startIdx = content.indexOf(START_MARKER);
43
53
  const endIdx = content.indexOf(END_MARKER);
44
54
  if (startIdx !== -1 && endIdx !== -1 && endIdx > startIdx) {
@@ -46,21 +56,17 @@ export function updateGitignore(projectRoot, managedPaths) {
46
56
  const before = content.slice(0, startIdx).trimEnd();
47
57
  const after = content.slice(endIdx + END_MARKER.length).trimStart();
48
58
  const parts = [before];
49
- if (managedSection) {
59
+ if (managedSection)
50
60
  parts.push(managedSection);
51
- }
52
- if (after) {
61
+ if (after)
53
62
  parts.push(after);
54
- }
55
- // Join with appropriate newlines
56
63
  let newContent = parts.filter(Boolean).join("\n\n");
57
- if (!newContent.endsWith("\n")) {
64
+ if (!newContent.endsWith("\n"))
58
65
  newContent += "\n";
59
- }
60
66
  writeFile(gitignorePath, newContent);
61
67
  }
62
68
  else {
63
- // No existing section — append the managed section
69
+ // No existing section — append
64
70
  if (!managedSection)
65
71
  return;
66
72
  let newContent = content.trimEnd();
@@ -68,30 +74,194 @@ export function updateGitignore(projectRoot, managedPaths) {
68
74
  writeFile(gitignorePath, newContent);
69
75
  }
70
76
  }
77
+ // ---------------------------------------------------------------------------
78
+ // Public write functions
79
+ // ---------------------------------------------------------------------------
71
80
  /**
72
- * Remove the loadout-managed section from .gitignore.
81
+ * Update .gitignore within a specific target directory.
82
+ *
83
+ * @param targetDir - Absolute path to the target directory (e.g., /project/.claude or ~/.claude)
84
+ * @param relativePaths - Paths relative to targetDir (e.g., ["rules/foo.md", "skills/bar/"])
73
85
  */
74
- export function removeGitignoreSection(projectRoot) {
75
- updateGitignore(projectRoot, []);
86
+ export function updateTargetGitignore(targetDir, relativePaths) {
87
+ updateGitignoreFile(path.join(targetDir, ".gitignore"), relativePaths);
76
88
  }
77
89
  /**
78
- * Get the current managed paths from .gitignore (for testing/inspection).
90
+ * Update .loadouts/.gitignore with state file entries.
91
+ * Always includes .state.json and .fallback-applied.
79
92
  */
80
- export function getManagedPaths(projectRoot) {
81
- const gitignorePath = path.join(projectRoot, ".gitignore");
82
- if (!fileExists(gitignorePath)) {
83
- return [];
93
+ export function updateLoadoutsGitignore(loadoutsDir) {
94
+ updateGitignoreFile(path.join(loadoutsDir, ".gitignore"), LOADOUTS_STATE_PATHS);
95
+ }
96
+ // ---------------------------------------------------------------------------
97
+ // Path computation
98
+ // ---------------------------------------------------------------------------
99
+ /**
100
+ * Compute gitignore paths for an artifact, grouped by target directory.
101
+ *
102
+ * Returns a Map of targetBase (as stored in tool.basePath[scope]) →
103
+ * relative paths within that directory.
104
+ *
105
+ * Instruction artifacts (CLAUDE.md, AGENTS.md) that resolve outside the
106
+ * tool's base directory are automatically excluded.
107
+ */
108
+ export function computeArtifactGitignorePaths(kindId, artifactName, scope = "project") {
109
+ const kind = registry.getKind(kindId);
110
+ if (!kind)
111
+ return new Map();
112
+ const byTarget = new Map();
113
+ for (const tool of registry.allTools()) {
114
+ if (!tool.supports.includes(kindId))
115
+ continue;
116
+ const mapping = registry.resolveMapping(tool.name, kindId);
117
+ if (!mapping)
118
+ continue;
119
+ const targetBase = tool.basePath[scope];
120
+ const ext = mapping.ext ?? (kind.layout === "file" ? ".md" : "");
121
+ const vars = {
122
+ base: targetBase,
123
+ home: os.homedir(),
124
+ stem: artifactName,
125
+ ext,
126
+ name: artifactName,
127
+ relative: `${kindId}s/${artifactName}${ext}`,
128
+ kind: kindId,
129
+ };
130
+ const pathTemplate = typeof mapping.path === "string" ? mapping.path : mapping.path[scope];
131
+ try {
132
+ const expandedPath = expandTemplate(pathTemplate, scope, vars);
133
+ // Compute the relative path within the target directory
134
+ const relPath = path.relative(targetBase, expandedPath);
135
+ // Skip if the path escapes the target directory (e.g., instruction
136
+ // artifacts that expand to CLAUDE.md or AGENTS.md at the project root)
137
+ if (relPath.startsWith(".."))
138
+ continue;
139
+ const existing = byTarget.get(targetBase) ?? [];
140
+ if (kind.layout === "dir") {
141
+ // Dir-layout: use trailing slash so all files within are covered
142
+ existing.push(relPath.endsWith("/") ? relPath : relPath + "/");
143
+ }
144
+ else {
145
+ existing.push(relPath);
146
+ }
147
+ byTarget.set(targetBase, existing);
148
+ }
149
+ catch {
150
+ // Skip if template expansion fails
151
+ }
84
152
  }
153
+ return byTarget;
154
+ }
155
+ // ---------------------------------------------------------------------------
156
+ // Rebuild
157
+ // ---------------------------------------------------------------------------
158
+ /**
159
+ * Rebuild gitignore entries for all artifacts in the loadouts directory.
160
+ *
161
+ * Scans all rules and skills and writes per-target .gitignore files so that
162
+ * every artifact is ignored regardless of whether it is currently activated.
163
+ * Called after artifact add/delete/import.
164
+ *
165
+ * @param loadoutsDir - Absolute path to .loadouts/ or ~/.config/loadouts/
166
+ * @param projectRoot - Project root for resolving relative target paths
167
+ * (unused for global scope since all paths are absolute)
168
+ * @param scope - "project" or "global"
169
+ */
170
+ export function rebuildAllGitignores(loadoutsDir, projectRoot, scope) {
171
+ const rulesDir = path.join(loadoutsDir, "rules");
172
+ const skillsDir = path.join(loadoutsDir, "skills");
173
+ // Collect all paths grouped by target base
174
+ const allByTarget = new Map();
175
+ // Rules
176
+ for (const file of listFilesWithExtension(rulesDir, ".md")) {
177
+ const name = file.replace(/\.md$/, "");
178
+ mergeIntoMap(allByTarget, computeArtifactGitignorePaths("rule", name, scope));
179
+ }
180
+ // Skills
181
+ for (const name of listFiles(skillsDir).filter((d) => isDirectory(path.join(skillsDir, d)))) {
182
+ mergeIntoMap(allByTarget, computeArtifactGitignorePaths("skill", name, scope));
183
+ }
184
+ // Write per-target .gitignore files
185
+ for (const [targetBase, paths] of allByTarget) {
186
+ const absTargetDir = path.isAbsolute(targetBase)
187
+ ? targetBase
188
+ : path.join(projectRoot, targetBase);
189
+ updateTargetGitignore(absTargetDir, paths);
190
+ }
191
+ }
192
+ // ---------------------------------------------------------------------------
193
+ // Read helpers
194
+ // ---------------------------------------------------------------------------
195
+ /**
196
+ * Get the current managed paths from a target directory's .gitignore.
197
+ */
198
+ export function getManagedPathsFromTarget(targetDir) {
199
+ return getManagedPathsFromFile(path.join(targetDir, ".gitignore"));
200
+ }
201
+ function getManagedPathsFromFile(gitignorePath) {
202
+ if (!fileExists(gitignorePath))
203
+ return [];
85
204
  const content = readFile(gitignorePath);
86
205
  const startIdx = content.indexOf(START_MARKER);
87
206
  const endIdx = content.indexOf(END_MARKER);
88
- if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx) {
207
+ if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx)
89
208
  return [];
90
- }
91
209
  const section = content.slice(startIdx + START_MARKER.length, endIdx);
92
210
  return section
93
211
  .split("\n")
94
212
  .map((line) => line.trim())
95
213
  .filter((line) => line && !line.startsWith("#"));
96
214
  }
215
+ // ---------------------------------------------------------------------------
216
+ // Migration helper
217
+ // ---------------------------------------------------------------------------
218
+ /**
219
+ * Remove the legacy loadouts-managed section from the project root .gitignore.
220
+ * Handles both old (# <loadout>) and current (# <loadouts>) markers.
221
+ * Used by the `update` command to migrate from the old single-file approach.
222
+ */
223
+ export function removeLegacyRootGitignoreSection(projectRoot) {
224
+ const gitignorePath = path.join(projectRoot, ".gitignore");
225
+ if (!fileExists(gitignorePath))
226
+ return;
227
+ let content = readFile(gitignorePath);
228
+ // Remove both new and old marker sections
229
+ content = removeMarkerSection(content, START_MARKER, END_MARKER);
230
+ content = removeMarkerSection(content, LEGACY_START_MARKER, LEGACY_END_MARKER);
231
+ // Clean up excess blank lines
232
+ content = content.replace(/\n{3,}/g, "\n\n").trimEnd();
233
+ if (content)
234
+ content += "\n";
235
+ writeFile(gitignorePath, content || "");
236
+ }
237
+ // ---------------------------------------------------------------------------
238
+ // Internal utilities
239
+ // ---------------------------------------------------------------------------
240
+ function removeMarkerSection(content, startMarker, endMarker) {
241
+ const startIdx = content.indexOf(startMarker);
242
+ const endIdx = content.indexOf(endMarker);
243
+ if (startIdx === -1 || endIdx === -1 || endIdx <= startIdx)
244
+ return content;
245
+ const before = content.slice(0, startIdx).trimEnd();
246
+ const after = content.slice(endIdx + endMarker.length).trimStart();
247
+ if (before && after)
248
+ return before + "\n\n" + after;
249
+ return before || after;
250
+ }
251
+ function mergeIntoMap(target, source) {
252
+ for (const [key, values] of source) {
253
+ const existing = target.get(key) ?? [];
254
+ target.set(key, [...existing, ...values]);
255
+ }
256
+ }
257
+ // ---------------------------------------------------------------------------
258
+ // Deprecated — kept for migration use in update.ts
259
+ // ---------------------------------------------------------------------------
260
+ /**
261
+ * @deprecated Use getManagedPathsFromTarget instead.
262
+ * Still used by the update command to detect whether migration is needed.
263
+ */
264
+ export function getManagedPaths(projectRoot) {
265
+ return getManagedPathsFromFile(path.join(projectRoot, ".gitignore"));
266
+ }
97
267
  //# sourceMappingURL=gitignore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"gitignore.js","sourceRoot":"","sources":["../../src/lib/gitignore.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "loadouts",
3
- "version": "0.1.11",
3
+ "version": "0.1.13",
4
4
  "description": "Composable configuration bundles for AI coding agents",
5
5
  "type": "module",
6
6
  "bin": {