easy-coding-harness 0.2.1 → 0.3.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/CHANGELOG.md +10 -0
- package/README.md +119 -77
- package/dist/cli.js +39 -8
- package/dist/cli.js.map +1 -1
- package/package.json +9 -1
- package/templates/claude/agents/ec-implementer.md +1 -1
- package/templates/claude/agents/ec-reviewer.md +1 -1
- package/templates/common/skills/ec-analysis/SKILL.md +7 -4
- package/templates/common/skills/ec-implementing/SKILL.md +31 -24
- package/templates/common/skills/ec-memory/SKILL.md +16 -8
- package/templates/common/skills/ec-reviewing/SKILL.md +1 -1
- package/templates/common/skills/ec-workflow/SKILL.md +5 -1
- package/templates/shared-hooks/easy_coding_state.py +95 -1
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/commands/add-agent.ts","../src/configurators/claude.ts","../src/types/platform.ts","../src/utils/install-manifest.ts","../src/constants/paths.ts","../src/utils/file-writer.ts","../src/configurators/shared.ts","../src/utils/marked-region.ts","../src/utils/template-paths.ts","../src/configurators/codex.ts","../src/configurators/qoder.ts","../src/utils/platform-paths.ts","../src/configurators/index.ts","../src/constants/version.ts","../src/ui/banner.ts","../src/utils/config-yaml.ts","../src/utils/gitignore.ts","../src/utils/runtime-scaffold.ts","../src/utils/task-json.ts","../src/commands/platforms.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/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 { 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(\"-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 .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(\"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(\"--dry-run\", \"Preview what would be removed without deleting\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(withErrorHandling(clear));\n\nprogram.parse();\n","import path from \"node:path\";\nimport { outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { CONFIGURATORS } from \"../configurators/index.js\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { addAgentsToConfig, readConfigYaml } from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { ensureEasyCodingSessionsIgnored } 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 { type PlatformOptions, resolvePlatforms } from \"./platforms.js\";\n\nexport async function addAgent(opts: PlatformOptions): 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/config.yaml found. Run easy-coding init first.\");\n }\n\n const config = await readConfigYaml(configPath);\n const platforms = await resolvePlatforms(opts, [\"claude-code\"]);\n const toInstall = platforms.filter((platform) => !config.agents.includes(platform));\n\n if (toInstall.length === 0) {\n outro(chalk.yellow(\"All selected agent platforms are already installed.\"));\n return;\n }\n\n const artifacts: InstallArtifact[] = [];\n for (const platform of toInstall) {\n artifacts.push(...(await CONFIGURATORS[platform](cwd)));\n }\n await writeRuntimeScaffold(cwd, [...config.agents, ...toInstall]);\n await writeInstallManifest(cwd, {\n harnessVersion: VERSION,\n agents: toInstall,\n artifacts,\n mode: \"merge\",\n });\n await ensureEasyCodingSessionsIgnored(cwd);\n await addAgentsToConfig(configPath, toInstall);\n await setPendingInitSince(cwd, VERSION);\n\n outro(chalk.green(`Added agent platforms: ${toInstall.join(\", \")}`));\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 {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\n writeMainConstraint,\n writeSharedHooks,\n writeSkills,\n} from \"./shared.js\";\n\nexport async function configureClaude(cwd: string): Promise<InstallArtifact[]> {\n const platform = \"claude-code\";\n const meta = PLATFORM_META[platform];\n const ctx = meta.templateContext;\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(constraintRegionArtifact(await writeMainConstraint(cwd, platform), platform));\n\n return artifacts;\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}\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 },\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 },\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 },\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 { 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,\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\nfunction extractHookPathFromCommand(command: string): string | null {\n const match = normalizeCommand(command).match(/(?:^|\\s)(\\S+\\/hooks\\/\\S+\\.py)(?:\\s|$)/);\n return match?.[1] ?? null;\n}\n\nfunction byPath<T extends { path: string }>(a: T, b: T): number {\n return a.path.localeCompare(b.path);\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/\";\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 { 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 { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { GENERATED_REGION_END, GENERATED_REGION_START } from \"../constants/paths.js\";\nimport type { AgentPlatform, TemplateContext } from \"../types/platform.js\";\nimport { PLATFORM_META } from \"../types/platform.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 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(cwd: string, platform: AgentPlatform): Promise<string> {\n const meta = PLATFORM_META[platform];\n const ctx = meta.templateContext;\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\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 { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function getTemplateRoot(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, \"../templates\"),\n path.resolve(here, \"../../templates\"),\n path.resolve(process.cwd(), \"src/templates\"),\n path.resolve(process.cwd(), \"templates\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Unable to locate templates directory. Tried: ${candidates.join(\", \")}`);\n }\n return found;\n}\n\nexport function getTemplatePath(...segments: string[]): string {\n return path.join(getTemplateRoot(), ...segments);\n}\n","import path from \"node:path\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport {\n type InstallArtifact,\n constraintRegionArtifact,\n fileArtifact,\n hookRegistrationArtifacts,\n} from \"../utils/install-manifest.js\";\nimport {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\n writeMainConstraint,\n writeSharedHooks,\n writeSkills,\n} from \"./shared.js\";\n\nexport async function configureCodex(cwd: string): Promise<InstallArtifact[]> {\n const platform = \"codex\";\n const meta = PLATFORM_META[platform];\n const ctx = meta.templateContext;\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(constraintRegionArtifact(await writeMainConstraint(cwd, platform), platform));\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 {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\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(cwd: string): Promise<InstallArtifact[]> {\n const platform = \"qoder\";\n const meta = resolvePlatformMeta(cwd, platform);\n const ctx = meta.templateContext;\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(constraintRegionArtifact(await writeMainConstraint(cwd, platform), platform));\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 { InstallArtifact } from \"../utils/install-manifest.js\";\nimport { configureClaude } from \"./claude.js\";\nimport { configureCodex } from \"./codex.js\";\nimport { configureQoder } from \"./qoder.js\";\n\nexport type ConfigureFn = (cwd: string) => Promise<InstallArtifact[]>;\n\nexport const CONFIGURATORS: Record<AgentPlatform, ConfigureFn> = {\n \"claude-code\": configureClaude,\n codex: configureCodex,\n qoder: configureQoder,\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 { readFile } from \"node:fs/promises\";\nimport YAML, { isScalar, isSeq, parseDocument } from \"yaml\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport { writeTextFile } from \"./file-writer.js\";\n\nexport interface EasyCodingConfig {\n version: number;\n harness_version: string;\n agents: AgentPlatform[];\n project: {\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 [key: string]: unknown;\n}\n\nexport function createDefaultConfig(params: {\n projectName: string;\n harnessVersion: string;\n agents: AgentPlatform[];\n}): EasyCodingConfig {\n return {\n version: 1,\n harness_version: params.harnessVersion,\n agents: params.agents,\n project: {\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}\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 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 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","import path from \"node:path\";\nimport { 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","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 { createDefaultConfig, writeConfigYaml } from \"./config-yaml.js\";\nimport { ensureDir, pathExists, readTextFile, writeTextFile } from \"./file-writer.js\";\nimport { getTemplatePath } from \"./template-paths.js\";\n\nexport async function writeRuntimeScaffold(cwd: string, agents: AgentPlatform[]): Promise<void> {\n const easyCodingDir = path.join(cwd, EASY_CODING_DIR);\n await ensureDir(easyCodingDir);\n\n const configPath = path.join(easyCodingDir, CONFIG_FILE);\n if (!(await pathExists(configPath))) {\n const projectName = path.basename(cwd);\n await writeConfigYaml(\n configPath,\n createDefaultConfig({ projectName, harnessVersion: VERSION, agents }),\n );\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}\n\nasync function writeTemplatesScaffold(easyCodingDir: string): Promise<void> {\n const templatesDir = path.join(easyCodingDir, TEMPLATES_DIR);\n await ensureDir(templatesDir);\n\n const src = getTemplatePath(\"runtime\", \"templates\", \"dev-spec-skeleton.md\");\n const dest = path.join(templatesDir, \"dev-spec-skeleton.md\");\n await writeTextFile(dest, await readTextFile(src));\n}\n\nasync function writeMemoryScaffold(easyCodingDir: string): Promise<void> {\n const memoryDir = path.join(easyCodingDir, MEMORY_DIR);\n await ensureDir(path.join(memoryDir, \"short\"));\n await ensureDir(path.join(memoryDir, \"long\"));\n\n for (const file of [\"MEMORY.md\", \"BUSINESS.md\", \"TECHNICAL.md\"]) {\n const destination = path.join(memoryDir, \"long\", file);\n if (await pathExists(destination)) {\n continue;\n }\n const templatePath = getTemplatePath(\"runtime\", \"memory\", \"long\", file);\n await writeTextFile(destination, await readTextFile(templatePath));\n }\n\n const shortTemplateDest = path.join(memoryDir, \"SHORT_MEMORY_TEMPLATE.md\");\n if (!(await pathExists(shortTemplateDest))) {\n const templatePath = getTemplatePath(\"runtime\", \"memory\", \"SHORT_MEMORY_TEMPLATE.md\");\n await writeTextFile(shortTemplateDest, await readTextFile(templatePath));\n }\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { EASY_CODING_DIR, PROJECT_INIT_TASK_ID, TASKS_DIR } 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\nexport function createProjectInitTask(params: {\n cwd: string;\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 project_path: params.cwd,\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 cwd,\n agents,\n initSource: options.initSource,\n legacyAssets: options.legacyAssets,\n legacyMissingHarnessFiles: options.legacyMissingHarnessFiles,\n }),\n );\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 { cancel, confirm, multiselect } from \"@clack/prompts\";\nimport {\n AGENT_PLATFORMS,\n type AgentPlatform,\n PLATFORM_META,\n isAgentPlatform,\n} from \"../types/platform.js\";\n\nexport interface PlatformOptions {\n agent?: string;\n yes?: boolean;\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","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\";\n\nexport interface ClearOptions {\n dryRun?: boolean;\n yes?: boolean;\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\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 easyCodingDir = path.join(cwd, EASY_CODING_DIR);\n if (!(await pathExists(easyCodingDir))) {\n throw new Error(\"No .easy-coding directory found in this project — nothing to clear.\");\n }\n\n const agents = await resolveInstalledAgents(cwd);\n const plan = await buildClearPlan(cwd, agents);\n\n console.log(renderPlan(cwd, agents, plan));\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 await executeClearPlan(plan);\n outro(chalk.green(\"Easy Coding harness removed. Run easy-coding init to reinstall.\"));\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 addHookConfigPrune(\n plan.pruneHookConfigs,\n plan.pruneHookCommands,\n manifestPath(cwd, registration.config_path),\n registration.hook_path ? [registration.hook_path] : [],\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 hookFileNames.map((name) => `${meta.templateContext.platform_config_dir}/hooks/${name}`),\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 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.replace(/\\\\/g, \"/\");\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","import { note, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { CONFIGURATORS } from \"../configurators/index.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { ensureEasyCodingSessionsIgnored } from \"../utils/gitignore.js\";\nimport { type InstallArtifact, writeInstallManifest } from \"../utils/install-manifest.js\";\nimport { detectEasyCodingInstallState } from \"../utils/install-state.js\";\nimport { writeRuntimeScaffold } from \"../utils/runtime-scaffold.js\";\nimport { writeProjectInitTask } from \"../utils/task-json.js\";\nimport { type PlatformOptions, resolvePlatforms } from \"./platforms.js\";\n\nexport async function init(opts: PlatformOptions): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\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 const platforms = await resolvePlatforms(opts, [\"claude-code\"]);\n const artifacts: InstallArtifact[] = [];\n\n for (const platform of platforms) {\n artifacts.push(...(await CONFIGURATORS[platform](cwd)));\n }\n\n await writeRuntimeScaffold(cwd, platforms);\n await writeInstallManifest(cwd, {\n harnessVersion: VERSION,\n agents: platforms,\n artifacts,\n });\n await writeProjectInitTask(cwd, platforms, {\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 await ensureEasyCodingSessionsIgnored(cwd);\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(chalk.green(\"easy-coding harness installed. Open your agent and run ec-init.\"));\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 path from \"node:path\";\nimport { cancel, confirm, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { CONFIGURATORS } from \"../configurators/index.js\";\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, updateHarnessVersion } from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { ensureEasyCodingSessionsIgnored } 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\";\n\nexport interface UpgradeOptions {\n dryRun?: boolean;\n yes?: boolean;\n}\n\nexport async function upgrade(opts: UpgradeOptions): 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/config.yaml found. Run easy-coding init first.\");\n }\n\n const config = await readConfigYaml(configPath);\n\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 \"config.yaml is missing required harness fields (harness_version / agents). \" +\n \"This project predates the current config layout. Run `easy-coding clear` then \" +\n \"`easy-coding init` to migrate — your tasks, spec, and memory are preserved.\",\n );\n }\n\n const relation = compareVersions(installedVersion, VERSION);\n\n if (relation === 0) {\n outro(chalk.green(`easy-coding harness is already up to date (${VERSION}).`));\n return;\n }\n\n if (relation === 1) {\n throw new Error(\n `Project harness version ${installedVersion} is newer than CLI ${VERSION}. Update the CLI first.`,\n );\n }\n\n const summary = [\n `Upgrade: ${installedVersion || \"unknown\"} -> ${VERSION}`,\n `Installed agents: ${config.agents.join(\", \")}`,\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 not touch memory, state, spec, or project knowledge files.\",\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 const artifacts: InstallArtifact[] = [];\n for (const platform of config.agents) {\n artifacts.push(...(await CONFIGURATORS[platform](cwd)));\n }\n await writeRuntimeScaffold(cwd, config.agents);\n await writeInstallManifest(cwd, {\n harnessVersion: VERSION,\n agents: config.agents,\n artifacts,\n });\n await ensureEasyCodingSessionsIgnored(cwd);\n await updateHarnessVersion(configPath, VERSION);\n await setPendingInitSince(cwd, VERSION);\n\n outro(chalk.green(`easy-coding harness upgraded to ${VERSION}.`));\n}\n"],"mappings":"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","names":["chalk","path","chalk","path","readFile","path","relPath","path","manifestPath","readFile","stat","path","path","path","stat","path","path","path","readdir","path","existsSync","path","existsSync","path","path","readdir","path","fileURLToPath","readFile","readFile","path","path","path","path","readdir","path","path","readdir","path","chalk","readdir","path","cancel","confirm","outro","chalk","path","confirm","cancel","outro","chalk","plan","byPath","readdir","outro","chalk","readdir","path","path","readdir","outro","chalk","path","chalk","path","path","readdir","path","path","path","chalk","path","cancel","confirm","outro","chalk","path","outro","chalk","confirm","cancel","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/commands/add-agent.ts","../src/configurators/claude.ts","../src/types/platform.ts","../src/utils/install-manifest.ts","../src/constants/paths.ts","../src/utils/file-writer.ts","../src/configurators/shared.ts","../src/utils/marked-region.ts","../src/utils/template-paths.ts","../src/configurators/codex.ts","../src/configurators/qoder.ts","../src/utils/platform-paths.ts","../src/configurators/index.ts","../src/constants/version.ts","../src/ui/banner.ts","../src/utils/config-yaml.ts","../src/utils/gitignore.ts","../src/utils/runtime-scaffold.ts","../src/utils/task-json.ts","../src/commands/platforms.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(\"-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 .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(\"--dry-run\", \"Preview what would be removed without deleting\")\n .option(\"-y, --yes\", \"Skip confirmation\")\n .action(withErrorHandling(clear));\n\nprogram.parse();\n","import path from \"node:path\";\nimport { outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { CONFIGURATORS } from \"../configurators/index.js\";\nimport { CONFIG_FILE, EASY_CODING_DIR } from \"../constants/paths.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { addAgentsToConfig, readConfigYaml } from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { ensureEasyCodingSessionsIgnored } 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 { type PlatformOptions, resolvePlatforms } from \"./platforms.js\";\n\nexport async function addAgent(opts: PlatformOptions): 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/config.yaml found. Run easy-coding init first.\");\n }\n\n const config = await readConfigYaml(configPath);\n const platforms = await resolvePlatforms(opts, [\"claude-code\"]);\n const toInstall = platforms.filter((platform) => !config.agents.includes(platform));\n\n if (toInstall.length === 0) {\n outro(chalk.yellow(\"All selected agent platforms are already installed.\"));\n return;\n }\n\n const artifacts: InstallArtifact[] = [];\n for (const platform of toInstall) {\n artifacts.push(...(await CONFIGURATORS[platform](cwd)));\n }\n await writeRuntimeScaffold(cwd, [...config.agents, ...toInstall]);\n await writeInstallManifest(cwd, {\n harnessVersion: VERSION,\n agents: toInstall,\n artifacts,\n mode: \"merge\",\n });\n await ensureEasyCodingSessionsIgnored(cwd);\n await addAgentsToConfig(configPath, toInstall);\n await setPendingInitSince(cwd, VERSION);\n\n outro(chalk.green(`Added agent platforms: ${toInstall.join(\", \")}`));\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 {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\n writeMainConstraint,\n writeSharedHooks,\n writeSkills,\n} from \"./shared.js\";\n\nexport async function configureClaude(cwd: string): Promise<InstallArtifact[]> {\n const platform = \"claude-code\";\n const meta = PLATFORM_META[platform];\n const ctx = meta.templateContext;\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(constraintRegionArtifact(await writeMainConstraint(cwd, platform), platform));\n\n return artifacts;\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}\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 },\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 },\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 },\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 { 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,\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\nfunction extractHookPathFromCommand(command: string): string | null {\n const match = normalizeCommand(command).match(/(?:^|\\s)(\\S+\\/hooks\\/\\S+\\.py)(?:\\s|$)/);\n return match?.[1] ?? null;\n}\n\nfunction byPath<T extends { path: string }>(a: T, b: T): number {\n return a.path.localeCompare(b.path);\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/\";\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 { 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 { readdir, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { GENERATED_REGION_END, GENERATED_REGION_START } from \"../constants/paths.js\";\nimport type { AgentPlatform, TemplateContext } from \"../types/platform.js\";\nimport { PLATFORM_META } from \"../types/platform.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 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(cwd: string, platform: AgentPlatform): Promise<string> {\n const meta = PLATFORM_META[platform];\n const ctx = meta.templateContext;\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\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 { existsSync } from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nexport function getTemplateRoot(): string {\n const here = path.dirname(fileURLToPath(import.meta.url));\n const candidates = [\n path.resolve(here, \"../templates\"),\n path.resolve(here, \"../../templates\"),\n path.resolve(process.cwd(), \"src/templates\"),\n path.resolve(process.cwd(), \"templates\"),\n ];\n\n const found = candidates.find((candidate) => existsSync(candidate));\n if (!found) {\n throw new Error(`Unable to locate templates directory. Tried: ${candidates.join(\", \")}`);\n }\n return found;\n}\n\nexport function getTemplatePath(...segments: string[]): string {\n return path.join(getTemplateRoot(), ...segments);\n}\n","import path from \"node:path\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport {\n type InstallArtifact,\n constraintRegionArtifact,\n fileArtifact,\n hookRegistrationArtifacts,\n} from \"../utils/install-manifest.js\";\nimport {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\n writeMainConstraint,\n writeSharedHooks,\n writeSkills,\n} from \"./shared.js\";\n\nexport async function configureCodex(cwd: string): Promise<InstallArtifact[]> {\n const platform = \"codex\";\n const meta = PLATFORM_META[platform];\n const ctx = meta.templateContext;\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(constraintRegionArtifact(await writeMainConstraint(cwd, platform), platform));\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 {\n copyPlatformTemplates,\n resolveBundledSkills,\n resolveSkills,\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(cwd: string): Promise<InstallArtifact[]> {\n const platform = \"qoder\";\n const meta = resolvePlatformMeta(cwd, platform);\n const ctx = meta.templateContext;\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(constraintRegionArtifact(await writeMainConstraint(cwd, platform), platform));\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 { InstallArtifact } from \"../utils/install-manifest.js\";\nimport { configureClaude } from \"./claude.js\";\nimport { configureCodex } from \"./codex.js\";\nimport { configureQoder } from \"./qoder.js\";\n\nexport type ConfigureFn = (cwd: string) => Promise<InstallArtifact[]>;\n\nexport const CONFIGURATORS: Record<AgentPlatform, ConfigureFn> = {\n \"claude-code\": configureClaude,\n codex: configureCodex,\n qoder: configureQoder,\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 { readFile } from \"node:fs/promises\";\nimport YAML, { isScalar, isSeq, parseDocument } from \"yaml\";\nimport type { AgentPlatform } from \"../types/platform.js\";\nimport { writeTextFile } from \"./file-writer.js\";\n\nexport interface EasyCodingConfig {\n version: number;\n harness_version: string;\n agents: AgentPlatform[];\n project: {\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 [key: string]: unknown;\n}\n\nexport function createDefaultConfig(params: {\n projectName: string;\n harnessVersion: string;\n agents: AgentPlatform[];\n}): EasyCodingConfig {\n return {\n version: 1,\n harness_version: params.harnessVersion,\n agents: params.agents,\n project: {\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}\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 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 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","import path from \"node:path\";\nimport { 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","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 { createDefaultConfig, writeConfigYaml } from \"./config-yaml.js\";\nimport { ensureDir, pathExists, readTextFile, writeTextFile } from \"./file-writer.js\";\nimport { getTemplatePath } from \"./template-paths.js\";\n\nexport async function writeRuntimeScaffold(cwd: string, agents: AgentPlatform[]): Promise<void> {\n const easyCodingDir = path.join(cwd, EASY_CODING_DIR);\n await ensureDir(easyCodingDir);\n\n const configPath = path.join(easyCodingDir, CONFIG_FILE);\n if (!(await pathExists(configPath))) {\n const projectName = path.basename(cwd);\n await writeConfigYaml(\n configPath,\n createDefaultConfig({ projectName, harnessVersion: VERSION, agents }),\n );\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}\n\nasync function writeTemplatesScaffold(easyCodingDir: string): Promise<void> {\n const templatesDir = path.join(easyCodingDir, TEMPLATES_DIR);\n await ensureDir(templatesDir);\n\n const src = getTemplatePath(\"runtime\", \"templates\", \"dev-spec-skeleton.md\");\n const dest = path.join(templatesDir, \"dev-spec-skeleton.md\");\n await writeTextFile(dest, await readTextFile(src));\n}\n\nasync function writeMemoryScaffold(easyCodingDir: string): Promise<void> {\n const memoryDir = path.join(easyCodingDir, MEMORY_DIR);\n await ensureDir(path.join(memoryDir, \"short\"));\n await ensureDir(path.join(memoryDir, \"long\"));\n\n for (const file of [\"MEMORY.md\", \"BUSINESS.md\", \"TECHNICAL.md\"]) {\n const destination = path.join(memoryDir, \"long\", file);\n if (await pathExists(destination)) {\n continue;\n }\n const templatePath = getTemplatePath(\"runtime\", \"memory\", \"long\", file);\n await writeTextFile(destination, await readTextFile(templatePath));\n }\n\n const shortTemplateDest = path.join(memoryDir, \"SHORT_MEMORY_TEMPLATE.md\");\n if (!(await pathExists(shortTemplateDest))) {\n const templatePath = getTemplatePath(\"runtime\", \"memory\", \"SHORT_MEMORY_TEMPLATE.md\");\n await writeTextFile(shortTemplateDest, await readTextFile(templatePath));\n }\n}\n","import { readdir } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { EASY_CODING_DIR, PROJECT_INIT_TASK_ID, TASKS_DIR } 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\nexport function createProjectInitTask(params: {\n cwd: string;\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 project_path: params.cwd,\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 cwd,\n agents,\n initSource: options.initSource,\n legacyAssets: options.legacyAssets,\n legacyMissingHarnessFiles: options.legacyMissingHarnessFiles,\n }),\n );\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 { cancel, confirm, multiselect } from \"@clack/prompts\";\nimport {\n AGENT_PLATFORMS,\n type AgentPlatform,\n PLATFORM_META,\n isAgentPlatform,\n} from \"../types/platform.js\";\n\nexport interface PlatformOptions {\n agent?: string;\n yes?: boolean;\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","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\";\n\nexport interface ClearOptions {\n dryRun?: boolean;\n yes?: boolean;\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\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 easyCodingDir = path.join(cwd, EASY_CODING_DIR);\n if (!(await pathExists(easyCodingDir))) {\n throw new Error(\"No .easy-coding directory found in this project — nothing to clear.\");\n }\n\n const agents = await resolveInstalledAgents(cwd);\n const plan = await buildClearPlan(cwd, agents);\n\n console.log(renderPlan(cwd, agents, plan));\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 await executeClearPlan(plan);\n outro(chalk.green(\"Easy Coding harness removed. Run easy-coding init to reinstall.\"));\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 addHookConfigPrune(\n plan.pruneHookConfigs,\n plan.pruneHookCommands,\n manifestPath(cwd, registration.config_path),\n registration.hook_path ? [registration.hook_path] : [],\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 hookFileNames.map((name) => `${meta.templateContext.platform_config_dir}/hooks/${name}`),\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 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.replace(/\\\\/g, \"/\");\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","import { note, outro } from \"@clack/prompts\";\nimport chalk from \"chalk\";\nimport { CONFIGURATORS } from \"../configurators/index.js\";\nimport { VERSION } from \"../constants/version.js\";\nimport { PLATFORM_META } from \"../types/platform.js\";\nimport { renderBanner } from \"../ui/banner.js\";\nimport { ensureEasyCodingSessionsIgnored } from \"../utils/gitignore.js\";\nimport { type InstallArtifact, writeInstallManifest } from \"../utils/install-manifest.js\";\nimport { detectEasyCodingInstallState } from \"../utils/install-state.js\";\nimport { writeRuntimeScaffold } from \"../utils/runtime-scaffold.js\";\nimport { writeProjectInitTask } from \"../utils/task-json.js\";\nimport { type PlatformOptions, resolvePlatforms } from \"./platforms.js\";\n\nexport async function init(opts: PlatformOptions): Promise<void> {\n renderBanner();\n\n const cwd = process.cwd();\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 const platforms = await resolvePlatforms(opts, [\"claude-code\"]);\n const artifacts: InstallArtifact[] = [];\n\n for (const platform of platforms) {\n artifacts.push(...(await CONFIGURATORS[platform](cwd)));\n }\n\n await writeRuntimeScaffold(cwd, platforms);\n await writeInstallManifest(cwd, {\n harnessVersion: VERSION,\n agents: platforms,\n artifacts,\n });\n await writeProjectInitTask(cwd, platforms, {\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 await ensureEasyCodingSessionsIgnored(cwd);\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(chalk.green(\"easy-coding harness installed. Open your agent and run ec-init.\"));\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 { CONFIGURATORS } from \"../configurators/index.js\";\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, updateHarnessVersion } from \"../utils/config-yaml.js\";\nimport { pathExists } from \"../utils/file-writer.js\";\nimport { ensureEasyCodingSessionsIgnored } 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\";\n\nexport interface UpgradeOptions {\n dryRun?: boolean;\n yes?: boolean;\n}\n\nexport async function upgrade(opts: UpgradeOptions): 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/config.yaml found. Run easy-coding init first.\");\n }\n\n const config = await readConfigYaml(configPath);\n\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 \"config.yaml is missing required harness fields (harness_version / agents). \" +\n \"This project predates the current config layout. Run `easy-coding clear` then \" +\n \"`easy-coding init` to migrate — your tasks, spec, and memory are preserved.\",\n );\n }\n\n const relation = compareVersions(installedVersion, VERSION);\n\n if (relation === 0) {\n outro(chalk.green(`easy-coding harness is already up to date (${VERSION}).`));\n return;\n }\n\n if (relation === 1) {\n throw new Error(\n `Project harness version ${installedVersion} is newer than CLI ${VERSION}. Update the CLI first.`,\n );\n }\n\n const summary = [\n `Upgrade: ${installedVersion || \"unknown\"} -> ${VERSION}`,\n `Installed agents: ${config.agents.join(\", \")}`,\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 not touch memory, state, spec, or project knowledge files.\",\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 const artifacts: InstallArtifact[] = [];\n for (const platform of config.agents) {\n artifacts.push(...(await CONFIGURATORS[platform](cwd)));\n }\n await writeRuntimeScaffold(cwd, config.agents);\n await writeInstallManifest(cwd, {\n harnessVersion: VERSION,\n agents: config.agents,\n artifacts,\n });\n await ensureEasyCodingSessionsIgnored(cwd);\n await updateHarnessVersion(configPath, VERSION);\n await setPendingInitSince(cwd, VERSION);\n\n outro(chalk.green(`easy-coding harness upgraded to ${VERSION}.`));\n}\n"],"mappings":"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","names":["chalk","path","chalk","path","readFile","path","relPath","path","manifestPath","readFile","stat","path","path","path","stat","path","path","path","readdir","path","existsSync","path","existsSync","path","path","readdir","path","fileURLToPath","readFile","readFile","path","path","path","path","readdir","path","path","readdir","path","chalk","readdir","path","cancel","confirm","outro","chalk","path","confirm","cancel","outro","chalk","plan","byPath","readdir","outro","chalk","readdir","path","path","readdir","outro","chalk","path","chalk","path","path","readdir","path","path","path","chalk","cancel","confirm","outro","chalk","confirm","cancel","chalk","outro","path","cancel","confirm","outro","chalk","path","outro","chalk","confirm","cancel","chalk"]}
|