@cliangdev/conductor 0.1.2

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 (130) hide show
  1. package/README.md +141 -0
  2. package/assets/claude/agents/researcher.md +147 -0
  3. package/assets/claude/commands/conductor/implement.md +393 -0
  4. package/assets/claude/commands/conductor/prd.md +291 -0
  5. package/assets/claude/skills/conductor-coder/SKILL.md +214 -0
  6. package/assets/claude/skills/ux-ui-design/SKILL.md +346 -0
  7. package/assets/claude/skills/ux-ui-design/references/design-tokens.md +359 -0
  8. package/dist/commands/config.d.ts +3 -0
  9. package/dist/commands/config.d.ts.map +1 -0
  10. package/dist/commands/config.js +106 -0
  11. package/dist/commands/config.js.map +1 -0
  12. package/dist/commands/dashboard.d.ts +9 -0
  13. package/dist/commands/dashboard.d.ts.map +1 -0
  14. package/dist/commands/dashboard.js +159 -0
  15. package/dist/commands/dashboard.js.map +1 -0
  16. package/dist/commands/doctor.d.ts +6 -0
  17. package/dist/commands/doctor.d.ts.map +1 -0
  18. package/dist/commands/doctor.js +126 -0
  19. package/dist/commands/doctor.js.map +1 -0
  20. package/dist/commands/init.d.ts +19 -0
  21. package/dist/commands/init.d.ts.map +1 -0
  22. package/dist/commands/init.js +276 -0
  23. package/dist/commands/init.js.map +1 -0
  24. package/dist/commands/login.d.ts +3 -0
  25. package/dist/commands/login.d.ts.map +1 -0
  26. package/dist/commands/login.js +161 -0
  27. package/dist/commands/login.js.map +1 -0
  28. package/dist/commands/logout.d.ts +3 -0
  29. package/dist/commands/logout.d.ts.map +1 -0
  30. package/dist/commands/logout.js +14 -0
  31. package/dist/commands/logout.js.map +1 -0
  32. package/dist/commands/mcp.d.ts +3 -0
  33. package/dist/commands/mcp.d.ts.map +1 -0
  34. package/dist/commands/mcp.js +10 -0
  35. package/dist/commands/mcp.js.map +1 -0
  36. package/dist/commands/start.d.ts +7 -0
  37. package/dist/commands/start.d.ts.map +1 -0
  38. package/dist/commands/start.js +74 -0
  39. package/dist/commands/start.js.map +1 -0
  40. package/dist/commands/status.d.ts +9 -0
  41. package/dist/commands/status.d.ts.map +1 -0
  42. package/dist/commands/status.js +126 -0
  43. package/dist/commands/status.js.map +1 -0
  44. package/dist/commands/stop.d.ts +4 -0
  45. package/dist/commands/stop.d.ts.map +1 -0
  46. package/dist/commands/stop.js +30 -0
  47. package/dist/commands/stop.js.map +1 -0
  48. package/dist/daemon/poller.d.ts +18 -0
  49. package/dist/daemon/poller.d.ts.map +1 -0
  50. package/dist/daemon/poller.js +96 -0
  51. package/dist/daemon/poller.js.map +1 -0
  52. package/dist/daemon/run-lifecycle.d.ts +21 -0
  53. package/dist/daemon/run-lifecycle.d.ts.map +1 -0
  54. package/dist/daemon/run-lifecycle.js +53 -0
  55. package/dist/daemon/run-lifecycle.js.map +1 -0
  56. package/dist/daemon/run-queue.d.ts +12 -0
  57. package/dist/daemon/run-queue.d.ts.map +1 -0
  58. package/dist/daemon/run-queue.js +59 -0
  59. package/dist/daemon/run-queue.js.map +1 -0
  60. package/dist/daemon/runner.d.ts +31 -0
  61. package/dist/daemon/runner.d.ts.map +1 -0
  62. package/dist/daemon/runner.js +91 -0
  63. package/dist/daemon/runner.js.map +1 -0
  64. package/dist/daemon/state.d.ts +22 -0
  65. package/dist/daemon/state.d.ts.map +1 -0
  66. package/dist/daemon/state.js +29 -0
  67. package/dist/daemon/state.js.map +1 -0
  68. package/dist/daemon/watcher.d.ts +26 -0
  69. package/dist/daemon/watcher.d.ts.map +1 -0
  70. package/dist/daemon/watcher.js +330 -0
  71. package/dist/daemon/watcher.js.map +1 -0
  72. package/dist/index.d.ts +3 -0
  73. package/dist/index.d.ts.map +1 -0
  74. package/dist/index.js +44 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/lib/api.d.ts +8 -0
  77. package/dist/lib/api.d.ts.map +1 -0
  78. package/dist/lib/api.js +55 -0
  79. package/dist/lib/api.js.map +1 -0
  80. package/dist/lib/config.d.ts +16 -0
  81. package/dist/lib/config.d.ts.map +1 -0
  82. package/dist/lib/config.js +48 -0
  83. package/dist/lib/config.js.map +1 -0
  84. package/dist/lib/next-steps.d.ts +2 -0
  85. package/dist/lib/next-steps.d.ts.map +1 -0
  86. package/dist/lib/next-steps.js +11 -0
  87. package/dist/lib/next-steps.js.map +1 -0
  88. package/dist/lib/oauth-server.d.ts +10 -0
  89. package/dist/lib/oauth-server.d.ts.map +1 -0
  90. package/dist/lib/oauth-server.js +67 -0
  91. package/dist/lib/oauth-server.js.map +1 -0
  92. package/dist/lib/plugin-assets.d.ts +19 -0
  93. package/dist/lib/plugin-assets.d.ts.map +1 -0
  94. package/dist/lib/plugin-assets.js +121 -0
  95. package/dist/lib/plugin-assets.js.map +1 -0
  96. package/dist/mcp/api.d.ts +7 -0
  97. package/dist/mcp/api.d.ts.map +1 -0
  98. package/dist/mcp/api.js +36 -0
  99. package/dist/mcp/api.js.map +1 -0
  100. package/dist/mcp/config.d.ts +11 -0
  101. package/dist/mcp/config.d.ts.map +1 -0
  102. package/dist/mcp/config.js +31 -0
  103. package/dist/mcp/config.js.map +1 -0
  104. package/dist/mcp/files.d.ts +9 -0
  105. package/dist/mcp/files.d.ts.map +1 -0
  106. package/dist/mcp/files.js +43 -0
  107. package/dist/mcp/files.js.map +1 -0
  108. package/dist/mcp/index.d.ts +3 -0
  109. package/dist/mcp/index.d.ts.map +1 -0
  110. package/dist/mcp/index.js +234 -0
  111. package/dist/mcp/index.js.map +1 -0
  112. package/dist/mcp/queue.d.ts +8 -0
  113. package/dist/mcp/queue.d.ts.map +1 -0
  114. package/dist/mcp/queue.js +19 -0
  115. package/dist/mcp/queue.js.map +1 -0
  116. package/dist/mcp/tools/comments.d.ts +6 -0
  117. package/dist/mcp/tools/comments.d.ts.map +1 -0
  118. package/dist/mcp/tools/comments.js +21 -0
  119. package/dist/mcp/tools/comments.js.map +1 -0
  120. package/dist/mcp/tools/documents.d.ts +11 -0
  121. package/dist/mcp/tools/documents.d.ts.map +1 -0
  122. package/dist/mcp/tools/documents.js +44 -0
  123. package/dist/mcp/tools/documents.js.map +1 -0
  124. package/dist/mcp/tools/issues.d.ts +23 -0
  125. package/dist/mcp/tools/issues.d.ts.map +1 -0
  126. package/dist/mcp/tools/issues.js +141 -0
  127. package/dist/mcp/tools/issues.js.map +1 -0
  128. package/package.json +40 -0
  129. package/scripts/postinstall.js +81 -0
  130. package/scripts/preuninstall.js +175 -0
