easy-coding-harness 1.1.0-beta.0 → 1.1.0-beta.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/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/commands/add-agent.ts","../src/constants/version.ts","../src/ui/banner.ts","../src/utils/config-yaml.ts","../src/utils/file-writer.ts","../src/utils/gitignore.ts","../src/constants/paths.ts","../src/utils/install-manifest.ts","../src/types/platform.ts","../src/utils/runtime-scaffold.ts","../src/utils/template-paths.ts","../src/utils/task-json.ts","../src/commands/install-harness.ts","../src/configurators/claude.ts","../src/configurators/shared.ts","../src/utils/marked-region.ts","../src/configurators/codex.ts","../src/configurators/qoder.ts","../src/utils/platform-paths.ts","../src/configurators/index.ts","../src/commands/platforms.ts","../src/commands/supermodule-targets.ts","../src/utils/gitmodules.ts","../src/commands/clear.ts","../src/commands/config.ts","../src/utils/compare-versions.ts","../src/utils/tdd-readiness.ts","../src/commands/init.ts","../src/utils/install-state.ts","../src/commands/status.ts","../src/utils/session.ts","../src/commands/update.ts","../src/commands/upgrade.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { addAgent } from \"./commands/add-agent.js\";\nimport { clear } from \"./commands/clear.js\";\nimport { config } from \"./commands/config.js\";\nimport { init } from \"./commands/init.js\";\nimport { status } from \"./commands/status.js\";\nimport { update } from \"./commands/update.js\";\nimport { upgrade } from \"./commands/upgrade.js\";\nimport { PACKAGE_NAME, VERSION } from \"./constants/version.js\";\nimport { checkForUpgrade } from \"./utils/compare-versions.js\";\n\ntype CommandAction<T> = (opts: T) => Promise<void>;\n\nfunction withErrorHandling<T>(fn: CommandAction<T>) {\n return async (opts: T) => {\n try {\n await fn(opts);\n } catch (error) {\n console.error(chalk.red(\"Error:\"), error instanceof Error ? error.message : error);\n if (process.env.EC_DEBUG && error instanceof Error) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n };\n}\n\nawait checkForUpgrade(process.cwd());\n\nconst program = new Command();\n\nprogram.name(\"easy-coding\").description(PACKAGE_NAME).version(VERSION, \"-v, --version\");\n\nprogram\n .command(\"init\")\n .description(\"Initialize easy-coding harness in current project\")\n .option(\"--agent <list>\", \"Comma-separated platforms: claude-code,codex,qoder\")\n .option(\n \"--submodules <list>\",\n \"Comma-separated checked-out submodule paths or names to initialize\",\n )\n .option(\"--no-submodules\", \"Initialize only the current directory when .gitmodules exists\")\n .option(\"-y, --yes\", \"Skip prompts, use defaults\")\n .action(withErrorHandling(init));\n\nprogram\n .command(\"add-agent\")\n .description(\"Add agent platform support to an existing project\")\n .option(\"--agent <list>\", \"Comma-separated platforms to add\")\n .option(\"--submodules <list>\", \"Comma-separated initialized submodule paths or names to update\")\n .option(\"--no-submodules\", \"Add the agent only to the current directory\")\n .action(withErrorHandling(addAgent));\n\nprogram\n .command(\"upgrade\")\n .description(\"Upgrade harness files to current CLI version\")\n .option(\"--dry-run\", \"Preview changes without applying\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(withErrorHandling(upgrade));\n\nprogram\n .command(\"update\")\n .description(\"Refresh the global CLI to the latest published version\")\n .option(\"--tag <tag>\", \"npm dist-tag or version to install\", \"latest\")\n .option(\"--dry-run\", \"Preview the install command without running it\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(withErrorHandling(update));\n\nprogram\n .command(\"config\")\n .description(\"Interactively configure project-level harness behavior\")\n .action(withErrorHandling(config));\n\nprogram\n .command(\"status\")\n .description(\"Show installed agents, version, and tasks\")\n .action(withErrorHandling(status));\n\nprogram\n .command(\"clear\")\n .description(\"Remove installed harness files (skills, hooks, config); keep tasks, spec, memory\")\n .option(\"--submodules <list>\", \"Comma-separated initialized submodule paths or names to clear\")\n .option(\"--no-submodules\", \"Clear only the current directory\")\n .option(\"--dry-run\", \"Preview what would be removed without deleting\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(withErrorHandling(clear));\n\nprogram.parse();\n","import { outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { VERSION } from \"../constants/version.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport {\n addAgentsToConfig,\n readConfigYaml,\n updateSupermoduleConfig,\n} from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { ensureEasyCodingSessionsIgnored, ensureHookBytecodeIgnored } from \"../utils/gitignore.js\";\nimport { type InstallArtifact, writeInstallManifest } from \"../utils/install-manifest.js\";\nimport { writeRuntimeScaffold } from \"../utils/runtime-scaffold.js\";\nimport { setPendingInitSince } from \"../utils/task-json.js\";\nimport { configurePlatformsForDir, refreshSupermoduleParent } from \"./install-harness.js\";\nimport { type PlatformOptions, resolvePlatforms } from \"./platforms.js\";\nimport { resolveAddAgentTargets } from \"./supermodule-targets.js\";\n\nexport async function addAgent(opts: PlatformOptions): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\n const targets = await resolveAddAgentTargets(cwd, opts);\n if (!(await pathExists(targets[0].configPath))) {\n throw new Error(\"No .easy-coding/config.yaml found. Run easy-coding init first.\");\n }\n\n const platforms = await resolvePlatforms(opts, [\"claude-code\"]);\n\n for (const target of targets) {\n if (!(await pathExists(target.configPath))) continue;\n const config = await readConfigYaml(target.configPath);\n const installedVersion = String(config.harness_version ?? \"\");\n if (installedVersion !== VERSION) {\n throw new Error(\n `${target.label}: installed harness ${installedVersion || \"unknown\"} does not match CLI ${VERSION}. Run easy-coding upgrade before add-agent.`,\n );\n }\n }\n\n const installedLabels: string[] = [];\n const refreshedLabels: string[] = [];\n\n for (const target of targets) {\n if (!(await pathExists(target.configPath))) {\n continue;\n }\n const config = await readConfigYaml(target.configPath);\n const toInstall = platforms.filter((platform) => !config.agents.includes(platform));\n const agents = [...config.agents, ...toInstall];\n\n if (toInstall.length > 0) {\n const projectId = await writeRuntimeScaffold(target.dir, agents, {\n supermodule: target.supermodule,\n });\n const artifacts: InstallArtifact[] = await configurePlatformsForDir(target.dir, toInstall, {\n supermodule: target.boundary,\n projectId,\n });\n await writeInstallManifest(target.dir, {\n harnessVersion: VERSION,\n agents: toInstall,\n artifacts,\n mode: \"merge\",\n });\n await ensureEasyCodingSessionsIgnored(target.dir);\n await ensureHookBytecodeIgnored(target.dir);\n await addAgentsToConfig(target.configPath, toInstall);\n await setPendingInitSince(target.dir, VERSION);\n\n installedLabels.push(`${target.label}: ${toInstall.join(\", \")}`);\n }\n\n if (target.supermodule.role === \"super-parent\") {\n await refreshSupermoduleParent(target.dir, agents, target.supermodule.submodules ?? []);\n refreshedLabels.push(target.label);\n continue;\n }\n\n if (target.supermodule.role === \"submodule-child\") {\n await updateSupermoduleConfig(target.configPath, target.supermodule);\n refreshedLabels.push(target.label);\n }\n }\n\n if (installedLabels.length === 0) {\n if (refreshedLabels.length > 0) {\n outro(chalk.green(`Supermodule topology refreshed:\\n${refreshedLabels.join(\"\\n\")}`));\n return;\n }\n outro(chalk.yellow(\"All selected agent platforms are already installed.\"));\n return;\n }\n\n outro(chalk.green(`Added agent platforms:\\n${installedLabels.join(\"\\n\")}`));\n}\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\ninterface PackageMetadata {\n name: string;\n version: string;\n}\n\nconst packageMetadata = readPackageMetadata();\n\nexport const PACKAGE_NAME = packageMetadata.name;\nexport const VERSION = packageMetadata.version;\n\nfunction readPackageMetadata(): PackageMetadata {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, \"../../package.json\"),\n path.resolve(here, \"../package.json\"),\n path.resolve(process.cwd(), \"package.json\"),\n ];\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(readFileSync(candidate, \"utf8\")) as Partial<PackageMetadata>;\n if (parsed.name && parsed.version) {\n return { name: parsed.name, version: parsed.version };\n }\n } catch {\n // Try the next candidate; source, dist, and installed layouts differ.\n }\n }\n\n throw new Error(`Unable to locate package metadata. Tried: ${candidates.join(\", \")}`);\n}\n","import chalk from \"chalk\";\nimport figlet from \"figlet\";\nimport { VERSION } from \"../constants/version.js\";\n\nexport interface BannerPreset {\n font: \"ANSI Shadow\" | \"Small Shadow\" | \"Small Slant\";\n horizontalLayout?: \"full\";\n}\n\nconst WIDE_TERMINAL_WIDTH = 88;\nconst MEDIUM_TERMINAL_WIDTH = 72;\n\nexport function renderBanner(): void {\n const terminalWidth = process.stdout.columns ?? 120;\n const art = figlet.textSync(\"Easy Coding\", selectBannerPreset(terminalWidth));\n console.log(colorizeBanner(art));\n console.log(chalk.bold.white(` Easy Coding Harness ${chalk.cyan(`v${VERSION}`)}\\n`));\n}\n\nexport function selectBannerPreset(width: number): BannerPreset {\n if (width >= WIDE_TERMINAL_WIDTH) {\n return { font: \"ANSI Shadow\", horizontalLayout: \"full\" };\n }\n\n if (width >= MEDIUM_TERMINAL_WIDTH) {\n return { font: \"Small Shadow\", horizontalLayout: \"full\" };\n }\n\n return { font: \"Small Slant\" };\n}\n\nexport function colorizeBanner(art: string): string {\n const colors = [chalk.cyanBright, chalk.cyan, chalk.blueBright, chalk.blue];\n return art\n .split(\"\\n\")\n .map((line, index) => colors[index % colors.length](line))\n .join(\"\\n\");\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport YAML, { isScalar, isSeq, parseDocument } from \"yaml\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport type { SupermoduleConfig } from \"../types/supermodule.js\";\nimport { writeTextFile } from \"./file-writer.js\";\n\nexport const CONFIG_SCHEMA_VERSION = 5;\nexport const DEFAULT_TDD_COVERAGE_THRESHOLD = 90;\nexport const APPROVAL_MODES = [\"approve\", \"guard\", \"confirm\", \"auto\"] as const;\nexport const CONFIGURED_WORKFLOW_MODES = [\"adaptive\", \"fast\", \"standard\", \"strict\"] as const;\nexport const CONCRETE_WORKFLOW_MODES = [\"fast\", \"standard\", \"strict\"] as const;\nexport type ApprovalMode = (typeof APPROVAL_MODES)[number];\nexport type ConfiguredWorkflowMode = (typeof CONFIGURED_WORKFLOW_MODES)[number];\nexport type ConcreteWorkflowMode = (typeof CONCRETE_WORKFLOW_MODES)[number];\nexport type LegacyConfirmMode = ApprovalMode | \"lite\";\n\nexport interface EasyCodingConfig {\n version: number;\n harness_version: string;\n agents: AgentPlatform[];\n project: {\n id: string;\n name: string;\n };\n memory: {\n short_term_max: number;\n short_term_keep: number;\n schema_version: number;\n };\n tasks: {\n auto_archive_days: number;\n };\n behavior: {\n approval_mode: ApprovalMode;\n workflow_mode: ConfiguredWorkflowMode;\n tdd_enabled: boolean;\n tdd_coverage_threshold: number;\n };\n supermodule?: SupermoduleConfig;\n [key: string]: unknown;\n}\n\nexport function createDefaultConfig(params: {\n projectName: string;\n harnessVersion: string;\n agents: AgentPlatform[];\n supermodule?: SupermoduleConfig;\n projectId?: string;\n}): EasyCodingConfig {\n const config: EasyCodingConfig = {\n version: CONFIG_SCHEMA_VERSION,\n harness_version: params.harnessVersion,\n agents: params.agents,\n project: {\n id: params.projectId ?? createProjectId(),\n name: params.projectName,\n },\n memory: {\n short_term_max: 10,\n short_term_keep: 5,\n schema_version: 2,\n },\n tasks: {\n auto_archive_days: 30,\n },\n behavior: {\n approval_mode: \"guard\",\n workflow_mode: \"adaptive\",\n tdd_enabled: false,\n tdd_coverage_threshold: DEFAULT_TDD_COVERAGE_THRESHOLD,\n },\n };\n if (params.supermodule) {\n config.supermodule = params.supermodule;\n }\n return config;\n}\n\nexport function stringifyConfig(config: EasyCodingConfig): string {\n return YAML.stringify(config);\n}\n\nexport async function writeConfigYaml(filePath: string, config: EasyCodingConfig): Promise<void> {\n await writeTextFile(filePath, stringifyConfig(config));\n}\n\nexport async function readConfigYaml(filePath: string): Promise<EasyCodingConfig> {\n const content = await readFile(filePath, \"utf8\");\n return YAML.parse(content) as EasyCodingConfig;\n}\n\nexport async function readProjectIdIfExists(filePath: string): Promise<string | null> {\n try {\n const config = await readConfigYaml(filePath);\n return typeof config.project?.id === \"string\" && config.project.id.trim()\n ? config.project.id\n : null;\n } catch {\n return null;\n }\n}\n\nexport async function updateConfigYaml(\n filePath: string,\n updater: (config: EasyCodingConfig) => void,\n): Promise<EasyCodingConfig> {\n const content = await readFile(filePath, \"utf8\");\n const document = parseDocument(content);\n const config = document.toJSON() as EasyCodingConfig;\n updater(config);\n\n for (const [key, value] of Object.entries(config)) {\n document.set(key, value);\n }\n\n await writeTextFile(filePath, document.toString());\n return config;\n}\n\nexport async function addAgentsToConfig(\n filePath: string,\n agents: AgentPlatform[],\n): Promise<EasyCodingConfig> {\n return updateConfigYaml(filePath, (config) => {\n const merged = new Set([...(config.agents ?? []), ...agents]);\n config.agents = [...merged];\n });\n}\n\nexport async function updateHarnessVersion(\n filePath: string,\n version: string,\n): Promise<EasyCodingConfig> {\n return updateConfigYaml(filePath, (config) => {\n config.harness_version = version;\n });\n}\n\nexport function isApprovalMode(value: unknown): value is ApprovalMode {\n return typeof value === \"string\" && APPROVAL_MODES.includes(value as ApprovalMode);\n}\n\nexport function isConfiguredWorkflowMode(value: unknown): value is ConfiguredWorkflowMode {\n return (\n typeof value === \"string\" && CONFIGURED_WORKFLOW_MODES.includes(value as ConfiguredWorkflowMode)\n );\n}\n\nexport function isTddCoverageThreshold(value: unknown): value is number {\n return Number.isInteger(value) && Number(value) >= 1 && Number(value) <= 100;\n}\n\nexport function resolveLegacyBehavior(config: EasyCodingConfig): {\n approvalMode: ApprovalMode;\n workflowMode: ConfiguredWorkflowMode;\n tddEnabled: boolean;\n tddCoverageThreshold: number;\n} {\n const behavior = (config.behavior ?? {}) as unknown as Record<string, unknown>;\n const legacyLite = behavior.confirm_mode === \"lite\";\n const approvalMode = isApprovalMode(behavior.approval_mode)\n ? behavior.approval_mode\n : isApprovalMode(behavior.confirm_mode)\n ? behavior.confirm_mode\n : behavior.auto_mode === true\n ? \"auto\"\n : behavior.strict_confirm === true\n ? \"approve\"\n : \"guard\";\n const workflowMode = isConfiguredWorkflowMode(behavior.workflow_mode)\n ? behavior.workflow_mode\n : legacyLite\n ? \"fast\"\n : \"adaptive\";\n const supportsTddThreshold = Number(config.version) >= 4;\n const tddEnabled = supportsTddThreshold && behavior.tdd_enabled === true;\n const tddCoverageThreshold =\n supportsTddThreshold && isTddCoverageThreshold(behavior.tdd_coverage_threshold)\n ? behavior.tdd_coverage_threshold\n : DEFAULT_TDD_COVERAGE_THRESHOLD;\n return { approvalMode, workflowMode, tddEnabled, tddCoverageThreshold };\n}\n\nexport async function setBehaviorModes(\n filePath: string,\n approvalMode: ApprovalMode,\n workflowMode: ConfiguredWorkflowMode,\n tddEnabled?: boolean,\n tddCoverageThreshold?: number,\n): Promise<EasyCodingConfig> {\n if (tddCoverageThreshold !== undefined && !isTddCoverageThreshold(tddCoverageThreshold)) {\n throw new Error(\"TDD coverage threshold must be an integer from 1 to 100.\");\n }\n return updateConfigYaml(filePath, (config) => {\n const legacyBehavior = (config.behavior ?? {}) as unknown as Record<string, unknown>;\n const resolvedBehavior = resolveLegacyBehavior(config);\n const behavior = Object.fromEntries(\n Object.entries(legacyBehavior).filter(\n ([key]) =>\n key !== \"strict_confirm\" &&\n key !== \"auto_mode\" &&\n key !== \"confirm_mode\" &&\n key !== \"approval_mode\" &&\n key !== \"workflow_mode\" &&\n key !== \"tdd_enabled\" &&\n key !== \"tdd_coverage_threshold\",\n ),\n );\n behavior.approval_mode = approvalMode;\n behavior.workflow_mode = workflowMode;\n behavior.tdd_enabled = tddEnabled ?? resolvedBehavior.tddEnabled;\n behavior.tdd_coverage_threshold = tddCoverageThreshold ?? resolvedBehavior.tddCoverageThreshold;\n config.behavior = behavior as EasyCodingConfig[\"behavior\"];\n config.version = CONFIG_SCHEMA_VERSION;\n });\n}\n\nexport async function migrateBehaviorConfig(filePath: string): Promise<EasyCodingConfig> {\n const config = await readConfigYaml(filePath);\n const { approvalMode, workflowMode, tddEnabled, tddCoverageThreshold } =\n resolveLegacyBehavior(config);\n return setBehaviorModes(filePath, approvalMode, workflowMode, tddEnabled, tddCoverageThreshold);\n}\n\n/** @deprecated Use setBehaviorModes. Kept for API compatibility during the 0.9 beta. */\nexport async function setConfirmMode(\n filePath: string,\n mode: LegacyConfirmMode,\n): Promise<EasyCodingConfig> {\n const config = await readConfigYaml(filePath);\n const { workflowMode, tddEnabled, tddCoverageThreshold } = resolveLegacyBehavior(config);\n return setBehaviorModes(\n filePath,\n mode === \"lite\" ? \"guard\" : mode,\n mode === \"lite\" ? \"fast\" : workflowMode,\n tddEnabled,\n tddCoverageThreshold,\n );\n}\n\n/** @deprecated Use migrateBehaviorConfig. */\nexport const migrateConfirmModeConfig = migrateBehaviorConfig;\n\nexport async function ensureProjectId(filePath: string): Promise<string> {\n let projectId = \"\";\n await updateConfigYaml(filePath, (config) => {\n if (!config.project || typeof config.project !== \"object\") {\n config.project = { id: createProjectId(), name: \"\" };\n }\n if (typeof config.project.id !== \"string\" || !config.project.id.trim()) {\n config.project.id = createProjectId();\n }\n projectId = config.project.id;\n });\n return projectId;\n}\n\nexport async function updateSupermoduleConfig(\n filePath: string,\n supermodule: SupermoduleConfig,\n): Promise<EasyCodingConfig> {\n return updateConfigYaml(filePath, (config) => {\n config.supermodule = supermodule;\n });\n}\n\nexport function yamlHasAgent(documentContent: string, agent: AgentPlatform): boolean {\n const document = parseDocument(documentContent);\n const agents = document.get(\"agents\", true);\n if (!isSeq(agents)) {\n return false;\n }\n return agents.items.some((item) => isScalar(item) && String(item.value) === agent);\n}\n\nexport function createProjectId(): string {\n return `ec-${randomUUID()}`;\n}\n","import { constants } from \"node:fs\";\nimport { access, cp, writeFile as fsWriteFile, mkdir, readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\nexport async function writeTextFile(filePath: string, content: string): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fsWriteFile(filePath, content.endsWith(\"\\n\") ? content : `${content}\\n`, \"utf8\");\n}\n\nexport async function readTextFile(filePath: string): Promise<string> {\n return readFile(filePath, \"utf8\");\n}\n\nexport async function readTextIfExists(filePath: string): Promise<string | null> {\n if (!(await pathExists(filePath))) {\n return null;\n }\n return readTextFile(filePath);\n}\n\nexport async function copyDir(source: string, destination: string): Promise<void> {\n await ensureDir(destination);\n await cp(source, destination, { recursive: true });\n}\n\nexport async function isDirectory(filePath: string): Promise<boolean> {\n try {\n return (await stat(filePath)).isDirectory();\n } catch {\n return false;\n }\n}\n","import path from \"node:path\";\nimport { HOOK_BYTECODE_GITIGNORE_ENTRY, SESSIONS_GITIGNORE_ENTRY } from \"../constants/paths.js\";\nimport { readTextIfExists, writeTextFile } from \"./file-writer.js\";\n\nexport async function ensureGitignoreEntry(\n cwd: string,\n entry: string,\n heading = \"# ═══ easy-coding-harness (auto-generated) ═══\\n# Personal runtime state; do not commit\",\n): Promise<boolean> {\n const gitignorePath = path.join(cwd, \".gitignore\");\n const current = (await readTextIfExists(gitignorePath)) ?? \"\";\n const lines = current.split(/\\r?\\n/).map((line) => line.trim());\n\n if (lines.includes(entry)) {\n return false;\n }\n\n const prefix = current.trimEnd();\n const next = [prefix, heading, entry].filter(Boolean).join(\"\\n\");\n await writeTextFile(gitignorePath, next);\n return true;\n}\n\nexport function gitignoreContains(content: string, entry: string): boolean {\n return content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .includes(entry);\n}\n\nexport async function ensureEasyCodingSessionsIgnored(cwd: string): Promise<boolean> {\n return ensureGitignoreEntry(cwd, SESSIONS_GITIGNORE_ENTRY);\n}\n\n// Hook scripts are a multi-file Python package; running them emits __pycache__/*.pyc\n// next to the committed hooks. C-tier fix (dont_write_bytecode) stops generation at\n// the source; this is the defense-in-depth fallback so stray bytecode never reaches git.\nexport async function ensureHookBytecodeIgnored(cwd: string): Promise<boolean> {\n return ensureGitignoreEntry(\n cwd,\n HOOK_BYTECODE_GITIGNORE_ENTRY,\n \"# ═══ easy-coding-harness (auto-generated) ═══\\n# Python bytecode from hook scripts; do not commit\",\n );\n}\n","export const EASY_CODING_DIR = \".easy-coding\";\nexport const CONFIG_FILE = \"config.yaml\";\nexport const INSTALL_MANIFEST_FILE = \"install-manifest.json\";\n// ec-init owns this file; the CLI never reads or writes it, only preserves it on clear.\nexport const PROJECT_CONFIG_FILE = \"project.yaml\";\nexport const SESSIONS_DIR = \"sessions\";\nexport const TASKS_DIR = \"tasks\";\nexport const PROJECT_INIT_TASK_ID = \"project-init\";\nexport const MEMORY_DIR = \"memory\";\nexport const SPEC_DIR = \"spec\";\nexport const MAIN_SPEC_DIR = \"main\";\nexport const DEV_SPEC_DIR = \"dev\";\n\nexport const TEMPLATES_DIR = \"templates\";\nexport const TOOLS_DIR = \"tools\";\nexport const TDD_DIR = \"tdd\";\nexport const TDD_READINESS_FILE = \"readiness.json\";\n\nexport const SESSIONS_GITIGNORE_ENTRY = \".easy-coding/sessions/\";\nexport const HOOK_BYTECODE_GITIGNORE_ENTRY = \"__pycache__/\";\n\nexport const GENERATED_REGION_START =\n \"<!-- ═══ easy-coding-harness generated (DO NOT EDIT BETWEEN MARKERS) ═══ -->\";\nexport const GENERATED_REGION_END = \"<!-- ═══ end easy-coding-harness generated ═══ -->\";\n","import { createHash } from \"node:crypto\";\nimport { readFile, rmdir, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { EASY_CODING_DIR, INSTALL_MANIFEST_FILE } from \"../constants/paths.js\";\nimport { type AgentPlatform, isAgentPlatform } from \"../types/platform.js\";\nimport { pathExists, readTextIfExists, writeTextFile } from \"./file-writer.js\";\n\nexport type InstallFileKind = \"skill\" | \"hook\" | \"agent\" | \"platform-config\";\n\nexport type InstallArtifact =\n | {\n type: \"file\";\n kind: InstallFileKind;\n filePath: string;\n platform: AgentPlatform;\n }\n | {\n type: \"hook-registration\";\n configPath: string;\n command: string;\n hookPath: string | null;\n platform: AgentPlatform;\n }\n | {\n type: \"constraint-region\";\n filePath: string;\n platform: AgentPlatform;\n };\n\nexport interface InstallManifest {\n schema_version: 1;\n harness_version: string;\n generated_at: string;\n agents: AgentPlatform[];\n files: InstallManifestFile[];\n hook_registrations: InstallManifestHookRegistration[];\n constraint_regions: InstallManifestConstraintRegion[];\n}\n\nexport interface InstallManifestFile {\n path: string;\n kind: InstallFileKind;\n platform: AgentPlatform;\n sha256: string;\n}\n\nexport interface InstallManifestHookRegistration {\n config_path: string;\n command: string;\n hook_path: string | null;\n platform: AgentPlatform;\n}\n\nexport interface InstallManifestConstraintRegion {\n path: string;\n platform: AgentPlatform;\n}\n\nexport interface PrunedInstallFiles {\n removed: string[];\n preserved: string[];\n}\n\nexport function fileArtifact(\n filePath: string,\n kind: InstallFileKind,\n platform: AgentPlatform,\n): InstallArtifact {\n return { type: \"file\", kind, filePath, platform };\n}\n\nexport function constraintRegionArtifact(\n filePath: string,\n platform: AgentPlatform,\n): InstallArtifact {\n return { type: \"constraint-region\", filePath, platform };\n}\n\nexport async function hookRegistrationArtifacts(\n configPath: string,\n platform: AgentPlatform,\n): Promise<InstallArtifact[]> {\n const content = await readTextIfExists(configPath);\n if (content === null) {\n return [];\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(content) as Record<string, unknown>;\n } catch {\n return [];\n }\n\n return collectHookCommands(parsed.hooks).map((command) => ({\n type: \"hook-registration\",\n configPath,\n command,\n hookPath: extractHookPathFromCommand(command),\n platform,\n }));\n}\n\nexport async function writeInstallManifest(\n cwd: string,\n params: {\n harnessVersion: string;\n agents: AgentPlatform[];\n artifacts: InstallArtifact[];\n mode?: \"replace\" | \"merge\";\n },\n): Promise<void> {\n const existing = params.mode === \"merge\" ? await readInstallManifest(cwd) : null;\n const files = new Map<string, InstallManifestFile>();\n const hookRegistrations = new Map<string, InstallManifestHookRegistration>();\n const constraintRegions = new Map<string, InstallManifestConstraintRegion>();\n\n if (existing) {\n for (const file of existing.files) {\n files.set(file.path, file);\n }\n for (const registration of existing.hook_registrations) {\n hookRegistrations.set(\n `${registration.config_path}\\0${normalizeCommand(registration.command)}`,\n registration,\n );\n }\n for (const region of existing.constraint_regions) {\n constraintRegions.set(region.path, region);\n }\n }\n\n for (const artifact of params.artifacts) {\n if (artifact.type === \"file\") {\n if (!(await pathExists(artifact.filePath))) {\n continue;\n }\n const relPath = toProjectPath(cwd, artifact.filePath);\n files.set(relPath, {\n path: relPath,\n kind: artifact.kind,\n platform: artifact.platform,\n sha256: await sha256File(artifact.filePath),\n });\n continue;\n }\n\n if (artifact.type === \"hook-registration\") {\n const configPath = toProjectPath(cwd, artifact.configPath);\n const registration = {\n config_path: configPath,\n command: artifact.command,\n hook_path: artifact.hookPath ? normalizeHookPath(cwd, artifact.hookPath) : null,\n platform: artifact.platform,\n };\n hookRegistrations.set(`${configPath}\\0${normalizeCommand(artifact.command)}`, registration);\n continue;\n }\n\n const relPath = toProjectPath(cwd, artifact.filePath);\n constraintRegions.set(relPath, {\n path: relPath,\n platform: artifact.platform,\n });\n }\n\n const manifest: InstallManifest = {\n schema_version: 1,\n harness_version: params.harnessVersion,\n generated_at: new Date().toISOString(),\n agents: [...new Set([...(existing?.agents ?? []), ...params.agents])],\n files: [...files.values()].sort(byPath),\n hook_registrations: [...hookRegistrations.values()].sort((a, b) =>\n `${a.config_path}\\0${a.command}`.localeCompare(`${b.config_path}\\0${b.command}`),\n ),\n constraint_regions: [...constraintRegions.values()].sort(byPath),\n };\n\n await writeTextFile(\n path.join(cwd, EASY_CODING_DIR, INSTALL_MANIFEST_FILE),\n JSON.stringify(manifest, null, 2),\n );\n}\n\nexport async function readInstallManifest(cwd: string): Promise<InstallManifest | null> {\n const manifestPath = path.join(cwd, EASY_CODING_DIR, INSTALL_MANIFEST_FILE);\n const content = await readTextIfExists(manifestPath);\n if (content === null) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(content) as Partial<InstallManifest>;\n if (\n parsed.schema_version !== 1 ||\n !Array.isArray(parsed.files) ||\n !Array.isArray(parsed.hook_registrations) ||\n !Array.isArray(parsed.constraint_regions)\n ) {\n return null;\n }\n const agents = Array.isArray(parsed.agents)\n ? parsed.agents.filter((agent): agent is AgentPlatform => isAgentPlatform(agent))\n : [];\n return { ...parsed, agents } as InstallManifest;\n } catch {\n return null;\n }\n}\n\nexport async function pruneRetiredManagedFiles(\n cwd: string,\n previous: InstallManifest | null,\n artifacts: InstallArtifact[],\n): Promise<PrunedInstallFiles> {\n if (!previous) {\n return { removed: [], preserved: [] };\n }\n\n const installedPaths = new Set(\n artifacts\n .filter(\n (artifact): artifact is Extract<InstallArtifact, { type: \"file\" }> =>\n artifact.type === \"file\",\n )\n .map((artifact) => toProjectPath(cwd, artifact.filePath)),\n );\n const removed: string[] = [];\n const preserved: string[] = [];\n\n for (const file of previous.files) {\n if (installedPaths.has(file.path)) {\n continue;\n }\n\n const filePath = manifestPath(cwd, file.path);\n if (!(await pathExists(filePath))) {\n continue;\n }\n if (!(await manifestFileMatches(filePath, file.sha256))) {\n preserved.push(file.path);\n continue;\n }\n\n await unlink(filePath);\n removed.push(file.path);\n try {\n await rmdir(path.dirname(filePath));\n } catch (error) {\n if (![\"ENOENT\", \"ENOTEMPTY\"].includes((error as NodeJS.ErrnoException).code ?? \"\")) {\n throw error;\n }\n }\n }\n\n return { removed, preserved };\n}\n\nexport async function manifestFileMatches(filePath: string, sha256: string): Promise<boolean> {\n if (!(await pathExists(filePath))) {\n return false;\n }\n return (await sha256File(filePath)) === sha256;\n}\n\nexport function manifestPath(cwd: string, projectPath: string): string {\n return resolveProjectPath(cwd, projectPath);\n}\n\nexport function toProjectPath(cwd: string, filePath: string): string {\n const root = path.resolve(cwd);\n const resolved = path.resolve(filePath);\n assertPathInsideProject(root, resolved, filePath);\n return path.relative(root, resolved).split(path.sep).join(\"/\");\n}\n\nexport function normalizeCommand(command: string): string {\n return command.replace(/\\\\/g, \"/\").trim().replace(/\\s+/g, \" \");\n}\n\nasync function sha256File(filePath: string): Promise<string> {\n const content = await readFile(filePath);\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction resolveProjectPath(cwd: string, projectPath: string): string {\n const normalized = projectPath.replace(/\\\\/g, \"/\");\n const parts = normalized.split(\"/\");\n if (\n normalized.trim() === \"\" ||\n path.isAbsolute(projectPath) ||\n path.posix.isAbsolute(normalized) ||\n path.win32.isAbsolute(projectPath) ||\n /^[A-Za-z]:/.test(projectPath) ||\n parts.some((part) => part === \"..\")\n ) {\n throw new Error(`Unsafe install manifest path: ${projectPath}`);\n }\n\n const root = path.resolve(cwd);\n const resolved = path.resolve(root, normalized);\n assertPathInsideProject(root, resolved, projectPath);\n return resolved;\n}\n\nfunction assertPathInsideProject(root: string, resolvedPath: string, sourcePath: string): void {\n const relative = path.relative(root, resolvedPath);\n if (!relative || relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Unsafe install manifest path: ${sourcePath}`);\n }\n}\n\nfunction collectHookCommands(hooks: unknown): string[] {\n if (!hooks || typeof hooks !== \"object\" || Array.isArray(hooks)) {\n return [];\n }\n\n const commands: string[] = [];\n for (const value of Object.values(hooks)) {\n if (!Array.isArray(value)) {\n continue;\n }\n for (const group of value) {\n if (!group || typeof group !== \"object\") {\n continue;\n }\n const hookItems = (group as { hooks?: unknown }).hooks;\n if (!Array.isArray(hookItems)) {\n continue;\n }\n for (const hook of hookItems) {\n if (!hook || typeof hook !== \"object\") {\n continue;\n }\n const command = (hook as { command?: unknown }).command;\n if (typeof command === \"string\") {\n commands.push(command);\n }\n }\n }\n }\n return commands;\n}\n\nexport function extractHookPathFromCommand(command: string): string | null {\n return extractQuotedHookPath(command) ?? extractUnquotedHookPath(command);\n}\n\nfunction extractQuotedHookPath(command: string): string | null {\n for (let index = 0; index < command.length; index += 1) {\n const quote = command[index];\n if (quote !== '\"' && quote !== \"'\") {\n continue;\n }\n if (index > 0 && !/\\s/.test(command[index - 1])) {\n continue;\n }\n\n const parsed = parseQuotedToken(command, index, quote);\n if (!parsed) {\n continue;\n }\n\n const suffix = readPathSuffix(command, parsed.endIndex);\n for (const candidate of [parsed.value + suffix, parsed.value]) {\n if (isHookPythonPath(candidate)) {\n return candidate;\n }\n }\n index = parsed.endIndex;\n }\n return null;\n}\n\nfunction parseQuotedToken(\n command: string,\n startIndex: number,\n quote: '\"' | \"'\",\n): { value: string; endIndex: number } | null {\n let value = \"\";\n for (let index = startIndex + 1; index < command.length; index += 1) {\n const char = command[index];\n if (quote === '\"' && char === \"\\\\\" && index + 1 < command.length) {\n value += command[index + 1];\n index += 1;\n continue;\n }\n if (char === quote) {\n return { value, endIndex: index + 1 };\n }\n value += char;\n }\n return null;\n}\n\nfunction readPathSuffix(command: string, startIndex: number): string {\n if (command[startIndex] !== \"/\") {\n return \"\";\n }\n let suffix = \"\";\n for (let index = startIndex; index < command.length; index += 1) {\n const char = command[index];\n if (/\\s/.test(char)) {\n break;\n }\n suffix += char;\n }\n return suffix;\n}\n\nfunction extractUnquotedHookPath(command: string): string | null {\n const match = command.match(/(?:^|\\s)(\\S+\\/hooks\\/\\S+\\.py)(?:\\s|$)/);\n return match?.[1] ?? null;\n}\n\nfunction isHookPythonPath(candidate: string): boolean {\n return /\\/hooks\\/\\S+\\.py$/.test(candidate);\n}\n\nfunction normalizeHookPath(cwd: string, hookPath: string): string {\n const normalized = hookPath.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n if (\n path.isAbsolute(hookPath) ||\n path.posix.isAbsolute(normalized) ||\n path.win32.isAbsolute(hookPath)\n ) {\n return toProjectPath(cwd, hookPath);\n }\n return normalized;\n}\n\nfunction byPath<T extends { path: string }>(a: T, b: T): number {\n return a.path.localeCompare(b.path);\n}\n","export type AgentPlatform = \"claude-code\" | \"codex\" | \"qoder\";\n\nexport interface TemplateContext {\n workflow_agent_id: AgentPlatform;\n sub_agent_dispatch: string;\n platform_spawn_instruction: string;\n skill_trigger: \"/\" | \"$\";\n workflow_state_path: string;\n main_constraint_file: \"CLAUDE.md\" | \"AGENTS.md\";\n python_cmd: string;\n platform_config_dir: string;\n platform_hook_session_start_command?: string;\n platform_hook_inject_workflow_state_command?: string;\n platform_hook_inject_subagent_context_command?: string;\n supermodule_boundary: string;\n}\n\nexport interface PlatformMeta {\n label: string;\n skillsDir: string;\n hooksDir: string;\n hookConfigFile: string;\n agentsDir: string;\n agentFileExt: \".md\" | \".toml\";\n mainConstraint: \"CLAUDE.md\" | \"AGENTS.md\";\n skillTrigger: \"/\" | \"$\";\n hookEvents: string[];\n stateInjectEvent: string[];\n hasSubagentContext: boolean;\n cnVariant?: string;\n templateContext: TemplateContext;\n}\n\nconst pythonCmd = process.platform === \"win32\" ? \"python\" : \"python3\";\n\nexport const PLATFORM_META: Record<AgentPlatform, PlatformMeta> = {\n \"claude-code\": {\n label: \"Claude Code\",\n skillsDir: \".claude/skills\",\n hooksDir: \".claude/hooks\",\n hookConfigFile: \".claude/settings.json\",\n agentsDir: \".claude/agents\",\n agentFileExt: \".md\",\n mainConstraint: \"CLAUDE.md\",\n skillTrigger: \"/\",\n hookEvents: [\"SessionStart\", \"PreToolUse\", \"UserPromptSubmit\", \"Stop\"],\n stateInjectEvent: [\"SessionStart\", \"UserPromptSubmit\"],\n hasSubagentContext: true,\n templateContext: {\n workflow_agent_id: \"claude-code\",\n sub_agent_dispatch: \"Agent tool\",\n platform_spawn_instruction:\n 'Use the Agent tool with run_in_background when useful; use isolation: \"worktree\" for parallel file edits.',\n skill_trigger: \"/\",\n workflow_state_path: \".easy-coding/sessions/\",\n main_constraint_file: \"CLAUDE.md\",\n python_cmd: pythonCmd,\n platform_config_dir: \".claude\",\n supermodule_boundary: \"\",\n },\n },\n codex: {\n label: \"Codex\",\n skillsDir: \".agents/skills\",\n hooksDir: \".codex/hooks\",\n hookConfigFile: \".codex/hooks.json\",\n agentsDir: \".codex/agents\",\n agentFileExt: \".toml\",\n mainConstraint: \"AGENTS.md\",\n skillTrigger: \"$\",\n hookEvents: [\"SessionStart\", \"UserPromptSubmit\"],\n stateInjectEvent: [\"SessionStart\", \"UserPromptSubmit\"],\n hasSubagentContext: false,\n templateContext: {\n workflow_agent_id: \"codex\",\n sub_agent_dispatch: \"Codex sub-agent dispatch\",\n platform_spawn_instruction:\n \"Use Codex sub-agent delegation where available; pass the full task card in the prompt.\",\n skill_trigger: \"$\",\n workflow_state_path: \".easy-coding/sessions/\",\n main_constraint_file: \"AGENTS.md\",\n python_cmd: pythonCmd,\n platform_config_dir: \".codex\",\n supermodule_boundary: \"\",\n },\n },\n qoder: {\n label: \"Qoder\",\n skillsDir: \".qoder/skills\",\n hooksDir: \".qoder/hooks\",\n hookConfigFile: \".qoder/settings.json\",\n agentsDir: \".qoder/agents\",\n agentFileExt: \".md\",\n mainConstraint: \"AGENTS.md\",\n skillTrigger: \"/\",\n hookEvents: [\"UserPromptSubmit\", \"PreToolUse\", \"Stop\"],\n stateInjectEvent: [\"UserPromptSubmit\"],\n hasSubagentContext: true,\n cnVariant: \".qodercn\",\n templateContext: {\n workflow_agent_id: \"qoder\",\n sub_agent_dispatch: \"Agent tool\",\n platform_spawn_instruction:\n \"Use the Agent tool with worktree isolation for parallel file edits.\",\n skill_trigger: \"/\",\n workflow_state_path: \".easy-coding/sessions/\",\n main_constraint_file: \"AGENTS.md\",\n python_cmd: pythonCmd,\n platform_config_dir: \".qoder\",\n supermodule_boundary: \"\",\n },\n },\n};\n\nexport const AGENT_PLATFORMS = Object.keys(PLATFORM_META) as AgentPlatform[];\n\nexport function isAgentPlatform(value: string): value is AgentPlatform {\n return Object.hasOwn(PLATFORM_META, value);\n}\n","import path from \"node:path\";\nimport {\n CONFIG_FILE,\n DEV_SPEC_DIR,\n EASY_CODING_DIR,\n MAIN_SPEC_DIR,\n MEMORY_DIR,\n SESSIONS_DIR,\n SPEC_DIR,\n TEMPLATES_DIR,\n TOOLS_DIR,\n} from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport type { SupermoduleConfig } from \"../types/supermodule.js\";\nimport {\n createDefaultConfig,\n createProjectId,\n ensureProjectId,\n writeConfigYaml,\n} from \"./config-yaml.js\";\nimport { ensureDir, pathExists, readTextFile, writeTextFile } from \"./file-writer.js\";\nimport { getTemplatePath } from \"./template-paths.js\";\n\nexport async function writeRuntimeScaffold(\n cwd: string,\n agents: AgentPlatform[],\n opts: { supermodule?: SupermoduleConfig; projectId?: string } = {},\n): Promise<string> {\n const easyCodingDir = path.join(cwd, EASY_CODING_DIR);\n await ensureDir(easyCodingDir);\n\n const configPath = path.join(easyCodingDir, CONFIG_FILE);\n let projectId = opts.projectId ?? createProjectId();\n if (!(await pathExists(configPath))) {\n const projectName = path.basename(cwd);\n await writeConfigYaml(\n configPath,\n createDefaultConfig({\n projectName,\n projectId,\n harnessVersion: VERSION,\n agents,\n supermodule: opts.supermodule,\n }),\n );\n } else {\n projectId = await ensureProjectId(configPath);\n }\n\n await ensureDir(path.join(easyCodingDir, \"tasks\"));\n await ensureDir(path.join(easyCodingDir, SESSIONS_DIR));\n await ensureDir(path.join(easyCodingDir, SPEC_DIR, MAIN_SPEC_DIR));\n await ensureDir(path.join(easyCodingDir, SPEC_DIR, DEV_SPEC_DIR));\n await writeMemoryScaffold(easyCodingDir);\n await writeTemplatesScaffold(easyCodingDir);\n await writeToolsScaffold(easyCodingDir);\n return projectId;\n}\n\nasync function writeToolsScaffold(easyCodingDir: string): Promise<void> {\n const toolsDir = path.join(easyCodingDir, TOOLS_DIR);\n await ensureDir(toolsDir);\n for (const file of [\"easy_coding_java_coverage.py\", \"easy_coding_tdd_readiness.py\"]) {\n const src = getTemplatePath(\"runtime\", \"tools\", file);\n await writeTextFile(path.join(toolsDir, file), await readTextFile(src));\n }\n}\n\nasync function writeTemplatesScaffold(easyCodingDir: string): Promise<void> {\n const templatesDir = path.join(easyCodingDir, TEMPLATES_DIR);\n await ensureDir(templatesDir);\n\n const src = getTemplatePath(\"runtime\", \"templates\", \"dev-spec-skeleton.md\");\n const dest = path.join(templatesDir, \"dev-spec-skeleton.md\");\n await writeTextFile(dest, await readTextFile(src));\n}\n\nasync function writeMemoryScaffold(easyCodingDir: string): Promise<void> {\n const memoryDir = path.join(easyCodingDir, MEMORY_DIR);\n await ensureDir(path.join(memoryDir, \"short\"));\n await ensureDir(path.join(memoryDir, \"long\"));\n\n for (const file of [\"MEMORY.md\", \"BUSINESS.md\", \"TECHNICAL.md\"]) {\n const destination = path.join(memoryDir, \"long\", file);\n if (await pathExists(destination)) {\n continue;\n }\n const templatePath = getTemplatePath(\"runtime\", \"memory\", \"long\", file);\n await writeTextFile(destination, await readTextFile(templatePath));\n }\n\n const shortTemplateDest = path.join(memoryDir, \"SHORT_MEMORY_TEMPLATE.md\");\n if (!(await pathExists(shortTemplateDest))) {\n const templatePath = getTemplatePath(\"runtime\", \"memory\", \"SHORT_MEMORY_TEMPLATE.md\");\n await writeTextFile(shortTemplateDest, await readTextFile(templatePath));\n }\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function getTemplateRoot(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, \"../templates\"),\n path.resolve(here, \"../../templates\"),\n path.resolve(process.cwd(), \"src/templates\"),\n path.resolve(process.cwd(), \"templates\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Unable to locate templates directory. Tried: ${candidates.join(\", \")}`);\n }\n return found;\n}\n\nexport function getTemplatePath(...segments: string[]): string {\n return path.join(getTemplateRoot(), ...segments);\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n EASY_CODING_DIR,\n PROJECT_INIT_TASK_ID,\n SESSIONS_DIR,\n TASKS_DIR,\n} from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport type { Stage, TaskJson, TaskStatus, WorkflowAgentIdentity } from \"../types/task.js\";\nimport {\n type ConfiguredWorkflowMode,\n DEFAULT_TDD_COVERAGE_THRESHOLD,\n readConfigYaml,\n resolveLegacyBehavior,\n} from \"./config-yaml.js\";\nimport { pathExists, readTextFile, writeTextFile } from \"./file-writer.js\";\n\nexport type ProjectInitSource = \"fresh\" | \"legacy-easy-coding\";\n\ntype LegacyStage = \"WAITING_CONFIRM\" | \"MEMORY_SHORT\" | \"MEMORY_LONG\" | \"REVIEW\" | \"VERIFICATION\";\n\nconst LEGACY_STAGE_MAP: Record<LegacyStage, Stage> = {\n WAITING_CONFIRM: \"ANALYSIS\",\n MEMORY_SHORT: \"MEMORY\",\n MEMORY_LONG: \"MEMORY\",\n REVIEW: \"QUALITY\",\n VERIFICATION: \"QUALITY\",\n};\n\nexport interface WorkflowStateMigrationResult {\n tasksUpdated: number;\n sessionsUpdated: number;\n}\n\nexport function createProjectInitTask(params: {\n agents: AgentPlatform[];\n initSource?: ProjectInitSource;\n legacyAssets?: string[];\n legacyMissingHarnessFiles?: string[];\n now?: Date;\n}): TaskJson {\n return {\n type: \"project-init\",\n status: \"PENDING\",\n created_at: (params.now ?? new Date()).toISOString(),\n created_by: \"cli-init\",\n last_agent: \"cli\",\n stage_history: [],\n context: {\n agents_installed: params.agents,\n cli_version: VERSION,\n init_source: params.initSource ?? \"fresh\",\n ...(params.legacyAssets ? { legacy_assets: params.legacyAssets } : {}),\n ...(params.legacyMissingHarnessFiles\n ? { legacy_missing_harness_files: params.legacyMissingHarnessFiles }\n : {}),\n },\n init_log: [],\n };\n}\n\nexport function enterTaskStage(\n task: TaskJson,\n stage: Stage,\n agent: WorkflowAgentIdentity,\n): TaskJson {\n return {\n ...task,\n status: stage,\n last_agent: agent,\n stage_history: [\n ...(task.stage_history ?? []),\n { stage, agent, entered_at: new Date().toISOString() },\n ],\n };\n}\n\nexport function getTaskJsonPath(cwd: string, taskId: string): string {\n return path.join(cwd, EASY_CODING_DIR, TASKS_DIR, taskId, \"task.json\");\n}\n\nexport async function writeTaskJson(filePath: string, task: TaskJson): Promise<void> {\n await writeTextFile(filePath, JSON.stringify(task, null, 2));\n}\n\nexport async function readTaskJson(filePath: string): Promise<TaskJson> {\n return JSON.parse(await readTextFile(filePath)) as TaskJson;\n}\n\nexport async function writeProjectInitTask(\n cwd: string,\n agents: AgentPlatform[],\n options: {\n initSource?: ProjectInitSource;\n legacyAssets?: string[];\n legacyMissingHarnessFiles?: string[];\n } = {},\n): Promise<void> {\n await writeTaskJson(\n getTaskJsonPath(cwd, PROJECT_INIT_TASK_ID),\n createProjectInitTask({\n agents,\n initSource: options.initSource,\n legacyAssets: options.legacyAssets,\n legacyMissingHarnessFiles: options.legacyMissingHarnessFiles,\n }),\n );\n}\n\n// Older harness versions wrote an absolute project_path into the committed init\n// task, leaking each contributor's local checkout root across a shared repo. Strip\n// it on upgrade; idempotent and a no-op when the task or field is absent.\nexport async function stripInitTaskProjectPath(cwd: string): Promise<boolean> {\n const filePath = getTaskJsonPath(cwd, PROJECT_INIT_TASK_ID);\n if (!(await pathExists(filePath))) return false;\n const task = await readTaskJson(filePath);\n if (!task.context || !(\"project_path\" in task.context)) return false;\n // Assign undefined instead of `delete` (biome noDelete); JSON.stringify drops the\n // key on write, so the persisted task.json no longer carries project_path.\n task.context.project_path = undefined;\n await writeTaskJson(filePath, task);\n return true;\n}\n\nfunction isLegacyStage(value: unknown): value is LegacyStage {\n return typeof value === \"string\" && value in LEGACY_STAGE_MAP;\n}\n\nfunction migrateStage(value: unknown): unknown {\n return isLegacyStage(value) ? LEGACY_STAGE_MAP[value] : value;\n}\n\nconst LEGACY_DISPLAY_AGENT_IDENTITIES: Record<string, AgentPlatform> = {\n \"claude with easy coding\": \"claude-code\",\n \"claude-code with easy coding\": \"claude-code\",\n \"claude code with easy coding\": \"claude-code\",\n \"codex with easy coding\": \"codex\",\n \"qoder with easy coding\": \"qoder\",\n};\n\nfunction migratedAgentIdentity(value: unknown): AgentPlatform | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === \"claude-code\" || normalized === \"codex\" || normalized === \"qoder\") {\n return normalized;\n }\n if (/^\\/?root(?:\\/[a-z0-9._-]+)*$/.test(normalized)) return \"codex\";\n return LEGACY_DISPLAY_AGENT_IDENTITIES[normalized];\n}\n\nfunction migrateAgentFields(record: Record<string, unknown>, fields: string[]): boolean {\n let changed = false;\n for (const field of fields) {\n const migrated = migratedAgentIdentity(record[field]);\n if (migrated && migrated !== record[field]) {\n record[field] = migrated;\n changed = true;\n }\n }\n return changed;\n}\n\ninterface AgentFieldGroup {\n record: Record<string, unknown>;\n fields: string[];\n}\n\nfunction taskAgentFieldGroups(task: Record<string, unknown>): AgentFieldGroup[] {\n const groups: AgentFieldGroup[] = [\n {\n record: task,\n fields: [\"created_by\", \"last_agent\", \"workflow_mode_confirmed_by\", \"tdd_confirmed_by\"],\n },\n ];\n for (const field of [\n \"pending_transition\",\n \"workflow_mode_proposal\",\n \"quality_checkpoint\",\n \"verification_checkpoint\",\n ]) {\n const value = task[field];\n if (!value || typeof value !== \"object\" || Array.isArray(value)) continue;\n const identityField =\n field === \"pending_transition\"\n ? \"requested_by\"\n : field === \"workflow_mode_proposal\"\n ? \"proposed_by\"\n : \"recorded_by\";\n groups.push({ record: value as Record<string, unknown>, fields: [identityField] });\n }\n if (Array.isArray(task.workflow_mode_escalations)) {\n for (const escalation of task.workflow_mode_escalations) {\n if (!escalation || typeof escalation !== \"object\" || Array.isArray(escalation)) continue;\n groups.push({ record: escalation as Record<string, unknown>, fields: [\"raised_by\"] });\n }\n }\n const memoryProgress = task.memory_progress;\n if (memoryProgress && typeof memoryProgress === \"object\" && !Array.isArray(memoryProgress)) {\n const assessment = (memoryProgress as Record<string, unknown>).architecture_assessment;\n if (assessment && typeof assessment === \"object\" && !Array.isArray(assessment)) {\n groups.push({ record: assessment as Record<string, unknown>, fields: [\"recorded_by\"] });\n }\n }\n if (Array.isArray(task.spec_dependency_evidence)) {\n for (const evidence of task.spec_dependency_evidence) {\n if (!evidence || typeof evidence !== \"object\" || Array.isArray(evidence)) continue;\n groups.push({ record: evidence as Record<string, unknown>, fields: [\"satisfied_by\"] });\n }\n }\n if (Array.isArray(task.stage_history)) {\n for (const entry of task.stage_history) {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) continue;\n groups.push({ record: entry as Record<string, unknown>, fields: [\"agent\"] });\n }\n }\n return groups;\n}\n\nfunction migrateTaskAgentIdentities(task: Record<string, unknown>): boolean {\n return taskAgentFieldGroups(task).reduce(\n (changed, group) => migrateAgentFields(group.record, group.fields) || changed,\n false,\n );\n}\n\nfunction hasLegacyTaskAgentIdentities(task: Record<string, unknown>): boolean {\n return taskAgentFieldGroups(task).some(({ record, fields }) =>\n fields.some((field) => {\n const migrated = migratedAgentIdentity(record[field]);\n return migrated !== undefined && migrated !== record[field];\n }),\n );\n}\n\nfunction migrateStageHistory(task: Record<string, unknown>): boolean {\n if (!Array.isArray(task.stage_history)) return false;\n\n let changed = false;\n const migrated: unknown[] = [];\n for (const rawEntry of task.stage_history) {\n if (!rawEntry || typeof rawEntry !== \"object\" || Array.isArray(rawEntry)) {\n migrated.push(rawEntry);\n continue;\n }\n const entry = { ...(rawEntry as Record<string, unknown>) };\n const mappedStage = migrateStage(entry.stage);\n if (mappedStage !== entry.stage) {\n entry.stage = mappedStage;\n changed = true;\n }\n const previous = migrated.at(-1);\n if (\n previous &&\n typeof previous === \"object\" &&\n !Array.isArray(previous) &&\n (previous as Record<string, unknown>).stage === entry.stage\n ) {\n changed = true;\n continue;\n }\n migrated.push(entry);\n }\n\n if (changed) task.stage_history = migrated;\n return changed;\n}\n\nfunction migrateTaskWorkflowState(task: Record<string, unknown>): boolean {\n const legacyStatus = isLegacyStage(task.status) ? task.status : null;\n const legacyRequestedAt = Array.isArray(task.stage_history)\n ? [...task.stage_history]\n .reverse()\n .find(\n (entry) =>\n entry &&\n typeof entry === \"object\" &&\n !Array.isArray(entry) &&\n (entry as Record<string, unknown>).stage === \"WAITING_CONFIRM\",\n )\n : null;\n let changed = migrateTaskAgentIdentities(task);\n changed = migrateStageHistory(task) || changed;\n\n if (legacyStatus) {\n task.status = LEGACY_STAGE_MAP[legacyStatus];\n changed = true;\n }\n\n const pending = task.pending_transition;\n if (pending && typeof pending === \"object\" && !Array.isArray(pending)) {\n const record = pending as Record<string, unknown>;\n const from = migrateStage(record.from);\n const to = migrateStage(record.to);\n if (from === to) {\n task.pending_transition = undefined;\n changed = true;\n } else if (from !== record.from || to !== record.to) {\n task.pending_transition = { ...record, from, to };\n changed = true;\n }\n }\n\n if (\n !task.quality_checkpoint &&\n task.verification_checkpoint &&\n typeof task.verification_checkpoint === \"object\" &&\n !Array.isArray(task.verification_checkpoint)\n ) {\n task.quality_checkpoint = task.verification_checkpoint;\n }\n if (\"verification_checkpoint\" in task) {\n task.verification_checkpoint = undefined;\n changed = true;\n }\n\n if (legacyStatus === \"WAITING_CONFIRM\" && !task.pending_transition) {\n const requestedAt =\n legacyRequestedAt &&\n typeof legacyRequestedAt === \"object\" &&\n !Array.isArray(legacyRequestedAt)\n ? String(\n (legacyRequestedAt as Record<string, unknown>).entered_at ?? new Date().toISOString(),\n )\n : new Date().toISOString();\n task.pending_transition = {\n from: \"ANALYSIS\",\n to: \"IMPLEMENT\",\n requested_at: requestedAt,\n requested_by: migratedAgentIdentity(task.last_agent) ?? \"upgrade-migration\",\n reason: \"migrated-from-WAITING_CONFIRM\",\n };\n changed = true;\n }\n\n if (legacyStatus === \"MEMORY_LONG\") {\n const progress =\n task.memory_progress && typeof task.memory_progress === \"object\"\n ? { ...(task.memory_progress as Record<string, unknown>) }\n : {};\n if (progress.short_memory_written !== true) {\n progress.short_memory_written = true;\n }\n progress.legacy_short_memory_assumed = true;\n progress.updated_at = new Date().toISOString();\n task.memory_progress = progress;\n changed = true;\n }\n\n const status = String(task.status ?? \"\");\n const taskType = String(task.type ?? \"\").toLowerCase();\n let isActive = ![\"\", \"PENDING\", \"COMPLETE\", \"CLOSED\"].includes(status);\n if (isActive && [\"analysis\", \"doc\", \"report\"].includes(taskType)) {\n task.status = \"CLOSED\";\n task.closed_reason = \"legacy-read-only-task-retired\";\n task.pending_transition = undefined;\n task.stage_history = [\n ...(Array.isArray(task.stage_history) ? task.stage_history : []),\n {\n stage: \"CLOSED\",\n agent: \"upgrade-migration\",\n entered_at: new Date().toISOString(),\n },\n ];\n task.last_agent = \"upgrade-migration\";\n isActive = false;\n changed = true;\n }\n if (\n isActive &&\n taskType !== \"project-init\" &&\n ![\"fast\", \"standard\", \"strict\"].includes(String(task.workflow_mode ?? \"\"))\n ) {\n task.workflow_mode = \"standard\";\n task.workflow_mode_confirmed_at = new Date().toISOString();\n task.workflow_mode_confirmed_by = \"upgrade-migration\";\n task.workflow_mode_legacy = true;\n changed = true;\n }\n if (isActive && taskType !== \"project-init\" && typeof task.tdd_enabled !== \"boolean\") {\n task.tdd_enabled = false;\n task.tdd_coverage_threshold ??= DEFAULT_TDD_COVERAGE_THRESHOLD;\n task.tdd_confirmed_at = new Date().toISOString();\n task.tdd_confirmed_by = \"upgrade-migration\";\n changed = true;\n }\n\n return changed;\n}\n\nfunction migrateSessionBehavior(session: Record<string, unknown>): boolean {\n let changed = migrateAgentFields(session, [\"agent\", \"last_agent\"]);\n const legacyMode = session.confirm_mode;\n const legacyLite = legacyMode === \"lite\";\n if (![\"approve\", \"guard\", \"confirm\", \"auto\"].includes(String(session.approval_mode ?? \"\"))) {\n if (legacyLite) {\n session.approval_mode = \"guard\";\n changed = true;\n } else if ([\"approve\", \"guard\", \"confirm\", \"auto\"].includes(String(legacyMode ?? \"\"))) {\n session.approval_mode = legacyMode;\n changed = true;\n }\n }\n if (![\"adaptive\", \"fast\", \"standard\", \"strict\"].includes(String(session.workflow_mode ?? \"\"))) {\n if (legacyLite) {\n session.workflow_mode = \"fast\";\n session.workflow_mode_legacy_confirm_override = true;\n session.workflow_mode_legacy_alias_override = undefined;\n changed = true;\n } else if ([\"approve\", \"guard\", \"confirm\", \"auto\"].includes(String(legacyMode ?? \"\"))) {\n session.workflow_mode = \"adaptive\";\n session.workflow_mode_legacy_alias_override = true;\n session.workflow_mode_legacy_confirm_override = undefined;\n changed = true;\n }\n }\n if (legacyLite && session.workflow_mode_legacy_alias_override === true) {\n session.workflow_mode_legacy_alias_override = undefined;\n changed = true;\n } else if (\n [\"approve\", \"guard\", \"confirm\", \"auto\"].includes(String(legacyMode ?? \"\")) &&\n session.workflow_mode_legacy_confirm_override === true\n ) {\n session.workflow_mode_legacy_confirm_override = undefined;\n changed = true;\n }\n if (\"confirm_mode\" in session) {\n session.confirm_mode = undefined;\n changed = true;\n }\n return changed;\n}\n\ninterface SessionMigrationCandidate {\n currentTask: string;\n agent?: string;\n lastAgent?: string;\n workflowMode?: ConfiguredWorkflowMode;\n}\n\nconst WORKFLOW_MODE_RANK: Record<Exclude<ConfiguredWorkflowMode, \"adaptive\">, number> = {\n fast: 0,\n standard: 1,\n strict: 2,\n};\n\nfunction sessionMigrationCandidate(\n session: Record<string, unknown>,\n): SessionMigrationCandidate | null {\n if (typeof session.current_task !== \"string\") return null;\n const workflowMode = [\"adaptive\", \"fast\", \"standard\", \"strict\"].includes(\n String(session.workflow_mode ?? \"\"),\n )\n ? (session.workflow_mode as ConfiguredWorkflowMode)\n : undefined;\n return {\n currentTask: session.current_task,\n agent: typeof session.agent === \"string\" ? session.agent : undefined,\n lastAgent: typeof session.last_agent === \"string\" ? session.last_agent : undefined,\n workflowMode,\n };\n}\n\nfunction relevantSessionMigrationCandidates(\n task: Record<string, unknown>,\n candidates: SessionMigrationCandidate[],\n): SessionMigrationCandidate[] {\n const taskAgent = String(task.last_agent ?? \"\");\n const ownerCandidates = candidates.filter(\n (candidate) => candidate.agent === taskAgent || candidate.lastAgent === taskAgent,\n );\n return ownerCandidates.length > 0 ? ownerCandidates : candidates;\n}\n\nfunction migrationWorkflowMode(\n task: Record<string, unknown>,\n candidates: SessionMigrationCandidate[],\n projectWorkflowMode: ConfiguredWorkflowMode,\n): Exclude<ConfiguredWorkflowMode, \"adaptive\"> {\n const taskType = String(task.type ?? \"\").toLowerCase();\n if ([\"analysis\", \"doc\", \"report\"].includes(taskType)) return \"fast\";\n\n const relevantCandidates = relevantSessionMigrationCandidates(task, candidates);\n const fallbackMode = projectWorkflowMode === \"adaptive\" ? \"standard\" : projectWorkflowMode;\n const concreteModes = relevantCandidates.map((candidate) =>\n candidate.workflowMode === \"adaptive\" ? \"standard\" : (candidate.workflowMode ?? fallbackMode),\n );\n if (concreteModes.length === 0) return fallbackMode;\n return concreteModes.reduce((highest, mode) =>\n WORKFLOW_MODE_RANK[mode] > WORKFLOW_MODE_RANK[highest] ? mode : highest,\n );\n}\n\nasync function taskFiles(cwd: string): Promise<string[]> {\n const tasksDir = path.join(cwd, EASY_CODING_DIR, TASKS_DIR);\n if (!(await pathExists(tasksDir))) return [];\n const entries = await readdir(tasksDir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(tasksDir, entry.name, \"task.json\"));\n}\n\nasync function sessionFiles(cwd: string): Promise<string[]> {\n const sessionsDir = path.join(cwd, EASY_CODING_DIR, SESSIONS_DIR);\n if (!(await pathExists(sessionsDir))) return [];\n const entries = await readdir(sessionsDir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => path.join(sessionsDir, entry.name));\n}\n\nasync function readJsonRecord(filePath: string): Promise<Record<string, unknown> | null> {\n try {\n const parsed = JSON.parse(await readTextFile(filePath));\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\nexport async function hasLegacyWorkflowState(cwd: string): Promise<boolean> {\n for (const filePath of await taskFiles(cwd)) {\n if (!(await pathExists(filePath))) continue;\n const task = await readJsonRecord(filePath);\n if (!task) continue;\n if (\n hasLegacyTaskAgentIdentities(task) ||\n isLegacyStage(task.status) ||\n \"verification_checkpoint\" in task ||\n (![\"PENDING\", \"COMPLETE\", \"CLOSED\"].includes(String(task.status ?? \"\")) &&\n [\"analysis\", \"doc\", \"report\"].includes(String(task.type ?? \"\").toLowerCase())) ||\n (![\"PENDING\", \"COMPLETE\", \"CLOSED\"].includes(String(task.status ?? \"\")) &&\n String(task.type ?? \"\") !== \"project-init\" &&\n ![\"fast\", \"standard\", \"strict\"].includes(String(task.workflow_mode ?? \"\"))) ||\n (Array.isArray(task.stage_history) &&\n task.stage_history.some(\n (entry) =>\n entry &&\n typeof entry === \"object\" &&\n !Array.isArray(entry) &&\n isLegacyStage((entry as Record<string, unknown>).stage),\n ))\n ) {\n return true;\n }\n }\n\n for (const filePath of await sessionFiles(cwd)) {\n const session = await readJsonRecord(filePath);\n if (!session) continue;\n if (\n [\"agent\", \"last_agent\"].some((field) => {\n const migrated = migratedAgentIdentity(session[field]);\n return migrated !== undefined && migrated !== session[field];\n }) ||\n isLegacyStage(session.last_seen_stage) ||\n \"confirm_mode\" in session\n ) {\n return true;\n }\n }\n return false;\n}\n\nexport async function migrateLegacyWorkflowState(\n cwd: string,\n): Promise<WorkflowStateMigrationResult> {\n let tasksUpdated = 0;\n let sessionsUpdated = 0;\n const updatedTaskPaths = new Set<string>();\n let projectWorkflowMode: ConfiguredWorkflowMode = \"adaptive\";\n const configPath = path.join(cwd, EASY_CODING_DIR, \"config.yaml\");\n if (await pathExists(configPath)) {\n try {\n const config = await readConfigYaml(configPath);\n projectWorkflowMode = resolveLegacyBehavior(config).workflowMode;\n } catch {\n // Keep the conservative adaptive fallback; config migration reports malformed YAML.\n }\n }\n\n for (const filePath of await taskFiles(cwd)) {\n if (!(await pathExists(filePath))) continue;\n const task = await readJsonRecord(filePath);\n if (!task) continue;\n if (!migrateTaskWorkflowState(task)) continue;\n await writeTextFile(filePath, JSON.stringify(task, null, 2));\n tasksUpdated += 1;\n updatedTaskPaths.add(filePath);\n }\n\n const sessionCandidates: SessionMigrationCandidate[] = [];\n for (const filePath of await sessionFiles(cwd)) {\n const session = await readJsonRecord(filePath);\n if (!session) continue;\n const mappedStage = migrateStage(session.last_seen_stage);\n let changed = false;\n if (mappedStage !== session.last_seen_stage) {\n session.last_seen_stage = mappedStage;\n changed = true;\n }\n changed = migrateSessionBehavior(session) || changed;\n if (typeof session.current_task === \"string\") {\n const task = await readJsonRecord(getTaskJsonPath(cwd, session.current_task));\n if (task && [\"COMPLETE\", \"CLOSED\"].includes(String(task.status ?? \"\"))) {\n session.current_task = null;\n session.last_seen_task = null;\n session.last_seen_stage = \"idle\";\n changed = true;\n }\n }\n const candidate = sessionMigrationCandidate(session);\n if (candidate) sessionCandidates.push(candidate);\n if (changed) {\n await writeTextFile(filePath, JSON.stringify(session, null, 2));\n sessionsUpdated += 1;\n }\n }\n\n const candidatesByTask = new Map<string, SessionMigrationCandidate[]>();\n for (const candidate of sessionCandidates) {\n const candidates = candidatesByTask.get(candidate.currentTask) ?? [];\n candidates.push(candidate);\n candidatesByTask.set(candidate.currentTask, candidates);\n }\n for (const filePath of await taskFiles(cwd)) {\n const task = await readJsonRecord(filePath);\n if (!task) continue;\n const migrationOwned =\n task.workflow_mode_legacy === true && task.workflow_mode_confirmed_by === \"upgrade-migration\";\n if (!migrationOwned) continue;\n const taskId = path.basename(path.dirname(filePath));\n const mode = migrationWorkflowMode(\n task,\n candidatesByTask.get(taskId) ?? [],\n projectWorkflowMode,\n );\n let changed = false;\n if (task.workflow_mode !== mode) {\n task.workflow_mode = mode;\n task.workflow_mode_confirmed_at = new Date().toISOString();\n changed = true;\n }\n if (\"workflow_mode_legacy_direct_edge\" in task) {\n task.workflow_mode_legacy_direct_edge = undefined;\n changed = true;\n }\n if (changed) {\n await writeTextFile(filePath, JSON.stringify(task, null, 2));\n if (!updatedTaskPaths.has(filePath)) {\n tasksUpdated += 1;\n updatedTaskPaths.add(filePath);\n }\n }\n }\n\n return { tasksUpdated, sessionsUpdated };\n}\n\nexport async function setPendingInitSince(cwd: string, version: string): Promise<void> {\n const filePath = getTaskJsonPath(cwd, PROJECT_INIT_TASK_ID);\n if (!(await pathExists(filePath))) return;\n const task = await readTaskJson(filePath);\n if (task.status !== \"COMPLETE\") return;\n task.pending_init_since = version;\n await writeTaskJson(filePath, task);\n}\n\nexport interface TaskSummary {\n id: string;\n task: TaskJson;\n}\n\nexport async function listTasks(cwd: string): Promise<TaskSummary[]> {\n const tasksDir = path.join(cwd, EASY_CODING_DIR, TASKS_DIR);\n if (!(await pathExists(tasksDir))) {\n return [];\n }\n\n const entries = await readdir(tasksDir, { withFileTypes: true });\n const tasks: TaskSummary[] = [];\n\n for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const taskPath = getTaskJsonPath(cwd, entry.name);\n if (!(await pathExists(taskPath))) {\n continue;\n }\n\n tasks.push({ id: entry.name, task: await readTaskJson(taskPath) });\n }\n\n return tasks;\n}\n\nexport function summarizeTaskStatuses(tasks: TaskSummary[]): Record<TaskStatus, number> {\n return tasks.reduce(\n (summary, item) => {\n summary[item.task.status] = (summary[item.task.status] ?? 0) + 1;\n return summary;\n },\n {} as Record<TaskStatus, number>,\n );\n}\n\nexport function isActiveTask(task: TaskJson): boolean {\n return task.status !== \"COMPLETE\" && task.status !== \"CLOSED\";\n}\n","import path from \"node:path\";\nimport { CONFIGURATORS } from \"../configurators/index.js\";\nimport { writeMainConstraint } from \"../configurators/shared.js\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport type {\n InstallContext,\n SupermoduleBoundary,\n SupermoduleConfig,\n} from \"../types/supermodule.js\";\nimport { createProjectId, updateSupermoduleConfig } from \"../utils/config-yaml.js\";\nimport { ensureEasyCodingSessionsIgnored, ensureHookBytecodeIgnored } from \"../utils/gitignore.js\";\nimport { type InstallArtifact, writeInstallManifest } from \"../utils/install-manifest.js\";\nimport { writeRuntimeScaffold } from \"../utils/runtime-scaffold.js\";\nimport { writeProjectInitTask } from \"../utils/task-json.js\";\n\nexport async function configurePlatformsForDir(\n targetDir: string,\n platforms: AgentPlatform[],\n opts: { supermodule?: SupermoduleBoundary; projectId?: string } = {},\n): Promise<InstallArtifact[]> {\n const artifacts: InstallArtifact[] = [];\n\n for (const platform of platforms) {\n artifacts.push(...(await CONFIGURATORS[platform](targetDir, opts)));\n }\n\n return artifacts;\n}\n\nexport async function installHarnessToDir(\n targetDir: string,\n platforms: AgentPlatform[],\n ctx: InstallContext,\n): Promise<InstallArtifact[]> {\n const projectId = createProjectId();\n const artifacts = await configurePlatformsForDir(targetDir, platforms, {\n supermodule: boundaryFromContext(ctx),\n projectId,\n });\n await writeRuntimeScaffold(targetDir, platforms, {\n supermodule: supermoduleConfigFromContext(ctx),\n projectId,\n });\n await writeInstallManifest(targetDir, {\n harnessVersion: VERSION,\n agents: platforms,\n artifacts,\n });\n await writeProjectInitTask(targetDir, platforms, {\n initSource: ctx.initSource,\n legacyAssets: ctx.legacyAssets,\n legacyMissingHarnessFiles: ctx.legacyMissingHarnessFiles,\n });\n await ensureEasyCodingSessionsIgnored(targetDir);\n await ensureHookBytecodeIgnored(targetDir);\n\n return artifacts;\n}\n\nexport function supermoduleConfigFromContext(ctx: InstallContext): SupermoduleConfig {\n if (ctx.role === \"super-parent\") {\n return {\n role: \"super-parent\",\n submodules: ctx.submodulePaths ?? [],\n };\n }\n\n if (ctx.role === \"submodule-child\") {\n return {\n role: \"submodule-child\",\n parent: ctx.parent,\n };\n }\n\n return { role: \"standalone\" };\n}\n\nexport async function refreshSupermoduleParent(\n targetDir: string,\n platforms: AgentPlatform[],\n submodulePaths: string[],\n): Promise<void> {\n const supermodule: SupermoduleConfig = {\n role: \"super-parent\",\n submodules: submodulePaths,\n };\n await updateSupermoduleConfig(path.join(targetDir, EASY_CODING_DIR, CONFIG_FILE), supermodule);\n\n for (const platform of platforms) {\n await writeMainConstraint(targetDir, platform, {\n supermodule: { submodulePaths },\n });\n }\n}\n\nfunction boundaryFromContext(ctx: InstallContext): SupermoduleBoundary | undefined {\n if (ctx.role !== \"super-parent\") {\n return undefined;\n }\n return { submodulePaths: ctx.submodulePaths ?? [] };\n}\n","import path from \"node:path\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport {\n type InstallArtifact,\n constraintRegionArtifact,\n fileArtifact,\n hookRegistrationArtifacts,\n} from \"../utils/install-manifest.js\";\nimport type { ConfigureOptions } from \"./index.js\";\nimport {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\n withProjectInstallPaths,\n writeMainConstraint,\n writeSharedHooks,\n writeSkills,\n} from \"./shared.js\";\n\nexport async function configureClaude(\n cwd: string,\n opts: ConfigureOptions = {},\n): Promise<InstallArtifact[]> {\n const platform = \"claude-code\";\n const meta = PLATFORM_META[platform];\n const ctx = await withProjectInstallPaths(cwd, meta.templateContext, opts.projectId);\n const dest = path.join(cwd, \".claude\");\n const hookConfigPath = path.join(cwd, meta.hookConfigFile);\n const artifacts: InstallArtifact[] = [];\n\n const platformFiles = await copyPlatformTemplates(\"claude\", dest, [\"hooks\"], ctx);\n artifacts.push(\n ...platformFiles\n .filter((filePath) => filePath !== hookConfigPath)\n .map((filePath) =>\n fileArtifact(\n filePath,\n filePath.startsWith(path.join(cwd, meta.agentsDir)) ? \"agent\" : \"platform-config\",\n platform,\n ),\n ),\n );\n artifacts.push(...(await hookRegistrationArtifacts(hookConfigPath, platform)));\n artifacts.push(\n ...(await writeSharedHooks(path.join(dest, \"hooks\"), platform)).map((filePath) =>\n fileArtifact(filePath, \"hook\", platform),\n ),\n );\n artifacts.push(\n ...(\n await writeSkills(\n path.join(cwd, meta.skillsDir),\n await resolveSkills(ctx),\n await resolveBundledSkills(ctx),\n )\n ).map((filePath) => fileArtifact(filePath, \"skill\", platform)),\n );\n artifacts.push(\n constraintRegionArtifact(await writeMainConstraint(cwd, platform, opts), platform),\n );\n\n return artifacts;\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n CONFIG_FILE,\n EASY_CODING_DIR,\n GENERATED_REGION_END,\n GENERATED_REGION_START,\n} from \"../constants/paths.js\";\nimport type { AgentPlatform, TemplateContext } from \"../types/platform.js\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport type { SupermoduleBoundary } from \"../types/supermodule.js\";\nimport { readProjectIdIfExists } from \"../utils/config-yaml.js\";\nimport {\n ensureDir,\n isDirectory,\n pathExists,\n readTextFile,\n readTextIfExists,\n writeTextFile,\n} from \"../utils/file-writer.js\";\nimport { extractMarkedRegion, replaceMarkedRegion } from \"../utils/marked-region.js\";\nimport { getTemplatePath } from \"../utils/template-paths.js\";\n\nexport interface SkillTemplate {\n name: string;\n content: string;\n}\n\nexport interface BundledSkillTemplate {\n name: string;\n sourceDir: string;\n context: TemplateContext;\n}\n\nexport interface SharedHookOptions {\n skipSubagentContext?: boolean;\n}\n\nexport class UnresolvedPlaceholderError extends Error {\n constructor(contentName: string, placeholders: string[]) {\n super(`Unresolved placeholders in ${contentName}: ${placeholders.join(\", \")}`);\n this.name = \"UnresolvedPlaceholderError\";\n }\n}\n\nexport function resolvePlaceholders(\n content: string,\n ctx: TemplateContext,\n contentName = \"template\",\n): string {\n const withPython = content.replace(/\\{\\{PYTHON_CMD\\}\\}/g, ctx.python_cmd);\n const resolved = withPython.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: keyof TemplateContext) => {\n const value = ctx[key];\n return value === undefined ? match : String(value);\n });\n\n const unresolved = [...resolved.matchAll(/\\{\\{[^}]+\\}\\}/g)].map((match) => match[0]);\n if (unresolved.length > 0) {\n throw new UnresolvedPlaceholderError(contentName, unresolved);\n }\n\n return resolved;\n}\n\nexport async function withProjectInstallPaths(\n cwd: string,\n ctx: TemplateContext,\n projectId?: string,\n): Promise<TemplateContext> {\n const resolvedProjectId =\n projectId ?? (await readProjectIdIfExists(path.join(cwd, EASY_CODING_DIR, CONFIG_FILE)));\n return withInstallPaths(cwd, ctx, resolvedProjectId ?? undefined);\n}\n\nexport function withInstallPaths(\n cwd: string,\n ctx: TemplateContext,\n projectId?: string,\n): TemplateContext {\n return {\n ...ctx,\n platform_hook_session_start_command: jsonStringContent(\n renderHookCommand(cwd, ctx, \"session-start.py\", process.platform, projectId),\n ),\n platform_hook_inject_workflow_state_command: jsonStringContent(\n renderHookCommand(cwd, ctx, \"inject-workflow-state.py\", process.platform, projectId),\n ),\n platform_hook_inject_subagent_context_command: jsonStringContent(\n renderHookCommand(cwd, ctx, \"inject-subagent-context.py\", process.platform, projectId),\n ),\n };\n}\n\nexport function renderHookCommand(\n _cwd: string,\n ctx: TemplateContext,\n scriptName: string,\n platform: NodeJS.Platform = process.platform,\n projectId?: string,\n): string {\n const launcher = `import base64;exec(base64.b64decode('${Buffer.from(HOOK_LAUNCHER_PYTHON).toString(\"base64\")}').decode())`;\n const rootIdArg = projectId ? ` ${shellDoubleQuoteArg(projectId, platform)}` : \"\";\n return `${ctx.python_cmd} -c ${shellDoubleQuoteArg(launcher, platform)}${rootIdArg} ${ctx.platform_config_dir}/hooks/${scriptName}`;\n}\n\nexport function shellDoubleQuoteArg(\n value: string,\n platform: NodeJS.Platform = process.platform,\n): string {\n if (platform === \"win32\") {\n if (value.includes('\"')) {\n throw new Error(\"Windows hook paths cannot contain double quotes.\");\n }\n return `\"${value}\"`;\n }\n return `\"${value.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`;\n}\n\nfunction jsonStringContent(value: string): string {\n return JSON.stringify(value).slice(1, -1);\n}\n\n// Keep hook dirs commit-clean: the launcher imports the shared hook modules, so\n// disable __pycache__/*.pyc generation before any import runs. Without this the\n// bytecode lands next to the committed hook scripts and pollutes shared repos.\nconst HOOK_LAUNCHER_PYTHON = [\n \"import io,json,os,re,runpy,sys\",\n \"sys.dont_write_bytecode=True\",\n \"from pathlib import Path\",\n \"payload=sys.stdin.read()\",\n \"try:\",\n \" data=json.loads(payload or '{}')\",\n \"except Exception:\",\n \" data={}\",\n \"expected_id=sys.argv[1] if len(sys.argv) > 2 else None\",\n \"script_arg=sys.argv[2] if len(sys.argv) > 2 else (sys.argv[1] if len(sys.argv) > 1 else None)\",\n \"def project_id(root):\",\n \" try:\",\n \" lines=(root / '.easy-coding' / 'config.yaml').read_text(encoding='utf-8').splitlines()\",\n \" except Exception:\",\n \" return None\",\n \" in_project=False\",\n \" for line in lines:\",\n \" if not in_project:\",\n \" if re.match(r'^project\\\\s*:\\\\s*(?:#.*)?$', line):\",\n \" in_project=True\",\n \" continue\",\n \" if not line.strip() or line.lstrip().startswith('#'):\",\n \" continue\",\n \" if not line.startswith((' ', '\\\\t')):\",\n \" return None\",\n ' match=re.match(r\"\\\\s+id\\\\s*:\\\\s*[\\'\\\\\"]?([^\\'\\\\\"#\\\\s]+)\", line)',\n \" if match:\",\n \" return match.group(1)\",\n \" return None\",\n \"def roots_from(raw):\",\n \" if not raw:\",\n \" return []\",\n \" start=Path(raw).resolve()\",\n \" return [candidate for candidate in (start, *start.parents) if (candidate / '.easy-coding').is_dir()]\",\n \"sources=[os.environ.get('CLAUDE_PROJECT_DIR'), os.environ.get('QODER_PROJECT_DIR'), data.get('cwd'), os.getcwd()]\",\n \"root=None\",\n \"if expected_id:\",\n \" root=next((candidate for raw in sources for candidate in roots_from(raw) if project_id(candidate) == expected_id), None)\",\n \"else:\",\n \" root=next((candidate for raw in sources for candidate in roots_from(raw)), None)\",\n \"target=(root / script_arg) if root and script_arg else None\",\n \"if target and target.is_file():\",\n \" os.chdir(root)\",\n \" data['cwd']=str(root)\",\n \" sys.stdin=io.StringIO(json.dumps(data))\",\n \" sys.path.insert(0, str(target.parent))\",\n \" runpy.run_path(str(target), run_name='__main__')\",\n].join(\"\\n\");\n\nexport async function resolveSkills(ctx: TemplateContext): Promise<SkillTemplate[]> {\n const skillsRoot = getTemplatePath(\"common\", \"skills\");\n const entries = await readdir(skillsRoot);\n const skills: SkillTemplate[] = [];\n\n for (const entry of entries.sort()) {\n const skillDir = path.join(skillsRoot, entry);\n if (!(await isDirectory(skillDir))) {\n continue;\n }\n const content = await readTextFile(path.join(skillDir, \"SKILL.md\"));\n skills.push({\n name: entry,\n content: resolvePlaceholders(content, ctx, `common/skills/${entry}/SKILL.md`),\n });\n }\n\n return skills;\n}\n\nexport async function resolveBundledSkills(ctx: TemplateContext): Promise<BundledSkillTemplate[]> {\n const bundledRoot = getTemplatePath(\"common\", \"bundled-skills\");\n if (!(await pathExists(bundledRoot))) {\n return [];\n }\n\n const entries = await readdir(bundledRoot);\n const bundled: BundledSkillTemplate[] = [];\n for (const entry of entries.sort()) {\n const sourceDir = path.join(bundledRoot, entry);\n if (await isDirectory(sourceDir)) {\n bundled.push({ name: entry, sourceDir, context: ctx });\n }\n }\n return bundled;\n}\n\nexport async function writeSkills(\n dir: string,\n skills: SkillTemplate[],\n bundled: BundledSkillTemplate[],\n): Promise<string[]> {\n await ensureDir(dir);\n const written: string[] = [];\n\n for (const skill of skills) {\n const destination = path.join(dir, skill.name, \"SKILL.md\");\n await writeTextFile(destination, skill.content);\n written.push(destination);\n }\n\n for (const skill of bundled) {\n written.push(\n ...(await copyTemplateDirectory(skill.sourceDir, path.join(dir, skill.name), skill.context)),\n );\n }\n\n return written;\n}\n\nexport async function writeSharedHooks(\n dir: string,\n platform: AgentPlatform,\n opts: SharedHookOptions = {},\n): Promise<string[]> {\n const hooksRoot = getTemplatePath(\"shared-hooks\");\n const ctx = PLATFORM_META[platform].templateContext;\n const entries = await readdir(hooksRoot);\n await ensureDir(dir);\n const written: string[] = [];\n\n for (const entry of entries.sort()) {\n if (opts.skipSubagentContext && entry === \"inject-subagent-context.py\") {\n continue;\n }\n const sourcePath = path.join(hooksRoot, entry);\n if ((await stat(sourcePath)).isDirectory()) {\n continue;\n }\n const content = resolvePlaceholders(\n await readTextFile(sourcePath),\n ctx,\n `shared-hooks/${entry}`,\n );\n const destination = path.join(dir, entry);\n await writeTextFile(destination, content);\n await import(\"node:fs/promises\").then(({ chmod }) => chmod(destination, 0o755));\n written.push(destination);\n }\n\n return written;\n}\n\nexport async function copyPlatformTemplates(\n platformTemplateDir: string,\n destination: string,\n skipDirs: string[],\n ctx: TemplateContext,\n): Promise<string[]> {\n const source = getTemplatePath(platformTemplateDir);\n return copyTemplateDirectory(source, destination, ctx, new Set(skipDirs));\n}\n\nexport async function writeMainConstraint(\n cwd: string,\n platform: AgentPlatform,\n opts: { supermodule?: SupermoduleBoundary } = {},\n): Promise<string> {\n const meta = PLATFORM_META[platform];\n const ctx: TemplateContext = {\n ...meta.templateContext,\n supermodule_boundary: renderSupermoduleBoundary(opts.supermodule),\n };\n const templateName = `${meta.mainConstraint}.tpl`;\n const template = await readTextFile(getTemplatePath(\"main-constraint\", templateName));\n const generated = resolvePlaceholders(template, ctx, `main-constraint/${templateName}`);\n\n if (!generated.includes(GENERATED_REGION_START) || !generated.includes(GENERATED_REGION_END)) {\n throw new Error(`Main constraint template ${templateName} does not contain generated markers.`);\n }\n\n const destination = path.join(cwd, meta.mainConstraint);\n const current = await readTextIfExists(destination);\n if (current) {\n const markerContent = extractMarkedRegion(generated);\n if (!markerContent) {\n throw new Error(`Main constraint template ${templateName} generated content lacks markers.`);\n }\n await writeTextFile(destination, replaceMarkedRegion(current, markerContent));\n } else {\n await writeTextFile(destination, generated);\n }\n return destination;\n}\n\nfunction renderSupermoduleBoundary(boundary?: SupermoduleBoundary): string {\n if (!boundary || boundary.submodulePaths.length === 0) {\n return \"\";\n }\n\n const submodules = boundary.submodulePaths.map((submodulePath) => `- \\`${submodulePath}\\``);\n return [\n \"\",\n \"## Supermodule Boundary\",\n \"\",\n \"This directory is a git supermodule root. The following subdirectories are independent\",\n \"submodule harness roots with their own git boundaries and Easy Coding runtime:\",\n \"\",\n ...submodules,\n \"\",\n \"- Cross-repo work launched from this root uses the parent `.easy-coding` task, session, state, and spec as the source of truth.\",\n \"- Child `.easy-coding` directories are not parent workflow state sources.\",\n \"- During memory archive, technical memory that belongs to a child repo is written only to that child's `.easy-coding/memory`; do not write child task/session/state files from the parent.\",\n \"- Commit submodule changes in two steps: push each child repo first, then commit and push the parent gitlink update.\",\n \"- Parent memory should keep cross-repo context; child technical details should follow the owning child repo.\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function copyTemplateDirectory(\n source: string,\n destination: string,\n ctx: TemplateContext,\n skipDirs = new Set<string>(),\n): Promise<string[]> {\n await ensureDir(destination);\n const written: string[] = [];\n\n for (const entry of (await readdir(source)).sort()) {\n if (skipDirs.has(entry) || shouldSkipTemplateEntry(entry)) {\n continue;\n }\n\n const sourcePath = path.join(source, entry);\n const destinationPath = path.join(destination, stripTemplateExtension(entry));\n const sourceStat = await stat(sourcePath);\n\n if (sourceStat.isDirectory()) {\n written.push(...(await copyTemplateDirectory(sourcePath, destinationPath, ctx, skipDirs)));\n continue;\n }\n\n const content = resolvePlaceholders(await readTextFile(sourcePath), ctx, sourcePath);\n await writeTextFile(destinationPath, content);\n written.push(destinationPath);\n }\n\n return written;\n}\n\nfunction shouldSkipTemplateEntry(entry: string): boolean {\n return (\n entry === \".DS_Store\" ||\n entry === \"__pycache__\" ||\n entry.endsWith(\".ts\") ||\n entry.endsWith(\".js\") ||\n entry.endsWith(\".map\")\n );\n}\n\nfunction stripTemplateExtension(fileName: string): string {\n return fileName.endsWith(\".tpl\") ? fileName.slice(0, -4) : fileName;\n}\n","import { GENERATED_REGION_END, GENERATED_REGION_START } from \"../constants/paths.js\";\n\nexport class MarkedRegionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MarkedRegionError\";\n }\n}\n\nexport function extractMarkedRegion(content: string): string | null {\n const start = content.indexOf(GENERATED_REGION_START);\n const end = content.indexOf(GENERATED_REGION_END);\n\n if (start === -1 && end === -1) {\n return null;\n }\n if (start === -1 || end === -1 || end < start) {\n throw new MarkedRegionError(\"Generated region markers are incomplete or out of order.\");\n }\n\n return content.slice(start, end + GENERATED_REGION_END.length);\n}\n\nexport function replaceMarkedRegion(existing: string, generatedRegion: string): string {\n const currentRegion = extractMarkedRegion(existing);\n if (!currentRegion) {\n return `${generatedRegion.trim()}\\n\\n${existing.trimStart()}`.trimEnd();\n }\n return existing.replace(currentRegion, generatedRegion.trim());\n}\n\nexport function hasMarkedRegion(content: string): boolean {\n return extractMarkedRegion(content) !== null;\n}\n\n// Strips the generated region (and its markers) while keeping the user's surrounding content.\n// Returns \"\" when nothing but the region remained, so callers can keep an empty shell file.\nexport function removeMarkedRegion(content: string): string {\n const region = extractMarkedRegion(content);\n if (!region) {\n return content;\n }\n const remaining = content\n .replace(region, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n return remaining ? `${remaining}\\n` : \"\";\n}\n","import path from \"node:path\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport {\n type InstallArtifact,\n constraintRegionArtifact,\n fileArtifact,\n hookRegistrationArtifacts,\n} from \"../utils/install-manifest.js\";\nimport type { ConfigureOptions } from \"./index.js\";\nimport {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\n withProjectInstallPaths,\n writeMainConstraint,\n writeSharedHooks,\n writeSkills,\n} from \"./shared.js\";\n\nexport async function configureCodex(\n cwd: string,\n opts: ConfigureOptions = {},\n): Promise<InstallArtifact[]> {\n const platform = \"codex\";\n const meta = PLATFORM_META[platform];\n const ctx = await withProjectInstallPaths(cwd, meta.templateContext, opts.projectId);\n const hookConfigPath = path.join(cwd, meta.hookConfigFile);\n const artifacts: InstallArtifact[] = [];\n\n artifacts.push(\n ...(\n await writeSkills(\n path.join(cwd, meta.skillsDir),\n await resolveSkills(ctx),\n await resolveBundledSkills(ctx),\n )\n ).map((filePath) => fileArtifact(filePath, \"skill\", platform)),\n );\n artifacts.push(\n ...(\n await writeSharedHooks(path.join(cwd, meta.hooksDir), platform, {\n skipSubagentContext: true,\n })\n ).map((filePath) => fileArtifact(filePath, \"hook\", platform)),\n );\n\n const platformFiles = await copyPlatformTemplates(\n \"codex\",\n path.join(cwd, \".codex\"),\n [\"hooks\"],\n ctx,\n );\n artifacts.push(\n ...platformFiles\n .filter((filePath) => filePath !== hookConfigPath)\n .map((filePath) =>\n fileArtifact(\n filePath,\n filePath.startsWith(path.join(cwd, meta.agentsDir)) ? \"agent\" : \"platform-config\",\n platform,\n ),\n ),\n );\n artifacts.push(...(await hookRegistrationArtifacts(hookConfigPath, platform)));\n artifacts.push(\n constraintRegionArtifact(await writeMainConstraint(cwd, platform, opts), platform),\n );\n\n return artifacts;\n}\n","import type { Dirent } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport {\n type InstallArtifact,\n constraintRegionArtifact,\n fileArtifact,\n hookRegistrationArtifacts,\n} from \"../utils/install-manifest.js\";\nimport { resolvePlatformMeta } from \"../utils/platform-paths.js\";\nimport type { ConfigureOptions } from \"./index.js\";\nimport {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\n withProjectInstallPaths,\n writeMainConstraint,\n writeSharedHooks,\n writeSkills,\n} from \"./shared.js\";\n\nasync function claudeHarnessSkillsExist(cwd: string): Promise<boolean> {\n return pathExists(path.join(cwd, \".claude\", \"skills\", \"ec-workflow\", \"SKILL.md\"));\n}\n\nasync function listFilesRecursive(dir: string): Promise<string[]> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const files: string[] = [];\n for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n const entryPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listFilesRecursive(entryPath)));\n continue;\n }\n if (entry.isFile()) {\n files.push(entryPath);\n }\n }\n return files;\n}\n\nasync function existingManagedSkillArtifacts(\n skillsDir: string,\n skillNames: string[],\n platform: \"qoder\",\n): Promise<InstallArtifact[]> {\n const artifacts: InstallArtifact[] = [];\n for (const skillName of skillNames) {\n for (const filePath of await listFilesRecursive(path.join(skillsDir, skillName))) {\n artifacts.push(fileArtifact(filePath, \"skill\", platform));\n }\n }\n return artifacts;\n}\n\nexport async function configureQoder(\n cwd: string,\n opts: ConfigureOptions = {},\n): Promise<InstallArtifact[]> {\n const platform = \"qoder\";\n const meta = resolvePlatformMeta(cwd, platform);\n const ctx = await withProjectInstallPaths(cwd, meta.templateContext, opts.projectId);\n const dest = path.join(cwd, ctx.platform_config_dir);\n const hookConfigPath = path.join(cwd, meta.hookConfigFile);\n const artifacts: InstallArtifact[] = [];\n\n const platformFiles = await copyPlatformTemplates(\"qoder\", dest, [\"hooks\"], ctx);\n artifacts.push(\n ...platformFiles\n .filter((filePath) => filePath !== hookConfigPath)\n .map((filePath) =>\n fileArtifact(\n filePath,\n filePath.startsWith(path.join(cwd, meta.agentsDir)) ? \"agent\" : \"platform-config\",\n platform,\n ),\n ),\n );\n artifacts.push(...(await hookRegistrationArtifacts(hookConfigPath, platform)));\n artifacts.push(\n ...(await writeSharedHooks(path.join(dest, \"hooks\"), platform)).map((filePath) =>\n fileArtifact(filePath, \"hook\", platform),\n ),\n );\n\n // Qoder scans both .qoder/skills/ and .claude/skills/ at runtime.\n // Skip writing to .qoder/skills/ when Claude Code skills already exist to avoid duplicates.\n const skills = await resolveSkills(ctx);\n const bundledSkills = await resolveBundledSkills(ctx);\n if (!(await claudeHarnessSkillsExist(cwd))) {\n artifacts.push(\n ...(await writeSkills(path.join(dest, \"skills\"), skills, bundledSkills)).map((filePath) =>\n fileArtifact(filePath, \"skill\", platform),\n ),\n );\n } else {\n artifacts.push(\n ...(await existingManagedSkillArtifacts(\n path.join(dest, \"skills\"),\n [...skills.map((skill) => skill.name), ...bundledSkills.map((skill) => skill.name)],\n platform,\n )),\n );\n }\n\n artifacts.push(\n constraintRegionArtifact(await writeMainConstraint(cwd, platform, opts), platform),\n );\n\n return artifacts;\n}\nexport { detectQoderCnVariant } from \"../utils/platform-paths.js\";\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { type AgentPlatform, PLATFORM_META, type PlatformMeta } from \"../types/platform.js\";\n\nexport function detectQoderCnVariant(cwd: string): boolean {\n if (process.env.EC_QODER_VARIANT === \"cn\" || process.env.QODER_VARIANT === \"cn\") {\n return true;\n }\n return existsSync(path.join(cwd, PLATFORM_META.qoder.cnVariant ?? \".qodercn\"));\n}\n\nexport function resolvePlatformMeta(cwd: string, platform: AgentPlatform): PlatformMeta {\n const meta = PLATFORM_META[platform];\n if (platform !== \"qoder\" || !detectQoderCnVariant(cwd)) {\n return meta;\n }\n\n return resolveQoderMetaForBaseDir(meta.cnVariant ?? \".qodercn\");\n}\n\nexport function resolveQoderVariantMetas(): PlatformMeta[] {\n const standardDir = PLATFORM_META.qoder.templateContext.platform_config_dir;\n const cnDir = PLATFORM_META.qoder.cnVariant ?? \".qodercn\";\n return [...new Set([standardDir, cnDir])].map(resolveQoderMetaForBaseDir);\n}\n\nfunction resolveQoderMetaForBaseDir(baseDir: string): PlatformMeta {\n const meta = PLATFORM_META.qoder;\n return {\n ...meta,\n skillsDir: `${baseDir}/skills`,\n hooksDir: `${baseDir}/hooks`,\n hookConfigFile: `${baseDir}/settings.json`,\n agentsDir: `${baseDir}/agents`,\n templateContext: {\n ...meta.templateContext,\n platform_config_dir: baseDir,\n },\n };\n}\n","import type { AgentPlatform } from \"../types/platform.js\";\nimport type { SupermoduleBoundary } from \"../types/supermodule.js\";\nimport type { InstallArtifact } from \"../utils/install-manifest.js\";\nimport { configureClaude } from \"./claude.js\";\nimport { configureCodex } from \"./codex.js\";\nimport { configureQoder } from \"./qoder.js\";\n\nexport interface ConfigureOptions {\n supermodule?: SupermoduleBoundary;\n projectId?: string;\n}\n\nexport type ConfigureFn = (cwd: string, opts?: ConfigureOptions) => Promise<InstallArtifact[]>;\n\nexport const CONFIGURATORS: Record<AgentPlatform, ConfigureFn> = {\n \"claude-code\": configureClaude,\n codex: configureCodex,\n qoder: configureQoder,\n};\n","import { cancel, confirm, multiselect } from \"@clack/prompts\";\nimport {\n AGENT_PLATFORMS,\n type AgentPlatform,\n PLATFORM_META,\n isAgentPlatform,\n} from \"../types/platform.js\";\nimport type { SubmoduleEntry } from \"../types/supermodule.js\";\n\nexport interface PlatformOptions {\n agent?: string;\n yes?: boolean;\n submodules?: string | false;\n}\n\nexport function parseAgentList(agentList: string): AgentPlatform[] {\n const values = agentList\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n\n if (values.length === 0) {\n throw new Error(\"No agent platform specified.\");\n }\n\n const invalid = values.filter((value) => !isAgentPlatform(value));\n if (invalid.length > 0) {\n throw new Error(`Unknown agent platform: ${invalid.join(\", \")}`);\n }\n\n return [...new Set(values)] as AgentPlatform[];\n}\n\nexport async function resolvePlatforms(\n opts: PlatformOptions,\n defaults: AgentPlatform[] = [\"claude-code\"],\n): Promise<AgentPlatform[]> {\n if (opts.agent) {\n return parseAgentList(opts.agent);\n }\n\n if (opts.yes) {\n return defaults;\n }\n\n let selectedDefaults = defaults;\n\n while (true) {\n const result = await multiselect({\n message: \"Select agent platforms (Space to toggle, Enter to review)\",\n options: AGENT_PLATFORMS.map((platform) => ({\n label: PLATFORM_META[platform].label,\n value: platform,\n })),\n initialValues: selectedDefaults,\n required: true,\n });\n\n if (typeof result === \"symbol\") {\n cancel(\"Platform selection cancelled.\");\n process.exit(1);\n }\n\n const labels = result.map((platform) => PLATFORM_META[platform].label).join(\", \");\n const shouldInstall = await confirm({\n message: `Install Easy Coding for: ${labels}?`,\n initialValue: true,\n });\n\n if (typeof shouldInstall === \"symbol\") {\n cancel(\"Platform selection cancelled.\");\n process.exit(1);\n }\n\n if (shouldInstall) {\n return result;\n }\n\n selectedDefaults = result;\n }\n}\n\nexport function parseSubmoduleList(\n submoduleList: string,\n available: SubmoduleEntry[],\n): SubmoduleEntry[] {\n const requested = submoduleList\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n\n if (requested.length === 0) {\n throw new Error(\"No submodule specified.\");\n }\n\n const byPathOrName = new Map<string, SubmoduleEntry>();\n for (const submodule of available) {\n byPathOrName.set(submodule.path, submodule);\n byPathOrName.set(submodule.name, submodule);\n }\n\n const selected: SubmoduleEntry[] = [];\n const invalid: string[] = [];\n for (const value of requested) {\n const submodule = byPathOrName.get(value);\n if (!submodule) {\n invalid.push(value);\n continue;\n }\n if (!selected.some((item) => item.path === submodule.path)) {\n selected.push(submodule);\n }\n }\n\n if (invalid.length > 0) {\n throw new Error(`Unknown or unavailable submodule: ${invalid.join(\", \")}`);\n }\n\n return selected.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nexport async function resolveSubmodules(\n opts: PlatformOptions,\n available: SubmoduleEntry[],\n defaultSelection: SubmoduleEntry[] = available,\n): Promise<SubmoduleEntry[]> {\n if (opts.submodules === false) {\n return [];\n }\n\n if (typeof opts.submodules === \"string\") {\n return parseSubmoduleList(opts.submodules, available);\n }\n\n if (available.length === 0) {\n return [];\n }\n\n if (opts.yes) {\n return defaultSelection;\n }\n\n const result = await multiselect({\n message: \"Select checked-out submodules to initialize (Space to toggle, Enter to confirm)\",\n options: available.map((submodule) => ({\n label: `${submodule.path} (${submodule.name})`,\n value: submodule.path,\n })),\n initialValues: defaultSelection.map((submodule) => submodule.path),\n required: false,\n });\n\n if (typeof result === \"symbol\") {\n cancel(\"Submodule selection cancelled.\");\n process.exit(1);\n }\n\n const selected = new Set(result);\n return available.filter((submodule) => selected.has(submodule.path));\n}\n","import path from \"node:path\";\nimport { cancel, multiselect } from \"@clack/prompts\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport type {\n SubmoduleEntry,\n SupermoduleBoundary,\n SupermoduleConfig,\n} from \"../types/supermodule.js\";\nimport { readConfigYaml } from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { listInstallableSubmodules, parseGitmodules } from \"../utils/gitmodules.js\";\nimport { type PlatformOptions, resolveSubmodules } from \"./platforms.js\";\n\nexport interface CommandTarget {\n dir: string;\n label: string;\n configPath: string;\n supermodule: SupermoduleConfig;\n boundary?: SupermoduleBoundary;\n}\n\nexport interface InitSubmoduleSelection {\n installable: SubmoduleEntry[];\n installed: SubmoduleEntry[];\n selected: SubmoduleEntry[];\n parentSubmodulePaths: string[];\n}\n\nexport function rejectSubmoduleListWithoutGitmodules(\n opts: Pick<PlatformOptions, \"submodules\">,\n): void {\n if (typeof opts.submodules === \"string\") {\n throw new Error(\"--submodules can only be used in a repository with .gitmodules.\");\n }\n}\n\nexport async function resolveAddAgentTargets(\n cwd: string,\n opts: PlatformOptions,\n): Promise<CommandTarget[]> {\n const installedSubmodules = await listInstalledSubmodules(cwd);\n if ((await parseGitmodules(cwd)).length === 0) {\n rejectSubmoduleListWithoutGitmodules(opts);\n return [standaloneTarget(cwd)];\n }\n\n const selected = await resolveSubmodules(opts, installedSubmodules);\n const parentManagedSubmodulePaths = await listParentManagedSubmodulePaths(cwd);\n const parentSubmodulePaths = [\n ...new Set([...parentManagedSubmodulePaths, ...selected.map((entry) => entry.path)]),\n ].sort();\n return [\n parentTargetFromPaths(cwd, parentSubmodulePaths),\n ...selected.map((entry) => childTarget(cwd, entry)),\n ];\n}\n\nexport async function resolveUpgradeTargets(cwd: string): Promise<CommandTarget[]> {\n const installedSubmodules = await listInstalledSubmodules(cwd);\n if ((await parseGitmodules(cwd)).length === 0) {\n return [standaloneTarget(cwd)];\n }\n\n return [\n parentTarget(cwd, installedSubmodules),\n ...installedSubmodules.map((entry) => childTarget(cwd, entry)),\n ];\n}\n\nexport async function resolveInitSubmoduleSelection(\n cwd: string,\n opts: PlatformOptions,\n): Promise<InitSubmoduleSelection> {\n const installable = await listInstallableSubmodules(cwd);\n const installed = await listInstalledSubmodules(cwd);\n const parentManagedSubmodulePaths = await listParentManagedSubmodulePaths(cwd);\n const defaultSelection = installable;\n const selected = await resolveSubmodules(opts, installable, defaultSelection);\n const parentSubmodulePaths = [\n ...new Set([...parentManagedSubmodulePaths, ...selected.map((entry) => entry.path)]),\n ].sort();\n\n return { installable, installed, selected, parentSubmodulePaths };\n}\n\nexport async function resolveClearTargets(\n cwd: string,\n opts: { yes?: boolean; submodules?: string | false },\n): Promise<CommandTarget[]> {\n if ((await parseGitmodules(cwd)).length === 0) {\n rejectSubmoduleListWithoutGitmodules(opts);\n return [standaloneTarget(cwd)];\n }\n\n const installedSubmodules = await listInstalledSubmodules(cwd);\n const parent = (await pathExists(path.join(cwd, EASY_CODING_DIR)))\n ? parentTarget(cwd, installedSubmodules)\n : null;\n const children = installedSubmodules.map((entry) => childTarget(cwd, entry));\n\n if (opts.submodules === false) {\n return parent ? [parent] : [];\n }\n\n if (typeof opts.submodules === \"string\") {\n return [\n ...(parent ? [parent] : []),\n ...parseSubmoduleSelection(opts.submodules, installedSubmodules).map((entry) =>\n childTarget(cwd, entry),\n ),\n ];\n }\n\n if (opts.yes) {\n return parent ? [parent] : [];\n }\n\n const candidates = [...(parent ? [parent] : []), ...children];\n if (candidates.length === 0) {\n return [];\n }\n\n const result = await multiselect({\n message: \"Select Easy Coding harness targets to clear\",\n options: candidates.map((target) => ({\n label: target.label === \".\" ? \"parent repository\" : `submodule: ${target.label}`,\n value: target.label,\n })),\n initialValues: parent ? [parent.label] : [],\n required: true,\n });\n\n if (typeof result === \"symbol\") {\n cancel(\"Clear target selection cancelled.\");\n process.exit(1);\n }\n\n const selected = new Set(result);\n return candidates.filter((target) => selected.has(target.label));\n}\n\nasync function listInstalledSubmodules(cwd: string): Promise<SubmoduleEntry[]> {\n const entries = await listInstallableSubmodules(cwd);\n const installed: SubmoduleEntry[] = [];\n\n for (const entry of entries) {\n if (await pathExists(configPath(path.join(cwd, entry.path)))) {\n installed.push(entry);\n }\n }\n\n return installed;\n}\n\nasync function listParentManagedSubmodulePaths(cwd: string): Promise<string[]> {\n const parentConfigPath = configPath(cwd);\n if (!(await pathExists(parentConfigPath))) {\n return [];\n }\n\n try {\n const config = await readConfigYaml(parentConfigPath);\n if (\n config.supermodule?.role !== \"super-parent\" ||\n !Array.isArray(config.supermodule.submodules)\n ) {\n return [];\n }\n return config.supermodule.submodules\n .filter((submodulePath): submodulePath is string => typeof submodulePath === \"string\")\n .sort();\n } catch {\n return [];\n }\n}\n\nfunction standaloneTarget(cwd: string): CommandTarget {\n return {\n dir: cwd,\n label: \".\",\n configPath: configPath(cwd),\n supermodule: { role: \"standalone\" },\n };\n}\n\nfunction parentTarget(cwd: string, installedSubmodules: SubmoduleEntry[]): CommandTarget {\n const submodulePaths = installedSubmodules.map((entry) => entry.path);\n return parentTargetFromPaths(cwd, submodulePaths);\n}\n\nfunction parentTargetFromPaths(cwd: string, submodulePaths: string[]): CommandTarget {\n return {\n dir: cwd,\n label: \".\",\n configPath: configPath(cwd),\n supermodule: { role: \"super-parent\", submodules: submodulePaths },\n boundary: { submodulePaths },\n };\n}\n\nfunction childTarget(cwd: string, entry: SubmoduleEntry): CommandTarget {\n const dir = path.join(cwd, entry.path);\n return {\n dir,\n label: entry.path,\n configPath: configPath(dir),\n supermodule: { role: \"submodule-child\", parent: toPosixRelative(dir, cwd) },\n };\n}\n\nfunction parseSubmoduleSelection(\n submoduleList: string,\n available: SubmoduleEntry[],\n): SubmoduleEntry[] {\n const requested = submoduleList\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n\n if (requested.length === 0) {\n throw new Error(\"No submodule specified.\");\n }\n\n const byPathOrName = new Map<string, SubmoduleEntry>();\n for (const submodule of available) {\n byPathOrName.set(submodule.path, submodule);\n byPathOrName.set(submodule.name, submodule);\n }\n\n const selected: SubmoduleEntry[] = [];\n const invalid: string[] = [];\n for (const value of requested) {\n const submodule = byPathOrName.get(value);\n if (!submodule) {\n invalid.push(value);\n continue;\n }\n if (!selected.some((item) => item.path === submodule.path)) {\n selected.push(submodule);\n }\n }\n\n if (invalid.length > 0) {\n throw new Error(`Unknown or unavailable initialized submodule: ${invalid.join(\", \")}`);\n }\n\n return selected.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction configPath(cwd: string): string {\n return path.join(cwd, EASY_CODING_DIR, CONFIG_FILE);\n}\n\nfunction toPosixRelative(from: string, to: string): string {\n const relative = path.relative(from, to);\n return relative ? relative.split(path.sep).join(\"/\") : \".\";\n}\n","import { lstat, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SubmoduleEntry } from \"../types/supermodule.js\";\nimport { readTextIfExists } from \"./file-writer.js\";\n\nexport async function parseGitmodules(rootDir: string): Promise<SubmoduleEntry[]> {\n const content = await readTextIfExists(path.join(rootDir, \".gitmodules\"));\n if (content === null) {\n return [];\n }\n\n const entries: SubmoduleEntry[] = [];\n let current: Partial<SubmoduleEntry> | null = null;\n\n const flushCurrent = () => {\n if (current?.name && current.path) {\n entries.push({\n name: current.name,\n path: current.path,\n url: current.url ?? \"\",\n });\n }\n };\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = stripGitConfigInlineComment(rawLine).trim();\n if (!line || line.startsWith(\"#\") || line.startsWith(\";\")) {\n continue;\n }\n\n const section = line.match(/^\\[submodule\\s+\"(.+)\"\\]$/i);\n if (section) {\n flushCurrent();\n current = { name: section[1] };\n continue;\n }\n\n if (!current) {\n continue;\n }\n\n const keyValue = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*(.*)$/);\n if (!keyValue) {\n continue;\n }\n\n const key = keyValue[1].toLowerCase();\n const value = unquote(keyValue[2].trim());\n if (key === \"path\") {\n current.path = normalizeSubmodulePath(value);\n continue;\n }\n if (key === \"url\") {\n current.url = value;\n }\n }\n\n flushCurrent();\n return entries.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nexport async function listInstallableSubmodules(rootDir: string): Promise<SubmoduleEntry[]> {\n const entries = await parseGitmodules(rootDir);\n const installable: SubmoduleEntry[] = [];\n\n for (const entry of entries) {\n if (await isSubmoduleWorktree(rootDir, entry.path)) {\n installable.push(entry);\n }\n }\n\n return installable;\n}\n\nfunction normalizeSubmodulePath(value: string): string {\n const normalized = value\n .replace(/\\\\/g, \"/\")\n .replace(/^\\.\\/+/, \"\")\n .trim();\n const parts = normalized.split(\"/\").filter(Boolean);\n\n // .gitmodules is repository-controlled input; reject paths that would escape the parent root.\n if (\n normalized === \"\" ||\n path.posix.isAbsolute(normalized) ||\n path.win32.isAbsolute(value) ||\n parts.some((part) => part === \"..\")\n ) {\n throw new Error(`Unsafe submodule path in .gitmodules: ${value}`);\n }\n\n return parts.join(\"/\");\n}\n\nfunction unquote(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction stripGitConfigInlineComment(value: string): string {\n let inQuotes = false;\n let escaped = false;\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (inQuotes && char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (char === '\"') {\n inQuotes = !inQuotes;\n continue;\n }\n if (!inQuotes && (char === \"#\" || char === \";\") && isCommentStart(value, index)) {\n return value.slice(0, index);\n }\n }\n\n return value;\n}\n\nfunction isCommentStart(value: string, index: number): boolean {\n return index === 0 || /\\s/.test(value[index - 1]);\n}\n\nasync function isSubmoduleWorktree(rootDir: string, submodulePath: string): Promise<boolean> {\n const dir = path.join(rootDir, submodulePath);\n try {\n if (!(await pathHasNoSymlinkSegments(rootDir, submodulePath))) {\n return false;\n }\n\n const rootRealPath = await realpath(rootDir);\n const dirRealPath = await realpath(dir);\n if (!isInsideDirectory(rootRealPath, dirRealPath)) {\n return false;\n }\n\n const dirStat = await lstat(dir);\n if (!dirStat.isDirectory()) {\n return false;\n }\n\n const gitMarkerStat = await lstat(path.join(dir, \".git\"));\n return (\n !gitMarkerStat.isSymbolicLink() && (gitMarkerStat.isFile() || gitMarkerStat.isDirectory())\n );\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function pathHasNoSymlinkSegments(rootDir: string, submodulePath: string): Promise<boolean> {\n let current = rootDir;\n for (const part of submodulePath.split(\"/\")) {\n current = path.join(current, part);\n const partStat = await lstat(current);\n if (partStat.isSymbolicLink()) {\n return false;\n }\n }\n return true;\n}\n\nfunction isInsideDirectory(parent: string, child: string): boolean {\n const relative = path.relative(parent, child);\n return Boolean(relative) && !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n","import { readdir, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { cancel, confirm, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport {\n CONFIG_FILE,\n EASY_CODING_DIR,\n INSTALL_MANIFEST_FILE,\n SESSIONS_DIR,\n TEMPLATES_DIR,\n TOOLS_DIR,\n} from \"../constants/paths.js\";\nimport {\n AGENT_PLATFORMS,\n type AgentPlatform,\n PLATFORM_META,\n type PlatformMeta,\n isAgentPlatform,\n} from \"../types/platform.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { readConfigYaml } from \"../utils/config-yaml.js\";\nimport { pathExists, readTextIfExists } from \"../utils/file-writer.js\";\nimport {\n type InstallManifest,\n manifestFileMatches,\n manifestPath,\n normalizeCommand,\n readInstallManifest,\n} from \"../utils/install-manifest.js\";\nimport { removeMarkedRegion } from \"../utils/marked-region.js\";\nimport { resolvePlatformMeta, resolveQoderVariantMetas } from \"../utils/platform-paths.js\";\nimport { getTemplatePath } from \"../utils/template-paths.js\";\nimport { refreshSupermoduleParent } from \"./install-harness.js\";\nimport {\n type CommandTarget,\n resolveClearTargets,\n resolveUpgradeTargets,\n} from \"./supermodule-targets.js\";\n\nexport interface ClearOptions {\n dryRun?: boolean;\n yes?: boolean;\n submodules?: string | false;\n}\n\ninterface ClearPlan {\n remove: string[];\n removeFiles: ManifestFileRemoval[];\n skippedModified: string[];\n pruneHookConfigs: HookConfigPrune[];\n constraints: string[];\n emptyDirs: string[];\n}\n\ninterface ManifestFileRemoval {\n filePath: string;\n expectedSha256: string;\n}\n\ninterface HookConfigPrune {\n filePath: string;\n managedHookPaths: string[];\n managedHookCommands: string[];\n}\n\ninterface MutableClearPlan {\n remove: Set<string>;\n removeFiles: ManifestFileRemoval[];\n skippedModified: string[];\n pruneHookConfigs: Map<string, Set<string>>;\n pruneHookCommands: Map<string, Set<string>>;\n constraints: Set<string>;\n emptyDirs: Set<string>;\n}\n\ninterface TargetClearPlan {\n target: CommandTarget;\n agents: AgentPlatform[];\n plan: ClearPlan;\n}\n\nconst PLATFORM_TEMPLATE_DIR: Record<AgentPlatform, string> = {\n \"claude-code\": \"claude\",\n codex: \"codex\",\n qoder: \"qoder\",\n};\n\nexport async function clear(opts: ClearOptions): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\n const targets = await resolveClearTargets(cwd, opts);\n const targetPlans = await buildTargetClearPlans(targets);\n if (targetPlans.length === 0) {\n throw new Error(\"No .easy-coding directory found in this project — nothing to clear.\");\n }\n\n console.log(renderTargetPlans(targetPlans));\n\n if (opts.dryRun) {\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: \"Remove these harness files? Tasks, spec, memory, and knowledge files are kept.\",\n initialValue: false,\n });\n if (typeof ok === \"symbol\" || !ok) {\n cancel(\"Clear cancelled.\");\n return;\n }\n }\n\n for (const targetPlan of targetPlans) {\n await executeClearPlan(targetPlan.plan);\n }\n await refreshParentAfterChildClear(cwd, targetPlans);\n outro(chalk.green(\"Easy Coding harness removed. Run easy-coding init to reinstall.\"));\n}\n\nasync function buildTargetClearPlans(targets: CommandTarget[]): Promise<TargetClearPlan[]> {\n const plans: TargetClearPlan[] = [];\n for (const target of targets) {\n const easyCodingDir = path.join(target.dir, EASY_CODING_DIR);\n if (!(await pathExists(easyCodingDir))) {\n continue;\n }\n const agents = await resolveInstalledAgents(target.dir);\n plans.push({\n target,\n agents,\n plan: await buildClearPlan(target.dir, agents),\n });\n }\n return plans;\n}\n\nasync function refreshParentAfterChildClear(\n cwd: string,\n targetPlans: TargetClearPlan[],\n): Promise<void> {\n if (targetPlans.some((targetPlan) => targetPlan.target.label === \".\")) {\n return;\n }\n if (!(await pathExists(path.join(cwd, EASY_CODING_DIR, CONFIG_FILE)))) {\n return;\n }\n\n const [parent] = await resolveUpgradeTargets(cwd);\n if (!parent || parent.label !== \".\") {\n return;\n }\n const config = await readConfigYaml(parent.configPath);\n if (!Array.isArray(config.agents) || config.agents.length === 0) {\n return;\n }\n await refreshSupermoduleParent(cwd, config.agents, parent.supermodule.submodules ?? []);\n}\n\nasync function resolveInstalledAgents(cwd: string): Promise<AgentPlatform[]> {\n const configPath = path.join(cwd, EASY_CODING_DIR, CONFIG_FILE);\n if (await pathExists(configPath)) {\n try {\n const config = await readConfigYaml(configPath);\n const listed = Array.isArray(config.agents) ? config.agents.filter(isAgentPlatform) : [];\n if (listed.length > 0) {\n return listed;\n }\n } catch {\n // unreadable or legacy config — fall back to on-disk detection\n }\n }\n\n const detected: AgentPlatform[] = [];\n for (const platform of AGENT_PLATFORMS) {\n if (await hasPlatformInstall(cwd, platform)) {\n detected.push(platform);\n }\n }\n return detected;\n}\n\nasync function hasPlatformInstall(cwd: string, platform: AgentPlatform): Promise<boolean> {\n const metas =\n platform === \"qoder\" ? resolveQoderVariantMetas() : [resolvePlatformMeta(cwd, platform)];\n for (const meta of metas) {\n if (await hasInstallMarkers(cwd, meta)) {\n return true;\n }\n }\n return false;\n}\n\nasync function hasInstallMarkers(cwd: string, meta: PlatformMeta): Promise<boolean> {\n const markers = [meta.skillsDir, meta.hooksDir, meta.agentsDir, meta.hookConfigFile];\n for (const marker of markers) {\n if (await pathExists(path.join(cwd, marker))) {\n return true;\n }\n }\n return false;\n}\n\nasync function resolveClearPlatformMetas(\n cwd: string,\n platform: AgentPlatform,\n): Promise<PlatformMeta[]> {\n if (platform !== \"qoder\") {\n return [resolvePlatformMeta(cwd, platform)];\n }\n\n const installed: PlatformMeta[] = [];\n for (const meta of resolveQoderVariantMetas()) {\n if (await hasInstallMarkers(cwd, meta)) {\n installed.push(meta);\n }\n }\n\n return installed.length > 0 ? installed : [resolvePlatformMeta(cwd, platform)];\n}\n\nasync function buildClearPlan(cwd: string, agents: AgentPlatform[]): Promise<ClearPlan> {\n const manifest = await readInstallManifest(cwd);\n if (manifest) {\n const plan = await buildManifestClearPlan(cwd, agents, manifest);\n const manifestAgents = new Set(manifest.agents.filter(isAgentPlatform));\n const missingAgents = agents.filter((agent) => !manifestAgents.has(agent));\n if (missingAgents.length > 0) {\n mergeClearPlan(plan, await buildTemplateClearPlan(cwd, missingAgents));\n }\n if (manifestAgents.has(\"qoder\") && agents.includes(\"qoder\")) {\n const uncoveredQoderMetas = await resolveManifestUncoveredQoderMetas(cwd, manifest);\n if (uncoveredQoderMetas.length > 0) {\n mergeClearPlan(\n plan,\n await buildTemplateClearPlanForMetas(cwd, \"qoder\", uncoveredQoderMetas),\n );\n }\n }\n addRuntimeClearEntries(plan, cwd);\n return plan;\n }\n\n const plan = await buildTemplateClearPlan(cwd, agents);\n addRuntimeClearEntries(plan, cwd);\n return plan;\n}\n\nasync function buildManifestClearPlan(\n cwd: string,\n agents: AgentPlatform[],\n manifest: InstallManifest,\n): Promise<ClearPlan> {\n const plan = createClearPlan();\n const agentSet = new Set(agents);\n\n for (const file of manifest.files) {\n if (!agentSet.has(file.platform)) {\n continue;\n }\n const filePath = manifestPath(cwd, file.path);\n if (!(await pathExists(filePath))) {\n continue;\n }\n if (await manifestFileMatches(filePath, file.sha256)) {\n plan.removeFiles.push({ filePath, expectedSha256: file.sha256 });\n addEmptyDirChain(plan.emptyDirs, path.dirname(filePath), cwd);\n } else {\n plan.skippedModified.push(filePath);\n }\n }\n\n for (const registration of manifest.hook_registrations) {\n if (!agentSet.has(registration.platform)) {\n continue;\n }\n const managedHookPaths = registration.hook_path\n ? managedHookPathsForRegistration(cwd, registration.hook_path)\n : [];\n addHookConfigPrune(\n plan.pruneHookConfigs,\n plan.pruneHookCommands,\n manifestPath(cwd, registration.config_path),\n managedHookPaths,\n [registration.command],\n );\n }\n\n for (const region of manifest.constraint_regions) {\n if (!agentSet.has(region.platform)) {\n continue;\n }\n plan.constraints.add(manifestPath(cwd, region.path));\n }\n\n return finalizeClearPlan(plan);\n}\n\nasync function buildTemplateClearPlan(cwd: string, agents: AgentPlatform[]): Promise<ClearPlan> {\n const plan = createClearPlan();\n const managedSkills = await listDirNames(getTemplatePath(\"common\", \"skills\"));\n managedSkills.push(...(await listDirNames(getTemplatePath(\"common\", \"bundled-skills\"))));\n\n for (const platform of agents) {\n const metas = await resolveClearPlatformMetas(cwd, platform);\n await addTemplateClearEntries(plan, cwd, platform, metas, managedSkills);\n }\n\n return finalizeClearPlan(plan);\n}\n\nasync function buildTemplateClearPlanForMetas(\n cwd: string,\n platform: AgentPlatform,\n metas: PlatformMeta[],\n): Promise<ClearPlan> {\n const plan = createClearPlan();\n const managedSkills = await listDirNames(getTemplatePath(\"common\", \"skills\"));\n managedSkills.push(...(await listDirNames(getTemplatePath(\"common\", \"bundled-skills\"))));\n await addTemplateClearEntries(plan, cwd, platform, metas, managedSkills);\n return finalizeClearPlan(plan);\n}\n\nasync function addTemplateClearEntries(\n plan: MutableClearPlan,\n cwd: string,\n platform: AgentPlatform,\n metas: PlatformMeta[],\n managedSkills: string[],\n): Promise<void> {\n const hookFileNames = await listSharedHookNamesForPlatform(platform);\n const agentFileNames = await listFileNames(\n getTemplatePath(PLATFORM_TEMPLATE_DIR[platform], \"agents\"),\n );\n\n for (const meta of metas) {\n for (const name of managedSkills) {\n plan.remove.add(path.join(cwd, meta.skillsDir, name));\n }\n for (const name of hookFileNames) {\n plan.remove.add(path.join(cwd, meta.hooksDir, name));\n }\n for (const name of agentFileNames) {\n plan.remove.add(path.join(cwd, meta.agentsDir, name));\n }\n\n addHookConfigPrune(\n plan.pruneHookConfigs,\n plan.pruneHookCommands,\n path.join(cwd, meta.hookConfigFile),\n managedHookPathsForTemplate(cwd, meta, hookFileNames),\n [],\n );\n plan.constraints.add(path.join(cwd, meta.mainConstraint));\n\n if (platform === \"codex\") {\n plan.remove.add(path.join(cwd, meta.templateContext.platform_config_dir, \"config.toml\"));\n }\n\n plan.emptyDirs.add(path.join(cwd, meta.skillsDir));\n plan.emptyDirs.add(path.join(cwd, meta.hooksDir));\n plan.emptyDirs.add(path.join(cwd, meta.agentsDir));\n }\n}\n\nasync function resolveManifestUncoveredQoderMetas(\n cwd: string,\n manifest: InstallManifest,\n): Promise<PlatformMeta[]> {\n const coveredBaseDirs = manifestCoveredQoderBaseDirs(manifest);\n const metas: PlatformMeta[] = [];\n for (const meta of resolveQoderVariantMetas()) {\n const baseDir = meta.templateContext.platform_config_dir;\n if (coveredBaseDirs.has(baseDir)) {\n continue;\n }\n if (await hasInstallMarkers(cwd, meta)) {\n metas.push(meta);\n }\n }\n return metas;\n}\n\nfunction manifestCoveredQoderBaseDirs(manifest: InstallManifest): Set<string> {\n const covered = new Set<string>();\n for (const meta of resolveQoderVariantMetas()) {\n const baseDir = meta.templateContext.platform_config_dir.replace(/\\\\/g, \"/\");\n const prefix = `${baseDir}/`;\n if (\n manifest.files.some((file) => file.platform === \"qoder\" && file.path.startsWith(prefix)) ||\n manifest.hook_registrations.some(\n (registration) =>\n registration.platform === \"qoder\" &&\n (registration.config_path === meta.hookConfigFile ||\n registration.config_path.startsWith(prefix) ||\n Boolean(registration.hook_path?.startsWith(prefix))),\n )\n ) {\n covered.add(baseDir);\n }\n }\n return covered;\n}\n\nfunction addHookConfigPrune(\n pruneHookConfigs: Map<string, Set<string>>,\n pruneHookCommands: Map<string, Set<string>>,\n filePath: string,\n managedHookPaths: string[],\n managedHookCommands: string[],\n): void {\n const existingPaths = pruneHookConfigs.get(filePath) ?? new Set<string>();\n for (const managedHookPath of managedHookPaths) {\n existingPaths.add(managedHookPath);\n }\n pruneHookConfigs.set(filePath, existingPaths);\n\n const existingCommands = pruneHookCommands.get(filePath) ?? new Set<string>();\n for (const managedHookCommand of managedHookCommands) {\n existingCommands.add(managedHookCommand);\n }\n pruneHookCommands.set(filePath, existingCommands);\n}\n\nfunction managedHookPathsForRegistration(cwd: string, hookPath: string): string[] {\n const paths = [hookPath];\n try {\n paths.push(...managedHookPathTokens(manifestPath(cwd, hookPath)));\n } catch {\n if (path.isAbsolute(hookPath)) {\n paths.push(...managedHookPathTokens(hookPath));\n }\n }\n return paths;\n}\n\nfunction managedHookPathsForTemplate(\n cwd: string,\n meta: PlatformMeta,\n hookFileNames: string[],\n): string[] {\n const relativePaths = hookFileNames.map(\n (name) => `${meta.templateContext.platform_config_dir}/hooks/${name}`,\n );\n const absolutePaths = hookFileNames.flatMap((name) =>\n managedHookPathTokens(path.join(cwd, meta.hooksDir, name)),\n );\n return [...relativePaths, ...absolutePaths];\n}\n\nfunction managedHookPathTokens(filePath: string): string[] {\n const tokens = new Set<string>();\n for (const equivalentPath of equivalentAbsolutePaths(filePath)) {\n const normalized = equivalentPath.replace(/\\\\/g, \"/\");\n const dir = path.posix.dirname(normalized);\n const basename = path.posix.basename(normalized);\n tokens.add(normalized);\n tokens.add(shellDoubleQuoteArg(normalized));\n tokens.add(`${shellDoubleQuoteArg(dir)}/${basename}`);\n }\n return [...tokens];\n}\n\nfunction equivalentAbsolutePaths(filePath: string): string[] {\n const normalized = path.resolve(filePath).replace(/\\\\/g, \"/\");\n const equivalents = [normalized];\n if (normalized.startsWith(\"/private/var/\")) {\n equivalents.push(normalized.replace(/^\\/private\\/var\\//, \"/var/\"));\n } else if (normalized.startsWith(\"/var/\")) {\n equivalents.push(normalized.replace(/^\\/var\\//, \"/private/var/\"));\n }\n return equivalents;\n}\n\nfunction shellDoubleQuoteArg(value: string): string {\n return `\"${value.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`;\n}\n\nfunction createClearPlan(): MutableClearPlan {\n return {\n remove: new Set<string>(),\n removeFiles: [],\n skippedModified: [],\n pruneHookConfigs: new Map<string, Set<string>>(),\n pruneHookCommands: new Map<string, Set<string>>(),\n constraints: new Set<string>(),\n emptyDirs: new Set<string>(),\n };\n}\n\nfunction finalizeClearPlan(plan: MutableClearPlan): ClearPlan {\n return {\n remove: [...plan.remove],\n removeFiles: plan.removeFiles,\n skippedModified: plan.skippedModified,\n pruneHookConfigs: mergeHookConfigPrunes(plan.pruneHookConfigs, plan.pruneHookCommands),\n constraints: [...plan.constraints],\n emptyDirs: [...plan.emptyDirs],\n };\n}\n\nfunction mergeHookConfigPrunes(\n pruneHookConfigs: Map<string, Set<string>>,\n pruneHookCommands: Map<string, Set<string>>,\n): HookConfigPrune[] {\n const filePaths = new Set([...pruneHookConfigs.keys(), ...pruneHookCommands.keys()]);\n return [...filePaths].map((filePath) => ({\n filePath,\n managedHookPaths: [...(pruneHookConfigs.get(filePath) ?? new Set<string>())],\n managedHookCommands: [...(pruneHookCommands.get(filePath) ?? new Set<string>())],\n }));\n}\n\nfunction mergeClearPlan(target: ClearPlan, source: ClearPlan): void {\n target.remove = [...new Set([...target.remove, ...source.remove])];\n target.removeFiles = dedupeFileRemovals([...target.removeFiles, ...source.removeFiles]);\n target.skippedModified = [...new Set([...target.skippedModified, ...source.skippedModified])];\n target.constraints = [...new Set([...target.constraints, ...source.constraints])];\n target.emptyDirs = [...new Set([...target.emptyDirs, ...source.emptyDirs])];\n\n for (const sourcePrune of source.pruneHookConfigs) {\n const existing = target.pruneHookConfigs.find(\n (prune) => prune.filePath === sourcePrune.filePath,\n );\n if (!existing) {\n target.pruneHookConfigs.push(sourcePrune);\n continue;\n }\n existing.managedHookPaths = [\n ...new Set([...existing.managedHookPaths, ...sourcePrune.managedHookPaths]),\n ];\n existing.managedHookCommands = [\n ...new Set([...existing.managedHookCommands, ...sourcePrune.managedHookCommands]),\n ];\n }\n}\n\nfunction dedupeFileRemovals(removals: ManifestFileRemoval[]): ManifestFileRemoval[] {\n const byPath = new Map<string, ManifestFileRemoval>();\n for (const removal of removals) {\n byPath.set(removal.filePath, removal);\n }\n return [...byPath.values()];\n}\n\nfunction addRuntimeClearEntries(plan: ClearPlan, cwd: string): void {\n plan.remove = [\n ...new Set([\n ...plan.remove,\n path.join(cwd, EASY_CODING_DIR, CONFIG_FILE),\n path.join(cwd, EASY_CODING_DIR, SESSIONS_DIR),\n path.join(cwd, EASY_CODING_DIR, TEMPLATES_DIR),\n path.join(cwd, EASY_CODING_DIR, TOOLS_DIR),\n path.join(cwd, EASY_CODING_DIR, INSTALL_MANIFEST_FILE),\n ]),\n ];\n}\n\nfunction addEmptyDirChain(emptyDirs: Set<string>, startDir: string, cwd: string): void {\n let current = startDir;\n while (current !== cwd && isInsideDirectory(cwd, current)) {\n emptyDirs.add(current);\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n}\n\nfunction isInsideDirectory(parent: string, child: string): boolean {\n const relative = path.relative(parent, child);\n return Boolean(relative) && !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n\nasync function listSharedHookNamesForPlatform(platform: AgentPlatform): Promise<string[]> {\n const names = await listFileNames(getTemplatePath(\"shared-hooks\"));\n if (PLATFORM_META[platform].hasSubagentContext) {\n return names;\n }\n return names.filter((name) => name !== \"inject-subagent-context.py\");\n}\n\nasync function executeClearPlan(plan: ClearPlan): Promise<void> {\n for (const target of plan.removeFiles) {\n if (await manifestFileMatches(target.filePath, target.expectedSha256)) {\n await rm(target.filePath, { force: true });\n }\n }\n\n for (const target of plan.remove) {\n await rm(target, { recursive: true, force: true });\n }\n\n for (const config of plan.pruneHookConfigs) {\n await pruneHookConfig(config);\n }\n\n for (const constraint of plan.constraints) {\n await stripConstraintRegion(constraint);\n }\n\n for (const dir of sortDirsDeepestFirst(plan.emptyDirs)) {\n await removeIfEmpty(dir);\n }\n}\n\n// Removes only the harness's own hook registrations from a settings.json / hooks.json,\n// preserving any user-authored config. Deletes the file only when nothing else remains.\nasync function pruneHookConfig(config: HookConfigPrune): Promise<void> {\n const { filePath, managedHookCommands, managedHookPaths } = config;\n const content = await readTextIfExists(filePath);\n if (content === null) {\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(content) as Record<string, unknown>;\n } catch {\n return; // malformed or user-owned — leave it untouched\n }\n\n const hooks = parsed.hooks;\n if (hooks && typeof hooks === \"object\" && !Array.isArray(hooks)) {\n const cleaned = pruneHookEvents(\n hooks as Record<string, unknown>,\n managedHookPaths,\n managedHookCommands,\n );\n if (cleaned === null) {\n parsed = Object.fromEntries(Object.entries(parsed).filter(([key]) => key !== \"hooks\"));\n } else {\n parsed.hooks = cleaned;\n }\n }\n\n if (Object.keys(parsed).length === 0) {\n await rm(filePath, { force: true });\n return;\n }\n await writeFile(filePath, `${JSON.stringify(parsed, null, 2)}\\n`, \"utf8\");\n}\n\nfunction pruneHookEvents(\n hooks: Record<string, unknown>,\n managedHookPaths: string[],\n managedHookCommands: string[],\n): Record<string, unknown> | null {\n const result: Record<string, unknown> = {};\n for (const [event, value] of Object.entries(hooks)) {\n if (!Array.isArray(value)) {\n result[event] = value;\n continue;\n }\n const keptGroups = value\n .map((group) => pruneHookGroup(group, managedHookPaths, managedHookCommands))\n .filter((group) => group !== null);\n if (keptGroups.length > 0) {\n result[event] = keptGroups;\n }\n }\n return Object.keys(result).length === 0 ? null : result;\n}\n\nfunction pruneHookGroup(\n group: unknown,\n managedHookPaths: string[],\n managedHookCommands: string[],\n): unknown {\n if (!group || typeof group !== \"object\") {\n return group;\n }\n const entry = group as { hooks?: unknown };\n if (!Array.isArray(entry.hooks)) {\n return group;\n }\n const keptHooks = entry.hooks.filter(\n (hook) => !isManagedHook(hook, managedHookPaths, managedHookCommands),\n );\n if (keptHooks.length === 0) {\n return null;\n }\n return { ...(group as Record<string, unknown>), hooks: keptHooks };\n}\n\nfunction isManagedHook(\n hook: unknown,\n managedHookPaths: string[],\n managedHookCommands: string[],\n): boolean {\n if (!hook || typeof hook !== \"object\") {\n return false;\n }\n const command = (hook as { command?: unknown }).command;\n if (typeof command !== \"string\") {\n return false;\n }\n const normalizedManagedCommands = managedHookCommands.map(normalizeCommand);\n if (normalizedManagedCommands.includes(normalizeCommand(command))) {\n return true;\n }\n const normalizedCommand = command;\n return managedHookPaths.some((hookPath) =>\n commandContainsPathToken(normalizedCommand, hookPath.replace(/\\\\/g, \"/\")),\n );\n}\n\nfunction commandContainsPathToken(command: string, targetPath: string): boolean {\n const escaped = targetPath.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`(^|\\\\s|[\"'])${escaped}($|\\\\s|[\"'])`).test(command);\n}\n\nasync function stripConstraintRegion(filePath: string): Promise<void> {\n const content = await readTextIfExists(filePath);\n if (content === null) {\n return;\n }\n const stripped = removeMarkedRegion(content);\n if (stripped !== content) {\n await writeFile(filePath, stripped, \"utf8\");\n }\n}\n\nasync function removeIfEmpty(dir: string): Promise<void> {\n try {\n const entries = await readdir(dir);\n if (entries.length === 0) {\n await rm(dir, { recursive: true, force: true });\n }\n } catch {\n // missing directory — nothing to clean\n }\n}\n\nfunction sortDirsDeepestFirst(dirs: string[]): string[] {\n return [...dirs].sort((left, right) => {\n const depthDiff = pathDepth(right) - pathDepth(left);\n return depthDiff === 0 ? left.localeCompare(right) : depthDiff;\n });\n}\n\nfunction pathDepth(dir: string): number {\n return path.normalize(dir).split(path.sep).filter(Boolean).length;\n}\n\nasync function listDirNames(dir: string): Promise<string[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n\nasync function listFileNames(dir: string): Promise<string[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n return entries.filter((entry) => entry.isFile()).map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n\nfunction renderPlan(cwd: string, agents: AgentPlatform[], plan: ClearPlan): string {\n const rel = (target: string) => path.relative(cwd, target) || target;\n const lines: string[] = [];\n lines.push(chalk.bold(\"easy-coding clear\"));\n lines.push(`Platforms: ${agents.length > 0 ? agents.join(\", \") : \"(none detected)\"}`);\n lines.push(\"\");\n lines.push(\"Will remove:\");\n for (const target of plan.removeFiles) {\n lines.push(` - ${rel(target.filePath)}`);\n }\n for (const target of plan.remove) {\n lines.push(` - ${rel(target)}`);\n }\n if (plan.skippedModified.length > 0) {\n lines.push(\"Will keep modified manifest files:\");\n for (const target of plan.skippedModified) {\n lines.push(` - ${rel(target)}`);\n }\n }\n if (plan.constraints.length > 0) {\n lines.push(\"Will strip the generated region from (file kept):\");\n for (const target of plan.constraints) {\n lines.push(` - ${rel(target)}`);\n }\n }\n if (plan.pruneHookConfigs.length > 0) {\n lines.push(\"Will prune harness hooks from (file kept if other config remains):\");\n for (const target of plan.pruneHookConfigs) {\n lines.push(` - ${rel(target.filePath)}`);\n }\n }\n lines.push(\"\");\n lines.push(\n chalk.dim(\n \"Kept: .easy-coding/tasks, spec, memory, project.yaml, and knowledge files (SOUL/RULES/ABSTRACT/TEST_STRATEGY).\",\n ),\n );\n return lines.join(\"\\n\");\n}\n\nfunction renderTargetPlans(targetPlans: TargetClearPlan[]): string {\n if (targetPlans.length === 1) {\n const [{ target, agents, plan }] = targetPlans;\n return [`Target: ${target.label}`, renderPlan(target.dir, agents, plan)].join(\"\\n\");\n }\n\n return targetPlans\n .map(({ target, agents, plan }) =>\n [`Target: ${target.label}`, renderPlan(target.dir, agents, plan)].join(\"\\n\"),\n )\n .join(\"\\n\\n\");\n}\n","import path from \"node:path\";\nimport { cancel, confirm, outro, select, text } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { compareVersions } from \"../utils/compare-versions.js\";\nimport {\n type ApprovalMode,\n type ConfiguredWorkflowMode,\n isTddCoverageThreshold,\n readConfigYaml,\n resolveLegacyBehavior,\n setBehaviorModes,\n} from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { inspectTddReadiness } from \"../utils/tdd-readiness.js\";\n\nexport async function config(): Promise<void> {\n renderBanner();\n\n const configPath = path.join(process.cwd(), EASY_CODING_DIR, CONFIG_FILE);\n if (!(await pathExists(configPath))) {\n throw new Error(\"No easy-coding harness found in this project.\");\n }\n\n const projectConfig = await readConfigYaml(configPath);\n if (projectConfig.harness_version !== VERSION) {\n const relation = compareVersions(projectConfig.harness_version, VERSION);\n if (relation === -1) {\n throw new Error(\n `Project harness ${projectConfig.harness_version} is older than CLI ${VERSION}. Run easy-coding upgrade first.`,\n );\n }\n if (relation === 1) {\n throw new Error(\n `Project harness ${projectConfig.harness_version} is newer than CLI ${VERSION}. Update the CLI first.`,\n );\n }\n throw new Error(\n `Project harness ${projectConfig.harness_version} does not exactly match CLI ${VERSION}. Upgrade the harness or update the CLI before changing config.`,\n );\n }\n\n const current = resolveLegacyBehavior(projectConfig);\n const approvalMode = await select<ApprovalMode>({\n message: `Select project approval mode (current: ${current.approvalMode})`,\n initialValue: current.approvalMode,\n options: [\n {\n value: \"approve\",\n label: \"approve — confirm every stage transition\",\n hint: \"except INIT -> ANALYSIS and MEMORY -> COMPLETE\",\n },\n {\n value: \"guard\",\n label: \"guard — confirm critical gates (default)\",\n hint: \"ANALYSIS -> IMPLEMENT and QUALITY -> MEMORY\",\n },\n {\n value: \"confirm\",\n label: \"confirm — confirm the plan once\",\n hint: \"only ANALYSIS -> IMPLEMENT; later stages advance after quality gates\",\n },\n {\n value: \"auto\",\n label: \"auto — advance workflow stages automatically\",\n hint: \"only new post-verification code drift pauses for exact acceptance\",\n },\n ],\n });\n if (typeof approvalMode === \"symbol\") {\n cancel(\"Configuration cancelled.\");\n return;\n }\n\n const workflowMode: ConfiguredWorkflowMode = \"adaptive\";\n\n const tddEnabled = await select<boolean>({\n message: `Enable Java TDD for this project (current: ${current.tddEnabled ? \"enabled\" : \"disabled\"})`,\n initialValue: current.tddEnabled,\n options: [\n { value: false, label: \"disabled — preserve current test depth (default)\" },\n { value: true, label: \"enabled — require TDD evidence and changed-line coverage\" },\n ],\n });\n if (typeof tddEnabled === \"symbol\") {\n cancel(\"Configuration cancelled.\");\n return;\n }\n\n if (tddEnabled) {\n const readiness = await inspectTddReadiness(process.cwd());\n if (readiness.status !== \"ready\") {\n cancel(\n `TDD was not enabled. ${readiness.status === \"needs_init\" ? \"Run ec-tdd-init first\" : \"Repair TDD readiness\"}: ${readiness.reasons.join(\"; \")}. No project modes were changed.`,\n );\n return;\n }\n }\n\n let tddCoverageThreshold = current.tddCoverageThreshold;\n if (tddEnabled) {\n const thresholdInput = await text({\n message: \"Minimum changed-production-line coverage percentage\",\n initialValue: String(current.tddCoverageThreshold),\n validate(value) {\n const parsed = Number(value);\n return isTddCoverageThreshold(parsed) ? undefined : \"Enter an integer from 1 to 100.\";\n },\n });\n if (typeof thresholdInput === \"symbol\") {\n cancel(\"Configuration cancelled.\");\n return;\n }\n tddCoverageThreshold = Number(thresholdInput);\n }\n\n const shouldSave = await confirm({\n message: `Set approval=${approvalMode}, workflow=${workflowMode}, TDD=${tddEnabled ? `enabled (${tddCoverageThreshold}%)` : \"disabled\"}?`,\n initialValue: true,\n });\n if (typeof shouldSave === \"symbol\" || !shouldSave) {\n cancel(\"Configuration cancelled.\");\n return;\n }\n\n if (tddEnabled) {\n const readiness = await inspectTddReadiness(process.cwd());\n if (readiness.status !== \"ready\") {\n cancel(\n `TDD was not enabled because readiness changed before save: ${readiness.reasons.join(\"; \")}. No project modes were changed.`,\n );\n return;\n }\n }\n\n await setBehaviorModes(configPath, approvalMode, workflowMode, tddEnabled, tddCoverageThreshold);\n outro(\n chalk.green(\n `Project modes updated: approval=${approvalMode}, workflow=${workflowMode}, TDD=${tddEnabled ? `${tddCoverageThreshold}%` : \"off\"}.`,\n ),\n );\n}\n","import path from \"node:path\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport { readConfigYaml } from \"./config-yaml.js\";\nimport { pathExists } from \"./file-writer.js\";\n\nexport type VersionComparison = -1 | 0 | 1;\n\ninterface ParsedVersion {\n core: number[];\n prerelease: string[] | null;\n}\n\nfunction parseVersion(version: string): ParsedVersion {\n const withoutBuild = String(version ?? \"\").split(\"+\", 1)[0];\n const separator = withoutBuild.indexOf(\"-\");\n const coreText = separator === -1 ? withoutBuild : withoutBuild.slice(0, separator);\n const prereleaseText = separator === -1 ? \"\" : withoutBuild.slice(separator + 1);\n const core = coreText.split(\".\").map((part) => {\n const parsed = Number.parseInt(part, 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n });\n return {\n core,\n prerelease: prereleaseText ? prereleaseText.split(\".\") : null,\n };\n}\n\nfunction comparePrerelease(left: string[] | null, right: string[] | null): VersionComparison {\n if (left === null && right === null) return 0;\n if (left === null) return 1;\n if (right === null) return -1;\n\n const length = Math.max(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = left[index];\n const rightPart = right[index];\n if (leftPart === undefined) return -1;\n if (rightPart === undefined) return 1;\n if (leftPart === rightPart) continue;\n\n const leftNumeric = /^\\d+$/.test(leftPart);\n const rightNumeric = /^\\d+$/.test(rightPart);\n if (leftNumeric && rightNumeric) {\n const leftNumber = Number.parseInt(leftPart, 10);\n const rightNumber = Number.parseInt(rightPart, 10);\n return leftNumber < rightNumber ? -1 : 1;\n }\n if (leftNumeric) return -1;\n if (rightNumeric) return 1;\n return leftPart < rightPart ? -1 : 1;\n }\n return 0;\n}\n\nexport function compareVersions(a: string, b: string): VersionComparison {\n const left = parseVersion(a);\n const right = parseVersion(b);\n const length = Math.max(left.core.length, right.core.length);\n\n for (let index = 0; index < length; index += 1) {\n const leftPart = left.core[index] ?? 0;\n const rightPart = right.core[index] ?? 0;\n if (leftPart < rightPart) return -1;\n if (leftPart > rightPart) return 1;\n }\n return comparePrerelease(left.prerelease, right.prerelease);\n}\n\nexport function isVersionBehind(installed: string, current = VERSION): boolean {\n return compareVersions(installed, current) === -1;\n}\n\nexport async function checkForUpgrade(cwd: string): Promise<void> {\n const configPath = path.join(cwd, EASY_CODING_DIR, CONFIG_FILE);\n if (!(await pathExists(configPath))) {\n return;\n }\n\n let config: Awaited<ReturnType<typeof readConfigYaml>>;\n try {\n config = await readConfigYaml(configPath);\n } catch {\n return;\n }\n\n const installed = String(config.harness_version ?? \"\");\n if (installed && isVersionBehind(installed)) {\n process.stderr.write(\n `easy-coding harness ${installed} is older than CLI ${VERSION}. Run easy-coding upgrade when ready.\\n`,\n );\n }\n}\n","import { readFile, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { EASY_CODING_DIR, TDD_DIR, TDD_READINESS_FILE } from \"../constants/paths.js\";\nimport { pathExists } from \"./file-writer.js\";\n\nexport const TDD_READINESS_SCHEMA = \"easy-coding/tdd-readiness-v1\";\nexport const TDD_READINESS_SCOPE = \"changed-production-lines\";\nconst TDD_BASE_VARIABLE = \"EASY_CODING_TDD_BASE_SHA\";\nconst TDD_THRESHOLD_VARIABLE = \"EASY_CODING_TDD_THRESHOLD\";\nconst COVERAGE_TOOL_PATH = \".easy-coding/tools/easy_coding_java_coverage.py\";\nconst JAVA_BUILD_FILE_NAMES = new Set([\"pom.xml\", \"build.gradle\", \"build.gradle.kts\"]);\n\ninterface ReadinessFileRecord {\n path: string;\n}\n\ninterface TddReadinessManifest {\n schema?: unknown;\n provider?: unknown;\n coverage_scope?: unknown;\n build_files?: unknown;\n ci_files?: unknown;\n tool_files?: unknown;\n coverage_report_patterns?: unknown;\n changed_line_gate_command?: unknown;\n historical_coverage_required?: unknown;\n}\n\nexport interface TddReadinessResult {\n status: \"ready\" | \"needs_init\" | \"needs_repair\";\n reasons: string[];\n manifestPath: string;\n}\n\nfunction readinessPath(root: string): string {\n return path.join(root, EASY_CODING_DIR, TDD_DIR, TDD_READINESS_FILE);\n}\n\nfunction parseFileRecords(value: unknown, field: string, reasons: string[]): ReadinessFileRecord[] {\n if (!Array.isArray(value) || value.length === 0) {\n reasons.push(`${field} must contain at least one file`);\n return [];\n }\n const records: ReadinessFileRecord[] = [];\n for (const item of value) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) {\n reasons.push(`${field} contains an invalid record`);\n continue;\n }\n const record = item as Record<string, unknown>;\n if (typeof record.path !== \"string\" || !record.path.trim() || path.isAbsolute(record.path)) {\n reasons.push(`${field} contains an invalid path`);\n continue;\n }\n records.push({ path: record.path });\n }\n return records;\n}\n\nfunction usesRequiredGateVariables(command: string): boolean {\n const normalized = command\n .replaceAll(`\\${${TDD_BASE_VARIABLE}}`, `$${TDD_BASE_VARIABLE}`)\n .replaceAll(`\\${${TDD_THRESHOLD_VARIABLE}}`, `$${TDD_THRESHOLD_VARIABLE}`);\n return (\n new RegExp(`--base\\\\s+['\\\"]?\\\\$${TDD_BASE_VARIABLE}(?:['\\\"]|\\\\s|$)`).test(normalized) &&\n new RegExp(`--threshold\\\\s+['\\\"]?\\\\$${TDD_THRESHOLD_VARIABLE}(?:['\\\"]|\\\\s|$)`).test(normalized)\n );\n}\n\nfunction isSafeReportPattern(value: string): boolean {\n const normalized = value.replaceAll(\"\\\\\", \"/\");\n return !path.isAbsolute(value) && !normalized.split(\"/\").includes(\"..\");\n}\n\nasync function validateFiles(\n root: string,\n records: ReadinessFileRecord[],\n reasons: string[],\n): Promise<void> {\n const resolvedRoot = await realpath(root);\n for (const record of records) {\n const absolute = path.resolve(root, record.path);\n try {\n const resolved = await realpath(absolute);\n if (resolved !== resolvedRoot && !resolved.startsWith(`${resolvedRoot}${path.sep}`)) {\n reasons.push(`readiness file escapes project root: ${record.path}`);\n continue;\n }\n // 快照只记录初始化历史;当前构建与工具的有效性由本轮验证判定。\n await readFile(resolved);\n } catch {\n reasons.push(`readiness file is missing or unreadable: ${record.path}`);\n }\n }\n}\n\nexport async function inspectTddReadiness(root: string): Promise<TddReadinessResult> {\n const manifestPath = readinessPath(root);\n if (!(await pathExists(manifestPath))) {\n return { status: \"needs_init\", reasons: [\"TDD readiness receipt is missing\"], manifestPath };\n }\n\n let manifest: TddReadinessManifest;\n try {\n manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as TddReadinessManifest;\n } catch {\n return { status: \"needs_repair\", reasons: [\"TDD readiness receipt is invalid\"], manifestPath };\n }\n\n if (!manifest || typeof manifest !== \"object\" || Array.isArray(manifest)) {\n return {\n status: \"needs_repair\",\n reasons: [\"TDD readiness receipt must be a JSON object\"],\n manifestPath,\n };\n }\n\n const reasons: string[] = [];\n if (manifest.schema !== TDD_READINESS_SCHEMA) reasons.push(\"unsupported readiness schema\");\n if (manifest.provider !== \"gitlab\") reasons.push(\"readiness provider must be gitlab\");\n if (manifest.coverage_scope !== TDD_READINESS_SCOPE) {\n reasons.push(\"coverage scope must be changed-production-lines\");\n }\n if (manifest.historical_coverage_required !== false) {\n reasons.push(\"historical coverage must remain disabled\");\n }\n if (\n !Array.isArray(manifest.coverage_report_patterns) ||\n manifest.coverage_report_patterns.length === 0 ||\n manifest.coverage_report_patterns.some(\n (item) => typeof item !== \"string\" || !item.trim() || !isSafeReportPattern(item),\n )\n ) {\n reasons.push(\"coverage_report_patterns must contain safe project-relative report patterns\");\n }\n if (\n typeof manifest.changed_line_gate_command !== \"string\" ||\n !manifest.changed_line_gate_command.includes(COVERAGE_TOOL_PATH)\n ) {\n reasons.push(\"changed-line coverage gate command is missing\");\n } else if (!usesRequiredGateVariables(manifest.changed_line_gate_command)) {\n reasons.push(\"changed-line coverage gate must use the task baseline and threshold variables\");\n }\n\n const buildFiles = parseFileRecords(manifest.build_files, \"build_files\", reasons);\n const toolFiles = parseFileRecords(manifest.tool_files, \"tool_files\", reasons);\n if (!buildFiles.some((record) => JAVA_BUILD_FILE_NAMES.has(path.basename(record.path)))) {\n reasons.push(\"build_files must include a Maven or Gradle Java build file\");\n }\n if (!toolFiles.some((record) => record.path.replaceAll(\"\\\\\", \"/\") === COVERAGE_TOOL_PATH)) {\n reasons.push(`tool_files must include ${COVERAGE_TOOL_PATH}`);\n }\n await validateFiles(root, buildFiles, reasons);\n await validateFiles(root, toolFiles, reasons);\n\n return {\n status: reasons.length === 0 ? \"ready\" : \"needs_repair\",\n reasons: [...new Set(reasons)],\n manifestPath,\n };\n}\n","import path from \"node:path\";\nimport { note, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport type { InstallContext, SubmoduleEntry } from \"../types/supermodule.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { readConfigYaml, updateSupermoduleConfig } from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { parseGitmodules } from \"../utils/gitmodules.js\";\nimport { detectEasyCodingInstallState } from \"../utils/install-state.js\";\nimport {\n installHarnessToDir,\n refreshSupermoduleParent,\n supermoduleConfigFromContext,\n} from \"./install-harness.js\";\nimport { type PlatformOptions, resolvePlatforms } from \"./platforms.js\";\nimport {\n rejectSubmoduleListWithoutGitmodules,\n resolveInitSubmoduleSelection,\n} from \"./supermodule-targets.js\";\n\ninterface InstallTarget {\n dir: string;\n label: string;\n context: InstallContext;\n installed: boolean;\n}\n\nexport async function init(opts: PlatformOptions): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\n const submodules = await parseGitmodules(cwd);\n if (submodules.length === 0) {\n rejectSubmoduleListWithoutGitmodules(opts);\n }\n\n const targets =\n submodules.length === 0\n ? [await standaloneTarget(cwd)]\n : await supermoduleTargets(cwd, opts, submodules);\n\n const installableTargets = targets.filter((target) => !target.installed);\n const parentTarget = targets.find((target) => target.label === \".\");\n if (installableTargets.length === 0) {\n await refreshInstalledChildTopologies(targets);\n if (submodules.length > 0 && parentTarget) {\n const platforms = await resolveInitPlatforms(cwd, opts, true);\n await refreshParentTopologyIfNeeded(cwd, parentTarget, platforms);\n }\n outro(chalk.yellow(\"All selected easy-coding harness targets are already installed.\"));\n return;\n }\n\n const platforms = await resolveInitPlatforms(cwd, opts, Boolean(parentTarget?.installed));\n for (const target of installableTargets) {\n await installHarnessToDir(target.dir, platforms, target.context);\n }\n await refreshInstalledChildTopologies(targets);\n if (submodules.length > 0 && parentTarget) {\n await refreshParentTopologyIfNeeded(cwd, parentTarget, platforms);\n }\n\n const triggers = platforms\n .map(\n (platform) =>\n `${PLATFORM_META[platform].label}: ${PLATFORM_META[platform].skillTrigger}ec-init`,\n )\n .join(\"\\n\");\n\n note(triggers, \"Next step\");\n outro(\n chalk.green(\n `easy-coding harness installed in ${installableTargets.map((target) => target.label).join(\", \")}. Open your agent and run ec-init.`,\n ),\n );\n}\n\nasync function standaloneTarget(cwd: string): Promise<InstallTarget> {\n const installState = await detectEasyCodingInstallState(cwd);\n if (installState.kind === \"installed\") {\n throw new Error(\n \".easy-coding/config.yaml already exists. Use easy-coding add-agent or easy-coding upgrade.\",\n );\n }\n if (installState.kind === \"unknown\") {\n throw new Error(\n \".easy-coding exists but is not recognized as an easy-coding harness or legacy easy-coding skill project. Please inspect it manually before running init.\",\n );\n }\n\n return {\n dir: cwd,\n label: \".\",\n context: contextFromState(\"standalone\", installState),\n installed: false,\n };\n}\n\nasync function supermoduleTargets(\n cwd: string,\n opts: PlatformOptions,\n submodules: SubmoduleEntry[],\n): Promise<InstallTarget[]> {\n const { installable, parentSubmodulePaths } = await resolveInitSubmoduleSelection(cwd, opts);\n const skipped = submodules.filter(\n (entry) => !installable.some((installableEntry) => installableEntry.path === entry.path),\n );\n if (skipped.length > 0) {\n note(\n skipped.map((entry) => `${entry.path} (${entry.name})`).join(\"\\n\"),\n \"Skipped unchecked-out submodules\",\n );\n }\n\n const targets: InstallTarget[] = [\n await targetFromState(cwd, \".\", \"super-parent\", {\n submodulePaths: parentSubmodulePaths,\n }),\n ];\n\n const targetSubmodulePaths =\n opts.submodules === false ? new Set<string>() : new Set(parentSubmodulePaths);\n for (const entry of installable) {\n if (!targetSubmodulePaths.has(entry.path)) {\n continue;\n }\n const dir = path.join(cwd, entry.path);\n targets.push(\n await targetFromState(dir, entry.path, \"submodule-child\", {\n parent: toPosixRelative(dir, cwd),\n }),\n );\n }\n\n return targets;\n}\n\nasync function targetFromState(\n targetDir: string,\n label: string,\n role: InstallContext[\"role\"],\n extraContext: Partial<InstallContext> = {},\n): Promise<InstallTarget> {\n const installState = await detectEasyCodingInstallState(targetDir);\n if (installState.kind === \"unknown\") {\n throw new Error(\n `${targetDir}/.easy-coding exists but is not recognized as an easy-coding harness or legacy easy-coding skill project. Please inspect it manually before running init.`,\n );\n }\n if (installState.kind === \"installed\") {\n return {\n dir: targetDir,\n label,\n installed: true,\n context: {\n role,\n initSource: \"fresh\",\n ...extraContext,\n },\n };\n }\n return {\n dir: targetDir,\n label,\n installed: false,\n context: {\n ...contextFromState(role, installState),\n ...extraContext,\n },\n };\n}\n\nfunction contextFromState(\n role: InstallContext[\"role\"],\n installState: Awaited<ReturnType<typeof detectEasyCodingInstallState>>,\n): InstallContext {\n return {\n role,\n initSource: installState.kind === \"legacy\" ? \"legacy-easy-coding\" : \"fresh\",\n legacyAssets: installState.kind === \"legacy\" ? installState.legacyAssets : undefined,\n legacyMissingHarnessFiles:\n installState.kind === \"legacy\" ? installState.missingHarnessFiles : undefined,\n };\n}\n\nfunction toPosixRelative(from: string, to: string): string {\n const relative = path.relative(from, to);\n return relative ? relative.split(path.sep).join(\"/\") : \".\";\n}\n\nasync function resolveInitPlatforms(\n cwd: string,\n opts: PlatformOptions,\n parentInstalled: boolean,\n): Promise<AgentPlatform[]> {\n if (opts.agent || !parentInstalled) {\n return resolvePlatforms(opts, [\"claude-code\"]);\n }\n\n const config = await readConfigYaml(path.join(cwd, EASY_CODING_DIR, CONFIG_FILE));\n if (Array.isArray(config.agents) && config.agents.length > 0) {\n return config.agents;\n }\n return resolvePlatforms(opts, [\"claude-code\"]);\n}\n\nasync function refreshParentTopologyIfNeeded(\n cwd: string,\n parentTarget: InstallTarget,\n installPlatforms: AgentPlatform[],\n): Promise<void> {\n if (!(await pathExists(path.join(cwd, EASY_CODING_DIR, CONFIG_FILE)))) {\n return;\n }\n\n const config = parentTarget.installed\n ? await readConfigYaml(path.join(cwd, EASY_CODING_DIR, CONFIG_FILE))\n : { agents: installPlatforms };\n const platforms =\n Array.isArray(config.agents) && config.agents.length > 0 ? config.agents : installPlatforms;\n\n // Re-entry can add a child without reinstalling the parent; refresh only the parent topology.\n await refreshSupermoduleParent(cwd, platforms, parentTarget.context.submodulePaths ?? []);\n}\n\nasync function refreshInstalledChildTopologies(targets: InstallTarget[]): Promise<void> {\n for (const target of targets) {\n if (!target.installed || target.context.role !== \"submodule-child\") {\n continue;\n }\n const configPath = path.join(target.dir, EASY_CODING_DIR, CONFIG_FILE);\n if (!(await pathExists(configPath))) {\n continue;\n }\n await updateSupermoduleConfig(configPath, supermoduleConfigFromContext(target.context));\n }\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n CONFIG_FILE,\n EASY_CODING_DIR,\n PROJECT_INIT_TASK_ID,\n TASKS_DIR,\n} from \"../constants/paths.js\";\nimport { isDirectory, pathExists } from \"./file-writer.js\";\n\nexport type EasyCodingInstallState =\n | { kind: \"fresh\"; easyCodingDir: string }\n | { kind: \"installed\"; easyCodingDir: string; configPath: string }\n | {\n kind: \"legacy\";\n easyCodingDir: string;\n legacyAssets: string[];\n missingHarnessFiles: string[];\n }\n | { kind: \"unknown\"; easyCodingDir: string };\n\nconst LEGACY_ROOT_FILES = [\"SOUL.md\", \"RULES.md\", \"ABSTRACT.md\"];\n\nexport async function detectEasyCodingInstallState(cwd: string): Promise<EasyCodingInstallState> {\n const easyCodingDir = path.join(cwd, EASY_CODING_DIR);\n if (!(await pathExists(easyCodingDir))) {\n return { kind: \"fresh\", easyCodingDir };\n }\n\n const configPath = path.join(easyCodingDir, CONFIG_FILE);\n if (await pathExists(configPath)) {\n return { kind: \"installed\", easyCodingDir, configPath };\n }\n\n const legacyAssets = await detectLegacyAssets(easyCodingDir);\n if (legacyAssets.length === 0) {\n return { kind: \"unknown\", easyCodingDir };\n }\n\n return {\n kind: \"legacy\",\n easyCodingDir,\n legacyAssets,\n missingHarnessFiles: [relativeConfigPath(), relativeProjectInitTaskPath()],\n };\n}\n\nasync function detectLegacyAssets(easyCodingDir: string): Promise<string[]> {\n const assets: string[] = [];\n\n for (const file of LEGACY_ROOT_FILES) {\n if (await pathExists(path.join(easyCodingDir, file))) {\n assets.push(relativeEasyCodingPath(file));\n }\n }\n\n if (await pathExists(path.join(easyCodingDir, \"memory\", \"long\", \"MEMORY.md\"))) {\n assets.push(relativeEasyCodingPath(\"memory\", \"long\", \"MEMORY.md\"));\n }\n\n const shortMemoryFiles = await listMarkdownFiles(path.join(easyCodingDir, \"memory\", \"short\"));\n assets.push(...shortMemoryFiles.map((file) => relativeEasyCodingPath(\"memory\", \"short\", file)));\n\n for (const dir of [\"spec\", \"prototype\"]) {\n if (await hasAnyDirectoryEntry(path.join(easyCodingDir, dir))) {\n assets.push(relativeEasyCodingPath(dir));\n }\n }\n\n return assets.sort();\n}\n\nasync function listMarkdownFiles(dir: string): Promise<string[]> {\n if (!(await isDirectory(dir))) {\n return [];\n }\n\n const entries = await readdir(dir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".md\"))\n .map((entry) => entry.name)\n .sort();\n}\n\nasync function hasAnyDirectoryEntry(dir: string): Promise<boolean> {\n if (!(await isDirectory(dir))) {\n return false;\n }\n\n return (await readdir(dir)).length > 0;\n}\n\nfunction relativeEasyCodingPath(...segments: string[]): string {\n return path.posix.join(EASY_CODING_DIR, ...segments);\n}\n\nfunction relativeConfigPath(): string {\n return path.posix.join(EASY_CODING_DIR, CONFIG_FILE);\n}\n\nfunction relativeProjectInitTaskPath(): string {\n return path.posix.join(EASY_CODING_DIR, TASKS_DIR, PROJECT_INIT_TASK_ID, \"task.json\");\n}\n","import path from \"node:path\";\nimport chalk from \"chalk\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { compareVersions } from \"../utils/compare-versions.js\";\nimport {\n isApprovalMode,\n isConfiguredWorkflowMode,\n readConfigYaml,\n resolveLegacyBehavior,\n} from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { listSessionFiles } from \"../utils/session.js\";\nimport {\n getTaskJsonPath,\n isActiveTask,\n listTasks,\n readTaskJson,\n summarizeTaskStatuses,\n} from \"../utils/task-json.js\";\nimport { inspectTddReadiness } from \"../utils/tdd-readiness.js\";\n\nexport async function status(): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\n const configPath = path.join(cwd, EASY_CODING_DIR, CONFIG_FILE);\n if (!(await pathExists(configPath))) {\n throw new Error(\"No easy-coding harness found in this project.\");\n }\n\n const config = await readConfigYaml(configPath);\n const tasks = await listTasks(cwd);\n const taskCounts = summarizeTaskStatuses(tasks);\n const activeTasks = tasks.filter((item) => isActiveTask(item.task));\n const sessions = await listSessionFiles(cwd);\n const versionRelation = compareVersions(config.harness_version, VERSION);\n const tddReadiness = await inspectTddReadiness(cwd);\n\n console.log(chalk.bold(\"Harness\"));\n console.log(` version: ${config.harness_version}`);\n console.log(` cli: ${VERSION}`);\n if (versionRelation === -1 || (versionRelation === 0 && config.harness_version !== VERSION)) {\n console.log(chalk.yellow(\" upgrade: available\"));\n } else if (versionRelation === 1) {\n console.log(chalk.red(\" upgrade: CLI is older than project harness\"));\n } else {\n console.log(\" upgrade: up to date\");\n }\n console.log(` agents: ${config.agents.join(\", \") || \"(none)\"}`);\n console.log(` project: ${config.project.name}`);\n const migratedBehavior = resolveLegacyBehavior(config);\n const projectApprovalMode = isApprovalMode(config.behavior?.approval_mode)\n ? config.behavior.approval_mode\n : migratedBehavior.approvalMode;\n const projectWorkflowMode = isConfiguredWorkflowMode(config.behavior?.workflow_mode)\n ? config.behavior.workflow_mode\n : migratedBehavior.workflowMode;\n const projectTddEnabled = migratedBehavior.tddEnabled;\n const projectTddCoverageThreshold = migratedBehavior.tddCoverageThreshold;\n console.log(` approval_mode: ${projectApprovalMode}`);\n console.log(` workflow_mode: ${projectWorkflowMode}`);\n console.log(` tdd_enabled: ${projectTddEnabled}`);\n console.log(` tdd_coverage_threshold: ${projectTddCoverageThreshold}`);\n console.log(` tdd_readiness: ${tddReadiness.status}`);\n if (tddReadiness.status !== \"ready\") {\n console.log(` tdd_readiness_reasons: ${tddReadiness.reasons.join(\"; \")}`);\n }\n console.log(\"\");\n console.log(chalk.bold(\"Sessions\"));\n console.log(` project_approval_mode: ${projectApprovalMode}`);\n console.log(` project_workflow_mode: ${projectWorkflowMode}`);\n console.log(` project_tdd_enabled: ${projectTddEnabled}`);\n console.log(` project_tdd_coverage_threshold: ${projectTddCoverageThreshold}`);\n console.log(` effective_approval_mode: ${projectApprovalMode} (without a session override)`);\n console.log(` configured_workflow_mode: ${projectWorkflowMode} (without a session override)`);\n console.log(` effective_tdd_enabled: ${projectTddEnabled} (without a session override)`);\n console.log(\n ` effective_tdd_coverage_threshold: ${projectTddCoverageThreshold} (without a session override)`,\n );\n if (sessions.length === 0) {\n console.log(\" no session files\");\n }\n for (const { key, session } of sessions) {\n const legacySessionMode = session.confirm_mode;\n const hasLegacySessionMode = [\"approve\", \"guard\", \"confirm\", \"auto\"].includes(\n String(legacySessionMode ?? \"\"),\n );\n const sessionApprovalMode =\n session.approval_mode ?? (legacySessionMode === \"lite\" ? \"guard\" : legacySessionMode);\n const sessionWorkflowMode =\n session.workflow_mode ??\n (legacySessionMode === \"lite\" ? \"fast\" : hasLegacySessionMode ? \"adaptive\" : undefined);\n const sessionTddEnabled = session.tdd_enabled;\n const sessionTddCoverageThreshold = session.tdd_coverage_threshold;\n console.log(` - ${key}`);\n console.log(` agent: ${session.agent ?? \"legacy/unknown\"}`);\n console.log(` source: ${session.session_source ?? \"legacy\"}`);\n console.log(` approval_mode: ${sessionApprovalMode ?? \"project default\"}`);\n console.log(` workflow_mode: ${sessionWorkflowMode ?? \"project default\"}`);\n console.log(` tdd_enabled: ${sessionTddEnabled ?? \"project default\"}`);\n console.log(` tdd_coverage_threshold: ${sessionTddCoverageThreshold ?? \"project default\"}`);\n console.log(` effective_approval_mode: ${sessionApprovalMode ?? projectApprovalMode}`);\n console.log(` configured_workflow_mode: ${sessionWorkflowMode ?? projectWorkflowMode}`);\n console.log(` effective_tdd_enabled: ${sessionTddEnabled ?? projectTddEnabled}`);\n console.log(\n ` effective_tdd_coverage_threshold: ${sessionTddCoverageThreshold ?? projectTddCoverageThreshold}`,\n );\n console.log(\n ` harness: ${session.harness_disabled ? \"disabled for this session\" : \"enabled\"}`,\n );\n console.log(` lite_mode: ${session.lite_mode === true ? \"enabled\" : \"disabled\"}`);\n if (session.lite_proposal) {\n console.log(` lite_proposal: ${session.lite_proposal.digest}`);\n }\n if (!session.current_task) {\n console.log(\" current_task: none\");\n continue;\n }\n const taskPath = getTaskJsonPath(cwd, session.current_task);\n if (await pathExists(taskPath)) {\n const task = await readTaskJson(taskPath);\n console.log(` current_task: ${session.current_task}`);\n console.log(` current_stage: ${task.status}`);\n console.log(\n ` task_workflow_mode: ${task.workflow_mode ?? task.workflow_mode_proposal?.selected_mode ?? \"not resolved\"}`,\n );\n console.log(` task_tdd_enabled: ${task.tdd_enabled ?? \"not frozen\"}`);\n console.log(\n ` task_tdd_coverage_threshold: ${task.tdd_coverage_threshold ?? \"not frozen\"}`,\n );\n console.log(` last_agent: ${task.last_agent}`);\n } else {\n console.log(` current_task: ${session.current_task} (task.json missing)`);\n }\n }\n console.log(\"\");\n console.log(chalk.bold(\"Tasks\"));\n console.log(` total: ${tasks.length}`);\n for (const [taskStatus, count] of Object.entries(taskCounts)) {\n console.log(` ${taskStatus}: ${count}`);\n }\n if (activeTasks.length > 0) {\n console.log(\" active:\");\n for (const item of activeTasks) {\n const label = item.task.title ? `${item.task.title} (${item.task.status})` : item.task.status;\n console.log(` - ${item.id}: ${label}`);\n }\n }\n}\n","import { readdir, stat, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { EASY_CODING_DIR, SESSIONS_DIR, TASKS_DIR } from \"../constants/paths.js\";\nimport type { SessionFile, TaskJson } from \"../types/task.js\";\nimport {\n ensureDir,\n pathExists,\n readTextFile,\n readTextIfExists,\n writeTextFile,\n} from \"./file-writer.js\";\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst IDLE_SESSION_RETENTION_MS = 7 * DAY_MS;\nconst ATTACHED_SESSION_RETENTION_MS = 30 * DAY_MS;\nconst MAX_SESSION_FILES = 100;\nconst SESSION_KEY_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport type SessionFileWithMetadata = SessionFile & {\n external_session_id?: string | null;\n session_key?: string;\n session_source?: string;\n last_active_at?: string;\n};\n\nexport interface SessionEntry {\n key: string;\n filePath: string;\n session: SessionFileWithMetadata;\n}\n\nexport interface SessionCleanupOptions {\n idleRetentionMs?: number;\n attachedRetentionMs?: number;\n maxSessions?: number;\n reserveSlots?: number;\n preserveTddSettings?: boolean;\n}\n\nexport interface SessionCleanupResult {\n sessionsRemoved: number;\n acceptanceSnapshotsRemoved: number;\n}\n\ninterface SessionCleanupCandidate {\n filePath: string;\n content: string;\n activityTime: number;\n attached: boolean;\n}\n\nfunction parseSessionFile(content: string): SessionFileWithMetadata | null {\n try {\n const parsed: unknown = JSON.parse(content);\n return typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)\n ? (parsed as SessionFileWithMetadata)\n : null;\n } catch {\n return null;\n }\n}\n\nexport function getSessionDir(cwd: string): string {\n return path.join(cwd, EASY_CODING_DIR, SESSIONS_DIR);\n}\n\nexport function getSessionFilePath(cwd: string, sessionKey: string | number): string {\n const normalizedKey = String(sessionKey);\n if (\n !normalizedKey ||\n normalizedKey === \".\" ||\n normalizedKey === \"..\" ||\n !SESSION_KEY_PATTERN.test(normalizedKey)\n ) {\n throw new Error(`Unsafe session key: ${normalizedKey}`);\n }\n return path.join(getSessionDir(cwd), `${normalizedKey}.json`);\n}\n\nexport function createSessionFile(currentTask: string | null = null): SessionFileWithMetadata {\n const timestamp = new Date().toISOString();\n return {\n current_task: currentTask,\n created_at: timestamp,\n last_active_at: timestamp,\n };\n}\n\nexport async function readSessionFile(\n cwd: string,\n sessionKey: string | number,\n): Promise<SessionFileWithMetadata | null> {\n const content = await readTextIfExists(getSessionFilePath(cwd, sessionKey));\n if (!content) {\n return null;\n }\n return parseSessionFile(content);\n}\n\nexport async function writeSessionFile(\n cwd: string,\n session: SessionFileWithMetadata,\n sessionKey: string | number,\n): Promise<void> {\n const dir = getSessionDir(cwd);\n await ensureDir(dir);\n await writeTextFile(getSessionFilePath(cwd, sessionKey), JSON.stringify(session, null, 2));\n}\n\nexport async function ensureSessionFile(\n cwd: string,\n sessionKey: string | number,\n): Promise<SessionFileWithMetadata> {\n const existing = await readSessionFile(cwd, sessionKey);\n if (existing) {\n return existing;\n }\n await cleanSessionRuntime(cwd, { reserveSlots: 1 });\n const session = createSessionFile();\n await writeSessionFile(cwd, session, sessionKey);\n return session;\n}\n\nexport async function listSessionFiles(cwd: string): Promise<SessionEntry[]> {\n const dir = getSessionDir(cwd);\n if (!(await pathExists(dir))) {\n return [];\n }\n\n const entries: SessionEntry[] = [];\n for (const name of await readdir(dir)) {\n if (!name.endsWith(\".json\")) {\n continue;\n }\n const filePath = path.join(dir, name);\n const content = await readTextIfExists(filePath);\n if (!content) {\n continue;\n }\n const session = parseSessionFile(content);\n if (!session) {\n continue;\n }\n entries.push({\n key: name.slice(0, -\".json\".length),\n filePath,\n session,\n });\n }\n return entries.sort((left, right) => left.key.localeCompare(right.key));\n}\n\nexport async function cleanSessionRuntime(\n cwd: string,\n options: SessionCleanupOptions = {},\n): Promise<SessionCleanupResult> {\n const now = Date.now();\n const idleRetentionMs = options.idleRetentionMs ?? IDLE_SESSION_RETENTION_MS;\n const attachedRetentionMs = options.attachedRetentionMs ?? ATTACHED_SESSION_RETENTION_MS;\n const maxSessions = options.maxSessions ?? MAX_SESSION_FILES;\n const reserveSlots = options.reserveSlots ?? 0;\n const candidates = (await listSessionCleanupCandidates(cwd)).filter((candidate) => {\n if (!options.preserveTddSettings) return true;\n const session = parseSessionFile(candidate.content);\n return !session || !(\"tdd_enabled\" in session || \"tdd_coverage_threshold\" in session);\n });\n const removed = new Set<string>();\n\n for (const candidate of candidates) {\n const retentionMs = candidate.attached ? attachedRetentionMs : idleRetentionMs;\n if (now - candidate.activityTime <= retentionMs) {\n continue;\n }\n if (await unlinkIfUnchanged(candidate)) {\n removed.add(candidate.filePath);\n }\n }\n\n const allowedExistingSessions = Math.max(0, maxSessions - reserveSlots);\n const remaining = candidates\n .filter((candidate) => !removed.has(candidate.filePath))\n .sort((left, right) => left.activityTime - right.activityTime);\n for (const candidate of remaining.slice(\n 0,\n Math.max(0, remaining.length - allowedExistingSessions),\n )) {\n if (await unlinkIfUnchanged(candidate)) {\n removed.add(candidate.filePath);\n }\n }\n\n return {\n sessionsRemoved: removed.size,\n acceptanceSnapshotsRemoved: await cleanOrphanAcceptanceSnapshots(cwd),\n };\n}\n\nasync function listSessionCleanupCandidates(cwd: string): Promise<SessionCleanupCandidate[]> {\n const dir = getSessionDir(cwd);\n if (!(await pathExists(dir))) {\n return [];\n }\n\n const candidates: SessionCleanupCandidate[] = [];\n for (const entry of await readdir(dir, { withFileTypes: true })) {\n if (!entry.isFile() || !entry.name.endsWith(\".json\")) {\n continue;\n }\n const filePath = path.join(dir, entry.name);\n try {\n const [content, fileStat] = await Promise.all([readTextFile(filePath), stat(filePath)]);\n const session = parseSessionFile(content);\n const activityValue = session?.last_active_at ?? session?.created_at;\n const parsedActivity =\n typeof activityValue === \"string\" ? new Date(activityValue).getTime() : Number.NaN;\n candidates.push({\n filePath,\n content,\n activityTime: Number.isNaN(parsedActivity) ? fileStat.mtimeMs : parsedActivity,\n attached: Boolean(session?.current_task),\n });\n } catch (error) {\n if (!isFileNotFound(error)) {\n throw error;\n }\n }\n }\n return candidates;\n}\n\nasync function unlinkIfUnchanged(candidate: SessionCleanupCandidate): Promise<boolean> {\n try {\n // 删除前复核内容,避免清理扫描之后的并发刷新被旧候选覆盖。\n if ((await readTextFile(candidate.filePath)) !== candidate.content) {\n return false;\n }\n await unlink(candidate.filePath);\n return true;\n } catch (error) {\n if (isFileNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\nasync function cleanOrphanAcceptanceSnapshots(cwd: string): Promise<number> {\n const acceptanceDir = path.join(getSessionDir(cwd), \"acceptance\");\n if (!(await pathExists(acceptanceDir))) {\n return 0;\n }\n\n let removed = 0;\n for (const entry of await readdir(acceptanceDir, { withFileTypes: true })) {\n if (!entry.isFile() || !entry.name.endsWith(\".json\")) {\n continue;\n }\n const snapshotPath = path.join(acceptanceDir, entry.name);\n if (!(await isOrphanAcceptanceSnapshot(cwd, snapshotPath, entry.name.slice(0, -5)))) {\n continue;\n }\n try {\n await unlink(snapshotPath);\n removed++;\n } catch (error) {\n if (!isFileNotFound(error)) {\n throw error;\n }\n }\n }\n return removed;\n}\n\nasync function isOrphanAcceptanceSnapshot(\n cwd: string,\n snapshotPath: string,\n taskId: string,\n): Promise<boolean> {\n let taskContent: string;\n try {\n taskContent = await readTextFile(\n path.join(cwd, EASY_CODING_DIR, TASKS_DIR, taskId, \"task.json\"),\n );\n } catch (error) {\n if (isFileNotFound(error)) {\n return true;\n }\n throw error;\n }\n\n let parsedTask: unknown;\n try {\n parsedTask = JSON.parse(taskContent);\n } catch {\n return false;\n }\n if (typeof parsedTask !== \"object\" || parsedTask === null || Array.isArray(parsedTask)) {\n return false;\n }\n const task = parsedTask as TaskJson;\n if (task.status === \"COMPLETE\" || task.status === \"CLOSED\") {\n return true;\n }\n\n const checkpoint = task.quality_checkpoint ?? task.verification_checkpoint;\n return (\n typeof checkpoint?.snapshot_file !== \"string\" ||\n path.resolve(cwd, checkpoint.snapshot_file) !== path.resolve(snapshotPath)\n );\n}\n\nfunction isFileNotFound(error: unknown): boolean {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n","import { execFileSync } from \"node:child_process\";\nimport { cancel, confirm, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { PACKAGE_NAME } from \"../constants/version.js\";\nimport { renderBanner } from \"../ui/banner.js\";\n\nexport interface UpdateOptions {\n tag?: string;\n dryRun?: boolean;\n yes?: boolean;\n}\n\n/**\n * Refresh the globally installed CLI to a published version.\n */\nexport async function update(opts: UpdateOptions): Promise<void> {\n renderBanner();\n\n const tag = opts.tag ?? \"latest\";\n const spec = `${PACKAGE_NAME}@${tag}`;\n\n const plan = [\"update runs one step:\", ` refresh the global CLI: npm install -g ${spec}`].join(\n \"\\n\",\n );\n\n if (opts.dryRun) {\n console.log(plan);\n return;\n }\n\n if (!opts.yes) {\n const confirmed = await confirm({\n message: `Update the global CLI to ${spec}?`,\n initialValue: true,\n });\n if (typeof confirmed === \"symbol\" || !confirmed) {\n cancel(\"Update cancelled.\");\n return;\n }\n }\n\n console.log(chalk.cyan(`→ npm install -g ${spec}`));\n execFileSync(\"npm\", [\"install\", \"-g\", spec], { stdio: \"inherit\" });\n\n outro(chalk.green(\"Global CLI updated.\"));\n}\n","import path from \"node:path\";\nimport { cancel, confirm, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { renderHookCommand } from \"../configurators/shared.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport type { AgentPlatform, PlatformMeta } from \"../types/platform.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { compareVersions } from \"../utils/compare-versions.js\";\nimport {\n migrateBehaviorConfig,\n readConfigYaml,\n updateHarnessVersion,\n updateSupermoduleConfig,\n} from \"../utils/config-yaml.js\";\nimport { pathExists, readTextIfExists } from \"../utils/file-writer.js\";\nimport { ensureEasyCodingSessionsIgnored, ensureHookBytecodeIgnored } from \"../utils/gitignore.js\";\nimport {\n type InstallArtifact,\n extractHookPathFromCommand,\n pruneRetiredManagedFiles,\n readInstallManifest,\n writeInstallManifest,\n} from \"../utils/install-manifest.js\";\nimport { resolvePlatformMeta } from \"../utils/platform-paths.js\";\nimport { writeRuntimeScaffold } from \"../utils/runtime-scaffold.js\";\nimport { cleanSessionRuntime } from \"../utils/session.js\";\nimport {\n hasLegacyWorkflowState,\n migrateLegacyWorkflowState,\n setPendingInitSince,\n stripInitTaskProjectPath,\n} from \"../utils/task-json.js\";\nimport { configurePlatformsForDir, refreshSupermoduleParent } from \"./install-harness.js\";\nimport { type CommandTarget, resolveUpgradeTargets } from \"./supermodule-targets.js\";\n\nexport interface UpgradeOptions {\n dryRun?: boolean;\n yes?: boolean;\n}\n\ninterface PendingUpgradeTarget {\n target: CommandTarget;\n config: Awaited<ReturnType<typeof readConfigYaml>>;\n}\n\ninterface ParentTopologyRefresh {\n target: CommandTarget;\n agents: Awaited<ReturnType<typeof readConfigYaml>>[\"agents\"];\n submodulePaths: string[];\n}\n\ninterface ChildTopologyRefresh {\n target: CommandTarget;\n}\n\ninterface ExpectedHookScriptRegistration {\n event: string;\n scriptName: string;\n}\n\ninterface ExpectedHookRegistration {\n event: string;\n command: string;\n}\n\nconst EXPECTED_HOOK_REGISTRATION_SCRIPTS: Record<AgentPlatform, ExpectedHookScriptRegistration[]> =\n {\n \"claude-code\": [\n { event: \"SessionStart\", scriptName: \"session-start.py\" },\n { event: \"UserPromptSubmit\", scriptName: \"inject-workflow-state.py\" },\n { event: \"PreToolUse\", scriptName: \"inject-subagent-context.py\" },\n ],\n codex: [\n { event: \"SessionStart\", scriptName: \"session-start.py\" },\n { event: \"UserPromptSubmit\", scriptName: \"inject-workflow-state.py\" },\n ],\n qoder: [\n { event: \"UserPromptSubmit\", scriptName: \"inject-workflow-state.py\" },\n { event: \"PreToolUse\", scriptName: \"inject-subagent-context.py\" },\n ],\n };\n\nconst MANAGED_HOOK_SCRIPT_NAMES: Record<AgentPlatform, string[]> = {\n \"claude-code\": [\n ...new Set(\n EXPECTED_HOOK_REGISTRATION_SCRIPTS[\"claude-code\"].map(({ scriptName }) => scriptName),\n ),\n ],\n codex: [...new Set(EXPECTED_HOOK_REGISTRATION_SCRIPTS.codex.map(({ scriptName }) => scriptName))],\n // Keep removed registrations recognizable so same-version repair can clean them without a manifest.\n qoder: [\n ...new Set([\n ...EXPECTED_HOOK_REGISTRATION_SCRIPTS.qoder.map(({ scriptName }) => scriptName),\n \"session-start.py\",\n ]),\n ],\n};\n\nexport async function upgrade(opts: UpgradeOptions): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\n const targets = await resolveUpgradeTargets(cwd);\n if (!(await pathExists(targets[0].configPath))) {\n throw new Error(\"No .easy-coding/config.yaml found. Run easy-coding init first.\");\n }\n\n const pending = await resolvePendingUpgradeTargets(targets);\n const parentTopologyRefresh = await resolveParentTopologyRefresh(targets, pending);\n const childTopologyRefreshes = await resolveChildTopologyRefreshes(targets, pending);\n\n if (pending.length === 0 && !parentTopologyRefresh && childTopologyRefreshes.length === 0) {\n outro(chalk.green(`easy-coding harness is already up to date (${VERSION}).`));\n return;\n }\n\n const summary = [\n \"Upgrade targets:\",\n ...(pending.length > 0\n ? pending.map(\n ({ target, config }) =>\n `- ${target.label}: ${String(config.harness_version ?? \"unknown\")} -> ${VERSION}; agents: ${config.agents.join(\", \")}`,\n )\n : [\"- (none)\"]),\n ...(parentTopologyRefresh\n ? [\n \"Supermodule topology refresh:\",\n `- ${parentTopologyRefresh.target.label}: submodules: ${parentTopologyRefresh.submodulePaths.length > 0 ? parentTopologyRefresh.submodulePaths.join(\", \") : \"(none)\"}`,\n ]\n : []),\n ...(childTopologyRefreshes.length > 0\n ? [\n parentTopologyRefresh ? \"\" : \"Supermodule topology refresh:\",\n ...childTopologyRefreshes.map(({ target }) => `- ${target.label}: role: submodule-child`),\n ].filter(Boolean)\n : []),\n \"Will overwrite managed skills, hooks, agents, templates, and generated main-constraint regions.\",\n \"Will remove retired files that still match the previous install manifest and preserve locally modified copies.\",\n \"Will update project-init task to recommend ec-init re-run for version adaptation.\",\n \"Will migrate behavior config to schema 5 while preserving project/session TDD settings and frozen task baselines.\",\n \"Will prune expired session bindings without explicit TDD settings and orphan acceptance snapshots in each upgraded target while preserving tasks, memory, spec, and project knowledge.\",\n \"Will migrate active REVIEW/VERIFICATION tasks to QUALITY, retire active read-only task types as CLOSED, and preserve their artifacts and history.\",\n \"Will migrate legacy workflow/TDD task metadata; memory content, spec, and project knowledge files remain untouched.\",\n ].join(\"\\n\");\n\n if (opts.dryRun) {\n console.log(summary);\n return;\n }\n\n if (!opts.yes) {\n const shouldUpgrade = await confirm({\n message: \"Apply this harness upgrade?\",\n initialValue: true,\n });\n if (typeof shouldUpgrade === \"symbol\" || !shouldUpgrade) {\n cancel(\"Upgrade cancelled.\");\n return;\n }\n }\n\n for (const { target, config } of pending) {\n const previousManifest = await readInstallManifest(target.dir);\n const sessionCleanup = await cleanSessionRuntime(target.dir, { preserveTddSettings: true });\n if (sessionCleanup.sessionsRemoved > 0 || sessionCleanup.acceptanceSnapshotsRemoved > 0) {\n console.log(\n chalk.yellow(\n `${target.label}: session GC removed ${sessionCleanup.sessionsRemoved} session file(s)` +\n ` and ${sessionCleanup.acceptanceSnapshotsRemoved} orphan acceptance snapshot(s).`,\n ),\n );\n }\n const projectId = await writeRuntimeScaffold(target.dir, config.agents, {\n supermodule: target.supermodule,\n });\n const artifacts: InstallArtifact[] = await configurePlatformsForDir(target.dir, config.agents, {\n supermodule: target.boundary,\n projectId,\n });\n const retiredFiles = await pruneRetiredManagedFiles(target.dir, previousManifest, artifacts);\n if (retiredFiles.removed.length > 0 || retiredFiles.preserved.length > 0) {\n console.log(\n chalk.yellow(\n `${target.label}: removed ${retiredFiles.removed.length} retired managed file(s)` +\n ` and preserved ${retiredFiles.preserved.length} locally modified file(s).`,\n ),\n );\n }\n await writeInstallManifest(target.dir, {\n harnessVersion: VERSION,\n agents: config.agents,\n artifacts,\n });\n await ensureEasyCodingSessionsIgnored(target.dir);\n await ensureHookBytecodeIgnored(target.dir);\n await migrateLegacyWorkflowState(target.dir);\n await migrateBehaviorConfig(target.configPath);\n await updateHarnessVersion(target.configPath, VERSION);\n await updateSupermoduleConfig(target.configPath, target.supermodule);\n await setPendingInitSince(target.dir, VERSION);\n await stripInitTaskProjectPath(target.dir);\n }\n\n if (parentTopologyRefresh) {\n await refreshSupermoduleParent(\n parentTopologyRefresh.target.dir,\n parentTopologyRefresh.agents,\n parentTopologyRefresh.submodulePaths,\n );\n }\n\n for (const { target } of childTopologyRefreshes) {\n await updateSupermoduleConfig(target.configPath, target.supermodule);\n }\n\n outro(\n chalk.green(\n pending.length > 0\n ? `easy-coding harness upgraded to ${VERSION}.`\n : \"easy-coding supermodule topology refreshed.\",\n ),\n );\n}\n\nasync function resolvePendingUpgradeTargets(\n targets: CommandTarget[],\n): Promise<PendingUpgradeTarget[]> {\n const pending: PendingUpgradeTarget[] = [];\n for (const target of targets) {\n if (!(await pathExists(target.configPath))) {\n continue;\n }\n const config = await readConfigYaml(target.configPath);\n const installedVersion = String(config.harness_version ?? \"\");\n const hasAgents = Array.isArray(config.agents) && config.agents.length > 0;\n if (!installedVersion || !hasAgents) {\n throw new Error(\n `${target.label} config.yaml is missing required harness fields (harness_version / agents). This project predates the current config layout. Run \\`easy-coding clear\\` then \\`easy-coding init\\` to migrate — your tasks, spec, and memory are preserved.`,\n );\n }\n\n const relation = compareVersions(installedVersion, VERSION);\n if (relation === 1) {\n throw new Error(\n `${target.label} harness version ${installedVersion} is newer than CLI ${VERSION}. Update the CLI first.`,\n );\n }\n if (\n relation === -1 ||\n (relation === 0 &&\n (installedVersion !== VERSION ||\n (await needsHookConfigRefresh(target, config)) ||\n (await hasLegacyWorkflowState(target.dir))))\n ) {\n pending.push({ target, config });\n }\n }\n\n return pending;\n}\n\nasync function needsHookConfigRefresh(\n target: CommandTarget,\n config: Awaited<ReturnType<typeof readConfigYaml>>,\n): Promise<boolean> {\n const projectId = typeof config.project?.id === \"string\" ? config.project.id.trim() : \"\";\n if (!projectId) {\n return true;\n }\n const manifest = await readInstallManifest(target.dir);\n for (const agent of config.agents) {\n const meta = resolvePlatformMeta(target.dir, agent);\n const configPath = path.join(target.dir, meta.hookConfigFile);\n const content = await readTextIfExists(configPath);\n if (content === null) {\n return true;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(content) as Record<string, unknown>;\n } catch {\n return true;\n }\n\n const commandsByEvent = collectHookCommandsByEvent(parsed.hooks);\n const actualRegistrations = [...commandsByEvent.entries()].flatMap(([event, commands]) =>\n commands.map((command) => ({ event, command })),\n );\n const expectedRegistrations = expectedHookRegistrations(target.dir, meta, agent, projectId);\n const expectedCommandSet = new Set(\n expectedRegistrations.map((registration) => registration.command),\n );\n if (!hasExpectedHookRegistrations(commandsByEvent, expectedRegistrations)) {\n return true;\n }\n const manifestManagedCommands = new Set(\n manifest?.hook_registrations\n .filter((registration) => registration.platform === agent)\n .map((registration) => registration.command) ?? [],\n );\n if (\n hasUnexpectedManagedHookRegistrations(\n actualRegistrations,\n expectedRegistrations,\n expectedCommandSet,\n target.dir,\n meta,\n agent,\n manifestManagedCommands,\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction expectedHookRegistrations(\n cwd: string,\n meta: PlatformMeta,\n platform: AgentPlatform,\n projectId: string,\n): ExpectedHookRegistration[] {\n return EXPECTED_HOOK_REGISTRATION_SCRIPTS[platform].map(({ event, scriptName }) => ({\n event,\n command: renderHookCommand(cwd, meta.templateContext, scriptName, process.platform, projectId),\n }));\n}\n\nfunction hasExpectedHookRegistrations(\n commandsByEvent: Map<string, string[]>,\n expectedRegistrations: ExpectedHookRegistration[],\n): boolean {\n const actualCounts = countRegistrations(\n [...commandsByEvent.entries()].flatMap(([event, commands]) =>\n commands.map((command) => ({ event, command })),\n ),\n );\n const expectedCounts = countRegistrations(expectedRegistrations);\n return [...expectedCounts.entries()].every(\n ([registrationKey, expectedCount]) => (actualCounts.get(registrationKey) ?? 0) >= expectedCount,\n );\n}\n\nfunction countRegistrations(registrations: ExpectedHookRegistration[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const registration of registrations) {\n const key = hookRegistrationKey(registration);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction hookRegistrationKey(registration: ExpectedHookRegistration): string {\n return `${registration.event}\\0${registration.command}`;\n}\n\nfunction hasUnexpectedManagedHookRegistrations(\n actualRegistrations: ExpectedHookRegistration[],\n expectedRegistrations: ExpectedHookRegistration[],\n expectedCommands: Set<string>,\n cwd: string,\n meta: PlatformMeta,\n platform: AgentPlatform,\n manifestManagedCommands: Set<string>,\n): boolean {\n const remainingExpected = countRegistrations(expectedRegistrations);\n for (const registration of actualRegistrations) {\n const key = hookRegistrationKey(registration);\n const remainingCount = remainingExpected.get(key) ?? 0;\n if (remainingCount > 0) {\n remainingExpected.set(key, remainingCount - 1);\n continue;\n }\n if (\n isManagedHookCommand(\n registration.command,\n expectedCommands,\n cwd,\n meta,\n platform,\n manifestManagedCommands,\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction collectHookCommandsByEvent(hooks: unknown): Map<string, string[]> {\n if (!hooks || typeof hooks !== \"object\" || Array.isArray(hooks)) {\n return new Map();\n }\n\n const commandsByEvent = new Map<string, string[]>();\n for (const [event, value] of Object.entries(hooks)) {\n if (!Array.isArray(value)) {\n continue;\n }\n for (const group of value) {\n if (!group || typeof group !== \"object\") {\n continue;\n }\n const hookItems = (group as { hooks?: unknown }).hooks;\n if (!Array.isArray(hookItems)) {\n continue;\n }\n for (const hook of hookItems) {\n if (!hook || typeof hook !== \"object\") {\n continue;\n }\n const command = (hook as { command?: unknown }).command;\n if (typeof command === \"string\") {\n const eventCommands = commandsByEvent.get(event) ?? [];\n eventCommands.push(command);\n commandsByEvent.set(event, eventCommands);\n }\n }\n }\n }\n return commandsByEvent;\n}\n\nfunction isManagedHookCommand(\n command: string,\n expectedCommands: Set<string>,\n cwd: string,\n meta: PlatformMeta,\n platform: AgentPlatform,\n manifestManagedCommands: Set<string>,\n): boolean {\n if (expectedCommands.has(command)) {\n return true;\n }\n if (manifestManagedCommands.has(command)) {\n return true;\n }\n\n const hookPath = extractHookPathFromCommand(command);\n return hookPath === null ? false : isCurrentProjectManagedHookPath(cwd, hookPath, meta, platform);\n}\n\nfunction isCurrentProjectManagedHookPath(\n cwd: string,\n hookPath: string,\n meta: PlatformMeta,\n platform: AgentPlatform,\n): boolean {\n const normalizedHookPath = normalizePathForHookComparison(hookPath);\n const configDir = normalizePathForHookComparison(meta.templateContext.platform_config_dir);\n\n return MANAGED_HOOK_SCRIPT_NAMES[platform].some((scriptName) => {\n const relativeHookPath = `${configDir}/hooks/${scriptName}`;\n if (normalizedHookPath === relativeHookPath) {\n return true;\n }\n return pathAliases(\n normalizePathForHookComparison(path.resolve(cwd, relativeHookPath)),\n ).includes(normalizedHookPath);\n });\n}\n\nfunction normalizePathForHookComparison(value: string): string {\n return value.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction pathAliases(value: string): string[] {\n const aliases = new Set([value]);\n if (value.startsWith(\"/private/var/\")) {\n aliases.add(value.replace(/^\\/private\\/var\\//, \"/var/\"));\n } else if (value.startsWith(\"/var/\")) {\n aliases.add(`/private${value}`);\n }\n return [...aliases];\n}\n\nasync function resolveParentTopologyRefresh(\n targets: CommandTarget[],\n pending: PendingUpgradeTarget[],\n): Promise<ParentTopologyRefresh | null> {\n const parent = targets.find(\n (target) => target.label === \".\" && target.supermodule.role === \"super-parent\",\n );\n if (!parent || pending.some(({ target }) => target.label === \".\")) {\n return null;\n }\n if (!(await pathExists(parent.configPath))) {\n return null;\n }\n\n const config = await readConfigYaml(parent.configPath);\n if (!Array.isArray(config.agents) || config.agents.length === 0) {\n return null;\n }\n const submodulePaths = parent.supermodule.submodules ?? [];\n const configuredSubmodules = Array.isArray(config.supermodule?.submodules)\n ? config.supermodule.submodules\n : [];\n const needsRefresh =\n config.supermodule?.role !== \"super-parent\" ||\n !sameStringList(configuredSubmodules, submodulePaths);\n if (!needsRefresh) {\n return null;\n }\n\n return {\n target: parent,\n agents: config.agents,\n submodulePaths,\n };\n}\n\nasync function resolveChildTopologyRefreshes(\n targets: CommandTarget[],\n pending: PendingUpgradeTarget[],\n): Promise<ChildTopologyRefresh[]> {\n const pendingLabels = new Set(pending.map(({ target }) => target.label));\n const refreshes: ChildTopologyRefresh[] = [];\n\n for (const target of targets) {\n if (\n target.supermodule.role !== \"submodule-child\" ||\n pendingLabels.has(target.label) ||\n !(await pathExists(target.configPath))\n ) {\n continue;\n }\n\n const config = await readConfigYaml(target.configPath);\n if (\n config.supermodule?.role === \"submodule-child\" &&\n config.supermodule.parent === target.supermodule.parent\n ) {\n continue;\n }\n\n refreshes.push({ target });\n }\n\n return refreshes;\n}\n\nfunction sameStringList(left: string[], right: string[]): boolean {\n if (left.length !== right.length) {\n return false;\n }\n const sortedLeft = [...left].sort();\n const sortedRight = [...right].sort();\n return sortedLeft.every((value, index) => value === sortedRight[index]);\n}\n"],"mappings":"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","names":["chalk","chalk","readFile","path","config","readFile","config","path","path","readFile","path","configPath","relPath","path","manifestPath","readFile","path","path","fileURLToPath","path","configPath","path","path","status","configPath","config","path","path","readdir","stat","path","path","readdir","stat","path","path","path","readdir","path","existsSync","path","existsSync","path","path","readdir","path","path","cancel","multiselect","path","path","path","multiselect","cancel","config","config","chalk","readdir","path","cancel","confirm","outro","chalk","confirm","cancel","outro","chalk","path","config","configPath","plan","shellDoubleQuoteArg","byPath","isInsideDirectory","readdir","path","cancel","confirm","outro","chalk","path","configPath","path","config","readFile","realpath","path","path","realpath","readFile","manifestPath","configPath","path","cancel","confirm","outro","chalk","path","outro","chalk","readdir","path","path","configPath","readdir","standaloneTarget","parentTarget","platforms","outro","chalk","path","toPosixRelative","config","configPath","path","chalk","readdir","stat","unlink","path","path","readdir","path","stat","unlink","configPath","path","config","chalk","cancel","confirm","outro","chalk","confirm","cancel","chalk","outro","path","cancel","confirm","outro","chalk","outro","chalk","config","confirm","cancel","configPath","path","chalk"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/commands/add-agent.ts","../src/constants/version.ts","../src/ui/banner.ts","../src/utils/config-yaml.ts","../src/utils/file-writer.ts","../src/utils/gitignore.ts","../src/constants/paths.ts","../src/utils/install-manifest.ts","../src/types/platform.ts","../src/utils/runtime-scaffold.ts","../src/utils/task-json.ts","../src/utils/template-paths.ts","../src/commands/install-harness.ts","../src/configurators/claude.ts","../src/configurators/shared.ts","../src/utils/marked-region.ts","../src/configurators/codex.ts","../src/configurators/qoder.ts","../src/utils/platform-paths.ts","../src/configurators/index.ts","../src/commands/platforms.ts","../src/commands/supermodule-targets.ts","../src/utils/gitmodules.ts","../src/commands/clear.ts","../src/commands/config.ts","../src/utils/compare-versions.ts","../src/utils/tdd-readiness.ts","../src/commands/init.ts","../src/utils/install-state.ts","../src/commands/status.ts","../src/utils/session.ts","../src/commands/update.ts","../src/commands/upgrade.ts"],"sourcesContent":["import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { addAgent } from \"./commands/add-agent.js\";\nimport { clear } from \"./commands/clear.js\";\nimport { config } from \"./commands/config.js\";\nimport { init } from \"./commands/init.js\";\nimport { status } from \"./commands/status.js\";\nimport { update } from \"./commands/update.js\";\nimport { upgrade } from \"./commands/upgrade.js\";\nimport { PACKAGE_NAME, VERSION } from \"./constants/version.js\";\nimport { checkForUpgrade } from \"./utils/compare-versions.js\";\n\ntype CommandAction<T> = (opts: T) => Promise<void>;\n\nfunction withErrorHandling<T>(fn: CommandAction<T>) {\n return async (opts: T) => {\n try {\n await fn(opts);\n } catch (error) {\n console.error(chalk.red(\"Error:\"), error instanceof Error ? error.message : error);\n if (process.env.EC_DEBUG && error instanceof Error) {\n console.error(error.stack);\n }\n process.exit(1);\n }\n };\n}\n\nawait checkForUpgrade(process.cwd());\n\nconst program = new Command();\n\nprogram.name(\"easy-coding\").description(PACKAGE_NAME).version(VERSION, \"-v, --version\");\n\nprogram\n .command(\"init\")\n .description(\"Initialize easy-coding harness in current project\")\n .option(\"--agent <list>\", \"Comma-separated platforms: claude-code,codex,qoder\")\n .option(\n \"--submodules <list>\",\n \"Comma-separated checked-out submodule paths or names to initialize\",\n )\n .option(\"--no-submodules\", \"Initialize only the current directory when .gitmodules exists\")\n .option(\"-y, --yes\", \"Skip prompts, use defaults\")\n .action(withErrorHandling(init));\n\nprogram\n .command(\"add-agent\")\n .description(\"Add agent platform support to an existing project\")\n .option(\"--agent <list>\", \"Comma-separated platforms to add\")\n .option(\"--submodules <list>\", \"Comma-separated initialized submodule paths or names to update\")\n .option(\"--no-submodules\", \"Add the agent only to the current directory\")\n .action(withErrorHandling(addAgent));\n\nprogram\n .command(\"upgrade\")\n .description(\"Upgrade harness files to current CLI version\")\n .option(\"--dry-run\", \"Preview changes without applying\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(withErrorHandling(upgrade));\n\nprogram\n .command(\"update\")\n .description(\"Refresh the global CLI to the latest published version\")\n .option(\"--tag <tag>\", \"npm dist-tag or version to install\", \"latest\")\n .option(\"--dry-run\", \"Preview the install command without running it\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(withErrorHandling(update));\n\nprogram\n .command(\"config\")\n .description(\"Interactively configure project-level harness behavior\")\n .action(withErrorHandling(config));\n\nprogram\n .command(\"status\")\n .description(\"Show installed agents, version, and tasks\")\n .action(withErrorHandling(status));\n\nprogram\n .command(\"clear\")\n .description(\"Remove installed harness files (skills, hooks, config); keep tasks, spec, memory\")\n .option(\"--submodules <list>\", \"Comma-separated initialized submodule paths or names to clear\")\n .option(\"--no-submodules\", \"Clear only the current directory\")\n .option(\"--dry-run\", \"Preview what would be removed without deleting\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(withErrorHandling(clear));\n\nprogram.parse();\n","import { outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { VERSION } from \"../constants/version.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport {\n addAgentsToConfig,\n readConfigYaml,\n updateSupermoduleConfig,\n} from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { ensureEasyCodingSessionsIgnored, ensureHookBytecodeIgnored } from \"../utils/gitignore.js\";\nimport { type InstallArtifact, writeInstallManifest } from \"../utils/install-manifest.js\";\nimport { writeRuntimeScaffold } from \"../utils/runtime-scaffold.js\";\nimport { setPendingInitSince } from \"../utils/task-json.js\";\nimport { configurePlatformsForDir, refreshSupermoduleParent } from \"./install-harness.js\";\nimport { type PlatformOptions, resolvePlatforms } from \"./platforms.js\";\nimport { resolveAddAgentTargets } from \"./supermodule-targets.js\";\n\nexport async function addAgent(opts: PlatformOptions): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\n const targets = await resolveAddAgentTargets(cwd, opts);\n if (!(await pathExists(targets[0].configPath))) {\n throw new Error(\"No .easy-coding/config.yaml found. Run easy-coding init first.\");\n }\n\n const platforms = await resolvePlatforms(opts, [\"claude-code\"]);\n\n for (const target of targets) {\n if (!(await pathExists(target.configPath))) continue;\n const config = await readConfigYaml(target.configPath);\n const installedVersion = String(config.harness_version ?? \"\");\n if (installedVersion !== VERSION) {\n throw new Error(\n `${target.label}: installed harness ${installedVersion || \"unknown\"} does not match CLI ${VERSION}. Run easy-coding upgrade before add-agent.`,\n );\n }\n }\n\n const installedLabels: string[] = [];\n const refreshedLabels: string[] = [];\n\n for (const target of targets) {\n if (!(await pathExists(target.configPath))) {\n continue;\n }\n const config = await readConfigYaml(target.configPath);\n const toInstall = platforms.filter((platform) => !config.agents.includes(platform));\n const agents = [...config.agents, ...toInstall];\n\n if (toInstall.length > 0) {\n const projectId = await writeRuntimeScaffold(target.dir, agents, {\n supermodule: target.supermodule,\n });\n const artifacts: InstallArtifact[] = await configurePlatformsForDir(target.dir, toInstall, {\n supermodule: target.boundary,\n projectId,\n });\n await writeInstallManifest(target.dir, {\n harnessVersion: VERSION,\n agents: toInstall,\n artifacts,\n mode: \"merge\",\n });\n await ensureEasyCodingSessionsIgnored(target.dir);\n await ensureHookBytecodeIgnored(target.dir);\n await addAgentsToConfig(target.configPath, toInstall);\n await setPendingInitSince(target.dir, VERSION);\n\n installedLabels.push(`${target.label}: ${toInstall.join(\", \")}`);\n }\n\n if (target.supermodule.role === \"super-parent\") {\n await refreshSupermoduleParent(target.dir, agents, target.supermodule.submodules ?? []);\n refreshedLabels.push(target.label);\n continue;\n }\n\n if (target.supermodule.role === \"submodule-child\") {\n await updateSupermoduleConfig(target.configPath, target.supermodule);\n refreshedLabels.push(target.label);\n }\n }\n\n if (installedLabels.length === 0) {\n if (refreshedLabels.length > 0) {\n outro(chalk.green(`Supermodule topology refreshed:\\n${refreshedLabels.join(\"\\n\")}`));\n return;\n }\n outro(chalk.yellow(\"All selected agent platforms are already installed.\"));\n return;\n }\n\n outro(chalk.green(`Added agent platforms:\\n${installedLabels.join(\"\\n\")}`));\n}\n","import { readFileSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\ninterface PackageMetadata {\n name: string;\n version: string;\n}\n\nconst packageMetadata = readPackageMetadata();\n\nexport const PACKAGE_NAME = packageMetadata.name;\nexport const VERSION = packageMetadata.version;\n\nfunction readPackageMetadata(): PackageMetadata {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, \"../../package.json\"),\n path.resolve(here, \"../package.json\"),\n path.resolve(process.cwd(), \"package.json\"),\n ];\n\n for (const candidate of candidates) {\n try {\n const parsed = JSON.parse(readFileSync(candidate, \"utf8\")) as Partial<PackageMetadata>;\n if (parsed.name && parsed.version) {\n return { name: parsed.name, version: parsed.version };\n }\n } catch {\n // Try the next candidate; source, dist, and installed layouts differ.\n }\n }\n\n throw new Error(`Unable to locate package metadata. Tried: ${candidates.join(\", \")}`);\n}\n","import chalk from \"chalk\";\nimport figlet from \"figlet\";\nimport { VERSION } from \"../constants/version.js\";\n\nexport interface BannerPreset {\n font: \"ANSI Shadow\" | \"Small Shadow\" | \"Small Slant\";\n horizontalLayout?: \"full\";\n}\n\nconst WIDE_TERMINAL_WIDTH = 88;\nconst MEDIUM_TERMINAL_WIDTH = 72;\n\nexport function renderBanner(): void {\n const terminalWidth = process.stdout.columns ?? 120;\n const art = figlet.textSync(\"Easy Coding\", selectBannerPreset(terminalWidth));\n console.log(colorizeBanner(art));\n console.log(chalk.bold.white(` Easy Coding Harness ${chalk.cyan(`v${VERSION}`)}\\n`));\n}\n\nexport function selectBannerPreset(width: number): BannerPreset {\n if (width >= WIDE_TERMINAL_WIDTH) {\n return { font: \"ANSI Shadow\", horizontalLayout: \"full\" };\n }\n\n if (width >= MEDIUM_TERMINAL_WIDTH) {\n return { font: \"Small Shadow\", horizontalLayout: \"full\" };\n }\n\n return { font: \"Small Slant\" };\n}\n\nexport function colorizeBanner(art: string): string {\n const colors = [chalk.cyanBright, chalk.cyan, chalk.blueBright, chalk.blue];\n return art\n .split(\"\\n\")\n .map((line, index) => colors[index % colors.length](line))\n .join(\"\\n\");\n}\n","import { randomUUID } from \"node:crypto\";\nimport { readFile } from \"node:fs/promises\";\nimport YAML, { isScalar, isSeq, parseDocument } from \"yaml\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport type { SupermoduleConfig } from \"../types/supermodule.js\";\nimport type { UnitTestMode } from \"../types/task.js\";\nimport { writeTextFile } from \"./file-writer.js\";\n\nexport const CONFIG_SCHEMA_VERSION = 6;\nexport const DEFAULT_UT_COVERAGE_THRESHOLD = 90;\nexport const UNIT_TEST_MODES = [\"none\", \"ut\", \"tdd\"] as const;\nexport const APPROVAL_MODES = [\"approve\", \"guard\", \"confirm\", \"auto\"] as const;\nexport const CONFIGURED_WORKFLOW_MODES = [\"adaptive\", \"fast\", \"standard\", \"strict\"] as const;\nexport const CONCRETE_WORKFLOW_MODES = [\"fast\", \"standard\", \"strict\"] as const;\nexport type ApprovalMode = (typeof APPROVAL_MODES)[number];\nexport type ConfiguredWorkflowMode = (typeof CONFIGURED_WORKFLOW_MODES)[number];\nexport type ConcreteWorkflowMode = (typeof CONCRETE_WORKFLOW_MODES)[number];\nexport type LegacyConfirmMode = ApprovalMode | \"lite\";\n\nexport interface EasyCodingConfig {\n version: number;\n harness_version: string;\n agents: AgentPlatform[];\n project: {\n id: string;\n name: string;\n };\n memory: {\n short_term_max: number;\n short_term_keep: number;\n schema_version: number;\n };\n tasks: {\n auto_archive_days: number;\n };\n behavior: {\n approval_mode: ApprovalMode;\n workflow_mode: ConfiguredWorkflowMode;\n unit_test_mode: UnitTestMode;\n ut_coverage_threshold: number;\n };\n supermodule?: SupermoduleConfig;\n [key: string]: unknown;\n}\n\nexport function createDefaultConfig(params: {\n projectName: string;\n harnessVersion: string;\n agents: AgentPlatform[];\n supermodule?: SupermoduleConfig;\n projectId?: string;\n}): EasyCodingConfig {\n const config: EasyCodingConfig = {\n version: CONFIG_SCHEMA_VERSION,\n harness_version: params.harnessVersion,\n agents: params.agents,\n project: {\n id: params.projectId ?? createProjectId(),\n name: params.projectName,\n },\n memory: {\n short_term_max: 10,\n short_term_keep: 5,\n schema_version: 2,\n },\n tasks: {\n auto_archive_days: 30,\n },\n behavior: {\n approval_mode: \"guard\",\n workflow_mode: \"adaptive\",\n unit_test_mode: \"none\",\n ut_coverage_threshold: DEFAULT_UT_COVERAGE_THRESHOLD,\n },\n };\n if (params.supermodule) {\n config.supermodule = params.supermodule;\n }\n return config;\n}\n\nexport function stringifyConfig(config: EasyCodingConfig): string {\n return YAML.stringify(config);\n}\n\nexport async function writeConfigYaml(filePath: string, config: EasyCodingConfig): Promise<void> {\n await writeTextFile(filePath, stringifyConfig(config));\n}\n\nexport async function readConfigYaml(filePath: string): Promise<EasyCodingConfig> {\n const content = await readFile(filePath, \"utf8\");\n return YAML.parse(content) as EasyCodingConfig;\n}\n\nexport async function readProjectIdIfExists(filePath: string): Promise<string | null> {\n try {\n const config = await readConfigYaml(filePath);\n return typeof config.project?.id === \"string\" && config.project.id.trim()\n ? config.project.id\n : null;\n } catch {\n return null;\n }\n}\n\nexport async function updateConfigYaml(\n filePath: string,\n updater: (config: EasyCodingConfig) => void,\n): Promise<EasyCodingConfig> {\n const content = await readFile(filePath, \"utf8\");\n const document = parseDocument(content);\n const config = document.toJSON() as EasyCodingConfig;\n updater(config);\n\n for (const [key, value] of Object.entries(config)) {\n document.set(key, value);\n }\n\n await writeTextFile(filePath, document.toString());\n return config;\n}\n\nexport async function addAgentsToConfig(\n filePath: string,\n agents: AgentPlatform[],\n): Promise<EasyCodingConfig> {\n return updateConfigYaml(filePath, (config) => {\n const merged = new Set([...(config.agents ?? []), ...agents]);\n config.agents = [...merged];\n });\n}\n\nexport async function updateHarnessVersion(\n filePath: string,\n version: string,\n): Promise<EasyCodingConfig> {\n return updateConfigYaml(filePath, (config) => {\n config.harness_version = version;\n });\n}\n\nexport function isApprovalMode(value: unknown): value is ApprovalMode {\n return typeof value === \"string\" && APPROVAL_MODES.includes(value as ApprovalMode);\n}\n\nexport function isConfiguredWorkflowMode(value: unknown): value is ConfiguredWorkflowMode {\n return (\n typeof value === \"string\" && CONFIGURED_WORKFLOW_MODES.includes(value as ConfiguredWorkflowMode)\n );\n}\n\nexport function isUtCoverageThreshold(value: unknown): value is number {\n return Number.isInteger(value) && Number(value) >= 1 && Number(value) <= 100;\n}\n\nexport function isUnitTestMode(value: unknown): value is UnitTestMode {\n return typeof value === \"string\" && UNIT_TEST_MODES.includes(value as UnitTestMode);\n}\n\n/** 只在迁移边界转换旧字段,缺省的 session 值继续继承项目配置。 */\nexport function migrateUnitTestSettings(record: Record<string, unknown>): boolean {\n let changed = false;\n if (\"tdd_enabled\" in record) {\n if (!(\"unit_test_mode\" in record) && typeof record.tdd_enabled === \"boolean\") {\n record.unit_test_mode = record.tdd_enabled ? \"tdd\" : \"none\";\n }\n Reflect.deleteProperty(record, \"tdd_enabled\");\n changed = true;\n }\n if (\"tdd_coverage_threshold\" in record) {\n record.ut_coverage_threshold ??= record.tdd_coverage_threshold;\n Reflect.deleteProperty(record, \"tdd_coverage_threshold\");\n changed = true;\n }\n return changed;\n}\n\nexport function resolveLegacyBehavior(config: EasyCodingConfig): {\n approvalMode: ApprovalMode;\n workflowMode: ConfiguredWorkflowMode;\n unitTestMode: UnitTestMode;\n utCoverageThreshold: number;\n} {\n const behavior = (config.behavior ?? {}) as unknown as Record<string, unknown>;\n const legacyLite = behavior.confirm_mode === \"lite\";\n const approvalMode = isApprovalMode(behavior.approval_mode)\n ? behavior.approval_mode\n : isApprovalMode(behavior.confirm_mode)\n ? behavior.confirm_mode\n : behavior.auto_mode === true\n ? \"auto\"\n : behavior.strict_confirm === true\n ? \"approve\"\n : \"guard\";\n const workflowMode = isConfiguredWorkflowMode(behavior.workflow_mode)\n ? behavior.workflow_mode\n : legacyLite\n ? \"fast\"\n : \"adaptive\";\n const unitTestMode = isUnitTestMode(behavior.unit_test_mode)\n ? behavior.unit_test_mode\n : Number(config.version) >= 4 && behavior.tdd_enabled === true\n ? \"tdd\"\n : \"none\";\n const configuredThreshold =\n behavior.ut_coverage_threshold ??\n (Number(config.version) >= 4 ? behavior.tdd_coverage_threshold : undefined);\n const utCoverageThreshold = isUtCoverageThreshold(configuredThreshold)\n ? configuredThreshold\n : DEFAULT_UT_COVERAGE_THRESHOLD;\n return { approvalMode, workflowMode, unitTestMode, utCoverageThreshold };\n}\n\nexport async function setBehaviorModes(\n filePath: string,\n approvalMode: ApprovalMode,\n workflowMode: ConfiguredWorkflowMode,\n unitTestMode?: UnitTestMode,\n utCoverageThreshold?: number,\n): Promise<EasyCodingConfig> {\n if (unitTestMode !== undefined && !isUnitTestMode(unitTestMode)) {\n throw new Error(\"Unit test mode must be none, ut, or tdd.\");\n }\n if (utCoverageThreshold !== undefined && !isUtCoverageThreshold(utCoverageThreshold)) {\n throw new Error(\"Unit test coverage threshold must be an integer from 1 to 100.\");\n }\n return updateConfigYaml(filePath, (config) => {\n const legacyBehavior = (config.behavior ?? {}) as unknown as Record<string, unknown>;\n const resolvedBehavior = resolveLegacyBehavior(config);\n const behavior = Object.fromEntries(\n Object.entries(legacyBehavior).filter(\n ([key]) =>\n key !== \"strict_confirm\" &&\n key !== \"auto_mode\" &&\n key !== \"confirm_mode\" &&\n key !== \"approval_mode\" &&\n key !== \"workflow_mode\" &&\n key !== \"tdd_enabled\" &&\n key !== \"tdd_coverage_threshold\" &&\n key !== \"unit_test_mode\" &&\n key !== \"ut_coverage_threshold\",\n ),\n );\n behavior.approval_mode = approvalMode;\n behavior.workflow_mode = workflowMode;\n behavior.unit_test_mode = unitTestMode ?? resolvedBehavior.unitTestMode;\n behavior.ut_coverage_threshold = utCoverageThreshold ?? resolvedBehavior.utCoverageThreshold;\n config.behavior = behavior as EasyCodingConfig[\"behavior\"];\n config.version = CONFIG_SCHEMA_VERSION;\n });\n}\n\nexport async function migrateBehaviorConfig(filePath: string): Promise<EasyCodingConfig> {\n const config = await readConfigYaml(filePath);\n const { approvalMode, workflowMode, unitTestMode, utCoverageThreshold } =\n resolveLegacyBehavior(config);\n return setBehaviorModes(filePath, approvalMode, workflowMode, unitTestMode, utCoverageThreshold);\n}\n\n/** @deprecated Use setBehaviorModes. Kept for API compatibility during the 0.9 beta. */\nexport async function setConfirmMode(\n filePath: string,\n mode: LegacyConfirmMode,\n): Promise<EasyCodingConfig> {\n const config = await readConfigYaml(filePath);\n const { workflowMode, unitTestMode, utCoverageThreshold } = resolveLegacyBehavior(config);\n return setBehaviorModes(\n filePath,\n mode === \"lite\" ? \"guard\" : mode,\n mode === \"lite\" ? \"fast\" : workflowMode,\n unitTestMode,\n utCoverageThreshold,\n );\n}\n\n/** @deprecated Use migrateBehaviorConfig. */\nexport const migrateConfirmModeConfig = migrateBehaviorConfig;\n\nexport async function ensureProjectId(filePath: string): Promise<string> {\n let projectId = \"\";\n await updateConfigYaml(filePath, (config) => {\n if (!config.project || typeof config.project !== \"object\") {\n config.project = { id: createProjectId(), name: \"\" };\n }\n if (typeof config.project.id !== \"string\" || !config.project.id.trim()) {\n config.project.id = createProjectId();\n }\n projectId = config.project.id;\n });\n return projectId;\n}\n\nexport async function updateSupermoduleConfig(\n filePath: string,\n supermodule: SupermoduleConfig,\n): Promise<EasyCodingConfig> {\n return updateConfigYaml(filePath, (config) => {\n config.supermodule = supermodule;\n });\n}\n\nexport function yamlHasAgent(documentContent: string, agent: AgentPlatform): boolean {\n const document = parseDocument(documentContent);\n const agents = document.get(\"agents\", true);\n if (!isSeq(agents)) {\n return false;\n }\n return agents.items.some((item) => isScalar(item) && String(item.value) === agent);\n}\n\nexport function createProjectId(): string {\n return `ec-${randomUUID()}`;\n}\n","import { constants } from \"node:fs\";\nimport { access, cp, writeFile as fsWriteFile, mkdir, readFile, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\n\nexport async function pathExists(filePath: string): Promise<boolean> {\n try {\n await access(filePath, constants.F_OK);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function ensureDir(dir: string): Promise<void> {\n await mkdir(dir, { recursive: true });\n}\n\nexport async function writeTextFile(filePath: string, content: string): Promise<void> {\n await ensureDir(path.dirname(filePath));\n await fsWriteFile(filePath, content.endsWith(\"\\n\") ? content : `${content}\\n`, \"utf8\");\n}\n\nexport async function readTextFile(filePath: string): Promise<string> {\n return readFile(filePath, \"utf8\");\n}\n\nexport async function readTextIfExists(filePath: string): Promise<string | null> {\n if (!(await pathExists(filePath))) {\n return null;\n }\n return readTextFile(filePath);\n}\n\nexport async function copyDir(source: string, destination: string): Promise<void> {\n await ensureDir(destination);\n await cp(source, destination, { recursive: true });\n}\n\nexport async function isDirectory(filePath: string): Promise<boolean> {\n try {\n return (await stat(filePath)).isDirectory();\n } catch {\n return false;\n }\n}\n","import path from \"node:path\";\nimport { HOOK_BYTECODE_GITIGNORE_ENTRY, SESSIONS_GITIGNORE_ENTRY } from \"../constants/paths.js\";\nimport { readTextIfExists, writeTextFile } from \"./file-writer.js\";\n\nexport async function ensureGitignoreEntry(\n cwd: string,\n entry: string,\n heading = \"# ═══ easy-coding-harness (auto-generated) ═══\\n# Personal runtime state; do not commit\",\n): Promise<boolean> {\n const gitignorePath = path.join(cwd, \".gitignore\");\n const current = (await readTextIfExists(gitignorePath)) ?? \"\";\n const lines = current.split(/\\r?\\n/).map((line) => line.trim());\n\n if (lines.includes(entry)) {\n return false;\n }\n\n const prefix = current.trimEnd();\n const next = [prefix, heading, entry].filter(Boolean).join(\"\\n\");\n await writeTextFile(gitignorePath, next);\n return true;\n}\n\nexport function gitignoreContains(content: string, entry: string): boolean {\n return content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .includes(entry);\n}\n\nexport async function ensureEasyCodingSessionsIgnored(cwd: string): Promise<boolean> {\n return ensureGitignoreEntry(cwd, SESSIONS_GITIGNORE_ENTRY);\n}\n\n// Hook scripts are a multi-file Python package; running them emits __pycache__/*.pyc\n// next to the committed hooks. C-tier fix (dont_write_bytecode) stops generation at\n// the source; this is the defense-in-depth fallback so stray bytecode never reaches git.\nexport async function ensureHookBytecodeIgnored(cwd: string): Promise<boolean> {\n return ensureGitignoreEntry(\n cwd,\n HOOK_BYTECODE_GITIGNORE_ENTRY,\n \"# ═══ easy-coding-harness (auto-generated) ═══\\n# Python bytecode from hook scripts; do not commit\",\n );\n}\n","export const EASY_CODING_DIR = \".easy-coding\";\nexport const CONFIG_FILE = \"config.yaml\";\nexport const INSTALL_MANIFEST_FILE = \"install-manifest.json\";\n// ec-init owns this file; the CLI never reads or writes it, only preserves it on clear.\nexport const PROJECT_CONFIG_FILE = \"project.yaml\";\nexport const SESSIONS_DIR = \"sessions\";\nexport const TASKS_DIR = \"tasks\";\nexport const PROJECT_INIT_TASK_ID = \"project-init\";\nexport const MEMORY_DIR = \"memory\";\nexport const SPEC_DIR = \"spec\";\nexport const MAIN_SPEC_DIR = \"main\";\nexport const DEV_SPEC_DIR = \"dev\";\n\nexport const TEMPLATES_DIR = \"templates\";\nexport const TOOLS_DIR = \"tools\";\nexport const TDD_DIR = \"tdd\";\nexport const TDD_READINESS_FILE = \"readiness.json\";\n\nexport const SESSIONS_GITIGNORE_ENTRY = \".easy-coding/sessions/\";\nexport const HOOK_BYTECODE_GITIGNORE_ENTRY = \"__pycache__/\";\n\nexport const GENERATED_REGION_START =\n \"<!-- ═══ easy-coding-harness generated (DO NOT EDIT BETWEEN MARKERS) ═══ -->\";\nexport const GENERATED_REGION_END = \"<!-- ═══ end easy-coding-harness generated ═══ -->\";\n","import { createHash } from \"node:crypto\";\nimport { readFile, rmdir, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { EASY_CODING_DIR, INSTALL_MANIFEST_FILE } from \"../constants/paths.js\";\nimport { type AgentPlatform, isAgentPlatform } from \"../types/platform.js\";\nimport { pathExists, readTextIfExists, writeTextFile } from \"./file-writer.js\";\n\nexport type InstallFileKind = \"skill\" | \"hook\" | \"agent\" | \"platform-config\";\n\nexport type InstallArtifact =\n | {\n type: \"file\";\n kind: InstallFileKind;\n filePath: string;\n platform: AgentPlatform;\n }\n | {\n type: \"hook-registration\";\n configPath: string;\n command: string;\n hookPath: string | null;\n platform: AgentPlatform;\n }\n | {\n type: \"constraint-region\";\n filePath: string;\n platform: AgentPlatform;\n };\n\nexport interface InstallManifest {\n schema_version: 1;\n harness_version: string;\n generated_at: string;\n agents: AgentPlatform[];\n files: InstallManifestFile[];\n hook_registrations: InstallManifestHookRegistration[];\n constraint_regions: InstallManifestConstraintRegion[];\n}\n\nexport interface InstallManifestFile {\n path: string;\n kind: InstallFileKind;\n platform: AgentPlatform;\n sha256: string;\n}\n\nexport interface InstallManifestHookRegistration {\n config_path: string;\n command: string;\n hook_path: string | null;\n platform: AgentPlatform;\n}\n\nexport interface InstallManifestConstraintRegion {\n path: string;\n platform: AgentPlatform;\n}\n\nexport interface PrunedInstallFiles {\n removed: string[];\n preserved: string[];\n}\n\nexport function fileArtifact(\n filePath: string,\n kind: InstallFileKind,\n platform: AgentPlatform,\n): InstallArtifact {\n return { type: \"file\", kind, filePath, platform };\n}\n\nexport function constraintRegionArtifact(\n filePath: string,\n platform: AgentPlatform,\n): InstallArtifact {\n return { type: \"constraint-region\", filePath, platform };\n}\n\nexport async function hookRegistrationArtifacts(\n configPath: string,\n platform: AgentPlatform,\n): Promise<InstallArtifact[]> {\n const content = await readTextIfExists(configPath);\n if (content === null) {\n return [];\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(content) as Record<string, unknown>;\n } catch {\n return [];\n }\n\n return collectHookCommands(parsed.hooks).map((command) => ({\n type: \"hook-registration\",\n configPath,\n command,\n hookPath: extractHookPathFromCommand(command),\n platform,\n }));\n}\n\nexport async function writeInstallManifest(\n cwd: string,\n params: {\n harnessVersion: string;\n agents: AgentPlatform[];\n artifacts: InstallArtifact[];\n mode?: \"replace\" | \"merge\";\n },\n): Promise<void> {\n const existing = params.mode === \"merge\" ? await readInstallManifest(cwd) : null;\n const files = new Map<string, InstallManifestFile>();\n const hookRegistrations = new Map<string, InstallManifestHookRegistration>();\n const constraintRegions = new Map<string, InstallManifestConstraintRegion>();\n\n if (existing) {\n for (const file of existing.files) {\n files.set(file.path, file);\n }\n for (const registration of existing.hook_registrations) {\n hookRegistrations.set(\n `${registration.config_path}\\0${normalizeCommand(registration.command)}`,\n registration,\n );\n }\n for (const region of existing.constraint_regions) {\n constraintRegions.set(region.path, region);\n }\n }\n\n for (const artifact of params.artifacts) {\n if (artifact.type === \"file\") {\n if (!(await pathExists(artifact.filePath))) {\n continue;\n }\n const relPath = toProjectPath(cwd, artifact.filePath);\n files.set(relPath, {\n path: relPath,\n kind: artifact.kind,\n platform: artifact.platform,\n sha256: await sha256File(artifact.filePath),\n });\n continue;\n }\n\n if (artifact.type === \"hook-registration\") {\n const configPath = toProjectPath(cwd, artifact.configPath);\n const registration = {\n config_path: configPath,\n command: artifact.command,\n hook_path: artifact.hookPath ? normalizeHookPath(cwd, artifact.hookPath) : null,\n platform: artifact.platform,\n };\n hookRegistrations.set(`${configPath}\\0${normalizeCommand(artifact.command)}`, registration);\n continue;\n }\n\n const relPath = toProjectPath(cwd, artifact.filePath);\n constraintRegions.set(relPath, {\n path: relPath,\n platform: artifact.platform,\n });\n }\n\n const manifest: InstallManifest = {\n schema_version: 1,\n harness_version: params.harnessVersion,\n generated_at: new Date().toISOString(),\n agents: [...new Set([...(existing?.agents ?? []), ...params.agents])],\n files: [...files.values()].sort(byPath),\n hook_registrations: [...hookRegistrations.values()].sort((a, b) =>\n `${a.config_path}\\0${a.command}`.localeCompare(`${b.config_path}\\0${b.command}`),\n ),\n constraint_regions: [...constraintRegions.values()].sort(byPath),\n };\n\n await writeTextFile(\n path.join(cwd, EASY_CODING_DIR, INSTALL_MANIFEST_FILE),\n JSON.stringify(manifest, null, 2),\n );\n}\n\nexport async function readInstallManifest(cwd: string): Promise<InstallManifest | null> {\n const manifestPath = path.join(cwd, EASY_CODING_DIR, INSTALL_MANIFEST_FILE);\n const content = await readTextIfExists(manifestPath);\n if (content === null) {\n return null;\n }\n\n try {\n const parsed = JSON.parse(content) as Partial<InstallManifest>;\n if (\n parsed.schema_version !== 1 ||\n !Array.isArray(parsed.files) ||\n !Array.isArray(parsed.hook_registrations) ||\n !Array.isArray(parsed.constraint_regions)\n ) {\n return null;\n }\n const agents = Array.isArray(parsed.agents)\n ? parsed.agents.filter((agent): agent is AgentPlatform => isAgentPlatform(agent))\n : [];\n return { ...parsed, agents } as InstallManifest;\n } catch {\n return null;\n }\n}\n\nexport async function pruneRetiredManagedFiles(\n cwd: string,\n previous: InstallManifest | null,\n artifacts: InstallArtifact[],\n): Promise<PrunedInstallFiles> {\n if (!previous) {\n return { removed: [], preserved: [] };\n }\n\n const installedPaths = new Set(\n artifacts\n .filter(\n (artifact): artifact is Extract<InstallArtifact, { type: \"file\" }> =>\n artifact.type === \"file\",\n )\n .map((artifact) => toProjectPath(cwd, artifact.filePath)),\n );\n const removed: string[] = [];\n const preserved: string[] = [];\n\n for (const file of previous.files) {\n if (installedPaths.has(file.path)) {\n continue;\n }\n\n const filePath = manifestPath(cwd, file.path);\n if (!(await pathExists(filePath))) {\n continue;\n }\n if (!(await manifestFileMatches(filePath, file.sha256))) {\n preserved.push(file.path);\n continue;\n }\n\n await unlink(filePath);\n removed.push(file.path);\n try {\n await rmdir(path.dirname(filePath));\n } catch (error) {\n if (![\"ENOENT\", \"ENOTEMPTY\"].includes((error as NodeJS.ErrnoException).code ?? \"\")) {\n throw error;\n }\n }\n }\n\n return { removed, preserved };\n}\n\nexport async function manifestFileMatches(filePath: string, sha256: string): Promise<boolean> {\n if (!(await pathExists(filePath))) {\n return false;\n }\n return (await sha256File(filePath)) === sha256;\n}\n\nexport function manifestPath(cwd: string, projectPath: string): string {\n return resolveProjectPath(cwd, projectPath);\n}\n\nexport function toProjectPath(cwd: string, filePath: string): string {\n const root = path.resolve(cwd);\n const resolved = path.resolve(filePath);\n assertPathInsideProject(root, resolved, filePath);\n return path.relative(root, resolved).split(path.sep).join(\"/\");\n}\n\nexport function normalizeCommand(command: string): string {\n return command.replace(/\\\\/g, \"/\").trim().replace(/\\s+/g, \" \");\n}\n\nasync function sha256File(filePath: string): Promise<string> {\n const content = await readFile(filePath);\n return createHash(\"sha256\").update(content).digest(\"hex\");\n}\n\nfunction resolveProjectPath(cwd: string, projectPath: string): string {\n const normalized = projectPath.replace(/\\\\/g, \"/\");\n const parts = normalized.split(\"/\");\n if (\n normalized.trim() === \"\" ||\n path.isAbsolute(projectPath) ||\n path.posix.isAbsolute(normalized) ||\n path.win32.isAbsolute(projectPath) ||\n /^[A-Za-z]:/.test(projectPath) ||\n parts.some((part) => part === \"..\")\n ) {\n throw new Error(`Unsafe install manifest path: ${projectPath}`);\n }\n\n const root = path.resolve(cwd);\n const resolved = path.resolve(root, normalized);\n assertPathInsideProject(root, resolved, projectPath);\n return resolved;\n}\n\nfunction assertPathInsideProject(root: string, resolvedPath: string, sourcePath: string): void {\n const relative = path.relative(root, resolvedPath);\n if (!relative || relative.startsWith(\"..\") || path.isAbsolute(relative)) {\n throw new Error(`Unsafe install manifest path: ${sourcePath}`);\n }\n}\n\nfunction collectHookCommands(hooks: unknown): string[] {\n if (!hooks || typeof hooks !== \"object\" || Array.isArray(hooks)) {\n return [];\n }\n\n const commands: string[] = [];\n for (const value of Object.values(hooks)) {\n if (!Array.isArray(value)) {\n continue;\n }\n for (const group of value) {\n if (!group || typeof group !== \"object\") {\n continue;\n }\n const hookItems = (group as { hooks?: unknown }).hooks;\n if (!Array.isArray(hookItems)) {\n continue;\n }\n for (const hook of hookItems) {\n if (!hook || typeof hook !== \"object\") {\n continue;\n }\n const command = (hook as { command?: unknown }).command;\n if (typeof command === \"string\") {\n commands.push(command);\n }\n }\n }\n }\n return commands;\n}\n\nexport function extractHookPathFromCommand(command: string): string | null {\n return extractQuotedHookPath(command) ?? extractUnquotedHookPath(command);\n}\n\nfunction extractQuotedHookPath(command: string): string | null {\n for (let index = 0; index < command.length; index += 1) {\n const quote = command[index];\n if (quote !== '\"' && quote !== \"'\") {\n continue;\n }\n if (index > 0 && !/\\s/.test(command[index - 1])) {\n continue;\n }\n\n const parsed = parseQuotedToken(command, index, quote);\n if (!parsed) {\n continue;\n }\n\n const suffix = readPathSuffix(command, parsed.endIndex);\n for (const candidate of [parsed.value + suffix, parsed.value]) {\n if (isHookPythonPath(candidate)) {\n return candidate;\n }\n }\n index = parsed.endIndex;\n }\n return null;\n}\n\nfunction parseQuotedToken(\n command: string,\n startIndex: number,\n quote: '\"' | \"'\",\n): { value: string; endIndex: number } | null {\n let value = \"\";\n for (let index = startIndex + 1; index < command.length; index += 1) {\n const char = command[index];\n if (quote === '\"' && char === \"\\\\\" && index + 1 < command.length) {\n value += command[index + 1];\n index += 1;\n continue;\n }\n if (char === quote) {\n return { value, endIndex: index + 1 };\n }\n value += char;\n }\n return null;\n}\n\nfunction readPathSuffix(command: string, startIndex: number): string {\n if (command[startIndex] !== \"/\") {\n return \"\";\n }\n let suffix = \"\";\n for (let index = startIndex; index < command.length; index += 1) {\n const char = command[index];\n if (/\\s/.test(char)) {\n break;\n }\n suffix += char;\n }\n return suffix;\n}\n\nfunction extractUnquotedHookPath(command: string): string | null {\n const match = command.match(/(?:^|\\s)(\\S+\\/hooks\\/\\S+\\.py)(?:\\s|$)/);\n return match?.[1] ?? null;\n}\n\nfunction isHookPythonPath(candidate: string): boolean {\n return /\\/hooks\\/\\S+\\.py$/.test(candidate);\n}\n\nfunction normalizeHookPath(cwd: string, hookPath: string): string {\n const normalized = hookPath.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n if (\n path.isAbsolute(hookPath) ||\n path.posix.isAbsolute(normalized) ||\n path.win32.isAbsolute(hookPath)\n ) {\n return toProjectPath(cwd, hookPath);\n }\n return normalized;\n}\n\nfunction byPath<T extends { path: string }>(a: T, b: T): number {\n return a.path.localeCompare(b.path);\n}\n","export type AgentPlatform = \"claude-code\" | \"codex\" | \"qoder\";\n\nexport interface TemplateContext {\n workflow_agent_id: AgentPlatform;\n sub_agent_dispatch: string;\n platform_spawn_instruction: string;\n skill_trigger: \"/\" | \"$\";\n workflow_state_path: string;\n main_constraint_file: \"CLAUDE.md\" | \"AGENTS.md\";\n python_cmd: string;\n platform_config_dir: string;\n platform_hook_session_start_command?: string;\n platform_hook_inject_workflow_state_command?: string;\n platform_hook_inject_subagent_context_command?: string;\n supermodule_boundary: string;\n}\n\nexport interface PlatformMeta {\n label: string;\n skillsDir: string;\n hooksDir: string;\n hookConfigFile: string;\n agentsDir: string;\n agentFileExt: \".md\" | \".toml\";\n mainConstraint: \"CLAUDE.md\" | \"AGENTS.md\";\n skillTrigger: \"/\" | \"$\";\n hookEvents: string[];\n stateInjectEvent: string[];\n hasSubagentContext: boolean;\n cnVariant?: string;\n templateContext: TemplateContext;\n}\n\nconst pythonCmd = process.platform === \"win32\" ? \"python\" : \"python3\";\n\nexport const PLATFORM_META: Record<AgentPlatform, PlatformMeta> = {\n \"claude-code\": {\n label: \"Claude Code\",\n skillsDir: \".claude/skills\",\n hooksDir: \".claude/hooks\",\n hookConfigFile: \".claude/settings.json\",\n agentsDir: \".claude/agents\",\n agentFileExt: \".md\",\n mainConstraint: \"CLAUDE.md\",\n skillTrigger: \"/\",\n hookEvents: [\"SessionStart\", \"PreToolUse\", \"UserPromptSubmit\", \"Stop\"],\n stateInjectEvent: [\"SessionStart\", \"UserPromptSubmit\"],\n hasSubagentContext: true,\n templateContext: {\n workflow_agent_id: \"claude-code\",\n sub_agent_dispatch: \"Agent tool\",\n platform_spawn_instruction:\n 'Use the Agent tool with run_in_background when useful; use isolation: \"worktree\" for parallel file edits.',\n skill_trigger: \"/\",\n workflow_state_path: \".easy-coding/sessions/\",\n main_constraint_file: \"CLAUDE.md\",\n python_cmd: pythonCmd,\n platform_config_dir: \".claude\",\n supermodule_boundary: \"\",\n },\n },\n codex: {\n label: \"Codex\",\n skillsDir: \".agents/skills\",\n hooksDir: \".codex/hooks\",\n hookConfigFile: \".codex/hooks.json\",\n agentsDir: \".codex/agents\",\n agentFileExt: \".toml\",\n mainConstraint: \"AGENTS.md\",\n skillTrigger: \"$\",\n hookEvents: [\"SessionStart\", \"UserPromptSubmit\"],\n stateInjectEvent: [\"SessionStart\", \"UserPromptSubmit\"],\n hasSubagentContext: false,\n templateContext: {\n workflow_agent_id: \"codex\",\n sub_agent_dispatch: \"Codex sub-agent dispatch\",\n platform_spawn_instruction:\n \"Use Codex sub-agent delegation where available; pass the full task card in the prompt.\",\n skill_trigger: \"$\",\n workflow_state_path: \".easy-coding/sessions/\",\n main_constraint_file: \"AGENTS.md\",\n python_cmd: pythonCmd,\n platform_config_dir: \".codex\",\n supermodule_boundary: \"\",\n },\n },\n qoder: {\n label: \"Qoder\",\n skillsDir: \".qoder/skills\",\n hooksDir: \".qoder/hooks\",\n hookConfigFile: \".qoder/settings.json\",\n agentsDir: \".qoder/agents\",\n agentFileExt: \".md\",\n mainConstraint: \"AGENTS.md\",\n skillTrigger: \"/\",\n hookEvents: [\"UserPromptSubmit\", \"PreToolUse\", \"Stop\"],\n stateInjectEvent: [\"UserPromptSubmit\"],\n hasSubagentContext: true,\n cnVariant: \".qodercn\",\n templateContext: {\n workflow_agent_id: \"qoder\",\n sub_agent_dispatch: \"Agent tool\",\n platform_spawn_instruction:\n \"Use the Agent tool with worktree isolation for parallel file edits.\",\n skill_trigger: \"/\",\n workflow_state_path: \".easy-coding/sessions/\",\n main_constraint_file: \"AGENTS.md\",\n python_cmd: pythonCmd,\n platform_config_dir: \".qoder\",\n supermodule_boundary: \"\",\n },\n },\n};\n\nexport const AGENT_PLATFORMS = Object.keys(PLATFORM_META) as AgentPlatform[];\n\nexport function isAgentPlatform(value: string): value is AgentPlatform {\n return Object.hasOwn(PLATFORM_META, value);\n}\n","import path from \"node:path\";\nimport {\n CONFIG_FILE,\n DEV_SPEC_DIR,\n EASY_CODING_DIR,\n MAIN_SPEC_DIR,\n MEMORY_DIR,\n SESSIONS_DIR,\n SPEC_DIR,\n TEMPLATES_DIR,\n TOOLS_DIR,\n} from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport type { SupermoduleConfig } from \"../types/supermodule.js\";\nimport {\n createDefaultConfig,\n createProjectId,\n ensureProjectId,\n writeConfigYaml,\n} from \"./config-yaml.js\";\nimport {\n ensureDir,\n pathExists,\n readTextFile,\n readTextIfExists,\n writeTextFile,\n} from \"./file-writer.js\";\nimport { isActiveTask, listTasks } from \"./task-json.js\";\nimport { getTemplatePath } from \"./template-paths.js\";\n\nexport async function writeRuntimeScaffold(\n cwd: string,\n agents: AgentPlatform[],\n opts: { supermodule?: SupermoduleConfig; projectId?: string } = {},\n): Promise<string> {\n const easyCodingDir = path.join(cwd, EASY_CODING_DIR);\n await ensureDir(easyCodingDir);\n\n const configPath = path.join(easyCodingDir, CONFIG_FILE);\n let projectId = opts.projectId ?? createProjectId();\n if (!(await pathExists(configPath))) {\n const projectName = path.basename(cwd);\n await writeConfigYaml(\n configPath,\n createDefaultConfig({\n projectName,\n projectId,\n harnessVersion: VERSION,\n agents,\n supermodule: opts.supermodule,\n }),\n );\n } else {\n projectId = await ensureProjectId(configPath);\n }\n\n await ensureDir(path.join(easyCodingDir, \"tasks\"));\n await ensureDir(path.join(easyCodingDir, SESSIONS_DIR));\n await ensureDir(path.join(easyCodingDir, SPEC_DIR, MAIN_SPEC_DIR));\n await ensureDir(path.join(easyCodingDir, SPEC_DIR, DEV_SPEC_DIR));\n await writeMemoryScaffold(easyCodingDir);\n await writeTemplatesScaffold(easyCodingDir);\n await writeToolsScaffold(cwd);\n return projectId;\n}\n\nexport async function runtimeToolUpdates(\n cwd: string,\n): Promise<{ path: string; content: string }[]> {\n const frozen = (await listTasks(cwd)).some(\n ({ task }) =>\n isActiveTask(task) &&\n (task.unit_test_mode === \"ut\" ||\n task.unit_test_mode === \"tdd\" ||\n (task as unknown as Record<string, unknown>).tdd_enabled === true),\n );\n const updates: { path: string; content: string }[] = [];\n for (const file of [\"easy_coding_java_coverage.py\", \"easy_coding_tdd_readiness.py\"]) {\n const target = path.join(cwd, EASY_CODING_DIR, TOOLS_DIR, file);\n const current = await readTextIfExists(target);\n // 活动任务的证据绑定工具内容;任务结束后的 upgrade 再更新,避免全局证据失效。\n if (frozen && current !== null) continue;\n const content = await readTextFile(getTemplatePath(\"runtime\", \"tools\", file));\n if (content !== current) updates.push({ path: target, content });\n }\n return updates;\n}\n\nasync function writeToolsScaffold(cwd: string): Promise<void> {\n const toolsDir = path.join(cwd, EASY_CODING_DIR, TOOLS_DIR);\n await ensureDir(toolsDir);\n for (const update of await runtimeToolUpdates(cwd)) {\n await writeTextFile(update.path, update.content);\n }\n}\n\nasync function writeTemplatesScaffold(easyCodingDir: string): Promise<void> {\n const templatesDir = path.join(easyCodingDir, TEMPLATES_DIR);\n await ensureDir(templatesDir);\n\n const src = getTemplatePath(\"runtime\", \"templates\", \"dev-spec-skeleton.md\");\n const dest = path.join(templatesDir, \"dev-spec-skeleton.md\");\n await writeTextFile(dest, await readTextFile(src));\n}\n\nasync function writeMemoryScaffold(easyCodingDir: string): Promise<void> {\n const memoryDir = path.join(easyCodingDir, MEMORY_DIR);\n await ensureDir(path.join(memoryDir, \"short\"));\n await ensureDir(path.join(memoryDir, \"long\"));\n\n for (const file of [\"MEMORY.md\", \"BUSINESS.md\", \"TECHNICAL.md\"]) {\n const destination = path.join(memoryDir, \"long\", file);\n if (await pathExists(destination)) {\n continue;\n }\n const templatePath = getTemplatePath(\"runtime\", \"memory\", \"long\", file);\n await writeTextFile(destination, await readTextFile(templatePath));\n }\n\n const shortTemplateDest = path.join(memoryDir, \"SHORT_MEMORY_TEMPLATE.md\");\n if (!(await pathExists(shortTemplateDest))) {\n const templatePath = getTemplatePath(\"runtime\", \"memory\", \"SHORT_MEMORY_TEMPLATE.md\");\n await writeTextFile(shortTemplateDest, await readTextFile(templatePath));\n }\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n EASY_CODING_DIR,\n PROJECT_INIT_TASK_ID,\n SESSIONS_DIR,\n TASKS_DIR,\n} from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport type { Stage, TaskJson, TaskStatus, WorkflowAgentIdentity } from \"../types/task.js\";\nimport {\n type ConfiguredWorkflowMode,\n DEFAULT_UT_COVERAGE_THRESHOLD,\n migrateUnitTestSettings,\n readConfigYaml,\n resolveLegacyBehavior,\n} from \"./config-yaml.js\";\nimport { pathExists, readTextFile, writeTextFile } from \"./file-writer.js\";\n\nexport type ProjectInitSource = \"fresh\" | \"legacy-easy-coding\";\n\ntype LegacyStage = \"WAITING_CONFIRM\" | \"MEMORY_SHORT\" | \"MEMORY_LONG\" | \"REVIEW\" | \"VERIFICATION\";\n\nconst LEGACY_STAGE_MAP: Record<LegacyStage, Stage> = {\n WAITING_CONFIRM: \"ANALYSIS\",\n MEMORY_SHORT: \"MEMORY\",\n MEMORY_LONG: \"MEMORY\",\n REVIEW: \"QUALITY\",\n VERIFICATION: \"QUALITY\",\n};\n\nexport interface WorkflowStateMigrationResult {\n tasksUpdated: number;\n sessionsUpdated: number;\n}\n\nexport function createProjectInitTask(params: {\n agents: AgentPlatform[];\n initSource?: ProjectInitSource;\n legacyAssets?: string[];\n legacyMissingHarnessFiles?: string[];\n now?: Date;\n}): TaskJson {\n return {\n type: \"project-init\",\n status: \"PENDING\",\n created_at: (params.now ?? new Date()).toISOString(),\n created_by: \"cli-init\",\n last_agent: \"cli\",\n stage_history: [],\n context: {\n agents_installed: params.agents,\n cli_version: VERSION,\n init_source: params.initSource ?? \"fresh\",\n ...(params.legacyAssets ? { legacy_assets: params.legacyAssets } : {}),\n ...(params.legacyMissingHarnessFiles\n ? { legacy_missing_harness_files: params.legacyMissingHarnessFiles }\n : {}),\n },\n init_log: [],\n };\n}\n\nexport function enterTaskStage(\n task: TaskJson,\n stage: Stage,\n agent: WorkflowAgentIdentity,\n): TaskJson {\n return {\n ...task,\n status: stage,\n last_agent: agent,\n stage_history: [\n ...(task.stage_history ?? []),\n { stage, agent, entered_at: new Date().toISOString() },\n ],\n };\n}\n\nexport function getTaskJsonPath(cwd: string, taskId: string): string {\n return path.join(cwd, EASY_CODING_DIR, TASKS_DIR, taskId, \"task.json\");\n}\n\nexport async function writeTaskJson(filePath: string, task: TaskJson): Promise<void> {\n await writeTextFile(filePath, JSON.stringify(task, null, 2));\n}\n\nexport async function readTaskJson(filePath: string): Promise<TaskJson> {\n return JSON.parse(await readTextFile(filePath)) as TaskJson;\n}\n\nexport async function writeProjectInitTask(\n cwd: string,\n agents: AgentPlatform[],\n options: {\n initSource?: ProjectInitSource;\n legacyAssets?: string[];\n legacyMissingHarnessFiles?: string[];\n } = {},\n): Promise<void> {\n await writeTaskJson(\n getTaskJsonPath(cwd, PROJECT_INIT_TASK_ID),\n createProjectInitTask({\n agents,\n initSource: options.initSource,\n legacyAssets: options.legacyAssets,\n legacyMissingHarnessFiles: options.legacyMissingHarnessFiles,\n }),\n );\n}\n\n// Older harness versions wrote an absolute project_path into the committed init\n// task, leaking each contributor's local checkout root across a shared repo. Strip\n// it on upgrade; idempotent and a no-op when the task or field is absent.\nexport async function stripInitTaskProjectPath(cwd: string): Promise<boolean> {\n const filePath = getTaskJsonPath(cwd, PROJECT_INIT_TASK_ID);\n if (!(await pathExists(filePath))) return false;\n const task = await readTaskJson(filePath);\n if (!task.context || !(\"project_path\" in task.context)) return false;\n // Assign undefined instead of `delete` (biome noDelete); JSON.stringify drops the\n // key on write, so the persisted task.json no longer carries project_path.\n task.context.project_path = undefined;\n await writeTaskJson(filePath, task);\n return true;\n}\n\nfunction isLegacyStage(value: unknown): value is LegacyStage {\n return typeof value === \"string\" && value in LEGACY_STAGE_MAP;\n}\n\nfunction migrateStage(value: unknown): unknown {\n return isLegacyStage(value) ? LEGACY_STAGE_MAP[value] : value;\n}\n\nconst LEGACY_DISPLAY_AGENT_IDENTITIES: Record<string, AgentPlatform> = {\n \"claude with easy coding\": \"claude-code\",\n \"claude-code with easy coding\": \"claude-code\",\n \"claude code with easy coding\": \"claude-code\",\n \"codex with easy coding\": \"codex\",\n \"qoder with easy coding\": \"qoder\",\n};\n\nfunction migratedAgentIdentity(value: unknown): AgentPlatform | undefined {\n if (typeof value !== \"string\") return undefined;\n const normalized = value.trim().toLowerCase();\n if (normalized === \"claude-code\" || normalized === \"codex\" || normalized === \"qoder\") {\n return normalized;\n }\n if (/^\\/?root(?:\\/[a-z0-9._-]+)*$/.test(normalized)) return \"codex\";\n return LEGACY_DISPLAY_AGENT_IDENTITIES[normalized];\n}\n\nfunction migrateAgentFields(record: Record<string, unknown>, fields: string[]): boolean {\n let changed = false;\n for (const field of fields) {\n const migrated = migratedAgentIdentity(record[field]);\n if (migrated && migrated !== record[field]) {\n record[field] = migrated;\n changed = true;\n }\n }\n return changed;\n}\n\ninterface AgentFieldGroup {\n record: Record<string, unknown>;\n fields: string[];\n}\n\nfunction taskAgentFieldGroups(task: Record<string, unknown>): AgentFieldGroup[] {\n const groups: AgentFieldGroup[] = [\n {\n record: task,\n fields: [\"created_by\", \"last_agent\", \"workflow_mode_confirmed_by\", \"tdd_confirmed_by\"],\n },\n ];\n for (const field of [\n \"pending_transition\",\n \"workflow_mode_proposal\",\n \"quality_checkpoint\",\n \"verification_checkpoint\",\n ]) {\n const value = task[field];\n if (!value || typeof value !== \"object\" || Array.isArray(value)) continue;\n const identityField =\n field === \"pending_transition\"\n ? \"requested_by\"\n : field === \"workflow_mode_proposal\"\n ? \"proposed_by\"\n : \"recorded_by\";\n groups.push({ record: value as Record<string, unknown>, fields: [identityField] });\n }\n if (Array.isArray(task.workflow_mode_escalations)) {\n for (const escalation of task.workflow_mode_escalations) {\n if (!escalation || typeof escalation !== \"object\" || Array.isArray(escalation)) continue;\n groups.push({ record: escalation as Record<string, unknown>, fields: [\"raised_by\"] });\n }\n }\n const memoryProgress = task.memory_progress;\n if (memoryProgress && typeof memoryProgress === \"object\" && !Array.isArray(memoryProgress)) {\n const assessment = (memoryProgress as Record<string, unknown>).architecture_assessment;\n if (assessment && typeof assessment === \"object\" && !Array.isArray(assessment)) {\n groups.push({ record: assessment as Record<string, unknown>, fields: [\"recorded_by\"] });\n }\n }\n if (Array.isArray(task.spec_dependency_evidence)) {\n for (const evidence of task.spec_dependency_evidence) {\n if (!evidence || typeof evidence !== \"object\" || Array.isArray(evidence)) continue;\n groups.push({ record: evidence as Record<string, unknown>, fields: [\"satisfied_by\"] });\n }\n }\n if (Array.isArray(task.stage_history)) {\n for (const entry of task.stage_history) {\n if (!entry || typeof entry !== \"object\" || Array.isArray(entry)) continue;\n groups.push({ record: entry as Record<string, unknown>, fields: [\"agent\"] });\n }\n }\n return groups;\n}\n\nfunction migrateTaskAgentIdentities(task: Record<string, unknown>): boolean {\n return taskAgentFieldGroups(task).reduce(\n (changed, group) => migrateAgentFields(group.record, group.fields) || changed,\n false,\n );\n}\n\nfunction hasLegacyTaskAgentIdentities(task: Record<string, unknown>): boolean {\n return taskAgentFieldGroups(task).some(({ record, fields }) =>\n fields.some((field) => {\n const migrated = migratedAgentIdentity(record[field]);\n return migrated !== undefined && migrated !== record[field];\n }),\n );\n}\n\nfunction migrateStageHistory(task: Record<string, unknown>): boolean {\n if (!Array.isArray(task.stage_history)) return false;\n\n let changed = false;\n const migrated: unknown[] = [];\n for (const rawEntry of task.stage_history) {\n if (!rawEntry || typeof rawEntry !== \"object\" || Array.isArray(rawEntry)) {\n migrated.push(rawEntry);\n continue;\n }\n const entry = { ...(rawEntry as Record<string, unknown>) };\n const mappedStage = migrateStage(entry.stage);\n if (mappedStage !== entry.stage) {\n entry.stage = mappedStage;\n changed = true;\n }\n const previous = migrated.at(-1);\n if (\n previous &&\n typeof previous === \"object\" &&\n !Array.isArray(previous) &&\n (previous as Record<string, unknown>).stage === entry.stage\n ) {\n changed = true;\n continue;\n }\n migrated.push(entry);\n }\n\n if (changed) task.stage_history = migrated;\n return changed;\n}\n\nfunction migrateTaskWorkflowState(task: Record<string, unknown>): boolean {\n const legacyStatus = isLegacyStage(task.status) ? task.status : null;\n const legacyRequestedAt = Array.isArray(task.stage_history)\n ? [...task.stage_history]\n .reverse()\n .find(\n (entry) =>\n entry &&\n typeof entry === \"object\" &&\n !Array.isArray(entry) &&\n (entry as Record<string, unknown>).stage === \"WAITING_CONFIRM\",\n )\n : null;\n let changed = migrateTaskAgentIdentities(task);\n changed = migrateStageHistory(task) || changed;\n\n if (legacyStatus) {\n task.status = LEGACY_STAGE_MAP[legacyStatus];\n changed = true;\n }\n\n const pending = task.pending_transition;\n if (pending && typeof pending === \"object\" && !Array.isArray(pending)) {\n const record = pending as Record<string, unknown>;\n const from = migrateStage(record.from);\n const to = migrateStage(record.to);\n if (from === to) {\n task.pending_transition = undefined;\n changed = true;\n } else if (from !== record.from || to !== record.to) {\n task.pending_transition = { ...record, from, to };\n changed = true;\n }\n }\n\n if (\n !task.quality_checkpoint &&\n task.verification_checkpoint &&\n typeof task.verification_checkpoint === \"object\" &&\n !Array.isArray(task.verification_checkpoint)\n ) {\n task.quality_checkpoint = task.verification_checkpoint;\n }\n if (\"verification_checkpoint\" in task) {\n task.verification_checkpoint = undefined;\n changed = true;\n }\n\n if (legacyStatus === \"WAITING_CONFIRM\" && !task.pending_transition) {\n const requestedAt =\n legacyRequestedAt &&\n typeof legacyRequestedAt === \"object\" &&\n !Array.isArray(legacyRequestedAt)\n ? String(\n (legacyRequestedAt as Record<string, unknown>).entered_at ?? new Date().toISOString(),\n )\n : new Date().toISOString();\n task.pending_transition = {\n from: \"ANALYSIS\",\n to: \"IMPLEMENT\",\n requested_at: requestedAt,\n requested_by: migratedAgentIdentity(task.last_agent) ?? \"upgrade-migration\",\n reason: \"migrated-from-WAITING_CONFIRM\",\n };\n changed = true;\n }\n\n if (legacyStatus === \"MEMORY_LONG\") {\n const progress =\n task.memory_progress && typeof task.memory_progress === \"object\"\n ? { ...(task.memory_progress as Record<string, unknown>) }\n : {};\n if (progress.short_memory_written !== true) {\n progress.short_memory_written = true;\n }\n progress.legacy_short_memory_assumed = true;\n progress.updated_at = new Date().toISOString();\n task.memory_progress = progress;\n changed = true;\n }\n\n const status = String(task.status ?? \"\");\n const taskType = String(task.type ?? \"\").toLowerCase();\n let isActive = ![\"\", \"PENDING\", \"COMPLETE\", \"CLOSED\"].includes(status);\n if (isActive && [\"analysis\", \"doc\", \"report\"].includes(taskType)) {\n task.status = \"CLOSED\";\n task.closed_reason = \"legacy-read-only-task-retired\";\n task.pending_transition = undefined;\n task.stage_history = [\n ...(Array.isArray(task.stage_history) ? task.stage_history : []),\n {\n stage: \"CLOSED\",\n agent: \"upgrade-migration\",\n entered_at: new Date().toISOString(),\n },\n ];\n task.last_agent = \"upgrade-migration\";\n isActive = false;\n changed = true;\n }\n if (\n isActive &&\n taskType !== \"project-init\" &&\n ![\"fast\", \"standard\", \"strict\"].includes(String(task.workflow_mode ?? \"\"))\n ) {\n task.workflow_mode = \"standard\";\n task.workflow_mode_confirmed_at = new Date().toISOString();\n task.workflow_mode_confirmed_by = \"upgrade-migration\";\n task.workflow_mode_legacy = true;\n changed = true;\n }\n changed = migrateUnitTestSettings(task) || changed;\n if (isActive && taskType !== \"project-init\" && task.unit_test_mode === undefined) {\n task.unit_test_mode = \"none\";\n task.ut_coverage_threshold ??= DEFAULT_UT_COVERAGE_THRESHOLD;\n task.tdd_confirmed_at = new Date().toISOString();\n task.tdd_confirmed_by = \"upgrade-migration\";\n changed = true;\n }\n\n return changed;\n}\n\nfunction migrateSessionBehavior(session: Record<string, unknown>): boolean {\n let changed = migrateAgentFields(session, [\"agent\", \"last_agent\"]);\n changed = migrateUnitTestSettings(session) || changed;\n const legacyMode = session.confirm_mode;\n const legacyLite = legacyMode === \"lite\";\n if (![\"approve\", \"guard\", \"confirm\", \"auto\"].includes(String(session.approval_mode ?? \"\"))) {\n if (legacyLite) {\n session.approval_mode = \"guard\";\n changed = true;\n } else if ([\"approve\", \"guard\", \"confirm\", \"auto\"].includes(String(legacyMode ?? \"\"))) {\n session.approval_mode = legacyMode;\n changed = true;\n }\n }\n if (![\"adaptive\", \"fast\", \"standard\", \"strict\"].includes(String(session.workflow_mode ?? \"\"))) {\n if (legacyLite) {\n session.workflow_mode = \"fast\";\n session.workflow_mode_legacy_confirm_override = true;\n session.workflow_mode_legacy_alias_override = undefined;\n changed = true;\n } else if ([\"approve\", \"guard\", \"confirm\", \"auto\"].includes(String(legacyMode ?? \"\"))) {\n session.workflow_mode = \"adaptive\";\n session.workflow_mode_legacy_alias_override = true;\n session.workflow_mode_legacy_confirm_override = undefined;\n changed = true;\n }\n }\n if (legacyLite && session.workflow_mode_legacy_alias_override === true) {\n session.workflow_mode_legacy_alias_override = undefined;\n changed = true;\n } else if (\n [\"approve\", \"guard\", \"confirm\", \"auto\"].includes(String(legacyMode ?? \"\")) &&\n session.workflow_mode_legacy_confirm_override === true\n ) {\n session.workflow_mode_legacy_confirm_override = undefined;\n changed = true;\n }\n if (\"confirm_mode\" in session) {\n session.confirm_mode = undefined;\n changed = true;\n }\n return changed;\n}\n\ninterface SessionMigrationCandidate {\n currentTask: string;\n agent?: string;\n lastAgent?: string;\n workflowMode?: ConfiguredWorkflowMode;\n}\n\nconst WORKFLOW_MODE_RANK: Record<Exclude<ConfiguredWorkflowMode, \"adaptive\">, number> = {\n fast: 0,\n standard: 1,\n strict: 2,\n};\n\nfunction sessionMigrationCandidate(\n session: Record<string, unknown>,\n): SessionMigrationCandidate | null {\n if (typeof session.current_task !== \"string\") return null;\n const workflowMode = [\"adaptive\", \"fast\", \"standard\", \"strict\"].includes(\n String(session.workflow_mode ?? \"\"),\n )\n ? (session.workflow_mode as ConfiguredWorkflowMode)\n : undefined;\n return {\n currentTask: session.current_task,\n agent: typeof session.agent === \"string\" ? session.agent : undefined,\n lastAgent: typeof session.last_agent === \"string\" ? session.last_agent : undefined,\n workflowMode,\n };\n}\n\nfunction relevantSessionMigrationCandidates(\n task: Record<string, unknown>,\n candidates: SessionMigrationCandidate[],\n): SessionMigrationCandidate[] {\n const taskAgent = String(task.last_agent ?? \"\");\n const ownerCandidates = candidates.filter(\n (candidate) => candidate.agent === taskAgent || candidate.lastAgent === taskAgent,\n );\n return ownerCandidates.length > 0 ? ownerCandidates : candidates;\n}\n\nfunction migrationWorkflowMode(\n task: Record<string, unknown>,\n candidates: SessionMigrationCandidate[],\n projectWorkflowMode: ConfiguredWorkflowMode,\n): Exclude<ConfiguredWorkflowMode, \"adaptive\"> {\n const taskType = String(task.type ?? \"\").toLowerCase();\n if ([\"analysis\", \"doc\", \"report\"].includes(taskType)) return \"fast\";\n\n const relevantCandidates = relevantSessionMigrationCandidates(task, candidates);\n const fallbackMode = projectWorkflowMode === \"adaptive\" ? \"standard\" : projectWorkflowMode;\n const concreteModes = relevantCandidates.map((candidate) =>\n candidate.workflowMode === \"adaptive\" ? \"standard\" : (candidate.workflowMode ?? fallbackMode),\n );\n if (concreteModes.length === 0) return fallbackMode;\n return concreteModes.reduce((highest, mode) =>\n WORKFLOW_MODE_RANK[mode] > WORKFLOW_MODE_RANK[highest] ? mode : highest,\n );\n}\n\nasync function taskFiles(cwd: string): Promise<string[]> {\n const tasksDir = path.join(cwd, EASY_CODING_DIR, TASKS_DIR);\n if (!(await pathExists(tasksDir))) return [];\n const entries = await readdir(tasksDir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => path.join(tasksDir, entry.name, \"task.json\"));\n}\n\nasync function sessionFiles(cwd: string): Promise<string[]> {\n const sessionsDir = path.join(cwd, EASY_CODING_DIR, SESSIONS_DIR);\n if (!(await pathExists(sessionsDir))) return [];\n const entries = await readdir(sessionsDir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".json\"))\n .map((entry) => path.join(sessionsDir, entry.name));\n}\n\nasync function readJsonRecord(filePath: string): Promise<Record<string, unknown> | null> {\n try {\n const parsed = JSON.parse(await readTextFile(filePath));\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : null;\n } catch {\n return null;\n }\n}\n\nexport async function hasLegacyWorkflowState(cwd: string): Promise<boolean> {\n for (const filePath of await taskFiles(cwd)) {\n if (!(await pathExists(filePath))) continue;\n const task = await readJsonRecord(filePath);\n if (!task) continue;\n if (\n hasLegacyTaskAgentIdentities(task) ||\n isLegacyStage(task.status) ||\n \"verification_checkpoint\" in task ||\n \"tdd_enabled\" in task ||\n \"tdd_coverage_threshold\" in task ||\n (![\"PENDING\", \"COMPLETE\", \"CLOSED\"].includes(String(task.status ?? \"\")) &&\n [\"analysis\", \"doc\", \"report\"].includes(String(task.type ?? \"\").toLowerCase())) ||\n (![\"PENDING\", \"COMPLETE\", \"CLOSED\"].includes(String(task.status ?? \"\")) &&\n String(task.type ?? \"\") !== \"project-init\" &&\n ![\"fast\", \"standard\", \"strict\"].includes(String(task.workflow_mode ?? \"\"))) ||\n (Array.isArray(task.stage_history) &&\n task.stage_history.some(\n (entry) =>\n entry &&\n typeof entry === \"object\" &&\n !Array.isArray(entry) &&\n isLegacyStage((entry as Record<string, unknown>).stage),\n ))\n ) {\n return true;\n }\n }\n\n for (const filePath of await sessionFiles(cwd)) {\n const session = await readJsonRecord(filePath);\n if (!session) continue;\n if (\n [\"agent\", \"last_agent\"].some((field) => {\n const migrated = migratedAgentIdentity(session[field]);\n return migrated !== undefined && migrated !== session[field];\n }) ||\n isLegacyStage(session.last_seen_stage) ||\n \"confirm_mode\" in session ||\n \"tdd_enabled\" in session ||\n \"tdd_coverage_threshold\" in session\n ) {\n return true;\n }\n }\n return false;\n}\n\nexport async function migrateLegacyWorkflowState(\n cwd: string,\n): Promise<WorkflowStateMigrationResult> {\n let tasksUpdated = 0;\n let sessionsUpdated = 0;\n const updatedTaskPaths = new Set<string>();\n let projectWorkflowMode: ConfiguredWorkflowMode = \"adaptive\";\n const configPath = path.join(cwd, EASY_CODING_DIR, \"config.yaml\");\n if (await pathExists(configPath)) {\n try {\n const config = await readConfigYaml(configPath);\n projectWorkflowMode = resolveLegacyBehavior(config).workflowMode;\n } catch {\n // Keep the conservative adaptive fallback; config migration reports malformed YAML.\n }\n }\n\n for (const filePath of await taskFiles(cwd)) {\n if (!(await pathExists(filePath))) continue;\n const task = await readJsonRecord(filePath);\n if (!task) continue;\n if (!migrateTaskWorkflowState(task)) continue;\n await writeTextFile(filePath, JSON.stringify(task, null, 2));\n tasksUpdated += 1;\n updatedTaskPaths.add(filePath);\n }\n\n const sessionCandidates: SessionMigrationCandidate[] = [];\n for (const filePath of await sessionFiles(cwd)) {\n const session = await readJsonRecord(filePath);\n if (!session) continue;\n const mappedStage = migrateStage(session.last_seen_stage);\n let changed = false;\n if (mappedStage !== session.last_seen_stage) {\n session.last_seen_stage = mappedStage;\n changed = true;\n }\n changed = migrateSessionBehavior(session) || changed;\n if (typeof session.current_task === \"string\") {\n const task = await readJsonRecord(getTaskJsonPath(cwd, session.current_task));\n if (task && [\"COMPLETE\", \"CLOSED\"].includes(String(task.status ?? \"\"))) {\n session.current_task = null;\n session.last_seen_task = null;\n session.last_seen_stage = \"idle\";\n changed = true;\n }\n }\n const candidate = sessionMigrationCandidate(session);\n if (candidate) sessionCandidates.push(candidate);\n if (changed) {\n await writeTextFile(filePath, JSON.stringify(session, null, 2));\n sessionsUpdated += 1;\n }\n }\n\n const candidatesByTask = new Map<string, SessionMigrationCandidate[]>();\n for (const candidate of sessionCandidates) {\n const candidates = candidatesByTask.get(candidate.currentTask) ?? [];\n candidates.push(candidate);\n candidatesByTask.set(candidate.currentTask, candidates);\n }\n for (const filePath of await taskFiles(cwd)) {\n const task = await readJsonRecord(filePath);\n if (!task) continue;\n const migrationOwned =\n task.workflow_mode_legacy === true && task.workflow_mode_confirmed_by === \"upgrade-migration\";\n if (!migrationOwned) continue;\n const taskId = path.basename(path.dirname(filePath));\n const mode = migrationWorkflowMode(\n task,\n candidatesByTask.get(taskId) ?? [],\n projectWorkflowMode,\n );\n let changed = false;\n if (task.workflow_mode !== mode) {\n task.workflow_mode = mode;\n task.workflow_mode_confirmed_at = new Date().toISOString();\n changed = true;\n }\n if (\"workflow_mode_legacy_direct_edge\" in task) {\n task.workflow_mode_legacy_direct_edge = undefined;\n changed = true;\n }\n if (changed) {\n await writeTextFile(filePath, JSON.stringify(task, null, 2));\n if (!updatedTaskPaths.has(filePath)) {\n tasksUpdated += 1;\n updatedTaskPaths.add(filePath);\n }\n }\n }\n\n return { tasksUpdated, sessionsUpdated };\n}\n\nexport async function setPendingInitSince(cwd: string, version: string): Promise<void> {\n const filePath = getTaskJsonPath(cwd, PROJECT_INIT_TASK_ID);\n if (!(await pathExists(filePath))) return;\n const task = await readTaskJson(filePath);\n if (task.status !== \"COMPLETE\") return;\n task.pending_init_since = version;\n await writeTaskJson(filePath, task);\n}\n\nexport interface TaskSummary {\n id: string;\n task: TaskJson;\n}\n\nexport async function listTasks(cwd: string): Promise<TaskSummary[]> {\n const tasksDir = path.join(cwd, EASY_CODING_DIR, TASKS_DIR);\n if (!(await pathExists(tasksDir))) {\n return [];\n }\n\n const entries = await readdir(tasksDir, { withFileTypes: true });\n const tasks: TaskSummary[] = [];\n\n for (const entry of entries.sort((left, right) => left.name.localeCompare(right.name))) {\n if (!entry.isDirectory()) {\n continue;\n }\n\n const taskPath = getTaskJsonPath(cwd, entry.name);\n if (!(await pathExists(taskPath))) {\n continue;\n }\n\n tasks.push({ id: entry.name, task: await readTaskJson(taskPath) });\n }\n\n return tasks;\n}\n\nexport function summarizeTaskStatuses(tasks: TaskSummary[]): Record<TaskStatus, number> {\n return tasks.reduce(\n (summary, item) => {\n summary[item.task.status] = (summary[item.task.status] ?? 0) + 1;\n return summary;\n },\n {} as Record<TaskStatus, number>,\n );\n}\n\nexport function isActiveTask(task: TaskJson): boolean {\n return task.status !== \"COMPLETE\" && task.status !== \"CLOSED\";\n}\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function getTemplateRoot(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, \"../templates\"),\n path.resolve(here, \"../../templates\"),\n path.resolve(process.cwd(), \"src/templates\"),\n path.resolve(process.cwd(), \"templates\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Unable to locate templates directory. Tried: ${candidates.join(\", \")}`);\n }\n return found;\n}\n\nexport function getTemplatePath(...segments: string[]): string {\n return path.join(getTemplateRoot(), ...segments);\n}\n","import path from \"node:path\";\nimport { CONFIGURATORS } from \"../configurators/index.js\";\nimport { writeMainConstraint } from \"../configurators/shared.js\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport type {\n InstallContext,\n SupermoduleBoundary,\n SupermoduleConfig,\n} from \"../types/supermodule.js\";\nimport { createProjectId, updateSupermoduleConfig } from \"../utils/config-yaml.js\";\nimport { ensureEasyCodingSessionsIgnored, ensureHookBytecodeIgnored } from \"../utils/gitignore.js\";\nimport { type InstallArtifact, writeInstallManifest } from \"../utils/install-manifest.js\";\nimport { writeRuntimeScaffold } from \"../utils/runtime-scaffold.js\";\nimport { writeProjectInitTask } from \"../utils/task-json.js\";\n\nexport async function configurePlatformsForDir(\n targetDir: string,\n platforms: AgentPlatform[],\n opts: { supermodule?: SupermoduleBoundary; projectId?: string } = {},\n): Promise<InstallArtifact[]> {\n const artifacts: InstallArtifact[] = [];\n\n for (const platform of platforms) {\n artifacts.push(...(await CONFIGURATORS[platform](targetDir, opts)));\n }\n\n return artifacts;\n}\n\nexport async function installHarnessToDir(\n targetDir: string,\n platforms: AgentPlatform[],\n ctx: InstallContext,\n): Promise<InstallArtifact[]> {\n const projectId = createProjectId();\n const artifacts = await configurePlatformsForDir(targetDir, platforms, {\n supermodule: boundaryFromContext(ctx),\n projectId,\n });\n await writeRuntimeScaffold(targetDir, platforms, {\n supermodule: supermoduleConfigFromContext(ctx),\n projectId,\n });\n await writeInstallManifest(targetDir, {\n harnessVersion: VERSION,\n agents: platforms,\n artifacts,\n });\n await writeProjectInitTask(targetDir, platforms, {\n initSource: ctx.initSource,\n legacyAssets: ctx.legacyAssets,\n legacyMissingHarnessFiles: ctx.legacyMissingHarnessFiles,\n });\n await ensureEasyCodingSessionsIgnored(targetDir);\n await ensureHookBytecodeIgnored(targetDir);\n\n return artifacts;\n}\n\nexport function supermoduleConfigFromContext(ctx: InstallContext): SupermoduleConfig {\n if (ctx.role === \"super-parent\") {\n return {\n role: \"super-parent\",\n submodules: ctx.submodulePaths ?? [],\n };\n }\n\n if (ctx.role === \"submodule-child\") {\n return {\n role: \"submodule-child\",\n parent: ctx.parent,\n };\n }\n\n return { role: \"standalone\" };\n}\n\nexport async function refreshSupermoduleParent(\n targetDir: string,\n platforms: AgentPlatform[],\n submodulePaths: string[],\n): Promise<void> {\n const supermodule: SupermoduleConfig = {\n role: \"super-parent\",\n submodules: submodulePaths,\n };\n await updateSupermoduleConfig(path.join(targetDir, EASY_CODING_DIR, CONFIG_FILE), supermodule);\n\n for (const platform of platforms) {\n await writeMainConstraint(targetDir, platform, {\n supermodule: { submodulePaths },\n });\n }\n}\n\nfunction boundaryFromContext(ctx: InstallContext): SupermoduleBoundary | undefined {\n if (ctx.role !== \"super-parent\") {\n return undefined;\n }\n return { submodulePaths: ctx.submodulePaths ?? [] };\n}\n","import path from \"node:path\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport {\n type InstallArtifact,\n constraintRegionArtifact,\n fileArtifact,\n hookRegistrationArtifacts,\n} from \"../utils/install-manifest.js\";\nimport type { ConfigureOptions } from \"./index.js\";\nimport {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\n withProjectInstallPaths,\n writeMainConstraint,\n writeSharedHooks,\n writeSkills,\n} from \"./shared.js\";\n\nexport async function configureClaude(\n cwd: string,\n opts: ConfigureOptions = {},\n): Promise<InstallArtifact[]> {\n const platform = \"claude-code\";\n const meta = PLATFORM_META[platform];\n const ctx = await withProjectInstallPaths(cwd, meta.templateContext, opts.projectId);\n const dest = path.join(cwd, \".claude\");\n const hookConfigPath = path.join(cwd, meta.hookConfigFile);\n const artifacts: InstallArtifact[] = [];\n\n const platformFiles = await copyPlatformTemplates(\"claude\", dest, [\"hooks\"], ctx);\n artifacts.push(\n ...platformFiles\n .filter((filePath) => filePath !== hookConfigPath)\n .map((filePath) =>\n fileArtifact(\n filePath,\n filePath.startsWith(path.join(cwd, meta.agentsDir)) ? \"agent\" : \"platform-config\",\n platform,\n ),\n ),\n );\n artifacts.push(...(await hookRegistrationArtifacts(hookConfigPath, platform)));\n artifacts.push(\n ...(await writeSharedHooks(path.join(dest, \"hooks\"), platform)).map((filePath) =>\n fileArtifact(filePath, \"hook\", platform),\n ),\n );\n artifacts.push(\n ...(\n await writeSkills(\n path.join(cwd, meta.skillsDir),\n await resolveSkills(ctx),\n await resolveBundledSkills(ctx),\n )\n ).map((filePath) => fileArtifact(filePath, \"skill\", platform)),\n );\n artifacts.push(\n constraintRegionArtifact(await writeMainConstraint(cwd, platform, opts), platform),\n );\n\n return artifacts;\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n CONFIG_FILE,\n EASY_CODING_DIR,\n GENERATED_REGION_END,\n GENERATED_REGION_START,\n} from \"../constants/paths.js\";\nimport type { AgentPlatform, TemplateContext } from \"../types/platform.js\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport type { SupermoduleBoundary } from \"../types/supermodule.js\";\nimport { readProjectIdIfExists } from \"../utils/config-yaml.js\";\nimport {\n ensureDir,\n isDirectory,\n pathExists,\n readTextFile,\n readTextIfExists,\n writeTextFile,\n} from \"../utils/file-writer.js\";\nimport { extractMarkedRegion, replaceMarkedRegion } from \"../utils/marked-region.js\";\nimport { getTemplatePath } from \"../utils/template-paths.js\";\n\nexport interface SkillTemplate {\n name: string;\n content: string;\n}\n\nexport interface BundledSkillTemplate {\n name: string;\n sourceDir: string;\n context: TemplateContext;\n}\n\nexport interface SharedHookOptions {\n skipSubagentContext?: boolean;\n}\n\nexport class UnresolvedPlaceholderError extends Error {\n constructor(contentName: string, placeholders: string[]) {\n super(`Unresolved placeholders in ${contentName}: ${placeholders.join(\", \")}`);\n this.name = \"UnresolvedPlaceholderError\";\n }\n}\n\nexport function resolvePlaceholders(\n content: string,\n ctx: TemplateContext,\n contentName = \"template\",\n): string {\n const withPython = content.replace(/\\{\\{PYTHON_CMD\\}\\}/g, ctx.python_cmd);\n const resolved = withPython.replace(/\\{\\{(\\w+)\\}\\}/g, (match, key: keyof TemplateContext) => {\n const value = ctx[key];\n return value === undefined ? match : String(value);\n });\n\n const unresolved = [...resolved.matchAll(/\\{\\{[^}]+\\}\\}/g)].map((match) => match[0]);\n if (unresolved.length > 0) {\n throw new UnresolvedPlaceholderError(contentName, unresolved);\n }\n\n return resolved;\n}\n\nexport async function withProjectInstallPaths(\n cwd: string,\n ctx: TemplateContext,\n projectId?: string,\n): Promise<TemplateContext> {\n const resolvedProjectId =\n projectId ?? (await readProjectIdIfExists(path.join(cwd, EASY_CODING_DIR, CONFIG_FILE)));\n return withInstallPaths(cwd, ctx, resolvedProjectId ?? undefined);\n}\n\nexport function withInstallPaths(\n cwd: string,\n ctx: TemplateContext,\n projectId?: string,\n): TemplateContext {\n return {\n ...ctx,\n platform_hook_session_start_command: jsonStringContent(\n renderHookCommand(cwd, ctx, \"session-start.py\", process.platform, projectId),\n ),\n platform_hook_inject_workflow_state_command: jsonStringContent(\n renderHookCommand(cwd, ctx, \"inject-workflow-state.py\", process.platform, projectId),\n ),\n platform_hook_inject_subagent_context_command: jsonStringContent(\n renderHookCommand(cwd, ctx, \"inject-subagent-context.py\", process.platform, projectId),\n ),\n };\n}\n\nexport function renderHookCommand(\n _cwd: string,\n ctx: TemplateContext,\n scriptName: string,\n platform: NodeJS.Platform = process.platform,\n projectId?: string,\n): string {\n const launcher = `import base64;exec(base64.b64decode('${Buffer.from(HOOK_LAUNCHER_PYTHON).toString(\"base64\")}').decode())`;\n const rootIdArg = projectId ? ` ${shellDoubleQuoteArg(projectId, platform)}` : \"\";\n return `${ctx.python_cmd} -c ${shellDoubleQuoteArg(launcher, platform)}${rootIdArg} ${ctx.platform_config_dir}/hooks/${scriptName}`;\n}\n\nexport function shellDoubleQuoteArg(\n value: string,\n platform: NodeJS.Platform = process.platform,\n): string {\n if (platform === \"win32\") {\n if (value.includes('\"')) {\n throw new Error(\"Windows hook paths cannot contain double quotes.\");\n }\n return `\"${value}\"`;\n }\n return `\"${value.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`;\n}\n\nfunction jsonStringContent(value: string): string {\n return JSON.stringify(value).slice(1, -1);\n}\n\n// Keep hook dirs commit-clean: the launcher imports the shared hook modules, so\n// disable __pycache__/*.pyc generation before any import runs. Without this the\n// bytecode lands next to the committed hook scripts and pollutes shared repos.\nconst HOOK_LAUNCHER_PYTHON = [\n \"import io,json,os,re,runpy,sys\",\n \"sys.dont_write_bytecode=True\",\n \"from pathlib import Path\",\n \"payload=sys.stdin.read()\",\n \"try:\",\n \" data=json.loads(payload or '{}')\",\n \"except Exception:\",\n \" data={}\",\n \"expected_id=sys.argv[1] if len(sys.argv) > 2 else None\",\n \"script_arg=sys.argv[2] if len(sys.argv) > 2 else (sys.argv[1] if len(sys.argv) > 1 else None)\",\n \"def project_id(root):\",\n \" try:\",\n \" lines=(root / '.easy-coding' / 'config.yaml').read_text(encoding='utf-8').splitlines()\",\n \" except Exception:\",\n \" return None\",\n \" in_project=False\",\n \" for line in lines:\",\n \" if not in_project:\",\n \" if re.match(r'^project\\\\s*:\\\\s*(?:#.*)?$', line):\",\n \" in_project=True\",\n \" continue\",\n \" if not line.strip() or line.lstrip().startswith('#'):\",\n \" continue\",\n \" if not line.startswith((' ', '\\\\t')):\",\n \" return None\",\n ' match=re.match(r\"\\\\s+id\\\\s*:\\\\s*[\\'\\\\\"]?([^\\'\\\\\"#\\\\s]+)\", line)',\n \" if match:\",\n \" return match.group(1)\",\n \" return None\",\n \"def roots_from(raw):\",\n \" if not raw:\",\n \" return []\",\n \" start=Path(raw).resolve()\",\n \" return [candidate for candidate in (start, *start.parents) if (candidate / '.easy-coding').is_dir()]\",\n \"sources=[os.environ.get('CLAUDE_PROJECT_DIR'), os.environ.get('QODER_PROJECT_DIR'), data.get('cwd'), os.getcwd()]\",\n \"root=None\",\n \"if expected_id:\",\n \" root=next((candidate for raw in sources for candidate in roots_from(raw) if project_id(candidate) == expected_id), None)\",\n \"else:\",\n \" root=next((candidate for raw in sources for candidate in roots_from(raw)), None)\",\n \"target=(root / script_arg) if root and script_arg else None\",\n \"if target and target.is_file():\",\n \" os.chdir(root)\",\n \" data['cwd']=str(root)\",\n \" sys.stdin=io.StringIO(json.dumps(data))\",\n \" sys.path.insert(0, str(target.parent))\",\n \" runpy.run_path(str(target), run_name='__main__')\",\n].join(\"\\n\");\n\nexport async function resolveSkills(ctx: TemplateContext): Promise<SkillTemplate[]> {\n const skillsRoot = getTemplatePath(\"common\", \"skills\");\n const entries = await readdir(skillsRoot);\n const skills: SkillTemplate[] = [];\n\n for (const entry of entries.sort()) {\n const skillDir = path.join(skillsRoot, entry);\n if (!(await isDirectory(skillDir))) {\n continue;\n }\n const content = await readTextFile(path.join(skillDir, \"SKILL.md\"));\n skills.push({\n name: entry,\n content: resolvePlaceholders(content, ctx, `common/skills/${entry}/SKILL.md`),\n });\n }\n\n return skills;\n}\n\nexport async function resolveBundledSkills(ctx: TemplateContext): Promise<BundledSkillTemplate[]> {\n const bundledRoot = getTemplatePath(\"common\", \"bundled-skills\");\n if (!(await pathExists(bundledRoot))) {\n return [];\n }\n\n const entries = await readdir(bundledRoot);\n const bundled: BundledSkillTemplate[] = [];\n for (const entry of entries.sort()) {\n const sourceDir = path.join(bundledRoot, entry);\n if (await isDirectory(sourceDir)) {\n bundled.push({ name: entry, sourceDir, context: ctx });\n }\n }\n return bundled;\n}\n\nexport async function writeSkills(\n dir: string,\n skills: SkillTemplate[],\n bundled: BundledSkillTemplate[],\n): Promise<string[]> {\n await ensureDir(dir);\n const written: string[] = [];\n\n for (const skill of skills) {\n const destination = path.join(dir, skill.name, \"SKILL.md\");\n await writeTextFile(destination, skill.content);\n written.push(destination);\n }\n\n for (const skill of bundled) {\n written.push(\n ...(await copyTemplateDirectory(skill.sourceDir, path.join(dir, skill.name), skill.context)),\n );\n }\n\n return written;\n}\n\nexport async function writeSharedHooks(\n dir: string,\n platform: AgentPlatform,\n opts: SharedHookOptions = {},\n): Promise<string[]> {\n const hooksRoot = getTemplatePath(\"shared-hooks\");\n const ctx = PLATFORM_META[platform].templateContext;\n const entries = await readdir(hooksRoot);\n await ensureDir(dir);\n const written: string[] = [];\n\n for (const entry of entries.sort()) {\n if (opts.skipSubagentContext && entry === \"inject-subagent-context.py\") {\n continue;\n }\n const sourcePath = path.join(hooksRoot, entry);\n if ((await stat(sourcePath)).isDirectory()) {\n continue;\n }\n const content = resolvePlaceholders(\n await readTextFile(sourcePath),\n ctx,\n `shared-hooks/${entry}`,\n );\n const destination = path.join(dir, entry);\n await writeTextFile(destination, content);\n await import(\"node:fs/promises\").then(({ chmod }) => chmod(destination, 0o755));\n written.push(destination);\n }\n\n return written;\n}\n\nexport async function copyPlatformTemplates(\n platformTemplateDir: string,\n destination: string,\n skipDirs: string[],\n ctx: TemplateContext,\n): Promise<string[]> {\n const source = getTemplatePath(platformTemplateDir);\n return copyTemplateDirectory(source, destination, ctx, new Set(skipDirs));\n}\n\nexport async function writeMainConstraint(\n cwd: string,\n platform: AgentPlatform,\n opts: { supermodule?: SupermoduleBoundary } = {},\n): Promise<string> {\n const meta = PLATFORM_META[platform];\n const ctx: TemplateContext = {\n ...meta.templateContext,\n supermodule_boundary: renderSupermoduleBoundary(opts.supermodule),\n };\n const templateName = `${meta.mainConstraint}.tpl`;\n const template = await readTextFile(getTemplatePath(\"main-constraint\", templateName));\n const generated = resolvePlaceholders(template, ctx, `main-constraint/${templateName}`);\n\n if (!generated.includes(GENERATED_REGION_START) || !generated.includes(GENERATED_REGION_END)) {\n throw new Error(`Main constraint template ${templateName} does not contain generated markers.`);\n }\n\n const destination = path.join(cwd, meta.mainConstraint);\n const current = await readTextIfExists(destination);\n if (current) {\n const markerContent = extractMarkedRegion(generated);\n if (!markerContent) {\n throw new Error(`Main constraint template ${templateName} generated content lacks markers.`);\n }\n await writeTextFile(destination, replaceMarkedRegion(current, markerContent));\n } else {\n await writeTextFile(destination, generated);\n }\n return destination;\n}\n\nfunction renderSupermoduleBoundary(boundary?: SupermoduleBoundary): string {\n if (!boundary || boundary.submodulePaths.length === 0) {\n return \"\";\n }\n\n const submodules = boundary.submodulePaths.map((submodulePath) => `- \\`${submodulePath}\\``);\n return [\n \"\",\n \"## Supermodule Boundary\",\n \"\",\n \"This directory is a git supermodule root. The following subdirectories are independent\",\n \"submodule harness roots with their own git boundaries and Easy Coding runtime:\",\n \"\",\n ...submodules,\n \"\",\n \"- Cross-repo work launched from this root uses the parent `.easy-coding` task, session, state, and spec as the source of truth.\",\n \"- Child `.easy-coding` directories are not parent workflow state sources.\",\n \"- During memory archive, technical memory that belongs to a child repo is written only to that child's `.easy-coding/memory`; do not write child task/session/state files from the parent.\",\n \"- Commit submodule changes in two steps: push each child repo first, then commit and push the parent gitlink update.\",\n \"- Parent memory should keep cross-repo context; child technical details should follow the owning child repo.\",\n \"\",\n ].join(\"\\n\");\n}\n\nasync function copyTemplateDirectory(\n source: string,\n destination: string,\n ctx: TemplateContext,\n skipDirs = new Set<string>(),\n): Promise<string[]> {\n await ensureDir(destination);\n const written: string[] = [];\n\n for (const entry of (await readdir(source)).sort()) {\n if (skipDirs.has(entry) || shouldSkipTemplateEntry(entry)) {\n continue;\n }\n\n const sourcePath = path.join(source, entry);\n const destinationPath = path.join(destination, stripTemplateExtension(entry));\n const sourceStat = await stat(sourcePath);\n\n if (sourceStat.isDirectory()) {\n written.push(...(await copyTemplateDirectory(sourcePath, destinationPath, ctx, skipDirs)));\n continue;\n }\n\n const content = resolvePlaceholders(await readTextFile(sourcePath), ctx, sourcePath);\n await writeTextFile(destinationPath, content);\n written.push(destinationPath);\n }\n\n return written;\n}\n\nfunction shouldSkipTemplateEntry(entry: string): boolean {\n return (\n entry === \".DS_Store\" ||\n entry === \"__pycache__\" ||\n entry.endsWith(\".ts\") ||\n entry.endsWith(\".js\") ||\n entry.endsWith(\".map\")\n );\n}\n\nfunction stripTemplateExtension(fileName: string): string {\n return fileName.endsWith(\".tpl\") ? fileName.slice(0, -4) : fileName;\n}\n","import { GENERATED_REGION_END, GENERATED_REGION_START } from \"../constants/paths.js\";\n\nexport class MarkedRegionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"MarkedRegionError\";\n }\n}\n\nexport function extractMarkedRegion(content: string): string | null {\n const start = content.indexOf(GENERATED_REGION_START);\n const end = content.indexOf(GENERATED_REGION_END);\n\n if (start === -1 && end === -1) {\n return null;\n }\n if (start === -1 || end === -1 || end < start) {\n throw new MarkedRegionError(\"Generated region markers are incomplete or out of order.\");\n }\n\n return content.slice(start, end + GENERATED_REGION_END.length);\n}\n\nexport function replaceMarkedRegion(existing: string, generatedRegion: string): string {\n const currentRegion = extractMarkedRegion(existing);\n if (!currentRegion) {\n return `${generatedRegion.trim()}\\n\\n${existing.trimStart()}`.trimEnd();\n }\n return existing.replace(currentRegion, generatedRegion.trim());\n}\n\nexport function hasMarkedRegion(content: string): boolean {\n return extractMarkedRegion(content) !== null;\n}\n\n// Strips the generated region (and its markers) while keeping the user's surrounding content.\n// Returns \"\" when nothing but the region remained, so callers can keep an empty shell file.\nexport function removeMarkedRegion(content: string): string {\n const region = extractMarkedRegion(content);\n if (!region) {\n return content;\n }\n const remaining = content\n .replace(region, \"\")\n .replace(/\\n{3,}/g, \"\\n\\n\")\n .trim();\n return remaining ? `${remaining}\\n` : \"\";\n}\n","import path from \"node:path\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport {\n type InstallArtifact,\n constraintRegionArtifact,\n fileArtifact,\n hookRegistrationArtifacts,\n} from \"../utils/install-manifest.js\";\nimport type { ConfigureOptions } from \"./index.js\";\nimport {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\n withProjectInstallPaths,\n writeMainConstraint,\n writeSharedHooks,\n writeSkills,\n} from \"./shared.js\";\n\nexport async function configureCodex(\n cwd: string,\n opts: ConfigureOptions = {},\n): Promise<InstallArtifact[]> {\n const platform = \"codex\";\n const meta = PLATFORM_META[platform];\n const ctx = await withProjectInstallPaths(cwd, meta.templateContext, opts.projectId);\n const hookConfigPath = path.join(cwd, meta.hookConfigFile);\n const artifacts: InstallArtifact[] = [];\n\n artifacts.push(\n ...(\n await writeSkills(\n path.join(cwd, meta.skillsDir),\n await resolveSkills(ctx),\n await resolveBundledSkills(ctx),\n )\n ).map((filePath) => fileArtifact(filePath, \"skill\", platform)),\n );\n artifacts.push(\n ...(\n await writeSharedHooks(path.join(cwd, meta.hooksDir), platform, {\n skipSubagentContext: true,\n })\n ).map((filePath) => fileArtifact(filePath, \"hook\", platform)),\n );\n\n const platformFiles = await copyPlatformTemplates(\n \"codex\",\n path.join(cwd, \".codex\"),\n [\"hooks\"],\n ctx,\n );\n artifacts.push(\n ...platformFiles\n .filter((filePath) => filePath !== hookConfigPath)\n .map((filePath) =>\n fileArtifact(\n filePath,\n filePath.startsWith(path.join(cwd, meta.agentsDir)) ? \"agent\" : \"platform-config\",\n platform,\n ),\n ),\n );\n artifacts.push(...(await hookRegistrationArtifacts(hookConfigPath, platform)));\n artifacts.push(\n constraintRegionArtifact(await writeMainConstraint(cwd, platform, opts), platform),\n );\n\n return artifacts;\n}\n","import type { Dirent } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport {\n type InstallArtifact,\n constraintRegionArtifact,\n fileArtifact,\n hookRegistrationArtifacts,\n} from \"../utils/install-manifest.js\";\nimport { resolvePlatformMeta } from \"../utils/platform-paths.js\";\nimport type { ConfigureOptions } from \"./index.js\";\nimport {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\n withProjectInstallPaths,\n writeMainConstraint,\n writeSharedHooks,\n writeSkills,\n} from \"./shared.js\";\n\nasync function claudeHarnessSkillsExist(cwd: string): Promise<boolean> {\n return pathExists(path.join(cwd, \".claude\", \"skills\", \"ec-workflow\", \"SKILL.md\"));\n}\n\nasync function listFilesRecursive(dir: string): Promise<string[]> {\n let entries: Dirent[];\n try {\n entries = await readdir(dir, { withFileTypes: true });\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n\n const files: string[] = [];\n for (const entry of entries.sort((a, b) => a.name.localeCompare(b.name))) {\n const entryPath = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await listFilesRecursive(entryPath)));\n continue;\n }\n if (entry.isFile()) {\n files.push(entryPath);\n }\n }\n return files;\n}\n\nasync function existingManagedSkillArtifacts(\n skillsDir: string,\n skillNames: string[],\n platform: \"qoder\",\n): Promise<InstallArtifact[]> {\n const artifacts: InstallArtifact[] = [];\n for (const skillName of skillNames) {\n for (const filePath of await listFilesRecursive(path.join(skillsDir, skillName))) {\n artifacts.push(fileArtifact(filePath, \"skill\", platform));\n }\n }\n return artifacts;\n}\n\nexport async function configureQoder(\n cwd: string,\n opts: ConfigureOptions = {},\n): Promise<InstallArtifact[]> {\n const platform = \"qoder\";\n const meta = resolvePlatformMeta(cwd, platform);\n const ctx = await withProjectInstallPaths(cwd, meta.templateContext, opts.projectId);\n const dest = path.join(cwd, ctx.platform_config_dir);\n const hookConfigPath = path.join(cwd, meta.hookConfigFile);\n const artifacts: InstallArtifact[] = [];\n\n const platformFiles = await copyPlatformTemplates(\"qoder\", dest, [\"hooks\"], ctx);\n artifacts.push(\n ...platformFiles\n .filter((filePath) => filePath !== hookConfigPath)\n .map((filePath) =>\n fileArtifact(\n filePath,\n filePath.startsWith(path.join(cwd, meta.agentsDir)) ? \"agent\" : \"platform-config\",\n platform,\n ),\n ),\n );\n artifacts.push(...(await hookRegistrationArtifacts(hookConfigPath, platform)));\n artifacts.push(\n ...(await writeSharedHooks(path.join(dest, \"hooks\"), platform)).map((filePath) =>\n fileArtifact(filePath, \"hook\", platform),\n ),\n );\n\n // Qoder scans both .qoder/skills/ and .claude/skills/ at runtime.\n // Skip writing to .qoder/skills/ when Claude Code skills already exist to avoid duplicates.\n const skills = await resolveSkills(ctx);\n const bundledSkills = await resolveBundledSkills(ctx);\n if (!(await claudeHarnessSkillsExist(cwd))) {\n artifacts.push(\n ...(await writeSkills(path.join(dest, \"skills\"), skills, bundledSkills)).map((filePath) =>\n fileArtifact(filePath, \"skill\", platform),\n ),\n );\n } else {\n artifacts.push(\n ...(await existingManagedSkillArtifacts(\n path.join(dest, \"skills\"),\n [...skills.map((skill) => skill.name), ...bundledSkills.map((skill) => skill.name)],\n platform,\n )),\n );\n }\n\n artifacts.push(\n constraintRegionArtifact(await writeMainConstraint(cwd, platform, opts), platform),\n );\n\n return artifacts;\n}\nexport { detectQoderCnVariant } from \"../utils/platform-paths.js\";\n","import { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { type AgentPlatform, PLATFORM_META, type PlatformMeta } from \"../types/platform.js\";\n\nexport function detectQoderCnVariant(cwd: string): boolean {\n if (process.env.EC_QODER_VARIANT === \"cn\" || process.env.QODER_VARIANT === \"cn\") {\n return true;\n }\n return existsSync(path.join(cwd, PLATFORM_META.qoder.cnVariant ?? \".qodercn\"));\n}\n\nexport function resolvePlatformMeta(cwd: string, platform: AgentPlatform): PlatformMeta {\n const meta = PLATFORM_META[platform];\n if (platform !== \"qoder\" || !detectQoderCnVariant(cwd)) {\n return meta;\n }\n\n return resolveQoderMetaForBaseDir(meta.cnVariant ?? \".qodercn\");\n}\n\nexport function resolveQoderVariantMetas(): PlatformMeta[] {\n const standardDir = PLATFORM_META.qoder.templateContext.platform_config_dir;\n const cnDir = PLATFORM_META.qoder.cnVariant ?? \".qodercn\";\n return [...new Set([standardDir, cnDir])].map(resolveQoderMetaForBaseDir);\n}\n\nfunction resolveQoderMetaForBaseDir(baseDir: string): PlatformMeta {\n const meta = PLATFORM_META.qoder;\n return {\n ...meta,\n skillsDir: `${baseDir}/skills`,\n hooksDir: `${baseDir}/hooks`,\n hookConfigFile: `${baseDir}/settings.json`,\n agentsDir: `${baseDir}/agents`,\n templateContext: {\n ...meta.templateContext,\n platform_config_dir: baseDir,\n },\n };\n}\n","import type { AgentPlatform } from \"../types/platform.js\";\nimport type { SupermoduleBoundary } from \"../types/supermodule.js\";\nimport type { InstallArtifact } from \"../utils/install-manifest.js\";\nimport { configureClaude } from \"./claude.js\";\nimport { configureCodex } from \"./codex.js\";\nimport { configureQoder } from \"./qoder.js\";\n\nexport interface ConfigureOptions {\n supermodule?: SupermoduleBoundary;\n projectId?: string;\n}\n\nexport type ConfigureFn = (cwd: string, opts?: ConfigureOptions) => Promise<InstallArtifact[]>;\n\nexport const CONFIGURATORS: Record<AgentPlatform, ConfigureFn> = {\n \"claude-code\": configureClaude,\n codex: configureCodex,\n qoder: configureQoder,\n};\n","import { cancel, confirm, multiselect } from \"@clack/prompts\";\nimport {\n AGENT_PLATFORMS,\n type AgentPlatform,\n PLATFORM_META,\n isAgentPlatform,\n} from \"../types/platform.js\";\nimport type { SubmoduleEntry } from \"../types/supermodule.js\";\n\nexport interface PlatformOptions {\n agent?: string;\n yes?: boolean;\n submodules?: string | false;\n}\n\nexport function parseAgentList(agentList: string): AgentPlatform[] {\n const values = agentList\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n\n if (values.length === 0) {\n throw new Error(\"No agent platform specified.\");\n }\n\n const invalid = values.filter((value) => !isAgentPlatform(value));\n if (invalid.length > 0) {\n throw new Error(`Unknown agent platform: ${invalid.join(\", \")}`);\n }\n\n return [...new Set(values)] as AgentPlatform[];\n}\n\nexport async function resolvePlatforms(\n opts: PlatformOptions,\n defaults: AgentPlatform[] = [\"claude-code\"],\n): Promise<AgentPlatform[]> {\n if (opts.agent) {\n return parseAgentList(opts.agent);\n }\n\n if (opts.yes) {\n return defaults;\n }\n\n let selectedDefaults = defaults;\n\n while (true) {\n const result = await multiselect({\n message: \"Select agent platforms (Space to toggle, Enter to review)\",\n options: AGENT_PLATFORMS.map((platform) => ({\n label: PLATFORM_META[platform].label,\n value: platform,\n })),\n initialValues: selectedDefaults,\n required: true,\n });\n\n if (typeof result === \"symbol\") {\n cancel(\"Platform selection cancelled.\");\n process.exit(1);\n }\n\n const labels = result.map((platform) => PLATFORM_META[platform].label).join(\", \");\n const shouldInstall = await confirm({\n message: `Install Easy Coding for: ${labels}?`,\n initialValue: true,\n });\n\n if (typeof shouldInstall === \"symbol\") {\n cancel(\"Platform selection cancelled.\");\n process.exit(1);\n }\n\n if (shouldInstall) {\n return result;\n }\n\n selectedDefaults = result;\n }\n}\n\nexport function parseSubmoduleList(\n submoduleList: string,\n available: SubmoduleEntry[],\n): SubmoduleEntry[] {\n const requested = submoduleList\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n\n if (requested.length === 0) {\n throw new Error(\"No submodule specified.\");\n }\n\n const byPathOrName = new Map<string, SubmoduleEntry>();\n for (const submodule of available) {\n byPathOrName.set(submodule.path, submodule);\n byPathOrName.set(submodule.name, submodule);\n }\n\n const selected: SubmoduleEntry[] = [];\n const invalid: string[] = [];\n for (const value of requested) {\n const submodule = byPathOrName.get(value);\n if (!submodule) {\n invalid.push(value);\n continue;\n }\n if (!selected.some((item) => item.path === submodule.path)) {\n selected.push(submodule);\n }\n }\n\n if (invalid.length > 0) {\n throw new Error(`Unknown or unavailable submodule: ${invalid.join(\", \")}`);\n }\n\n return selected.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nexport async function resolveSubmodules(\n opts: PlatformOptions,\n available: SubmoduleEntry[],\n defaultSelection: SubmoduleEntry[] = available,\n): Promise<SubmoduleEntry[]> {\n if (opts.submodules === false) {\n return [];\n }\n\n if (typeof opts.submodules === \"string\") {\n return parseSubmoduleList(opts.submodules, available);\n }\n\n if (available.length === 0) {\n return [];\n }\n\n if (opts.yes) {\n return defaultSelection;\n }\n\n const result = await multiselect({\n message: \"Select checked-out submodules to initialize (Space to toggle, Enter to confirm)\",\n options: available.map((submodule) => ({\n label: `${submodule.path} (${submodule.name})`,\n value: submodule.path,\n })),\n initialValues: defaultSelection.map((submodule) => submodule.path),\n required: false,\n });\n\n if (typeof result === \"symbol\") {\n cancel(\"Submodule selection cancelled.\");\n process.exit(1);\n }\n\n const selected = new Set(result);\n return available.filter((submodule) => selected.has(submodule.path));\n}\n","import path from \"node:path\";\nimport { cancel, multiselect } from \"@clack/prompts\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport type {\n SubmoduleEntry,\n SupermoduleBoundary,\n SupermoduleConfig,\n} from \"../types/supermodule.js\";\nimport { readConfigYaml } from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { listInstallableSubmodules, parseGitmodules } from \"../utils/gitmodules.js\";\nimport { type PlatformOptions, resolveSubmodules } from \"./platforms.js\";\n\nexport interface CommandTarget {\n dir: string;\n label: string;\n configPath: string;\n supermodule: SupermoduleConfig;\n boundary?: SupermoduleBoundary;\n}\n\nexport interface InitSubmoduleSelection {\n installable: SubmoduleEntry[];\n installed: SubmoduleEntry[];\n selected: SubmoduleEntry[];\n parentSubmodulePaths: string[];\n}\n\nexport function rejectSubmoduleListWithoutGitmodules(\n opts: Pick<PlatformOptions, \"submodules\">,\n): void {\n if (typeof opts.submodules === \"string\") {\n throw new Error(\"--submodules can only be used in a repository with .gitmodules.\");\n }\n}\n\nexport async function resolveAddAgentTargets(\n cwd: string,\n opts: PlatformOptions,\n): Promise<CommandTarget[]> {\n const installedSubmodules = await listInstalledSubmodules(cwd);\n if ((await parseGitmodules(cwd)).length === 0) {\n rejectSubmoduleListWithoutGitmodules(opts);\n return [standaloneTarget(cwd)];\n }\n\n const selected = await resolveSubmodules(opts, installedSubmodules);\n const parentManagedSubmodulePaths = await listParentManagedSubmodulePaths(cwd);\n const parentSubmodulePaths = [\n ...new Set([...parentManagedSubmodulePaths, ...selected.map((entry) => entry.path)]),\n ].sort();\n return [\n parentTargetFromPaths(cwd, parentSubmodulePaths),\n ...selected.map((entry) => childTarget(cwd, entry)),\n ];\n}\n\nexport async function resolveUpgradeTargets(cwd: string): Promise<CommandTarget[]> {\n const installedSubmodules = await listInstalledSubmodules(cwd);\n if ((await parseGitmodules(cwd)).length === 0) {\n return [standaloneTarget(cwd)];\n }\n\n return [\n parentTarget(cwd, installedSubmodules),\n ...installedSubmodules.map((entry) => childTarget(cwd, entry)),\n ];\n}\n\nexport async function resolveInitSubmoduleSelection(\n cwd: string,\n opts: PlatformOptions,\n): Promise<InitSubmoduleSelection> {\n const installable = await listInstallableSubmodules(cwd);\n const installed = await listInstalledSubmodules(cwd);\n const parentManagedSubmodulePaths = await listParentManagedSubmodulePaths(cwd);\n const defaultSelection = installable;\n const selected = await resolveSubmodules(opts, installable, defaultSelection);\n const parentSubmodulePaths = [\n ...new Set([...parentManagedSubmodulePaths, ...selected.map((entry) => entry.path)]),\n ].sort();\n\n return { installable, installed, selected, parentSubmodulePaths };\n}\n\nexport async function resolveClearTargets(\n cwd: string,\n opts: { yes?: boolean; submodules?: string | false },\n): Promise<CommandTarget[]> {\n if ((await parseGitmodules(cwd)).length === 0) {\n rejectSubmoduleListWithoutGitmodules(opts);\n return [standaloneTarget(cwd)];\n }\n\n const installedSubmodules = await listInstalledSubmodules(cwd);\n const parent = (await pathExists(path.join(cwd, EASY_CODING_DIR)))\n ? parentTarget(cwd, installedSubmodules)\n : null;\n const children = installedSubmodules.map((entry) => childTarget(cwd, entry));\n\n if (opts.submodules === false) {\n return parent ? [parent] : [];\n }\n\n if (typeof opts.submodules === \"string\") {\n return [\n ...(parent ? [parent] : []),\n ...parseSubmoduleSelection(opts.submodules, installedSubmodules).map((entry) =>\n childTarget(cwd, entry),\n ),\n ];\n }\n\n if (opts.yes) {\n return parent ? [parent] : [];\n }\n\n const candidates = [...(parent ? [parent] : []), ...children];\n if (candidates.length === 0) {\n return [];\n }\n\n const result = await multiselect({\n message: \"Select Easy Coding harness targets to clear\",\n options: candidates.map((target) => ({\n label: target.label === \".\" ? \"parent repository\" : `submodule: ${target.label}`,\n value: target.label,\n })),\n initialValues: parent ? [parent.label] : [],\n required: true,\n });\n\n if (typeof result === \"symbol\") {\n cancel(\"Clear target selection cancelled.\");\n process.exit(1);\n }\n\n const selected = new Set(result);\n return candidates.filter((target) => selected.has(target.label));\n}\n\nasync function listInstalledSubmodules(cwd: string): Promise<SubmoduleEntry[]> {\n const entries = await listInstallableSubmodules(cwd);\n const installed: SubmoduleEntry[] = [];\n\n for (const entry of entries) {\n if (await pathExists(configPath(path.join(cwd, entry.path)))) {\n installed.push(entry);\n }\n }\n\n return installed;\n}\n\nasync function listParentManagedSubmodulePaths(cwd: string): Promise<string[]> {\n const parentConfigPath = configPath(cwd);\n if (!(await pathExists(parentConfigPath))) {\n return [];\n }\n\n try {\n const config = await readConfigYaml(parentConfigPath);\n if (\n config.supermodule?.role !== \"super-parent\" ||\n !Array.isArray(config.supermodule.submodules)\n ) {\n return [];\n }\n return config.supermodule.submodules\n .filter((submodulePath): submodulePath is string => typeof submodulePath === \"string\")\n .sort();\n } catch {\n return [];\n }\n}\n\nfunction standaloneTarget(cwd: string): CommandTarget {\n return {\n dir: cwd,\n label: \".\",\n configPath: configPath(cwd),\n supermodule: { role: \"standalone\" },\n };\n}\n\nfunction parentTarget(cwd: string, installedSubmodules: SubmoduleEntry[]): CommandTarget {\n const submodulePaths = installedSubmodules.map((entry) => entry.path);\n return parentTargetFromPaths(cwd, submodulePaths);\n}\n\nfunction parentTargetFromPaths(cwd: string, submodulePaths: string[]): CommandTarget {\n return {\n dir: cwd,\n label: \".\",\n configPath: configPath(cwd),\n supermodule: { role: \"super-parent\", submodules: submodulePaths },\n boundary: { submodulePaths },\n };\n}\n\nfunction childTarget(cwd: string, entry: SubmoduleEntry): CommandTarget {\n const dir = path.join(cwd, entry.path);\n return {\n dir,\n label: entry.path,\n configPath: configPath(dir),\n supermodule: { role: \"submodule-child\", parent: toPosixRelative(dir, cwd) },\n };\n}\n\nfunction parseSubmoduleSelection(\n submoduleList: string,\n available: SubmoduleEntry[],\n): SubmoduleEntry[] {\n const requested = submoduleList\n .split(\",\")\n .map((value) => value.trim())\n .filter(Boolean);\n\n if (requested.length === 0) {\n throw new Error(\"No submodule specified.\");\n }\n\n const byPathOrName = new Map<string, SubmoduleEntry>();\n for (const submodule of available) {\n byPathOrName.set(submodule.path, submodule);\n byPathOrName.set(submodule.name, submodule);\n }\n\n const selected: SubmoduleEntry[] = [];\n const invalid: string[] = [];\n for (const value of requested) {\n const submodule = byPathOrName.get(value);\n if (!submodule) {\n invalid.push(value);\n continue;\n }\n if (!selected.some((item) => item.path === submodule.path)) {\n selected.push(submodule);\n }\n }\n\n if (invalid.length > 0) {\n throw new Error(`Unknown or unavailable initialized submodule: ${invalid.join(\", \")}`);\n }\n\n return selected.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nfunction configPath(cwd: string): string {\n return path.join(cwd, EASY_CODING_DIR, CONFIG_FILE);\n}\n\nfunction toPosixRelative(from: string, to: string): string {\n const relative = path.relative(from, to);\n return relative ? relative.split(path.sep).join(\"/\") : \".\";\n}\n","import { lstat, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { SubmoduleEntry } from \"../types/supermodule.js\";\nimport { readTextIfExists } from \"./file-writer.js\";\n\nexport async function parseGitmodules(rootDir: string): Promise<SubmoduleEntry[]> {\n const content = await readTextIfExists(path.join(rootDir, \".gitmodules\"));\n if (content === null) {\n return [];\n }\n\n const entries: SubmoduleEntry[] = [];\n let current: Partial<SubmoduleEntry> | null = null;\n\n const flushCurrent = () => {\n if (current?.name && current.path) {\n entries.push({\n name: current.name,\n path: current.path,\n url: current.url ?? \"\",\n });\n }\n };\n\n for (const rawLine of content.split(/\\r?\\n/)) {\n const line = stripGitConfigInlineComment(rawLine).trim();\n if (!line || line.startsWith(\"#\") || line.startsWith(\";\")) {\n continue;\n }\n\n const section = line.match(/^\\[submodule\\s+\"(.+)\"\\]$/i);\n if (section) {\n flushCurrent();\n current = { name: section[1] };\n continue;\n }\n\n if (!current) {\n continue;\n }\n\n const keyValue = line.match(/^([A-Za-z0-9_.-]+)\\s*=\\s*(.*)$/);\n if (!keyValue) {\n continue;\n }\n\n const key = keyValue[1].toLowerCase();\n const value = unquote(keyValue[2].trim());\n if (key === \"path\") {\n current.path = normalizeSubmodulePath(value);\n continue;\n }\n if (key === \"url\") {\n current.url = value;\n }\n }\n\n flushCurrent();\n return entries.sort((a, b) => a.path.localeCompare(b.path));\n}\n\nexport async function listInstallableSubmodules(rootDir: string): Promise<SubmoduleEntry[]> {\n const entries = await parseGitmodules(rootDir);\n const installable: SubmoduleEntry[] = [];\n\n for (const entry of entries) {\n if (await isSubmoduleWorktree(rootDir, entry.path)) {\n installable.push(entry);\n }\n }\n\n return installable;\n}\n\nfunction normalizeSubmodulePath(value: string): string {\n const normalized = value\n .replace(/\\\\/g, \"/\")\n .replace(/^\\.\\/+/, \"\")\n .trim();\n const parts = normalized.split(\"/\").filter(Boolean);\n\n // .gitmodules is repository-controlled input; reject paths that would escape the parent root.\n if (\n normalized === \"\" ||\n path.posix.isAbsolute(normalized) ||\n path.win32.isAbsolute(value) ||\n parts.some((part) => part === \"..\")\n ) {\n throw new Error(`Unsafe submodule path in .gitmodules: ${value}`);\n }\n\n return parts.join(\"/\");\n}\n\nfunction unquote(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n}\n\nfunction stripGitConfigInlineComment(value: string): string {\n let inQuotes = false;\n let escaped = false;\n\n for (let index = 0; index < value.length; index += 1) {\n const char = value[index];\n if (escaped) {\n escaped = false;\n continue;\n }\n if (inQuotes && char === \"\\\\\") {\n escaped = true;\n continue;\n }\n if (char === '\"') {\n inQuotes = !inQuotes;\n continue;\n }\n if (!inQuotes && (char === \"#\" || char === \";\") && isCommentStart(value, index)) {\n return value.slice(0, index);\n }\n }\n\n return value;\n}\n\nfunction isCommentStart(value: string, index: number): boolean {\n return index === 0 || /\\s/.test(value[index - 1]);\n}\n\nasync function isSubmoduleWorktree(rootDir: string, submodulePath: string): Promise<boolean> {\n const dir = path.join(rootDir, submodulePath);\n try {\n if (!(await pathHasNoSymlinkSegments(rootDir, submodulePath))) {\n return false;\n }\n\n const rootRealPath = await realpath(rootDir);\n const dirRealPath = await realpath(dir);\n if (!isInsideDirectory(rootRealPath, dirRealPath)) {\n return false;\n }\n\n const dirStat = await lstat(dir);\n if (!dirStat.isDirectory()) {\n return false;\n }\n\n const gitMarkerStat = await lstat(path.join(dir, \".git\"));\n return (\n !gitMarkerStat.isSymbolicLink() && (gitMarkerStat.isFile() || gitMarkerStat.isDirectory())\n );\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return false;\n }\n throw error;\n }\n}\n\nasync function pathHasNoSymlinkSegments(rootDir: string, submodulePath: string): Promise<boolean> {\n let current = rootDir;\n for (const part of submodulePath.split(\"/\")) {\n current = path.join(current, part);\n const partStat = await lstat(current);\n if (partStat.isSymbolicLink()) {\n return false;\n }\n }\n return true;\n}\n\nfunction isInsideDirectory(parent: string, child: string): boolean {\n const relative = path.relative(parent, child);\n return Boolean(relative) && !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n","import { readdir, rm, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { cancel, confirm, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport {\n CONFIG_FILE,\n EASY_CODING_DIR,\n INSTALL_MANIFEST_FILE,\n SESSIONS_DIR,\n TEMPLATES_DIR,\n TOOLS_DIR,\n} from \"../constants/paths.js\";\nimport {\n AGENT_PLATFORMS,\n type AgentPlatform,\n PLATFORM_META,\n type PlatformMeta,\n isAgentPlatform,\n} from \"../types/platform.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { readConfigYaml } from \"../utils/config-yaml.js\";\nimport { pathExists, readTextIfExists } from \"../utils/file-writer.js\";\nimport {\n type InstallManifest,\n manifestFileMatches,\n manifestPath,\n normalizeCommand,\n readInstallManifest,\n} from \"../utils/install-manifest.js\";\nimport { removeMarkedRegion } from \"../utils/marked-region.js\";\nimport { resolvePlatformMeta, resolveQoderVariantMetas } from \"../utils/platform-paths.js\";\nimport { getTemplatePath } from \"../utils/template-paths.js\";\nimport { refreshSupermoduleParent } from \"./install-harness.js\";\nimport {\n type CommandTarget,\n resolveClearTargets,\n resolveUpgradeTargets,\n} from \"./supermodule-targets.js\";\n\nexport interface ClearOptions {\n dryRun?: boolean;\n yes?: boolean;\n submodules?: string | false;\n}\n\ninterface ClearPlan {\n remove: string[];\n removeFiles: ManifestFileRemoval[];\n skippedModified: string[];\n pruneHookConfigs: HookConfigPrune[];\n constraints: string[];\n emptyDirs: string[];\n}\n\ninterface ManifestFileRemoval {\n filePath: string;\n expectedSha256: string;\n}\n\ninterface HookConfigPrune {\n filePath: string;\n managedHookPaths: string[];\n managedHookCommands: string[];\n}\n\ninterface MutableClearPlan {\n remove: Set<string>;\n removeFiles: ManifestFileRemoval[];\n skippedModified: string[];\n pruneHookConfigs: Map<string, Set<string>>;\n pruneHookCommands: Map<string, Set<string>>;\n constraints: Set<string>;\n emptyDirs: Set<string>;\n}\n\ninterface TargetClearPlan {\n target: CommandTarget;\n agents: AgentPlatform[];\n plan: ClearPlan;\n}\n\nconst PLATFORM_TEMPLATE_DIR: Record<AgentPlatform, string> = {\n \"claude-code\": \"claude\",\n codex: \"codex\",\n qoder: \"qoder\",\n};\n\nexport async function clear(opts: ClearOptions): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\n const targets = await resolveClearTargets(cwd, opts);\n const targetPlans = await buildTargetClearPlans(targets);\n if (targetPlans.length === 0) {\n throw new Error(\"No .easy-coding directory found in this project — nothing to clear.\");\n }\n\n console.log(renderTargetPlans(targetPlans));\n\n if (opts.dryRun) {\n return;\n }\n\n if (!opts.yes) {\n const ok = await confirm({\n message: \"Remove these harness files? Tasks, spec, memory, and knowledge files are kept.\",\n initialValue: false,\n });\n if (typeof ok === \"symbol\" || !ok) {\n cancel(\"Clear cancelled.\");\n return;\n }\n }\n\n for (const targetPlan of targetPlans) {\n await executeClearPlan(targetPlan.plan);\n }\n await refreshParentAfterChildClear(cwd, targetPlans);\n outro(chalk.green(\"Easy Coding harness removed. Run easy-coding init to reinstall.\"));\n}\n\nasync function buildTargetClearPlans(targets: CommandTarget[]): Promise<TargetClearPlan[]> {\n const plans: TargetClearPlan[] = [];\n for (const target of targets) {\n const easyCodingDir = path.join(target.dir, EASY_CODING_DIR);\n if (!(await pathExists(easyCodingDir))) {\n continue;\n }\n const agents = await resolveInstalledAgents(target.dir);\n plans.push({\n target,\n agents,\n plan: await buildClearPlan(target.dir, agents),\n });\n }\n return plans;\n}\n\nasync function refreshParentAfterChildClear(\n cwd: string,\n targetPlans: TargetClearPlan[],\n): Promise<void> {\n if (targetPlans.some((targetPlan) => targetPlan.target.label === \".\")) {\n return;\n }\n if (!(await pathExists(path.join(cwd, EASY_CODING_DIR, CONFIG_FILE)))) {\n return;\n }\n\n const [parent] = await resolveUpgradeTargets(cwd);\n if (!parent || parent.label !== \".\") {\n return;\n }\n const config = await readConfigYaml(parent.configPath);\n if (!Array.isArray(config.agents) || config.agents.length === 0) {\n return;\n }\n await refreshSupermoduleParent(cwd, config.agents, parent.supermodule.submodules ?? []);\n}\n\nasync function resolveInstalledAgents(cwd: string): Promise<AgentPlatform[]> {\n const configPath = path.join(cwd, EASY_CODING_DIR, CONFIG_FILE);\n if (await pathExists(configPath)) {\n try {\n const config = await readConfigYaml(configPath);\n const listed = Array.isArray(config.agents) ? config.agents.filter(isAgentPlatform) : [];\n if (listed.length > 0) {\n return listed;\n }\n } catch {\n // unreadable or legacy config — fall back to on-disk detection\n }\n }\n\n const detected: AgentPlatform[] = [];\n for (const platform of AGENT_PLATFORMS) {\n if (await hasPlatformInstall(cwd, platform)) {\n detected.push(platform);\n }\n }\n return detected;\n}\n\nasync function hasPlatformInstall(cwd: string, platform: AgentPlatform): Promise<boolean> {\n const metas =\n platform === \"qoder\" ? resolveQoderVariantMetas() : [resolvePlatformMeta(cwd, platform)];\n for (const meta of metas) {\n if (await hasInstallMarkers(cwd, meta)) {\n return true;\n }\n }\n return false;\n}\n\nasync function hasInstallMarkers(cwd: string, meta: PlatformMeta): Promise<boolean> {\n const markers = [meta.skillsDir, meta.hooksDir, meta.agentsDir, meta.hookConfigFile];\n for (const marker of markers) {\n if (await pathExists(path.join(cwd, marker))) {\n return true;\n }\n }\n return false;\n}\n\nasync function resolveClearPlatformMetas(\n cwd: string,\n platform: AgentPlatform,\n): Promise<PlatformMeta[]> {\n if (platform !== \"qoder\") {\n return [resolvePlatformMeta(cwd, platform)];\n }\n\n const installed: PlatformMeta[] = [];\n for (const meta of resolveQoderVariantMetas()) {\n if (await hasInstallMarkers(cwd, meta)) {\n installed.push(meta);\n }\n }\n\n return installed.length > 0 ? installed : [resolvePlatformMeta(cwd, platform)];\n}\n\nasync function buildClearPlan(cwd: string, agents: AgentPlatform[]): Promise<ClearPlan> {\n const manifest = await readInstallManifest(cwd);\n if (manifest) {\n const plan = await buildManifestClearPlan(cwd, agents, manifest);\n const manifestAgents = new Set(manifest.agents.filter(isAgentPlatform));\n const missingAgents = agents.filter((agent) => !manifestAgents.has(agent));\n if (missingAgents.length > 0) {\n mergeClearPlan(plan, await buildTemplateClearPlan(cwd, missingAgents));\n }\n if (manifestAgents.has(\"qoder\") && agents.includes(\"qoder\")) {\n const uncoveredQoderMetas = await resolveManifestUncoveredQoderMetas(cwd, manifest);\n if (uncoveredQoderMetas.length > 0) {\n mergeClearPlan(\n plan,\n await buildTemplateClearPlanForMetas(cwd, \"qoder\", uncoveredQoderMetas),\n );\n }\n }\n addRuntimeClearEntries(plan, cwd);\n return plan;\n }\n\n const plan = await buildTemplateClearPlan(cwd, agents);\n addRuntimeClearEntries(plan, cwd);\n return plan;\n}\n\nasync function buildManifestClearPlan(\n cwd: string,\n agents: AgentPlatform[],\n manifest: InstallManifest,\n): Promise<ClearPlan> {\n const plan = createClearPlan();\n const agentSet = new Set(agents);\n\n for (const file of manifest.files) {\n if (!agentSet.has(file.platform)) {\n continue;\n }\n const filePath = manifestPath(cwd, file.path);\n if (!(await pathExists(filePath))) {\n continue;\n }\n if (await manifestFileMatches(filePath, file.sha256)) {\n plan.removeFiles.push({ filePath, expectedSha256: file.sha256 });\n addEmptyDirChain(plan.emptyDirs, path.dirname(filePath), cwd);\n } else {\n plan.skippedModified.push(filePath);\n }\n }\n\n for (const registration of manifest.hook_registrations) {\n if (!agentSet.has(registration.platform)) {\n continue;\n }\n const managedHookPaths = registration.hook_path\n ? managedHookPathsForRegistration(cwd, registration.hook_path)\n : [];\n addHookConfigPrune(\n plan.pruneHookConfigs,\n plan.pruneHookCommands,\n manifestPath(cwd, registration.config_path),\n managedHookPaths,\n [registration.command],\n );\n }\n\n for (const region of manifest.constraint_regions) {\n if (!agentSet.has(region.platform)) {\n continue;\n }\n plan.constraints.add(manifestPath(cwd, region.path));\n }\n\n return finalizeClearPlan(plan);\n}\n\nasync function buildTemplateClearPlan(cwd: string, agents: AgentPlatform[]): Promise<ClearPlan> {\n const plan = createClearPlan();\n const managedSkills = await listDirNames(getTemplatePath(\"common\", \"skills\"));\n managedSkills.push(...(await listDirNames(getTemplatePath(\"common\", \"bundled-skills\"))));\n\n for (const platform of agents) {\n const metas = await resolveClearPlatformMetas(cwd, platform);\n await addTemplateClearEntries(plan, cwd, platform, metas, managedSkills);\n }\n\n return finalizeClearPlan(plan);\n}\n\nasync function buildTemplateClearPlanForMetas(\n cwd: string,\n platform: AgentPlatform,\n metas: PlatformMeta[],\n): Promise<ClearPlan> {\n const plan = createClearPlan();\n const managedSkills = await listDirNames(getTemplatePath(\"common\", \"skills\"));\n managedSkills.push(...(await listDirNames(getTemplatePath(\"common\", \"bundled-skills\"))));\n await addTemplateClearEntries(plan, cwd, platform, metas, managedSkills);\n return finalizeClearPlan(plan);\n}\n\nasync function addTemplateClearEntries(\n plan: MutableClearPlan,\n cwd: string,\n platform: AgentPlatform,\n metas: PlatformMeta[],\n managedSkills: string[],\n): Promise<void> {\n const hookFileNames = await listSharedHookNamesForPlatform(platform);\n const agentFileNames = await listFileNames(\n getTemplatePath(PLATFORM_TEMPLATE_DIR[platform], \"agents\"),\n );\n\n for (const meta of metas) {\n for (const name of managedSkills) {\n plan.remove.add(path.join(cwd, meta.skillsDir, name));\n }\n for (const name of hookFileNames) {\n plan.remove.add(path.join(cwd, meta.hooksDir, name));\n }\n for (const name of agentFileNames) {\n plan.remove.add(path.join(cwd, meta.agentsDir, name));\n }\n\n addHookConfigPrune(\n plan.pruneHookConfigs,\n plan.pruneHookCommands,\n path.join(cwd, meta.hookConfigFile),\n managedHookPathsForTemplate(cwd, meta, hookFileNames),\n [],\n );\n plan.constraints.add(path.join(cwd, meta.mainConstraint));\n\n if (platform === \"codex\") {\n plan.remove.add(path.join(cwd, meta.templateContext.platform_config_dir, \"config.toml\"));\n }\n\n plan.emptyDirs.add(path.join(cwd, meta.skillsDir));\n plan.emptyDirs.add(path.join(cwd, meta.hooksDir));\n plan.emptyDirs.add(path.join(cwd, meta.agentsDir));\n }\n}\n\nasync function resolveManifestUncoveredQoderMetas(\n cwd: string,\n manifest: InstallManifest,\n): Promise<PlatformMeta[]> {\n const coveredBaseDirs = manifestCoveredQoderBaseDirs(manifest);\n const metas: PlatformMeta[] = [];\n for (const meta of resolveQoderVariantMetas()) {\n const baseDir = meta.templateContext.platform_config_dir;\n if (coveredBaseDirs.has(baseDir)) {\n continue;\n }\n if (await hasInstallMarkers(cwd, meta)) {\n metas.push(meta);\n }\n }\n return metas;\n}\n\nfunction manifestCoveredQoderBaseDirs(manifest: InstallManifest): Set<string> {\n const covered = new Set<string>();\n for (const meta of resolveQoderVariantMetas()) {\n const baseDir = meta.templateContext.platform_config_dir.replace(/\\\\/g, \"/\");\n const prefix = `${baseDir}/`;\n if (\n manifest.files.some((file) => file.platform === \"qoder\" && file.path.startsWith(prefix)) ||\n manifest.hook_registrations.some(\n (registration) =>\n registration.platform === \"qoder\" &&\n (registration.config_path === meta.hookConfigFile ||\n registration.config_path.startsWith(prefix) ||\n Boolean(registration.hook_path?.startsWith(prefix))),\n )\n ) {\n covered.add(baseDir);\n }\n }\n return covered;\n}\n\nfunction addHookConfigPrune(\n pruneHookConfigs: Map<string, Set<string>>,\n pruneHookCommands: Map<string, Set<string>>,\n filePath: string,\n managedHookPaths: string[],\n managedHookCommands: string[],\n): void {\n const existingPaths = pruneHookConfigs.get(filePath) ?? new Set<string>();\n for (const managedHookPath of managedHookPaths) {\n existingPaths.add(managedHookPath);\n }\n pruneHookConfigs.set(filePath, existingPaths);\n\n const existingCommands = pruneHookCommands.get(filePath) ?? new Set<string>();\n for (const managedHookCommand of managedHookCommands) {\n existingCommands.add(managedHookCommand);\n }\n pruneHookCommands.set(filePath, existingCommands);\n}\n\nfunction managedHookPathsForRegistration(cwd: string, hookPath: string): string[] {\n const paths = [hookPath];\n try {\n paths.push(...managedHookPathTokens(manifestPath(cwd, hookPath)));\n } catch {\n if (path.isAbsolute(hookPath)) {\n paths.push(...managedHookPathTokens(hookPath));\n }\n }\n return paths;\n}\n\nfunction managedHookPathsForTemplate(\n cwd: string,\n meta: PlatformMeta,\n hookFileNames: string[],\n): string[] {\n const relativePaths = hookFileNames.map(\n (name) => `${meta.templateContext.platform_config_dir}/hooks/${name}`,\n );\n const absolutePaths = hookFileNames.flatMap((name) =>\n managedHookPathTokens(path.join(cwd, meta.hooksDir, name)),\n );\n return [...relativePaths, ...absolutePaths];\n}\n\nfunction managedHookPathTokens(filePath: string): string[] {\n const tokens = new Set<string>();\n for (const equivalentPath of equivalentAbsolutePaths(filePath)) {\n const normalized = equivalentPath.replace(/\\\\/g, \"/\");\n const dir = path.posix.dirname(normalized);\n const basename = path.posix.basename(normalized);\n tokens.add(normalized);\n tokens.add(shellDoubleQuoteArg(normalized));\n tokens.add(`${shellDoubleQuoteArg(dir)}/${basename}`);\n }\n return [...tokens];\n}\n\nfunction equivalentAbsolutePaths(filePath: string): string[] {\n const normalized = path.resolve(filePath).replace(/\\\\/g, \"/\");\n const equivalents = [normalized];\n if (normalized.startsWith(\"/private/var/\")) {\n equivalents.push(normalized.replace(/^\\/private\\/var\\//, \"/var/\"));\n } else if (normalized.startsWith(\"/var/\")) {\n equivalents.push(normalized.replace(/^\\/var\\//, \"/private/var/\"));\n }\n return equivalents;\n}\n\nfunction shellDoubleQuoteArg(value: string): string {\n return `\"${value.replace(/([\"\\\\$`])/g, \"\\\\$1\")}\"`;\n}\n\nfunction createClearPlan(): MutableClearPlan {\n return {\n remove: new Set<string>(),\n removeFiles: [],\n skippedModified: [],\n pruneHookConfigs: new Map<string, Set<string>>(),\n pruneHookCommands: new Map<string, Set<string>>(),\n constraints: new Set<string>(),\n emptyDirs: new Set<string>(),\n };\n}\n\nfunction finalizeClearPlan(plan: MutableClearPlan): ClearPlan {\n return {\n remove: [...plan.remove],\n removeFiles: plan.removeFiles,\n skippedModified: plan.skippedModified,\n pruneHookConfigs: mergeHookConfigPrunes(plan.pruneHookConfigs, plan.pruneHookCommands),\n constraints: [...plan.constraints],\n emptyDirs: [...plan.emptyDirs],\n };\n}\n\nfunction mergeHookConfigPrunes(\n pruneHookConfigs: Map<string, Set<string>>,\n pruneHookCommands: Map<string, Set<string>>,\n): HookConfigPrune[] {\n const filePaths = new Set([...pruneHookConfigs.keys(), ...pruneHookCommands.keys()]);\n return [...filePaths].map((filePath) => ({\n filePath,\n managedHookPaths: [...(pruneHookConfigs.get(filePath) ?? new Set<string>())],\n managedHookCommands: [...(pruneHookCommands.get(filePath) ?? new Set<string>())],\n }));\n}\n\nfunction mergeClearPlan(target: ClearPlan, source: ClearPlan): void {\n target.remove = [...new Set([...target.remove, ...source.remove])];\n target.removeFiles = dedupeFileRemovals([...target.removeFiles, ...source.removeFiles]);\n target.skippedModified = [...new Set([...target.skippedModified, ...source.skippedModified])];\n target.constraints = [...new Set([...target.constraints, ...source.constraints])];\n target.emptyDirs = [...new Set([...target.emptyDirs, ...source.emptyDirs])];\n\n for (const sourcePrune of source.pruneHookConfigs) {\n const existing = target.pruneHookConfigs.find(\n (prune) => prune.filePath === sourcePrune.filePath,\n );\n if (!existing) {\n target.pruneHookConfigs.push(sourcePrune);\n continue;\n }\n existing.managedHookPaths = [\n ...new Set([...existing.managedHookPaths, ...sourcePrune.managedHookPaths]),\n ];\n existing.managedHookCommands = [\n ...new Set([...existing.managedHookCommands, ...sourcePrune.managedHookCommands]),\n ];\n }\n}\n\nfunction dedupeFileRemovals(removals: ManifestFileRemoval[]): ManifestFileRemoval[] {\n const byPath = new Map<string, ManifestFileRemoval>();\n for (const removal of removals) {\n byPath.set(removal.filePath, removal);\n }\n return [...byPath.values()];\n}\n\nfunction addRuntimeClearEntries(plan: ClearPlan, cwd: string): void {\n plan.remove = [\n ...new Set([\n ...plan.remove,\n path.join(cwd, EASY_CODING_DIR, CONFIG_FILE),\n path.join(cwd, EASY_CODING_DIR, SESSIONS_DIR),\n path.join(cwd, EASY_CODING_DIR, TEMPLATES_DIR),\n path.join(cwd, EASY_CODING_DIR, TOOLS_DIR),\n path.join(cwd, EASY_CODING_DIR, INSTALL_MANIFEST_FILE),\n ]),\n ];\n}\n\nfunction addEmptyDirChain(emptyDirs: Set<string>, startDir: string, cwd: string): void {\n let current = startDir;\n while (current !== cwd && isInsideDirectory(cwd, current)) {\n emptyDirs.add(current);\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n}\n\nfunction isInsideDirectory(parent: string, child: string): boolean {\n const relative = path.relative(parent, child);\n return Boolean(relative) && !relative.startsWith(\"..\") && !path.isAbsolute(relative);\n}\n\nasync function listSharedHookNamesForPlatform(platform: AgentPlatform): Promise<string[]> {\n const names = await listFileNames(getTemplatePath(\"shared-hooks\"));\n if (PLATFORM_META[platform].hasSubagentContext) {\n return names;\n }\n return names.filter((name) => name !== \"inject-subagent-context.py\");\n}\n\nasync function executeClearPlan(plan: ClearPlan): Promise<void> {\n for (const target of plan.removeFiles) {\n if (await manifestFileMatches(target.filePath, target.expectedSha256)) {\n await rm(target.filePath, { force: true });\n }\n }\n\n for (const target of plan.remove) {\n await rm(target, { recursive: true, force: true });\n }\n\n for (const config of plan.pruneHookConfigs) {\n await pruneHookConfig(config);\n }\n\n for (const constraint of plan.constraints) {\n await stripConstraintRegion(constraint);\n }\n\n for (const dir of sortDirsDeepestFirst(plan.emptyDirs)) {\n await removeIfEmpty(dir);\n }\n}\n\n// Removes only the harness's own hook registrations from a settings.json / hooks.json,\n// preserving any user-authored config. Deletes the file only when nothing else remains.\nasync function pruneHookConfig(config: HookConfigPrune): Promise<void> {\n const { filePath, managedHookCommands, managedHookPaths } = config;\n const content = await readTextIfExists(filePath);\n if (content === null) {\n return;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(content) as Record<string, unknown>;\n } catch {\n return; // malformed or user-owned — leave it untouched\n }\n\n const hooks = parsed.hooks;\n if (hooks && typeof hooks === \"object\" && !Array.isArray(hooks)) {\n const cleaned = pruneHookEvents(\n hooks as Record<string, unknown>,\n managedHookPaths,\n managedHookCommands,\n );\n if (cleaned === null) {\n parsed = Object.fromEntries(Object.entries(parsed).filter(([key]) => key !== \"hooks\"));\n } else {\n parsed.hooks = cleaned;\n }\n }\n\n if (Object.keys(parsed).length === 0) {\n await rm(filePath, { force: true });\n return;\n }\n await writeFile(filePath, `${JSON.stringify(parsed, null, 2)}\\n`, \"utf8\");\n}\n\nfunction pruneHookEvents(\n hooks: Record<string, unknown>,\n managedHookPaths: string[],\n managedHookCommands: string[],\n): Record<string, unknown> | null {\n const result: Record<string, unknown> = {};\n for (const [event, value] of Object.entries(hooks)) {\n if (!Array.isArray(value)) {\n result[event] = value;\n continue;\n }\n const keptGroups = value\n .map((group) => pruneHookGroup(group, managedHookPaths, managedHookCommands))\n .filter((group) => group !== null);\n if (keptGroups.length > 0) {\n result[event] = keptGroups;\n }\n }\n return Object.keys(result).length === 0 ? null : result;\n}\n\nfunction pruneHookGroup(\n group: unknown,\n managedHookPaths: string[],\n managedHookCommands: string[],\n): unknown {\n if (!group || typeof group !== \"object\") {\n return group;\n }\n const entry = group as { hooks?: unknown };\n if (!Array.isArray(entry.hooks)) {\n return group;\n }\n const keptHooks = entry.hooks.filter(\n (hook) => !isManagedHook(hook, managedHookPaths, managedHookCommands),\n );\n if (keptHooks.length === 0) {\n return null;\n }\n return { ...(group as Record<string, unknown>), hooks: keptHooks };\n}\n\nfunction isManagedHook(\n hook: unknown,\n managedHookPaths: string[],\n managedHookCommands: string[],\n): boolean {\n if (!hook || typeof hook !== \"object\") {\n return false;\n }\n const command = (hook as { command?: unknown }).command;\n if (typeof command !== \"string\") {\n return false;\n }\n const normalizedManagedCommands = managedHookCommands.map(normalizeCommand);\n if (normalizedManagedCommands.includes(normalizeCommand(command))) {\n return true;\n }\n const normalizedCommand = command;\n return managedHookPaths.some((hookPath) =>\n commandContainsPathToken(normalizedCommand, hookPath.replace(/\\\\/g, \"/\")),\n );\n}\n\nfunction commandContainsPathToken(command: string, targetPath: string): boolean {\n const escaped = targetPath.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n return new RegExp(`(^|\\\\s|[\"'])${escaped}($|\\\\s|[\"'])`).test(command);\n}\n\nasync function stripConstraintRegion(filePath: string): Promise<void> {\n const content = await readTextIfExists(filePath);\n if (content === null) {\n return;\n }\n const stripped = removeMarkedRegion(content);\n if (stripped !== content) {\n await writeFile(filePath, stripped, \"utf8\");\n }\n}\n\nasync function removeIfEmpty(dir: string): Promise<void> {\n try {\n const entries = await readdir(dir);\n if (entries.length === 0) {\n await rm(dir, { recursive: true, force: true });\n }\n } catch {\n // missing directory — nothing to clean\n }\n}\n\nfunction sortDirsDeepestFirst(dirs: string[]): string[] {\n return [...dirs].sort((left, right) => {\n const depthDiff = pathDepth(right) - pathDepth(left);\n return depthDiff === 0 ? left.localeCompare(right) : depthDiff;\n });\n}\n\nfunction pathDepth(dir: string): number {\n return path.normalize(dir).split(path.sep).filter(Boolean).length;\n}\n\nasync function listDirNames(dir: string): Promise<string[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n\nasync function listFileNames(dir: string): Promise<string[]> {\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n return entries.filter((entry) => entry.isFile()).map((entry) => entry.name);\n } catch {\n return [];\n }\n}\n\nfunction renderPlan(cwd: string, agents: AgentPlatform[], plan: ClearPlan): string {\n const rel = (target: string) => path.relative(cwd, target) || target;\n const lines: string[] = [];\n lines.push(chalk.bold(\"easy-coding clear\"));\n lines.push(`Platforms: ${agents.length > 0 ? agents.join(\", \") : \"(none detected)\"}`);\n lines.push(\"\");\n lines.push(\"Will remove:\");\n for (const target of plan.removeFiles) {\n lines.push(` - ${rel(target.filePath)}`);\n }\n for (const target of plan.remove) {\n lines.push(` - ${rel(target)}`);\n }\n if (plan.skippedModified.length > 0) {\n lines.push(\"Will keep modified manifest files:\");\n for (const target of plan.skippedModified) {\n lines.push(` - ${rel(target)}`);\n }\n }\n if (plan.constraints.length > 0) {\n lines.push(\"Will strip the generated region from (file kept):\");\n for (const target of plan.constraints) {\n lines.push(` - ${rel(target)}`);\n }\n }\n if (plan.pruneHookConfigs.length > 0) {\n lines.push(\"Will prune harness hooks from (file kept if other config remains):\");\n for (const target of plan.pruneHookConfigs) {\n lines.push(` - ${rel(target.filePath)}`);\n }\n }\n lines.push(\"\");\n lines.push(\n chalk.dim(\n \"Kept: .easy-coding/tasks, spec, memory, project.yaml, and knowledge files (SOUL/RULES/ABSTRACT/TEST_STRATEGY).\",\n ),\n );\n return lines.join(\"\\n\");\n}\n\nfunction renderTargetPlans(targetPlans: TargetClearPlan[]): string {\n if (targetPlans.length === 1) {\n const [{ target, agents, plan }] = targetPlans;\n return [`Target: ${target.label}`, renderPlan(target.dir, agents, plan)].join(\"\\n\");\n }\n\n return targetPlans\n .map(({ target, agents, plan }) =>\n [`Target: ${target.label}`, renderPlan(target.dir, agents, plan)].join(\"\\n\"),\n )\n .join(\"\\n\\n\");\n}\n","import path from \"node:path\";\nimport { cancel, confirm, outro, select, text } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport type { UnitTestMode } from \"../types/task.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { compareVersions } from \"../utils/compare-versions.js\";\nimport {\n type ApprovalMode,\n type ConfiguredWorkflowMode,\n isUtCoverageThreshold,\n readConfigYaml,\n resolveLegacyBehavior,\n setBehaviorModes,\n} from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { inspectTddReadiness } from \"../utils/tdd-readiness.js\";\n\nexport async function config(): Promise<void> {\n renderBanner();\n\n const configPath = path.join(process.cwd(), EASY_CODING_DIR, CONFIG_FILE);\n if (!(await pathExists(configPath))) {\n throw new Error(\"No easy-coding harness found in this project.\");\n }\n\n const projectConfig = await readConfigYaml(configPath);\n if (projectConfig.harness_version !== VERSION) {\n const relation = compareVersions(projectConfig.harness_version, VERSION);\n if (relation === -1) {\n throw new Error(\n `Project harness ${projectConfig.harness_version} is older than CLI ${VERSION}. Run easy-coding upgrade first.`,\n );\n }\n if (relation === 1) {\n throw new Error(\n `Project harness ${projectConfig.harness_version} is newer than CLI ${VERSION}. Update the CLI first.`,\n );\n }\n throw new Error(\n `Project harness ${projectConfig.harness_version} does not exactly match CLI ${VERSION}. Upgrade the harness or update the CLI before changing config.`,\n );\n }\n\n const current = resolveLegacyBehavior(projectConfig);\n const approvalMode = await select<ApprovalMode>({\n message: `Select project approval mode (current: ${current.approvalMode})`,\n initialValue: current.approvalMode,\n options: [\n {\n value: \"approve\",\n label: \"approve — confirm every stage transition\",\n hint: \"except INIT -> ANALYSIS and MEMORY -> COMPLETE\",\n },\n {\n value: \"guard\",\n label: \"guard — confirm critical gates (default)\",\n hint: \"ANALYSIS -> IMPLEMENT and QUALITY -> MEMORY\",\n },\n {\n value: \"confirm\",\n label: \"confirm — confirm the plan once\",\n hint: \"only ANALYSIS -> IMPLEMENT; later stages advance after quality gates\",\n },\n {\n value: \"auto\",\n label: \"auto — advance workflow stages automatically\",\n hint: \"only new post-verification code drift pauses for exact acceptance\",\n },\n ],\n });\n if (typeof approvalMode === \"symbol\") {\n cancel(\"Configuration cancelled.\");\n return;\n }\n\n const workflowMode: ConfiguredWorkflowMode = \"adaptive\";\n\n const unitTestMode = await select<UnitTestMode>({\n message: `Select Java unit test strategy (current: ${current.unitTestMode})`,\n initialValue: current.unitTestMode,\n options: [\n { value: \"none\", label: \"none — preserve task-required verification (default)\" },\n { value: \"ut\", label: \"UT — passing unit tests and changed-line coverage\" },\n { value: \"tdd\", label: \"TDD — test-first development and changed-line coverage\" },\n ],\n });\n if (typeof unitTestMode === \"symbol\") {\n cancel(\"Configuration cancelled.\");\n return;\n }\n\n if (unitTestMode !== \"none\") {\n const readiness = await inspectTddReadiness(process.cwd());\n if (readiness.status !== \"ready\") {\n cancel(\n `Unit test strategy was not enabled. ${readiness.status === \"needs_init\" ? \"Run ec-tdd-init first\" : \"Repair coverage readiness\"}: ${readiness.reasons.join(\"; \")}. No project modes were changed.`,\n );\n return;\n }\n }\n\n let utCoverageThreshold = current.utCoverageThreshold;\n if (unitTestMode !== \"none\") {\n const thresholdInput = await text({\n message: \"Minimum changed-production-line coverage percentage\",\n initialValue: String(current.utCoverageThreshold),\n validate(value) {\n const parsed = Number(value);\n return isUtCoverageThreshold(parsed) ? undefined : \"Enter an integer from 1 to 100.\";\n },\n });\n if (typeof thresholdInput === \"symbol\") {\n cancel(\"Configuration cancelled.\");\n return;\n }\n utCoverageThreshold = Number(thresholdInput);\n }\n\n const shouldSave = await confirm({\n message: `Set approval=${approvalMode}, workflow=${workflowMode}, unit-test=${unitTestMode}${unitTestMode === \"none\" ? \"\" : ` (${utCoverageThreshold}%)`}?`,\n initialValue: true,\n });\n if (typeof shouldSave === \"symbol\" || !shouldSave) {\n cancel(\"Configuration cancelled.\");\n return;\n }\n\n if (unitTestMode !== \"none\") {\n const readiness = await inspectTddReadiness(process.cwd());\n if (readiness.status !== \"ready\") {\n cancel(\n `Unit test strategy was not enabled because readiness changed before save: ${readiness.reasons.join(\"; \")}. No project modes were changed.`,\n );\n return;\n }\n }\n\n await setBehaviorModes(configPath, approvalMode, workflowMode, unitTestMode, utCoverageThreshold);\n outro(\n chalk.green(\n `Project modes updated: approval=${approvalMode}, workflow=${workflowMode}, unit-test=${unitTestMode}${unitTestMode === \"none\" ? \"\" : ` (${utCoverageThreshold}%)`}.`,\n ),\n );\n}\n","import path from \"node:path\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport { readConfigYaml } from \"./config-yaml.js\";\nimport { pathExists } from \"./file-writer.js\";\n\nexport type VersionComparison = -1 | 0 | 1;\n\ninterface ParsedVersion {\n core: number[];\n prerelease: string[] | null;\n}\n\nfunction parseVersion(version: string): ParsedVersion {\n const withoutBuild = String(version ?? \"\").split(\"+\", 1)[0];\n const separator = withoutBuild.indexOf(\"-\");\n const coreText = separator === -1 ? withoutBuild : withoutBuild.slice(0, separator);\n const prereleaseText = separator === -1 ? \"\" : withoutBuild.slice(separator + 1);\n const core = coreText.split(\".\").map((part) => {\n const parsed = Number.parseInt(part, 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n });\n return {\n core,\n prerelease: prereleaseText ? prereleaseText.split(\".\") : null,\n };\n}\n\nfunction comparePrerelease(left: string[] | null, right: string[] | null): VersionComparison {\n if (left === null && right === null) return 0;\n if (left === null) return 1;\n if (right === null) return -1;\n\n const length = Math.max(left.length, right.length);\n for (let index = 0; index < length; index += 1) {\n const leftPart = left[index];\n const rightPart = right[index];\n if (leftPart === undefined) return -1;\n if (rightPart === undefined) return 1;\n if (leftPart === rightPart) continue;\n\n const leftNumeric = /^\\d+$/.test(leftPart);\n const rightNumeric = /^\\d+$/.test(rightPart);\n if (leftNumeric && rightNumeric) {\n const leftNumber = Number.parseInt(leftPart, 10);\n const rightNumber = Number.parseInt(rightPart, 10);\n return leftNumber < rightNumber ? -1 : 1;\n }\n if (leftNumeric) return -1;\n if (rightNumeric) return 1;\n return leftPart < rightPart ? -1 : 1;\n }\n return 0;\n}\n\nexport function compareVersions(a: string, b: string): VersionComparison {\n const left = parseVersion(a);\n const right = parseVersion(b);\n const length = Math.max(left.core.length, right.core.length);\n\n for (let index = 0; index < length; index += 1) {\n const leftPart = left.core[index] ?? 0;\n const rightPart = right.core[index] ?? 0;\n if (leftPart < rightPart) return -1;\n if (leftPart > rightPart) return 1;\n }\n return comparePrerelease(left.prerelease, right.prerelease);\n}\n\nexport function isVersionBehind(installed: string, current = VERSION): boolean {\n return compareVersions(installed, current) === -1;\n}\n\nexport async function checkForUpgrade(cwd: string): Promise<void> {\n const configPath = path.join(cwd, EASY_CODING_DIR, CONFIG_FILE);\n if (!(await pathExists(configPath))) {\n return;\n }\n\n let config: Awaited<ReturnType<typeof readConfigYaml>>;\n try {\n config = await readConfigYaml(configPath);\n } catch {\n return;\n }\n\n const installed = String(config.harness_version ?? \"\");\n if (installed && isVersionBehind(installed)) {\n process.stderr.write(\n `easy-coding harness ${installed} is older than CLI ${VERSION}. Run easy-coding upgrade when ready.\\n`,\n );\n }\n}\n","import { readFile, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { EASY_CODING_DIR, TDD_DIR, TDD_READINESS_FILE } from \"../constants/paths.js\";\nimport { pathExists } from \"./file-writer.js\";\n\nexport const TDD_READINESS_SCHEMA = \"easy-coding/tdd-readiness-v1\";\nexport const TDD_READINESS_SCOPE = \"changed-production-lines\";\nconst TDD_BASE_VARIABLE = \"EASY_CODING_TDD_BASE_SHA\";\nconst TDD_THRESHOLD_VARIABLE = \"EASY_CODING_TDD_THRESHOLD\";\nconst COVERAGE_TOOL_PATH = \".easy-coding/tools/easy_coding_java_coverage.py\";\nconst JAVA_BUILD_FILE_NAMES = new Set([\"pom.xml\", \"build.gradle\", \"build.gradle.kts\"]);\n\ninterface ReadinessFileRecord {\n path: string;\n}\n\ninterface TddReadinessManifest {\n schema?: unknown;\n provider?: unknown;\n coverage_scope?: unknown;\n build_files?: unknown;\n ci_files?: unknown;\n tool_files?: unknown;\n coverage_report_patterns?: unknown;\n changed_line_gate_command?: unknown;\n historical_coverage_required?: unknown;\n}\n\nexport interface TddReadinessResult {\n status: \"ready\" | \"needs_init\" | \"needs_repair\";\n reasons: string[];\n manifestPath: string;\n}\n\nfunction readinessPath(root: string): string {\n return path.join(root, EASY_CODING_DIR, TDD_DIR, TDD_READINESS_FILE);\n}\n\nfunction parseFileRecords(value: unknown, field: string, reasons: string[]): ReadinessFileRecord[] {\n if (!Array.isArray(value) || value.length === 0) {\n reasons.push(`${field} must contain at least one file`);\n return [];\n }\n const records: ReadinessFileRecord[] = [];\n for (const item of value) {\n if (!item || typeof item !== \"object\" || Array.isArray(item)) {\n reasons.push(`${field} contains an invalid record`);\n continue;\n }\n const record = item as Record<string, unknown>;\n if (typeof record.path !== \"string\" || !record.path.trim() || path.isAbsolute(record.path)) {\n reasons.push(`${field} contains an invalid path`);\n continue;\n }\n records.push({ path: record.path });\n }\n return records;\n}\n\nfunction usesRequiredGateVariables(command: string): boolean {\n const normalized = command\n .replaceAll(`\\${${TDD_BASE_VARIABLE}}`, `$${TDD_BASE_VARIABLE}`)\n .replaceAll(`\\${${TDD_THRESHOLD_VARIABLE}}`, `$${TDD_THRESHOLD_VARIABLE}`);\n return (\n new RegExp(`--base\\\\s+['\\\"]?\\\\$${TDD_BASE_VARIABLE}(?:['\\\"]|\\\\s|$)`).test(normalized) &&\n new RegExp(`--threshold\\\\s+['\\\"]?\\\\$${TDD_THRESHOLD_VARIABLE}(?:['\\\"]|\\\\s|$)`).test(normalized)\n );\n}\n\nfunction isSafeReportPattern(value: string): boolean {\n const normalized = value.replaceAll(\"\\\\\", \"/\");\n return !path.isAbsolute(value) && !normalized.split(\"/\").includes(\"..\");\n}\n\nasync function validateFiles(\n root: string,\n records: ReadinessFileRecord[],\n reasons: string[],\n): Promise<void> {\n const resolvedRoot = await realpath(root);\n for (const record of records) {\n const absolute = path.resolve(root, record.path);\n try {\n const resolved = await realpath(absolute);\n if (resolved !== resolvedRoot && !resolved.startsWith(`${resolvedRoot}${path.sep}`)) {\n reasons.push(`readiness file escapes project root: ${record.path}`);\n continue;\n }\n // 快照只记录初始化历史;当前构建与工具的有效性由本轮验证判定。\n await readFile(resolved);\n } catch {\n reasons.push(`readiness file is missing or unreadable: ${record.path}`);\n }\n }\n}\n\nexport async function inspectTddReadiness(root: string): Promise<TddReadinessResult> {\n const manifestPath = readinessPath(root);\n if (!(await pathExists(manifestPath))) {\n return { status: \"needs_init\", reasons: [\"TDD readiness receipt is missing\"], manifestPath };\n }\n\n let manifest: TddReadinessManifest;\n try {\n manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as TddReadinessManifest;\n } catch {\n return { status: \"needs_repair\", reasons: [\"TDD readiness receipt is invalid\"], manifestPath };\n }\n\n if (!manifest || typeof manifest !== \"object\" || Array.isArray(manifest)) {\n return {\n status: \"needs_repair\",\n reasons: [\"TDD readiness receipt must be a JSON object\"],\n manifestPath,\n };\n }\n\n const reasons: string[] = [];\n if (manifest.schema !== TDD_READINESS_SCHEMA) reasons.push(\"unsupported readiness schema\");\n if (manifest.provider !== \"gitlab\") reasons.push(\"readiness provider must be gitlab\");\n if (manifest.coverage_scope !== TDD_READINESS_SCOPE) {\n reasons.push(\"coverage scope must be changed-production-lines\");\n }\n if (manifest.historical_coverage_required !== false) {\n reasons.push(\"historical coverage must remain disabled\");\n }\n if (\n !Array.isArray(manifest.coverage_report_patterns) ||\n manifest.coverage_report_patterns.length === 0 ||\n manifest.coverage_report_patterns.some(\n (item) => typeof item !== \"string\" || !item.trim() || !isSafeReportPattern(item),\n )\n ) {\n reasons.push(\"coverage_report_patterns must contain safe project-relative report patterns\");\n }\n if (\n typeof manifest.changed_line_gate_command !== \"string\" ||\n !manifest.changed_line_gate_command.includes(COVERAGE_TOOL_PATH)\n ) {\n reasons.push(\"changed-line coverage gate command is missing\");\n } else if (!usesRequiredGateVariables(manifest.changed_line_gate_command)) {\n reasons.push(\"changed-line coverage gate must use the task baseline and threshold variables\");\n }\n\n const buildFiles = parseFileRecords(manifest.build_files, \"build_files\", reasons);\n const toolFiles = parseFileRecords(manifest.tool_files, \"tool_files\", reasons);\n if (!buildFiles.some((record) => JAVA_BUILD_FILE_NAMES.has(path.basename(record.path)))) {\n reasons.push(\"build_files must include a Maven or Gradle Java build file\");\n }\n if (!toolFiles.some((record) => record.path.replaceAll(\"\\\\\", \"/\") === COVERAGE_TOOL_PATH)) {\n reasons.push(`tool_files must include ${COVERAGE_TOOL_PATH}`);\n }\n await validateFiles(root, buildFiles, reasons);\n await validateFiles(root, toolFiles, reasons);\n\n return {\n status: reasons.length === 0 ? \"ready\" : \"needs_repair\",\n reasons: [...new Set(reasons)],\n manifestPath,\n };\n}\n","import path from \"node:path\";\nimport { note, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport type { InstallContext, SubmoduleEntry } from \"../types/supermodule.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { readConfigYaml, updateSupermoduleConfig } from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { parseGitmodules } from \"../utils/gitmodules.js\";\nimport { detectEasyCodingInstallState } from \"../utils/install-state.js\";\nimport {\n installHarnessToDir,\n refreshSupermoduleParent,\n supermoduleConfigFromContext,\n} from \"./install-harness.js\";\nimport { type PlatformOptions, resolvePlatforms } from \"./platforms.js\";\nimport {\n rejectSubmoduleListWithoutGitmodules,\n resolveInitSubmoduleSelection,\n} from \"./supermodule-targets.js\";\n\ninterface InstallTarget {\n dir: string;\n label: string;\n context: InstallContext;\n installed: boolean;\n}\n\nexport async function init(opts: PlatformOptions): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\n const submodules = await parseGitmodules(cwd);\n if (submodules.length === 0) {\n rejectSubmoduleListWithoutGitmodules(opts);\n }\n\n const targets =\n submodules.length === 0\n ? [await standaloneTarget(cwd)]\n : await supermoduleTargets(cwd, opts, submodules);\n\n const installableTargets = targets.filter((target) => !target.installed);\n const parentTarget = targets.find((target) => target.label === \".\");\n if (installableTargets.length === 0) {\n await refreshInstalledChildTopologies(targets);\n if (submodules.length > 0 && parentTarget) {\n const platforms = await resolveInitPlatforms(cwd, opts, true);\n await refreshParentTopologyIfNeeded(cwd, parentTarget, platforms);\n }\n outro(chalk.yellow(\"All selected easy-coding harness targets are already installed.\"));\n return;\n }\n\n const platforms = await resolveInitPlatforms(cwd, opts, Boolean(parentTarget?.installed));\n for (const target of installableTargets) {\n await installHarnessToDir(target.dir, platforms, target.context);\n }\n await refreshInstalledChildTopologies(targets);\n if (submodules.length > 0 && parentTarget) {\n await refreshParentTopologyIfNeeded(cwd, parentTarget, platforms);\n }\n\n const triggers = platforms\n .map(\n (platform) =>\n `${PLATFORM_META[platform].label}: ${PLATFORM_META[platform].skillTrigger}ec-init`,\n )\n .join(\"\\n\");\n\n note(triggers, \"Next step\");\n outro(\n chalk.green(\n `easy-coding harness installed in ${installableTargets.map((target) => target.label).join(\", \")}. Open your agent and run ec-init.`,\n ),\n );\n}\n\nasync function standaloneTarget(cwd: string): Promise<InstallTarget> {\n const installState = await detectEasyCodingInstallState(cwd);\n if (installState.kind === \"installed\") {\n throw new Error(\n \".easy-coding/config.yaml already exists. Use easy-coding add-agent or easy-coding upgrade.\",\n );\n }\n if (installState.kind === \"unknown\") {\n throw new Error(\n \".easy-coding exists but is not recognized as an easy-coding harness or legacy easy-coding skill project. Please inspect it manually before running init.\",\n );\n }\n\n return {\n dir: cwd,\n label: \".\",\n context: contextFromState(\"standalone\", installState),\n installed: false,\n };\n}\n\nasync function supermoduleTargets(\n cwd: string,\n opts: PlatformOptions,\n submodules: SubmoduleEntry[],\n): Promise<InstallTarget[]> {\n const { installable, parentSubmodulePaths } = await resolveInitSubmoduleSelection(cwd, opts);\n const skipped = submodules.filter(\n (entry) => !installable.some((installableEntry) => installableEntry.path === entry.path),\n );\n if (skipped.length > 0) {\n note(\n skipped.map((entry) => `${entry.path} (${entry.name})`).join(\"\\n\"),\n \"Skipped unchecked-out submodules\",\n );\n }\n\n const targets: InstallTarget[] = [\n await targetFromState(cwd, \".\", \"super-parent\", {\n submodulePaths: parentSubmodulePaths,\n }),\n ];\n\n const targetSubmodulePaths =\n opts.submodules === false ? new Set<string>() : new Set(parentSubmodulePaths);\n for (const entry of installable) {\n if (!targetSubmodulePaths.has(entry.path)) {\n continue;\n }\n const dir = path.join(cwd, entry.path);\n targets.push(\n await targetFromState(dir, entry.path, \"submodule-child\", {\n parent: toPosixRelative(dir, cwd),\n }),\n );\n }\n\n return targets;\n}\n\nasync function targetFromState(\n targetDir: string,\n label: string,\n role: InstallContext[\"role\"],\n extraContext: Partial<InstallContext> = {},\n): Promise<InstallTarget> {\n const installState = await detectEasyCodingInstallState(targetDir);\n if (installState.kind === \"unknown\") {\n throw new Error(\n `${targetDir}/.easy-coding exists but is not recognized as an easy-coding harness or legacy easy-coding skill project. Please inspect it manually before running init.`,\n );\n }\n if (installState.kind === \"installed\") {\n return {\n dir: targetDir,\n label,\n installed: true,\n context: {\n role,\n initSource: \"fresh\",\n ...extraContext,\n },\n };\n }\n return {\n dir: targetDir,\n label,\n installed: false,\n context: {\n ...contextFromState(role, installState),\n ...extraContext,\n },\n };\n}\n\nfunction contextFromState(\n role: InstallContext[\"role\"],\n installState: Awaited<ReturnType<typeof detectEasyCodingInstallState>>,\n): InstallContext {\n return {\n role,\n initSource: installState.kind === \"legacy\" ? \"legacy-easy-coding\" : \"fresh\",\n legacyAssets: installState.kind === \"legacy\" ? installState.legacyAssets : undefined,\n legacyMissingHarnessFiles:\n installState.kind === \"legacy\" ? installState.missingHarnessFiles : undefined,\n };\n}\n\nfunction toPosixRelative(from: string, to: string): string {\n const relative = path.relative(from, to);\n return relative ? relative.split(path.sep).join(\"/\") : \".\";\n}\n\nasync function resolveInitPlatforms(\n cwd: string,\n opts: PlatformOptions,\n parentInstalled: boolean,\n): Promise<AgentPlatform[]> {\n if (opts.agent || !parentInstalled) {\n return resolvePlatforms(opts, [\"claude-code\"]);\n }\n\n const config = await readConfigYaml(path.join(cwd, EASY_CODING_DIR, CONFIG_FILE));\n if (Array.isArray(config.agents) && config.agents.length > 0) {\n return config.agents;\n }\n return resolvePlatforms(opts, [\"claude-code\"]);\n}\n\nasync function refreshParentTopologyIfNeeded(\n cwd: string,\n parentTarget: InstallTarget,\n installPlatforms: AgentPlatform[],\n): Promise<void> {\n if (!(await pathExists(path.join(cwd, EASY_CODING_DIR, CONFIG_FILE)))) {\n return;\n }\n\n const config = parentTarget.installed\n ? await readConfigYaml(path.join(cwd, EASY_CODING_DIR, CONFIG_FILE))\n : { agents: installPlatforms };\n const platforms =\n Array.isArray(config.agents) && config.agents.length > 0 ? config.agents : installPlatforms;\n\n // Re-entry can add a child without reinstalling the parent; refresh only the parent topology.\n await refreshSupermoduleParent(cwd, platforms, parentTarget.context.submodulePaths ?? []);\n}\n\nasync function refreshInstalledChildTopologies(targets: InstallTarget[]): Promise<void> {\n for (const target of targets) {\n if (!target.installed || target.context.role !== \"submodule-child\") {\n continue;\n }\n const configPath = path.join(target.dir, EASY_CODING_DIR, CONFIG_FILE);\n if (!(await pathExists(configPath))) {\n continue;\n }\n await updateSupermoduleConfig(configPath, supermoduleConfigFromContext(target.context));\n }\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport {\n CONFIG_FILE,\n EASY_CODING_DIR,\n PROJECT_INIT_TASK_ID,\n TASKS_DIR,\n} from \"../constants/paths.js\";\nimport { isDirectory, pathExists } from \"./file-writer.js\";\n\nexport type EasyCodingInstallState =\n | { kind: \"fresh\"; easyCodingDir: string }\n | { kind: \"installed\"; easyCodingDir: string; configPath: string }\n | {\n kind: \"legacy\";\n easyCodingDir: string;\n legacyAssets: string[];\n missingHarnessFiles: string[];\n }\n | { kind: \"unknown\"; easyCodingDir: string };\n\nconst LEGACY_ROOT_FILES = [\"SOUL.md\", \"RULES.md\", \"ABSTRACT.md\"];\n\nexport async function detectEasyCodingInstallState(cwd: string): Promise<EasyCodingInstallState> {\n const easyCodingDir = path.join(cwd, EASY_CODING_DIR);\n if (!(await pathExists(easyCodingDir))) {\n return { kind: \"fresh\", easyCodingDir };\n }\n\n const configPath = path.join(easyCodingDir, CONFIG_FILE);\n if (await pathExists(configPath)) {\n return { kind: \"installed\", easyCodingDir, configPath };\n }\n\n const legacyAssets = await detectLegacyAssets(easyCodingDir);\n if (legacyAssets.length === 0) {\n return { kind: \"unknown\", easyCodingDir };\n }\n\n return {\n kind: \"legacy\",\n easyCodingDir,\n legacyAssets,\n missingHarnessFiles: [relativeConfigPath(), relativeProjectInitTaskPath()],\n };\n}\n\nasync function detectLegacyAssets(easyCodingDir: string): Promise<string[]> {\n const assets: string[] = [];\n\n for (const file of LEGACY_ROOT_FILES) {\n if (await pathExists(path.join(easyCodingDir, file))) {\n assets.push(relativeEasyCodingPath(file));\n }\n }\n\n if (await pathExists(path.join(easyCodingDir, \"memory\", \"long\", \"MEMORY.md\"))) {\n assets.push(relativeEasyCodingPath(\"memory\", \"long\", \"MEMORY.md\"));\n }\n\n const shortMemoryFiles = await listMarkdownFiles(path.join(easyCodingDir, \"memory\", \"short\"));\n assets.push(...shortMemoryFiles.map((file) => relativeEasyCodingPath(\"memory\", \"short\", file)));\n\n for (const dir of [\"spec\", \"prototype\"]) {\n if (await hasAnyDirectoryEntry(path.join(easyCodingDir, dir))) {\n assets.push(relativeEasyCodingPath(dir));\n }\n }\n\n return assets.sort();\n}\n\nasync function listMarkdownFiles(dir: string): Promise<string[]> {\n if (!(await isDirectory(dir))) {\n return [];\n }\n\n const entries = await readdir(dir, { withFileTypes: true });\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(\".md\"))\n .map((entry) => entry.name)\n .sort();\n}\n\nasync function hasAnyDirectoryEntry(dir: string): Promise<boolean> {\n if (!(await isDirectory(dir))) {\n return false;\n }\n\n return (await readdir(dir)).length > 0;\n}\n\nfunction relativeEasyCodingPath(...segments: string[]): string {\n return path.posix.join(EASY_CODING_DIR, ...segments);\n}\n\nfunction relativeConfigPath(): string {\n return path.posix.join(EASY_CODING_DIR, CONFIG_FILE);\n}\n\nfunction relativeProjectInitTaskPath(): string {\n return path.posix.join(EASY_CODING_DIR, TASKS_DIR, PROJECT_INIT_TASK_ID, \"task.json\");\n}\n","import path from \"node:path\";\nimport chalk from \"chalk\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { compareVersions } from \"../utils/compare-versions.js\";\nimport {\n isApprovalMode,\n isConfiguredWorkflowMode,\n readConfigYaml,\n resolveLegacyBehavior,\n} from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { listSessionFiles } from \"../utils/session.js\";\nimport {\n getTaskJsonPath,\n isActiveTask,\n listTasks,\n readTaskJson,\n summarizeTaskStatuses,\n} from \"../utils/task-json.js\";\nimport { inspectTddReadiness } from \"../utils/tdd-readiness.js\";\n\nexport async function status(): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\n const configPath = path.join(cwd, EASY_CODING_DIR, CONFIG_FILE);\n if (!(await pathExists(configPath))) {\n throw new Error(\"No easy-coding harness found in this project.\");\n }\n\n const config = await readConfigYaml(configPath);\n const tasks = await listTasks(cwd);\n const taskCounts = summarizeTaskStatuses(tasks);\n const activeTasks = tasks.filter((item) => isActiveTask(item.task));\n const sessions = await listSessionFiles(cwd);\n const versionRelation = compareVersions(config.harness_version, VERSION);\n\n console.log(chalk.bold(\"Harness\"));\n console.log(` version: ${config.harness_version}`);\n console.log(` cli: ${VERSION}`);\n if (versionRelation === -1 || (versionRelation === 0 && config.harness_version !== VERSION)) {\n console.log(chalk.yellow(\" upgrade: available\"));\n } else if (versionRelation === 1) {\n console.log(chalk.red(\" upgrade: CLI is older than project harness\"));\n } else {\n console.log(\" upgrade: up to date\");\n }\n console.log(` agents: ${config.agents.join(\", \") || \"(none)\"}`);\n console.log(` project: ${config.project.name}`);\n const migratedBehavior = resolveLegacyBehavior(config);\n const projectApprovalMode = isApprovalMode(config.behavior?.approval_mode)\n ? config.behavior.approval_mode\n : migratedBehavior.approvalMode;\n const projectWorkflowMode = isConfiguredWorkflowMode(config.behavior?.workflow_mode)\n ? config.behavior.workflow_mode\n : migratedBehavior.workflowMode;\n const projectUnitTestMode = migratedBehavior.unitTestMode;\n const projectUtCoverageThreshold = migratedBehavior.utCoverageThreshold;\n const needsCoverage =\n projectUnitTestMode !== \"none\" ||\n sessions.some(({ session }) => [\"ut\", \"tdd\"].includes(session.unit_test_mode ?? \"none\")) ||\n activeTasks.some(({ task }) => [\"ut\", \"tdd\"].includes(task.unit_test_mode ?? \"none\"));\n const readiness = needsCoverage\n ? await inspectTddReadiness(cwd)\n : { status: \"not_checked\", reasons: [] };\n console.log(` approval_mode: ${projectApprovalMode}`);\n console.log(` workflow_mode: ${projectWorkflowMode}`);\n console.log(` unit_test_mode: ${projectUnitTestMode}`);\n console.log(` ut_coverage_threshold: ${projectUtCoverageThreshold}`);\n console.log(` unit_test_readiness: ${readiness.status}`);\n if (readiness.reasons.length > 0) {\n console.log(` unit_test_readiness_reasons: ${readiness.reasons.join(\"; \")}`);\n }\n console.log(\"\");\n console.log(chalk.bold(\"Sessions\"));\n console.log(` project_approval_mode: ${projectApprovalMode}`);\n console.log(` project_workflow_mode: ${projectWorkflowMode}`);\n console.log(` project_unit_test_mode: ${projectUnitTestMode}`);\n console.log(` project_ut_coverage_threshold: ${projectUtCoverageThreshold}`);\n console.log(` effective_approval_mode: ${projectApprovalMode} (without a session override)`);\n console.log(` configured_workflow_mode: ${projectWorkflowMode} (without a session override)`);\n console.log(` effective_unit_test_mode: ${projectUnitTestMode} (without a session override)`);\n console.log(\n ` effective_ut_coverage_threshold: ${projectUtCoverageThreshold} (without a session override)`,\n );\n if (sessions.length === 0) {\n console.log(\" no session files\");\n }\n for (const { key, session } of sessions) {\n const legacySessionMode = session.confirm_mode;\n const hasLegacySessionMode = [\"approve\", \"guard\", \"confirm\", \"auto\"].includes(\n String(legacySessionMode ?? \"\"),\n );\n const sessionApprovalMode =\n session.approval_mode ?? (legacySessionMode === \"lite\" ? \"guard\" : legacySessionMode);\n const sessionWorkflowMode =\n session.workflow_mode ??\n (legacySessionMode === \"lite\" ? \"fast\" : hasLegacySessionMode ? \"adaptive\" : undefined);\n const sessionUnitTestMode = session.unit_test_mode;\n const sessionUtCoverageThreshold = session.ut_coverage_threshold;\n console.log(` - ${key}`);\n console.log(` agent: ${session.agent ?? \"legacy/unknown\"}`);\n console.log(` source: ${session.session_source ?? \"legacy\"}`);\n console.log(` approval_mode: ${sessionApprovalMode ?? \"project default\"}`);\n console.log(` workflow_mode: ${sessionWorkflowMode ?? \"project default\"}`);\n console.log(` unit_test_mode: ${sessionUnitTestMode ?? \"project default\"}`);\n console.log(` ut_coverage_threshold: ${sessionUtCoverageThreshold ?? \"project default\"}`);\n console.log(` effective_approval_mode: ${sessionApprovalMode ?? projectApprovalMode}`);\n console.log(` configured_workflow_mode: ${sessionWorkflowMode ?? projectWorkflowMode}`);\n console.log(` effective_unit_test_mode: ${sessionUnitTestMode ?? projectUnitTestMode}`);\n console.log(\n ` effective_ut_coverage_threshold: ${sessionUtCoverageThreshold ?? projectUtCoverageThreshold}`,\n );\n console.log(\n ` harness: ${session.harness_disabled ? \"disabled for this session\" : \"enabled\"}`,\n );\n console.log(` lite_mode: ${session.lite_mode === true ? \"enabled\" : \"disabled\"}`);\n if (session.lite_proposal) {\n console.log(` lite_proposal: ${session.lite_proposal.digest}`);\n }\n if (!session.current_task) {\n console.log(\" current_task: none\");\n continue;\n }\n const taskPath = getTaskJsonPath(cwd, session.current_task);\n if (await pathExists(taskPath)) {\n const task = await readTaskJson(taskPath);\n console.log(` current_task: ${session.current_task}`);\n console.log(` current_stage: ${task.status}`);\n console.log(\n ` task_workflow_mode: ${task.workflow_mode ?? task.workflow_mode_proposal?.selected_mode ?? \"not resolved\"}`,\n );\n console.log(` task_unit_test_mode: ${task.unit_test_mode ?? \"not frozen\"}`);\n console.log(` task_ut_coverage_threshold: ${task.ut_coverage_threshold ?? \"not frozen\"}`);\n console.log(` last_agent: ${task.last_agent}`);\n } else {\n console.log(` current_task: ${session.current_task} (task.json missing)`);\n }\n }\n console.log(\"\");\n console.log(chalk.bold(\"Tasks\"));\n console.log(` total: ${tasks.length}`);\n for (const [taskStatus, count] of Object.entries(taskCounts)) {\n console.log(` ${taskStatus}: ${count}`);\n }\n if (activeTasks.length > 0) {\n console.log(\" active:\");\n for (const item of activeTasks) {\n const label = item.task.title ? `${item.task.title} (${item.task.status})` : item.task.status;\n console.log(` - ${item.id}: ${label}`);\n }\n }\n}\n","import { readdir, stat, unlink } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { EASY_CODING_DIR, SESSIONS_DIR, TASKS_DIR } from \"../constants/paths.js\";\nimport type { SessionFile, TaskJson } from \"../types/task.js\";\nimport {\n ensureDir,\n pathExists,\n readTextFile,\n readTextIfExists,\n writeTextFile,\n} from \"./file-writer.js\";\n\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst IDLE_SESSION_RETENTION_MS = 7 * DAY_MS;\nconst ATTACHED_SESSION_RETENTION_MS = 30 * DAY_MS;\nconst MAX_SESSION_FILES = 100;\nconst SESSION_KEY_PATTERN = /^[A-Za-z0-9._-]+$/;\n\nexport type SessionFileWithMetadata = SessionFile & {\n external_session_id?: string | null;\n session_key?: string;\n session_source?: string;\n last_active_at?: string;\n};\n\nexport interface SessionEntry {\n key: string;\n filePath: string;\n session: SessionFileWithMetadata;\n}\n\nexport interface SessionCleanupOptions {\n idleRetentionMs?: number;\n attachedRetentionMs?: number;\n maxSessions?: number;\n reserveSlots?: number;\n preserveUnitTestSettings?: boolean;\n}\n\nexport interface SessionCleanupResult {\n sessionsRemoved: number;\n acceptanceSnapshotsRemoved: number;\n}\n\ninterface SessionCleanupCandidate {\n filePath: string;\n content: string;\n activityTime: number;\n attached: boolean;\n}\n\nfunction parseSessionFile(content: string): SessionFileWithMetadata | null {\n try {\n const parsed: unknown = JSON.parse(content);\n return typeof parsed === \"object\" && parsed !== null && !Array.isArray(parsed)\n ? (parsed as SessionFileWithMetadata)\n : null;\n } catch {\n return null;\n }\n}\n\nexport function getSessionDir(cwd: string): string {\n return path.join(cwd, EASY_CODING_DIR, SESSIONS_DIR);\n}\n\nexport function getSessionFilePath(cwd: string, sessionKey: string | number): string {\n const normalizedKey = String(sessionKey);\n if (\n !normalizedKey ||\n normalizedKey === \".\" ||\n normalizedKey === \"..\" ||\n !SESSION_KEY_PATTERN.test(normalizedKey)\n ) {\n throw new Error(`Unsafe session key: ${normalizedKey}`);\n }\n return path.join(getSessionDir(cwd), `${normalizedKey}.json`);\n}\n\nexport function createSessionFile(currentTask: string | null = null): SessionFileWithMetadata {\n const timestamp = new Date().toISOString();\n return {\n current_task: currentTask,\n created_at: timestamp,\n last_active_at: timestamp,\n };\n}\n\nexport async function readSessionFile(\n cwd: string,\n sessionKey: string | number,\n): Promise<SessionFileWithMetadata | null> {\n const content = await readTextIfExists(getSessionFilePath(cwd, sessionKey));\n if (!content) {\n return null;\n }\n return parseSessionFile(content);\n}\n\nexport async function writeSessionFile(\n cwd: string,\n session: SessionFileWithMetadata,\n sessionKey: string | number,\n): Promise<void> {\n const dir = getSessionDir(cwd);\n await ensureDir(dir);\n await writeTextFile(getSessionFilePath(cwd, sessionKey), JSON.stringify(session, null, 2));\n}\n\nexport async function ensureSessionFile(\n cwd: string,\n sessionKey: string | number,\n): Promise<SessionFileWithMetadata> {\n const existing = await readSessionFile(cwd, sessionKey);\n if (existing) {\n return existing;\n }\n await cleanSessionRuntime(cwd, { reserveSlots: 1 });\n const session = createSessionFile();\n await writeSessionFile(cwd, session, sessionKey);\n return session;\n}\n\nexport async function listSessionFiles(cwd: string): Promise<SessionEntry[]> {\n const dir = getSessionDir(cwd);\n if (!(await pathExists(dir))) {\n return [];\n }\n\n const entries: SessionEntry[] = [];\n for (const name of await readdir(dir)) {\n if (!name.endsWith(\".json\")) {\n continue;\n }\n const filePath = path.join(dir, name);\n const content = await readTextIfExists(filePath);\n if (!content) {\n continue;\n }\n const session = parseSessionFile(content);\n if (!session) {\n continue;\n }\n entries.push({\n key: name.slice(0, -\".json\".length),\n filePath,\n session,\n });\n }\n return entries.sort((left, right) => left.key.localeCompare(right.key));\n}\n\nexport async function cleanSessionRuntime(\n cwd: string,\n options: SessionCleanupOptions = {},\n): Promise<SessionCleanupResult> {\n const now = Date.now();\n const idleRetentionMs = options.idleRetentionMs ?? IDLE_SESSION_RETENTION_MS;\n const attachedRetentionMs = options.attachedRetentionMs ?? ATTACHED_SESSION_RETENTION_MS;\n const maxSessions = options.maxSessions ?? MAX_SESSION_FILES;\n const reserveSlots = options.reserveSlots ?? 0;\n const candidates = (await listSessionCleanupCandidates(cwd)).filter((candidate) => {\n if (!options.preserveUnitTestSettings) return true;\n const session = parseSessionFile(candidate.content);\n return (\n !session ||\n ![\"unit_test_mode\", \"ut_coverage_threshold\", \"tdd_enabled\", \"tdd_coverage_threshold\"].some(\n (key) => key in session,\n )\n );\n });\n const removed = new Set<string>();\n\n for (const candidate of candidates) {\n const retentionMs = candidate.attached ? attachedRetentionMs : idleRetentionMs;\n if (now - candidate.activityTime <= retentionMs) {\n continue;\n }\n if (await unlinkIfUnchanged(candidate)) {\n removed.add(candidate.filePath);\n }\n }\n\n const allowedExistingSessions = Math.max(0, maxSessions - reserveSlots);\n const remaining = candidates\n .filter((candidate) => !removed.has(candidate.filePath))\n .sort((left, right) => left.activityTime - right.activityTime);\n for (const candidate of remaining.slice(\n 0,\n Math.max(0, remaining.length - allowedExistingSessions),\n )) {\n if (await unlinkIfUnchanged(candidate)) {\n removed.add(candidate.filePath);\n }\n }\n\n return {\n sessionsRemoved: removed.size,\n acceptanceSnapshotsRemoved: await cleanOrphanAcceptanceSnapshots(cwd),\n };\n}\n\nasync function listSessionCleanupCandidates(cwd: string): Promise<SessionCleanupCandidate[]> {\n const dir = getSessionDir(cwd);\n if (!(await pathExists(dir))) {\n return [];\n }\n\n const candidates: SessionCleanupCandidate[] = [];\n for (const entry of await readdir(dir, { withFileTypes: true })) {\n if (!entry.isFile() || !entry.name.endsWith(\".json\")) {\n continue;\n }\n const filePath = path.join(dir, entry.name);\n try {\n const [content, fileStat] = await Promise.all([readTextFile(filePath), stat(filePath)]);\n const session = parseSessionFile(content);\n const activityValue = session?.last_active_at ?? session?.created_at;\n const parsedActivity =\n typeof activityValue === \"string\" ? new Date(activityValue).getTime() : Number.NaN;\n candidates.push({\n filePath,\n content,\n activityTime: Number.isNaN(parsedActivity) ? fileStat.mtimeMs : parsedActivity,\n attached: Boolean(session?.current_task),\n });\n } catch (error) {\n if (!isFileNotFound(error)) {\n throw error;\n }\n }\n }\n return candidates;\n}\n\nasync function unlinkIfUnchanged(candidate: SessionCleanupCandidate): Promise<boolean> {\n try {\n // 删除前复核内容,避免清理扫描之后的并发刷新被旧候选覆盖。\n if ((await readTextFile(candidate.filePath)) !== candidate.content) {\n return false;\n }\n await unlink(candidate.filePath);\n return true;\n } catch (error) {\n if (isFileNotFound(error)) {\n return false;\n }\n throw error;\n }\n}\n\nasync function cleanOrphanAcceptanceSnapshots(cwd: string): Promise<number> {\n const acceptanceDir = path.join(getSessionDir(cwd), \"acceptance\");\n if (!(await pathExists(acceptanceDir))) {\n return 0;\n }\n\n let removed = 0;\n for (const entry of await readdir(acceptanceDir, { withFileTypes: true })) {\n if (!entry.isFile() || !entry.name.endsWith(\".json\")) {\n continue;\n }\n const snapshotPath = path.join(acceptanceDir, entry.name);\n if (!(await isOrphanAcceptanceSnapshot(cwd, snapshotPath, entry.name.slice(0, -5)))) {\n continue;\n }\n try {\n await unlink(snapshotPath);\n removed++;\n } catch (error) {\n if (!isFileNotFound(error)) {\n throw error;\n }\n }\n }\n return removed;\n}\n\nasync function isOrphanAcceptanceSnapshot(\n cwd: string,\n snapshotPath: string,\n taskId: string,\n): Promise<boolean> {\n let taskContent: string;\n try {\n taskContent = await readTextFile(\n path.join(cwd, EASY_CODING_DIR, TASKS_DIR, taskId, \"task.json\"),\n );\n } catch (error) {\n if (isFileNotFound(error)) {\n return true;\n }\n throw error;\n }\n\n let parsedTask: unknown;\n try {\n parsedTask = JSON.parse(taskContent);\n } catch {\n return false;\n }\n if (typeof parsedTask !== \"object\" || parsedTask === null || Array.isArray(parsedTask)) {\n return false;\n }\n const task = parsedTask as TaskJson;\n if (task.status === \"COMPLETE\" || task.status === \"CLOSED\") {\n return true;\n }\n\n const checkpoint = task.quality_checkpoint ?? task.verification_checkpoint;\n return (\n typeof checkpoint?.snapshot_file !== \"string\" ||\n path.resolve(cwd, checkpoint.snapshot_file) !== path.resolve(snapshotPath)\n );\n}\n\nfunction isFileNotFound(error: unknown): boolean {\n return (error as NodeJS.ErrnoException).code === \"ENOENT\";\n}\n","import { execFileSync } from \"node:child_process\";\nimport { cancel, confirm, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { PACKAGE_NAME } from \"../constants/version.js\";\nimport { renderBanner } from \"../ui/banner.js\";\n\nexport interface UpdateOptions {\n tag?: string;\n dryRun?: boolean;\n yes?: boolean;\n}\n\n/**\n * Refresh the globally installed CLI to a published version.\n */\nexport async function update(opts: UpdateOptions): Promise<void> {\n renderBanner();\n\n const tag = opts.tag ?? \"latest\";\n const spec = `${PACKAGE_NAME}@${tag}`;\n\n const plan = [\"update runs one step:\", ` refresh the global CLI: npm install -g ${spec}`].join(\n \"\\n\",\n );\n\n if (opts.dryRun) {\n console.log(plan);\n return;\n }\n\n if (!opts.yes) {\n const confirmed = await confirm({\n message: `Update the global CLI to ${spec}?`,\n initialValue: true,\n });\n if (typeof confirmed === \"symbol\" || !confirmed) {\n cancel(\"Update cancelled.\");\n return;\n }\n }\n\n console.log(chalk.cyan(`→ npm install -g ${spec}`));\n execFileSync(\"npm\", [\"install\", \"-g\", spec], { stdio: \"inherit\" });\n\n outro(chalk.green(\"Global CLI updated.\"));\n}\n","import path from \"node:path\";\nimport { cancel, confirm, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { renderHookCommand } from \"../configurators/shared.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport type { AgentPlatform, PlatformMeta } from \"../types/platform.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { compareVersions } from \"../utils/compare-versions.js\";\nimport {\n migrateBehaviorConfig,\n readConfigYaml,\n updateHarnessVersion,\n updateSupermoduleConfig,\n} from \"../utils/config-yaml.js\";\nimport { pathExists, readTextIfExists } from \"../utils/file-writer.js\";\nimport { ensureEasyCodingSessionsIgnored, ensureHookBytecodeIgnored } from \"../utils/gitignore.js\";\nimport {\n type InstallArtifact,\n extractHookPathFromCommand,\n pruneRetiredManagedFiles,\n readInstallManifest,\n writeInstallManifest,\n} from \"../utils/install-manifest.js\";\nimport { resolvePlatformMeta } from \"../utils/platform-paths.js\";\nimport { runtimeToolUpdates, writeRuntimeScaffold } from \"../utils/runtime-scaffold.js\";\nimport { cleanSessionRuntime } from \"../utils/session.js\";\nimport {\n hasLegacyWorkflowState,\n migrateLegacyWorkflowState,\n setPendingInitSince,\n stripInitTaskProjectPath,\n} from \"../utils/task-json.js\";\nimport { configurePlatformsForDir, refreshSupermoduleParent } from \"./install-harness.js\";\nimport { type CommandTarget, resolveUpgradeTargets } from \"./supermodule-targets.js\";\n\nexport interface UpgradeOptions {\n dryRun?: boolean;\n yes?: boolean;\n}\n\ninterface PendingUpgradeTarget {\n target: CommandTarget;\n config: Awaited<ReturnType<typeof readConfigYaml>>;\n}\n\ninterface ParentTopologyRefresh {\n target: CommandTarget;\n agents: Awaited<ReturnType<typeof readConfigYaml>>[\"agents\"];\n submodulePaths: string[];\n}\n\ninterface ChildTopologyRefresh {\n target: CommandTarget;\n}\n\ninterface ExpectedHookScriptRegistration {\n event: string;\n scriptName: string;\n}\n\ninterface ExpectedHookRegistration {\n event: string;\n command: string;\n}\n\nconst EXPECTED_HOOK_REGISTRATION_SCRIPTS: Record<AgentPlatform, ExpectedHookScriptRegistration[]> =\n {\n \"claude-code\": [\n { event: \"SessionStart\", scriptName: \"session-start.py\" },\n { event: \"UserPromptSubmit\", scriptName: \"inject-workflow-state.py\" },\n { event: \"PreToolUse\", scriptName: \"inject-subagent-context.py\" },\n ],\n codex: [\n { event: \"SessionStart\", scriptName: \"session-start.py\" },\n { event: \"UserPromptSubmit\", scriptName: \"inject-workflow-state.py\" },\n ],\n qoder: [\n { event: \"UserPromptSubmit\", scriptName: \"inject-workflow-state.py\" },\n { event: \"PreToolUse\", scriptName: \"inject-subagent-context.py\" },\n ],\n };\n\nconst MANAGED_HOOK_SCRIPT_NAMES: Record<AgentPlatform, string[]> = {\n \"claude-code\": [\n ...new Set(\n EXPECTED_HOOK_REGISTRATION_SCRIPTS[\"claude-code\"].map(({ scriptName }) => scriptName),\n ),\n ],\n codex: [...new Set(EXPECTED_HOOK_REGISTRATION_SCRIPTS.codex.map(({ scriptName }) => scriptName))],\n // Keep removed registrations recognizable so same-version repair can clean them without a manifest.\n qoder: [\n ...new Set([\n ...EXPECTED_HOOK_REGISTRATION_SCRIPTS.qoder.map(({ scriptName }) => scriptName),\n \"session-start.py\",\n ]),\n ],\n};\n\nexport async function upgrade(opts: UpgradeOptions): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\n const targets = await resolveUpgradeTargets(cwd);\n if (!(await pathExists(targets[0].configPath))) {\n throw new Error(\"No .easy-coding/config.yaml found. Run easy-coding init first.\");\n }\n\n const pending = await resolvePendingUpgradeTargets(targets);\n const parentTopologyRefresh = await resolveParentTopologyRefresh(targets, pending);\n const childTopologyRefreshes = await resolveChildTopologyRefreshes(targets, pending);\n\n if (pending.length === 0 && !parentTopologyRefresh && childTopologyRefreshes.length === 0) {\n outro(chalk.green(`easy-coding harness is already up to date (${VERSION}).`));\n return;\n }\n\n const summary = [\n \"Upgrade targets:\",\n ...(pending.length > 0\n ? pending.map(\n ({ target, config }) =>\n `- ${target.label}: ${String(config.harness_version ?? \"unknown\")} -> ${VERSION}; agents: ${config.agents.join(\", \")}`,\n )\n : [\"- (none)\"]),\n ...(parentTopologyRefresh\n ? [\n \"Supermodule topology refresh:\",\n `- ${parentTopologyRefresh.target.label}: submodules: ${parentTopologyRefresh.submodulePaths.length > 0 ? parentTopologyRefresh.submodulePaths.join(\", \") : \"(none)\"}`,\n ]\n : []),\n ...(childTopologyRefreshes.length > 0\n ? [\n parentTopologyRefresh ? \"\" : \"Supermodule topology refresh:\",\n ...childTopologyRefreshes.map(({ target }) => `- ${target.label}: role: submodule-child`),\n ].filter(Boolean)\n : []),\n \"Will overwrite managed skills, hooks, agents, templates, and generated main-constraint regions.\",\n \"Will remove retired files that still match the previous install manifest and preserve locally modified copies.\",\n \"Will update project-init task to recommend ec-init re-run for version adaptation.\",\n \"Will migrate behavior config to schema 6 while preserving project/session unit test settings and frozen task baselines.\",\n \"Will preserve runtime tools used by active UT/TDD tasks; run upgrade after those tasks finish to refresh the tools.\",\n \"Will prune expired session bindings without explicit unit test settings and orphan acceptance snapshots in each upgraded target while preserving tasks, memory, spec, and project knowledge.\",\n \"Will migrate active REVIEW/VERIFICATION tasks to QUALITY, retire active read-only task types as CLOSED, and preserve their artifacts and history.\",\n \"Will migrate legacy workflow/unit test task metadata; memory content, spec, and project knowledge files remain untouched.\",\n ].join(\"\\n\");\n\n if (opts.dryRun) {\n console.log(summary);\n return;\n }\n\n if (!opts.yes) {\n const shouldUpgrade = await confirm({\n message: \"Apply this harness upgrade?\",\n initialValue: true,\n });\n if (typeof shouldUpgrade === \"symbol\" || !shouldUpgrade) {\n cancel(\"Upgrade cancelled.\");\n return;\n }\n }\n\n for (const { target, config } of pending) {\n const previousManifest = await readInstallManifest(target.dir);\n const sessionCleanup = await cleanSessionRuntime(target.dir, {\n preserveUnitTestSettings: true,\n });\n if (sessionCleanup.sessionsRemoved > 0 || sessionCleanup.acceptanceSnapshotsRemoved > 0) {\n console.log(\n chalk.yellow(\n `${target.label}: session GC removed ${sessionCleanup.sessionsRemoved} session file(s)` +\n ` and ${sessionCleanup.acceptanceSnapshotsRemoved} orphan acceptance snapshot(s).`,\n ),\n );\n }\n const projectId = await writeRuntimeScaffold(target.dir, config.agents, {\n supermodule: target.supermodule,\n });\n const artifacts: InstallArtifact[] = await configurePlatformsForDir(target.dir, config.agents, {\n supermodule: target.boundary,\n projectId,\n });\n const retiredFiles = await pruneRetiredManagedFiles(target.dir, previousManifest, artifacts);\n if (retiredFiles.removed.length > 0 || retiredFiles.preserved.length > 0) {\n console.log(\n chalk.yellow(\n `${target.label}: removed ${retiredFiles.removed.length} retired managed file(s)` +\n ` and preserved ${retiredFiles.preserved.length} locally modified file(s).`,\n ),\n );\n }\n await writeInstallManifest(target.dir, {\n harnessVersion: VERSION,\n agents: config.agents,\n artifacts,\n });\n await ensureEasyCodingSessionsIgnored(target.dir);\n await ensureHookBytecodeIgnored(target.dir);\n await migrateLegacyWorkflowState(target.dir);\n await migrateBehaviorConfig(target.configPath);\n await updateHarnessVersion(target.configPath, VERSION);\n await updateSupermoduleConfig(target.configPath, target.supermodule);\n await setPendingInitSince(target.dir, VERSION);\n await stripInitTaskProjectPath(target.dir);\n }\n\n if (parentTopologyRefresh) {\n await refreshSupermoduleParent(\n parentTopologyRefresh.target.dir,\n parentTopologyRefresh.agents,\n parentTopologyRefresh.submodulePaths,\n );\n }\n\n for (const { target } of childTopologyRefreshes) {\n await updateSupermoduleConfig(target.configPath, target.supermodule);\n }\n\n outro(\n chalk.green(\n pending.length > 0\n ? `easy-coding harness upgraded to ${VERSION}.`\n : \"easy-coding supermodule topology refreshed.\",\n ),\n );\n}\n\nasync function resolvePendingUpgradeTargets(\n targets: CommandTarget[],\n): Promise<PendingUpgradeTarget[]> {\n const pending: PendingUpgradeTarget[] = [];\n for (const target of targets) {\n if (!(await pathExists(target.configPath))) {\n continue;\n }\n const config = await readConfigYaml(target.configPath);\n const installedVersion = String(config.harness_version ?? \"\");\n const hasAgents = Array.isArray(config.agents) && config.agents.length > 0;\n if (!installedVersion || !hasAgents) {\n throw new Error(\n `${target.label} config.yaml is missing required harness fields (harness_version / agents). This project predates the current config layout. Run \\`easy-coding clear\\` then \\`easy-coding init\\` to migrate — your tasks, spec, and memory are preserved.`,\n );\n }\n\n const relation = compareVersions(installedVersion, VERSION);\n if (relation === 1) {\n throw new Error(\n `${target.label} harness version ${installedVersion} is newer than CLI ${VERSION}. Update the CLI first.`,\n );\n }\n if (\n relation === -1 ||\n (relation === 0 &&\n (installedVersion !== VERSION ||\n (await needsHookConfigRefresh(target, config)) ||\n (await hasLegacyWorkflowState(target.dir)) ||\n (await runtimeToolUpdates(target.dir)).length > 0))\n ) {\n pending.push({ target, config });\n }\n }\n\n return pending;\n}\n\nasync function needsHookConfigRefresh(\n target: CommandTarget,\n config: Awaited<ReturnType<typeof readConfigYaml>>,\n): Promise<boolean> {\n const projectId = typeof config.project?.id === \"string\" ? config.project.id.trim() : \"\";\n if (!projectId) {\n return true;\n }\n const manifest = await readInstallManifest(target.dir);\n for (const agent of config.agents) {\n const meta = resolvePlatformMeta(target.dir, agent);\n const configPath = path.join(target.dir, meta.hookConfigFile);\n const content = await readTextIfExists(configPath);\n if (content === null) {\n return true;\n }\n\n let parsed: Record<string, unknown>;\n try {\n parsed = JSON.parse(content) as Record<string, unknown>;\n } catch {\n return true;\n }\n\n const commandsByEvent = collectHookCommandsByEvent(parsed.hooks);\n const actualRegistrations = [...commandsByEvent.entries()].flatMap(([event, commands]) =>\n commands.map((command) => ({ event, command })),\n );\n const expectedRegistrations = expectedHookRegistrations(target.dir, meta, agent, projectId);\n const expectedCommandSet = new Set(\n expectedRegistrations.map((registration) => registration.command),\n );\n if (!hasExpectedHookRegistrations(commandsByEvent, expectedRegistrations)) {\n return true;\n }\n const manifestManagedCommands = new Set(\n manifest?.hook_registrations\n .filter((registration) => registration.platform === agent)\n .map((registration) => registration.command) ?? [],\n );\n if (\n hasUnexpectedManagedHookRegistrations(\n actualRegistrations,\n expectedRegistrations,\n expectedCommandSet,\n target.dir,\n meta,\n agent,\n manifestManagedCommands,\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction expectedHookRegistrations(\n cwd: string,\n meta: PlatformMeta,\n platform: AgentPlatform,\n projectId: string,\n): ExpectedHookRegistration[] {\n return EXPECTED_HOOK_REGISTRATION_SCRIPTS[platform].map(({ event, scriptName }) => ({\n event,\n command: renderHookCommand(cwd, meta.templateContext, scriptName, process.platform, projectId),\n }));\n}\n\nfunction hasExpectedHookRegistrations(\n commandsByEvent: Map<string, string[]>,\n expectedRegistrations: ExpectedHookRegistration[],\n): boolean {\n const actualCounts = countRegistrations(\n [...commandsByEvent.entries()].flatMap(([event, commands]) =>\n commands.map((command) => ({ event, command })),\n ),\n );\n const expectedCounts = countRegistrations(expectedRegistrations);\n return [...expectedCounts.entries()].every(\n ([registrationKey, expectedCount]) => (actualCounts.get(registrationKey) ?? 0) >= expectedCount,\n );\n}\n\nfunction countRegistrations(registrations: ExpectedHookRegistration[]): Map<string, number> {\n const counts = new Map<string, number>();\n for (const registration of registrations) {\n const key = hookRegistrationKey(registration);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n return counts;\n}\n\nfunction hookRegistrationKey(registration: ExpectedHookRegistration): string {\n return `${registration.event}\\0${registration.command}`;\n}\n\nfunction hasUnexpectedManagedHookRegistrations(\n actualRegistrations: ExpectedHookRegistration[],\n expectedRegistrations: ExpectedHookRegistration[],\n expectedCommands: Set<string>,\n cwd: string,\n meta: PlatformMeta,\n platform: AgentPlatform,\n manifestManagedCommands: Set<string>,\n): boolean {\n const remainingExpected = countRegistrations(expectedRegistrations);\n for (const registration of actualRegistrations) {\n const key = hookRegistrationKey(registration);\n const remainingCount = remainingExpected.get(key) ?? 0;\n if (remainingCount > 0) {\n remainingExpected.set(key, remainingCount - 1);\n continue;\n }\n if (\n isManagedHookCommand(\n registration.command,\n expectedCommands,\n cwd,\n meta,\n platform,\n manifestManagedCommands,\n )\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction collectHookCommandsByEvent(hooks: unknown): Map<string, string[]> {\n if (!hooks || typeof hooks !== \"object\" || Array.isArray(hooks)) {\n return new Map();\n }\n\n const commandsByEvent = new Map<string, string[]>();\n for (const [event, value] of Object.entries(hooks)) {\n if (!Array.isArray(value)) {\n continue;\n }\n for (const group of value) {\n if (!group || typeof group !== \"object\") {\n continue;\n }\n const hookItems = (group as { hooks?: unknown }).hooks;\n if (!Array.isArray(hookItems)) {\n continue;\n }\n for (const hook of hookItems) {\n if (!hook || typeof hook !== \"object\") {\n continue;\n }\n const command = (hook as { command?: unknown }).command;\n if (typeof command === \"string\") {\n const eventCommands = commandsByEvent.get(event) ?? [];\n eventCommands.push(command);\n commandsByEvent.set(event, eventCommands);\n }\n }\n }\n }\n return commandsByEvent;\n}\n\nfunction isManagedHookCommand(\n command: string,\n expectedCommands: Set<string>,\n cwd: string,\n meta: PlatformMeta,\n platform: AgentPlatform,\n manifestManagedCommands: Set<string>,\n): boolean {\n if (expectedCommands.has(command)) {\n return true;\n }\n if (manifestManagedCommands.has(command)) {\n return true;\n }\n\n const hookPath = extractHookPathFromCommand(command);\n return hookPath === null ? false : isCurrentProjectManagedHookPath(cwd, hookPath, meta, platform);\n}\n\nfunction isCurrentProjectManagedHookPath(\n cwd: string,\n hookPath: string,\n meta: PlatformMeta,\n platform: AgentPlatform,\n): boolean {\n const normalizedHookPath = normalizePathForHookComparison(hookPath);\n const configDir = normalizePathForHookComparison(meta.templateContext.platform_config_dir);\n\n return MANAGED_HOOK_SCRIPT_NAMES[platform].some((scriptName) => {\n const relativeHookPath = `${configDir}/hooks/${scriptName}`;\n if (normalizedHookPath === relativeHookPath) {\n return true;\n }\n return pathAliases(\n normalizePathForHookComparison(path.resolve(cwd, relativeHookPath)),\n ).includes(normalizedHookPath);\n });\n}\n\nfunction normalizePathForHookComparison(value: string): string {\n return value.replace(/\\\\/g, \"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction pathAliases(value: string): string[] {\n const aliases = new Set([value]);\n if (value.startsWith(\"/private/var/\")) {\n aliases.add(value.replace(/^\\/private\\/var\\//, \"/var/\"));\n } else if (value.startsWith(\"/var/\")) {\n aliases.add(`/private${value}`);\n }\n return [...aliases];\n}\n\nasync function resolveParentTopologyRefresh(\n targets: CommandTarget[],\n pending: PendingUpgradeTarget[],\n): Promise<ParentTopologyRefresh | null> {\n const parent = targets.find(\n (target) => target.label === \".\" && target.supermodule.role === \"super-parent\",\n );\n if (!parent || pending.some(({ target }) => target.label === \".\")) {\n return null;\n }\n if (!(await pathExists(parent.configPath))) {\n return null;\n }\n\n const config = await readConfigYaml(parent.configPath);\n if (!Array.isArray(config.agents) || config.agents.length === 0) {\n return null;\n }\n const submodulePaths = parent.supermodule.submodules ?? [];\n const configuredSubmodules = Array.isArray(config.supermodule?.submodules)\n ? config.supermodule.submodules\n : [];\n const needsRefresh =\n config.supermodule?.role !== \"super-parent\" ||\n !sameStringList(configuredSubmodules, submodulePaths);\n if (!needsRefresh) {\n return null;\n }\n\n return {\n target: parent,\n agents: config.agents,\n submodulePaths,\n };\n}\n\nasync function resolveChildTopologyRefreshes(\n targets: CommandTarget[],\n pending: PendingUpgradeTarget[],\n): Promise<ChildTopologyRefresh[]> {\n const pendingLabels = new Set(pending.map(({ target }) => target.label));\n const refreshes: ChildTopologyRefresh[] = [];\n\n for (const target of targets) {\n if (\n target.supermodule.role !== \"submodule-child\" ||\n pendingLabels.has(target.label) ||\n !(await pathExists(target.configPath))\n ) {\n continue;\n }\n\n const config = await readConfigYaml(target.configPath);\n if (\n config.supermodule?.role === \"submodule-child\" &&\n config.supermodule.parent === target.supermodule.parent\n ) {\n continue;\n }\n\n refreshes.push({ target });\n }\n\n return refreshes;\n}\n\nfunction sameStringList(left: string[], right: string[]): boolean {\n if (left.length !== right.length) {\n return false;\n }\n const sortedLeft = [...left].sort();\n const sortedRight = [...right].sort();\n return sortedLeft.every((value, index) => value === sortedRight[index]);\n}\n"],"mappings":"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","names":["chalk","chalk","readFile","path","config","readFile","config","path","path","readFile","path","configPath","relPath","path","manifestPath","readFile","path","path","path","status","configPath","config","path","fileURLToPath","path","configPath","update","path","path","readdir","stat","path","path","readdir","stat","path","path","path","readdir","path","existsSync","path","existsSync","path","path","readdir","path","path","cancel","multiselect","path","path","path","multiselect","cancel","config","config","chalk","readdir","path","cancel","confirm","outro","chalk","confirm","cancel","outro","chalk","path","config","configPath","plan","shellDoubleQuoteArg","byPath","isInsideDirectory","readdir","path","cancel","confirm","outro","chalk","path","configPath","path","config","readFile","realpath","path","path","realpath","readFile","manifestPath","configPath","path","cancel","confirm","outro","chalk","path","outro","chalk","readdir","path","path","configPath","readdir","standaloneTarget","parentTarget","platforms","outro","chalk","path","toPosixRelative","config","configPath","path","chalk","readdir","stat","unlink","path","path","readdir","path","stat","unlink","configPath","path","config","chalk","cancel","confirm","outro","chalk","confirm","cancel","chalk","outro","path","cancel","confirm","outro","chalk","outro","chalk","config","confirm","cancel","configPath","path","chalk"]}