@mycompbox/compbox-cli 1.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/.tsbuildinfo +1 -0
  2. package/commands/configure.d.ts +24 -0
  3. package/commands/configure.d.ts.map +1 -0
  4. package/commands/configure.js +170 -0
  5. package/commands/configure.js.map +1 -0
  6. package/commands/doctor.d.ts +136 -0
  7. package/commands/doctor.d.ts.map +1 -0
  8. package/commands/doctor.js +606 -0
  9. package/commands/doctor.js.map +1 -0
  10. package/commands/install.d.ts +3 -0
  11. package/commands/install.d.ts.map +1 -0
  12. package/commands/install.js +88 -0
  13. package/commands/install.js.map +1 -0
  14. package/commands/list.d.ts +3 -0
  15. package/commands/list.d.ts.map +1 -0
  16. package/commands/list.js +141 -0
  17. package/commands/list.js.map +1 -0
  18. package/commands/login.d.ts +15 -0
  19. package/commands/login.d.ts.map +1 -0
  20. package/commands/login.js +102 -0
  21. package/commands/login.js.map +1 -0
  22. package/commands/publish.d.ts +3 -0
  23. package/commands/publish.d.ts.map +1 -0
  24. package/commands/publish.js +102 -0
  25. package/commands/publish.js.map +1 -0
  26. package/commands/run.d.ts +76 -0
  27. package/commands/run.d.ts.map +1 -0
  28. package/commands/run.js +417 -0
  29. package/commands/run.js.map +1 -0
  30. package/commands/service.d.ts +29 -0
  31. package/commands/service.d.ts.map +1 -0
  32. package/commands/service.js +142 -0
  33. package/commands/service.js.map +1 -0
  34. package/commands/update.d.ts +3 -0
  35. package/commands/update.d.ts.map +1 -0
  36. package/commands/update.js +141 -0
  37. package/commands/update.js.map +1 -0
  38. package/index.d.ts +3 -0
  39. package/index.d.ts.map +1 -0
  40. package/index.js +8508 -0
  41. package/index.js.map +1 -0
  42. package/package.json +30 -0
  43. package/utils/agent-invoker.d.ts +393 -0
  44. package/utils/agent-invoker.d.ts.map +1 -0
  45. package/utils/agent-invoker.js +1632 -0
  46. package/utils/agent-invoker.js.map +1 -0
  47. package/utils/api-client.d.ts +54 -0
  48. package/utils/api-client.d.ts.map +1 -0
  49. package/utils/api-client.js +214 -0
  50. package/utils/api-client.js.map +1 -0
  51. package/utils/auth-client.d.ts +61 -0
  52. package/utils/auth-client.d.ts.map +1 -0
  53. package/utils/auth-client.js +135 -0
  54. package/utils/auth-client.js.map +1 -0
  55. package/utils/claude-runtime.d.ts +116 -0
  56. package/utils/claude-runtime.d.ts.map +1 -0
  57. package/utils/claude-runtime.js +291 -0
  58. package/utils/claude-runtime.js.map +1 -0
  59. package/utils/config-store.d.ts +128 -0
  60. package/utils/config-store.d.ts.map +1 -0
  61. package/utils/config-store.js +137 -0
  62. package/utils/config-store.js.map +1 -0
  63. package/utils/file-manager.d.ts +32 -0
  64. package/utils/file-manager.d.ts.map +1 -0
  65. package/utils/file-manager.js +208 -0
  66. package/utils/file-manager.js.map +1 -0
  67. package/utils/keychain.d.ts +46 -0
  68. package/utils/keychain.d.ts.map +1 -0
  69. package/utils/keychain.js +167 -0
  70. package/utils/keychain.js.map +1 -0
  71. package/utils/loopback.d.ts +45 -0
  72. package/utils/loopback.d.ts.map +1 -0
  73. package/utils/loopback.js +95 -0
  74. package/utils/loopback.js.map +1 -0
  75. package/utils/mailbox-client.d.ts +98 -0
  76. package/utils/mailbox-client.d.ts.map +1 -0
  77. package/utils/mailbox-client.js +178 -0
  78. package/utils/mailbox-client.js.map +1 -0
  79. package/utils/mcp-config-writer.d.ts +133 -0
  80. package/utils/mcp-config-writer.d.ts.map +1 -0
  81. package/utils/mcp-config-writer.js +184 -0
  82. package/utils/mcp-config-writer.js.map +1 -0
  83. package/utils/pack-bundler.d.ts +30 -0
  84. package/utils/pack-bundler.d.ts.map +1 -0
  85. package/utils/pack-bundler.js +141 -0
  86. package/utils/pack-bundler.js.map +1 -0
  87. package/utils/prompt.d.ts +31 -0
  88. package/utils/prompt.d.ts.map +1 -0
  89. package/utils/prompt.js +86 -0
  90. package/utils/prompt.js.map +1 -0
  91. package/utils/table-formatter.d.ts +42 -0
  92. package/utils/table-formatter.d.ts.map +1 -0
  93. package/utils/table-formatter.js +125 -0
  94. package/utils/table-formatter.js.map +1 -0
  95. package/utils/version-resolver.d.ts +31 -0
  96. package/utils/version-resolver.d.ts.map +1 -0
  97. package/utils/version-resolver.js +75 -0
  98. package/utils/version-resolver.js.map +1 -0
