@soleri/cli 1.9.0 → 1.10.1

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 (94) hide show
  1. package/README.md +4 -0
  2. package/dist/commands/agent.d.ts +8 -0
  3. package/dist/commands/agent.js +150 -0
  4. package/dist/commands/agent.js.map +1 -0
  5. package/dist/commands/create.js +38 -6
  6. package/dist/commands/create.js.map +1 -1
  7. package/dist/commands/install-knowledge.js +65 -3
  8. package/dist/commands/install-knowledge.js.map +1 -1
  9. package/dist/commands/install.d.ts +2 -0
  10. package/dist/commands/install.js +80 -0
  11. package/dist/commands/install.js.map +1 -0
  12. package/dist/commands/pack.d.ts +10 -0
  13. package/dist/commands/pack.js +512 -0
  14. package/dist/commands/pack.js.map +1 -0
  15. package/dist/commands/skills.d.ts +8 -0
  16. package/dist/commands/skills.js +167 -0
  17. package/dist/commands/skills.js.map +1 -0
  18. package/dist/commands/uninstall.d.ts +2 -0
  19. package/dist/commands/uninstall.js +74 -0
  20. package/dist/commands/uninstall.js.map +1 -0
  21. package/dist/hook-packs/installer.d.ts +0 -7
  22. package/dist/hook-packs/installer.js +1 -14
  23. package/dist/hook-packs/installer.js.map +1 -1
  24. package/dist/hook-packs/installer.ts +1 -18
  25. package/dist/hook-packs/registry.d.ts +2 -1
  26. package/dist/hook-packs/registry.ts +1 -1
  27. package/dist/main.js +40 -1
  28. package/dist/main.js.map +1 -1
  29. package/dist/prompts/archetypes.d.ts +1 -0
  30. package/dist/prompts/archetypes.js +177 -62
  31. package/dist/prompts/archetypes.js.map +1 -1
  32. package/dist/prompts/create-wizard.d.ts +3 -3
  33. package/dist/prompts/create-wizard.js +99 -50
  34. package/dist/prompts/create-wizard.js.map +1 -1
  35. package/dist/prompts/playbook.d.ts +8 -7
  36. package/dist/prompts/playbook.js +201 -15
  37. package/dist/prompts/playbook.js.map +1 -1
  38. package/dist/utils/checks.d.ts +0 -1
  39. package/dist/utils/checks.js +1 -1
  40. package/dist/utils/checks.js.map +1 -1
  41. package/package.json +1 -1
  42. package/src/__tests__/archetypes.test.ts +84 -0
  43. package/src/__tests__/doctor.test.ts +2 -2
  44. package/src/__tests__/wizard-e2e.mjs +508 -0
  45. package/src/commands/agent.ts +181 -0
  46. package/src/commands/create.ts +152 -104
  47. package/src/commands/install-knowledge.ts +75 -4
  48. package/src/commands/install.ts +101 -0
  49. package/src/commands/pack.ts +585 -0
  50. package/src/commands/skills.ts +191 -0
  51. package/src/commands/uninstall.ts +93 -0
  52. package/src/hook-packs/installer.ts +1 -18
  53. package/src/hook-packs/registry.ts +1 -1
  54. package/src/main.ts +42 -1
  55. package/src/prompts/archetypes.ts +193 -62
  56. package/src/prompts/create-wizard.ts +117 -61
  57. package/src/prompts/playbook.ts +207 -21
  58. package/src/utils/checks.ts +1 -1
  59. package/code-reviewer/.claude/hookify.focus-ring-required.local.md +0 -21
  60. package/code-reviewer/.claude/hookify.no-ai-attribution.local.md +0 -18
  61. package/code-reviewer/.claude/hookify.no-any-types.local.md +0 -18
  62. package/code-reviewer/.claude/hookify.no-console-log.local.md +0 -21
  63. package/code-reviewer/.claude/hookify.no-important.local.md +0 -18
  64. package/code-reviewer/.claude/hookify.no-inline-styles.local.md +0 -21
  65. package/code-reviewer/.claude/hookify.semantic-html.local.md +0 -18
  66. package/code-reviewer/.claude/hookify.ux-touch-targets.local.md +0 -18
  67. package/code-reviewer/.mcp.json +0 -11
  68. package/code-reviewer/README.md +0 -346
  69. package/code-reviewer/package-lock.json +0 -4484
  70. package/code-reviewer/package.json +0 -45
  71. package/code-reviewer/scripts/copy-assets.js +0 -15
  72. package/code-reviewer/scripts/setup.sh +0 -130
  73. package/code-reviewer/skills/brainstorming/SKILL.md +0 -170
  74. package/code-reviewer/skills/code-patrol/SKILL.md +0 -176
  75. package/code-reviewer/skills/context-resume/SKILL.md +0 -143
  76. package/code-reviewer/skills/executing-plans/SKILL.md +0 -201
  77. package/code-reviewer/skills/fix-and-learn/SKILL.md +0 -164
  78. package/code-reviewer/skills/health-check/SKILL.md +0 -225
  79. package/code-reviewer/skills/second-opinion/SKILL.md +0 -142
  80. package/code-reviewer/skills/systematic-debugging/SKILL.md +0 -230
  81. package/code-reviewer/skills/verification-before-completion/SKILL.md +0 -170
  82. package/code-reviewer/skills/writing-plans/SKILL.md +0 -207
  83. package/code-reviewer/src/__tests__/facades.test.ts +0 -598
  84. package/code-reviewer/src/activation/activate.ts +0 -125
  85. package/code-reviewer/src/activation/claude-md-content.ts +0 -217
  86. package/code-reviewer/src/activation/inject-claude-md.ts +0 -113
  87. package/code-reviewer/src/extensions/index.ts +0 -47
  88. package/code-reviewer/src/extensions/ops/example.ts +0 -28
  89. package/code-reviewer/src/identity/persona.ts +0 -62
  90. package/code-reviewer/src/index.ts +0 -278
  91. package/code-reviewer/src/intelligence/data/architecture.json +0 -5
  92. package/code-reviewer/src/intelligence/data/code-review.json +0 -5
  93. package/code-reviewer/tsconfig.json +0 -30
  94. package/code-reviewer/vitest.config.ts +0 -23
