@intrect/openswarm 0.5.0 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -674
- package/README.md +97 -35
- package/config.example.yaml +8 -2
- package/dist/adapters/agenticLoop.d.ts +15 -1
- package/dist/adapters/agenticLoop.d.ts.map +1 -1
- package/dist/adapters/agenticLoop.js +62 -4
- package/dist/adapters/agenticLoop.js.map +1 -1
- package/dist/adapters/chatStream.d.ts +55 -0
- package/dist/adapters/chatStream.d.ts.map +1 -0
- package/dist/adapters/chatStream.js +116 -0
- package/dist/adapters/chatStream.js.map +1 -0
- package/dist/adapters/codex.d.ts +6 -0
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +27 -1
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/codexModels.d.ts +20 -0
- package/dist/adapters/codexModels.d.ts.map +1 -0
- package/dist/adapters/codexModels.js +195 -0
- package/dist/adapters/codexModels.js.map +1 -0
- package/dist/adapters/codexResponses.d.ts +97 -0
- package/dist/adapters/codexResponses.d.ts.map +1 -0
- package/dist/adapters/codexResponses.js +302 -0
- package/dist/adapters/codexResponses.js.map +1 -0
- package/dist/adapters/gpt.d.ts.map +1 -1
- package/dist/adapters/gpt.js +17 -131
- package/dist/adapters/gpt.js.map +1 -1
- package/dist/adapters/index.d.ts +7 -0
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +11 -0
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/local.d.ts.map +1 -1
- package/dist/adapters/local.js +17 -125
- package/dist/adapters/local.js.map +1 -1
- package/dist/adapters/openrouter.d.ts +5 -24
- package/dist/adapters/openrouter.d.ts.map +1 -1
- package/dist/adapters/openrouter.js +20 -121
- package/dist/adapters/openrouter.js.map +1 -1
- package/dist/adapters/resultParsing.d.ts +6 -0
- package/dist/adapters/resultParsing.d.ts.map +1 -0
- package/dist/adapters/resultParsing.js +139 -0
- package/dist/adapters/resultParsing.js.map +1 -0
- package/dist/adapters/tools.d.ts +0 -6
- package/dist/adapters/tools.d.ts.map +1 -1
- package/dist/adapters/tools.js +57 -3
- package/dist/adapters/tools.js.map +1 -1
- package/dist/adapters/types.d.ts +21 -1
- package/dist/adapters/types.d.ts.map +1 -1
- package/dist/adapters/webTools.d.ts +9 -0
- package/dist/adapters/webTools.d.ts.map +1 -0
- package/dist/adapters/webTools.js +195 -0
- package/dist/adapters/webTools.js.map +1 -0
- package/dist/agents/pairPipeline.d.ts +26 -1
- package/dist/agents/pairPipeline.d.ts.map +1 -1
- package/dist/agents/pairPipeline.js +82 -14
- package/dist/agents/pairPipeline.js.map +1 -1
- package/dist/agents/reflection.d.ts +56 -0
- package/dist/agents/reflection.d.ts.map +1 -0
- package/dist/agents/reflection.js +120 -0
- package/dist/agents/reflection.js.map +1 -0
- package/dist/agents/worker.d.ts +2 -0
- package/dist/agents/worker.d.ts.map +1 -1
- package/dist/agents/worker.js +1 -0
- package/dist/agents/worker.js.map +1 -1
- package/dist/auth/index.d.ts +1 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +1 -0
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/linearPkce.d.ts +22 -0
- package/dist/auth/linearPkce.d.ts.map +1 -0
- package/dist/auth/linearPkce.js +208 -0
- package/dist/auth/linearPkce.js.map +1 -0
- package/dist/auth/oauthPkce.d.ts.map +1 -1
- package/dist/auth/oauthPkce.js +18 -5
- package/dist/auth/oauthPkce.js.map +1 -1
- package/dist/auth/oauthStore.d.ts.map +1 -1
- package/dist/auth/oauthStore.js +10 -2
- package/dist/auth/oauthStore.js.map +1 -1
- package/dist/automation/autonomousRunner.d.ts +6 -6
- package/dist/automation/autonomousRunner.d.ts.map +1 -1
- package/dist/automation/autonomousRunner.js +15 -13
- package/dist/automation/autonomousRunner.js.map +1 -1
- package/dist/automation/backlogGrooming.d.ts +21 -0
- package/dist/automation/backlogGrooming.d.ts.map +1 -0
- package/dist/automation/backlogGrooming.js +80 -0
- package/dist/automation/backlogGrooming.js.map +1 -0
- package/dist/automation/localCI.d.ts +24 -0
- package/dist/automation/localCI.d.ts.map +1 -0
- package/dist/automation/localCI.js +84 -0
- package/dist/automation/localCI.js.map +1 -0
- package/dist/automation/runnerExecution.d.ts +33 -7
- package/dist/automation/runnerExecution.d.ts.map +1 -1
- package/dist/automation/runnerExecution.js +202 -154
- package/dist/automation/runnerExecution.js.map +1 -1
- package/dist/automation/runnerTypes.d.ts +5 -1
- package/dist/automation/runnerTypes.d.ts.map +1 -1
- package/dist/automation/taskSource.d.ts +101 -0
- package/dist/automation/taskSource.d.ts.map +1 -0
- package/dist/automation/taskSource.js +136 -0
- package/dist/automation/taskSource.js.map +1 -0
- package/dist/automation/workerAuditLog.d.ts +29 -0
- package/dist/automation/workerAuditLog.d.ts.map +1 -0
- package/dist/automation/workerAuditLog.js +82 -0
- package/dist/automation/workerAuditLog.js.map +1 -0
- package/dist/cli/authHandler.d.ts +6 -0
- package/dist/cli/authHandler.d.ts.map +1 -1
- package/dist/cli/authHandler.js +37 -2
- package/dist/cli/authHandler.js.map +1 -1
- package/dist/cli/daemon.d.ts +5 -0
- package/dist/cli/daemon.d.ts.map +1 -1
- package/dist/cli/daemon.js +13 -0
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/doctorHandler.d.ts +2 -0
- package/dist/cli/doctorHandler.d.ts.map +1 -0
- package/dist/cli/doctorHandler.js +114 -0
- package/dist/cli/doctorHandler.js.map +1 -0
- package/dist/cli/initWizard.d.ts +13 -0
- package/dist/cli/initWizard.d.ts.map +1 -0
- package/dist/cli/initWizard.js +334 -0
- package/dist/cli/initWizard.js.map +1 -0
- package/dist/cli.js +110 -37
- package/dist/cli.js.map +1 -1
- package/dist/core/config.d.ts +50 -2
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +69 -10
- package/dist/core/config.js.map +1 -1
- package/dist/core/envFile.d.ts +6 -0
- package/dist/core/envFile.d.ts.map +1 -1
- package/dist/core/envFile.js +39 -1
- package/dist/core/envFile.js.map +1 -1
- package/dist/core/providerOverride.d.ts +6 -0
- package/dist/core/providerOverride.d.ts.map +1 -0
- package/dist/core/providerOverride.js +37 -0
- package/dist/core/providerOverride.js.map +1 -0
- package/dist/core/service.d.ts.map +1 -1
- package/dist/core/service.js +41 -18
- package/dist/core/service.js.map +1 -1
- package/dist/core/types.d.ts +16 -2
- package/dist/core/types.d.ts.map +1 -1
- package/dist/discord/discordHandlers.d.ts.map +1 -1
- package/dist/discord/discordHandlers.js +15 -12
- package/dist/discord/discordHandlers.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/issues/sqliteStore.d.ts.map +1 -1
- package/dist/issues/sqliteStore.js +7 -2
- package/dist/issues/sqliteStore.js.map +1 -1
- package/dist/knowledge/scanner.d.ts.map +1 -1
- package/dist/knowledge/scanner.js +5 -0
- package/dist/knowledge/scanner.js.map +1 -1
- package/dist/linear/linear.d.ts +45 -2
- package/dist/linear/linear.d.ts.map +1 -1
- package/dist/linear/linear.js +154 -3
- package/dist/linear/linear.js.map +1 -1
- package/dist/locale/prompts/en.d.ts.map +1 -1
- package/dist/locale/prompts/en.js +14 -2
- package/dist/locale/prompts/en.js.map +1 -1
- package/dist/locale/prompts/ko.d.ts.map +1 -1
- package/dist/locale/prompts/ko.js +14 -2
- package/dist/locale/prompts/ko.js.map +1 -1
- package/dist/mcp/mcpClient.d.ts +27 -0
- package/dist/mcp/mcpClient.d.ts.map +1 -0
- package/dist/mcp/mcpClient.js +145 -0
- package/dist/mcp/mcpClient.js.map +1 -0
- package/dist/memory/memoryCore.d.ts.map +1 -1
- package/dist/memory/memoryCore.js +8 -2
- package/dist/memory/memoryCore.js.map +1 -1
- package/dist/notify/notifier.d.ts +26 -0
- package/dist/notify/notifier.d.ts.map +1 -0
- package/dist/notify/notifier.js +131 -0
- package/dist/notify/notifier.js.map +1 -0
- package/dist/orchestration/conflictDetector.d.ts +5 -2
- package/dist/orchestration/conflictDetector.d.ts.map +1 -1
- package/dist/orchestration/conflictDetector.js +35 -6
- package/dist/orchestration/conflictDetector.js.map +1 -1
- package/dist/orchestration/decisionEngine.d.ts +20 -0
- package/dist/orchestration/decisionEngine.d.ts.map +1 -1
- package/dist/orchestration/decisionEngine.js +45 -0
- package/dist/orchestration/decisionEngine.js.map +1 -1
- package/dist/support/banner.d.ts +7 -0
- package/dist/support/banner.d.ts.map +1 -0
- package/dist/support/banner.js +32 -0
- package/dist/support/banner.js.map +1 -0
- package/dist/support/chat.js +28 -5
- package/dist/support/chat.js.map +1 -1
- package/dist/support/chatBackend.d.ts +6 -0
- package/dist/support/chatBackend.d.ts.map +1 -1
- package/dist/support/chatBackend.js +68 -0
- package/dist/support/chatBackend.js.map +1 -1
- package/dist/support/chatTui.d.ts.map +1 -1
- package/dist/support/chatTui.js +202 -9
- package/dist/support/chatTui.js.map +1 -1
- package/dist/support/colors.d.ts +15 -0
- package/dist/support/colors.d.ts.map +1 -0
- package/dist/support/colors.js +23 -0
- package/dist/support/colors.js.map +1 -0
- package/dist/support/planCommand.d.ts +17 -0
- package/dist/support/planCommand.d.ts.map +1 -0
- package/dist/support/planCommand.js +114 -0
- package/dist/support/planCommand.js.map +1 -0
- package/dist/support/planner.d.ts +9 -2
- package/dist/support/planner.d.ts.map +1 -1
- package/dist/support/planner.js +43 -111
- package/dist/support/planner.js.map +1 -1
- package/dist/support/promptHelper.d.ts +24 -0
- package/dist/support/promptHelper.d.ts.map +1 -0
- package/dist/support/promptHelper.js +94 -0
- package/dist/support/promptHelper.js.map +1 -0
- package/dist/support/rateLimiter.d.ts.map +1 -1
- package/dist/support/rateLimiter.js +6 -0
- package/dist/support/rateLimiter.js.map +1 -1
- package/dist/support/repoMetadata.d.ts +7 -0
- package/dist/support/repoMetadata.d.ts.map +1 -1
- package/dist/support/repoMetadata.js +13 -1
- package/dist/support/repoMetadata.js.map +1 -1
- package/dist/support/web.d.ts.map +1 -1
- package/dist/support/web.js +143 -65
- package/dist/support/web.js.map +1 -1
- package/dist/support/worktreeManager.d.ts +6 -1
- package/dist/support/worktreeManager.d.ts.map +1 -1
- package/dist/support/worktreeManager.js +23 -1
- package/dist/support/worktreeManager.js.map +1 -1
- package/dist/taskState/store.d.ts +1 -0
- package/dist/taskState/store.d.ts.map +1 -1
- package/dist/taskState/store.js +22 -1
- package/dist/taskState/store.js.map +1 -1
- package/package.json +4 -2
package/dist/cli/authHandler.js
CHANGED
|
@@ -3,14 +3,17 @@
|
|
|
3
3
|
// `openswarm auth login/status/logout`
|
|
4
4
|
// ============================================
|
|
5
5
|
import { createInterface } from 'node:readline';
|
|
6
|
-
import { AuthProfileStore } from '../auth/index.js';
|
|
6
|
+
import { AuthProfileStore, ensureValidToken } from '../auth/index.js';
|
|
7
7
|
import { loginAndSaveProfile, DEFAULT_OPENAI_CLIENT_ID, } from '../auth/oauthPkce.js';
|
|
8
8
|
import { loginAndSaveOpenRouterProfile, saveOpenRouterApiKey, } from '../auth/openrouterPkce.js';
|
|
9
|
+
import { loginAndSaveLinearProfile } from '../auth/linearPkce.js';
|
|
10
|
+
import { getCodexModelIds } from '../adapters/codexModels.js';
|
|
9
11
|
const PROFILE_KEYS = {
|
|
10
12
|
gpt: 'openai-gpt:default',
|
|
11
13
|
openrouter: 'openrouter:default',
|
|
14
|
+
linear: 'linear:default',
|
|
12
15
|
};
|
|
13
|
-
const VALID_PROVIDERS = ['gpt', 'openrouter'];
|
|
16
|
+
const VALID_PROVIDERS = ['gpt', 'openrouter', 'linear'];
|
|
14
17
|
function assertProvider(provider) {
|
|
15
18
|
if (!VALID_PROVIDERS.includes(provider)) {
|
|
16
19
|
console.error(`지원하지 않는 provider: "${provider}". 지원: ${VALID_PROVIDERS.join(', ')}`);
|
|
@@ -28,6 +31,10 @@ export async function handleAuthLogin(provider, opts) {
|
|
|
28
31
|
await loginAndSaveProfile(clientId, opts.port);
|
|
29
32
|
printGptPostLoginHint();
|
|
30
33
|
}
|
|
34
|
+
else if (provider === 'linear') {
|
|
35
|
+
await loginAndSaveLinearProfile(opts.port);
|
|
36
|
+
console.log('✓ Linear 연동 완료. `openswarm init`에서 팀/프로젝트를 선택하세요.'); // cxt-ignore: fake_execution — after real OAuth token exchange
|
|
37
|
+
}
|
|
31
38
|
else {
|
|
32
39
|
await loginOpenRouter(opts);
|
|
33
40
|
printOpenRouterPostLoginHint();
|
|
@@ -131,6 +138,34 @@ export function handleAuthStatus() {
|
|
|
131
138
|
console.log('');
|
|
132
139
|
}
|
|
133
140
|
}
|
|
141
|
+
/**
|
|
142
|
+
* 사용 가능한 Codex 모델 목록 표시.
|
|
143
|
+
* GPT/Codex OAuth 토큰이 있으면 라이브로(chatgpt.com Codex 백엔드) 조회하고,
|
|
144
|
+
* 없으면 ~/.codex 로컬 소스 + 큐레이트 fallback으로 표시한다.
|
|
145
|
+
*/
|
|
146
|
+
export async function handleAuthModels() {
|
|
147
|
+
const store = new AuthProfileStore();
|
|
148
|
+
let accessToken;
|
|
149
|
+
if (store.getProfile(PROFILE_KEYS.gpt)) {
|
|
150
|
+
try {
|
|
151
|
+
accessToken = await ensureValidToken(store, PROFILE_KEYS.gpt);
|
|
152
|
+
}
|
|
153
|
+
catch (err) {
|
|
154
|
+
console.warn(`[Auth] 토큰 검증 실패 (${err instanceof Error ? err.message : String(err)}). 오프라인 fallback으로 표시합니다.`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
console.log('GPT/Codex 인증 프로필이 없습니다 — 오프라인 fallback 목록을 표시합니다.');
|
|
159
|
+
console.log('라이브 조회: openswarm auth login --provider gpt');
|
|
160
|
+
console.log('');
|
|
161
|
+
}
|
|
162
|
+
const models = await getCodexModelIds(accessToken);
|
|
163
|
+
const source = accessToken ? 'live · Codex OAuth backend' : 'offline fallback';
|
|
164
|
+
console.log(`Codex 모델 (${source}):`);
|
|
165
|
+
for (const model of models) {
|
|
166
|
+
console.log(` ${model}`);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
134
169
|
/**
|
|
135
170
|
* 인증 프로필 삭제
|
|
136
171
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authHandler.js","sourceRoot":"","sources":["../../src/cli/authHandler.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,+BAA+B;AAC/B,uCAAuC;AACvC,+CAA+C;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"authHandler.js","sourceRoot":"","sources":["../../src/cli/authHandler.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/daemon.d.ts
CHANGED
|
@@ -20,6 +20,11 @@ export declare function startDaemon(): {
|
|
|
20
20
|
* or throws if it's still alive after the timeout.
|
|
21
21
|
*/
|
|
22
22
|
export declare function stopDaemon(timeoutMs?: number): Promise<boolean>;
|
|
23
|
+
/**
|
|
24
|
+
* Read the last `lines` lines of the daemon log. Used by `openswarm start` to
|
|
25
|
+
* show why the daemon exited when it dies during startup.
|
|
26
|
+
*/
|
|
27
|
+
export declare function readLogTail(lines?: number): string;
|
|
23
28
|
export declare function getDaemonStatus(): DaemonStatus;
|
|
24
29
|
export declare const DAEMON_PATHS: {
|
|
25
30
|
readonly STATE_DIR: string;
|
package/dist/cli/daemon.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAiCD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA2C9D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BrE;AAED,wBAAgB,eAAe,IAAI,YAAY,CAa9C;AAED,eAAO,MAAM,YAAY;;;;;CAAsD,CAAC"}
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAiCD;;;;GAIG;AACH,wBAAgB,WAAW,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CA2C9D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,SAAS,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,CA6BrE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,KAAK,SAAK,GAAG,MAAM,CAO9C;AAED,wBAAgB,eAAe,IAAI,YAAY,CAa9C;AAED,eAAO,MAAM,YAAY;;;;;CAAsD,CAAC"}
|
package/dist/cli/daemon.js
CHANGED
|
@@ -124,6 +124,19 @@ export async function stopDaemon(timeoutMs = 10_000) {
|
|
|
124
124
|
throw new Error(`Daemon (pid ${pid}) did not exit within ${timeoutMs}ms. ` +
|
|
125
125
|
`It may still be shutting down; retry 'openswarm status' shortly or send SIGKILL manually.`);
|
|
126
126
|
}
|
|
127
|
+
/**
|
|
128
|
+
* Read the last `lines` lines of the daemon log. Used by `openswarm start` to
|
|
129
|
+
* show why the daemon exited when it dies during startup.
|
|
130
|
+
*/
|
|
131
|
+
export function readLogTail(lines = 20) {
|
|
132
|
+
try {
|
|
133
|
+
const content = readFileSync(LOG_FILE, 'utf8');
|
|
134
|
+
return content.split('\n').slice(-lines).join('\n').trimEnd();
|
|
135
|
+
}
|
|
136
|
+
catch {
|
|
137
|
+
return '(log file unavailable)';
|
|
138
|
+
}
|
|
139
|
+
}
|
|
127
140
|
export function getDaemonStatus() {
|
|
128
141
|
const pid = readPidFile();
|
|
129
142
|
if (pid === null || !isProcessAlive(pid)) {
|
package/dist/cli/daemon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/cli/daemon.ts"],"names":[],"mappings":"AAAA,+CAA+C;AAC/C,kDAAkD;AAClD,+CAA+C;AAC/C,EAAE;AACF,iFAAiF;AACjF,6EAA6E;AAC7E,+EAA+E;AAC/E,oEAAoE;AAEpE,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7G,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC;AAC1D,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;AAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAUhD,SAAS,eAAe;IACtB,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,SAAS,WAAW;IAClB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IACvC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAClD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACnD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,gBAAgB;IACvB,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,OAAO,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;AACzC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,WAAW;IACzB,eAAe,EAAE,CAAC;IAElB,MAAM,QAAQ,GAAG,WAAW,EAAE,CAAC;IAC/B,IAAI,QAAQ,KAAK,IAAI,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,qCAAqC,QAAQ,KAAK;YAClD,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtB,6DAA6D;QAC7D,IAAI,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,SAAS,GAAG,gBAAgB,EAAE,CAAC;IACrC,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,EAAE,CAAC,CAAC;IAChE,CAAC;IAED,4EAA4E;IAC5E,4BAA4B;IAC5B,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAEtC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,SAAS,CAAC,EAAE;QACjD,QAAQ,EAAE,IAAI;QACd,KAAK,EAAE,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC;QAC/B,yEAAyE;QACzE,+CAA+C;QAC/C,GAAG,EAAE,OAAO,EAAE;QACd,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,gBAAgB,EAAE,GAAG,EAAE;KAC/C,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,aAAa,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAE5D,sCAAsC;IACtC,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,OAAO,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AAC/C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,SAAS,GAAG,MAAM;IACjD,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAE/B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,kBAAkB;QAClB,IAAI,CAAC;YAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACxC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC;gBAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;YACpD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,IAAI,KAAK,CACb,eAAe,GAAG,yBAAyB,SAAS,MAAM;QAC1D,2FAA2F,CAC5F,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,KAAK,GAAG,EAAE;IACpC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC/C,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IAChE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,wBAAwB,CAAC;IAClC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,MAAM,GAAG,GAAG,WAAW,EAAE,CAAC;IAC1B,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC;QACzC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,aAAiC,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChC,aAAa,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;IAExB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACrF,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAW,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctorHandler.d.ts","sourceRoot":"","sources":["../../src/cli/doctorHandler.ts"],"names":[],"mappings":"AA0CA,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CA4ElD"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// OpenSwarm - `openswarm doctor`
|
|
3
|
+
// Fresh-install self-diagnosis: runtime, native modules, external CLIs,
|
|
4
|
+
// providers, ports, config, Linear. Exits non-zero on critical issues.
|
|
5
|
+
// ============================================
|
|
6
|
+
import { execFile } from 'node:child_process';
|
|
7
|
+
import { promisify } from 'node:util';
|
|
8
|
+
import { createServer } from 'node:net';
|
|
9
|
+
import { listAvailableAdapters } from '../adapters/index.js';
|
|
10
|
+
import { findConfigFile } from '../core/config.js';
|
|
11
|
+
import { banner } from '../support/banner.js';
|
|
12
|
+
import { c } from '../support/colors.js';
|
|
13
|
+
const execFileAsync = promisify(execFile);
|
|
14
|
+
function line(status, label, detail = '') {
|
|
15
|
+
const icon = status === 'ok' ? c.green('✓') : status === 'warn' ? c.yellow('⚠') : c.red('✗');
|
|
16
|
+
console.log(`${icon} ${c.bold(label)}${detail ? ` ${c.dim('—')} ${c.dim(detail)}` : ''}`);
|
|
17
|
+
}
|
|
18
|
+
async function which(bin) {
|
|
19
|
+
try {
|
|
20
|
+
const { stdout } = await execFileAsync('which', [bin]);
|
|
21
|
+
return stdout.trim() || null;
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** True if the TCP port is free to bind on localhost. */
|
|
28
|
+
async function portFree(port) {
|
|
29
|
+
return new Promise((resolve) => {
|
|
30
|
+
const srv = createServer();
|
|
31
|
+
srv.once('error', () => resolve(false));
|
|
32
|
+
srv.once('listening', () => srv.close(() => resolve(true)));
|
|
33
|
+
srv.listen(port, '127.0.0.1');
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
export async function handleDoctor() {
|
|
37
|
+
console.log(banner('doctor — environment check'));
|
|
38
|
+
let fatal = false;
|
|
39
|
+
// 1) Node.js runtime
|
|
40
|
+
const nodeMajor = parseInt(process.versions.node.split('.')[0], 10);
|
|
41
|
+
if (nodeMajor >= 22) {
|
|
42
|
+
line('ok', 'Node.js', process.version);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
line('fail', 'Node.js', `${process.version} — need >= 22`);
|
|
46
|
+
fatal = true;
|
|
47
|
+
}
|
|
48
|
+
// 2) Native modules (prebuilt binaries on common platforms; else build toolchain)
|
|
49
|
+
for (const mod of ['better-sqlite3', '@lancedb/lancedb']) {
|
|
50
|
+
try {
|
|
51
|
+
await import(mod);
|
|
52
|
+
line('ok', `native: ${mod}`, 'loads');
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
line('fail', `native: ${mod}`, 'load failed — install python3 + a C/C++ toolchain, then reinstall');
|
|
56
|
+
fatal = true;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// 3) External CLIs on PATH
|
|
60
|
+
const clis = [
|
|
61
|
+
['codex', 'warn', 'codex provider'],
|
|
62
|
+
['claude', 'warn', 'claude (opt-in) provider'],
|
|
63
|
+
['git', 'warn', 'required for worktree mode / PRs'],
|
|
64
|
+
['gh', 'warn', 'optional — CI monitoring'],
|
|
65
|
+
];
|
|
66
|
+
for (const [bin, missStatus, note] of clis) {
|
|
67
|
+
const path = await which(bin);
|
|
68
|
+
if (path)
|
|
69
|
+
line('ok', `cli: ${bin}`, path);
|
|
70
|
+
else
|
|
71
|
+
line(missStatus, `cli: ${bin}`, `not on PATH (${note})`);
|
|
72
|
+
}
|
|
73
|
+
// 4) LLM providers (env keys + OAuth profiles + PATH binaries + local servers)
|
|
74
|
+
const available = await listAvailableAdapters();
|
|
75
|
+
if (available.length > 0) {
|
|
76
|
+
line('ok', 'providers', available.join(', '));
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
line('fail', 'providers', 'none usable — run `openswarm auth login` (codex/gpt/openrouter) or start a local model');
|
|
80
|
+
fatal = true;
|
|
81
|
+
}
|
|
82
|
+
// 5) Ports (web dashboard + OAuth callbacks)
|
|
83
|
+
const ports = [
|
|
84
|
+
[3847, 'web dashboard'],
|
|
85
|
+
[1455, 'codex OAuth callback'],
|
|
86
|
+
[1456, 'openrouter OAuth callback'],
|
|
87
|
+
[1457, 'linear OAuth callback'],
|
|
88
|
+
];
|
|
89
|
+
for (const [port, use] of ports) {
|
|
90
|
+
const free = await portFree(port);
|
|
91
|
+
line(free ? 'ok' : 'warn', `port ${port}`, free ? `free (${use})` : `in use (${use}) — close the holder before that flow`);
|
|
92
|
+
}
|
|
93
|
+
// 6) Config file resolution (cwd ./config.yaml vs ~/.config/openswarm)
|
|
94
|
+
const cfg = findConfigFile();
|
|
95
|
+
if (cfg)
|
|
96
|
+
line('ok', 'config', cfg);
|
|
97
|
+
else
|
|
98
|
+
line('warn', 'config', 'none found — run `openswarm init` (or set OPENSWARM_CONFIG)');
|
|
99
|
+
// 7) Linear task source (optional)
|
|
100
|
+
const { AuthProfileStore } = await import('../auth/index.js');
|
|
101
|
+
const hasOAuth = !!new AuthProfileStore().getProfile('linear:default');
|
|
102
|
+
const hasKey = !!process.env.LINEAR_API_KEY;
|
|
103
|
+
if (hasOAuth || hasKey)
|
|
104
|
+
line('ok', 'linear', hasOAuth ? 'OAuth profile' : 'API key');
|
|
105
|
+
else
|
|
106
|
+
line('warn', 'linear', 'not configured — local SQLite issue store will be used');
|
|
107
|
+
console.log('');
|
|
108
|
+
if (fatal) {
|
|
109
|
+
console.log(c.red(c.bold('✗ Critical issues found — fix the ✗ items above.')));
|
|
110
|
+
process.exit(1);
|
|
111
|
+
}
|
|
112
|
+
console.log(c.green(c.bold('✓ No critical issues.')));
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=doctorHandler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctorHandler.js","sourceRoot":"","sources":["../../src/cli/doctorHandler.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type ProviderId = 'codex-responses' | 'openrouter' | 'gpt' | 'lmstudio' | 'local' | 'codex' | 'claude';
|
|
2
|
+
type NotifyChannel = 'none' | 'discord' | 'slack' | 'telegram' | 'webhook';
|
|
3
|
+
/** Apply the wizard's choices onto the static sample config via targeted replaces. */
|
|
4
|
+
export declare function buildWizardConfig(adapter: ProviderId, channel: NotifyChannel, agent?: {
|
|
5
|
+
name: string;
|
|
6
|
+
projectPath: string;
|
|
7
|
+
}): string;
|
|
8
|
+
export interface InitWizardOptions {
|
|
9
|
+
force?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare function runInitWizard(opts?: InitWizardOptions): Promise<void>;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=initWizard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"initWizard.d.ts","sourceRoot":"","sources":["../../src/cli/initWizard.ts"],"names":[],"mappings":"AAuBA,KAAK,UAAU,GAAG,iBAAiB,GAAG,YAAY,GAAG,KAAK,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAC;AAEvG,KAAK,aAAa,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,GAAG,SAAS,CAAC;AA2B3E,sFAAsF;AACtF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,UAAU,EACnB,OAAO,EAAE,aAAa,EACtB,KAAK,CAAC,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GAC5C,MAAM,CAsBR;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AA+JD,wBAAsB,aAAa,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkH/E"}
|
|
@@ -0,0 +1,334 @@
|
|
|
1
|
+
// ============================================
|
|
2
|
+
// OpenSwarm - First-run onboarding wizard
|
|
3
|
+
// `openswarm init` (interactive). INT-1578 / INT-1808.
|
|
4
|
+
// ============================================
|
|
5
|
+
//
|
|
6
|
+
// Walks a fresh user through: AI provider (availability detection + inline
|
|
7
|
+
// auth), task backend (Linear with an arrow-key team/project picker, or local
|
|
8
|
+
// SQLite), and an optional notification channel. Writes a .env (secrets, 0600)
|
|
9
|
+
// + config.yaml + an openswarm.json repo→Linear mapping, then prints next steps.
|
|
10
|
+
// `--yes` keeps the config-only path for CI (handled by the caller in cli.ts).
|
|
11
|
+
import { existsSync, writeFileSync, lstatSync, realpathSync } from 'node:fs';
|
|
12
|
+
import { basename, join } from 'node:path';
|
|
13
|
+
import { homedir } from 'node:os';
|
|
14
|
+
import { select, input, password, confirm } from '@inquirer/prompts';
|
|
15
|
+
import { writeEnvVars } from '../core/envFile.js';
|
|
16
|
+
import { generateSampleConfig } from '../core/config.js';
|
|
17
|
+
import { AuthProfileStore, loginAndSaveLinearProfile, ensureValidToken } from '../auth/index.js';
|
|
18
|
+
import { getAdapter } from '../adapters/index.js';
|
|
19
|
+
import { listTeams, listProjects } from '../linear/index.js';
|
|
20
|
+
import { saveRepoMetadata } from '../support/repoMetadata.js';
|
|
21
|
+
import { banner } from '../support/banner.js';
|
|
22
|
+
const PROVIDER_CHOICES = [
|
|
23
|
+
{ name: 'codex-responses', value: 'codex-responses', description: 'ChatGPT subscription (OAuth) — Codex models, native loop' },
|
|
24
|
+
{ name: 'codex', value: 'codex', description: 'External codex CLI (delegated)' },
|
|
25
|
+
{ name: 'openrouter', value: 'openrouter', description: 'OpenRouter API key or OAuth (any model)' },
|
|
26
|
+
{ name: 'gpt', value: 'gpt', description: 'OpenAI ChatGPT OAuth (chat/completions)' },
|
|
27
|
+
{ name: 'claude', value: 'claude', description: 'Claude Code CLI (claude -p) — opt-in fallback' },
|
|
28
|
+
{ name: 'lmstudio', value: 'lmstudio', description: 'Local LM Studio server (no account)' },
|
|
29
|
+
{ name: 'local', value: 'local', description: 'Local Ollama models (no account)' },
|
|
30
|
+
];
|
|
31
|
+
const NOTIFY_CHOICES = [
|
|
32
|
+
{ name: 'none', value: 'none', description: 'No outbound notifications' },
|
|
33
|
+
{ name: 'discord', value: 'discord', description: 'Discord bot token + channel id' },
|
|
34
|
+
{ name: 'slack', value: 'slack', description: 'Slack incoming webhook URL' },
|
|
35
|
+
{ name: 'telegram', value: 'telegram', description: 'Telegram bot token + chat id' },
|
|
36
|
+
{ name: 'webhook', value: 'webhook', description: 'Generic webhook URL' },
|
|
37
|
+
];
|
|
38
|
+
/** ChatGPT-OAuth providers share the openai-gpt profile; openrouter has its own. */
|
|
39
|
+
function authPlanFor(provider) {
|
|
40
|
+
if (provider === 'codex-responses' || provider === 'gpt')
|
|
41
|
+
return { providerArg: 'gpt', profileKey: 'openai-gpt:default' };
|
|
42
|
+
if (provider === 'openrouter')
|
|
43
|
+
return { providerArg: 'openrouter', profileKey: 'openrouter:default' };
|
|
44
|
+
return null; // lmstudio / local / codex / claude need no OAuth here
|
|
45
|
+
}
|
|
46
|
+
/** Apply the wizard's choices onto the static sample config via targeted replaces. */
|
|
47
|
+
export function buildWizardConfig(adapter, channel, agent) {
|
|
48
|
+
let cfg = generateSampleConfig();
|
|
49
|
+
cfg = cfg.replace(/^adapter: codex$/m, `adapter: ${adapter}`);
|
|
50
|
+
cfg = cfg.replace(/^ {2}channel: discord$/m, ` channel: ${channel === 'none' ? 'none' : channel}`);
|
|
51
|
+
// Replace the sample's placeholder agents (main/backend) with a single agent
|
|
52
|
+
// for THIS repo so the user doesn't have to hand-edit projectPath.
|
|
53
|
+
if (agent) {
|
|
54
|
+
cfg = cfg.replace(/agents:\n[\s\S]*?\n\n(# Default heartbeat)/, `agents:\n - name: ${agent.name}\n projectPath: ${agent.projectPath}\n heartbeatInterval: 1800000\n enabled: true\n paused: false\n\n$1`);
|
|
55
|
+
}
|
|
56
|
+
const uncomment = (field) => {
|
|
57
|
+
cfg = cfg.replace(` # ${field}:`, ` ${field}:`);
|
|
58
|
+
};
|
|
59
|
+
if (channel === 'slack')
|
|
60
|
+
uncomment('slackWebhookUrl');
|
|
61
|
+
if (channel === 'telegram') {
|
|
62
|
+
uncomment('telegramBotToken');
|
|
63
|
+
uncomment('telegramChatId');
|
|
64
|
+
}
|
|
65
|
+
if (channel === 'webhook')
|
|
66
|
+
uncomment('webhookUrl');
|
|
67
|
+
return cfg;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Provider bootstrap. `adapter.isAvailable()` is the canonical "already
|
|
71
|
+
* configured?" probe — it covers env keys, OAuth profiles, PATH binaries, and
|
|
72
|
+
* local servers (the old wizard only checked OAuth profiles). When not available,
|
|
73
|
+
* branch on how to set the provider up. Returns whether to run inline OAuth after
|
|
74
|
+
* the wizard, plus the auth plan.
|
|
75
|
+
*/
|
|
76
|
+
async function bootstrapProvider(provider) {
|
|
77
|
+
let available = false;
|
|
78
|
+
try {
|
|
79
|
+
available = await getAdapter(provider).isAvailable();
|
|
80
|
+
}
|
|
81
|
+
catch { // cxt-ignore: error_swallow,exception_hiding — unknown/unconfigured provider treated as unavailable
|
|
82
|
+
available = false;
|
|
83
|
+
}
|
|
84
|
+
if (provider === 'claude') {
|
|
85
|
+
// claude = the `claude -p` CLI wrapper; isAvailable() is just `which claude`.
|
|
86
|
+
// PATH presence ≠ logged in, so guide explicitly instead of claiming "configured".
|
|
87
|
+
if (available)
|
|
88
|
+
console.log(' ✓ `claude` on PATH. If not logged in yet, run `claude` once to authenticate.');
|
|
89
|
+
else
|
|
90
|
+
console.log(' `claude` not found. Install: npm i -g @anthropic-ai/claude-code, then run `claude` to log in.');
|
|
91
|
+
return { doAuthNow: false, plan: null };
|
|
92
|
+
}
|
|
93
|
+
if (available) {
|
|
94
|
+
console.log(` ✓ ${provider} already configured.`);
|
|
95
|
+
return { doAuthNow: false, plan: authPlanFor(provider) };
|
|
96
|
+
}
|
|
97
|
+
if (provider === 'codex') {
|
|
98
|
+
console.log(' `codex` not found. Install the OpenAI Codex CLI and ensure `codex` is on PATH.');
|
|
99
|
+
return { doAuthNow: false, plan: null };
|
|
100
|
+
}
|
|
101
|
+
if (provider === 'lmstudio' || provider === 'local') {
|
|
102
|
+
console.log(` No ${provider} server detected — start it (LM Studio :1234 / Ollama :11434) before running.`);
|
|
103
|
+
return { doAuthNow: false, plan: null };
|
|
104
|
+
}
|
|
105
|
+
const plan = authPlanFor(provider);
|
|
106
|
+
if (plan) {
|
|
107
|
+
const doAuthNow = await confirm({
|
|
108
|
+
message: ` ${provider} needs login — run \`auth login --provider ${plan.providerArg}\` now?`,
|
|
109
|
+
default: true,
|
|
110
|
+
});
|
|
111
|
+
return { doAuthNow, plan };
|
|
112
|
+
}
|
|
113
|
+
return { doAuthNow: false, plan: null };
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Interactive Linear setup: paste API key → arrow-key pick teams (multi) → pick
|
|
117
|
+
* THIS repo's project → write LINEAR_* env + an openswarm.json mapping so the
|
|
118
|
+
* daemon resolves this repo without fuzzy name matching. Falls back to manual
|
|
119
|
+
* team-id entry if the Linear API can't be reached.
|
|
120
|
+
*/
|
|
121
|
+
async function setupLinear(envVars, cwd) {
|
|
122
|
+
// OAuth (browser, no key to paste) vs personal API key.
|
|
123
|
+
const method = await select({
|
|
124
|
+
message: ' Linear authentication:',
|
|
125
|
+
choices: [
|
|
126
|
+
{ name: 'OAuth (browser login)', value: 'oauth', description: 'no API key to paste — recommended' },
|
|
127
|
+
{ name: 'API key (paste)', value: 'apikey', description: 'personal key from linear.app/settings/api' },
|
|
128
|
+
],
|
|
129
|
+
});
|
|
130
|
+
let cred;
|
|
131
|
+
if (method === 'oauth') {
|
|
132
|
+
try {
|
|
133
|
+
const authStore = new AuthProfileStore();
|
|
134
|
+
let token;
|
|
135
|
+
if (authStore.getProfile('linear:default')) {
|
|
136
|
+
token = await ensureValidToken(authStore, 'linear:default'); // reuse — no browser
|
|
137
|
+
console.log(' ✓ Reusing existing Linear OAuth profile.');
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
token = await loginAndSaveLinearProfile(); // browser PKCE → linear:default profile
|
|
141
|
+
}
|
|
142
|
+
cred = { accessToken: token };
|
|
143
|
+
}
|
|
144
|
+
catch (err) { // cxt-ignore: error_swallow,exception_hiding — OAuth failure → API-key fallback
|
|
145
|
+
console.log(` ⚠ Linear OAuth failed (${err.message}). Falling back to API key.`);
|
|
146
|
+
const apiKey = (await password({ message: ' LINEAR_API_KEY (hidden):' })).trim();
|
|
147
|
+
if (!apiKey) {
|
|
148
|
+
console.log(' Skipped Linear (no key).');
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
envVars.LINEAR_API_KEY = apiKey;
|
|
152
|
+
cred = { apiKey };
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
else {
|
|
156
|
+
console.log(' Get a key at https://linear.app/settings/api');
|
|
157
|
+
const apiKey = (await password({ message: ' LINEAR_API_KEY (hidden):' })).trim();
|
|
158
|
+
if (!apiKey) {
|
|
159
|
+
console.log(' Skipped Linear (no key).');
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
envVars.LINEAR_API_KEY = apiKey;
|
|
163
|
+
cred = { apiKey };
|
|
164
|
+
}
|
|
165
|
+
let teams = [];
|
|
166
|
+
try {
|
|
167
|
+
teams = await listTeams(cred);
|
|
168
|
+
}
|
|
169
|
+
catch (err) { // cxt-ignore: error_swallow,exception_hiding — surfaced to the user + manual team-id fallback
|
|
170
|
+
console.log(` ⚠ Could not fetch teams (${err.message}). Enter the team id manually.`);
|
|
171
|
+
}
|
|
172
|
+
if (teams.length === 0) {
|
|
173
|
+
const tid = (await input({ message: ' LINEAR_TEAM_ID:' })).trim();
|
|
174
|
+
if (tid)
|
|
175
|
+
envVars.LINEAR_TEAM_ID = tid;
|
|
176
|
+
return;
|
|
177
|
+
}
|
|
178
|
+
// One repo = one team. (Multi-team daemon watch lives in the main
|
|
179
|
+
// ~/.config/openswarm config, not per-repo init — keeps this picker simple.)
|
|
180
|
+
const mapTeamId = await select({
|
|
181
|
+
message: ` Linear team for "${basename(cwd)}":`,
|
|
182
|
+
choices: teams.map((t) => ({ name: `${t.key} — ${t.name}`, value: t.id })),
|
|
183
|
+
});
|
|
184
|
+
envVars.LINEAR_TEAM_ID = mapTeamId;
|
|
185
|
+
let projects = [];
|
|
186
|
+
try {
|
|
187
|
+
projects = await listProjects(mapTeamId, cred);
|
|
188
|
+
}
|
|
189
|
+
catch (err) { // cxt-ignore: error_swallow,exception_hiding — surfaced to the user; repo mapping skipped
|
|
190
|
+
console.log(` ⚠ Could not fetch projects (${err.message}).`);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
if (projects.length === 0) {
|
|
194
|
+
console.log(' No projects in that team — skipping repo mapping.');
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const repoName = basename(cwd);
|
|
198
|
+
const projectId = await select({
|
|
199
|
+
message: ` Linear project for "${repoName}":`,
|
|
200
|
+
choices: [
|
|
201
|
+
{ name: '(skip — no repo mapping)', value: '' },
|
|
202
|
+
...projects.map((p) => ({ name: p.name, value: p.id })),
|
|
203
|
+
],
|
|
204
|
+
});
|
|
205
|
+
if (!projectId)
|
|
206
|
+
return;
|
|
207
|
+
const proj = projects.find((p) => p.id === projectId);
|
|
208
|
+
const team = teams.find((t) => t.id === mapTeamId);
|
|
209
|
+
const filePath = await saveRepoMetadata(cwd, {
|
|
210
|
+
schemaVersion: 1,
|
|
211
|
+
projectName: proj?.name,
|
|
212
|
+
linear: {
|
|
213
|
+
teamId: mapTeamId,
|
|
214
|
+
teamKey: team?.key,
|
|
215
|
+
projectId,
|
|
216
|
+
projectName: proj?.name,
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
console.log(` Wrote ${filePath} → ${team?.key ?? '?'}/${proj?.name ?? projectId}`);
|
|
220
|
+
}
|
|
221
|
+
export async function runInitWizard(opts = {}) {
|
|
222
|
+
const cwd = process.cwd();
|
|
223
|
+
const configPath = join(cwd, 'config.yaml');
|
|
224
|
+
const envPath = join(cwd, '.env');
|
|
225
|
+
if (existsSync(configPath)) {
|
|
226
|
+
// Guard: if cwd/config.yaml is a symlink into the daemon's global config
|
|
227
|
+
// (~/.config/openswarm), `init` here would clobber the running daemon's
|
|
228
|
+
// settings (agents, allowedProjects, …). Refuse even with --force.
|
|
229
|
+
let symlinkTarget = null;
|
|
230
|
+
try {
|
|
231
|
+
if (lstatSync(configPath).isSymbolicLink())
|
|
232
|
+
symlinkTarget = realpathSync(configPath);
|
|
233
|
+
}
|
|
234
|
+
catch {
|
|
235
|
+
symlinkTarget = null; // cxt-ignore: error_swallow — stat failure → treat as a plain file
|
|
236
|
+
}
|
|
237
|
+
if (symlinkTarget && symlinkTarget.startsWith(join(homedir(), '.config', 'openswarm'))) {
|
|
238
|
+
console.error(`config.yaml is a symlink to the daemon's global config:\n ${symlinkTarget}`);
|
|
239
|
+
console.error('Running `init` here would overwrite your running daemon configuration.');
|
|
240
|
+
console.error('Run init in a different repo, or edit the daemon config directly.');
|
|
241
|
+
process.exit(1);
|
|
242
|
+
}
|
|
243
|
+
if (!opts.force) {
|
|
244
|
+
console.error('config.yaml already exists. Use --force to overwrite, or edit it directly.');
|
|
245
|
+
process.exit(1);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
const envVars = {};
|
|
249
|
+
let provider = 'codex';
|
|
250
|
+
let taskBackend = 'local';
|
|
251
|
+
let notify = 'none';
|
|
252
|
+
let doAuthNow = false;
|
|
253
|
+
let plan = null;
|
|
254
|
+
try {
|
|
255
|
+
console.log(banner('first-run setup'));
|
|
256
|
+
// 1) AI provider
|
|
257
|
+
provider = await select({
|
|
258
|
+
message: '1) AI provider for worker/reviewer:',
|
|
259
|
+
choices: PROVIDER_CHOICES.map((c) => ({ name: c.name, value: c.value, description: c.description })),
|
|
260
|
+
});
|
|
261
|
+
({ doAuthNow, plan } = await bootstrapProvider(provider));
|
|
262
|
+
// 2) Task backend
|
|
263
|
+
taskBackend = await select({
|
|
264
|
+
message: '\n2) Task backend:',
|
|
265
|
+
choices: [
|
|
266
|
+
{ name: 'local', value: 'local', description: 'Local SQLite issue store (~/.openswarm/issues.db) — no account' },
|
|
267
|
+
{ name: 'linear', value: 'linear', description: 'Linear (arrow-key team/project picker)' },
|
|
268
|
+
],
|
|
269
|
+
});
|
|
270
|
+
if (taskBackend === 'linear')
|
|
271
|
+
await setupLinear(envVars, cwd);
|
|
272
|
+
// 3) Notification channel
|
|
273
|
+
notify = await select({
|
|
274
|
+
message: '\n3) Notification channel (optional):',
|
|
275
|
+
choices: NOTIFY_CHOICES.map((c) => ({ name: c.name, value: c.value, description: c.description })),
|
|
276
|
+
});
|
|
277
|
+
if (notify === 'discord') {
|
|
278
|
+
envVars.DISCORD_TOKEN = (await password({ message: ' DISCORD_TOKEN (hidden):' })).trim();
|
|
279
|
+
envVars.DISCORD_CHANNEL_ID = (await input({ message: ' DISCORD_CHANNEL_ID:' })).trim();
|
|
280
|
+
}
|
|
281
|
+
else if (notify === 'slack') {
|
|
282
|
+
envVars.SLACK_WEBHOOK_URL = (await input({ message: ' SLACK_WEBHOOK_URL:' })).trim();
|
|
283
|
+
}
|
|
284
|
+
else if (notify === 'telegram') {
|
|
285
|
+
envVars.TELEGRAM_BOT_TOKEN = (await password({ message: ' TELEGRAM_BOT_TOKEN (hidden):' })).trim();
|
|
286
|
+
envVars.TELEGRAM_CHAT_ID = (await input({ message: ' TELEGRAM_CHAT_ID:' })).trim();
|
|
287
|
+
}
|
|
288
|
+
else if (notify === 'webhook') {
|
|
289
|
+
envVars.NOTIFY_WEBHOOK_URL = (await input({ message: ' NOTIFY_WEBHOOK_URL:' })).trim();
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
catch (err) {
|
|
293
|
+
// @inquirer throws ExitPromptError on Ctrl-C — exit cleanly, no stack trace.
|
|
294
|
+
if (err instanceof Error && err.name === 'ExitPromptError') {
|
|
295
|
+
console.log('\nSetup cancelled.');
|
|
296
|
+
return;
|
|
297
|
+
}
|
|
298
|
+
throw err;
|
|
299
|
+
}
|
|
300
|
+
// Drop empty answers so we never write `KEY=` for a skipped field.
|
|
301
|
+
for (const k of Object.keys(envVars)) {
|
|
302
|
+
if (!envVars[k])
|
|
303
|
+
delete envVars[k];
|
|
304
|
+
}
|
|
305
|
+
// Write .env (secrets) + config.yaml.
|
|
306
|
+
if (Object.keys(envVars).length > 0) {
|
|
307
|
+
writeEnvVars(envPath, envVars);
|
|
308
|
+
console.log(`\nWrote ${envPath} (${Object.keys(envVars).join(', ')}) — chmod 600.`);
|
|
309
|
+
}
|
|
310
|
+
writeFileSync(configPath, buildWizardConfig(provider, notify, { name: basename(cwd), projectPath: cwd }), 'utf-8');
|
|
311
|
+
console.log(`Wrote ${configPath}.`);
|
|
312
|
+
// Inline auth last (browser OAuth) — after all prompts.
|
|
313
|
+
if (doAuthNow && plan) {
|
|
314
|
+
console.log(`\nLaunching login for ${plan.providerArg}...`);
|
|
315
|
+
const { handleAuthLogin } = await import('./authHandler.js');
|
|
316
|
+
await handleAuthLogin(plan.providerArg, {});
|
|
317
|
+
}
|
|
318
|
+
// Next steps.
|
|
319
|
+
console.log('\nNext steps:');
|
|
320
|
+
console.log(' 1. Edit config.yaml — set your project path(s) under `agents:`.');
|
|
321
|
+
if (plan && !doAuthNow) {
|
|
322
|
+
const store = new AuthProfileStore();
|
|
323
|
+
if (store.getProfile(plan.profileKey) === null) {
|
|
324
|
+
console.log(` 2. Authenticate: openswarm auth login --provider ${plan.providerArg}`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
console.log(' • Diagnose: openswarm doctor (verify providers, native deps, ports, config)');
|
|
328
|
+
console.log(' • Validate: openswarm validate');
|
|
329
|
+
console.log(' • Start: openswarm start (or `openswarm` for the TUI)');
|
|
330
|
+
if (taskBackend === 'local') {
|
|
331
|
+
console.log(' • Task backend: local SQLite (~/.openswarm/issues.db) — no Linear account needed.');
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
//# sourceMappingURL=initWizard.js.map
|