@@ -0,0 +1,88 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { ApiClient } from '../utils/api-client.js';
5
+ import { FileManager } from '../utils/file-manager.js';
6
+ import { TableFormatter } from '../utils/table-formatter.js';
7
+ export const installCommand = new Command('install')
8
+ .description('Install a Skill Pack from the registry')
9
+ .argument('<pack-name>', 'Name of the pack to install (e.g., @mycompbox/pack-example)')
10
+ .option('-v, --version <version>', 'Specific version to install (default: latest)')
11
+ .option('--registry <url>', 'Custom registry URL')
12
+ .option('--token <token>', 'API token for authentication (or set COMPBOX_TOKEN env var)')
13
+ .action(async (packName, options) => {
14
+ const spinner = ora('Installing Skill Pack...').start();
15
+ try {
16
+ // Initialize clients
17
+ const apiClient = new ApiClient(options.registry, options.token);
18
+ const fileManager = new FileManager();
19
+ // Fetch pack manifest
20
+ spinner.text = `Fetching ${packName}...`;
21
+ const manifest = await apiClient.getPackManifest(packName, options.version);
22
+ spinner.text = `Downloading ${manifest.name}@${manifest.version}...`;
23
+ const packFiles = await apiClient.downloadPackFiles(packName, options.version);
24
+ // Clean up old files if this pack was previously installed (upgrade scenario)
25
+ const existingManifest = await fileManager.readManifest();
26
+ const existingPack = existingManifest.installedPacks[manifest.name];
27
+ if (existingPack?.files.length) {
28
+ spinner.text = 'Removing previous version files...';
29
+ await fileManager.deletePackFiles(existingPack.files);
30
+ }
31
+ // Clean up deprecated files declared by the pack (handles upgrades without prior manifest)
32
+ if (manifest.deprecatedFiles?.length) {
33
+ spinner.text = 'Removing deprecated files...';
34
+ await fileManager.deletePackFiles(manifest.deprecatedFiles);
35
+ }
36
+ // Copy files to .github directory
37
+ spinner.text = 'Installing files...';
38
+ const installedFiles = await fileManager.copyFilesToGithub(packFiles, manifest.name);
39
+ // Merge MCP configuration if present
40
+ if (manifest.mcpConfig) {
41
+ spinner.text = 'Merging MCP configuration...';
42
+ await fileManager.mergeMcpConfig(manifest.mcpConfig);
43
+ }
44
+ // Update local manifest
45
+ spinner.text = 'Updating manifest...';
46
+ await fileManager.addPackToManifest(manifest.name, manifest.version, installedFiles);
47
+ // Sync installation with registry (best-effort)
48
+ try {
49
+ spinner.text = 'Syncing with registry...';
50
+ await apiClient.recordInstallation(manifest.name, manifest.version);
51
+ }
52
+ catch (error) {
53
+ // Non-critical: local install succeeded, warn and continue
54
+ const msg = error instanceof Error ? error.message : 'Unknown error';
55
+ spinner.warn(chalk.yellow(`Registry sync failed: ${msg}`));
56
+ console.log(chalk.gray(' The pack was installed locally, but the registry may be out of sync.'));
57
+ spinner.start();
58
+ }
59
+ spinner.succeed(TableFormatter.success(`Installed ${manifest.name}@${manifest.version}`));
60
+ // Show next steps
61
+ console.log('\n' + chalk.bold('Next steps:'));
62
+ console.log(chalk.gray(' 1. Review the installed files in .github/'));
63
+ console.log(chalk.gray(' 2. Commit the changes to version control'));
64
+ console.log(chalk.gray(' 3. Use the new skills and agents in your project'));
65
+ if (manifest.mcpConfig) {
66
+ console.log(chalk.gray(' 4. MCP configuration has been updated'));
67
+ }
68
+ }
69
+ catch (error) {
70
+ spinner.fail(TableFormatter.error('Installation failed'));
71
+ if (error instanceof Error) {
72
+ console.error(chalk.red(`\nError: ${error.message}`));
73
+ // Provide helpful hints based on error type
74
+ if (error.message.includes('ENOTFOUND') || error.message.includes('ECONNREFUSED')) {
75
+ console.error(chalk.yellow('\nTip: Check your network connection and registry URL'));
76
+ }
77
+ else if (error.message.includes('404')) {
78
+ console.error(chalk.yellow('\nTip: Verify the pack name and version exist in the registry'));
79
+ console.error(chalk.gray('Run: compbox list --available'));
80
+ }
81
+ else if (error.message.includes('EACCES')) {
82
+ console.error(chalk.yellow('\nTip: Check file permissions in the .github directory'));
83
+ }
84
+ }
85
+ process.exit(1);
86
+ }
87
+ });
88
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/commands/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const listCommand: Command;
3
+ //# sourceMappingURL=list.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAepC,eAAO,MAAM,WAAW,SAyJpB,CAAC"}
@@ -0,0 +1,141 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { ApiClient } from '../utils/api-client.js';
5
+ import { FileManager } from '../utils/file-manager.js';
6
+ import { VersionResolver } from '../utils/version-resolver.js';
7
+ import { TableFormatter } from '../utils/table-formatter.js';
8
+ export const listCommand = new Command('list')
9
+ .description('List installed and available Skill Packs')
10
+ .option('--installed', 'Show only installed packs')
11
+ .option('--available', 'Show only available packs from registry')
12
+ .option('--registry <url>', 'Custom registry URL')
13
+ .option('--token <token>', 'API token for authentication (or set COMPBOX_TOKEN env var)')
14
+ .action(async (options) => {
15
+ const spinner = ora('Loading packs...').start();
16
+ try {
17
+ const apiClient = new ApiClient(options.registry, options.token);
18
+ const fileManager = new FileManager();
19
+ // Determine what to show
20
+ const showInstalled = options.installed ?? !options.available;
21
+ const showAvailable = options.available ?? !options.installed;
22
+ let installedPacks = {};
23
+ let availablePacks = [];
24
+ // Fetch installed packs
25
+ if (showInstalled) {
26
+ try {
27
+ const manifest = await fileManager.readManifest();
28
+ installedPacks = manifest.installedPacks;
29
+ }
30
+ catch {
31
+ // No manifest yet - no packs installed
32
+ }
33
+ }
34
+ // Fetch available packs from registry
35
+ if (showAvailable) {
36
+ try {
37
+ availablePacks = await apiClient.listPacks();
38
+ }
39
+ catch (error) {
40
+ spinner.warn(chalk.yellow('Could not fetch available packs from registry'));
41
+ if (error instanceof Error) {
42
+ console.error(chalk.gray(` ${error.message}`));
43
+ }
44
+ }
45
+ }
46
+ spinner.stop();
47
+ // Display results based on mode
48
+ if (options.installed) {
49
+ // Show only installed packs
50
+ if (Object.keys(installedPacks).length === 0) {
51
+ console.log(TableFormatter.warning('No packs installed'));
52
+ console.log(chalk.gray('\nInstall a pack: compbox install <pack-name>'));
53
+ return;
54
+ }
55
+ console.log(chalk.bold('\nInstalled Packs:'));
56
+ const rows = Object.entries(installedPacks).map(([name, info]) => ({
57
+ name,
58
+ version: info.version,
59
+ installedVersion: info.installedAt,
60
+ }));
61
+ console.log(TableFormatter.formatInstalledPacks(rows));
62
+ }
63
+ else if (options.available) {
64
+ // Show only available packs
65
+ if (availablePacks.length === 0) {
66
+ console.log(TableFormatter.warning('No packs available in registry'));
67
+ return;
68
+ }
69
+ console.log(chalk.bold('\nAvailable Packs:'));
70
+ const rows = availablePacks.map((pack) => ({
71
+ name: pack.name,
72
+ version: pack.latestVersion,
73
+ description: pack.description,
74
+ }));
75
+ console.log(TableFormatter.formatAvailablePacks(rows));
76
+ }
77
+ else {
78
+ // Show combined view
79
+ const combinedPacks = new Map();
80
+ // Add available packs
81
+ for (const pack of availablePacks) {
82
+ combinedPacks.set(pack.name, {
83
+ name: pack.name,
84
+ version: pack.latestVersion,
85
+ description: pack.description,
86
+ });
87
+ }
88
+ // Merge with installed packs and check for updates
89
+ for (const [name, installed] of Object.entries(installedPacks)) {
90
+ const existing = combinedPacks.get(name);
91
+ if (existing) {
92
+ // Check if update is available
93
+ const versionInfo = VersionResolver.compareVersions(installed.version, existing.version);
94
+ combinedPacks.set(name, {
95
+ ...existing,
96
+ installedVersion: installed.version,
97
+ updateAvailable: versionInfo.needsUpdate
98
+ ? existing.version
99
+ : undefined,
100
+ });
101
+ }
102
+ else {
103
+ // Pack is installed but not in registry (custom or removed)
104
+ combinedPacks.set(name, {
105
+ name,
106
+ version: installed.version,
107
+ installedVersion: installed.version,
108
+ description: 'Not in registry',
109
+ });
110
+ }
111
+ }
112
+ const rows = Array.from(combinedPacks.values()).sort((a, b) => a.name.localeCompare(b.name));
113
+ if (rows.length === 0) {
114
+ console.log(TableFormatter.warning('No packs found'));
115
+ console.log(chalk.gray('\nInstall a pack: compbox install <pack-name>'));
116
+ return;
117
+ }
118
+ console.log(chalk.bold('\nSkill Packs:'));
119
+ console.log(TableFormatter.formatCombinedPacks(rows));
120
+ // Show summary
121
+ const installedCount = Object.keys(installedPacks).length;
122
+ const availableCount = availablePacks.length;
123
+ const updatesAvailable = rows.filter((r) => r.updateAvailable).length;
124
+ console.log('');
125
+ console.log(chalk.gray(`Installed: ${String(installedCount)}`));
126
+ console.log(chalk.gray(`Available: ${String(availableCount)}`));
127
+ if (updatesAvailable > 0) {
128
+ console.log(chalk.yellow(`Updates available: ${String(updatesAvailable)}`));
129
+ console.log(chalk.gray('\nRun: compbox update --yes'));
130
+ }
131
+ }
132
+ }
133
+ catch (error) {
134
+ spinner.fail(TableFormatter.error('Failed to list packs'));
135
+ if (error instanceof Error) {
136
+ console.error(chalk.red(`\nError: ${error.message}`));
137
+ }
138
+ process.exit(1);
139
+ }
140
+ });
141
+ //# sourceMappingURL=list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/commands/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAiB,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,cAAc,EAAgB,MAAM,6BAA6B,CAAC;AAS3E,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,OAAO,CAAC,MAAM,CAAC;KAC3C,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;KAClD,MAAM,CAAC,aAAa,EAAE,yCAAyC,CAAC;KAChE,MAAM,CAAC,kBAAkB,EAAE,qBAAqB,CAAC;KACjD,MAAM,CAAC,iBAAiB,EAAE,6DAA6D,CAAC;KACxF,MAAM,CAAC,KAAK,EAAE,OAAoB,EAAE,EAAE;IACrC,MAAM,OAAO,GAAG,GAAG,CAAC,kBAAkB,CAAC,CAAC,KAAK,EAAE,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACjE,MAAM,WAAW,GAAG,IAAI,WAAW,EAAE,CAAC;QAEtC,yBAAyB;QACzB,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAC9D,MAAM,aAAa,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAE9D,IAAI,cAAc,GAA6D,EAAE,CAAC;QAClF,IAAI,cAAc,GAAe,EAAE,CAAC;QAEpC,wBAAwB;QACxB,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,YAAY,EAAE,CAAC;gBAClD,cAAc,GAAG,QAAQ,CAAC,cAAc,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC;gBACP,uCAAuC;YACzC,CAAC;QACH,CAAC;QAED,sCAAsC;QACtC,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC;gBACH,cAAc,GAAG,MAAM,SAAS,CAAC,SAAS,EAAE,CAAC;YAC/C,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,+CAA+C,CAAC,CAAC,CAAC;gBAC5E,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;oBAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,CAAC,IAAI,EAAE,CAAC;QAEf,gCAAgC;QAChC,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YACtB,4BAA4B;YAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC7C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,CAAC;gBAC1D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC,CAAC;gBACzE,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAc,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,GAAG,CACxD,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC;gBACjB,IAAI;gBACJ,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,gBAAgB,EAAE,IAAI,CAAC,WAAW;aACnC,CAAC,CACH,CAAC;YACF,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;aAAM,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;YAC7B,4BAA4B;YAC5B,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAChC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAc,cAAc,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBACpD,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,aAAa;gBAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC,CAAC,CAAC;YACJ,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC;QACzD,CAAC;aAAM,CAAC;YACN,qBAAqB;YACrB,MAAM,aAAa,GAAG,IAAI,GAAG,EAAmB,CAAC;YAEjD,sBAAsB;YACtB,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE;oBAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,OAAO,EAAE,IAAI,CAAC,aAAa;oBAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;iBAC9B,CAAC,CAAC;YACL,CAAC;YAED,mDAAmD;YACnD,KAAK,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,EAAE,CAAC;gBAC/D,MAAM,QAAQ,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,QAAQ,EAAE,CAAC;oBACb,+BAA+B;oBAC/B,MAAM,WAAW,GAAG,eAAe,CAAC,eAAe,CACjD,SAAS,CAAC,OAAO,EACjB,QAAQ,CAAC,OAAO,CACjB,CAAC;oBACF,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE;wBACtB,GAAG,QAAQ;wBACX,gBAAgB,EAAE,SAAS,CAAC,OAAO;wBACnC,eAAe,EAAE,WAAW,CAAC,WAAW;4BACtC,CAAC,CAAC,QAAQ,CAAC,OAAO;4BAClB,CAAC,CAAC,SAAS;qBACd,CAAC,CAAC;gBACL,CAAC;qBAAM,CAAC;oBACN,4DAA4D;oBAC5D,aAAa,CAAC,GAAG,CAAC,IAAI,EAAE;wBACtB,IAAI;wBACJ,OAAO,EAAE,SAAS,CAAC,OAAO;wBAC1B,gBAAgB,EAAE,SAAS,CAAC,OAAO;wBACnC,WAAW,EAAE,iBAAiB;qBAC/B,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAC5D,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAC7B,CAAC;YAEF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBACtD,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAC5D,CAAC;gBACF,OAAO;YACT,CAAC;YAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;YAC1C,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;YAEtD,eAAe;YACf,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,CAAC;YAC1D,MAAM,cAAc,GAAG,cAAc,CAAC,MAAM,CAAC;YAC7C,MAAM,gBAAgB,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC;YAEtE,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC;YAChE,IAAI,gBAAgB,GAAG,CAAC,EAAE,CAAC;gBACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC5E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;QAE3D,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * `compbox login` — authenticate the employee to central and persist pairing
3
+ * config locally.
4
+ *
5
+ * Flow:
6
+ * 1. Resolve the central API base URL (flag → existing config → prompt).
7
+ * 2. Authenticate with email + password (JWT exchange).
8
+ * 3. Mint a long-lived per-employee CompBox API token.
9
+ * 4. Persist the central URL, token, and resolved identity to
10
+ * `~/.compbox/config.json` (0600). The AI provider secret is handled
11
+ * separately by `compbox configure` and never touches this file.
12
+ */
13
+ import { Command } from 'commander';
14
+ export declare const loginCommand: Command;
15
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AA8BpC,eAAO,MAAM,YAAY,SAuFrB,CAAC"}
@@ -0,0 +1,102 @@
1
+ /**
2
+ * `compbox login` — authenticate the employee to central and persist pairing
3
+ * config locally.
4
+ *
5
+ * Flow:
6
+ * 1. Resolve the central API base URL (flag → existing config → prompt).
7
+ * 2. Authenticate with email + password (JWT exchange).
8
+ * 3. Mint a long-lived per-employee CompBox API token.
9
+ * 4. Persist the central URL, token, and resolved identity to
10
+ * `~/.compbox/config.json` (0600). The AI provider secret is handled
11
+ * separately by `compbox configure` and never touches this file.
12
+ */
13
+ import { Command } from 'commander';
14
+ import chalk from 'chalk';
15
+ import { hostname } from 'os';
16
+ import { AuthClient, AuthClientError } from '../utils/auth-client.js';
17
+ import { readConfig, updateConfig } from '../utils/config-store.js';
18
+ import { promptText, promptSecret } from '../utils/prompt.js';
19
+ import { isLoopbackUrl, LOOPBACK_NOTICE } from '../utils/loopback.js';
20
+ async function resolveBaseUrl(option) {
21
+ if (option && option.trim().length > 0) {
22
+ return option.trim();
23
+ }
24
+ const existing = readConfig().apiBaseUrl;
25
+ if (existing && existing.trim().length > 0) {
26
+ return existing.trim();
27
+ }
28
+ const entered = await promptText('Central CompBox API URL: ');
29
+ if (entered.length === 0) {
30
+ throw new Error('A central API URL is required.');
31
+ }
32
+ return entered;
33
+ }
34
+ export const loginCommand = new Command('login')
35
+ .description('Authenticate to central CompBox and store your pairing config')
36
+ .option('--url <url>', 'Central CompBox API base URL')
37
+ .option('--email <email>', 'Account email (otherwise prompted)')
38
+ .option('--password <password>', 'Account password (otherwise prompted; prefer the prompt to keep it out of shell history)')
39
+ .option('--token-name <name>', 'Name for the generated API token')
40
+ .action(async (options) => {
41
+ try {
42
+ const baseUrl = await resolveBaseUrl(options.url);
43
+ const client = new AuthClient(baseUrl);
44
+ const email = options.email && options.email.trim().length > 0
45
+ ? options.email.trim()
46
+ : await promptText('Email: ');
47
+ if (email.length === 0) {
48
+ throw new Error('Email is required.');
49
+ }
50
+ const password = options.password && options.password.length > 0
51
+ ? options.password
52
+ : await promptSecret('Password: ');
53
+ if (password.length === 0) {
54
+ throw new Error('Password is required.');
55
+ }
56
+ console.log(chalk.gray(`\nAuthenticating to ${baseUrl}...`));
57
+ const loginResult = await client.login(email, password);
58
+ const tokenName = options.tokenName && options.tokenName.trim().length > 0
59
+ ? options.tokenName.trim()
60
+ : `compbox-cli@${hostname()}`;
61
+ console.log(chalk.gray('Provisioning your per-employee API token...'));
62
+ const apiToken = await client.createApiToken(loginResult.accessToken, tokenName);
63
+ updateConfig({
64
+ apiBaseUrl: client.baseUrl,
65
+ apiToken: apiToken.token,
66
+ apiTokenId: apiToken.id,
67
+ userId: loginResult.user.id,
68
+ email: loginResult.user.email,
69
+ userName: loginResult.user.name,
70
+ });
71
+ console.log(chalk.green(`\n✔ Paired as ${loginResult.user.name} <${loginResult.user.email}>`));
72
+ console.log(chalk.gray(` Central URL: ${client.baseUrl}`));
73
+ console.log(chalk.gray(` Token: ${tokenName} (stored locally)`));
74
+ if (isLoopbackUrl(client.baseUrl)) {
75
+ // Non-blocking: localhost is a valid dev target, but make it impossible
76
+ // to silently believe this reaches the cloud central.
77
+ console.log(chalk.yellow(`\n⚠ ${LOOPBACK_NOTICE}`));
78
+ }
79
+ console.log('\n' + chalk.bold('Next step:'));
80
+ console.log(chalk.gray(' Run `compbox configure` to select your AI mode, pair this device, and write the MCP config.'));
81
+ console.log(chalk.gray(' `compbox configure` will then tell you how to start the Agent Runner service on this machine.'));
82
+ }
83
+ catch (error) {
84
+ if (error instanceof AuthClientError) {
85
+ console.error(chalk.red(`\nLogin failed: ${error.message}`));
86
+ if (error.status === 401) {
87
+ console.error(chalk.yellow('Tip: double-check your email and password.'));
88
+ }
89
+ else if (error.status === 0) {
90
+ console.error(chalk.yellow('Tip: verify the central API URL and your network connection.'));
91
+ }
92
+ }
93
+ else if (error instanceof Error) {
94
+ console.error(chalk.red(`\nLogin failed: ${error.message}`));
95
+ }
96
+ else {
97
+ console.error(chalk.red('\nLogin failed: unknown error'));
98
+ }
99
+ process.exit(1);
100
+ }
101
+ });
102
+ //# sourceMappingURL=login.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.js","sourceRoot":"","sources":["../../src/commands/login.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const publishCommand: Command;
3
+ //# sourceMappingURL=publish.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.d.ts","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,cAAc,SAuIvB,CAAC"}
@@ -0,0 +1,102 @@
1
+ import { Command } from 'commander';
2
+ import ora from 'ora';
3
+ import chalk from 'chalk';
4
+ import { ApiClient } from '../utils/api-client.js';
5
+ import { PackBundler } from '../utils/pack-bundler.js';
6
+ import { TableFormatter } from '../utils/table-formatter.js';
7
+ export const publishCommand = new Command('publish')
8
+ .description('Publish a Skill Pack to the registry')
9
+ .option('--registry <url>', 'Custom registry URL')
10
+ .option('--token <token>', 'Authentication token (or set COMPBOX_API_TOKEN env var)')
11
+ .option('--dry-run', 'Validate the pack without publishing')
12
+ .action(async (options) => {
13
+ const spinner = ora('Preparing pack for publishing...').start();
14
+ try {
15
+ const bundler = new PackBundler();
16
+ // Validate pack
17
+ spinner.text = 'Validating pack...';
18
+ const validation = await bundler.validatePack(options.dryRun);
19
+ if (!validation.valid) {
20
+ spinner.fail(TableFormatter.error('Pack validation failed'));
21
+ console.error(chalk.red('\nErrors:'));
22
+ for (const error of validation.errors) {
23
+ console.error(chalk.red(` ✗ ${error}`));
24
+ }
25
+ process.exit(1);
26
+ }
27
+ if (validation.warnings.length > 0) {
28
+ spinner.warn(chalk.yellow('Pack has warnings'));
29
+ for (const warning of validation.warnings) {
30
+ console.warn(chalk.yellow(` ⚠ ${warning}`));
31
+ }
32
+ console.log('');
33
+ }
34
+ else {
35
+ spinner.succeed(TableFormatter.success('Pack validation passed'));
36
+ }
37
+ // Bundle the pack
38
+ spinner.start('Bundling pack files...');
39
+ const bundled = await bundler.bundlePack();
40
+ if (options.dryRun) {
41
+ spinner.succeed(TableFormatter.success('Dry run complete'));
42
+ console.log(chalk.bold('\nPack contents:'));
43
+ console.log(chalk.cyan(` Name: ${bundled.manifest.name}`));
44
+ console.log(chalk.cyan(` Version: ${bundled.manifest.version}`));
45
+ console.log(chalk.cyan(` Description: ${bundled.manifest.description}`));
46
+ if (bundled.manifest.author) {
47
+ console.log(chalk.cyan(` Author: ${bundled.manifest.author}`));
48
+ }
49
+ console.log(chalk.cyan(` Files: ${String(Object.keys(bundled.files).length)}`));
50
+ console.log(chalk.bold('\nFile list:'));
51
+ for (const filePath of Object.keys(bundled.files)) {
52
+ console.log(chalk.gray(` - ${filePath}`));
53
+ }
54
+ console.log(chalk.green('\n✓ Pack is ready to publish. Remove --dry-run to upload.'));
55
+ return;
56
+ }
57
+ // Get authentication token
58
+ const token = options.token ?? process.env.COMPBOX_API_TOKEN;
59
+ if (!token) {
60
+ spinner.fail(TableFormatter.error('Authentication required'));
61
+ console.error(chalk.red('\nError: No authentication token provided. Use --token or set COMPBOX_API_TOKEN env var.'));
62
+ process.exit(1);
63
+ }
64
+ // Publish to registry
65
+ spinner.start(`Publishing ${bundled.manifest.name}@${bundled.manifest.version}...`);
66
+ const apiClient = new ApiClient(options.registry);
67
+ // Resolve pack UUID (POST routes require UUID, not scoped names)
68
+ spinner.text = `Resolving pack ${bundled.manifest.name}...`;
69
+ const packId = await apiClient.getPackId(bundled.manifest.name);
70
+ // Step 1: Publish version with manifest
71
+ spinner.text = `Publishing version ${bundled.manifest.version}...`;
72
+ await apiClient.publishVersion(packId, bundled.manifest.version, bundled.manifest, token);
73
+ // Step 2: Upload files
74
+ const fileEntries = Object.entries(bundled.files).map(([filePath, content]) => ({
75
+ path: filePath,
76
+ content,
77
+ }));
78
+ spinner.text = `Uploading ${String(fileEntries.length)} files...`;
79
+ await apiClient.uploadFiles(packId, bundled.manifest.version, fileEntries, token);
80
+ spinner.succeed(TableFormatter.success(`Published ${bundled.manifest.name}@${bundled.manifest.version}`));
81
+ console.log(chalk.bold('\nInstall with:'));
82
+ console.log(chalk.cyan(` compbox install ${bundled.manifest.name}`));
83
+ }
84
+ catch (error) {
85
+ spinner.fail(TableFormatter.error('Publish failed'));
86
+ if (error instanceof Error) {
87
+ console.error(chalk.red(`\nError: ${error.message}`));
88
+ // Provide helpful hints
89
+ if (error.message.includes('401') || error.message.includes('Unauthorized')) {
90
+ console.error(chalk.yellow('\nTip: Check your authentication token is valid'));
91
+ }
92
+ else if (error.message.includes('409') || error.message.includes('already exists')) {
93
+ console.error(chalk.yellow('\nTip: Version already published. Bump the version in .compbox/pack.json'));
94
+ }
95
+ else if (error.message.includes('ENOENT')) {
96
+ console.error(chalk.yellow('\nTip: Make sure .compbox/pack.json exists with valid file references'));
97
+ }
98
+ }
99
+ process.exit(1);
100
+ }
101
+ });
102
+ //# sourceMappingURL=publish.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"publish.js","sourceRoot":"","sources":["../../src/commands/publish.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * `compbox run` — the Agent Runner daemon (ENG-E23 / ENG-122).
3
+ *
4
+ * Long-polls central for the next job assigned to this machine, claims it,
5
+ * and dispatches by type. This command IS the process a service supervisor
6
+ * (launchd / systemd via `brew services`, or a Windows Service) keeps alive —
7
+ * see the ENG-122 distribution decision (Homebrew tap + PowerShell installer,
8
+ * no hand-rolled installer).
9
+ *
10
+ * Scope note (ENG-122-1/2/4, honestly reflecting what's implemented): the
11
+ * poll/claim/dispatch/heartbeat/reconnect mechanics are complete. Real agent
12
+ * invocation is implemented for `job.type: epic_request` under BOTH
13
+ * `agentMode: api-key` (Anthropic Messages API directly) and
14
+ * `agentMode: claude-subscription` (shells out to the local `claude` CLI,
15
+ * using whichever account is logged in — personal Pro/Max or a Team seat) —
16
+ * see agent-invoker.ts. `start_execution` jobs still fall back to the honest
17
+ * "not implemented" completion below rather than faking anything — nobody
18
+ * is ever left staring at a silent "awaiting_input" forever; the browser's
19
+ * ENG-123-2 failure banner surfaces the reason.
20
+ */
21
+ import { Command } from 'commander';
22
+ import { type StartExecutionPayload } from '@mycompbox/shared';
23
+ import { MailboxClient } from '../utils/mailbox-client.js';
24
+ import { type AgentRuntimeProbe } from '../utils/claude-runtime.js';
25
+ /**
26
+ * Whether the agent-runtime heartbeat is due. Driven SOLELY by when the runtime
27
+ * status was last *sent* (`lastRuntimeSentMs`), never by next-job activity — this
28
+ * is the invariant whose violation (gating on a timer that next-job reset every
29
+ * ~25s) previously starved the 60s heartbeat so the status was never transmitted
30
+ * and machines showed "agent runtime not found" despite being able to run jobs.
31
+ * `lastRuntimeSentMs === 0` (nothing sent yet) is always due.
32
+ */
33
+ export declare function runtimeHeartbeatDue(nowMs: number, lastRuntimeSentMs: number, intervalMs?: number): boolean;
34
+ /**
35
+ * Runs the agent-runtime probe (ENG-136), swallowing ANY error: a probe must
36
+ * never stop the daemon loop or block job dispatch. `probeAgentRuntime` is
37
+ * contractually non-rejecting, but we defend against it anyway — on a thrown
38
+ * error we log a gray warning and return `previous` (the last known-good probe,
39
+ * or `undefined` at startup) so the daemon keeps reporting the most recent
40
+ * status rather than dropping it.
41
+ *
42
+ * Extracted (and exported) as a pure-ish, dependency-injectable unit so the
43
+ * error-swallowing behavior is testable without spawning a real `claude`.
44
+ */
45
+ export declare function safeProbeAgentRuntime(probe: () => Promise<AgentRuntimeProbe>, previous: AgentRuntimeProbe | undefined, log?: (message: string) => void): Promise<AgentRuntimeProbe | undefined>;
46
+ /**
47
+ * One idle-heartbeat cycle (ENG-136): refresh the cached runtime probe (errors
48
+ * swallowed by {@link safeProbeAgentRuntime}) and send an explicit heartbeat
49
+ * carrying the latest known runtime status. The heartbeat POST body is the SOLE
50
+ * ingestion channel for runtime status — next-job is a GET and cannot carry it
51
+ * (architect correction H3).
52
+ *
53
+ * Heartbeat failure is best-effort (swallowed) — the next successful next-job
54
+ * call heartbeats server-side anyway. Returns `{ runtime, sent }` so the caller
55
+ * updates its cache regardless, but only advances its heartbeat clock when the
56
+ * ping actually landed.
57
+ */
58
+ export declare function runHeartbeatCycle(deps: {
59
+ client: Pick<MailboxClient, 'heartbeat'>;
60
+ machineToken: string;
61
+ probe: () => Promise<AgentRuntimeProbe>;
62
+ previous: AgentRuntimeProbe | undefined;
63
+ log?: (message: string) => void;
64
+ }): Promise<{
65
+ runtime: AgentRuntimeProbe | undefined;
66
+ sent: boolean;
67
+ }>;
68
+ /**
69
+ * Parse a claimed job's `payload` into a {@link StartExecutionPayload}, or null
70
+ * if malformed. The mailbox delivers `payload` as `unknown` — already an object
71
+ * in the common case (the API deserializes the stored JSON string, matching how
72
+ * `parseSeedPayload` treats it), but tolerant of a raw JSON string too.
73
+ */
74
+ export declare function parseStartExecutionPayload(payload: unknown): StartExecutionPayload | null;
75
+ export declare const runCommand: Command;
76
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/commands/run.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAMtF,OAAO,EACL,aAAa,EAGd,MAAM,4BAA4B,CAAC;AAQpC,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,4BAA4B,CAAC;AA4BpC;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,iBAAiB,EAAE,MAAM,EACzB,UAAU,GAAE,MAA8B,GACzC,OAAO,CAET;AAUD;;;;;;;;;;GAUG;AACH,wBAAsB,qBAAqB,CACzC,KAAK,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,EACvC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,EACvC,GAAG,GAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAA8C,GACvE,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAQxC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE;IAC5C,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,EAAE,MAAM,OAAO,CAAC,iBAAiB,CAAC,CAAC;IACxC,QAAQ,EAAE,iBAAiB,GAAG,SAAS,CAAC;IACxC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CACjC,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC,CASrE;AAaD;;;;;GAKG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,OAAO,GAAG,qBAAqB,GAAG,IAAI,CAmBzF;AA0LD,eAAO,MAAM,UAAU,SA+KnB,CAAC"}