easy-coding-harness 0.6.0 → 0.7.0

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/init.ts","../src/utils/install-state.ts","../src/commands/status.ts","../src/utils/compare-versions.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 { 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(\"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 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 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 strict_confirm: boolean;\n auto_mode: boolean;\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: 1,\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 strict_confirm: true,\n auto_mode: false,\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 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\";\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 } 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 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 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 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 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: [\"UserPromptSubmit\"],\n stateInjectEvent: [\"UserPromptSubmit\"],\n hasSubagentContext: false,\n templateContext: {\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 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} 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 return projectId;\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 } from \"../types/task.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\";\n\nconst LEGACY_STAGE_MAP: Record<LegacyStage, Stage> = {\n WAITING_CONFIRM: \"ANALYSIS\",\n MEMORY_SHORT: \"MEMORY\",\n MEMORY_LONG: \"MEMORY\",\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(task: TaskJson, stage: Stage, agent: string): 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\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 = migrateStageHistory(task);\n\n if (legacyStatus) {\n task.status = LEGACY_STAGE_MAP[legacyStatus];\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: String(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 return changed;\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 isLegacyStage(task.status) ||\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 (isLegacyStage(session.last_seen_stage)) return true;\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\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 }\n\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 if (mappedStage === session.last_seen_stage) continue;\n session.last_seen_stage = mappedStage;\n await writeTextFile(filePath, JSON.stringify(session, null, 2));\n sessionsUpdated += 1;\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} 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, 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 { 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 { readConfigYaml } from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { readSessionFile } from \"../utils/session.js\";\nimport {\n getTaskJsonPath,\n isActiveTask,\n listTasks,\n readTaskJson,\n summarizeTaskStatuses,\n} from \"../utils/task-json.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 session = await readSessionFile(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) {\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 console.log(\"\");\n console.log(chalk.bold(\"Session\"));\n if (session?.current_task) {\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(` last_agent: ${task.last_agent}`);\n } else {\n console.log(` current_task: ${session.current_task} (task.json missing)`);\n }\n } else {\n console.log(\" no active session\");\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 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\nfunction normalize(version: string): number[] {\n const [core] = String(version ?? \"\").split(\"-\");\n return core.split(\".\").map((part) => {\n const parsed = Number.parseInt(part, 10);\n return Number.isNaN(parsed) ? 0 : parsed;\n });\n}\n\nexport function compareVersions(a: string, b: string): VersionComparison {\n const left = normalize(a);\n const right = normalize(b);\n const length = Math.max(left.length, right.length);\n\n for (let index = 0; index < length; index += 1) {\n const leftPart = left[index] ?? 0;\n const rightPart = right[index] ?? 0;\n if (leftPart < rightPart) return -1;\n if (leftPart > rightPart) return 1;\n }\n return 0;\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 { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { EASY_CODING_DIR, SESSIONS_DIR } from \"../constants/paths.js\";\nimport type { SessionFile } from \"../types/task.js\";\nimport { ensureDir, pathExists, readTextIfExists, writeTextFile } from \"./file-writer.js\";\n\nconst STALE_THRESHOLD_MS = 24 * 60 * 60 * 1000;\n\nexport function getSessionDir(cwd: string): string {\n return path.join(cwd, EASY_CODING_DIR, SESSIONS_DIR);\n}\n\nexport function getSessionFilePath(cwd: string, ppid?: number): string {\n const pid = ppid ?? process.ppid;\n return path.join(getSessionDir(cwd), `${pid}.json`);\n}\n\nexport function createSessionFile(currentTask: string | null = null): SessionFile {\n return {\n current_task: currentTask,\n created_at: new Date().toISOString(),\n };\n}\n\nexport async function readSessionFile(cwd: string, ppid?: number): Promise<SessionFile | null> {\n const content = await readTextIfExists(getSessionFilePath(cwd, ppid));\n if (!content) {\n return null;\n }\n return JSON.parse(content) as SessionFile;\n}\n\nexport async function writeSessionFile(\n cwd: string,\n session: SessionFile,\n ppid?: number,\n): Promise<void> {\n const dir = getSessionDir(cwd);\n await ensureDir(dir);\n await writeTextFile(getSessionFilePath(cwd, ppid), JSON.stringify(session, null, 2));\n}\n\nexport async function ensureSessionFile(cwd: string): Promise<SessionFile> {\n const existing = await readSessionFile(cwd);\n if (existing) {\n return existing;\n }\n const session = createSessionFile();\n await writeSessionFile(cwd, session);\n return session;\n}\n\nexport async function cleanStaleSessions(cwd: string): Promise<number> {\n const dir = getSessionDir(cwd);\n if (!(await pathExists(dir))) {\n return 0;\n }\n\n const now = Date.now();\n const entries = await readdir(dir);\n let cleaned = 0;\n\n for (const entry of entries) {\n if (!entry.endsWith(\".json\")) {\n continue;\n }\n\n const filePath = path.join(dir, entry);\n const content = await readTextIfExists(filePath);\n if (!content) {\n continue;\n }\n\n let session: SessionFile;\n try {\n session = JSON.parse(content) as SessionFile;\n } catch {\n continue;\n }\n\n const age = now - new Date(session.created_at).getTime();\n if (age <= STALE_THRESHOLD_MS) {\n continue;\n }\n\n const pid = Number.parseInt(entry.replace(\".json\", \"\"), 10);\n if (Number.isNaN(pid)) {\n continue;\n }\n\n if (isProcessAlive(pid)) {\n continue;\n }\n\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(filePath);\n cleaned++;\n }\n\n return cleaned;\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\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 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 readInstallManifest,\n writeInstallManifest,\n} from \"../utils/install-manifest.js\";\nimport { resolvePlatformMeta } from \"../utils/platform-paths.js\";\nimport { writeRuntimeScaffold } from \"../utils/runtime-scaffold.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: \"session-start.py\" },\n { event: \"UserPromptSubmit\", scriptName: \"inject-workflow-state.py\" },\n { event: \"PreToolUse\", scriptName: \"inject-subagent-context.py\" },\n ],\n codex: [\n { event: \"UserPromptSubmit\", scriptName: \"session-start.py\" },\n { event: \"UserPromptSubmit\", scriptName: \"inject-workflow-state.py\" },\n ],\n qoder: [\n { event: \"UserPromptSubmit\", scriptName: \"session-start.py\" },\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 qoder: [...new Set(EXPECTED_HOOK_REGISTRATION_SCRIPTS.qoder.map(({ scriptName }) => scriptName))],\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 update project-init task to recommend ec-init re-run for version adaptation.\",\n \"Will migrate legacy workflow stage 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 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 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 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 ((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 commands = [...commandsByEvent.values()].flat();\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 commands.some((command) =>\n isUnexpectedManagedHookCommand(\n command,\n expectedCommandSet,\n target.dir,\n meta,\n agent,\n manifestManagedCommands,\n ),\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 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 isUnexpectedManagedHookCommand(\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 false;\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","readFile","path","path","readFile","path","configPath","relPath","path","manifestPath","readFile","path","path","fileURLToPath","path","configPath","path","path","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","chalk","readdir","path","cancel","confirm","outro","chalk","confirm","cancel","outro","chalk","path","configPath","plan","shellDoubleQuoteArg","byPath","isInsideDirectory","readdir","path","outro","chalk","readdir","path","path","configPath","readdir","standaloneTarget","parentTarget","platforms","outro","chalk","path","toPosixRelative","configPath","path","chalk","path","configPath","path","readdir","path","path","configPath","path","chalk","cancel","confirm","outro","chalk","confirm","cancel","chalk","outro","path","cancel","confirm","outro","chalk","outro","chalk","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/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/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 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 = 2;\nexport const CONFIRM_MODES = [\"approve\", \"guard\", \"auto\"] as const;\nexport type ConfirmMode = (typeof CONFIRM_MODES)[number];\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 confirm_mode: ConfirmMode;\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 confirm_mode: \"guard\",\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 isConfirmMode(value: unknown): value is ConfirmMode {\n return typeof value === \"string\" && CONFIRM_MODES.includes(value as ConfirmMode);\n}\n\nexport function resolveLegacyConfirmMode(config: EasyCodingConfig): ConfirmMode {\n // 旧布尔值只在 CLI 迁移写入时读取;安装后的运行时只消费 confirm_mode。\n const behavior = (config.behavior ?? {}) as unknown as Record<string, unknown>;\n if (isConfirmMode(behavior.confirm_mode)) {\n return behavior.confirm_mode;\n }\n if (behavior.auto_mode === true) {\n return \"auto\";\n }\n if (behavior.strict_confirm === true) {\n return \"approve\";\n }\n return \"guard\";\n}\n\nexport async function setConfirmMode(\n filePath: string,\n mode: ConfirmMode,\n): Promise<EasyCodingConfig> {\n return updateConfigYaml(filePath, (config) => {\n const legacyBehavior = (config.behavior ?? {}) as unknown as Record<string, unknown>;\n const behavior = Object.fromEntries(\n Object.entries(legacyBehavior).filter(\n ([key]) => key !== \"strict_confirm\" && key !== \"auto_mode\",\n ),\n );\n behavior.confirm_mode = mode;\n config.behavior = behavior as EasyCodingConfig[\"behavior\"];\n config.version = CONFIG_SCHEMA_VERSION;\n });\n}\n\nexport async function migrateConfirmModeConfig(filePath: string): Promise<EasyCodingConfig> {\n const config = await readConfigYaml(filePath);\n return setConfirmMode(filePath, resolveLegacyConfirmMode(config));\n}\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\";\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 } 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 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 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 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 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: [\"UserPromptSubmit\"],\n stateInjectEvent: [\"UserPromptSubmit\"],\n hasSubagentContext: false,\n templateContext: {\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 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} 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 return projectId;\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 } from \"../types/task.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\";\n\nconst LEGACY_STAGE_MAP: Record<LegacyStage, Stage> = {\n WAITING_CONFIRM: \"ANALYSIS\",\n MEMORY_SHORT: \"MEMORY\",\n MEMORY_LONG: \"MEMORY\",\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(task: TaskJson, stage: Stage, agent: string): 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\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 = migrateStageHistory(task);\n\n if (legacyStatus) {\n task.status = LEGACY_STAGE_MAP[legacyStatus];\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: String(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 return changed;\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 isLegacyStage(task.status) ||\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 (isLegacyStage(session.last_seen_stage)) return true;\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\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 }\n\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 if (mappedStage === session.last_seen_stage) continue;\n session.last_seen_stage = mappedStage;\n await writeTextFile(filePath, JSON.stringify(session, null, 2));\n sessionsUpdated += 1;\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} 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, 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 } 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 ConfirmMode,\n readConfigYaml,\n resolveLegacyConfirmMode,\n setConfirmMode,\n} from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.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 = resolveLegacyConfirmMode(projectConfig);\n const selected = await select<ConfirmMode>({\n message: `Select project confirm mode (current: ${current})`,\n initialValue: current,\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 VERIFICATION -> MEMORY\",\n },\n {\n value: \"auto\",\n label: \"auto — advance workflow stages automatically\",\n hint: \"task closure remains explicit\",\n },\n ],\n });\n if (typeof selected === \"symbol\") {\n cancel(\"Configuration cancelled.\");\n return;\n }\n\n const shouldSave = await confirm({\n message: `Set behavior.confirm_mode to ${selected}?`,\n initialValue: true,\n });\n if (typeof shouldSave === \"symbol\" || !shouldSave) {\n cancel(\"Configuration cancelled.\");\n return;\n }\n\n await setConfirmMode(configPath, selected);\n outro(chalk.green(`Project confirm mode updated to ${selected}.`));\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 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 { isConfirmMode, readConfigYaml } from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { readSessionFile } from \"../utils/session.js\";\nimport {\n getTaskJsonPath,\n isActiveTask,\n listTasks,\n readTaskJson,\n summarizeTaskStatuses,\n} from \"../utils/task-json.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 session = await readSessionFile(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 projectConfirmMode = isConfirmMode(config.behavior?.confirm_mode)\n ? config.behavior.confirm_mode\n : \"guard\";\n console.log(` confirm_mode: ${projectConfirmMode}`);\n console.log(\"\");\n console.log(chalk.bold(\"Session\"));\n const sessionConfirmMode = session?.confirm_mode;\n console.log(` confirm_mode: ${sessionConfirmMode ?? \"project default\"}`);\n console.log(` effective_confirm_mode: ${sessionConfirmMode ?? projectConfirmMode}`);\n console.log(` harness: ${session?.harness_disabled ? \"disabled for this session\" : \"enabled\"}`);\n if (session?.current_task) {\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(` last_agent: ${task.last_agent}`);\n } else {\n console.log(` current_task: ${session.current_task} (task.json missing)`);\n }\n } else {\n console.log(\" no active session\");\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 } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { EASY_CODING_DIR, SESSIONS_DIR } from \"../constants/paths.js\";\nimport type { SessionFile } from \"../types/task.js\";\nimport { ensureDir, pathExists, readTextIfExists, writeTextFile } from \"./file-writer.js\";\n\nconst STALE_THRESHOLD_MS = 24 * 60 * 60 * 1000;\n\nexport function getSessionDir(cwd: string): string {\n return path.join(cwd, EASY_CODING_DIR, SESSIONS_DIR);\n}\n\nexport function getSessionFilePath(cwd: string, ppid?: number): string {\n const pid = ppid ?? process.ppid;\n return path.join(getSessionDir(cwd), `${pid}.json`);\n}\n\nexport function createSessionFile(currentTask: string | null = null): SessionFile {\n return {\n current_task: currentTask,\n created_at: new Date().toISOString(),\n };\n}\n\nexport async function readSessionFile(cwd: string, ppid?: number): Promise<SessionFile | null> {\n const content = await readTextIfExists(getSessionFilePath(cwd, ppid));\n if (!content) {\n return null;\n }\n return JSON.parse(content) as SessionFile;\n}\n\nexport async function writeSessionFile(\n cwd: string,\n session: SessionFile,\n ppid?: number,\n): Promise<void> {\n const dir = getSessionDir(cwd);\n await ensureDir(dir);\n await writeTextFile(getSessionFilePath(cwd, ppid), JSON.stringify(session, null, 2));\n}\n\nexport async function ensureSessionFile(cwd: string): Promise<SessionFile> {\n const existing = await readSessionFile(cwd);\n if (existing) {\n return existing;\n }\n const session = createSessionFile();\n await writeSessionFile(cwd, session);\n return session;\n}\n\nexport async function cleanStaleSessions(cwd: string): Promise<number> {\n const dir = getSessionDir(cwd);\n if (!(await pathExists(dir))) {\n return 0;\n }\n\n const now = Date.now();\n const entries = await readdir(dir);\n let cleaned = 0;\n\n for (const entry of entries) {\n if (!entry.endsWith(\".json\")) {\n continue;\n }\n\n const filePath = path.join(dir, entry);\n const content = await readTextIfExists(filePath);\n if (!content) {\n continue;\n }\n\n let session: SessionFile;\n try {\n session = JSON.parse(content) as SessionFile;\n } catch {\n continue;\n }\n\n const age = now - new Date(session.created_at).getTime();\n if (age <= STALE_THRESHOLD_MS) {\n continue;\n }\n\n const pid = Number.parseInt(entry.replace(\".json\", \"\"), 10);\n if (Number.isNaN(pid)) {\n continue;\n }\n\n if (isProcessAlive(pid)) {\n continue;\n }\n\n const { unlink } = await import(\"node:fs/promises\");\n await unlink(filePath);\n cleaned++;\n }\n\n return cleaned;\n}\n\nfunction isProcessAlive(pid: number): boolean {\n try {\n process.kill(pid, 0);\n return true;\n } catch {\n return false;\n }\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 migrateConfirmModeConfig,\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 readInstallManifest,\n writeInstallManifest,\n} from \"../utils/install-manifest.js\";\nimport { resolvePlatformMeta } from \"../utils/platform-paths.js\";\nimport { writeRuntimeScaffold } from \"../utils/runtime-scaffold.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: \"session-start.py\" },\n { event: \"UserPromptSubmit\", scriptName: \"inject-workflow-state.py\" },\n { event: \"PreToolUse\", scriptName: \"inject-subagent-context.py\" },\n ],\n codex: [\n { event: \"UserPromptSubmit\", scriptName: \"session-start.py\" },\n { event: \"UserPromptSubmit\", scriptName: \"inject-workflow-state.py\" },\n ],\n qoder: [\n { event: \"UserPromptSubmit\", scriptName: \"session-start.py\" },\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 qoder: [...new Set(EXPECTED_HOOK_REGISTRATION_SCRIPTS.qoder.map(({ scriptName }) => scriptName))],\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 update project-init task to recommend ec-init re-run for version adaptation.\",\n \"Will migrate behavior.strict_confirm/auto_mode to behavior.confirm_mode and remove the old keys.\",\n \"Will migrate legacy workflow stage 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 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 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 migrateConfirmModeConfig(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 commands = [...commandsByEvent.values()].flat();\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 commands.some((command) =>\n isUnexpectedManagedHookCommand(\n command,\n expectedCommandSet,\n target.dir,\n meta,\n agent,\n manifestManagedCommands,\n ),\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 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 isUnexpectedManagedHookCommand(\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 false;\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","path","path","readFile","path","configPath","relPath","path","manifestPath","readFile","path","path","fileURLToPath","path","configPath","path","path","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","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","path","path","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"]}