@@ -0,0 +1,512 @@
1
+ /**
2
+ * Unified pack CLI — install, list, remove, info, outdated for all pack types.
3
+ *
4
+ * Replaces separate `hooks add-pack`, `install-knowledge`, `skills install`
5
+ * with a single `soleri pack` command family.
6
+ *
7
+ * Resolution order: local path → built-in → npm registry.
8
+ */
9
+ import { join } from 'node:path';
10
+ import { existsSync, readFileSync } from 'node:fs';
11
+ import * as p from '@clack/prompts';
12
+ import { PackLockfile, inferPackType, resolvePack, checkNpmVersion } from '@soleri/core';
13
+ import { detectAgent } from '../utils/agent-context.js';
14
+ const LOCKFILE_NAME = 'soleri.lock';
15
+ function getLockfilePath() {
16
+ const ctx = detectAgent();
17
+ if (!ctx) {
18
+ p.log.error('No agent project detected in current directory.');
19
+ process.exit(1);
20
+ }
21
+ return join(ctx.agentPath, LOCKFILE_NAME);
22
+ }
23
+ function getBuiltinDirs(agentPath) {
24
+ const dirs = [];
25
+ // Check for bundled packs in node_modules
26
+ const nmPacks = join(agentPath, 'node_modules', '@soleri');
27
+ if (existsSync(nmPacks)) {
28
+ dirs.push(nmPacks);
29
+ }
30
+ return dirs;
31
+ }
32
+ export function registerPack(program) {
33
+ const pack = program
34
+ .command('pack')
35
+ .description('Manage extension packs (hooks, skills, knowledge, domains)');
36
+ // ─── list ──────────────────────────────────────────────────
37
+ pack
38
+ .command('list')
39
+ .option('--type <type>', 'Filter by pack type (hooks, skills, knowledge, domain, bundle)')
40
+ .description('List installed packs')
41
+ .action((opts) => {
42
+ const lockfile = new PackLockfile(getLockfilePath());
43
+ let entries = lockfile.list();
44
+ if (opts.type) {
45
+ entries = entries.filter((e) => e.type === opts.type);
46
+ }
47
+ if (entries.length === 0) {
48
+ p.log.info('No packs installed.');
49
+ return;
50
+ }
51
+ p.log.info(`${entries.length} pack(s) installed:\n`);
52
+ for (const entry of entries) {
53
+ const badge = entry.source === 'built-in' ? ' [built-in]' : entry.source === 'npm' ? ' [npm]' : '';
54
+ console.log(` ${entry.id}@${entry.version} ${entry.type}${badge}`);
55
+ if (entry.vaultEntries > 0)
56
+ console.log(` vault: ${entry.vaultEntries} entries`);
57
+ if (entry.skills.length > 0)
58
+ console.log(` skills: ${entry.skills.join(', ')}`);
59
+ if (entry.hooks.length > 0)
60
+ console.log(` hooks: ${entry.hooks.join(', ')}`);
61
+ }
62
+ });
63
+ // ─── install ───────────────────────────────────────────────
64
+ pack
65
+ .command('install')
66
+ .argument('<pack>', 'Pack name, path, or npm package')
67
+ .option('--type <type>', 'Expected pack type (hooks, skills, knowledge, domain)')
68
+ .option('--version <ver>', 'Specific version to install')
69
+ .option('--frozen', 'Fail if pack is not in lockfile (CI mode)')
70
+ .description('Install a pack from local path, built-in, or npm')
71
+ .action(async (packName, opts) => {
72
+ const lockfilePath = getLockfilePath();
73
+ const lockfile = new PackLockfile(lockfilePath);
74
+ const ctx = detectAgent();
75
+ if (!ctx)
76
+ return;
77
+ // Frozen mode — only install from lockfile
78
+ if (opts.frozen) {
79
+ const entry = lockfile.get(packName);
80
+ if (!entry) {
81
+ p.log.error(`Pack "${packName}" not in lockfile. Cannot install in frozen mode.`);
82
+ process.exit(1);
83
+ }
84
+ p.log.info(`Frozen: ${entry.id}@${entry.version} (${entry.source})`);
85
+ return;
86
+ }
87
+ // Check if already installed
88
+ if (lockfile.has(packName)) {
89
+ p.log.warn(`Pack "${packName}" is already installed. Use \`soleri pack update\` to upgrade.`);
90
+ return;
91
+ }
92
+ const s = p.spinner();
93
+ s.start(`Resolving pack: ${packName}...`);
94
+ try {
95
+ const resolved = resolvePack(packName, {
96
+ builtinDirs: getBuiltinDirs(ctx.agentPath),
97
+ version: opts.version,
98
+ });
99
+ s.message(`Installing from ${resolved.source}...`);
100
+ // Read manifest
101
+ const manifestPath = join(resolved.directory, 'soleri-pack.json');
102
+ if (!existsSync(manifestPath)) {
103
+ s.stop('Install failed');
104
+ p.log.error(`No soleri-pack.json found in ${resolved.directory}`);
105
+ process.exit(1);
106
+ return;
107
+ }
108
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
109
+ const packType = inferPackType(manifest);
110
+ // Type check if specified
111
+ if (opts.type && packType !== opts.type && packType !== 'bundle') {
112
+ s.stop('Install failed');
113
+ p.log.error(`Expected pack type "${opts.type}" but got "${packType}"`);
114
+ process.exit(1);
115
+ return;
116
+ }
117
+ // Count contents
118
+ const vaultDir = join(resolved.directory, manifest.vault?.dir ?? 'vault');
119
+ let vaultEntries = 0;
120
+ if (existsSync(vaultDir)) {
121
+ const { loadIntelligenceData } = await import('@soleri/core');
122
+ const entries = loadIntelligenceData(vaultDir);
123
+ vaultEntries = entries.length;
124
+ }
125
+ const skillsDir = join(resolved.directory, manifest.skills?.dir ?? 'skills');
126
+ const skills = existsSync(skillsDir) ? listMdFiles(skillsDir) : [];
127
+ const hooksDir = join(resolved.directory, manifest.hooks?.dir ?? 'hooks');
128
+ const hooks = existsSync(hooksDir) ? listMdFiles(hooksDir) : [];
129
+ // Create lock entry
130
+ const entry = {
131
+ id: manifest.id,
132
+ version: manifest.version,
133
+ type: packType,
134
+ source: resolved.source,
135
+ directory: resolved.directory,
136
+ integrity: PackLockfile.computeIntegrity(manifestPath),
137
+ installedAt: new Date().toISOString(),
138
+ vaultEntries,
139
+ skills,
140
+ hooks,
141
+ facadesRegistered: (manifest.facades?.length ?? 0) > 0,
142
+ };
143
+ lockfile.set(entry);
144
+ lockfile.save();
145
+ s.stop(`Installed ${manifest.id}@${manifest.version} (${packType})`);
146
+ const parts = [];
147
+ if (vaultEntries > 0)
148
+ parts.push(`${vaultEntries} vault entries`);
149
+ if (skills.length > 0)
150
+ parts.push(`${skills.length} skills`);
151
+ if (hooks.length > 0)
152
+ parts.push(`${hooks.length} hooks`);
153
+ if (parts.length > 0) {
154
+ p.log.info(` Contents: ${parts.join(', ')}`);
155
+ }
156
+ }
157
+ catch (err) {
158
+ s.stop('Install failed');
159
+ p.log.error(err instanceof Error ? err.message : String(err));
160
+ process.exit(1);
161
+ }
162
+ });
163
+ // ─── remove ────────────────────────────────────────────────
164
+ pack
165
+ .command('remove')
166
+ .argument('<packId>', 'Pack ID to remove')
167
+ .description('Remove an installed pack')
168
+ .action((packId) => {
169
+ const lockfile = new PackLockfile(getLockfilePath());
170
+ if (!lockfile.has(packId)) {
171
+ p.log.error(`Pack "${packId}" is not installed.`);
172
+ process.exit(1);
173
+ }
174
+ lockfile.remove(packId);
175
+ lockfile.save();
176
+ p.log.success(`Removed ${packId}`);
177
+ p.log.info('Note: Vault entries from this pack are preserved in the knowledge base.');
178
+ });
179
+ // ─── info ──────────────────────────────────────────────────
180
+ pack
181
+ .command('info')
182
+ .argument('<packId>', 'Pack ID')
183
+ .description('Show detailed info about an installed pack')
184
+ .action((packId) => {
185
+ const lockfile = new PackLockfile(getLockfilePath());
186
+ const entry = lockfile.get(packId);
187
+ if (!entry) {
188
+ p.log.error(`Pack "${packId}" is not installed.`);
189
+ process.exit(1);
190
+ return;
191
+ }
192
+ console.log(`\n Pack: ${entry.id}`);
193
+ console.log(` Version: ${entry.version}`);
194
+ console.log(` Type: ${entry.type}`);
195
+ console.log(` Source: ${entry.source}`);
196
+ console.log(` Directory: ${entry.directory}`);
197
+ console.log(` Installed: ${entry.installedAt}`);
198
+ console.log(` Integrity: ${entry.integrity}`);
199
+ if (entry.vaultEntries > 0)
200
+ console.log(` Vault: ${entry.vaultEntries} entries`);
201
+ if (entry.skills.length > 0)
202
+ console.log(` Skills: ${entry.skills.join(', ')}`);
203
+ if (entry.hooks.length > 0)
204
+ console.log(` Hooks: ${entry.hooks.join(', ')}`);
205
+ console.log('');
206
+ });
207
+ // ─── outdated ──────────────────────────────────────────────
208
+ pack
209
+ .command('outdated')
210
+ .description('Check for packs with available updates on npm')
211
+ .action(() => {
212
+ const lockfile = new PackLockfile(getLockfilePath());
213
+ const entries = lockfile.list().filter((e) => e.source === 'npm');
214
+ if (entries.length === 0) {
215
+ p.log.info('No npm-sourced packs installed.');
216
+ return;
217
+ }
218
+ const s = p.spinner();
219
+ s.start('Checking for updates...');
220
+ const outdated = [];
221
+ for (const entry of entries) {
222
+ const npmPkg = entry.id.startsWith('@') ? entry.id : `@soleri/pack-${entry.id}`;
223
+ const latest = checkNpmVersion(npmPkg);
224
+ if (latest && latest !== entry.version) {
225
+ outdated.push({ id: entry.id, current: entry.version, latest });
226
+ }
227
+ }
228
+ s.stop(outdated.length > 0 ? `${outdated.length} update(s) available` : 'All packs up to date');
229
+ for (const item of outdated) {
230
+ console.log(` ${item.id} ${item.current} → ${item.latest}`);
231
+ }
232
+ });
233
+ // ─── update ─────────────────────────────────────────────────
234
+ pack
235
+ .command('update')
236
+ .argument('[packId]', 'Specific pack to update (or all)')
237
+ .option('--force', 'Force update even if version is incompatible')
238
+ .description('Update installed packs to latest compatible version')
239
+ .action((packId, _opts) => {
240
+ const lockfilePath = getLockfilePath();
241
+ const lockfile = new PackLockfile(lockfilePath);
242
+ const ctx = detectAgent();
243
+ if (!ctx)
244
+ return;
245
+ let entries = lockfile.list().filter((e) => e.source === 'npm');
246
+ if (packId) {
247
+ entries = entries.filter((e) => e.id === packId);
248
+ if (entries.length === 0) {
249
+ p.log.error(lockfile.has(packId)
250
+ ? `Pack "${packId}" is local/built-in and cannot be updated from npm.`
251
+ : `Pack "${packId}" is not installed.`);
252
+ process.exit(1);
253
+ }
254
+ }
255
+ if (entries.length === 0) {
256
+ p.log.info('No npm-sourced packs to update.');
257
+ return;
258
+ }
259
+ const s = p.spinner();
260
+ s.start('Checking for updates...');
261
+ let updated = 0;
262
+ for (const entry of entries) {
263
+ const npmPkg = entry.id.startsWith('@') ? entry.id : `@soleri/pack-${entry.id}`;
264
+ const latest = checkNpmVersion(npmPkg);
265
+ if (!latest || latest === entry.version)
266
+ continue;
267
+ // Update lockfile entry with new version
268
+ lockfile.set({ ...entry, version: latest, installedAt: new Date().toISOString() });
269
+ updated++;
270
+ p.log.info(` ${entry.id}: ${entry.version} → ${latest}`);
271
+ }
272
+ if (updated > 0) {
273
+ lockfile.save();
274
+ s.stop(`Updated ${updated} pack(s)`);
275
+ }
276
+ else {
277
+ s.stop('All packs up to date');
278
+ }
279
+ });
280
+ // ─── search ─────────────────────────────────────────────────
281
+ pack
282
+ .command('search')
283
+ .argument('<query>', 'Search term')
284
+ .option('--type <type>', 'Filter by pack type')
285
+ .description('Search for packs on the npm registry')
286
+ .action((query) => {
287
+ const s = p.spinner();
288
+ s.start(`Searching npm for "${query}"...`);
289
+ try {
290
+ const { execFileSync } = require('node:child_process');
291
+ const searchTerm = `soleri-pack-${query}`;
292
+ const result = execFileSync('npm', ['search', searchTerm, '--json'], {
293
+ encoding: 'utf-8',
294
+ timeout: 15_000,
295
+ });
296
+ const packages = JSON.parse(result || '[]');
297
+ const filtered = packages.filter((pkg) => pkg.name.includes('soleri-pack') || pkg.name.startsWith('@soleri/pack-'));
298
+ s.stop(filtered.length > 0 ? `Found ${filtered.length} pack(s)` : 'No packs found');
299
+ for (const pkg of filtered) {
300
+ console.log(` ${pkg.name}@${pkg.version} ${pkg.description || ''}`);
301
+ }
302
+ }
303
+ catch {
304
+ s.stop('Search failed');
305
+ p.log.warn('Could not search npm registry. Check your network connection.');
306
+ }
307
+ });
308
+ // ─── create ─────────────────────────────────────────────────
309
+ pack
310
+ .command('create')
311
+ .description('Scaffold a new pack project')
312
+ .action(async () => {
313
+ const name = await p.text({ message: 'Pack name:', placeholder: 'my-react-patterns' });
314
+ if (p.isCancel(name) || !name)
315
+ return;
316
+ const packType = await p.select({
317
+ message: 'Pack type:',
318
+ options: [
319
+ { value: 'knowledge', label: 'Knowledge — vault entries, patterns, anti-patterns' },
320
+ { value: 'skills', label: 'Skills — workflow skill files' },
321
+ { value: 'hooks', label: 'Hooks — editor hook files' },
322
+ { value: 'bundle', label: 'Bundle — multiple content types' },
323
+ ],
324
+ });
325
+ if (p.isCancel(packType))
326
+ return;
327
+ const description = await p.text({
328
+ message: 'Description:',
329
+ placeholder: 'Patterns for React hooks and state management',
330
+ });
331
+ if (p.isCancel(description))
332
+ return;
333
+ const author = await p.text({ message: 'Author:', placeholder: '@username' });
334
+ if (p.isCancel(author))
335
+ return;
336
+ const dir = join(process.cwd(), String(name));
337
+ const { mkdirSync, writeFileSync } = require('node:fs');
338
+ mkdirSync(dir, { recursive: true });
339
+ // Scaffold manifest
340
+ const manifest = {
341
+ id: name,
342
+ version: '1.0.0',
343
+ description: description || '',
344
+ author: author || '',
345
+ license: 'MIT',
346
+ soleri: '>=2.0.0',
347
+ };
348
+ // Scaffold content directories based on type
349
+ if (packType === 'knowledge' || packType === 'bundle') {
350
+ const vaultDir = join(dir, 'vault');
351
+ mkdirSync(vaultDir, { recursive: true });
352
+ writeFileSync(join(vaultDir, 'patterns.json'), JSON.stringify([], null, 2) + '\n', 'utf-8');
353
+ manifest.vault = { dir: 'vault' };
354
+ }
355
+ if (packType === 'skills' || packType === 'bundle') {
356
+ const skillsDir = join(dir, 'skills');
357
+ mkdirSync(skillsDir, { recursive: true });
358
+ writeFileSync(join(skillsDir, 'example.md'), `# Example Skill\n\nReplace this with your skill content.\n`, 'utf-8');
359
+ manifest.skills = { dir: 'skills' };
360
+ }
361
+ if (packType === 'hooks' || packType === 'bundle') {
362
+ const hooksDir = join(dir, 'hooks');
363
+ mkdirSync(hooksDir, { recursive: true });
364
+ writeFileSync(join(hooksDir, 'example.md'), `# Example Hook\n\nReplace this with your hook content.\n`, 'utf-8');
365
+ manifest.hooks = { dir: 'hooks' };
366
+ }
367
+ writeFileSync(join(dir, 'soleri-pack.json'), JSON.stringify(manifest, null, 2) + '\n', 'utf-8');
368
+ p.log.success(`Created ${name}/`);
369
+ p.log.info(` soleri-pack.json`);
370
+ if (manifest.vault)
371
+ p.log.info(` vault/patterns.json`);
372
+ if (manifest.skills)
373
+ p.log.info(` skills/example.md`);
374
+ if (manifest.hooks)
375
+ p.log.info(` hooks/example.md`);
376
+ p.log.info(`\nNext: edit content, then \`soleri pack validate ${name}/\``);
377
+ });
378
+ // ─── validate ───────────────────────────────────────────────
379
+ pack
380
+ .command('validate')
381
+ .argument('<path>', 'Path to pack directory')
382
+ .description('Validate a pack before publishing')
383
+ .action((packPath) => {
384
+ const { resolve } = require('node:path');
385
+ const dir = resolve(packPath);
386
+ const errors = [];
387
+ const warnings = [];
388
+ // Check manifest exists
389
+ const manifestPath = join(dir, 'soleri-pack.json');
390
+ if (!existsSync(manifestPath)) {
391
+ p.log.error(`No soleri-pack.json found at ${dir}`);
392
+ process.exit(1);
393
+ }
394
+ let manifest;
395
+ try {
396
+ manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
397
+ }
398
+ catch {
399
+ p.log.error('Invalid JSON in soleri-pack.json');
400
+ process.exit(1);
401
+ return;
402
+ }
403
+ // Required fields
404
+ if (!manifest.id || typeof manifest.id !== 'string')
405
+ errors.push('Missing or invalid "id" field');
406
+ if (!manifest.version || typeof manifest.version !== 'string')
407
+ errors.push('Missing or invalid "version" field');
408
+ if (manifest.version && !/^\d+\.\d+\.\d+/.test(manifest.version))
409
+ errors.push('Version must be valid semver (e.g., 1.0.0)');
410
+ if (!manifest.soleri)
411
+ warnings.push('Missing "soleri" compatibility range');
412
+ // Naming convention
413
+ const id = manifest.id;
414
+ if (id && !id.match(/^[@a-z0-9][\w./-]*$/i)) {
415
+ errors.push(`Pack id "${id}" contains invalid characters`);
416
+ }
417
+ // Content directories exist
418
+ const packType = inferPackType(manifest);
419
+ if (manifest.vault) {
420
+ const vaultDir = join(dir, manifest.vault.dir || 'vault');
421
+ if (!existsSync(vaultDir))
422
+ errors.push(`Vault directory not found: ${vaultDir}`);
423
+ }
424
+ if (manifest.skills) {
425
+ const skillsDir = join(dir, manifest.skills.dir || 'skills');
426
+ if (!existsSync(skillsDir))
427
+ errors.push(`Skills directory not found: ${skillsDir}`);
428
+ }
429
+ if (manifest.hooks) {
430
+ const hooksDir = join(dir, manifest.hooks.dir || 'hooks');
431
+ if (!existsSync(hooksDir))
432
+ errors.push(`Hooks directory not found: ${hooksDir}`);
433
+ }
434
+ // Report
435
+ if (errors.length > 0) {
436
+ p.log.error(`Validation failed (${errors.length} error(s)):`);
437
+ for (const err of errors)
438
+ console.log(` ✗ ${err}`);
439
+ if (warnings.length > 0) {
440
+ for (const warn of warnings)
441
+ console.log(` ⚠ ${warn}`);
442
+ }
443
+ process.exit(1);
444
+ }
445
+ if (warnings.length > 0) {
446
+ for (const warn of warnings)
447
+ p.log.warn(warn);
448
+ }
449
+ p.log.success(`Pack "${id}" v${manifest.version} (${packType}) is valid`);
450
+ });
451
+ // ─── publish ────────────────────────────────────────────────
452
+ pack
453
+ .command('publish')
454
+ .argument('[path]', 'Path to pack directory', '.')
455
+ .option('--dry-run', 'Show what would be published without publishing')
456
+ .description('Publish pack to npm registry')
457
+ .action((packPath, opts) => {
458
+ const { resolve } = require('node:path');
459
+ const { execFileSync } = require('node:child_process');
460
+ const dir = resolve(packPath);
461
+ // Validate first
462
+ const manifestPath = join(dir, 'soleri-pack.json');
463
+ if (!existsSync(manifestPath)) {
464
+ p.log.error(`No soleri-pack.json found at ${dir}`);
465
+ process.exit(1);
466
+ }
467
+ // Check for package.json (needed for npm publish)
468
+ const pkgPath = join(dir, 'package.json');
469
+ if (!existsSync(pkgPath)) {
470
+ // Auto-generate from manifest
471
+ const manifest = JSON.parse(readFileSync(manifestPath, 'utf-8'));
472
+ const pkg = {
473
+ name: manifest.id.startsWith('@') ? manifest.id : `soleri-pack-${manifest.id}`,
474
+ version: manifest.version,
475
+ description: manifest.description || '',
476
+ keywords: ['soleri', 'soleri-pack', manifest.type || 'knowledge'].filter(Boolean),
477
+ files: ['soleri-pack.json', 'vault', 'skills', 'hooks'].filter((f) => existsSync(join(dir, f))),
478
+ };
479
+ const { writeFileSync } = require('node:fs');
480
+ writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n', 'utf-8');
481
+ p.log.info('Generated package.json from manifest');
482
+ }
483
+ const s = p.spinner();
484
+ s.start(opts.dryRun ? 'Dry run...' : 'Publishing to npm...');
485
+ try {
486
+ const args = ['publish', dir, '--access', 'public'];
487
+ if (opts.dryRun)
488
+ args.push('--dry-run');
489
+ execFileSync('npm', args, { stdio: 'pipe', timeout: 60_000 });
490
+ s.stop(opts.dryRun ? 'Dry run complete' : 'Published successfully');
491
+ }
492
+ catch (err) {
493
+ s.stop('Publish failed');
494
+ p.log.error(err instanceof Error ? err.message : String(err));
495
+ process.exit(1);
496
+ }
497
+ });
498
+ }
499
+ // ─── Helpers ──────────────────────────────────────────────────────────
500
+ function listMdFiles(dir) {
501
+ try {
502
+ const { readdirSync } = require('node:fs');
503
+ const { basename } = require('node:path');
504
+ return readdirSync(dir)
505
+ .filter((f) => f.endsWith('.md'))
506
+ .map((f) => basename(f, '.md'));
507
+ }
508
+ catch {
509
+ return [];
510
+ }
511
+ }
512
+ //# sourceMappingURL=pack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pack.js","sourceRoot":"","sources":["../../src/commands/pack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Skills CLI — convenience aliases for `soleri pack --type skills`.
3
+ *
4
+ * Provides `soleri skills list|install|remove|info` as thin wrappers
5
+ * around the unified pack system.
6
+ */
7
+ import type { Command } from 'commander';
8
+ export declare function registerSkills(program: Command): void;