@@ -0,0 +1,106 @@
1
+ import { readConfig, writeConfig } from '../lib/config.js';
2
+ const PRESETS = {
3
+ prod: {
4
+ apiUrl: 'https://conductor-backend-199707291514.us-central1.run.app',
5
+ frontendUrl: 'https://conductor-frontend-199707291514.us-central1.run.app',
6
+ },
7
+ };
8
+ function redactApiKey(apiKey) {
9
+ if (apiKey.length <= 8)
10
+ return '***';
11
+ return `${apiKey.slice(0, 4)}...${apiKey.slice(-4)}`;
12
+ }
13
+ export function registerConfig(program) {
14
+ const config = program
15
+ .command('config')
16
+ .description('Manage CLI configuration')
17
+ .addHelpText('after', `
18
+ Examples:
19
+ conductor config show
20
+ conductor config show --json
21
+ conductor config use prod
22
+ conductor config set-url https://my-backend.example.com`);
23
+ config
24
+ .command('show')
25
+ .description('Display current configuration')
26
+ .option('--json', 'Output config as JSON (apiKey is redacted)')
27
+ .addHelpText('after', `
28
+ Examples:
29
+ conductor config show
30
+ conductor config show --json`)
31
+ .action((options) => {
32
+ const cfg = readConfig();
33
+ if (!cfg) {
34
+ console.error('No config found — run conductor login first');
35
+ process.exit(1);
36
+ return;
37
+ }
38
+ if (options.json) {
39
+ const output = {
40
+ apiUrl: cfg.apiUrl,
41
+ frontendUrl: cfg.frontendUrl,
42
+ projectId: cfg.projectId,
43
+ projectName: cfg.projectName,
44
+ email: cfg.email,
45
+ apiKey: redactApiKey(cfg.apiKey),
46
+ };
47
+ process.stdout.write(JSON.stringify(output, null, 2) + '\n');
48
+ process.exit(0);
49
+ return;
50
+ }
51
+ console.log(`apiUrl: ${cfg.apiUrl}`);
52
+ console.log(`projectId: ${cfg.projectId}`);
53
+ console.log(`projectName: ${cfg.projectName}`);
54
+ console.log(`email: ${cfg.email}`);
55
+ console.log(`apiKey: ${redactApiKey(cfg.apiKey)}`);
56
+ });
57
+ config
58
+ .command('use <env>')
59
+ .description('Switch to a named environment (prod)')
60
+ .addHelpText('after', `
61
+ Examples:
62
+ conductor config use prod`)
63
+ .action((env) => {
64
+ const preset = PRESETS[env];
65
+ if (!preset) {
66
+ console.error(`Unknown environment: ${env}. Available: ${Object.keys(PRESETS).join(', ')}`);
67
+ process.exit(1);
68
+ return;
69
+ }
70
+ const existing = readConfig();
71
+ const cfg = existing ?? { apiKey: '', projectId: '', projectName: '', email: '', apiUrl: '', frontendUrl: '' };
72
+ cfg.apiUrl = preset.apiUrl;
73
+ cfg.frontendUrl = preset.frontendUrl;
74
+ writeConfig(cfg);
75
+ console.log(`Switched to ${env}:`);
76
+ console.log(` backend: ${preset.apiUrl}`);
77
+ console.log(` frontend: ${preset.frontendUrl}`);
78
+ if (!existing) {
79
+ console.log(`\nRun conductor login to authenticate.`);
80
+ }
81
+ });
82
+ config
83
+ .command('set-url <url>')
84
+ .description('Update the API URL')
85
+ .addHelpText('after', `
86
+ Examples:
87
+ conductor config set-url https://conductor-backend-199707291514.us-central1.run.app
88
+ conductor config set-url http://localhost:8080`)
89
+ .action((url) => {
90
+ if (!url.startsWith('http://') && !url.startsWith('https://')) {
91
+ console.error('Invalid URL: must start with http:// or https://');
92
+ process.exit(2);
93
+ return;
94
+ }
95
+ const cfg = readConfig();
96
+ if (!cfg) {
97
+ console.error('No config found — run conductor login first');
98
+ process.exit(1);
99
+ return;
100
+ }
101
+ cfg.apiUrl = url;
102
+ writeConfig(cfg);
103
+ console.log(`API URL updated to: ${url}`);
104
+ });
105
+ }
106
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/commands/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import { Command } from 'commander';
2
+ export declare function visLen(s: string): number;
3
+ export declare function rpad(colored: string, width: number): string;
4
+ export declare function formatUptime(startedAt: string): string;
5
+ export declare function formatRunDuration(startedAt: string): string;
6
+ export declare function truncate(str: string, len: number): string;
7
+ export declare function buildLines(isLive: boolean): string[];
8
+ export declare function registerDashboard(program: Command): void;
9
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AASnC,wBAAgB,MAAM,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAExC;AAED,wBAAgB,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAE3D;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAWtD;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGzD;AAQD,wBAAgB,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,EAAE,CAyFpD;AAgBD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0BxD"}
@@ -0,0 +1,159 @@
1
+ import chalk from 'chalk';
2
+ import { readDaemonState } from '../daemon/state.js';
3
+ import { isDaemonRunning, getQueueCount, formatRelativeTime } from './status.js';
4
+ import { readConfig } from '../lib/config.js';
5
+ const REFRESH_INTERVAL_MS = 5000;
6
+ const ANSI_RE = /\x1B\[[0-9;]*m/g;
7
+ export function visLen(s) {
8
+ return s.replace(ANSI_RE, '').length;
9
+ }
10
+ export function rpad(colored, width) {
11
+ return colored + ' '.repeat(Math.max(0, width - visLen(colored)));
12
+ }
13
+ export function formatUptime(startedAt) {
14
+ const diffMs = Date.now() - new Date(startedAt).getTime();
15
+ const diffSec = Math.floor(diffMs / 1000);
16
+ if (diffSec < 3600) {
17
+ const m = Math.floor(diffSec / 60);
18
+ const s = diffSec % 60;
19
+ return `${m}m ${s}s`;
20
+ }
21
+ const h = Math.floor(diffSec / 3600);
22
+ const m = Math.floor((diffSec % 3600) / 60);
23
+ return `${h}h ${m}m`;
24
+ }
25
+ export function formatRunDuration(startedAt) {
26
+ const diffMs = Date.now() - new Date(startedAt).getTime();
27
+ const diffSec = Math.floor(diffMs / 1000);
28
+ if (diffSec < 60)
29
+ return `${diffSec}s`;
30
+ if (diffSec < 3600)
31
+ return `${Math.floor(diffSec / 60)}m ${diffSec % 60}s`;
32
+ return `${Math.floor(diffSec / 3600)}h ${Math.floor((diffSec % 3600) / 60)}m`;
33
+ }
34
+ export function truncate(str, len) {
35
+ if (str.length <= len)
36
+ return str;
37
+ return str.slice(0, len - 1) + '…';
38
+ }
39
+ // Two-column row: left is padded to COL1 visible chars, right follows
40
+ const COL1 = 42;
41
+ function twoCol(left, right = '') {
42
+ return ' ' + rpad(left, COL1) + right;
43
+ }
44
+ export function buildLines(isLive) {
45
+ const config = readConfig();
46
+ const daemonRunning = isDaemonRunning();
47
+ const queueCount = getQueueCount();
48
+ const state = daemonRunning ? readDaemonState() : null;
49
+ const lines = [];
50
+ // ── Header ──────────────────────────────────────────────────────────────────
51
+ const projectPart = config
52
+ ? `${chalk.bold(config.projectName)} · ${chalk.gray(config.email)}`
53
+ : chalk.gray('not configured — run conductor init');
54
+ lines.push(`${chalk.bold('conductor')} · ${projectPart}`);
55
+ lines.push('');
56
+ if (!daemonRunning) {
57
+ // ── Not running ───────────────────────────────────────────────────────────
58
+ lines.push('');
59
+ lines.push(` ${chalk.bold('DAEMON')}`);
60
+ lines.push(` ${'─'.repeat(28)}`);
61
+ lines.push(` Status ${chalk.red('○ not running')}`);
62
+ lines.push('');
63
+ lines.push(` Run ${chalk.cyan('conductor start')} to begin syncing.`);
64
+ lines.push('');
65
+ }
66
+ else {
67
+ // ── DAEMON + SYNC QUEUE (two-column) ─────────────────────────────────────
68
+ lines.push('');
69
+ lines.push(twoCol(chalk.bold('DAEMON'), chalk.bold('SYNC QUEUE')));
70
+ lines.push(twoCol('─'.repeat(28), '─'.repeat(22)));
71
+ const statusLeft = `Status ${chalk.green('● running')}`;
72
+ const queueRight = `Pending ${queueCount > 0 ? chalk.yellow(String(queueCount)) : chalk.gray('0')} items`;
73
+ lines.push(twoCol(statusLeft, queueRight));
74
+ if (state) {
75
+ lines.push(twoCol(`PID ${chalk.white(String(state.pid))}`));
76
+ lines.push(twoCol(`Uptime ${chalk.white(formatUptime(state.startedAt))}`));
77
+ }
78
+ else {
79
+ lines.push(twoCol(`PID ${chalk.gray('unknown')}`));
80
+ }
81
+ lines.push('');
82
+ lines.push('');
83
+ // ── POLL ─────────────────────────────────────────────────────────────────
84
+ if (state) {
85
+ const pollInterval = state.pollMode === 'active' ? '5s' : '60s';
86
+ const lastPoll = state.lastPollAt ? formatRelativeTime(state.lastPollAt) : 'never';
87
+ lines.push(` ${chalk.bold('POLL')}`);
88
+ lines.push(` ${'─'.repeat(28)}`);
89
+ lines.push(` Mode ${chalk.white(`${state.pollMode} (${pollInterval} interval)`)}`);
90
+ lines.push(` Last ${chalk.white(lastPoll)}`);
91
+ lines.push(` Events ${chalk.white(`${state.eventsThisSession} this session`)}`);
92
+ lines.push(` Errors ${state.consecutiveErrors > 0 ? chalk.red(`${state.consecutiveErrors} consecutive`) : chalk.gray('0 consecutive')}`);
93
+ lines.push('');
94
+ lines.push('');
95
+ }
96
+ // ── WORKFLOW RUNS ────────────────────────────────────────────────────────
97
+ lines.push(` ${chalk.bold('WORKFLOW RUNS')}`);
98
+ lines.push(` ${'─'.repeat(60)}`);
99
+ const runs = state?.activeRuns ?? [];
100
+ if (runs.length === 0) {
101
+ lines.push(` ${chalk.gray('No active runs')}`);
102
+ }
103
+ else {
104
+ const ID_W = 10, TITLE_W = 30, STATUS_W = 12;
105
+ lines.push(` ${chalk.dim(rpad('RUN ID', ID_W))} ${chalk.dim(rpad('ISSUE TITLE', TITLE_W))} ${chalk.dim(rpad('STATUS', STATUS_W))} ${chalk.dim('DURATION')}`);
106
+ for (const run of runs) {
107
+ const runId = rpad(run.runId.slice(0, 8), ID_W);
108
+ const title = rpad(truncate(run.issueTitle, TITLE_W), TITLE_W);
109
+ const statusStr = run.status === 'completed' ? chalk.green(rpad('✓ done', STATUS_W))
110
+ : run.status === 'failed' ? chalk.red(rpad('✗ failed', STATUS_W))
111
+ : chalk.yellow(rpad('● running', STATUS_W));
112
+ const duration = formatRunDuration(run.startedAt);
113
+ lines.push(` ${runId} ${title} ${statusStr} ${duration}`);
114
+ }
115
+ }
116
+ lines.push('');
117
+ }
118
+ // ── Footer ────────────────────────────────────────────────────────────────
119
+ if (isLive) {
120
+ const now = new Date().toLocaleTimeString();
121
+ lines.push(`${'─'.repeat(46)} ${chalk.gray(now)} ${chalk.dim('Ctrl+C to exit')}`);
122
+ }
123
+ return lines;
124
+ }
125
+ let lastLineCount = 0;
126
+ function render(isLive) {
127
+ const lines = buildLines(isLive);
128
+ if (lastLineCount > 0 && isLive) {
129
+ // Move cursor up to start of last render, erase to end — no flicker
130
+ process.stdout.write(`\x1B[${lastLineCount}A\x1B[0J`);
131
+ }
132
+ process.stdout.write(lines.join('\n') + '\n');
133
+ lastLineCount = lines.length;
134
+ }
135
+ export function registerDashboard(program) {
136
+ program
137
+ .command('dashboard')
138
+ .description('Show Conductor status (live in terminal, one-shot when piped)')
139
+ .addHelpText('after', `
140
+ Examples:
141
+ conductor dashboard
142
+ conductor dashboard | cat`)
143
+ .action(() => {
144
+ const isLive = Boolean(process.stdout.isTTY);
145
+ if (isLive) {
146
+ process.stdout.write('\x1B[?25l'); // hide cursor
147
+ const cleanup = () => {
148
+ process.stdout.write('\x1B[?25h'); // restore cursor
149
+ process.exit(0);
150
+ };
151
+ process.on('SIGINT', cleanup);
152
+ }
153
+ render(isLive);
154
+ if (isLive) {
155
+ setInterval(() => render(isLive), REFRESH_INTERVAL_MS);
156
+ }
157
+ });
158
+ }
159
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { Command } from 'commander';
2
+ export declare function checkApiHealth(apiUrl: string): Promise<boolean>;
3
+ export declare function checkMcpJson(workingDir: string): boolean;
4
+ export declare function checkConfigFile(): boolean;
5
+ export declare function registerDoctor(program: Command): void;
6
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAMnC,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAOrE;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+GrD"}
@@ -0,0 +1,126 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ import chalk from 'chalk';
5
+ import { readConfig, CONFIG_PATH } from '../lib/config.js';
6
+ import { getAssetSrcDir, getPluginInstallStatus } from '../lib/plugin-assets.js';
7
+ import { printNextSteps } from '../lib/next-steps.js';
8
+ export async function checkApiHealth(apiUrl) {
9
+ try {
10
+ const response = await fetch(`${apiUrl}/api/v1/health`);
11
+ return response.ok;
12
+ }
13
+ catch {
14
+ return false;
15
+ }
16
+ }
17
+ export function checkMcpJson(workingDir) {
18
+ return fs.existsSync(path.join(workingDir, '.mcp.json'));
19
+ }
20
+ export function checkConfigFile() {
21
+ return fs.existsSync(CONFIG_PATH);
22
+ }
23
+ export function registerDoctor(program) {
24
+ program
25
+ .command('doctor')
26
+ .description('Run health checks on your Conductor setup')
27
+ .option('--json', 'Output results as JSON')
28
+ .addHelpText('after', `
29
+ Examples:
30
+ conductor doctor
31
+ conductor doctor --json`)
32
+ .action(async (options) => {
33
+ if (options.json) {
34
+ const checks = [];
35
+ const configExists = checkConfigFile();
36
+ checks.push({
37
+ name: 'config',
38
+ status: configExists ? 'pass' : 'fail',
39
+ message: configExists ? 'Config file found (~/.conductor/config.json)' : 'Config file not found — run conductor login',
40
+ });
41
+ const config = readConfig();
42
+ if (config) {
43
+ const apiReachable = await checkApiHealth(config.apiUrl);
44
+ checks.push({
45
+ name: 'api',
46
+ status: apiReachable ? 'pass' : 'fail',
47
+ message: apiReachable ? `API reachable (GET /api/v1/health → 200)` : 'API not reachable',
48
+ });
49
+ }
50
+ else {
51
+ checks.push({
52
+ name: 'api',
53
+ status: 'fail',
54
+ message: 'API reachable (no config — skipped)',
55
+ });
56
+ }
57
+ const mcpExists = checkMcpJson(process.cwd());
58
+ checks.push({
59
+ name: 'mcp',
60
+ status: mcpExists ? 'pass' : 'fail',
61
+ message: mcpExists ? '.mcp.json found in current directory' : '.mcp.json not found in current directory',
62
+ });
63
+ const globalClaudeDir = path.join(os.homedir(), '.claude');
64
+ const localClaudeDir = path.join(process.cwd(), '.claude');
65
+ const { location, outdated } = getPluginInstallStatus(getAssetSrcDir(), globalClaudeDir, localClaudeDir);
66
+ if (location === 'none') {
67
+ checks.push({ name: 'plugin', status: 'fail', message: 'Claude plugin not installed — run conductor init' });
68
+ }
69
+ else {
70
+ checks.push({ name: 'plugin', status: 'pass', message: `Claude plugin installed (${location})` });
71
+ }
72
+ if (location !== 'none' && outdated) {
73
+ checks.push({ name: 'plugin-version', status: 'warn', message: 'Claude plugin outdated — re-run conductor init to update' });
74
+ }
75
+ const allPass = checks.every(c => c.status !== 'fail');
76
+ process.stdout.write(JSON.stringify({ checks }, null, 2) + '\n');
77
+ process.exit(allPass ? 0 : 1);
78
+ return;
79
+ }
80
+ let failures = 0;
81
+ let warnings = 0;
82
+ const configExists = checkConfigFile();
83
+ const configMark = configExists ? chalk.green('✓') : chalk.red('✗');
84
+ console.log(`${configMark} Config file found (~/.conductor/config.json)`);
85
+ if (!configExists)
86
+ failures++;
87
+ const config = readConfig();
88
+ if (config) {
89
+ const apiReachable = await checkApiHealth(config.apiUrl);
90
+ const apiMark = apiReachable ? chalk.green('✓') : chalk.red('✗');
91
+ console.log(`${apiMark} API reachable (GET /api/v1/health → ${apiReachable ? '200' : 'failed'})`);
92
+ if (!apiReachable)
93
+ failures++;
94
+ }
95
+ else {
96
+ console.log(`${chalk.red('✗')} API reachable (no config — skipped)`);
97
+ failures++;
98
+ }
99
+ const mcpExists = checkMcpJson(process.cwd());
100
+ const mcpMark = mcpExists ? chalk.green('✓') : chalk.red('✗');
101
+ console.log(`${mcpMark} .mcp.json ${mcpExists ? 'found' : 'not found'} in current directory`);
102
+ if (!mcpExists)
103
+ failures++;
104
+ const globalClaudeDir = path.join(os.homedir(), '.claude');
105
+ const localClaudeDir = path.join(process.cwd(), '.claude');
106
+ const { location, outdated } = getPluginInstallStatus(getAssetSrcDir(), globalClaudeDir, localClaudeDir);
107
+ if (location === 'global') {
108
+ console.log(`${chalk.green('✓')} Claude plugin: global`);
109
+ }
110
+ else if (location === 'local') {
111
+ console.log(`${chalk.green('✓')} Claude plugin: local`);
112
+ }
113
+ else {
114
+ console.log(`${chalk.red('✗')} Claude plugin: not installed — run conductor init`);
115
+ failures++;
116
+ }
117
+ if (location !== 'none' && outdated) {
118
+ console.log(`${chalk.yellow('⚠')} Claude plugin outdated — re-run conductor init to update`);
119
+ warnings++;
120
+ }
121
+ if (failures === 0 && warnings === 0) {
122
+ printNextSteps();
123
+ }
124
+ });
125
+ }
126
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { Command } from 'commander';
2
+ interface McpServerEntry {
3
+ command: string;
4
+ args?: string[];
5
+ env?: Record<string, string>;
6
+ }
7
+ interface McpJson {
8
+ mcpServers?: Record<string, McpServerEntry>;
9
+ [key: string]: unknown;
10
+ }
11
+ export declare function getIssuesDir(projectId: string): string;
12
+ export declare function getProjectRoot(workingDir: string): string;
13
+ export declare function ensureGitignore(projectRoot: string): void;
14
+ export declare function readMcpJson(workingDir: string): McpJson;
15
+ export declare function writeMcpJson(workingDir: string, content: McpJson): void;
16
+ export declare function buildMcpJson(existing: McpJson): McpJson;
17
+ export declare function registerInit(program: Command): void;
18
+ export {};
19
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAUnC,UAAU,cAAc;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;IACf,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC7B;AAED,UAAU,OAAO;IACf,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;IAC3C,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAOD,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAUzD;AAED,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAUzD;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAQvD;AAED,wBAAgB,YAAY,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAGvE;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,OAAO,CAQvD;AAoED,wBAAgB,YAAY,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA0KnD"}