@xdevops/issue-auto-finish 1.0.77 → 1.0.79
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/dist/{analyze-IZFTWCNR.js → analyze-MIYHVC2A.js} +2 -2
- package/dist/{braindump-SXLAURR4.js → braindump-JNET2EEP.js} +2 -2
- package/dist/{chunk-KWOM6URK.js → chunk-IPPYFU3R.js} +26 -4
- package/dist/chunk-IPPYFU3R.js.map +1 -0
- package/dist/{chunk-OOJNTGB5.js → chunk-PNTEPUOH.js} +2 -2
- package/dist/chunk-PNTEPUOH.js.map +1 -0
- package/dist/{chunk-NBX5LNCU.js → chunk-PRGM6ELE.js} +3 -3
- package/dist/{chunk-JL6ALTPS.js → chunk-RJUOVI3J.js} +5 -5
- package/dist/{chunk-VYNKAT4P.js → chunk-UAINLCSR.js} +2 -2
- package/dist/{chunk-MC7YPVJG.js → chunk-UWLXEZSL.js} +39 -17
- package/dist/{chunk-MC7YPVJG.js.map → chunk-UWLXEZSL.js.map} +1 -1
- package/dist/cli.js +6 -6
- package/dist/{config-LLOHFS6J.js → config-E7XKQUSH.js} +2 -2
- package/dist/deploy/DevServerManager.d.ts +2 -0
- package/dist/deploy/DevServerManager.d.ts.map +1 -1
- package/dist/index.js +5 -5
- package/dist/{init-EQWSE5FX.js → init-E4KZDZE2.js} +4 -4
- package/dist/lib.js +2 -2
- package/dist/orchestrator/steps/FailureHandler.d.ts.map +1 -1
- package/dist/{restart-24AKNL74.js → restart-P5N2UBPL.js} +4 -4
- package/dist/run.js +5 -5
- package/dist/{start-YUT6GSVS.js → start-HWPRQPH7.js} +4 -4
- package/package.json +1 -1
- package/dist/chunk-KWOM6URK.js.map +0 -1
- package/dist/chunk-OOJNTGB5.js.map +0 -1
- /package/dist/{analyze-IZFTWCNR.js.map → analyze-MIYHVC2A.js.map} +0 -0
- /package/dist/{braindump-SXLAURR4.js.map → braindump-JNET2EEP.js.map} +0 -0
- /package/dist/{chunk-NBX5LNCU.js.map → chunk-PRGM6ELE.js.map} +0 -0
- /package/dist/{chunk-JL6ALTPS.js.map → chunk-RJUOVI3J.js.map} +0 -0
- /package/dist/{chunk-VYNKAT4P.js.map → chunk-UAINLCSR.js.map} +0 -0
- /package/dist/{config-LLOHFS6J.js.map → config-E7XKQUSH.js.map} +0 -0
- /package/dist/{init-EQWSE5FX.js.map → init-E4KZDZE2.js.map} +0 -0
- /package/dist/{restart-24AKNL74.js.map → restart-P5N2UBPL.js.map} +0 -0
- /package/dist/{start-YUT6GSVS.js.map → start-HWPRQPH7.js.map} +0 -0
|
@@ -99,7 +99,7 @@ var envSchema = z.object({
|
|
|
99
99
|
PREVIEW_ENABLED: envBoolean("false"),
|
|
100
100
|
PREVIEW_HOST: z.string().optional().default(""),
|
|
101
101
|
PREVIEW_TTL_MS: envMs(String(24 * 60 * 60 * 1e3)),
|
|
102
|
-
PREVIEW_KEEP_AFTER_COMPLETE: envBoolean("
|
|
102
|
+
PREVIEW_KEEP_AFTER_COMPLETE: envBoolean("false"),
|
|
103
103
|
PREVIEW_REAP_INTERVAL_MS: envMs("300000"),
|
|
104
104
|
// --- Brainstorm ---
|
|
105
105
|
BRAINSTORM_ENABLED: envBoolean("false"),
|
|
@@ -428,4 +428,4 @@ export {
|
|
|
428
428
|
resetDotenvCache,
|
|
429
429
|
reloadConfig
|
|
430
430
|
};
|
|
431
|
-
//# sourceMappingURL=chunk-
|
|
431
|
+
//# sourceMappingURL=chunk-PNTEPUOH.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/config.ts","../src/config-schema.ts"],"sourcesContent":["import { config as loadDotenv } from 'dotenv';\nimport path from 'node:path';\nimport fs from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport {\n envSchema,\n extractEnvSubset,\n transformEnvToConfig,\n ConfigValidationError,\n} from './config-schema.js';\nimport { getGlobalDir } from './paths.js';\n\nexport type {\n Config,\n AIRunnerMode,\n BrainstormAgentConfig,\n ChatAgentConfig,\n // Sub-type aliases for interface segregation\n GongfengConfig,\n ProjectConfig,\n AIConfig,\n PollConfig,\n PipelineConfig,\n ReviewConfig,\n WebConfig,\n IssueNoteSyncConfig,\n WebhookConfig,\n E2eConfig,\n PreviewConfig,\n BrainstormConfig,\n ChatConfig,\n BraindumpConfig,\n AutoUpdateConfig,\n IWikiConfig,\n KnowledgeConfig,\n DistillConfig,\n SyncConfig,\n WorkspaceEnvConfig,\n} from './config-schema.js';\nexport { ConfigValidationError } from './config-schema.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n/**\n * Resolve the path to the .env configuration file.\n *\n * Priority (first match wins):\n * 1. Explicit `configPath` argument (e.g. --config CLI flag)\n * 2. `IAF_CONFIG_PATH` environment variable\n * 3. Source-mode: `.env` next to compiled output (`dist/../.env`)\n * 4. Global config written by `issue-auto-finish init` (`{IAF_HOME}/.env`)\n * 5. CWD `.env` (legacy / manual setup)\n * 6. Fallback: global path (even if it doesn't exist yet)\n *\n * `IAF_HOME` defaults to `~/.issue-auto-finish` and can be overridden via env.\n *\n * This is the **single source of truth** for .env path resolution.\n * CLI commands and route handlers should call this instead of\n * rolling their own lookup logic.\n */\nexport function resolveConfigFilePath(configPath?: string): string {\n if (configPath) return configPath;\n if (process.env.IAF_CONFIG_PATH) return process.env.IAF_CONFIG_PATH;\n\n // Source-mode: .env next to the compiled output\n const localEnv = path.resolve(__dirname, '../.env');\n if (fs.existsSync(localEnv)) return localEnv;\n\n // Global config written by `issue-auto-finish init`\n // Checked before CWD to avoid picking up unrelated project .env files\n const globalEnv = path.join(getGlobalDir(), '.env');\n if (fs.existsSync(globalEnv)) return globalEnv;\n\n // Fallback: CWD .env (legacy / manual setup)\n const cwdEnv = path.resolve(process.cwd(), '.env');\n if (fs.existsSync(cwdEnv)) return cwdEnv;\n\n return globalEnv;\n}\n\nlet _dotenvLoaded = false;\nfunction ensureDotenvLoaded(): void {\n if (_dotenvLoaded) return;\n _dotenvLoaded = true;\n loadDotenv({ path: resolveConfigFilePath() });\n}\n\nexport function loadConfig() {\n ensureDotenvLoaded();\n\n const subset = extractEnvSubset(process.env);\n const result = envSchema.safeParse(subset);\n\n if (!result.success) {\n throw new ConfigValidationError(result.error);\n }\n\n return transformEnvToConfig(result.data, __dirname);\n}\n\n/**\n * Reset dotenv cache so the next loadConfig() re-reads the .env file.\n */\nexport function resetDotenvCache(): void {\n _dotenvLoaded = false;\n}\n\n/**\n * Reload config from .env file.\n * Clears dotenv cache, removes stale IAF env vars from process.env,\n * then re-reads and re-parses everything.\n */\nexport function reloadConfig() {\n resetDotenvCache();\n // Clear process.env of IAF-related keys so dotenv can overwrite them\n const iafKeys = extractEnvSubset(process.env);\n for (const key of Object.keys(iafKeys)) {\n delete process.env[key];\n }\n return loadConfig();\n}\n","/**\n * Zod-based configuration schema and transformation layer.\n *\n * Architecture:\n * process.env → extractEnvSubset() → envSchema.safeParse() → transformEnvToConfig() → Config\n *\n * The schema is kept flat (keys = env var names) so that validation errors\n * directly reference environment variable names without extra mapping.\n */\nimport { z } from 'zod';\nimport { getDefaultBinary, getBinaryEnvKey } from './ai-runner/AIRunnerRegistry.js';\nimport { getLocalIP } from './utils/network.js';\nimport path from 'node:path';\n\n// ---------------------------------------------------------------------------\n// Reusable zod helpers\n// ---------------------------------------------------------------------------\n\n/** Boolean env var: only `'true'` (case-sensitive) is truthy. */\nfunction envBoolean(defaultValue: string = 'false') {\n return z\n .string()\n .optional()\n .default(defaultValue)\n .transform((v) => v === 'true');\n}\n\n/** Integer env var with optional min/max bounds. */\nfunction envInt(defaultValue: string, opts?: { min?: number; max?: number }) {\n let schema = z.coerce.number().int();\n if (opts?.min !== undefined) schema = schema.min(opts.min);\n if (opts?.max !== undefined) schema = schema.max(opts.max);\n return schema.optional().default(Number(defaultValue));\n}\n\n/** Port number: integer 1–65535. */\nfunction envPort(defaultValue: string) {\n return z.coerce\n .number()\n .int()\n .min(1, 'Port must be >= 1')\n .max(65535, 'Port must be <= 65535')\n .optional()\n .default(Number(defaultValue));\n}\n\n/** Millisecond duration: integer >= 1000. */\nfunction envMs(defaultValue: string) {\n return z.coerce\n .number()\n .int()\n .min(1000, 'Duration must be >= 1000ms')\n .optional()\n .default(Number(defaultValue));\n}\n\n// ---------------------------------------------------------------------------\n// Flat environment schema\n// ---------------------------------------------------------------------------\n\nexport const envSchema = z.object({\n // --- Required ---\n GONGFENG_API_URL: z.string().url('GONGFENG_API_URL must be a valid URL'),\n GONGFENG_PRIVATE_TOKEN: z.string().min(1, 'GONGFENG_PRIVATE_TOKEN is required'),\n GONGFENG_PROJECT_PATH: z.string().min(1, 'GONGFENG_PROJECT_PATH is required'),\n PROJECT_WORK_DIR: z.string().min(1, 'PROJECT_WORK_DIR is required'),\n\n // --- Paths (override auto-detected data/logs directories) ---\n DATA_DIR: z.string().optional(),\n LOGS_DIR: z.string().optional(),\n\n // --- Project ---\n GIT_ROOT_DIR: z.string().optional(),\n BASE_BRANCH: z.string().optional().default('master'),\n BRANCH_PREFIX: z.string().optional().default('feat/issue'),\n WORKTREE_BASE_DIR: z.string().optional().default(''),\n PROJECT_SUBDIR: z.string().optional().default(''),\n\n // --- AI ---\n AI_RUNNER_MODE: z\n .string()\n .optional()\n .default('claude-internal'),\n AI_MODEL: z.string().optional().default('Claude-4.6-Opus'),\n CLAUDE_BINARY: z.string().optional(),\n CURSOR_BINARY: z.string().optional(),\n CODEBUDDY_BINARY: z.string().optional(),\n CODEBUDDY_ACP_AUTO_APPROVE: envBoolean('true'),\n CLAUDE_PHASE_TIMEOUT_MS: envMs('1800000'),\n AI_IDLE_TIMEOUT_MS: z.coerce\n .number()\n .int()\n .min(0, 'AI_IDLE_TIMEOUT_MS must be >= 0 (0 to disable)')\n .optional()\n .default(1200000),\n NVM_NODE_VERSION: z.string().optional().default('20'),\n\n // --- Pipeline ---\n PIPELINE_MODE: z\n .string()\n .optional()\n .default('auto'),\n\n // --- Poll ---\n POLL_DISCOVERY_INTERVAL_MS: envMs('60000'),\n POLL_DRIVE_INTERVAL_MS: envMs('15000'),\n MAX_RETRIES: envInt('3', { min: 0, max: 100 }),\n MAX_CONCURRENT_ISSUES: envInt('3', { min: 1 }),\n\n // --- Review ---\n REVIEW_ENABLED: envBoolean('true'),\n REVIEW_AUTO_APPROVE_LABELS: z.string().optional().default(''),\n\n // --- Web ---\n WEB_ENABLED: envBoolean('true'),\n WEB_HOST: z.string().optional().default('0.0.0.0'),\n WEB_PORT: envPort('3000'),\n FRONTEND_DIST_DIR: z.string().optional(),\n\n // --- Issue Note Sync ---\n ISSUE_NOTE_SYNC_ENABLED: envBoolean('true'),\n WEB_BASE_URL: z.string().optional(),\n\n // --- Webhook ---\n WEBHOOK_ENABLED: envBoolean('false'),\n WEBHOOK_HOST: z.string().optional().default('0.0.0.0'),\n WEBHOOK_PORT: envPort('8081'),\n WEBHOOK_SECRET: z.string().optional().default(''),\n WEBHOOK_LLM_FALLBACK: envBoolean('true'),\n WEBHOOK_LLM_BINARY: z.string().optional().default('claude-internal'),\n\n // --- E2E ---\n E2E_UI_ENABLED: envBoolean('false'),\n E2E_BASE_URL: z.string().optional().default('https://localhost:8890'),\n E2E_BACKEND_URL: z.string().optional().default('http://127.0.0.1:3000'),\n E2E_AUTH_COOKIES: z.string().optional().default('[]'),\n E2E_BACKEND_PORT_BASE: envPort('4000'),\n E2E_FRONTEND_PORT_BASE: envPort('9000'),\n E2E_UAT_VENDOR_DIR: z.string().optional().default(''),\n E2E_UAT_CONFIG_FILE: z.string().optional().default(''),\n E2E_PYTHON_BIN: z.string().optional().default('python3'),\n E2E_AI_RUNNER_MODE: z.string().optional().default('codebuddy'),\n E2E_AI_MODEL: z.string().optional(),\n\n // --- Preview ---\n PREVIEW_ENABLED: envBoolean('false'),\n PREVIEW_HOST: z.string().optional().default(''),\n PREVIEW_TTL_MS: envMs(String(24 * 60 * 60 * 1000)),\n PREVIEW_KEEP_AFTER_COMPLETE: envBoolean('false'),\n PREVIEW_REAP_INTERVAL_MS: envMs('300000'),\n\n // --- Brainstorm ---\n BRAINSTORM_ENABLED: envBoolean('false'),\n BRAINSTORM_MAX_ROUNDS: envInt('5', { min: 1, max: 20 }),\n BRAINSTORM_TIMEOUT_MS: envMs('600000'),\n BRAINSTORM_GENERATOR_MODE: z\n .string()\n .optional(),\n BRAINSTORM_GENERATOR_BINARY: z.string().optional(),\n BRAINSTORM_GENERATOR_MODEL: z.string().optional(),\n BRAINSTORM_REVIEWER_MODE: z\n .string()\n .optional(),\n BRAINSTORM_REVIEWER_BINARY: z.string().optional(),\n BRAINSTORM_REVIEWER_MODEL: z.string().optional(),\n\n // --- Chat ---\n CHAT_ENABLED: envBoolean('false'),\n CHAT_TIMEOUT_MS: envMs('300000'),\n CHAT_MAX_SESSION_MESSAGES: envInt('100', { min: 1 }),\n CHAT_AGENT_MODE: z\n .string()\n .optional(),\n CHAT_AGENT_BINARY: z.string().optional(),\n CHAT_AGENT_MODEL: z.string().optional(),\n\n // --- Braindump ---\n BRAINDUMP_ENABLED: envBoolean('false'),\n BRAINDUMP_MAX_CONCURRENT: z.coerce.number().int().min(1).optional(),\n BRAINDUMP_SPLIT_TIMEOUT_MS: envMs('300000'),\n BRAINDUMP_TASK_TIMEOUT_MS: z.coerce.number().int().min(1000).optional(),\n BRAINDUMP_MAX_CONFLICT_ATTEMPTS: envInt('20', { min: 1 }),\n BRAINDUMP_CREATE_MR: envBoolean('false'),\n\n // --- Auto Update ---\n AUTO_UPDATE_ENABLED: envBoolean('true'),\n AUTO_UPDATE_INTERVAL_MS: envMs('600000'),\n AUTO_UPDATE_REGISTRY: z\n .string()\n .url('AUTO_UPDATE_REGISTRY must be a valid URL')\n .optional()\n .default('https://registry.npmjs.org'),\n AUTO_UPDATE_DRAIN_TIMEOUT_MS: envMs('300000'),\n\n // --- iWiki ---\n IWIKI_AUTH_COOKIE: z.string().optional(),\n IWIKI_AUTH_TOKEN: z.string().optional(),\n IWIKI_BASE_URL: z.string().optional(),\n\n // --- Locale ---\n LOCALE: z.enum(['zh-CN', 'en']).optional().default('zh-CN'),\n\n // --- Knowledge ---\n KNOWLEDGE_ENABLED: envBoolean('false'),\n KNOWLEDGE_PATH: z.string().optional(),\n KNOWLEDGE_ORPHAN_BRANCH: z.string().optional().default('iaf/knowledge'),\n KNOWLEDGE_SYNC_VECTORS: envBoolean('false'),\n KNOWLEDGE_AUTO_RESTORE: envBoolean('true'),\n\n // --- Distill (知识蒸馏) ---\n DISTILL_ENABLED: envBoolean('false'),\n DISTILL_INTERVAL_MS: envMs('86400000'),\n DISTILL_DIARY_SUMMARIZE: envBoolean('false'),\n DISTILL_MIN_DIARIES_FOR_DISTILL: envInt('3', { min: 1 }),\n DISTILL_MEMORY_CONFIDENCE_THRESHOLD: z.coerce.number().min(0).max(1).optional().default(0.7),\n DISTILL_VECTOR_ENABLED: envBoolean('true'),\n\n // --- Sync (生成文件同步到目标项目) ---\n SYNC_KNOWLEDGE_TO_PROJECT: envBoolean('false'),\n SYNC_RULES_TO_PROJECT: envBoolean('false'),\n\n // --- Release (发布) ---\n RELEASE_ENABLED: envBoolean('false'),\n RELEASE_DETECT_CACHE_TTL_MS: envMs('604800000'),\n\n // --- Verify-Fix Loop (验证-修复循环) ---\n VERIFY_FIX_LOOP_ENABLED: envBoolean('true'),\n VERIFY_FIX_MAX_ITERATIONS: envInt('3', { min: 1, max: 10 }),\n VERIFY_TODOLIST_CHECK_ENABLED: envBoolean('true'),\n\n // --- Analytics (运营分析) ---\n ANALYTICS_ENABLED: envBoolean('false'),\n ANALYTICS_TARGET_API_URL: z.string().url().optional(),\n ANALYTICS_TARGET_API_TOKEN: z.string().optional(),\n ANALYTICS_CACHE_TTL_MS: envMs('300000'),\n ANALYTICS_SKILL_AUTO_DISCOVER: envBoolean('true'),\n\n // --- Coordination (多节点协调) ---\n NODE_ID: z.string().optional(),\n\n // --- Workspace (多仓库) ---\n WORKSPACE_CONFIG_PATH: z.string().optional(),\n\n // --- Tenants (多租户) ---\n TENANTS_CONFIG_PATH: z.string().optional(),\n});\n\nexport type ParsedEnv = z.infer<typeof envSchema>;\n\n// ---------------------------------------------------------------------------\n// Extract env subset\n// ---------------------------------------------------------------------------\n\n/**\n * Picks only the keys declared in `envSchema` from the given env object.\n * Empty strings are converted to `undefined` to preserve the existing\n * \"empty = unset\" behavior.\n */\nexport function extractEnvSubset(\n env: Record<string, string | undefined>,\n): Record<string, string | undefined> {\n const keys = Object.keys(envSchema.shape) as (keyof typeof envSchema.shape)[];\n const subset: Record<string, string | undefined> = {};\n for (const key of keys) {\n const val = env[key as string];\n subset[key as string] = val || undefined; // empty string → undefined\n }\n return subset;\n}\n\n// ---------------------------------------------------------------------------\n// AI Runner helpers\n// ---------------------------------------------------------------------------\n\nexport type AIRunnerMode = string;\n\nfunction resolveAIBinary(\n mode: AIRunnerMode,\n env: ParsedEnv,\n): string {\n const envKey = getBinaryEnvKey(mode);\n if (envKey) {\n const envVal = (env as Record<string, unknown>)[envKey];\n if (typeof envVal === 'string' && envVal) return envVal;\n }\n return getDefaultBinary(mode);\n}\n\nexport interface BrainstormAgentConfig {\n mode: AIRunnerMode;\n binary: string;\n nvmNodeVersion: string;\n model?: string;\n}\n\nexport type ChatAgentConfig = BrainstormAgentConfig;\n\nfunction buildBrainstormAgent(\n role: 'GENERATOR' | 'REVIEWER',\n env: ParsedEnv,\n): BrainstormAgentConfig {\n const roleMode =\n (role === 'GENERATOR' ? env.BRAINSTORM_GENERATOR_MODE : env.BRAINSTORM_REVIEWER_MODE) ??\n env.AI_RUNNER_MODE;\n return {\n mode: roleMode,\n binary:\n (role === 'GENERATOR' ? env.BRAINSTORM_GENERATOR_BINARY : env.BRAINSTORM_REVIEWER_BINARY) ??\n resolveAIBinary(roleMode, env),\n nvmNodeVersion: env.NVM_NODE_VERSION,\n model:\n (role === 'GENERATOR' ? env.BRAINSTORM_GENERATOR_MODEL : env.BRAINSTORM_REVIEWER_MODEL) ??\n env.AI_MODEL,\n };\n}\n\nfunction buildChatAgent(env: ParsedEnv): ChatAgentConfig {\n // Chat defaults to claude-internal for lightweight conversational use,\n // independent of the global AI_RUNNER_MODE (which may be cursor-agent).\n const chatMode = env.CHAT_AGENT_MODE ?? 'claude-internal';\n return {\n mode: chatMode,\n binary: env.CHAT_AGENT_BINARY ?? resolveAIBinary(chatMode, env),\n nvmNodeVersion: env.NVM_NODE_VERSION,\n model: env.CHAT_AGENT_MODEL ?? env.AI_MODEL,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Transform parsed env → nested Config\n// ---------------------------------------------------------------------------\n\nexport function transformEnvToConfig(env: ParsedEnv, dirname: string) {\n const aiMode = env.AI_RUNNER_MODE;\n const webPort = env.WEB_PORT;\n\n const gitRootDir = env.GIT_ROOT_DIR ?? env.PROJECT_WORK_DIR;\n\n return {\n gongfeng: {\n apiUrl: env.GONGFENG_API_URL,\n privateToken: env.GONGFENG_PRIVATE_TOKEN,\n projectPath: env.GONGFENG_PROJECT_PATH,\n },\n project: {\n workDir: env.PROJECT_WORK_DIR,\n gitRootDir,\n baseBranch: env.BASE_BRANCH,\n branchPrefix: env.BRANCH_PREFIX,\n worktreeBaseDir: env.WORKTREE_BASE_DIR,\n projectSubDir: env.PROJECT_SUBDIR,\n },\n ai: {\n mode: aiMode,\n binary: resolveAIBinary(aiMode, env),\n phaseTimeoutMs: env.CLAUDE_PHASE_TIMEOUT_MS,\n idleTimeoutMs: env.AI_IDLE_TIMEOUT_MS || undefined,\n nvmNodeVersion: env.NVM_NODE_VERSION,\n model: env.AI_MODEL,\n codebuddyAcpAutoApprove: env.CODEBUDDY_ACP_AUTO_APPROVE,\n },\n poll: {\n discoveryIntervalMs: env.POLL_DISCOVERY_INTERVAL_MS,\n driveIntervalMs: env.POLL_DRIVE_INTERVAL_MS,\n maxRetries: env.MAX_RETRIES,\n maxConcurrent: env.MAX_CONCURRENT_ISSUES,\n },\n pipeline: {\n mode: env.PIPELINE_MODE,\n },\n review: {\n enabled: env.REVIEW_ENABLED,\n autoApproveLabels: env.REVIEW_AUTO_APPROVE_LABELS\n .split(',')\n .map((s) => s.trim())\n .filter(Boolean),\n },\n web: {\n enabled: env.WEB_ENABLED,\n host: env.WEB_HOST,\n port: webPort,\n frontendDistDir:\n env.FRONTEND_DIST_DIR ??\n path.resolve(dirname, '..', 'src/web/frontend/dist'),\n },\n issueNoteSync: {\n enabled: env.ISSUE_NOTE_SYNC_ENABLED,\n webBaseUrl: env.WEB_BASE_URL ?? `http://${getLocalIP()}:${webPort}`,\n },\n webhook: {\n enabled: env.WEBHOOK_ENABLED,\n host: env.WEBHOOK_HOST,\n port: env.WEBHOOK_PORT,\n secret: env.WEBHOOK_SECRET,\n llmFallback: env.WEBHOOK_LLM_FALLBACK,\n llmBinary: env.WEBHOOK_LLM_BINARY,\n },\n e2e: {\n enabled: env.E2E_UI_ENABLED,\n baseUrl: env.E2E_BASE_URL,\n backendUrl: env.E2E_BACKEND_URL,\n authCookies: env.E2E_AUTH_COOKIES,\n backendPortBase: env.E2E_BACKEND_PORT_BASE,\n frontendPortBase: env.E2E_FRONTEND_PORT_BASE,\n uatVendorDir: env.E2E_UAT_VENDOR_DIR,\n uatConfigFile: env.E2E_UAT_CONFIG_FILE,\n pythonBin: env.E2E_PYTHON_BIN,\n aiRunnerMode: env.E2E_AI_RUNNER_MODE,\n aiModel: env.E2E_AI_MODEL,\n },\n preview: {\n enabled: env.PREVIEW_ENABLED,\n host: env.PREVIEW_HOST,\n ttlMs: env.PREVIEW_TTL_MS,\n keepAfterComplete: env.PREVIEW_KEEP_AFTER_COMPLETE,\n reapIntervalMs: env.PREVIEW_REAP_INTERVAL_MS,\n },\n brainstorm: {\n enabled: env.BRAINSTORM_ENABLED,\n maxRefinementRounds: env.BRAINSTORM_MAX_ROUNDS,\n timeoutMs: env.BRAINSTORM_TIMEOUT_MS,\n generator: buildBrainstormAgent('GENERATOR', env),\n reviewer: buildBrainstormAgent('REVIEWER', env),\n },\n chat: {\n enabled: env.CHAT_ENABLED,\n timeoutMs: env.CHAT_TIMEOUT_MS,\n maxSessionMessages: env.CHAT_MAX_SESSION_MESSAGES,\n agent: buildChatAgent(env),\n },\n braindump: {\n enabled: env.BRAINDUMP_ENABLED,\n maxConcurrent: env.BRAINDUMP_MAX_CONCURRENT ?? env.MAX_CONCURRENT_ISSUES,\n splitTimeoutMs: env.BRAINDUMP_SPLIT_TIMEOUT_MS,\n taskTimeoutMs: env.BRAINDUMP_TASK_TIMEOUT_MS ?? env.CLAUDE_PHASE_TIMEOUT_MS,\n maxConflictAttempts: env.BRAINDUMP_MAX_CONFLICT_ATTEMPTS,\n createMr: env.BRAINDUMP_CREATE_MR,\n },\n autoUpdate: {\n enabled: env.AUTO_UPDATE_ENABLED,\n intervalMs: env.AUTO_UPDATE_INTERVAL_MS,\n registry: env.AUTO_UPDATE_REGISTRY,\n drainTimeoutMs: env.AUTO_UPDATE_DRAIN_TIMEOUT_MS,\n },\n iwiki: {\n authCookie: env.IWIKI_AUTH_COOKIE,\n authToken: env.IWIKI_AUTH_TOKEN,\n baseUrl: env.IWIKI_BASE_URL,\n },\n locale: env.LOCALE,\n knowledge: {\n enabled: env.KNOWLEDGE_ENABLED,\n path: env.KNOWLEDGE_PATH,\n orphanBranch: env.KNOWLEDGE_ORPHAN_BRANCH,\n syncVectors: env.KNOWLEDGE_SYNC_VECTORS,\n autoRestore: env.KNOWLEDGE_AUTO_RESTORE,\n },\n distill: {\n enabled: env.DISTILL_ENABLED,\n intervalMs: env.DISTILL_INTERVAL_MS,\n diarySummarize: env.DISTILL_DIARY_SUMMARIZE,\n minDiariesForDistill: env.DISTILL_MIN_DIARIES_FOR_DISTILL,\n memoryConfidenceThreshold: env.DISTILL_MEMORY_CONFIDENCE_THRESHOLD,\n vectorEnabled: env.DISTILL_VECTOR_ENABLED,\n },\n coordination: {\n nodeId: env.NODE_ID,\n },\n sync: {\n knowledgeToProject: env.SYNC_KNOWLEDGE_TO_PROJECT,\n rulesToProject: env.SYNC_RULES_TO_PROJECT,\n },\n release: {\n enabled: env.RELEASE_ENABLED,\n detectCacheTtlMs: env.RELEASE_DETECT_CACHE_TTL_MS,\n },\n verifyFixLoop: {\n enabled: env.VERIFY_FIX_LOOP_ENABLED,\n maxIterations: env.VERIFY_FIX_MAX_ITERATIONS,\n todolistCheckEnabled: env.VERIFY_TODOLIST_CHECK_ENABLED,\n },\n analytics: {\n enabled: env.ANALYTICS_ENABLED,\n targetApiUrl: env.ANALYTICS_TARGET_API_URL,\n targetApiToken: env.ANALYTICS_TARGET_API_TOKEN,\n cacheTtlMs: env.ANALYTICS_CACHE_TTL_MS,\n skillAutoDiscover: env.ANALYTICS_SKILL_AUTO_DISCOVER,\n },\n workspace: {\n configPath: env.WORKSPACE_CONFIG_PATH,\n },\n tenants: {\n configPath: env.TENANTS_CONFIG_PATH,\n },\n } as const;\n}\n\n// ---------------------------------------------------------------------------\n// Config type (derived from transform)\n// ---------------------------------------------------------------------------\n\n// We use a widened version so the type is writable and compatible with existing\n// code that assigns to Config properties.\ntype TransformResult = ReturnType<typeof transformEnvToConfig>;\n\n// Deeply writable version of the transform result\ntype DeepWritable<T> = {\n -readonly [K in keyof T]: T[K] extends object ? DeepWritable<T[K]> : T[K];\n};\n\nexport type Config = DeepWritable<TransformResult>;\n\n// ---------------------------------------------------------------------------\n// Sub-type aliases for interface segregation\n// ---------------------------------------------------------------------------\n\n/** Gongfeng API connection settings. */\nexport type GongfengConfig = Config['gongfeng'];\n/** Project / repository settings. */\nexport type ProjectConfig = Config['project'];\n/** AI runner settings. */\nexport type AIConfig = Config['ai'];\n/** Polling intervals and concurrency limits. */\nexport type PollConfig = Config['poll'];\n/** Pipeline mode settings. */\nexport type PipelineConfig = Config['pipeline'];\n/** Review / gate settings. */\nexport type ReviewConfig = Config['review'];\n/** Web dashboard settings. */\nexport type WebConfig = Config['web'];\n/** Issue note-sync settings. */\nexport type IssueNoteSyncConfig = Config['issueNoteSync'];\n/** Webhook settings. */\nexport type WebhookConfig = Config['webhook'];\n/** E2E test settings. */\nexport type E2eConfig = Config['e2e'];\n/** Preview environment settings. */\nexport type PreviewConfig = Config['preview'];\n/** Brainstorm agent settings. */\nexport type BrainstormConfig = Config['brainstorm'];\n/** Chat agent settings. */\nexport type ChatConfig = Config['chat'];\n/** Braindump batch settings. */\nexport type BraindumpConfig = Config['braindump'];\n/** Auto-update settings. */\nexport type AutoUpdateConfig = Config['autoUpdate'];\n/** iWiki settings. */\nexport type IWikiConfig = Config['iwiki'];\n/** Knowledge settings. */\nexport type KnowledgeConfig = Config['knowledge'];\n/** Distill (knowledge distillation) settings. */\nexport type DistillConfig = Config['distill'];\n/** Coordination (multi-node claiming) settings. */\nexport type CoordinationConfig = Config['coordination'];\n/** Sync (generated files sync to project) settings. */\nexport type SyncConfig = Config['sync'];\n/** Verify-fix loop settings. */\nexport type VerifyFixLoopConfig = Config['verifyFixLoop'];\n/** Release (发布) settings. */\nexport type ReleaseConfig = Config['release'];\n/** Analytics (operational analysis) settings. */\nexport type AnalyticsConfig = Config['analytics'];\n/** Workspace (multi-repo) settings. */\nexport type WorkspaceEnvConfig = Config['workspace'];\n/** Tenants (multi-tenant) settings. */\nexport type TenantsEnvConfig = Config['tenants'];\n\n// ---------------------------------------------------------------------------\n// ConfigValidationError\n// ---------------------------------------------------------------------------\n\nexport class ConfigValidationError extends Error {\n public readonly issues: z.ZodIssue[];\n\n constructor(zodError: z.ZodError) {\n const lines = zodError.issues.map((issue) => {\n const envVar = issue.path.length > 0 ? issue.path.join('.') : '(root)';\n return ` - ${envVar}: ${issue.message}`;\n });\n super(\n `Configuration validation failed:\\n${lines.join('\\n')}`,\n );\n this.name = 'ConfigValidationError';\n this.issues = zodError.issues;\n }\n}\n"],"mappings":"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","names":["path","path"]}
|
|
@@ -6,10 +6,10 @@ import {
|
|
|
6
6
|
import {
|
|
7
7
|
ConfigGenerator,
|
|
8
8
|
PreflightChecker
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-UAINLCSR.js";
|
|
10
10
|
import {
|
|
11
11
|
resolveConfigFilePath
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-PNTEPUOH.js";
|
|
13
13
|
import {
|
|
14
14
|
ensureDir,
|
|
15
15
|
resolveLogsDir
|
|
@@ -110,4 +110,4 @@ async function startDaemon(configPath) {
|
|
|
110
110
|
export {
|
|
111
111
|
startCommand
|
|
112
112
|
};
|
|
113
|
-
//# sourceMappingURL=chunk-
|
|
113
|
+
//# sourceMappingURL=chunk-PRGM6ELE.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ConfigGenerator,
|
|
3
3
|
PreflightChecker
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-UAINLCSR.js";
|
|
5
5
|
import {
|
|
6
6
|
DependencyChecker
|
|
7
7
|
} from "./chunk-3V3GQCB7.js";
|
|
@@ -10,7 +10,7 @@ import {
|
|
|
10
10
|
} from "./chunk-ACVOOHAR.js";
|
|
11
11
|
import {
|
|
12
12
|
resolveConfigFilePath
|
|
13
|
-
} from "./chunk-
|
|
13
|
+
} from "./chunk-PNTEPUOH.js";
|
|
14
14
|
import {
|
|
15
15
|
analyze,
|
|
16
16
|
collectStaticInfo
|
|
@@ -172,7 +172,7 @@ var E2ESetupRunner = class {
|
|
|
172
172
|
const step = "reload";
|
|
173
173
|
yield { step, status: "running", message: "Reloading configuration..." };
|
|
174
174
|
try {
|
|
175
|
-
const { reloadConfig } = await import("./config-
|
|
175
|
+
const { reloadConfig } = await import("./config-E7XKQUSH.js");
|
|
176
176
|
reloadConfig();
|
|
177
177
|
yield { step, status: "done", message: "Configuration reloaded" };
|
|
178
178
|
} catch (err) {
|
|
@@ -468,7 +468,7 @@ function createSetupRouter(deps = {}) {
|
|
|
468
468
|
sse.write({ step: "collected", message: "Static info collected" });
|
|
469
469
|
sse.write({ step: "analyzing", message: "Running AI analysis..." });
|
|
470
470
|
try {
|
|
471
|
-
const { loadConfig } = await import("./config-
|
|
471
|
+
const { loadConfig } = await import("./config-E7XKQUSH.js");
|
|
472
472
|
const { createAIRunner } = await import("./ai-runner-RUE5D72W.js");
|
|
473
473
|
const config = loadConfig();
|
|
474
474
|
const runner = createAIRunner(config.ai);
|
|
@@ -549,4 +549,4 @@ function createSetupRouter(deps = {}) {
|
|
|
549
549
|
export {
|
|
550
550
|
createSetupRouter
|
|
551
551
|
};
|
|
552
|
-
//# sourceMappingURL=chunk-
|
|
552
|
+
//# sourceMappingURL=chunk-RJUOVI3J.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
envSchema
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-PNTEPUOH.js";
|
|
4
4
|
import {
|
|
5
5
|
getLocalIP
|
|
6
6
|
} from "./chunk-AKXDQH25.js";
|
|
@@ -863,4 +863,4 @@ export {
|
|
|
863
863
|
PreflightChecker,
|
|
864
864
|
ConfigGenerator
|
|
865
865
|
};
|
|
866
|
-
//# sourceMappingURL=chunk-
|
|
866
|
+
//# sourceMappingURL=chunk-UAINLCSR.js.map
|
|
@@ -2987,7 +2987,7 @@ var WorkspaceManager = class {
|
|
|
2987
2987
|
|
|
2988
2988
|
// src/orchestrator/PipelineOrchestrator.ts
|
|
2989
2989
|
import path13 from "path";
|
|
2990
|
-
import
|
|
2990
|
+
import fs12 from "fs/promises";
|
|
2991
2991
|
import fsSync from "fs";
|
|
2992
2992
|
import { execFile as execFile2 } from "child_process";
|
|
2993
2993
|
import { promisify as promisify2 } from "util";
|
|
@@ -3169,6 +3169,7 @@ var PortAllocator = class {
|
|
|
3169
3169
|
|
|
3170
3170
|
// src/deploy/DevServerManager.ts
|
|
3171
3171
|
import { spawn } from "child_process";
|
|
3172
|
+
import fs10 from "fs";
|
|
3172
3173
|
import path11 from "path";
|
|
3173
3174
|
import https from "https";
|
|
3174
3175
|
import http from "http";
|
|
@@ -3212,8 +3213,17 @@ function waitForPort(port, useTls, timeoutMs, intervalMs) {
|
|
|
3212
3213
|
var DevServerManager = class {
|
|
3213
3214
|
servers = /* @__PURE__ */ new Map();
|
|
3214
3215
|
options;
|
|
3216
|
+
logDir;
|
|
3215
3217
|
constructor(options) {
|
|
3216
3218
|
this.options = { ...DEFAULT_OPTIONS2, ...options };
|
|
3219
|
+
this.logDir = path11.join(resolveDataDir(), "preview-logs");
|
|
3220
|
+
if (!fs10.existsSync(this.logDir)) {
|
|
3221
|
+
fs10.mkdirSync(this.logDir, { recursive: true });
|
|
3222
|
+
}
|
|
3223
|
+
}
|
|
3224
|
+
getLogPath(issueIid, type) {
|
|
3225
|
+
const filePath = path11.join(this.logDir, `${issueIid}-${type}.log`);
|
|
3226
|
+
return fs10.existsSync(filePath) ? filePath : null;
|
|
3217
3227
|
}
|
|
3218
3228
|
async startServers(wtCtx, ports) {
|
|
3219
3229
|
if (this.servers.has(wtCtx.issueIid)) {
|
|
@@ -3221,6 +3231,12 @@ var DevServerManager = class {
|
|
|
3221
3231
|
return;
|
|
3222
3232
|
}
|
|
3223
3233
|
logger12.info("Starting dev servers", { issueIid: wtCtx.issueIid, ...ports });
|
|
3234
|
+
const backendLogPath = path11.join(this.logDir, `${wtCtx.issueIid}-backend.log`);
|
|
3235
|
+
const frontendLogPath = path11.join(this.logDir, `${wtCtx.issueIid}-frontend.log`);
|
|
3236
|
+
const backendLog = fs10.createWriteStream(backendLogPath, { flags: "a" });
|
|
3237
|
+
const frontendLog = fs10.createWriteStream(frontendLogPath, { flags: "a" });
|
|
3238
|
+
const tsLine = (stream, data) => `[${(/* @__PURE__ */ new Date()).toISOString()}] [${stream}] ${data.toString().trimEnd()}
|
|
3239
|
+
`;
|
|
3224
3240
|
const backendEnv = {
|
|
3225
3241
|
...process.env,
|
|
3226
3242
|
PORT: String(ports.backendPort),
|
|
@@ -3235,10 +3251,10 @@ var DevServerManager = class {
|
|
|
3235
3251
|
detached: false
|
|
3236
3252
|
});
|
|
3237
3253
|
backend.stdout?.on("data", (data) => {
|
|
3238
|
-
|
|
3254
|
+
backendLog.write(tsLine("stdout", data));
|
|
3239
3255
|
});
|
|
3240
3256
|
backend.stderr?.on("data", (data) => {
|
|
3241
|
-
|
|
3257
|
+
backendLog.write(tsLine("stderr", data));
|
|
3242
3258
|
});
|
|
3243
3259
|
backend.on("exit", (code) => {
|
|
3244
3260
|
logger12.info("Backend process exited", { issueIid: wtCtx.issueIid, code });
|
|
@@ -3247,9 +3263,10 @@ var DevServerManager = class {
|
|
|
3247
3263
|
const frontendEnv = {
|
|
3248
3264
|
...process.env,
|
|
3249
3265
|
BACKEND_PORT: String(ports.backendPort),
|
|
3250
|
-
FRONTEND_PORT: String(ports.frontendPort)
|
|
3266
|
+
FRONTEND_PORT: String(ports.frontendPort),
|
|
3267
|
+
VITE_API_PORT: String(ports.backendPort)
|
|
3251
3268
|
};
|
|
3252
|
-
const frontendCmd = this.options.frontendCommand ?? { bin: "pnpm", args: ["dev", "--", "--port", String(ports.frontendPort)] };
|
|
3269
|
+
const frontendCmd = this.options.frontendCommand ?? { bin: "pnpm", args: ["dev", "--", "--port", String(ports.frontendPort), "--host"] };
|
|
3253
3270
|
const frontend = spawn(frontendCmd.bin, frontendCmd.args, {
|
|
3254
3271
|
cwd: frontendDir,
|
|
3255
3272
|
env: frontendEnv,
|
|
@@ -3257,10 +3274,10 @@ var DevServerManager = class {
|
|
|
3257
3274
|
detached: false
|
|
3258
3275
|
});
|
|
3259
3276
|
frontend.stdout?.on("data", (data) => {
|
|
3260
|
-
|
|
3277
|
+
frontendLog.write(tsLine("stdout", data));
|
|
3261
3278
|
});
|
|
3262
3279
|
frontend.stderr?.on("data", (data) => {
|
|
3263
|
-
|
|
3280
|
+
frontendLog.write(tsLine("stderr", data));
|
|
3264
3281
|
});
|
|
3265
3282
|
frontend.on("exit", (code) => {
|
|
3266
3283
|
logger12.info("Frontend process exited", { issueIid: wtCtx.issueIid, code });
|
|
@@ -3270,7 +3287,9 @@ var DevServerManager = class {
|
|
|
3270
3287
|
frontend,
|
|
3271
3288
|
ports,
|
|
3272
3289
|
workDir: wtCtx.workDir,
|
|
3273
|
-
startedAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
3290
|
+
startedAt: (/* @__PURE__ */ new Date()).toISOString(),
|
|
3291
|
+
backendLog,
|
|
3292
|
+
frontendLog
|
|
3274
3293
|
};
|
|
3275
3294
|
this.servers.set(wtCtx.issueIid, serverSet);
|
|
3276
3295
|
logger12.info("Waiting for servers to become healthy", { issueIid: wtCtx.issueIid });
|
|
@@ -3305,6 +3324,8 @@ var DevServerManager = class {
|
|
|
3305
3324
|
logger12.info("Stopping dev servers", { issueIid, ports: set.ports });
|
|
3306
3325
|
killProcess(set.backend, `backend #${issueIid}`);
|
|
3307
3326
|
killProcess(set.frontend, `frontend #${issueIid}`);
|
|
3327
|
+
set.backendLog.end();
|
|
3328
|
+
set.frontendLog.end();
|
|
3308
3329
|
this.servers.delete(issueIid);
|
|
3309
3330
|
}
|
|
3310
3331
|
stopAll() {
|
|
@@ -3355,12 +3376,12 @@ function isE2eEnabledForIssue(issueIid, tracker, cfg) {
|
|
|
3355
3376
|
}
|
|
3356
3377
|
|
|
3357
3378
|
// src/e2e/ScreenshotCollector.ts
|
|
3358
|
-
import
|
|
3379
|
+
import fs11 from "fs";
|
|
3359
3380
|
import path12 from "path";
|
|
3360
3381
|
var logger13 = logger.child("ScreenshotCollector");
|
|
3361
3382
|
var MAX_SCREENSHOTS = 20;
|
|
3362
3383
|
function walkDir(dir, files = []) {
|
|
3363
|
-
for (const entry of
|
|
3384
|
+
for (const entry of fs11.readdirSync(dir, { withFileTypes: true })) {
|
|
3364
3385
|
const full = path12.join(dir, entry.name);
|
|
3365
3386
|
if (entry.isDirectory()) {
|
|
3366
3387
|
walkDir(full, files);
|
|
@@ -3372,7 +3393,7 @@ function walkDir(dir, files = []) {
|
|
|
3372
3393
|
}
|
|
3373
3394
|
function collectScreenshots(workDir) {
|
|
3374
3395
|
const testResultsDir = path12.join(workDir, "frontend", "test-results");
|
|
3375
|
-
if (!
|
|
3396
|
+
if (!fs11.existsSync(testResultsDir)) {
|
|
3376
3397
|
logger13.debug("test-results directory not found", { dir: testResultsDir });
|
|
3377
3398
|
return [];
|
|
3378
3399
|
}
|
|
@@ -4067,6 +4088,7 @@ async function handleFailure(err, issue, wtCtx, deps) {
|
|
|
4067
4088
|
});
|
|
4068
4089
|
}
|
|
4069
4090
|
}
|
|
4091
|
+
deps.stopPreviewServers(issue.iid);
|
|
4070
4092
|
const preservedDirs = wtCtx.workspace ? [wtCtx.workspace.primary.gitRootDir, ...wtCtx.workspace.associates.map((a) => a.gitRootDir)] : [wtCtx.gitRootDir];
|
|
4071
4093
|
logger18.info("Worktree(s) preserved for debugging", {
|
|
4072
4094
|
primary: wtCtx.gitRootDir,
|
|
@@ -4172,7 +4194,7 @@ var PipelineOrchestrator = class {
|
|
|
4172
4194
|
try {
|
|
4173
4195
|
const gitFile = path13.join(wtDir, ".git");
|
|
4174
4196
|
try {
|
|
4175
|
-
await
|
|
4197
|
+
await fs12.access(gitFile);
|
|
4176
4198
|
} catch {
|
|
4177
4199
|
logger19.warn("Worktree corrupted (.git missing), force removing", { dir: wtDir });
|
|
4178
4200
|
await this.mainGit.worktreeRemove(wtDir, true).catch(() => {
|
|
@@ -4189,7 +4211,7 @@ var PipelineOrchestrator = class {
|
|
|
4189
4211
|
}
|
|
4190
4212
|
const indexLock = path13.join(wtDir, ".git", "index.lock");
|
|
4191
4213
|
try {
|
|
4192
|
-
await
|
|
4214
|
+
await fs12.unlink(indexLock);
|
|
4193
4215
|
logger19.warn("Removed stale index.lock", { path: indexLock });
|
|
4194
4216
|
cleaned++;
|
|
4195
4217
|
} catch {
|
|
@@ -4203,7 +4225,7 @@ var PipelineOrchestrator = class {
|
|
|
4203
4225
|
}
|
|
4204
4226
|
const mainIndexLock = path13.join(repoGitRoot, ".git", "index.lock");
|
|
4205
4227
|
try {
|
|
4206
|
-
await
|
|
4228
|
+
await fs12.unlink(mainIndexLock);
|
|
4207
4229
|
logger19.warn("Removed stale main repo index.lock", { path: mainIndexLock });
|
|
4208
4230
|
cleaned++;
|
|
4209
4231
|
} catch {
|
|
@@ -4309,7 +4331,7 @@ var PipelineOrchestrator = class {
|
|
|
4309
4331
|
async ensureNodeModules(workDir) {
|
|
4310
4332
|
const targetBin = path13.join(workDir, "node_modules", ".bin");
|
|
4311
4333
|
try {
|
|
4312
|
-
await
|
|
4334
|
+
await fs12.access(targetBin);
|
|
4313
4335
|
logger19.info("node_modules already complete (has .bin/)");
|
|
4314
4336
|
return true;
|
|
4315
4337
|
} catch {
|
|
@@ -4317,7 +4339,7 @@ var PipelineOrchestrator = class {
|
|
|
4317
4339
|
const sourceNM = path13.join(this.config.project.workDir, "node_modules");
|
|
4318
4340
|
const targetNM = path13.join(workDir, "node_modules");
|
|
4319
4341
|
try {
|
|
4320
|
-
await
|
|
4342
|
+
await fs12.access(sourceNM);
|
|
4321
4343
|
} catch {
|
|
4322
4344
|
logger19.warn("Main repo node_modules not found, skipping seed", { sourceNM });
|
|
4323
4345
|
return false;
|
|
@@ -5119,4 +5141,4 @@ export {
|
|
|
5119
5141
|
PipelineOrchestrator,
|
|
5120
5142
|
BrainstormService
|
|
5121
5143
|
};
|
|
5122
|
-
//# sourceMappingURL=chunk-
|
|
5144
|
+
//# sourceMappingURL=chunk-UWLXEZSL.js.map
|