@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,29 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ const CONDUCTOR_DIR = path.join(os.homedir(), '.conductor');
5
+ export const STATE_FILE_PATH = path.join(CONDUCTOR_DIR, 'daemon-state.json');
6
+ export function writeDaemonState(state) {
7
+ fs.mkdirSync(CONDUCTOR_DIR, { recursive: true });
8
+ fs.writeFileSync(STATE_FILE_PATH, JSON.stringify(state, null, 2), 'utf8');
9
+ }
10
+ export function readDaemonState() {
11
+ try {
12
+ const raw = fs.readFileSync(STATE_FILE_PATH, 'utf8');
13
+ return JSON.parse(raw);
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ export function deleteDaemonState() {
20
+ try {
21
+ fs.unlinkSync(STATE_FILE_PATH);
22
+ }
23
+ catch (err) {
24
+ if (err.code !== 'ENOENT') {
25
+ throw err;
26
+ }
27
+ }
28
+ }
29
+ //# sourceMappingURL=state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"state.js","sourceRoot":"","sources":["../../src/daemon/state.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAExB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAA;AAE3D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,mBAAmB,CAAC,CAAA;AAqB5E,MAAM,UAAU,gBAAgB,CAAC,KAAkB;IACjD,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,EAAE,CAAC,aAAa,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AAC3E,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,eAAe,EAAE,MAAM,CAAC,CAAA;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAgB,CAAA;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,CAAA;IAChC,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACrD,MAAM,GAAG,CAAA;QACX,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { Config } from '../lib/config.js';
2
+ export declare const SYNC_QUEUE_PATH: string;
3
+ export declare function rotateDaemonLogIfNeeded(): void;
4
+ export interface QueueEntry {
5
+ method: 'POST' | 'PUT' | 'DELETE';
6
+ path: string;
7
+ body?: Record<string, unknown>;
8
+ timestamp: string;
9
+ }
10
+ export declare const debounceTimers: Map<string, NodeJS.Timeout>;
11
+ export declare function debounce(key: string, fn: () => void, ms?: number): void;
12
+ export declare function parseFilePath(filePath: string): {
13
+ issueId: string;
14
+ filename: string;
15
+ } | null;
16
+ export declare function readQueue(): QueueEntry[];
17
+ export declare function writeQueue(entries: QueueEntry[]): void;
18
+ export declare function queueChange(entry: Omit<QueueEntry, 'timestamp'>): void;
19
+ export declare function syncFile(filePath: string, getConfig: () => Config): Promise<void>;
20
+ export declare function deleteFile(filePath: string, getConfig: () => Config): Promise<void>;
21
+ export declare function syncIssueMd(filePath: string, getConfig: () => Config): Promise<void>;
22
+ export declare function syncTasksJson(filePath: string, getConfig: () => Config): Promise<void>;
23
+ export declare function syncExistingTasksFiles(getConfig: () => Config): Promise<void>;
24
+ export declare function replayQueue(getConfig: () => Config): Promise<void>;
25
+ export declare function startWatcher(getConfig: () => Config): void;
26
+ //# sourceMappingURL=watcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/daemon/watcher.ts"],"names":[],"mappings":"AAKA,OAAO,EAAc,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAOrD,eAAO,MAAM,eAAe,QAA8C,CAAA;AAK1E,wBAAgB,uBAAuB,IAAI,IAAI,CAS9C;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAA;IACjC,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;CAClB;AAED,eAAO,MAAM,cAAc,6BAAmD,CAAA;AAE9E,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,SAAM,GAAG,IAAI,CAOpE;AAED,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,GACf;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAM9C;AAED,wBAAgB,SAAS,IAAI,UAAU,EAAE,CAOxC;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAWtD;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,IAAI,CAItE;AAwBD,wBAAsB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA0BvF;AAED,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBzF;AAaD,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA8B1F;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuB5F;AAED,wBAAsB,sBAAsB,CAAC,SAAS,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBnF;AAED,wBAAsB,WAAW,CAAC,SAAS,EAAE,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBxE;AAED,wBAAgB,YAAY,CAAC,SAAS,EAAE,MAAM,MAAM,GAAG,IAAI,CAiD1D"}
@@ -0,0 +1,330 @@
1
+ import chokidar from 'chokidar';
2
+ import * as fs from 'fs';
3
+ import * as path from 'path';
4
+ import * as os from 'os';
5
+ import { fileURLToPath } from 'url';
6
+ import { readConfig } from '../lib/config.js';
7
+ import { writeDaemonState, deleteDaemonState } from './state.js';
8
+ import { startPoller } from './poller.js';
9
+ import { RunQueue } from './run-queue.js';
10
+ const CONDUCTOR_DIR = path.join(os.homedir(), '.conductor');
11
+ export const SYNC_QUEUE_PATH = path.join(CONDUCTOR_DIR, 'sync-queue.json');
12
+ const LOG_FILE = path.join(CONDUCTOR_DIR, 'daemon.log');
13
+ const LOG_FILE_ROTATED = path.join(CONDUCTOR_DIR, 'daemon.log.1');
14
+ const LOG_ROTATION_BYTES = 5 * 1024 * 1024;
15
+ export function rotateDaemonLogIfNeeded() {
16
+ try {
17
+ const stat = fs.statSync(LOG_FILE);
18
+ if (stat.size >= LOG_ROTATION_BYTES) {
19
+ fs.renameSync(LOG_FILE, LOG_FILE_ROTATED);
20
+ }
21
+ }
22
+ catch {
23
+ // Log file may not exist yet — nothing to rotate
24
+ }
25
+ }
26
+ export const debounceTimers = new Map();
27
+ export function debounce(key, fn, ms = 500) {
28
+ const existing = debounceTimers.get(key);
29
+ if (existing)
30
+ clearTimeout(existing);
31
+ debounceTimers.set(key, setTimeout(() => {
32
+ debounceTimers.delete(key);
33
+ fn();
34
+ }, ms));
35
+ }
36
+ export function parseFilePath(filePath) {
37
+ // Expected: {localPath}/.conductor/issues/{issueId}/{filename}
38
+ const normalized = filePath.replace(/\\/g, '/');
39
+ const match = normalized.match(/\.conductor\/issues\/([^/]+)\/([^/]+)$/);
40
+ if (!match)
41
+ return null;
42
+ return { issueId: match[1], filename: match[2] };
43
+ }
44
+ export function readQueue() {
45
+ try {
46
+ const raw = fs.readFileSync(SYNC_QUEUE_PATH, 'utf8');
47
+ return JSON.parse(raw);
48
+ }
49
+ catch {
50
+ return [];
51
+ }
52
+ }
53
+ export function writeQueue(entries) {
54
+ if (entries.length === 0) {
55
+ try {
56
+ fs.unlinkSync(SYNC_QUEUE_PATH);
57
+ }
58
+ catch {
59
+ // File may already not exist
60
+ }
61
+ return;
62
+ }
63
+ fs.mkdirSync(path.dirname(SYNC_QUEUE_PATH), { recursive: true });
64
+ fs.writeFileSync(SYNC_QUEUE_PATH, JSON.stringify(entries, null, 2), 'utf8');
65
+ }
66
+ export function queueChange(entry) {
67
+ const entries = readQueue();
68
+ entries.push({ ...entry, timestamp: new Date().toISOString() });
69
+ writeQueue(entries);
70
+ }
71
+ async function callApi(method, apiPath, body, getConfig) {
72
+ const config = getConfig();
73
+ const url = `${config.apiUrl}${apiPath}`;
74
+ const response = await fetch(url, {
75
+ method,
76
+ headers: {
77
+ Authorization: `Bearer ${config.apiKey}`,
78
+ 'Content-Type': 'application/json',
79
+ },
80
+ body: body !== undefined ? JSON.stringify(body) : undefined,
81
+ });
82
+ if (!response.ok) {
83
+ const text = await response.text().catch(() => response.statusText);
84
+ throw new Error(`${method} ${apiPath} failed with status ${response.status}: ${text}`);
85
+ }
86
+ }
87
+ export async function syncFile(filePath, getConfig) {
88
+ const parsed = parseFilePath(filePath);
89
+ if (!parsed)
90
+ return;
91
+ // issue.md is handled by syncIssueMd
92
+ if (parsed.filename === 'issue.md')
93
+ return;
94
+ let content;
95
+ try {
96
+ content = fs.readFileSync(filePath, 'utf8');
97
+ }
98
+ catch {
99
+ console.error(`Failed to read file: ${filePath}`);
100
+ return;
101
+ }
102
+ const config = getConfig();
103
+ const apiPath = `/api/v1/projects/${config.projectId}/issues/${parsed.issueId}/documents/${encodeURIComponent(parsed.filename)}`;
104
+ const body = { content, contentType: 'text/markdown' };
105
+ try {
106
+ await callApi('PUT', apiPath, body, getConfig);
107
+ console.log(`Synced: ${filePath}`);
108
+ }
109
+ catch (err) {
110
+ console.error(`Sync failed, queuing: ${filePath} — ${err.message}`);
111
+ queueChange({ method: 'PUT', path: apiPath, body });
112
+ }
113
+ }
114
+ export async function deleteFile(filePath, getConfig) {
115
+ const parsed = parseFilePath(filePath);
116
+ if (!parsed)
117
+ return;
118
+ if (parsed.filename === 'issue.md')
119
+ return;
120
+ const config = getConfig();
121
+ const apiPath = `/api/v1/projects/${config.projectId}/issues/${parsed.issueId}/documents/${encodeURIComponent(parsed.filename)}`;
122
+ try {
123
+ await callApi('DELETE', apiPath, undefined, getConfig);
124
+ console.log(`Deleted: ${filePath}`);
125
+ }
126
+ catch (err) {
127
+ console.error(`Delete failed, queuing: ${filePath} — ${err.message}`);
128
+ queueChange({ method: 'DELETE', path: apiPath });
129
+ }
130
+ }
131
+ function parseFrontmatter(content) {
132
+ const match = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
133
+ if (!match)
134
+ return {};
135
+ const frontmatterStr = match[1];
136
+ const body = match[2].trim();
137
+ const title = frontmatterStr.match(/^title:\s*(.+)$/m)?.[1]?.trim();
138
+ const status = frontmatterStr.match(/^status:\s*(.+)$/m)?.[1]?.trim();
139
+ return { title, status, body };
140
+ }
141
+ export async function syncIssueMd(filePath, getConfig) {
142
+ const parsed = parseFilePath(filePath);
143
+ if (!parsed)
144
+ return;
145
+ let content;
146
+ try {
147
+ content = fs.readFileSync(filePath, 'utf8');
148
+ }
149
+ catch {
150
+ console.error(`Failed to read file: ${filePath}`);
151
+ return;
152
+ }
153
+ const { title, status, body } = parseFrontmatter(content);
154
+ const patchBody = {};
155
+ if (title !== undefined)
156
+ patchBody['title'] = title;
157
+ if (status !== undefined)
158
+ patchBody['status'] = status;
159
+ if (body !== undefined)
160
+ patchBody['description'] = body;
161
+ if (Object.keys(patchBody).length === 0)
162
+ return;
163
+ const config = getConfig();
164
+ const apiPath = `/api/v1/projects/${config.projectId}/issues/${parsed.issueId}`;
165
+ try {
166
+ await callApi('PATCH', apiPath, patchBody, getConfig);
167
+ console.log(`Synced issue.md: ${filePath}`);
168
+ }
169
+ catch (err) {
170
+ console.error(`Issue sync failed, queuing: ${filePath} — ${err.message}`);
171
+ queueChange({ method: 'PUT', path: apiPath, body: patchBody });
172
+ }
173
+ }
174
+ export async function syncTasksJson(filePath, getConfig) {
175
+ const parsed = parseFilePath(filePath);
176
+ if (!parsed)
177
+ return;
178
+ let content;
179
+ try {
180
+ content = fs.readFileSync(filePath, 'utf8');
181
+ }
182
+ catch {
183
+ console.error(`Failed to read file: ${filePath}`);
184
+ return;
185
+ }
186
+ const tasks = JSON.parse(content);
187
+ const config = getConfig();
188
+ const apiPath = `/api/v1/projects/${config.projectId}/issues/${parsed.issueId}/tasks`;
189
+ try {
190
+ await callApi('PUT', apiPath, tasks, getConfig);
191
+ console.log(`Synced tasks.json: ${filePath}`);
192
+ }
193
+ catch (err) {
194
+ console.error(`Tasks sync failed, queuing: ${filePath} — ${err.message}`);
195
+ queueChange({ method: 'PUT', path: apiPath, body: tasks });
196
+ }
197
+ }
198
+ export async function syncExistingTasksFiles(getConfig) {
199
+ const config = getConfig();
200
+ if (!config.localPath)
201
+ return;
202
+ const issuesDir = path.join(config.localPath, '.conductor', 'issues');
203
+ let issueDirs;
204
+ try {
205
+ issueDirs = fs.readdirSync(issuesDir);
206
+ }
207
+ catch {
208
+ return;
209
+ }
210
+ for (const issueId of issueDirs) {
211
+ const tasksPath = path.join(issuesDir, issueId, 'tasks.json');
212
+ if (fs.existsSync(tasksPath)) {
213
+ await syncTasksJson(tasksPath, getConfig).catch((err) => {
214
+ console.error(`Startup sync failed for ${tasksPath}: ${err.message}`);
215
+ });
216
+ }
217
+ }
218
+ }
219
+ export async function replayQueue(getConfig) {
220
+ const entries = readQueue();
221
+ if (entries.length === 0)
222
+ return;
223
+ console.log(`Replaying ${entries.length} queued item(s)...`);
224
+ const remaining = [];
225
+ for (const entry of entries) {
226
+ try {
227
+ await callApi(entry.method, entry.path, entry.body, getConfig);
228
+ console.log(`Replayed: ${entry.method} ${entry.path}`);
229
+ }
230
+ catch (err) {
231
+ console.error(`Replay failed for ${entry.method} ${entry.path}: ${err.message}`);
232
+ remaining.push(entry);
233
+ }
234
+ }
235
+ writeQueue(remaining);
236
+ if (remaining.length === 0) {
237
+ console.log('All queued items replayed successfully.');
238
+ }
239
+ else {
240
+ console.log(`${remaining.length} item(s) still pending.`);
241
+ }
242
+ }
243
+ export function startWatcher(getConfig) {
244
+ const config = getConfig();
245
+ if (!config.localPath) {
246
+ console.error('localPath not set in config — run conductor init first');
247
+ process.exit(1);
248
+ }
249
+ const watchPath = path.join(config.localPath, '.conductor', 'issues');
250
+ console.log(`Watching: ${watchPath}`);
251
+ const watcher = chokidar.watch(watchPath, { ignoreInitial: true, persistent: true, depth: 2 });
252
+ watcher
253
+ .on('add', (filePath) => debounce(filePath, () => {
254
+ if (path.basename(filePath) === 'issue.md') {
255
+ syncIssueMd(filePath, getConfig).catch(console.error);
256
+ }
257
+ else if (path.basename(filePath) === 'tasks.json') {
258
+ syncTasksJson(filePath, getConfig).catch(console.error);
259
+ }
260
+ else {
261
+ syncFile(filePath, getConfig).catch(console.error);
262
+ }
263
+ }))
264
+ .on('change', (filePath) => debounce(filePath, () => {
265
+ if (path.basename(filePath) === 'issue.md') {
266
+ syncIssueMd(filePath, getConfig).catch(console.error);
267
+ }
268
+ else if (path.basename(filePath) === 'tasks.json') {
269
+ syncTasksJson(filePath, getConfig).catch(console.error);
270
+ }
271
+ else {
272
+ syncFile(filePath, getConfig).catch(console.error);
273
+ }
274
+ }))
275
+ .on('unlink', (filePath) => debounce(filePath, () => {
276
+ const basename = path.basename(filePath);
277
+ if (basename !== 'issue.md' && basename !== 'tasks.json') {
278
+ deleteFile(filePath, getConfig).catch(console.error);
279
+ }
280
+ // issue.md and tasks.json deletes are ignored
281
+ }));
282
+ process.on('SIGTERM', () => {
283
+ watcher.close().then(() => {
284
+ console.log('Watcher closed.');
285
+ deleteDaemonState();
286
+ process.exit(0);
287
+ }).catch(() => {
288
+ deleteDaemonState();
289
+ process.exit(0);
290
+ });
291
+ });
292
+ }
293
+ // Only run as daemon entrypoint when this file is executed directly
294
+ const __filename = fileURLToPath(import.meta.url);
295
+ if (process.argv[1] === __filename) {
296
+ const getConfig = () => {
297
+ const cfg = readConfig();
298
+ if (!cfg) {
299
+ console.error('Not authenticated — run conductor login');
300
+ process.exit(78);
301
+ }
302
+ return cfg;
303
+ };
304
+ // Rotate log before writing new entries
305
+ rotateDaemonLogIfNeeded();
306
+ // Validate config is present at startup
307
+ getConfig();
308
+ writeDaemonState({
309
+ pid: process.pid,
310
+ startedAt: new Date().toISOString(),
311
+ pollMode: 'idle',
312
+ lastPollAt: null,
313
+ consecutiveErrors: 0,
314
+ eventsThisSession: 0,
315
+ activeRuns: [],
316
+ syncQueueSize: 0,
317
+ });
318
+ replayQueue(getConfig).catch(console.error);
319
+ syncExistingTasksFiles(getConfig).catch(console.error);
320
+ startWatcher(getConfig);
321
+ const runQueue = new RunQueue(getConfig().maxConcurrentRuns ?? 1);
322
+ startPoller(getConfig, async (events) => {
323
+ for (const event of events) {
324
+ if (event.type === 'workflow.trigger') {
325
+ runQueue.enqueue(event, getConfig);
326
+ }
327
+ }
328
+ });
329
+ }
330
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/daemon/watcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,44 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { registerLogin } from './commands/login.js';
4
+ import { registerLogout } from './commands/logout.js';
5
+ import { registerInit } from './commands/init.js';
6
+ import { registerDoctor } from './commands/doctor.js';
7
+ import { registerStart } from './commands/start.js';
8
+ import { registerStop } from './commands/stop.js';
9
+ import { registerMcp } from './commands/mcp.js';
10
+ import { registerConfig } from './commands/config.js';
11
+ import { registerDashboard } from './commands/dashboard.js';
12
+ import { registerStatus } from './commands/status.js';
13
+ const DEPRECATED_MSG = 'The issue and doc commands have been removed. Use Claude Code with the Conductor MCP server instead.';
14
+ const program = new Command();
15
+ program
16
+ .name('conductor')
17
+ .description('Conductor CLI for project setup and MCP integration')
18
+ .version('0.1.0');
19
+ registerLogin(program);
20
+ registerLogout(program);
21
+ registerInit(program);
22
+ registerDoctor(program);
23
+ registerStart(program);
24
+ registerStop(program);
25
+ registerMcp(program);
26
+ registerConfig(program);
27
+ registerDashboard(program);
28
+ registerStatus(program);
29
+ program
30
+ .command('issue', { hidden: true })
31
+ .allowUnknownOption()
32
+ .action(() => {
33
+ console.log(DEPRECATED_MSG);
34
+ process.exit(1);
35
+ });
36
+ program
37
+ .command('doc', { hidden: true })
38
+ .allowUnknownOption()
39
+ .action(() => {
40
+ console.log(DEPRECATED_MSG);
41
+ process.exit(1);
42
+ });
43
+ program.parse();
44
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAA;AAErD,MAAM,cAAc,GAAG,sGAAsG,CAAA;AAE7H,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAA;AAE7B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,qDAAqD,CAAC;KAClE,OAAO,CAAC,OAAO,CAAC,CAAA;AAEnB,aAAa,CAAC,OAAO,CAAC,CAAA;AACtB,cAAc,CAAC,OAAO,CAAC,CAAA;AACvB,YAAY,CAAC,OAAO,CAAC,CAAA;AACrB,cAAc,CAAC,OAAO,CAAC,CAAA;AACvB,aAAa,CAAC,OAAO,CAAC,CAAA;AACtB,YAAY,CAAC,OAAO,CAAC,CAAA;AACrB,WAAW,CAAC,OAAO,CAAC,CAAA;AACpB,cAAc,CAAC,OAAO,CAAC,CAAA;AACvB,iBAAiB,CAAC,OAAO,CAAC,CAAA;AAC1B,cAAc,CAAC,OAAO,CAAC,CAAA;AAEvB,OAAO;KACJ,OAAO,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;KAClC,kBAAkB,EAAE;KACpB,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEJ,OAAO;KACJ,OAAO,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;KAChC,kBAAkB,EAAE;KACpB,MAAM,CAAC,GAAG,EAAE;IACX,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;IAC3B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA;AAEJ,OAAO,CAAC,KAAK,EAAE,CAAA"}
@@ -0,0 +1,8 @@
1
+ export declare class ApiError extends Error {
2
+ readonly statusCode: number;
3
+ constructor(message: string, statusCode: number);
4
+ }
5
+ export declare function apiGet<T>(path: string, apiKey: string, apiUrl: string): Promise<T>;
6
+ export declare function apiPost<T>(path: string, body: unknown, apiKey: string, apiUrl: string): Promise<T>;
7
+ export declare function apiPatch<T>(path: string, body: unknown, apiKey: string, apiUrl: string): Promise<T>;
8
+ //# sourceMappingURL=api.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,qBAAa,QAAS,SAAQ,KAAK;aAGf,UAAU,EAAE,MAAM;gBADlC,OAAO,EAAE,MAAM,EACC,UAAU,EAAE,MAAM;CAKrC;AAED,wBAAsB,MAAM,CAAC,CAAC,EAC5B,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,CAAC,CAAC,CAmBZ;AAED,wBAAsB,OAAO,CAAC,CAAC,EAC7B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,CAAC,CAAC,CAoBZ;AAED,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,OAAO,EACb,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,CAAC,CAAC,CAoBZ"}
@@ -0,0 +1,55 @@
1
+ export class ApiError extends Error {
2
+ constructor(message, statusCode) {
3
+ super(message);
4
+ this.statusCode = statusCode;
5
+ this.name = 'ApiError';
6
+ }
7
+ }
8
+ export async function apiGet(path, apiKey, apiUrl) {
9
+ const url = `${apiUrl}${path}`;
10
+ const response = await fetch(url, {
11
+ method: 'GET',
12
+ headers: {
13
+ 'Authorization': `Bearer ${apiKey}`,
14
+ 'Content-Type': 'application/json',
15
+ },
16
+ });
17
+ if (!response.ok) {
18
+ const text = await response.text().catch(() => response.statusText);
19
+ throw new ApiError(`GET ${path} failed with status ${response.status}: ${text}`, response.status);
20
+ }
21
+ return response.json();
22
+ }
23
+ export async function apiPost(path, body, apiKey, apiUrl) {
24
+ const url = `${apiUrl}${path}`;
25
+ const response = await fetch(url, {
26
+ method: 'POST',
27
+ headers: {
28
+ 'Authorization': `Bearer ${apiKey}`,
29
+ 'Content-Type': 'application/json',
30
+ },
31
+ body: JSON.stringify(body),
32
+ });
33
+ if (!response.ok) {
34
+ const text = await response.text().catch(() => response.statusText);
35
+ throw new ApiError(`POST ${path} failed with status ${response.status}: ${text}`, response.status);
36
+ }
37
+ return response.json();
38
+ }
39
+ export async function apiPatch(path, body, apiKey, apiUrl) {
40
+ const url = `${apiUrl}${path}`;
41
+ const response = await fetch(url, {
42
+ method: 'PATCH',
43
+ headers: {
44
+ 'Authorization': `Bearer ${apiKey}`,
45
+ 'Content-Type': 'application/json',
46
+ },
47
+ body: JSON.stringify(body),
48
+ });
49
+ if (!response.ok) {
50
+ const text = await response.text().catch(() => response.statusText);
51
+ throw new ApiError(`PATCH ${path} failed with status ${response.status}: ${text}`, response.status);
52
+ }
53
+ return response.json();
54
+ }
55
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,QAAS,SAAQ,KAAK;IACjC,YACE,OAAe,EACC,UAAkB;QAElC,KAAK,CAAC,OAAO,CAAC,CAAA;QAFE,eAAU,GAAV,UAAU,CAAQ;QAGlC,IAAI,CAAC,IAAI,GAAG,UAAU,CAAA;IACxB,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,IAAY,EACZ,MAAc,EACd,MAAc;IAEd,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,KAAK;QACb,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;SACnC;KACF,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACnE,MAAM,IAAI,QAAQ,CAChB,OAAO,IAAI,uBAAuB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,EAC5D,QAAQ,CAAC,MAAM,CAChB,CAAA;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAA;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,IAAY,EACZ,IAAa,EACb,MAAc,EACd,MAAc;IAEd,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACnE,MAAM,IAAI,QAAQ,CAChB,QAAQ,IAAI,uBAAuB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,EAC7D,QAAQ,CAAC,MAAM,CAChB,CAAA;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAA;AACtC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,IAAY,EACZ,IAAa,EACb,MAAc,EACd,MAAc;IAEd,MAAM,GAAG,GAAG,GAAG,MAAM,GAAG,IAAI,EAAE,CAAA;IAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;QAChC,MAAM,EAAE,OAAO;QACf,OAAO,EAAE;YACP,eAAe,EAAE,UAAU,MAAM,EAAE;YACnC,cAAc,EAAE,kBAAkB;SACnC;QACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAA;IAEF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACnE,MAAM,IAAI,QAAQ,CAChB,SAAS,IAAI,uBAAuB,QAAQ,CAAC,MAAM,KAAK,IAAI,EAAE,EAC9D,QAAQ,CAAC,MAAM,CAChB,CAAA;IACH,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAgB,CAAA;AACtC,CAAC"}
@@ -0,0 +1,16 @@
1
+ export interface Config {
2
+ apiKey: string;
3
+ projectId: string;
4
+ projectName: string;
5
+ email: string;
6
+ apiUrl: string;
7
+ frontendUrl?: string;
8
+ localPath?: string;
9
+ maxConcurrentRuns?: number;
10
+ }
11
+ export declare const CONFIG_PATH: string;
12
+ export declare function readConfig(): Config | null;
13
+ export declare function writeConfig(config: Config): void;
14
+ export declare function clearConfig(): void;
15
+ export declare function loadConfigOrExit(): Config;
16
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC3B;AAED,eAAO,MAAM,WAAW,QAAuD,CAAA;AAE/E,wBAAgB,UAAU,IAAI,MAAM,GAAG,IAAI,CAS1C;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED,wBAAgB,WAAW,IAAI,IAAI,CAMlC;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAOzC"}
@@ -0,0 +1,48 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as os from 'os';
4
+ export const CONFIG_PATH = path.join(os.homedir(), '.conductor', 'config.json');
5
+ export function readConfig() {
6
+ try {
7
+ const raw = fs.readFileSync(CONFIG_PATH, 'utf8');
8
+ const parsed = JSON.parse(raw);
9
+ if (!isConfig(parsed))
10
+ return null;
11
+ return parsed;
12
+ }
13
+ catch {
14
+ return null;
15
+ }
16
+ }
17
+ export function writeConfig(config) {
18
+ const dir = path.dirname(CONFIG_PATH);
19
+ fs.mkdirSync(dir, { recursive: true });
20
+ fs.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), 'utf8');
21
+ }
22
+ export function clearConfig() {
23
+ try {
24
+ fs.unlinkSync(CONFIG_PATH);
25
+ }
26
+ catch {
27
+ // File may not exist; that's fine
28
+ }
29
+ }
30
+ export function loadConfigOrExit() {
31
+ const config = readConfig();
32
+ if (!config) {
33
+ console.error('No config found — run conductor login first');
34
+ process.exit(78);
35
+ }
36
+ return config;
37
+ }
38
+ function isConfig(value) {
39
+ if (typeof value !== 'object' || value === null)
40
+ return false;
41
+ const obj = value;
42
+ return (typeof obj['apiKey'] === 'string' &&
43
+ typeof obj['projectId'] === 'string' &&
44
+ typeof obj['projectName'] === 'string' &&
45
+ typeof obj['email'] === 'string' &&
46
+ typeof obj['apiUrl'] === 'string');
47
+ }
48
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AACxB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAC5B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAA;AAaxB,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,YAAY,EAAE,aAAa,CAAC,CAAA;AAE/E,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAA;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAA;QACzC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,IAAI,CAAA;QAClC,OAAO,MAAM,CAAA;IACf,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IACrC,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACtC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;AACxE,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,IAAI,CAAC;QACH,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAA;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB;IAC9B,MAAM,MAAM,GAAG,UAAU,EAAE,CAAA;IAC3B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAA;QAC5D,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAClB,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IAC7D,MAAM,GAAG,GAAG,KAAgC,CAAA;IAC5C,OAAO,CACL,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ;QACjC,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,QAAQ;QACpC,OAAO,GAAG,CAAC,aAAa,CAAC,KAAK,QAAQ;QACtC,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,QAAQ;QAChC,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,QAAQ,CAClC,CAAA;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function printNextSteps(): void;
2
+ //# sourceMappingURL=next-steps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-steps.d.ts","sourceRoot":"","sources":["../../src/lib/next-steps.ts"],"names":[],"mappings":"AAEA,wBAAgB,cAAc,IAAI,IAAI,CAQrC"}
@@ -0,0 +1,11 @@
1
+ import chalk from 'chalk';
2
+ export function printNextSteps() {
3
+ console.log();
4
+ console.log(chalk.bold('Next steps:'));
5
+ console.log();
6
+ console.log(` 1. Start the sync daemon ${chalk.cyan('conductor start')}`);
7
+ console.log(` 2. Open Claude Code in this directory`);
8
+ console.log(` 3. Create your first PRD ${chalk.cyan('/conductor:prd')}`);
9
+ console.log();
10
+ }
11
+ //# sourceMappingURL=next-steps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-steps.js","sourceRoot":"","sources":["../../src/lib/next-steps.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,MAAM,UAAU,cAAc;IAC5B,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAA;IACtC,OAAO,CAAC,GAAG,EAAE,CAAA;IACb,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAA;IAChF,OAAO,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAA;IACtD,OAAO,CAAC,GAAG,CAAC,oCAAoC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAA;IAC/E,OAAO,CAAC,GAAG,EAAE,CAAA;AACf,CAAC"}