@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.
- package/.tsbuildinfo +1 -0
- package/commands/configure.d.ts +24 -0
- package/commands/configure.d.ts.map +1 -0
- package/commands/configure.js +170 -0
- package/commands/configure.js.map +1 -0
- package/commands/doctor.d.ts +136 -0
- package/commands/doctor.d.ts.map +1 -0
- package/commands/doctor.js +606 -0
- package/commands/doctor.js.map +1 -0
- package/commands/install.d.ts +3 -0
- package/commands/install.d.ts.map +1 -0
- package/commands/install.js +88 -0
- package/commands/install.js.map +1 -0
- package/commands/list.d.ts +3 -0
- package/commands/list.d.ts.map +1 -0
- package/commands/list.js +141 -0
- package/commands/list.js.map +1 -0
- package/commands/login.d.ts +15 -0
- package/commands/login.d.ts.map +1 -0
- package/commands/login.js +102 -0
- package/commands/login.js.map +1 -0
- package/commands/publish.d.ts +3 -0
- package/commands/publish.d.ts.map +1 -0
- package/commands/publish.js +102 -0
- package/commands/publish.js.map +1 -0
- package/commands/run.d.ts +76 -0
- package/commands/run.d.ts.map +1 -0
- package/commands/run.js +417 -0
- package/commands/run.js.map +1 -0
- package/commands/service.d.ts +29 -0
- package/commands/service.d.ts.map +1 -0
- package/commands/service.js +142 -0
- package/commands/service.js.map +1 -0
- package/commands/update.d.ts +3 -0
- package/commands/update.d.ts.map +1 -0
- package/commands/update.js +141 -0
- package/commands/update.js.map +1 -0
- package/index.d.ts +3 -0
- package/index.d.ts.map +1 -0
- package/index.js +8508 -0
- package/index.js.map +1 -0
- package/package.json +30 -0
- package/utils/agent-invoker.d.ts +393 -0
- package/utils/agent-invoker.d.ts.map +1 -0
- package/utils/agent-invoker.js +1632 -0
- package/utils/agent-invoker.js.map +1 -0
- package/utils/api-client.d.ts +54 -0
- package/utils/api-client.d.ts.map +1 -0
- package/utils/api-client.js +214 -0
- package/utils/api-client.js.map +1 -0
- package/utils/auth-client.d.ts +61 -0
- package/utils/auth-client.d.ts.map +1 -0
- package/utils/auth-client.js +135 -0
- package/utils/auth-client.js.map +1 -0
- package/utils/claude-runtime.d.ts +116 -0
- package/utils/claude-runtime.d.ts.map +1 -0
- package/utils/claude-runtime.js +291 -0
- package/utils/claude-runtime.js.map +1 -0
- package/utils/config-store.d.ts +128 -0
- package/utils/config-store.d.ts.map +1 -0
- package/utils/config-store.js +137 -0
- package/utils/config-store.js.map +1 -0
- package/utils/file-manager.d.ts +32 -0
- package/utils/file-manager.d.ts.map +1 -0
- package/utils/file-manager.js +208 -0
- package/utils/file-manager.js.map +1 -0
- package/utils/keychain.d.ts +46 -0
- package/utils/keychain.d.ts.map +1 -0
- package/utils/keychain.js +167 -0
- package/utils/keychain.js.map +1 -0
- package/utils/loopback.d.ts +45 -0
- package/utils/loopback.d.ts.map +1 -0
- package/utils/loopback.js +95 -0
- package/utils/loopback.js.map +1 -0
- package/utils/mailbox-client.d.ts +98 -0
- package/utils/mailbox-client.d.ts.map +1 -0
- package/utils/mailbox-client.js +178 -0
- package/utils/mailbox-client.js.map +1 -0
- package/utils/mcp-config-writer.d.ts +133 -0
- package/utils/mcp-config-writer.d.ts.map +1 -0
- package/utils/mcp-config-writer.js +184 -0
- package/utils/mcp-config-writer.js.map +1 -0
- package/utils/pack-bundler.d.ts +30 -0
- package/utils/pack-bundler.d.ts.map +1 -0
- package/utils/pack-bundler.js +141 -0
- package/utils/pack-bundler.js.map +1 -0
- package/utils/prompt.d.ts +31 -0
- package/utils/prompt.d.ts.map +1 -0
- package/utils/prompt.js +86 -0
- package/utils/prompt.js.map +1 -0
- package/utils/table-formatter.d.ts +42 -0
- package/utils/table-formatter.d.ts.map +1 -0
- package/utils/table-formatter.js +125 -0
- package/utils/table-formatter.js.map +1 -0
- package/utils/version-resolver.d.ts +31 -0
- package/utils/version-resolver.d.ts.map +1 -0
- package/utils/version-resolver.js +75 -0
- 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 @@
|
|
|
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"}
|
package/commands/list.js
ADDED
|
@@ -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":"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"}
|
|
@@ -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 @@
|
|
|
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"}
|