@memberjunction/cli 5.41.0 → 5.43.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.
- package/dist/commands/app/install.d.ts.map +1 -1
- package/dist/commands/app/install.js +2 -1
- package/dist/commands/app/install.js.map +1 -1
- package/dist/commands/bundle/index.d.ts +1 -0
- package/dist/commands/bundle/index.d.ts.map +1 -1
- package/dist/commands/bundle/index.js +7 -1
- package/dist/commands/bundle/index.js.map +1 -1
- package/dist/commands/codegen/index.d.ts +6 -16
- package/dist/commands/codegen/index.d.ts.map +1 -1
- package/dist/commands/codegen/index.js +6 -90
- package/dist/commands/codegen/index.js.map +1 -1
- package/dist/commands/codegen/manifest.d.ts +41 -10
- package/dist/commands/codegen/manifest.d.ts.map +1 -1
- package/dist/commands/codegen/manifest.js +66 -0
- package/dist/commands/codegen/manifest.js.map +1 -1
- package/dist/commands/codegen/usage.d.ts +7 -0
- package/dist/commands/codegen/usage.d.ts.map +1 -0
- package/dist/commands/codegen/usage.js +10 -0
- package/dist/commands/codegen/usage.js.map +1 -0
- package/dist/commands/install/claude.d.ts +35 -0
- package/dist/commands/install/claude.d.ts.map +1 -0
- package/dist/commands/install/claude.js +108 -0
- package/dist/commands/install/claude.js.map +1 -0
- package/dist/commands/install/index.d.ts +1 -0
- package/dist/commands/install/index.d.ts.map +1 -1
- package/dist/commands/install/index.js +4 -0
- package/dist/commands/install/index.js.map +1 -1
- package/dist/commands/migrate/convert.d.ts +59 -12
- package/dist/commands/migrate/convert.d.ts.map +1 -1
- package/dist/commands/migrate/convert.js +294 -21
- package/dist/commands/migrate/convert.js.map +1 -1
- package/dist/commands/migrate/rebake.d.ts +41 -0
- package/dist/commands/migrate/rebake.d.ts.map +1 -0
- package/dist/commands/migrate/rebake.js +193 -0
- package/dist/commands/migrate/rebake.js.map +1 -0
- package/dist/commands/plugin/add.d.ts +18 -0
- package/dist/commands/plugin/add.d.ts.map +1 -0
- package/dist/commands/plugin/add.js +53 -0
- package/dist/commands/plugin/add.js.map +1 -0
- package/dist/commands/sync/pull.d.ts +6 -26
- package/dist/commands/sync/pull.d.ts.map +1 -1
- package/dist/commands/sync/pull.js +6 -281
- package/dist/commands/sync/pull.js.map +1 -1
- package/dist/commands/sync/push.d.ts +8 -19
- package/dist/commands/sync/push.d.ts.map +1 -1
- package/dist/commands/sync/push.js +8 -328
- package/dist/commands/sync/push.js.map +1 -1
- package/dist/commands/sync/usage.d.ts +7 -0
- package/dist/commands/sync/usage.d.ts.map +1 -0
- package/dist/commands/sync/usage.js +10 -0
- package/dist/commands/sync/usage.js.map +1 -0
- package/dist/commands/update/claude.d.ts +37 -0
- package/dist/commands/update/claude.d.ts.map +1 -0
- package/dist/commands/update/claude.js +90 -0
- package/dist/commands/update/claude.js.map +1 -0
- package/dist/commands/usage.d.ts +17 -0
- package/dist/commands/usage.d.ts.map +1 -0
- package/dist/commands/usage.js +29 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/config.d.ts +41 -7
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +9 -4
- package/dist/config.js.map +1 -1
- package/dist/hooks/prerun.d.ts.map +1 -1
- package/dist/hooks/prerun.js +49 -8
- package/dist/hooks/prerun.js.map +1 -1
- package/dist/lib/claude-pack/ManagedBlockEditor.d.ts +40 -0
- package/dist/lib/claude-pack/ManagedBlockEditor.d.ts.map +1 -0
- package/dist/lib/claude-pack/ManagedBlockEditor.js +127 -0
- package/dist/lib/claude-pack/ManagedBlockEditor.js.map +1 -0
- package/dist/lib/claude-pack/PackFetcher.d.ts +86 -0
- package/dist/lib/claude-pack/PackFetcher.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackFetcher.js +163 -0
- package/dist/lib/claude-pack/PackFetcher.js.map +1 -0
- package/dist/lib/claude-pack/PackInstaller.d.ts +62 -0
- package/dist/lib/claude-pack/PackInstaller.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackInstaller.js +197 -0
- package/dist/lib/claude-pack/PackInstaller.js.map +1 -0
- package/dist/lib/claude-pack/PackMerger.d.ts +61 -0
- package/dist/lib/claude-pack/PackMerger.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackMerger.js +315 -0
- package/dist/lib/claude-pack/PackMerger.js.map +1 -0
- package/dist/lib/claude-pack/PackOutputFormatter.d.ts +29 -0
- package/dist/lib/claude-pack/PackOutputFormatter.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackOutputFormatter.js +82 -0
- package/dist/lib/claude-pack/PackOutputFormatter.js.map +1 -0
- package/dist/lib/claude-pack/PackPaths.d.ts +80 -0
- package/dist/lib/claude-pack/PackPaths.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackPaths.js +182 -0
- package/dist/lib/claude-pack/PackPaths.js.map +1 -0
- package/dist/lib/claude-pack/PackTypes.d.ts +124 -0
- package/dist/lib/claude-pack/PackTypes.d.ts.map +1 -0
- package/dist/lib/claude-pack/PackTypes.js +32 -0
- package/dist/lib/claude-pack/PackTypes.js.map +1 -0
- package/dist/lib/claude-pack/SettingsMerger.d.ts +47 -0
- package/dist/lib/claude-pack/SettingsMerger.d.ts.map +1 -0
- package/dist/lib/claude-pack/SettingsMerger.js +163 -0
- package/dist/lib/claude-pack/SettingsMerger.js.map +1 -0
- package/dist/lib/cli-plugins.d.ts +16 -0
- package/dist/lib/cli-plugins.d.ts.map +1 -0
- package/dist/lib/cli-plugins.js +26 -0
- package/dist/lib/cli-plugins.js.map +1 -0
- package/dist/lib/domain-usage-command.d.ts +16 -0
- package/dist/lib/domain-usage-command.d.ts.map +1 -0
- package/dist/lib/domain-usage-command.js +23 -0
- package/dist/lib/domain-usage-command.js.map +1 -0
- package/dist/lib/usage-render.d.ts +14 -0
- package/dist/lib/usage-render.d.ts.map +1 -0
- package/dist/lib/usage-render.js +64 -0
- package/dist/lib/usage-render.js.map +1 -0
- package/dist/light-commands.d.ts.map +1 -1
- package/dist/light-commands.js +11 -0
- package/dist/light-commands.js.map +1 -1
- package/dist/utils/open-app-context.d.ts +5 -5
- package/dist/utils/open-app-context.d.ts.map +1 -1
- package/dist/utils/open-app-context.js +44 -48
- package/dist/utils/open-app-context.js.map +1 -1
- package/oclif.manifest.json +821 -134
- package/package.json +17 -15
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-file merge for the Claude Code pack.
|
|
3
|
+
*
|
|
4
|
+
* Implements the table in plans/claude-install-pack.md §6.4:
|
|
5
|
+
*
|
|
6
|
+
* CLAUDE.md — managed-block rewrite (preserves user content)
|
|
7
|
+
* .claude/mj/** — overwritten as a unit (incl. sweep of stale files)
|
|
8
|
+
* .claude/settings.json — deep-merge per §10.2
|
|
9
|
+
* .claude/commands/* — seed-once; overwrite needs --force / --refresh-commands
|
|
10
|
+
* .claude/skills/** — same rule as commands
|
|
11
|
+
*
|
|
12
|
+
* The merger never destroys user content by default. `Force` and the
|
|
13
|
+
* `Refresh*` flags are explicit opt-ins.
|
|
14
|
+
*/
|
|
15
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync, } from 'node:fs';
|
|
16
|
+
import path from 'node:path';
|
|
17
|
+
import { parseManagedBlock, rewriteManagedBlock, wrapWithManagedBlock, ManagedBlockError, } from './ManagedBlockEditor.js';
|
|
18
|
+
import { mergeSettings } from './SettingsMerger.js';
|
|
19
|
+
import { emptyActionLog, recordOutcome, } from './PackTypes.js';
|
|
20
|
+
// ---------------------------------------------------------------------------
|
|
21
|
+
// Main entry point
|
|
22
|
+
// ---------------------------------------------------------------------------
|
|
23
|
+
export function mergePack(opts) {
|
|
24
|
+
const actions = emptyActionLog();
|
|
25
|
+
const warnings = [];
|
|
26
|
+
mergeRootClaudeMd(opts, actions, warnings);
|
|
27
|
+
mergeMjBundle(opts, actions, warnings);
|
|
28
|
+
if (!opts.SkipSettings)
|
|
29
|
+
mergeSettingsFile(opts, actions, warnings);
|
|
30
|
+
if (!opts.SkipCommands) {
|
|
31
|
+
mergeSeededTree(opts, actions, warnings, '.claude/commands/', !!opts.RefreshCommands);
|
|
32
|
+
}
|
|
33
|
+
if (!opts.SkipSkills) {
|
|
34
|
+
mergeSeededTree(opts, actions, warnings, '.claude/skills/', !!opts.RefreshSkills);
|
|
35
|
+
}
|
|
36
|
+
return { Actions: actions, Warnings: warnings };
|
|
37
|
+
}
|
|
38
|
+
// ---------------------------------------------------------------------------
|
|
39
|
+
// CLAUDE.md — managed-block rewrite
|
|
40
|
+
// ---------------------------------------------------------------------------
|
|
41
|
+
function mergeRootClaudeMd(opts, actions, warnings) {
|
|
42
|
+
const packBytes = opts.PackFiles.get('CLAUDE.md');
|
|
43
|
+
if (!packBytes) {
|
|
44
|
+
recordOutcome(actions, { path: 'CLAUDE.md', outcome: 'error', reason: 'absent from pack' });
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const packText = decodeText(packBytes);
|
|
48
|
+
let packBlock;
|
|
49
|
+
try {
|
|
50
|
+
packBlock = parseManagedBlock(packText);
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
recordOutcome(actions, {
|
|
54
|
+
path: 'CLAUDE.md',
|
|
55
|
+
outcome: 'error',
|
|
56
|
+
reason: `pack CLAUDE.md malformed: ${err.message}`,
|
|
57
|
+
});
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
if (!packBlock) {
|
|
61
|
+
recordOutcome(actions, {
|
|
62
|
+
path: 'CLAUDE.md',
|
|
63
|
+
outcome: 'error',
|
|
64
|
+
reason: 'pack CLAUDE.md has no managed block',
|
|
65
|
+
});
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
const targetPath = path.join(opts.TargetDir, 'CLAUDE.md');
|
|
69
|
+
if (!existsSync(targetPath)) {
|
|
70
|
+
writeFile(opts, targetPath, packText);
|
|
71
|
+
recordOutcome(actions, { path: 'CLAUDE.md', outcome: 'added' });
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const existing = readFileSync(targetPath, 'utf8');
|
|
75
|
+
let existingBlock;
|
|
76
|
+
try {
|
|
77
|
+
existingBlock = parseManagedBlock(existing);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
warnings.push(`CLAUDE.md has malformed MJ-MANAGED markers — leaving the file alone. ` +
|
|
81
|
+
`Fix it and re-run, or pass --force to wrap the existing content. (${err.message})`);
|
|
82
|
+
recordOutcome(actions, {
|
|
83
|
+
path: 'CLAUDE.md',
|
|
84
|
+
outcome: 'skipped',
|
|
85
|
+
reason: 'malformed managed markers',
|
|
86
|
+
});
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
let newContent;
|
|
90
|
+
if (existingBlock === null) {
|
|
91
|
+
newContent = wrapWithManagedBlock(existing, packBlock.body, packBlock.attrs);
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
newContent = rewriteManagedBlock(existing, packBlock.body, packBlock.attrs);
|
|
95
|
+
}
|
|
96
|
+
if (newContent === existing) {
|
|
97
|
+
recordOutcome(actions, { path: 'CLAUDE.md', outcome: 'skipped', reason: 'identical' });
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
writeFile(opts, targetPath, newContent);
|
|
101
|
+
recordOutcome(actions, { path: 'CLAUDE.md', outcome: 'updated' });
|
|
102
|
+
}
|
|
103
|
+
// ---------------------------------------------------------------------------
|
|
104
|
+
// .claude/mj/** — overwritten as a unit + sweep of stale files
|
|
105
|
+
// ---------------------------------------------------------------------------
|
|
106
|
+
function mergeMjBundle(opts, actions, _warnings) {
|
|
107
|
+
const mjPaths = collectPackPathsByPrefix(opts.PackFiles, '.claude/mj/');
|
|
108
|
+
const targetMjDir = path.join(opts.TargetDir, '.claude', 'mj');
|
|
109
|
+
// Sweep: delete any existing .claude/mj/ files that aren't in the new pack.
|
|
110
|
+
// The folder is "managed as a unit" — stale files from previous versions
|
|
111
|
+
// would otherwise linger.
|
|
112
|
+
if (existsSync(targetMjDir)) {
|
|
113
|
+
const expected = new Set(mjPaths);
|
|
114
|
+
for (const stale of walkRelativeFiles(targetMjDir, opts.TargetDir)) {
|
|
115
|
+
if (!stale.startsWith('.claude/mj/'))
|
|
116
|
+
continue;
|
|
117
|
+
if (!expected.has(stale)) {
|
|
118
|
+
const absPath = path.join(opts.TargetDir, stale);
|
|
119
|
+
if (!opts.DryRun)
|
|
120
|
+
unlinkSync(absPath);
|
|
121
|
+
recordOutcome(actions, {
|
|
122
|
+
path: stale,
|
|
123
|
+
outcome: 'updated',
|
|
124
|
+
reason: 'removed (no longer shipped)',
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Write or overwrite every file the pack ships under .claude/mj/.
|
|
130
|
+
for (const relPath of mjPaths) {
|
|
131
|
+
const bytes = opts.PackFiles.get(relPath);
|
|
132
|
+
const absPath = path.join(opts.TargetDir, relPath);
|
|
133
|
+
const existed = existsSync(absPath);
|
|
134
|
+
const identical = existed && bytesEqual(readFileBytes(absPath), bytes);
|
|
135
|
+
if (identical) {
|
|
136
|
+
recordOutcome(actions, { path: relPath, outcome: 'skipped', reason: 'identical' });
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
writeFile(opts, absPath, bytes);
|
|
140
|
+
recordOutcome(actions, { path: relPath, outcome: existed ? 'updated' : 'added' });
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// .claude/settings.json — deep-merge per §10.2
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
function mergeSettingsFile(opts, actions, warnings) {
|
|
147
|
+
const packBytes = opts.PackFiles.get('.claude/settings.json');
|
|
148
|
+
if (!packBytes) {
|
|
149
|
+
recordOutcome(actions, {
|
|
150
|
+
path: '.claude/settings.json',
|
|
151
|
+
outcome: 'error',
|
|
152
|
+
reason: 'absent from pack',
|
|
153
|
+
});
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
let packJson;
|
|
157
|
+
try {
|
|
158
|
+
packJson = JSON.parse(decodeText(packBytes));
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
recordOutcome(actions, {
|
|
162
|
+
path: '.claude/settings.json',
|
|
163
|
+
outcome: 'error',
|
|
164
|
+
reason: `pack settings.json invalid JSON: ${err.message}`,
|
|
165
|
+
});
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
const targetPath = path.join(opts.TargetDir, '.claude', 'settings.json');
|
|
169
|
+
let existing = {};
|
|
170
|
+
const existed = existsSync(targetPath);
|
|
171
|
+
if (existed) {
|
|
172
|
+
try {
|
|
173
|
+
existing = JSON.parse(readFileSync(targetPath, 'utf8'));
|
|
174
|
+
}
|
|
175
|
+
catch (err) {
|
|
176
|
+
warnings.push(`Existing .claude/settings.json is malformed JSON; leaving it alone. (${err.message})`);
|
|
177
|
+
recordOutcome(actions, {
|
|
178
|
+
path: '.claude/settings.json',
|
|
179
|
+
outcome: 'skipped',
|
|
180
|
+
reason: 'malformed JSON',
|
|
181
|
+
});
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
const { Result, Changed } = mergeSettings({ Existing: existing, Pack: packJson });
|
|
186
|
+
if (!Changed && existed) {
|
|
187
|
+
recordOutcome(actions, {
|
|
188
|
+
path: '.claude/settings.json',
|
|
189
|
+
outcome: 'skipped',
|
|
190
|
+
reason: 'identical',
|
|
191
|
+
});
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
writeFile(opts, targetPath, JSON.stringify(Result, null, 2) + '\n');
|
|
195
|
+
recordOutcome(actions, {
|
|
196
|
+
path: '.claude/settings.json',
|
|
197
|
+
outcome: existed ? 'updated' : 'added',
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
// ---------------------------------------------------------------------------
|
|
201
|
+
// .claude/commands/* and .claude/skills/** — seed-once with --force override
|
|
202
|
+
// ---------------------------------------------------------------------------
|
|
203
|
+
function mergeSeededTree(opts, actions, warnings, prefix, refresh) {
|
|
204
|
+
const paths = collectPackPathsByPrefix(opts.PackFiles, prefix);
|
|
205
|
+
for (const relPath of paths) {
|
|
206
|
+
const result = seedOneFile(opts, relPath, refresh, warnings);
|
|
207
|
+
recordOutcome(actions, result);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function seedOneFile(opts, relPath, refresh, warnings) {
|
|
211
|
+
const bytes = opts.PackFiles.get(relPath);
|
|
212
|
+
const absPath = path.join(opts.TargetDir, relPath);
|
|
213
|
+
if (!existsSync(absPath)) {
|
|
214
|
+
writeFile(opts, absPath, bytes);
|
|
215
|
+
return { path: relPath, outcome: 'added' };
|
|
216
|
+
}
|
|
217
|
+
const existing = readFileBytes(absPath);
|
|
218
|
+
if (bytesEqual(existing, bytes)) {
|
|
219
|
+
return { path: relPath, outcome: 'skipped', reason: 'identical' };
|
|
220
|
+
}
|
|
221
|
+
// Different — user has customized this file. Default behavior is to
|
|
222
|
+
// preserve theirs; --force or --refresh-commands/--refresh-skills
|
|
223
|
+
// overrides with a .bak backup.
|
|
224
|
+
if (opts.Force || refresh) {
|
|
225
|
+
if (!opts.DryRun) {
|
|
226
|
+
writeFileSync(absPath + '.bak', existing);
|
|
227
|
+
}
|
|
228
|
+
writeFile(opts, absPath, bytes);
|
|
229
|
+
return { path: relPath, outcome: 'updated', reason: 'overwritten (.bak saved)' };
|
|
230
|
+
}
|
|
231
|
+
warnings.push(`${relPath} differs from pack — kept user version. Pass --force to overwrite.`);
|
|
232
|
+
return { path: relPath, outcome: 'skipped', reason: 'user-modified' };
|
|
233
|
+
}
|
|
234
|
+
// ---------------------------------------------------------------------------
|
|
235
|
+
// Helpers
|
|
236
|
+
// ---------------------------------------------------------------------------
|
|
237
|
+
function decodeText(bytes) {
|
|
238
|
+
return new TextDecoder('utf-8').decode(bytes);
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* Read a file's raw bytes as a fresh `Uint8Array`. `readFileSync(path)` returns
|
|
242
|
+
* `Buffer`, which Node's strict @types/node 20+ won't always assign to
|
|
243
|
+
* `Uint8Array<ArrayBufferLike>` due to generic-param invariance — wrapping in
|
|
244
|
+
* `new Uint8Array(...)` produces a portable, type-clean value.
|
|
245
|
+
*/
|
|
246
|
+
function readFileBytes(absPath) {
|
|
247
|
+
return new Uint8Array(readFileSync(absPath));
|
|
248
|
+
}
|
|
249
|
+
function bytesEqual(a, b) {
|
|
250
|
+
if (a.length !== b.length)
|
|
251
|
+
return false;
|
|
252
|
+
for (let i = 0; i < a.length; i++) {
|
|
253
|
+
if (a[i] !== b[i])
|
|
254
|
+
return false;
|
|
255
|
+
}
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
function collectPackPathsByPrefix(files, prefix) {
|
|
259
|
+
return [...files.keys()].filter((p) => p.startsWith(prefix)).sort();
|
|
260
|
+
}
|
|
261
|
+
function writeFile(opts, absPath, body) {
|
|
262
|
+
assertWithinTarget(opts.TargetDir, absPath);
|
|
263
|
+
if (opts.DryRun)
|
|
264
|
+
return;
|
|
265
|
+
mkdirSync(path.dirname(absPath), { recursive: true });
|
|
266
|
+
if (typeof body === 'string') {
|
|
267
|
+
writeFileSync(absPath, body, 'utf8');
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
writeFileSync(absPath, body);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
/**
|
|
274
|
+
* Defense-in-depth against malicious pack manifests: every write must
|
|
275
|
+
* resolve to a path inside `targetDir`. A hostile `--from` pack whose
|
|
276
|
+
* manifest declares `relPath: "../../etc/whatever"` would otherwise
|
|
277
|
+
* escape the install directory.
|
|
278
|
+
*/
|
|
279
|
+
function assertWithinTarget(targetDir, absPath) {
|
|
280
|
+
const resolvedTarget = path.resolve(targetDir);
|
|
281
|
+
const resolvedAbs = path.resolve(absPath);
|
|
282
|
+
const targetWithSep = resolvedTarget.endsWith(path.sep) ? resolvedTarget : resolvedTarget + path.sep;
|
|
283
|
+
if (resolvedAbs !== resolvedTarget && !resolvedAbs.startsWith(targetWithSep)) {
|
|
284
|
+
throw new Error(`Pack manifest tried to write outside the target directory: ${absPath} (target: ${targetDir})`);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
/**
|
|
288
|
+
* Walk a directory and return file paths relative to `relativeTo`, using
|
|
289
|
+
* POSIX separators (`/`) regardless of host OS — these are pack-relative
|
|
290
|
+
* paths the rest of the merger compares with.
|
|
291
|
+
*/
|
|
292
|
+
function walkRelativeFiles(dir, relativeTo) {
|
|
293
|
+
const out = [];
|
|
294
|
+
function recurse(current) {
|
|
295
|
+
for (const entry of readdirSync(current)) {
|
|
296
|
+
const abs = path.join(current, entry);
|
|
297
|
+
const stat = statSync(abs);
|
|
298
|
+
if (stat.isDirectory()) {
|
|
299
|
+
recurse(abs);
|
|
300
|
+
}
|
|
301
|
+
else {
|
|
302
|
+
const rel = path.relative(relativeTo, abs).split(path.sep).join('/');
|
|
303
|
+
out.push(rel);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
if (existsSync(dir))
|
|
308
|
+
recurse(dir);
|
|
309
|
+
return out;
|
|
310
|
+
}
|
|
311
|
+
/** Re-export for tests that want to exercise the walker in isolation. */
|
|
312
|
+
export const _internals = { walkRelativeFiles, bytesEqual, collectPackPathsByPrefix };
|
|
313
|
+
// ManagedBlockError re-export — callers may catch it specifically.
|
|
314
|
+
export { ManagedBlockError };
|
|
315
|
+
//# sourceMappingURL=PackMerger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PackMerger.js","sourceRoot":"","sources":["../../../src/lib/claude-pack/PackMerger.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatters for `mj install:claude` and `mj update:claude`.
|
|
3
|
+
*
|
|
4
|
+
* Two shapes:
|
|
5
|
+
* - `formatPretty(result)` — human-readable colored summary for terminals
|
|
6
|
+
* - `formatJson(result)` — machine-readable schema from plan §7.5
|
|
7
|
+
*
|
|
8
|
+
* Lives in `lib/claude-pack/` (not in the command files) because both commands
|
|
9
|
+
* use the same renderer.
|
|
10
|
+
*/
|
|
11
|
+
import type { InstallResult } from './PackTypes.js';
|
|
12
|
+
/** Plain `--json` output. */
|
|
13
|
+
export declare function formatJson(result: InstallResult): string;
|
|
14
|
+
/**
|
|
15
|
+
* Multi-line colored summary for terminals. Sections:
|
|
16
|
+
*
|
|
17
|
+
* ✓ Claude Code pack v5.1.0 installed (MJ v5.33.0)
|
|
18
|
+
* added: N
|
|
19
|
+
* <list>
|
|
20
|
+
* updated: N
|
|
21
|
+
* <list>
|
|
22
|
+
* skipped: N (truncated to first few)
|
|
23
|
+
* warnings: N
|
|
24
|
+
* <list>
|
|
25
|
+
*
|
|
26
|
+
* Failure mode: a red banner + the errors[] list.
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatPretty(result: InstallResult): string;
|
|
29
|
+
//# sourceMappingURL=PackOutputFormatter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PackOutputFormatter.d.ts","sourceRoot":"","sources":["../../../src/lib/claude-pack/PackOutputFormatter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,6BAA6B;AAC7B,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAExD;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA6C1D"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output formatters for `mj install:claude` and `mj update:claude`.
|
|
3
|
+
*
|
|
4
|
+
* Two shapes:
|
|
5
|
+
* - `formatPretty(result)` — human-readable colored summary for terminals
|
|
6
|
+
* - `formatJson(result)` — machine-readable schema from plan §7.5
|
|
7
|
+
*
|
|
8
|
+
* Lives in `lib/claude-pack/` (not in the command files) because both commands
|
|
9
|
+
* use the same renderer.
|
|
10
|
+
*/
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
/** Plain `--json` output. */
|
|
13
|
+
export function formatJson(result) {
|
|
14
|
+
return JSON.stringify(result, null, 2);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Multi-line colored summary for terminals. Sections:
|
|
18
|
+
*
|
|
19
|
+
* ✓ Claude Code pack v5.1.0 installed (MJ v5.33.0)
|
|
20
|
+
* added: N
|
|
21
|
+
* <list>
|
|
22
|
+
* updated: N
|
|
23
|
+
* <list>
|
|
24
|
+
* skipped: N (truncated to first few)
|
|
25
|
+
* warnings: N
|
|
26
|
+
* <list>
|
|
27
|
+
*
|
|
28
|
+
* Failure mode: a red banner + the errors[] list.
|
|
29
|
+
*/
|
|
30
|
+
export function formatPretty(result) {
|
|
31
|
+
const lines = [];
|
|
32
|
+
if (!result.ok) {
|
|
33
|
+
lines.push(chalk.red.bold('✗ Claude Code pack operation failed.'));
|
|
34
|
+
if (result.actions.errors.length > 0) {
|
|
35
|
+
lines.push(chalk.red('errors:'));
|
|
36
|
+
for (const err of result.actions.errors) {
|
|
37
|
+
lines.push(chalk.red(` - ${err}`));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
if (result.warnings.length > 0) {
|
|
41
|
+
lines.push(chalk.yellow('warnings:'));
|
|
42
|
+
for (const w of result.warnings) {
|
|
43
|
+
lines.push(chalk.yellow(` - ${w}`));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
return lines.join('\n');
|
|
47
|
+
}
|
|
48
|
+
const version = result.packVersion ? `v${result.packVersion}` : '(check only)';
|
|
49
|
+
const mjLabel = result.installedMJVersion
|
|
50
|
+
? `for MJ v${result.installedMJVersion}`
|
|
51
|
+
: 'no local MJ detected';
|
|
52
|
+
lines.push(chalk.green.bold(`✓ Claude Code pack ${version} ${mjLabel}`));
|
|
53
|
+
appendBucket(lines, 'added', result.actions.added, chalk.green);
|
|
54
|
+
appendBucket(lines, 'updated', result.actions.updated, chalk.cyan);
|
|
55
|
+
appendBucket(lines, 'skipped', result.actions.skipped, chalk.dim, 5);
|
|
56
|
+
if (result.notes.length > 0) {
|
|
57
|
+
lines.push(chalk.cyan(`notes (${result.notes.length}):`));
|
|
58
|
+
for (const n of result.notes) {
|
|
59
|
+
lines.push(chalk.cyan(` - ${n}`));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
if (result.warnings.length > 0) {
|
|
63
|
+
lines.push(chalk.yellow(`warnings (${result.warnings.length}):`));
|
|
64
|
+
for (const w of result.warnings) {
|
|
65
|
+
lines.push(chalk.yellow(` - ${w}`));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
return lines.join('\n');
|
|
69
|
+
}
|
|
70
|
+
function appendBucket(lines, label, entries, color, maxList = Number.POSITIVE_INFINITY) {
|
|
71
|
+
if (entries.length === 0)
|
|
72
|
+
return;
|
|
73
|
+
lines.push(color(`${label} (${entries.length}):`));
|
|
74
|
+
const shown = entries.slice(0, maxList);
|
|
75
|
+
for (const e of shown) {
|
|
76
|
+
lines.push(color(` - ${e}`));
|
|
77
|
+
}
|
|
78
|
+
if (entries.length > shown.length) {
|
|
79
|
+
lines.push(color(` … ${entries.length - shown.length} more`));
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=PackOutputFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PackOutputFormatter.js","sourceRoot":"","sources":["../../../src/lib/claude-pack/PackOutputFormatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path helpers for the Claude Code pack install / update flow.
|
|
3
|
+
*
|
|
4
|
+
* Pure path math + a small `package.json`-reading helper for detecting the
|
|
5
|
+
* MJ major version a user's project is on. No network, no FS mutation.
|
|
6
|
+
*
|
|
7
|
+
* @see plans/claude-install-pack.md §3.2 (target layout), §6.4 (paths per rule)
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Every file/directory in a user's project that the pack writes to or
|
|
11
|
+
* reads from. Built from a single `targetDir` so callers don't have to
|
|
12
|
+
* `path.join` repeatedly.
|
|
13
|
+
*/
|
|
14
|
+
export interface TargetPaths {
|
|
15
|
+
/** The root directory we're installing into. */
|
|
16
|
+
Root: string;
|
|
17
|
+
/** `<Root>/CLAUDE.md` — root instructions file. */
|
|
18
|
+
ClaudeMd: string;
|
|
19
|
+
/** `<Root>/package.json` — used for MJ major detection. */
|
|
20
|
+
PackageJson: string;
|
|
21
|
+
/** `<Root>/.claude/` — the Claude Code config root. */
|
|
22
|
+
ClaudeDir: string;
|
|
23
|
+
/** `<Root>/.claude/settings.json` — settings file we merge into. */
|
|
24
|
+
SettingsJson: string;
|
|
25
|
+
/** `<Root>/.claude/mj/` — the fully-managed bundle directory. */
|
|
26
|
+
MjDir: string;
|
|
27
|
+
/** `<Root>/.claude/mj/VERSION` — pack version stamp. */
|
|
28
|
+
VersionFile: string;
|
|
29
|
+
/** `<Root>/.claude/mj/MANIFEST.json` — checksums of the installed pack. */
|
|
30
|
+
ManifestFile: string;
|
|
31
|
+
/** `<Root>/.claude/commands/` — curated commands directory. */
|
|
32
|
+
CommandsDir: string;
|
|
33
|
+
/** `<Root>/.claude/skills/` — curated skills directory. */
|
|
34
|
+
SkillsDir: string;
|
|
35
|
+
}
|
|
36
|
+
/** Compute every target path for a given install directory. */
|
|
37
|
+
export declare function targetPathsFor(targetDir: string): TargetPaths;
|
|
38
|
+
/**
|
|
39
|
+
* When `--from <path>` is used, the path may point at either:
|
|
40
|
+
* - the **MJ repo root** (we look for `templates/claude-pack/dist/v{N}/` underneath), or
|
|
41
|
+
* - an **already-unpacked dist directory** (we use it directly).
|
|
42
|
+
*
|
|
43
|
+
* Returns the resolved root of the pack contents, or null if neither shape works.
|
|
44
|
+
*/
|
|
45
|
+
export declare function resolveLocalPackRoot(fromPath: string, mjMajor: string): string | null;
|
|
46
|
+
/**
|
|
47
|
+
* Strip the leading `^` / `~` / `>=` / etc. and extract the first numeric
|
|
48
|
+
* component. Returns `null` if the string isn't a recognizable semver.
|
|
49
|
+
*
|
|
50
|
+
* Accepts: `5.33.0`, `^5.33.0`, `~5.33.0`, `>=5.33.0`, `5`, `v5.33.0`.
|
|
51
|
+
* Rejects: empty, `next`, `latest`, `*`, anything without a leading digit
|
|
52
|
+
* after the strip.
|
|
53
|
+
*/
|
|
54
|
+
export declare function parseSemverMajor(version: string): string | null;
|
|
55
|
+
/**
|
|
56
|
+
* Detect the MJ major version installed in the user's project. Reads
|
|
57
|
+
* `<dir>/package.json` and looks at any `@memberjunction/*` entry in
|
|
58
|
+
* `dependencies` or `devDependencies`. Falls back to scanning
|
|
59
|
+
* `<dir>/apps/*\/package.json` and `<dir>/packages/*\/package.json` for
|
|
60
|
+
* distribution-style workspace installs whose root has no direct @mj deps.
|
|
61
|
+
*
|
|
62
|
+
* Returns `null` if no MJ dependency is declared anywhere reachable (e.g.,
|
|
63
|
+
* a fresh `mj install` that hasn't run `npm install` yet, or a non-MJ project).
|
|
64
|
+
*/
|
|
65
|
+
export declare function detectMJMajor(targetDir: string): string | null;
|
|
66
|
+
/**
|
|
67
|
+
* Detect the full MJ semver string (e.g. `5.33.0`) installed in the user's
|
|
68
|
+
* project. Same scan order as {@link detectMJMajor} — root, then workspace
|
|
69
|
+
* subdirs. Returns the bare semver with any `^`/`~`/`>=` prefix stripped,
|
|
70
|
+
* or `null` if nothing is reachable.
|
|
71
|
+
*/
|
|
72
|
+
export declare function detectMJVersionString(targetDir: string): string | null;
|
|
73
|
+
/**
|
|
74
|
+
* Build the remote URL prefix for a given MJ major and git ref.
|
|
75
|
+
*
|
|
76
|
+
* `ref` defaults to `main`. Callers that want pinned-to-tag behavior should
|
|
77
|
+
* pass the tag explicitly (e.g. `v5.33.0`) — see plan §8.5.
|
|
78
|
+
*/
|
|
79
|
+
export declare function buildRemoteUrlPrefix(mjMajor: string, ref?: string): string;
|
|
80
|
+
//# sourceMappingURL=PackPaths.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PackPaths.d.ts","sourceRoot":"","sources":["../../../src/lib/claude-pack/PackPaths.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC1B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC;IACjB,2DAA2D;IAC3D,WAAW,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,SAAS,EAAE,MAAM,CAAC;IAClB,oEAAoE;IACpE,YAAY,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,WAAW,EAAE,MAAM,CAAC;IACpB,2EAA2E;IAC3E,YAAY,EAAE,MAAM,CAAC;IACrB,+DAA+D;IAC/D,WAAW,EAAE,MAAM,CAAC;IACpB,2DAA2D;IAC3D,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,CAgB7D;AAMD;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkBrF;AAMD;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAO/D;AAkED;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM9D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMtE;AASD;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,GAAE,MAAe,GAAG,MAAM,CAElF"}
|