cc-agent-harness 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +236 -0
  3. package/README.zh-CN.md +236 -0
  4. package/dist/chunk-3P72TGGQ.js +82 -0
  5. package/dist/chunk-3P72TGGQ.js.map +1 -0
  6. package/dist/chunk-JKJ3FP6T.js +51 -0
  7. package/dist/chunk-JKJ3FP6T.js.map +1 -0
  8. package/dist/chunk-LOE6IDTT.js +65 -0
  9. package/dist/chunk-LOE6IDTT.js.map +1 -0
  10. package/dist/chunk-PQWK2OBN.js +18 -0
  11. package/dist/chunk-PQWK2OBN.js.map +1 -0
  12. package/dist/chunk-R6VGYQOH.js +771 -0
  13. package/dist/chunk-R6VGYQOH.js.map +1 -0
  14. package/dist/config-PUMLWJWT.js +46 -0
  15. package/dist/config-PUMLWJWT.js.map +1 -0
  16. package/dist/context-SRWWNVTI.js +33 -0
  17. package/dist/context-SRWWNVTI.js.map +1 -0
  18. package/dist/doctor-TYLZH27K.js +199 -0
  19. package/dist/doctor-TYLZH27K.js.map +1 -0
  20. package/dist/harness.js +62 -0
  21. package/dist/harness.js.map +1 -0
  22. package/dist/index.d.ts +846 -0
  23. package/dist/index.js +1181 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/list-ABNY2TO7.js +124 -0
  26. package/dist/list-ABNY2TO7.js.map +1 -0
  27. package/dist/loader-RDQZFHOB.js +19 -0
  28. package/dist/loader-RDQZFHOB.js.map +1 -0
  29. package/dist/run-I5GVJH3N.js +45 -0
  30. package/dist/run-I5GVJH3N.js.map +1 -0
  31. package/dist/scaffold-C6JA3STC.js +98 -0
  32. package/dist/scaffold-C6JA3STC.js.map +1 -0
  33. package/dist/schema-AHX7LXUQ.js +27 -0
  34. package/dist/schema-AHX7LXUQ.js.map +1 -0
  35. package/dist/setup-CWDCKM34.js +115 -0
  36. package/dist/setup-CWDCKM34.js.map +1 -0
  37. package/dist/update-CTPDQCLU.js +87 -0
  38. package/dist/update-CTPDQCLU.js.map +1 -0
  39. package/dist/verify-NI3VCE2H.js +136 -0
  40. package/dist/verify-NI3VCE2H.js.map +1 -0
  41. package/package.json +61 -0
  42. package/templates/agents-md/full.md.tmpl +98 -0
  43. package/templates/agents-md/minimal.md.tmpl +20 -0
  44. package/templates/agents-md/standard.md.tmpl +43 -0
  45. package/templates/configs/harness.config.yaml.tmpl +28 -0
  46. package/templates/skills/basic/SKILL.md.tmpl +14 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/config/loader.ts","../src/config/schema.ts","../src/config/defaults.ts","../src/agent/registry.ts","../src/agent/router.ts","../src/adapter/rust.ts","../src/adapter/typescript.ts","../src/adapter/python.ts","../src/adapter/registry.ts","../src/adapter/detector.ts","../src/skill/manager.ts","../src/skill/validator.ts","../src/skill/scaffold.ts","../src/template/engine.ts","../src/health/checker.ts","../src/template/renderer.ts","../src/audit/logger.ts","../src/context/pipeline.ts","../src/plugin/registry.ts","../src/feature/registry.ts","../src/hook/discovery.ts","../src/hook/dispatcher.ts","../src/runtime/harness.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { resolve, join } from \"node:path\";\nimport { homedir } from \"node:os\";\nimport { parse as parseYaml } from \"yaml\";\nimport { harnessConfigSchema, type HarnessConfig } from \"./schema.js\";\n\nexport type { HarnessConfig };\n\nconst PROJECT_CONFIG_PATH = \".harness/harness.config.yaml\";\nconst USER_CONFIG_PATH = \".harness/config.yaml\";\n\nexport interface ConfigLayer {\n name: string;\n path: string;\n data: Record<string, unknown> | null;\n}\n\nexport interface LoadConfigOptions {\n cwd?: string;\n extraLayers?: ConfigLayer[];\n}\n\nexport interface LoadConfigResult {\n config: HarnessConfig;\n layers: ConfigLayer[];\n}\n\nasync function readYamlFile(path: string): Promise<Record<string, unknown> | null> {\n if (!existsSync(path)) return null;\n const content = await readFile(path, \"utf-8\");\n return (parseYaml(content) as Record<string, unknown>) ?? null;\n}\n\nfunction deepMerge(\n base: Record<string, unknown>,\n override: Record<string, unknown>,\n): Record<string, unknown> {\n const result = { ...base };\n for (const key of Object.keys(override)) {\n const bVal = base[key];\n const oVal = override[key];\n if (\n bVal &&\n oVal &&\n typeof bVal === \"object\" &&\n typeof oVal === \"object\" &&\n !Array.isArray(bVal) &&\n !Array.isArray(oVal)\n ) {\n result[key] = deepMerge(\n bVal as Record<string, unknown>,\n oVal as Record<string, unknown>,\n );\n } else {\n result[key] = oVal;\n }\n }\n return result;\n}\n\n/**\n * Load harness configuration with N-layer merge and source tracking.\n *\n * Default layer order (lowest to highest priority):\n * 1. Built-in defaults (via Zod schema defaults)\n * 2. User-level (~/.harness/config.yaml)\n * 3. Project-level (.harness/harness.config.yaml)\n * 4. Extra layers (programmatic overrides)\n */\nexport async function loadConfig(opts?: LoadConfigOptions): Promise<HarnessConfig> {\n const result = await loadConfigWithLayers(opts);\n return result.config;\n}\n\nexport async function loadConfigWithLayers(opts?: LoadConfigOptions): Promise<LoadConfigResult> {\n const cwd = opts?.cwd ?? process.cwd();\n\n const layers: ConfigLayer[] = [];\n\n const userPath = join(homedir(), USER_CONFIG_PATH);\n const userData = await readYamlFile(userPath);\n layers.push({ name: \"user\", path: userPath, data: userData });\n\n const projectPath = resolve(cwd, PROJECT_CONFIG_PATH);\n const projectData = await readYamlFile(projectPath);\n layers.push({ name: \"project\", path: projectPath, data: projectData });\n\n if (opts?.extraLayers) {\n layers.push(...opts.extraLayers);\n }\n\n let merged: Record<string, unknown> = {};\n for (const layer of layers) {\n if (layer.data) {\n merged = deepMerge(merged, layer.data);\n }\n }\n\n const config = harnessConfigSchema.parse(merged);\n return { config, layers };\n}\n\nexport function configExists(cwd?: string): boolean {\n return anyConfigExists(cwd);\n}\n\nexport function projectConfigExists(cwd?: string): boolean {\n const dir = cwd ?? process.cwd();\n return existsSync(resolve(dir, PROJECT_CONFIG_PATH));\n}\n\nexport function userConfigExists(): boolean {\n return existsSync(join(homedir(), USER_CONFIG_PATH));\n}\n\nexport function anyConfigExists(cwd?: string): boolean {\n return projectConfigExists(cwd) || userConfigExists();\n}\n","import { z } from \"zod\";\n\nexport const modelTierSchema = z.enum([\"low\", \"medium\", \"high\"]);\n\nexport const agentDefinitionSchema = z.object({\n name: z.string(),\n domain: z.string(),\n tier: modelTierSchema,\n description: z.string().optional(),\n});\n\nexport const providerMappingSchema = z.record(z.string()).default({});\n\nexport const agentsConfigSchema = z.object({\n delegation_first: z.boolean().default(true),\n model_routing: z\n .object({\n low: modelTierSchema.default(\"low\"),\n medium: modelTierSchema.default(\"medium\"),\n high: modelTierSchema.default(\"high\"),\n })\n .default({}),\n providers: providerMappingSchema,\n definitions: z.array(agentDefinitionSchema).default([]),\n});\n\nexport const skillsConfigSchema = z.object({\n directories: z.array(z.string()).default([\".harness/skills\"]),\n auto_detect: z.boolean().default(true),\n});\n\nexport const verificationStageSchema = z.object({\n name: z.string(),\n command: z.string().optional(),\n fail_fast: z.boolean().default(true),\n});\n\nexport const verificationConfigSchema = z.object({\n checks: z.array(z.string()).default([\"build\", \"test\", \"lint\"]),\n pipeline: z.array(verificationStageSchema).optional(),\n fail_fast: z.boolean().default(true),\n});\n\nexport const workflowsConfigSchema = z.object({\n commands: z.record(z.string(), z.string()).default({}),\n verification: verificationConfigSchema.default({}),\n});\n\nexport const templatesConfigSchema = z.object({\n agents_md: z\n .object({\n variant: z.enum([\"minimal\", \"standard\", \"full\"]).default(\"standard\"),\n custom_rules: z.array(z.string()).default([]),\n })\n .default({}),\n});\n\nexport const projectConfigSchema = z.object({\n name: z.string(),\n language: z.enum([\"rust\", \"typescript\", \"python\", \"multi\"]).default(\"typescript\"),\n description: z.string().default(\"\"),\n});\n\nexport const featuresConfigSchema = z.record(z.string(), z.boolean()).default({});\n\nexport const harnessConfigSchema = z.object({\n project: projectConfigSchema,\n agents: agentsConfigSchema.default({}),\n skills: skillsConfigSchema.default({}),\n workflows: workflowsConfigSchema.default({}),\n templates: templatesConfigSchema.default({}),\n features: featuresConfigSchema,\n});\n\nexport type HarnessConfig = z.infer<typeof harnessConfigSchema>;\nexport type AgentDefinition = z.infer<typeof agentDefinitionSchema>;\nexport type ModelTier = z.infer<typeof modelTierSchema>;\n","import type { AgentDefinition } from \"./schema.js\";\n\nexport const BUILT_IN_AGENTS: AgentDefinition[] = [\n { name: \"architect-low\", domain: \"analysis\", tier: \"low\" },\n { name: \"architect-medium\", domain: \"analysis\", tier: \"medium\" },\n { name: \"architect\", domain: \"analysis\", tier: \"high\" },\n { name: \"executor-low\", domain: \"execution\", tier: \"low\" },\n { name: \"executor\", domain: \"execution\", tier: \"medium\" },\n { name: \"executor-high\", domain: \"execution\", tier: \"high\" },\n { name: \"explore\", domain: \"search\", tier: \"low\" },\n { name: \"explore-medium\", domain: \"search\", tier: \"medium\" },\n { name: \"explore-high\", domain: \"search\", tier: \"high\" },\n { name: \"researcher-low\", domain: \"research\", tier: \"low\" },\n { name: \"researcher\", domain: \"research\", tier: \"medium\" },\n { name: \"designer-low\", domain: \"frontend\", tier: \"low\" },\n { name: \"designer\", domain: \"frontend\", tier: \"medium\" },\n { name: \"designer-high\", domain: \"frontend\", tier: \"high\" },\n { name: \"writer\", domain: \"docs\", tier: \"low\" },\n { name: \"vision\", domain: \"visual\", tier: \"medium\" },\n { name: \"planner\", domain: \"planning\", tier: \"high\" },\n { name: \"critic\", domain: \"critique\", tier: \"high\" },\n { name: \"analyst\", domain: \"pre-planning\", tier: \"high\" },\n { name: \"qa-tester\", domain: \"testing\", tier: \"medium\" },\n { name: \"qa-tester-high\", domain: \"testing\", tier: \"high\" },\n { name: \"security-reviewer-low\", domain: \"security\", tier: \"low\" },\n { name: \"security-reviewer\", domain: \"security\", tier: \"high\" },\n { name: \"build-fixer-low\", domain: \"build\", tier: \"low\" },\n { name: \"build-fixer\", domain: \"build\", tier: \"medium\" },\n { name: \"tdd-guide-low\", domain: \"tdd\", tier: \"low\" },\n { name: \"tdd-guide\", domain: \"tdd\", tier: \"medium\" },\n { name: \"code-reviewer-low\", domain: \"code-review\", tier: \"low\" },\n { name: \"code-reviewer\", domain: \"code-review\", tier: \"high\" },\n { name: \"scientist-low\", domain: \"data-science\", tier: \"low\" },\n { name: \"scientist\", domain: \"data-science\", tier: \"medium\" },\n { name: \"scientist-high\", domain: \"data-science\", tier: \"high\" },\n];\n\nexport const DEFAULT_SKILL_DIRECTORIES = [\".harness/skills\"];\n\nexport const DEFAULT_VERIFICATION_CHECKS = [\"build\", \"test\", \"lint\"];\n","import { BUILT_IN_AGENTS } from \"../config/defaults.js\";\nimport type { AgentDefinition } from \"../config/schema.js\";\n\nexport class AgentRegistry {\n private agents: Map<string, AgentDefinition>;\n\n constructor(customAgents: AgentDefinition[] = []) {\n this.agents = new Map();\n for (const agent of BUILT_IN_AGENTS) {\n this.agents.set(agent.name, agent);\n }\n for (const agent of customAgents) {\n this.agents.set(agent.name, agent);\n }\n }\n\n get(name: string): AgentDefinition | undefined {\n return this.agents.get(name);\n }\n\n list(): AgentDefinition[] {\n return [...this.agents.values()];\n }\n\n listByDomain(domain: string): AgentDefinition[] {\n return this.list().filter((a) => a.domain === domain);\n }\n\n listByTier(tier: string): AgentDefinition[] {\n return this.list().filter((a) => a.tier === tier);\n }\n\n domains(): string[] {\n return [...new Set(this.list().map((a) => a.domain))];\n }\n\n count(): { builtin: number; custom: number; total: number } {\n const builtin = BUILT_IN_AGENTS.length;\n const total = this.agents.size;\n return { builtin, custom: total - builtin, total };\n }\n}\n","import type { ModelTier } from \"../config/schema.js\";\n\nexport type TaskComplexity = \"low\" | \"medium\" | \"high\";\n\nexport interface ModelRouting {\n low: ModelTier;\n medium: ModelTier;\n high: ModelTier;\n}\n\nconst DEFAULT_ROUTING: ModelRouting = {\n low: \"low\",\n medium: \"medium\",\n high: \"high\",\n};\n\nexport function routeModel(\n complexity: TaskComplexity,\n routing?: Partial<ModelRouting>,\n): ModelTier {\n const merged = { ...DEFAULT_ROUTING, ...routing };\n return merged[complexity];\n}\n\nconst COMPLEXITY_KEYWORDS: Record<string, TaskComplexity> = {\n lookup: \"low\",\n find: \"low\",\n \"quick check\": \"low\",\n implement: \"medium\",\n add: \"medium\",\n fix: \"medium\",\n refactor: \"high\",\n debug: \"high\",\n architect: \"high\",\n \"race condition\": \"high\",\n};\n\nexport function inferComplexity(taskDescription: string): TaskComplexity {\n const lower = taskDescription.toLowerCase();\n for (const [keyword, complexity] of Object.entries(COMPLEXITY_KEYWORDS)) {\n if (lower.includes(keyword)) return complexity;\n }\n return \"medium\";\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ProjectAdapter, CommandDefinition, HealthCheck } from \"./interface.js\";\n\nexport class RustAdapter implements ProjectAdapter {\n name = \"rust\";\n\n async detect(cwd: string): Promise<boolean> {\n return existsSync(join(cwd, \"Cargo.toml\"));\n }\n\n getCommands(): CommandDefinition[] {\n return [\n { name: \"fmt\", command: \"cargo fmt\", description: \"Format Rust code\" },\n { name: \"test\", command: \"cargo test\", description: \"Run Rust tests\" },\n { name: \"clippy\", command: \"cargo clippy --tests\", description: \"Run Clippy lints\" },\n { name: \"build\", command: \"cargo build\", description: \"Build project\" },\n ];\n }\n\n getHealthChecks(): HealthCheck[] {\n return [\n {\n name: \"cargo-installed\",\n check: async () => {\n try {\n const { execSync } = await import(\"node:child_process\");\n execSync(\"cargo --version\", { stdio: \"pipe\" });\n return { status: \"pass\", message: \"cargo is available\" };\n } catch {\n return { status: \"fail\", message: \"cargo not found in PATH\" };\n }\n },\n },\n ];\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ProjectAdapter, CommandDefinition, HealthCheck } from \"./interface.js\";\n\nexport class TypeScriptAdapter implements ProjectAdapter {\n name = \"typescript\";\n\n async detect(cwd: string): Promise<boolean> {\n return (\n existsSync(join(cwd, \"tsconfig.json\")) ||\n existsSync(join(cwd, \"package.json\"))\n );\n }\n\n getCommands(): CommandDefinition[] {\n return [\n { name: \"build\", command: \"npm run build\", description: \"Build TypeScript project\" },\n { name: \"test\", command: \"npm test\", description: \"Run tests\" },\n { name: \"lint\", command: \"npm run lint\", description: \"Run linter\" },\n ];\n }\n\n getHealthChecks(): HealthCheck[] {\n return [\n {\n name: \"node-version\",\n check: async () => {\n const major = parseInt(process.versions.node.split(\".\")[0], 10);\n if (major >= 22) {\n return { status: \"pass\", message: `Node.js v${process.versions.node}` };\n }\n return {\n status: \"warn\",\n message: `Node.js v${process.versions.node} (>=22 recommended)`,\n };\n },\n },\n ];\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ProjectAdapter, CommandDefinition, HealthCheck } from \"./interface.js\";\n\nexport class PythonAdapter implements ProjectAdapter {\n name = \"python\";\n\n async detect(cwd: string): Promise<boolean> {\n return (\n existsSync(join(cwd, \"pyproject.toml\")) ||\n existsSync(join(cwd, \"setup.py\")) ||\n existsSync(join(cwd, \"requirements.txt\"))\n );\n }\n\n getCommands(): CommandDefinition[] {\n return [\n { name: \"test\", command: \"pytest\", description: \"Run Python tests\" },\n { name: \"lint\", command: \"ruff check .\", description: \"Run linter\" },\n { name: \"fmt\", command: \"ruff format .\", description: \"Format Python code\" },\n ];\n }\n\n getHealthChecks(): HealthCheck[] {\n return [\n {\n name: \"python-installed\",\n check: async () => {\n try {\n const { execSync } = await import(\"node:child_process\");\n const out = execSync(\"python3 --version\", { stdio: \"pipe\" }).toString().trim();\n return { status: \"pass\", message: out };\n } catch {\n return { status: \"fail\", message: \"python3 not found in PATH\" };\n }\n },\n },\n ];\n }\n}\n","import type { ProjectAdapter } from \"./interface.js\";\nimport { RustAdapter } from \"./rust.js\";\nimport { TypeScriptAdapter } from \"./typescript.js\";\nimport { PythonAdapter } from \"./python.js\";\n\nconst BUILT_IN_ADAPTERS: ProjectAdapter[] = [\n new RustAdapter(),\n new TypeScriptAdapter(),\n new PythonAdapter(),\n];\n\nexport class AdapterRegistry {\n private adapters: Map<string, ProjectAdapter> = new Map();\n\n constructor(additionalAdapters: ProjectAdapter[] = []) {\n for (const adapter of BUILT_IN_ADAPTERS) {\n this.adapters.set(adapter.name, adapter);\n }\n for (const adapter of additionalAdapters) {\n this.adapters.set(adapter.name, adapter);\n }\n }\n\n register(adapter: ProjectAdapter): void {\n this.adapters.set(adapter.name, adapter);\n }\n\n get(name: string): ProjectAdapter | undefined {\n return this.adapters.get(name);\n }\n\n list(): ProjectAdapter[] {\n return [...this.adapters.values()];\n }\n\n async detect(cwd: string): Promise<ProjectAdapter | null> {\n for (const adapter of this.adapters.values()) {\n if (await adapter.detect(cwd)) return adapter;\n }\n return null;\n }\n\n count(): { builtin: number; custom: number; total: number } {\n const builtin = BUILT_IN_ADAPTERS.length;\n const total = this.adapters.size;\n return { builtin, custom: total - builtin, total };\n }\n}\n","import { existsSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport type { ProjectAdapter } from \"./interface.js\";\nimport { AdapterRegistry } from \"./registry.js\";\n\nconst defaultRegistry = new AdapterRegistry();\n\nexport async function detectProjectType(\n cwd: string,\n): Promise<ProjectAdapter | null> {\n return defaultRegistry.detect(cwd);\n}\n\nexport function detectLanguage(cwd: string): \"rust\" | \"typescript\" | \"python\" | \"multi\" {\n const signals = {\n rust: existsSync(join(cwd, \"Cargo.toml\")),\n typescript:\n existsSync(join(cwd, \"package.json\")) ||\n existsSync(join(cwd, \"tsconfig.json\")),\n python:\n existsSync(join(cwd, \"pyproject.toml\")) ||\n existsSync(join(cwd, \"setup.py\")) ||\n existsSync(join(cwd, \"requirements.txt\")),\n };\n\n const detected = Object.entries(signals).filter(([, v]) => v);\n if (detected.length > 1) return \"multi\";\n if (detected.length === 1) return detected[0][0] as \"rust\" | \"typescript\" | \"python\";\n return \"typescript\";\n}\n","import { readdir, stat } from \"node:fs/promises\";\nimport { join, resolve } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nimport { validateSkill, type SkillValidationResult } from \"./validator.js\";\n\nexport interface SkillInfo {\n name: string;\n description: string;\n path: string;\n valid: boolean;\n}\n\nexport async function discoverSkills(\n directories: string[],\n cwd?: string,\n): Promise<SkillInfo[]> {\n const base = cwd ?? process.cwd();\n const skills: SkillInfo[] = [];\n\n for (const dir of directories) {\n const absDir = resolve(base, dir);\n if (!existsSync(absDir)) continue;\n\n const entries = await readdir(absDir);\n for (const entry of entries) {\n const skillDir = join(absDir, entry);\n const info = await stat(skillDir);\n if (!info.isDirectory()) continue;\n\n const skillMd = join(skillDir, \"SKILL.md\");\n if (!existsSync(skillMd)) continue;\n\n const validation = await validateSkill(skillDir);\n skills.push({\n name: validation.name ?? entry,\n description: validation.description ?? \"\",\n path: skillDir,\n valid: validation.valid,\n });\n }\n }\n\n return skills;\n}\n\nexport async function listSkillDirectories(cwd?: string): Promise<string[]> {\n const base = cwd ?? process.cwd();\n const candidates = [\".harness/skills\"];\n return candidates\n .map((d) => resolve(base, d))\n .filter((d) => existsSync(d));\n}\n","import { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\n\nexport interface SkillValidationResult {\n valid: boolean;\n name: string | null;\n description: string | null;\n errors: string[];\n warnings: string[];\n}\n\nexport async function validateSkill(skillDir: string): Promise<SkillValidationResult> {\n const errors: string[] = [];\n const warnings: string[] = [];\n let name: string | null = null;\n let description: string | null = null;\n\n const skillMdPath = join(skillDir, \"SKILL.md\");\n if (!existsSync(skillMdPath)) {\n errors.push(\"Missing SKILL.md\");\n return { valid: false, name, description, errors, warnings };\n }\n\n const content = await readFile(skillMdPath, \"utf-8\");\n const frontmatter = extractFrontmatter(content);\n\n if (!frontmatter) {\n errors.push(\"SKILL.md missing YAML frontmatter (---...--- block)\");\n return { valid: false, name, description, errors, warnings };\n }\n\n name = frontmatter.name ?? null;\n description = frontmatter.description ?? null;\n\n if (!name) errors.push(\"Frontmatter missing required 'name' field\");\n if (!description) errors.push(\"Frontmatter missing required 'description' field\");\n\n const metadataYaml = join(skillDir, \"metadata.yaml\");\n if (!existsSync(metadataYaml)) {\n warnings.push(\"No metadata.yaml (recommended for skill metadata)\");\n }\n\n return { valid: errors.length === 0, name, description, errors, warnings };\n}\n\nfunction extractFrontmatter(\n content: string,\n): Record<string, string> | null {\n const match = content.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return null;\n\n const fields: Record<string, string> = {};\n const lines = match[1].split(\"\\n\");\n let currentKey: string | null = null;\n let currentValue = \"\";\n\n for (const line of lines) {\n const kvMatch = line.match(/^(\\w[\\w-]*):\\s*(.*)/);\n if (kvMatch) {\n if (currentKey) fields[currentKey] = currentValue.trim();\n currentKey = kvMatch[1];\n currentValue = kvMatch[2];\n } else if (currentKey && (line.startsWith(\" \") || line.startsWith(\"\\t\"))) {\n currentValue += \" \" + line.trim();\n }\n }\n if (currentKey) fields[currentKey] = currentValue.trim();\n\n return fields;\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { render } from \"../template/engine.js\";\n\nconst SKILL_MD_TEMPLATE = `---\nname: {{name}}\ndescription: {{description}}\n---\n\n# {{displayName}}\n\n## Overview\n\nTODO: Describe what this skill does.\n\n## Usage\n\nTODO: Describe how to use this skill.\n`;\n\nexport interface ScaffoldOptions {\n name: string;\n description: string;\n displayName: string;\n resources?: (\"scripts\" | \"references\" | \"assets\")[];\n}\n\nexport async function scaffoldSkill(\n targetDir: string,\n options: ScaffoldOptions,\n): Promise<string> {\n const skillDir = join(targetDir, options.name);\n\n await mkdir(skillDir, { recursive: true });\n\n const content = render(SKILL_MD_TEMPLATE, {\n name: options.name,\n description: options.description,\n displayName: options.displayName,\n });\n await writeFile(join(skillDir, \"SKILL.md\"), content, \"utf-8\");\n\n const metadataContent = render(\n \"display_name: {{displayName}}\\ndescription: {{description}}\\n\",\n { displayName: options.displayName, description: options.description },\n );\n await writeFile(join(skillDir, \"metadata.yaml\"), metadataContent, \"utf-8\");\n\n for (const res of options.resources ?? []) {\n await mkdir(join(skillDir, res), { recursive: true });\n await writeFile(join(skillDir, res, \".gitkeep\"), \"\", \"utf-8\");\n }\n\n return skillDir;\n}\n","export interface TemplateContext {\n [key: string]: string | boolean | string[] | undefined;\n}\n\n/**\n * Lightweight template engine:\n * - {{variable}} — interpolation\n * - {{#if condition}}...{{/if}} — conditional block (truthy check)\n * - {{#if condition}}...{{#else}}...{{/if}} — conditional with else\n * - {{#each items}}...{{/each}} — array iteration (current item as {{.}})\n */\nexport function render(template: string, context: TemplateContext): string {\n let result = template;\n\n result = processEach(result, context);\n result = processConditionals(result, context);\n result = interpolateVariables(result, context);\n\n return result;\n}\n\nfunction processEach(template: string, context: TemplateContext): string {\n const eachRegex = /\\{\\{#each\\s+(\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/each\\}\\}/g;\n return template.replace(eachRegex, (_match, key: string, body: string) => {\n const value = context[key];\n if (!Array.isArray(value)) return \"\";\n return value.map((item) => body.replace(/\\{\\{\\.\\}\\}/g, item)).join(\"\");\n });\n}\n\nfunction processConditionals(template: string, context: TemplateContext): string {\n const ifElseRegex =\n /\\{\\{#if\\s+(\\w+)\\}\\}([\\s\\S]*?)\\{\\{#else\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g;\n let result = template.replace(\n ifElseRegex,\n (_match, key: string, ifBody: string, elseBody: string) => {\n return isTruthy(context[key]) ? ifBody : elseBody;\n },\n );\n\n const ifRegex = /\\{\\{#if\\s+(\\w+)\\}\\}([\\s\\S]*?)\\{\\{\\/if\\}\\}/g;\n result = result.replace(ifRegex, (_match, key: string, body: string) => {\n return isTruthy(context[key]) ? body : \"\";\n });\n\n return result;\n}\n\nfunction interpolateVariables(template: string, context: TemplateContext): string {\n return template.replace(/\\{\\{(\\w+)\\}\\}/g, (_match, key: string) => {\n const value = context[key];\n if (value === undefined) return \"\";\n if (typeof value === \"boolean\") return String(value);\n if (Array.isArray(value)) return value.join(\", \");\n return value;\n });\n}\n\nfunction isTruthy(value: string | boolean | string[] | undefined): boolean {\n if (value === undefined || value === false || value === \"\") return false;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n}\n","import type { HealthCheck, HealthCheckResult } from \"../adapter/interface.js\";\n\nexport interface HealthReport {\n results: HealthReportEntry[];\n summary: { pass: number; warn: number; fail: number };\n}\n\nexport interface HealthReportEntry {\n name: string;\n result: HealthCheckResult;\n}\n\nexport async function runHealthChecks(\n checks: HealthCheck[],\n): Promise<HealthReport> {\n const results: HealthReportEntry[] = [];\n\n for (const check of checks) {\n try {\n const result = await check.check();\n results.push({ name: check.name, result });\n } catch (err) {\n results.push({\n name: check.name,\n result: {\n status: \"fail\",\n message: `Check threw: ${err instanceof Error ? err.message : String(err)}`,\n },\n });\n }\n }\n\n const summary = { pass: 0, warn: 0, fail: 0 };\n for (const r of results) {\n summary[r.result.status]++;\n }\n\n return { results, summary };\n}\n\nexport function formatReport(report: HealthReport): string {\n const lines = [\"Agent Harness Health Check\", \"==========================\"];\n\n const statusIcon = { pass: \"[PASS]\", warn: \"[WARN]\", fail: \"[FAIL]\" } as const;\n\n for (const entry of report.results) {\n lines.push(`${statusIcon[entry.result.status]} ${entry.result.message}`);\n }\n\n lines.push(\"\");\n lines.push(\n `Summary: ${report.summary.pass} passed, ${report.summary.warn} warning(s), ${report.summary.fail} failure(s)`,\n );\n\n return lines.join(\"\\n\");\n}\n","import { readFile, writeFile, mkdir, readdir, stat } from \"node:fs/promises\";\nimport { join, dirname, relative } from \"node:path\";\nimport { render, type TemplateContext } from \"./engine.js\";\n\nconst TEMPLATE_EXT = \".tmpl\";\n\nexport async function renderFile(\n templatePath: string,\n outputPath: string,\n context: TemplateContext,\n): Promise<void> {\n const template = await readFile(templatePath, \"utf-8\");\n const rendered = render(template, context);\n\n const outputFile = outputPath.endsWith(TEMPLATE_EXT)\n ? outputPath.slice(0, -TEMPLATE_EXT.length)\n : outputPath;\n\n await mkdir(dirname(outputFile), { recursive: true });\n await writeFile(outputFile, rendered, \"utf-8\");\n}\n\nexport async function renderDirectory(\n templateDir: string,\n outputDir: string,\n context: TemplateContext,\n): Promise<string[]> {\n const rendered: string[] = [];\n\n async function walk(dir: string): Promise<void> {\n const entries = await readdir(dir);\n for (const entry of entries) {\n const fullPath = join(dir, entry);\n const relPath = relative(templateDir, fullPath);\n const outPath = join(outputDir, relPath);\n const info = await stat(fullPath);\n\n if (info.isDirectory()) {\n await mkdir(outPath, { recursive: true });\n await walk(fullPath);\n } else if (entry.endsWith(TEMPLATE_EXT)) {\n await renderFile(fullPath, outPath, context);\n rendered.push(outPath.slice(0, -TEMPLATE_EXT.length));\n }\n }\n }\n\n await walk(templateDir);\n return rendered;\n}\n","import { appendFile, mkdir } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport type { AuditEntry, AuditEventKind } from \"./types.js\";\n\nconst DEFAULT_LOG_DIR = \".harness/logs\";\nconst LOG_FILE = \"audit.jsonl\";\n\nexport class AuditLogger {\n private logPath: string;\n\n constructor(cwd: string, logDir?: string) {\n this.logPath = resolve(cwd, logDir ?? DEFAULT_LOG_DIR, LOG_FILE);\n }\n\n async log(kind: AuditEventKind, message: string, data?: Record<string, unknown>): Promise<void> {\n const entry: AuditEntry = {\n timestamp: new Date().toISOString(),\n kind,\n message,\n data,\n };\n\n await mkdir(dirname(this.logPath), { recursive: true });\n await appendFile(this.logPath, JSON.stringify(entry) + \"\\n\", \"utf-8\");\n }\n\n getLogPath(): string {\n return this.logPath;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { resolve, dirname, relative, sep } from \"node:path\";\nimport type { HarnessConfig } from \"../config/schema.js\";\nimport { discoverSkills } from \"../skill/manager.js\";\nimport type { ContextBlock, ContextPipelineResult, ContextBuildOptions, TagStyle } from \"./types.js\";\n\nexport class ContextPipeline {\n private blocks: ContextBlock[] = [];\n\n addBlock(tag: string, content: string, priority = 50): void {\n this.blocks.push({ tag, content, priority });\n }\n\n async addProjectDoc(cwd: string): Promise<void> {\n const agentsMd = resolve(cwd, \"AGENTS.md\");\n if (existsSync(agentsMd)) {\n const content = await readFile(agentsMd, \"utf-8\");\n this.addBlock(\"project-doc\", content, 10);\n }\n }\n\n /**\n * Walk from projectRoot to cwd, collecting AGENTS.md files.\n * Deeper files override shallower ones (later blocks have higher priority).\n */\n async addHierarchicalDocs(cwd: string, projectRoot?: string): Promise<void> {\n const root = projectRoot ?? await findProjectRoot(cwd);\n const docs = collectAgentsMdFiles(root, cwd);\n\n for (let i = 0; i < docs.length; i++) {\n const filePath = docs[i];\n const content = await readFile(filePath, \"utf-8\");\n const depth = i;\n this.addBlock(`agents-md-${depth}`, content, 10 + depth);\n }\n }\n\n async addSkillsSummary(config: HarnessConfig, cwd: string): Promise<void> {\n const skills = await discoverSkills(config.skills.directories, cwd);\n if (skills.length === 0) return;\n\n const lines = [\"Available skills:\"];\n for (const skill of skills) {\n if (skill.valid) {\n lines.push(`- ${skill.name}: ${skill.description}`);\n }\n }\n this.addBlock(\"skills\", lines.join(\"\\n\"), 30);\n }\n\n addCustomRules(rules: string[]): void {\n if (rules.length === 0) return;\n const content = rules.map((r) => `- ${r}`).join(\"\\n\");\n this.addBlock(\"custom-rules\", content, 20);\n }\n\n addRaw(tag: string, content: string, priority?: number): void {\n this.addBlock(tag, content, priority);\n }\n\n build(options?: ContextBuildOptions): ContextPipelineResult {\n const sorted = [...this.blocks].sort((a, b) => a.priority - b.priority);\n const tagStyle: TagStyle = options?.tagStyle ?? \"markdown\";\n const parts: string[] = [];\n\n for (const block of sorted) {\n const [open, close] = formatTags(block.tag, tagStyle);\n if (open) parts.push(open);\n parts.push(block.content);\n if (close) parts.push(close);\n parts.push(\"\");\n }\n\n return {\n blocks: sorted,\n rendered: parts.join(\"\\n\").trim(),\n };\n }\n\n clear(): void {\n this.blocks = [];\n }\n}\n\nfunction formatTags(tag: string, style: TagStyle): [string | null, string | null] {\n switch (style) {\n case \"xml\":\n return [`<${tag}>`, `</${tag}>`];\n case \"markdown\":\n return [`<!-- ${tag} -->`, `<!-- /${tag} -->`];\n case \"none\":\n return [null, null];\n }\n}\n\nfunction collectAgentsMdFiles(root: string, cwd: string): string[] {\n const files: string[] = [];\n let current = resolve(root);\n const target = resolve(cwd);\n const steps = relative(current, target)\n .split(sep)\n .filter(Boolean);\n\n const collect = (dir: string): void => {\n const agentsMd = resolve(dir, \"AGENTS.md\");\n if (existsSync(agentsMd)) {\n files.push(agentsMd);\n }\n };\n\n collect(current);\n for (const step of steps) {\n current = resolve(current, step);\n if (!target.startsWith(current)) break;\n collect(current);\n }\n\n return files;\n}\n\nasync function findProjectRoot(cwd: string): Promise<string> {\n let dir = resolve(cwd);\n while (true) {\n if (existsSync(resolve(dir, \".harness\")) || existsSync(resolve(dir, \".git\"))) {\n return dir;\n }\n const parent = dirname(dir);\n if (parent === dir) return cwd;\n dir = parent;\n }\n}\n","import type { HarnessPlugin } from \"./types.js\";\nimport type { ProjectAdapter, HealthCheck } from \"../adapter/interface.js\";\nimport type { HookHandler } from \"../hook/types.js\";\nimport type { FeatureSpec } from \"../feature/types.js\";\nimport type { AgentDefinition } from \"../config/schema.js\";\n\nexport class PluginRegistry {\n private plugins: Map<string, HarnessPlugin> = new Map();\n\n register(plugin: HarnessPlugin): void {\n this.plugins.set(plugin.name, plugin);\n }\n\n get(name: string): HarnessPlugin | undefined {\n return this.plugins.get(name);\n }\n\n list(): HarnessPlugin[] {\n return [...this.plugins.values()];\n }\n\n collectAdapters(): ProjectAdapter[] {\n const adapters: ProjectAdapter[] = [];\n for (const plugin of this.plugins.values()) {\n if (plugin.adapters) adapters.push(...plugin.adapters);\n }\n return adapters;\n }\n\n collectAgents(): AgentDefinition[] {\n const agents: AgentDefinition[] = [];\n for (const plugin of this.plugins.values()) {\n if (plugin.agents) agents.push(...plugin.agents);\n }\n return agents;\n }\n\n collectHooks(): HookHandler[] {\n const hooks: HookHandler[] = [];\n for (const plugin of this.plugins.values()) {\n if (plugin.hooks) hooks.push(...plugin.hooks);\n }\n return hooks;\n }\n\n collectHealthChecks(): HealthCheck[] {\n const checks: HealthCheck[] = [];\n for (const plugin of this.plugins.values()) {\n if (plugin.healthChecks) checks.push(...plugin.healthChecks);\n }\n return checks;\n }\n\n collectFeatures(): FeatureSpec[] {\n const features: FeatureSpec[] = [];\n for (const plugin of this.plugins.values()) {\n if (plugin.features) features.push(...plugin.features);\n }\n return features;\n }\n\n collectSkillDirectories(): string[] {\n const dirs: string[] = [];\n for (const plugin of this.plugins.values()) {\n if (plugin.skillDirectories) dirs.push(...plugin.skillDirectories);\n }\n return dirs;\n }\n\n count(): number {\n return this.plugins.size;\n }\n}\n","import type { FeatureSpec, FeatureStage } from \"./types.js\";\n\nexport class FeatureRegistry {\n private specs: Map<string, FeatureSpec> = new Map();\n private overrides: Map<string, boolean> = new Map();\n private aliases: Map<string, string> = new Map();\n private aliasUsages: string[] = [];\n\n register(spec: FeatureSpec): void {\n this.specs.set(spec.id, spec);\n }\n\n registerMany(specs: FeatureSpec[]): void {\n for (const spec of specs) {\n this.register(spec);\n }\n }\n\n registerAlias(legacyKey: string, featureId: string): void {\n this.aliases.set(legacyKey, featureId);\n }\n\n registerAliases(aliasMap: Record<string, string>): void {\n for (const [legacy, id] of Object.entries(aliasMap)) {\n this.registerAlias(legacy, id);\n }\n }\n\n applyOverrides(overrides: Record<string, boolean>): void {\n for (const [key, value] of Object.entries(overrides)) {\n const spec = this.findByKey(key);\n if (spec) {\n if (spec.stage === \"removed\") continue;\n this.overrides.set(spec.id, value);\n }\n }\n }\n\n isEnabled(id: string): boolean {\n const resolved = this.resolveAlias(id);\n\n const override = this.overrides.get(resolved);\n if (override !== undefined) return override;\n\n const spec = this.specs.get(resolved);\n if (!spec) return false;\n if (spec.stage === \"removed\") return false;\n return spec.defaultEnabled;\n }\n\n get(id: string): FeatureSpec | undefined {\n const resolved = this.resolveAlias(id);\n return this.specs.get(resolved);\n }\n\n list(): FeatureSpec[] {\n return [...this.specs.values()];\n }\n\n listByStage(stage: FeatureStage): FeatureSpec[] {\n return this.list().filter((s) => s.stage === stage);\n }\n\n listEnabled(): FeatureSpec[] {\n return this.list().filter((s) => this.isEnabled(s.id));\n }\n\n count(): { total: number; enabled: number; disabled: number } {\n const total = this.specs.size;\n const enabled = this.listEnabled().length;\n return { total, enabled, disabled: total - enabled };\n }\n\n getAliasUsages(): string[] {\n return [...this.aliasUsages];\n }\n\n private resolveAlias(key: string): string {\n const mapped = this.aliases.get(key);\n if (mapped) {\n this.aliasUsages.push(`Legacy key \"${key}\" resolved to \"${mapped}\"`);\n return mapped;\n }\n return key;\n }\n\n private findByKey(key: string): FeatureSpec | undefined {\n const resolved = this.resolveAlias(key);\n const direct = this.specs.get(resolved);\n if (direct) return direct;\n\n for (const spec of this.specs.values()) {\n if (spec.key === resolved || spec.id === resolved) return spec;\n }\n return undefined;\n }\n}\n","import { readFile } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { parse as parseYaml } from \"yaml\";\nimport type { HookHandler } from \"./types.js\";\n\nconst HOOKS_FILE_NAMES = [\"hooks.yaml\", \"hooks.json\"];\n\nexport async function discoverHooks(cwd: string): Promise<HookHandler[]> {\n const handlers: HookHandler[] = [];\n\n const harnessDir = resolve(cwd, \".harness\");\n for (const fileName of HOOKS_FILE_NAMES) {\n const filePath = resolve(harnessDir, fileName);\n if (!existsSync(filePath)) continue;\n\n const content = await readFile(filePath, \"utf-8\");\n const parsed = fileName.endsWith(\".json\")\n ? JSON.parse(content)\n : parseYaml(content);\n\n if (parsed && Array.isArray(parsed.hooks)) {\n for (const hook of parsed.hooks) {\n if (hook.event && hook.command) {\n handlers.push({\n event: hook.event,\n command: hook.command,\n matcher: hook.matcher,\n });\n }\n }\n }\n\n break;\n }\n\n return handlers;\n}\n","import { execSync } from \"node:child_process\";\nimport type { HookEventName, HookHandler, HookPayload, HookResult } from \"./types.js\";\n\nexport class HookDispatcher {\n private handlers: HookHandler[];\n\n constructor(handlers: HookHandler[]) {\n this.handlers = handlers;\n }\n\n async dispatch(\n event: HookEventName,\n cwd: string,\n data?: Record<string, unknown>,\n ): Promise<HookResult[]> {\n const matching = this.handlers.filter((h) => h.event === event);\n if (matching.length === 0) return [];\n\n const payload: HookPayload = {\n event,\n timestamp: new Date().toISOString(),\n cwd,\n data,\n };\n\n const payloadJson = JSON.stringify(payload);\n const results: HookResult[] = [];\n\n for (const handler of matching) {\n if (handler.matcher && data) {\n const matchValue = String(data.match ?? \"\");\n if (matchValue && !matchValue.includes(handler.matcher)) continue;\n }\n\n const start = Date.now();\n try {\n const stdout = execSync(handler.command, {\n cwd,\n input: payloadJson,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n timeout: 30_000,\n }).toString();\n\n results.push({\n handler,\n exitCode: 0,\n stdout,\n stderr: \"\",\n durationMs: Date.now() - start,\n });\n } catch (err) {\n const execErr = err as { status?: number; stdout?: Buffer; stderr?: Buffer };\n results.push({\n handler,\n exitCode: execErr.status ?? 1,\n stdout: execErr.stdout?.toString() ?? \"\",\n stderr: execErr.stderr?.toString() ?? \"\",\n durationMs: Date.now() - start,\n });\n }\n }\n\n return results;\n }\n\n hasHandlers(event: HookEventName): boolean {\n return this.handlers.some((h) => h.event === event);\n }\n}\n","import { dirname, resolve } from \"node:path\";\nimport { mkdir, writeFile } from \"node:fs/promises\";\nimport { AgentRegistry } from \"../agent/registry.js\";\nimport { detectProjectType } from \"../adapter/detector.js\";\nimport type { CommandDefinition, ProjectAdapter } from \"../adapter/interface.js\";\nimport { AuditLogger } from \"../audit/logger.js\";\nimport type { AuditEventKind } from \"../audit/types.js\";\nimport {\n anyConfigExists,\n loadConfig,\n projectConfigExists,\n type HarnessConfig,\n} from \"../config/loader.js\";\nimport { ContextPipeline } from \"../context/pipeline.js\";\nimport type { ContextPipelineResult, TagStyle } from \"../context/types.js\";\nimport { FeatureRegistry } from \"../feature/registry.js\";\nimport type { FeatureSpec } from \"../feature/types.js\";\nimport { discoverHooks } from \"../hook/discovery.js\";\nimport { HookDispatcher } from \"../hook/dispatcher.js\";\nimport type { HookEventName, HookResult } from \"../hook/types.js\";\n\nexport type RuntimeTaskSource = \"adapter\" | \"workflow\";\n\nexport interface RuntimeTask {\n name: string;\n command: string;\n description: string;\n source: RuntimeTaskSource;\n adapterName?: string;\n}\n\nexport interface RuntimeFeatureState {\n spec: FeatureSpec;\n enabled: boolean;\n configured: boolean;\n configuredValue?: boolean;\n}\n\nexport interface CreateHarnessRuntimeOptions {\n cwd?: string;\n requireProjectConfig?: boolean;\n}\n\nexport interface BuildContextOptions {\n tagStyle?: TagStyle;\n includeSkills?: boolean;\n includeCustomRules?: boolean;\n}\n\nexport interface WriteContextOptions extends BuildContextOptions {\n outputPath: string;\n}\n\nexport class HarnessRuntime {\n readonly cwd: string;\n readonly hasProjectConfig: boolean;\n readonly hasAnyConfig: boolean;\n readonly config?: HarnessConfig;\n readonly adapter: ProjectAdapter | null;\n readonly agentRegistry: AgentRegistry;\n readonly featureRegistry: FeatureRegistry;\n\n private readonly hookDispatcher: HookDispatcher;\n private readonly auditLogger: AuditLogger;\n\n private constructor(args: {\n cwd: string;\n hasProjectConfig: boolean;\n hasAnyConfig: boolean;\n config?: HarnessConfig;\n adapter: ProjectAdapter | null;\n hookDispatcher: HookDispatcher;\n auditLogger: AuditLogger;\n featureRegistry: FeatureRegistry;\n }) {\n this.cwd = args.cwd;\n this.hasProjectConfig = args.hasProjectConfig;\n this.hasAnyConfig = args.hasAnyConfig;\n this.config = args.config;\n this.adapter = args.adapter;\n this.hookDispatcher = args.hookDispatcher;\n this.auditLogger = args.auditLogger;\n this.featureRegistry = args.featureRegistry;\n this.agentRegistry = new AgentRegistry(args.config?.agents.definitions ?? []);\n }\n\n static async create(opts?: CreateHarnessRuntimeOptions): Promise<HarnessRuntime> {\n const cwd = opts?.cwd ?? process.cwd();\n const hasProjectConfig = projectConfigExists(cwd);\n const hasAnyConfig = anyConfigExists(cwd);\n\n if (opts?.requireProjectConfig && !hasProjectConfig) {\n throw new Error(\"No harness project configuration found. Run `agent-harness setup` first.\");\n }\n\n const config = hasProjectConfig ? await loadConfig({ cwd }) : undefined;\n const adapter = await detectProjectType(cwd);\n const handlers = hasProjectConfig ? await discoverHooks(cwd) : [];\n const featureRegistry = buildFeatureRegistry(config);\n\n return new HarnessRuntime({\n cwd,\n hasProjectConfig,\n hasAnyConfig,\n config,\n adapter,\n hookDispatcher: new HookDispatcher(handlers),\n auditLogger: new AuditLogger(cwd),\n featureRegistry,\n });\n }\n\n listTasks(): RuntimeTask[] {\n const tasks = new Map<string, RuntimeTask>();\n\n if (this.adapter) {\n for (const command of this.adapter.getCommands()) {\n tasks.set(command.name, toRuntimeTask(command, \"adapter\", this.adapter.name));\n }\n }\n\n if (this.config) {\n for (const [name, command] of Object.entries(this.config.workflows.commands)) {\n tasks.set(name, {\n name,\n command,\n description: `Workflow command \"${name}\"`,\n source: \"workflow\",\n });\n }\n }\n\n return [...tasks.values()].sort((a, b) => a.name.localeCompare(b.name));\n }\n\n getTask(name: string): RuntimeTask | undefined {\n return this.listTasks().find((task) => task.name === name);\n }\n\n listFeatureStates(): RuntimeFeatureState[] {\n const configuredFeatures = this.config?.features ?? {};\n\n return this.featureRegistry.list().map((spec) => ({\n spec,\n enabled: this.featureRegistry.isEnabled(spec.id),\n configured: Object.prototype.hasOwnProperty.call(configuredFeatures, spec.key),\n configuredValue: configuredFeatures[spec.key],\n }));\n }\n\n async dispatchHooks(\n event: HookEventName,\n data?: Record<string, unknown>,\n ): Promise<HookResult[]> {\n if (!this.hasProjectConfig || !this.hookDispatcher.hasHandlers(event)) {\n return [];\n }\n\n const results = await this.hookDispatcher.dispatch(event, this.cwd, data);\n await this.log(\"hook.executed\", `Executed ${results.length} hook(s) for ${event}`, {\n event,\n results: results.map((result) => ({\n command: result.handler.command,\n exitCode: result.exitCode,\n durationMs: result.durationMs,\n })),\n });\n return results;\n }\n\n async log(\n kind: AuditEventKind,\n message: string,\n data?: Record<string, unknown>,\n ): Promise<void> {\n if (!this.hasProjectConfig && kind !== \"setup\") {\n return;\n }\n await this.auditLogger.log(kind, message, data);\n }\n\n async buildContext(\n opts?: BuildContextOptions,\n ): Promise<ContextPipelineResult> {\n const pipeline = new ContextPipeline();\n await pipeline.addHierarchicalDocs(this.cwd);\n\n if (this.config && (opts?.includeCustomRules ?? true)) {\n pipeline.addCustomRules(this.config.templates.agents_md.custom_rules);\n }\n\n if (this.config && (opts?.includeSkills ?? true)) {\n await pipeline.addSkillsSummary(this.config, this.cwd);\n }\n\n return pipeline.build({ tagStyle: opts?.tagStyle ?? \"markdown\" });\n }\n\n async writeContext(\n opts: WriteContextOptions,\n ): Promise<ContextPipelineResult> {\n const result = await this.buildContext(opts);\n const outputPath = resolve(this.cwd, opts.outputPath);\n await mkdir(dirname(outputPath), { recursive: true });\n await writeFile(outputPath, result.rendered + \"\\n\", \"utf-8\");\n return result;\n }\n}\n\nfunction toRuntimeTask(\n command: CommandDefinition,\n source: RuntimeTaskSource,\n adapterName?: string,\n): RuntimeTask {\n return {\n name: command.name,\n command: command.command,\n description: command.description,\n source,\n adapterName,\n };\n}\n\nfunction buildFeatureRegistry(config?: HarnessConfig): FeatureRegistry {\n const registry = new FeatureRegistry();\n const configured = config?.features ?? {};\n\n for (const key of Object.keys(configured)) {\n registry.register({\n id: key,\n key,\n stage: \"experimental\",\n defaultEnabled: false,\n description: `Feature flag configured via \"${key}\"`,\n });\n }\n\n registry.applyOverrides(configured);\n return registry;\n}\n"],"mappings":";AAAA,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,SAAS,YAAY;AAC9B,SAAS,eAAe;AACxB,SAAS,SAAS,iBAAiB;;;ACJnC,SAAS,SAAS;AAEX,IAAM,kBAAkB,EAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC;AAExD,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,MAAM,EAAE,OAAO;AAAA,EACf,QAAQ,EAAE,OAAO;AAAA,EACjB,MAAM;AAAA,EACN,aAAa,EAAE,OAAO,EAAE,SAAS;AACnC,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAE7D,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,kBAAkB,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA,EAC1C,eAAe,EACZ,OAAO;AAAA,IACN,KAAK,gBAAgB,QAAQ,KAAK;AAAA,IAClC,QAAQ,gBAAgB,QAAQ,QAAQ;AAAA,IACxC,MAAM,gBAAgB,QAAQ,MAAM;AAAA,EACtC,CAAC,EACA,QAAQ,CAAC,CAAC;AAAA,EACb,WAAW;AAAA,EACX,aAAa,EAAE,MAAM,qBAAqB,EAAE,QAAQ,CAAC,CAAC;AACxD,CAAC;AAEM,IAAM,qBAAqB,EAAE,OAAO;AAAA,EACzC,aAAa,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,iBAAiB,CAAC;AAAA,EAC5D,aAAa,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACvC,CAAC;AAEM,IAAM,0BAA0B,EAAE,OAAO;AAAA,EAC9C,MAAM,EAAE,OAAO;AAAA,EACf,SAAS,EAAE,OAAO,EAAE,SAAS;AAAA,EAC7B,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACrC,CAAC;AAEM,IAAM,2BAA2B,EAAE,OAAO;AAAA,EAC/C,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,SAAS,QAAQ,MAAM,CAAC;AAAA,EAC7D,UAAU,EAAE,MAAM,uBAAuB,EAAE,SAAS;AAAA,EACpD,WAAW,EAAE,QAAQ,EAAE,QAAQ,IAAI;AACrC,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EACrD,cAAc,yBAAyB,QAAQ,CAAC,CAAC;AACnD,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,WAAW,EACR,OAAO;AAAA,IACN,SAAS,EAAE,KAAK,CAAC,WAAW,YAAY,MAAM,CAAC,EAAE,QAAQ,UAAU;AAAA,IACnE,cAAc,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC;AAAA,EAC9C,CAAC,EACA,QAAQ,CAAC,CAAC;AACf,CAAC;AAEM,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,MAAM,EAAE,OAAO;AAAA,EACf,UAAU,EAAE,KAAK,CAAC,QAAQ,cAAc,UAAU,OAAO,CAAC,EAAE,QAAQ,YAAY;AAAA,EAChF,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE;AACpC,CAAC;AAEM,IAAM,uBAAuB,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AAEzE,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,SAAS;AAAA,EACT,QAAQ,mBAAmB,QAAQ,CAAC,CAAC;AAAA,EACrC,QAAQ,mBAAmB,QAAQ,CAAC,CAAC;AAAA,EACrC,WAAW,sBAAsB,QAAQ,CAAC,CAAC;AAAA,EAC3C,WAAW,sBAAsB,QAAQ,CAAC,CAAC;AAAA,EAC3C,UAAU;AACZ,CAAC;;;AD/DD,IAAM,sBAAsB;AAC5B,IAAM,mBAAmB;AAkBzB,eAAe,aAAa,MAAuD;AACjF,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAC9B,QAAM,UAAU,MAAM,SAAS,MAAM,OAAO;AAC5C,SAAQ,UAAU,OAAO,KAAiC;AAC5D;AAEA,SAAS,UACP,MACA,UACyB;AACzB,QAAM,SAAS,EAAE,GAAG,KAAK;AACzB,aAAW,OAAO,OAAO,KAAK,QAAQ,GAAG;AACvC,UAAM,OAAO,KAAK,GAAG;AACrB,UAAM,OAAO,SAAS,GAAG;AACzB,QACE,QACA,QACA,OAAO,SAAS,YAChB,OAAO,SAAS,YAChB,CAAC,MAAM,QAAQ,IAAI,KACnB,CAAC,MAAM,QAAQ,IAAI,GACnB;AACA,aAAO,GAAG,IAAI;AAAA,QACZ;AAAA,QACA;AAAA,MACF;AAAA,IACF,OAAO;AACL,aAAO,GAAG,IAAI;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAWA,eAAsB,WAAW,MAAkD;AACjF,QAAM,SAAS,MAAM,qBAAqB,IAAI;AAC9C,SAAO,OAAO;AAChB;AAEA,eAAsB,qBAAqB,MAAqD;AAC9F,QAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;AAErC,QAAM,SAAwB,CAAC;AAE/B,QAAM,WAAW,KAAK,QAAQ,GAAG,gBAAgB;AACjD,QAAM,WAAW,MAAM,aAAa,QAAQ;AAC5C,SAAO,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,MAAM,SAAS,CAAC;AAE5D,QAAM,cAAc,QAAQ,KAAK,mBAAmB;AACpD,QAAM,cAAc,MAAM,aAAa,WAAW;AAClD,SAAO,KAAK,EAAE,MAAM,WAAW,MAAM,aAAa,MAAM,YAAY,CAAC;AAErE,MAAI,MAAM,aAAa;AACrB,WAAO,KAAK,GAAG,KAAK,WAAW;AAAA,EACjC;AAEA,MAAI,SAAkC,CAAC;AACvC,aAAW,SAAS,QAAQ;AAC1B,QAAI,MAAM,MAAM;AACd,eAAS,UAAU,QAAQ,MAAM,IAAI;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,SAAS,oBAAoB,MAAM,MAAM;AAC/C,SAAO,EAAE,QAAQ,OAAO;AAC1B;AAEO,SAAS,aAAa,KAAuB;AAClD,SAAO,gBAAgB,GAAG;AAC5B;AAEO,SAAS,oBAAoB,KAAuB;AACzD,QAAM,MAAM,OAAO,QAAQ,IAAI;AAC/B,SAAO,WAAW,QAAQ,KAAK,mBAAmB,CAAC;AACrD;AAEO,SAAS,mBAA4B;AAC1C,SAAO,WAAW,KAAK,QAAQ,GAAG,gBAAgB,CAAC;AACrD;AAEO,SAAS,gBAAgB,KAAuB;AACrD,SAAO,oBAAoB,GAAG,KAAK,iBAAiB;AACtD;;;AEpHO,IAAM,kBAAqC;AAAA,EAChD,EAAE,MAAM,iBAAiB,QAAQ,YAAY,MAAM,MAAM;AAAA,EACzD,EAAE,MAAM,oBAAoB,QAAQ,YAAY,MAAM,SAAS;AAAA,EAC/D,EAAE,MAAM,aAAa,QAAQ,YAAY,MAAM,OAAO;AAAA,EACtD,EAAE,MAAM,gBAAgB,QAAQ,aAAa,MAAM,MAAM;AAAA,EACzD,EAAE,MAAM,YAAY,QAAQ,aAAa,MAAM,SAAS;AAAA,EACxD,EAAE,MAAM,iBAAiB,QAAQ,aAAa,MAAM,OAAO;AAAA,EAC3D,EAAE,MAAM,WAAW,QAAQ,UAAU,MAAM,MAAM;AAAA,EACjD,EAAE,MAAM,kBAAkB,QAAQ,UAAU,MAAM,SAAS;AAAA,EAC3D,EAAE,MAAM,gBAAgB,QAAQ,UAAU,MAAM,OAAO;AAAA,EACvD,EAAE,MAAM,kBAAkB,QAAQ,YAAY,MAAM,MAAM;AAAA,EAC1D,EAAE,MAAM,cAAc,QAAQ,YAAY,MAAM,SAAS;AAAA,EACzD,EAAE,MAAM,gBAAgB,QAAQ,YAAY,MAAM,MAAM;AAAA,EACxD,EAAE,MAAM,YAAY,QAAQ,YAAY,MAAM,SAAS;AAAA,EACvD,EAAE,MAAM,iBAAiB,QAAQ,YAAY,MAAM,OAAO;AAAA,EAC1D,EAAE,MAAM,UAAU,QAAQ,QAAQ,MAAM,MAAM;AAAA,EAC9C,EAAE,MAAM,UAAU,QAAQ,UAAU,MAAM,SAAS;AAAA,EACnD,EAAE,MAAM,WAAW,QAAQ,YAAY,MAAM,OAAO;AAAA,EACpD,EAAE,MAAM,UAAU,QAAQ,YAAY,MAAM,OAAO;AAAA,EACnD,EAAE,MAAM,WAAW,QAAQ,gBAAgB,MAAM,OAAO;AAAA,EACxD,EAAE,MAAM,aAAa,QAAQ,WAAW,MAAM,SAAS;AAAA,EACvD,EAAE,MAAM,kBAAkB,QAAQ,WAAW,MAAM,OAAO;AAAA,EAC1D,EAAE,MAAM,yBAAyB,QAAQ,YAAY,MAAM,MAAM;AAAA,EACjE,EAAE,MAAM,qBAAqB,QAAQ,YAAY,MAAM,OAAO;AAAA,EAC9D,EAAE,MAAM,mBAAmB,QAAQ,SAAS,MAAM,MAAM;AAAA,EACxD,EAAE,MAAM,eAAe,QAAQ,SAAS,MAAM,SAAS;AAAA,EACvD,EAAE,MAAM,iBAAiB,QAAQ,OAAO,MAAM,MAAM;AAAA,EACpD,EAAE,MAAM,aAAa,QAAQ,OAAO,MAAM,SAAS;AAAA,EACnD,EAAE,MAAM,qBAAqB,QAAQ,eAAe,MAAM,MAAM;AAAA,EAChE,EAAE,MAAM,iBAAiB,QAAQ,eAAe,MAAM,OAAO;AAAA,EAC7D,EAAE,MAAM,iBAAiB,QAAQ,gBAAgB,MAAM,MAAM;AAAA,EAC7D,EAAE,MAAM,aAAa,QAAQ,gBAAgB,MAAM,SAAS;AAAA,EAC5D,EAAE,MAAM,kBAAkB,QAAQ,gBAAgB,MAAM,OAAO;AACjE;AAEO,IAAM,4BAA4B,CAAC,iBAAiB;AAEpD,IAAM,8BAA8B,CAAC,SAAS,QAAQ,MAAM;;;ACpC5D,IAAM,gBAAN,MAAoB;AAAA,EACjB;AAAA,EAER,YAAY,eAAkC,CAAC,GAAG;AAChD,SAAK,SAAS,oBAAI,IAAI;AACtB,eAAW,SAAS,iBAAiB;AACnC,WAAK,OAAO,IAAI,MAAM,MAAM,KAAK;AAAA,IACnC;AACA,eAAW,SAAS,cAAc;AAChC,WAAK,OAAO,IAAI,MAAM,MAAM,KAAK;AAAA,IACnC;AAAA,EACF;AAAA,EAEA,IAAI,MAA2C;AAC7C,WAAO,KAAK,OAAO,IAAI,IAAI;AAAA,EAC7B;AAAA,EAEA,OAA0B;AACxB,WAAO,CAAC,GAAG,KAAK,OAAO,OAAO,CAAC;AAAA,EACjC;AAAA,EAEA,aAAa,QAAmC;AAC9C,WAAO,KAAK,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,WAAW,MAAM;AAAA,EACtD;AAAA,EAEA,WAAW,MAAiC;AAC1C,WAAO,KAAK,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,IAAI;AAAA,EAClD;AAAA,EAEA,UAAoB;AAClB,WAAO,CAAC,GAAG,IAAI,IAAI,KAAK,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAAA,EACtD;AAAA,EAEA,QAA4D;AAC1D,UAAM,UAAU,gBAAgB;AAChC,UAAM,QAAQ,KAAK,OAAO;AAC1B,WAAO,EAAE,SAAS,QAAQ,QAAQ,SAAS,MAAM;AAAA,EACnD;AACF;;;AC/BA,IAAM,kBAAgC;AAAA,EACpC,KAAK;AAAA,EACL,QAAQ;AAAA,EACR,MAAM;AACR;AAEO,SAAS,WACd,YACA,SACW;AACX,QAAM,SAAS,EAAE,GAAG,iBAAiB,GAAG,QAAQ;AAChD,SAAO,OAAO,UAAU;AAC1B;AAEA,IAAM,sBAAsD;AAAA,EAC1D,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,eAAe;AAAA,EACf,WAAW;AAAA,EACX,KAAK;AAAA,EACL,KAAK;AAAA,EACL,UAAU;AAAA,EACV,OAAO;AAAA,EACP,WAAW;AAAA,EACX,kBAAkB;AACpB;AAEO,SAAS,gBAAgB,iBAAyC;AACvE,QAAM,QAAQ,gBAAgB,YAAY;AAC1C,aAAW,CAAC,SAAS,UAAU,KAAK,OAAO,QAAQ,mBAAmB,GAAG;AACvE,QAAI,MAAM,SAAS,OAAO,EAAG,QAAO;AAAA,EACtC;AACA,SAAO;AACT;;;AC3CA,SAAS,cAAAA,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AAGd,IAAM,cAAN,MAA4C;AAAA,EACjD,OAAO;AAAA,EAEP,MAAM,OAAO,KAA+B;AAC1C,WAAOD,YAAWC,MAAK,KAAK,YAAY,CAAC;AAAA,EAC3C;AAAA,EAEA,cAAmC;AACjC,WAAO;AAAA,MACL,EAAE,MAAM,OAAO,SAAS,aAAa,aAAa,mBAAmB;AAAA,MACrE,EAAE,MAAM,QAAQ,SAAS,cAAc,aAAa,iBAAiB;AAAA,MACrE,EAAE,MAAM,UAAU,SAAS,wBAAwB,aAAa,mBAAmB;AAAA,MACnF,EAAE,MAAM,SAAS,SAAS,eAAe,aAAa,gBAAgB;AAAA,IACxE;AAAA,EACF;AAAA,EAEA,kBAAiC;AAC/B,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,OAAO,YAAY;AACjB,cAAI;AACF,kBAAM,EAAE,UAAAC,UAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,YAAAA,UAAS,mBAAmB,EAAE,OAAO,OAAO,CAAC;AAC7C,mBAAO,EAAE,QAAQ,QAAQ,SAAS,qBAAqB;AAAA,UACzD,QAAQ;AACN,mBAAO,EAAE,QAAQ,QAAQ,SAAS,0BAA0B;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACpCA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AAGd,IAAM,oBAAN,MAAkD;AAAA,EACvD,OAAO;AAAA,EAEP,MAAM,OAAO,KAA+B;AAC1C,WACED,YAAWC,MAAK,KAAK,eAAe,CAAC,KACrCD,YAAWC,MAAK,KAAK,cAAc,CAAC;AAAA,EAExC;AAAA,EAEA,cAAmC;AACjC,WAAO;AAAA,MACL,EAAE,MAAM,SAAS,SAAS,iBAAiB,aAAa,2BAA2B;AAAA,MACnF,EAAE,MAAM,QAAQ,SAAS,YAAY,aAAa,YAAY;AAAA,MAC9D,EAAE,MAAM,QAAQ,SAAS,gBAAgB,aAAa,aAAa;AAAA,IACrE;AAAA,EACF;AAAA,EAEA,kBAAiC;AAC/B,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,OAAO,YAAY;AACjB,gBAAM,QAAQ,SAAS,QAAQ,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC,GAAG,EAAE;AAC9D,cAAI,SAAS,IAAI;AACf,mBAAO,EAAE,QAAQ,QAAQ,SAAS,YAAY,QAAQ,SAAS,IAAI,GAAG;AAAA,UACxE;AACA,iBAAO;AAAA,YACL,QAAQ;AAAA,YACR,SAAS,YAAY,QAAQ,SAAS,IAAI;AAAA,UAC5C;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;ACvCA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AAGd,IAAM,gBAAN,MAA8C;AAAA,EACnD,OAAO;AAAA,EAEP,MAAM,OAAO,KAA+B;AAC1C,WACED,YAAWC,MAAK,KAAK,gBAAgB,CAAC,KACtCD,YAAWC,MAAK,KAAK,UAAU,CAAC,KAChCD,YAAWC,MAAK,KAAK,kBAAkB,CAAC;AAAA,EAE5C;AAAA,EAEA,cAAmC;AACjC,WAAO;AAAA,MACL,EAAE,MAAM,QAAQ,SAAS,UAAU,aAAa,mBAAmB;AAAA,MACnE,EAAE,MAAM,QAAQ,SAAS,gBAAgB,aAAa,aAAa;AAAA,MACnE,EAAE,MAAM,OAAO,SAAS,iBAAiB,aAAa,qBAAqB;AAAA,IAC7E;AAAA,EACF;AAAA,EAEA,kBAAiC;AAC/B,WAAO;AAAA,MACL;AAAA,QACE,MAAM;AAAA,QACN,OAAO,YAAY;AACjB,cAAI;AACF,kBAAM,EAAE,UAAAC,UAAS,IAAI,MAAM,OAAO,eAAoB;AACtD,kBAAM,MAAMA,UAAS,qBAAqB,EAAE,OAAO,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK;AAC7E,mBAAO,EAAE,QAAQ,QAAQ,SAAS,IAAI;AAAA,UACxC,QAAQ;AACN,mBAAO,EAAE,QAAQ,QAAQ,SAAS,4BAA4B;AAAA,UAChE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;;;AClCA,IAAM,oBAAsC;AAAA,EAC1C,IAAI,YAAY;AAAA,EAChB,IAAI,kBAAkB;AAAA,EACtB,IAAI,cAAc;AACpB;AAEO,IAAM,kBAAN,MAAsB;AAAA,EACnB,WAAwC,oBAAI,IAAI;AAAA,EAExD,YAAY,qBAAuC,CAAC,GAAG;AACrD,eAAW,WAAW,mBAAmB;AACvC,WAAK,SAAS,IAAI,QAAQ,MAAM,OAAO;AAAA,IACzC;AACA,eAAW,WAAW,oBAAoB;AACxC,WAAK,SAAS,IAAI,QAAQ,MAAM,OAAO;AAAA,IACzC;AAAA,EACF;AAAA,EAEA,SAAS,SAA+B;AACtC,SAAK,SAAS,IAAI,QAAQ,MAAM,OAAO;AAAA,EACzC;AAAA,EAEA,IAAI,MAA0C;AAC5C,WAAO,KAAK,SAAS,IAAI,IAAI;AAAA,EAC/B;AAAA,EAEA,OAAyB;AACvB,WAAO,CAAC,GAAG,KAAK,SAAS,OAAO,CAAC;AAAA,EACnC;AAAA,EAEA,MAAM,OAAO,KAA6C;AACxD,eAAW,WAAW,KAAK,SAAS,OAAO,GAAG;AAC5C,UAAI,MAAM,QAAQ,OAAO,GAAG,EAAG,QAAO;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAA4D;AAC1D,UAAM,UAAU,kBAAkB;AAClC,UAAM,QAAQ,KAAK,SAAS;AAC5B,WAAO,EAAE,SAAS,QAAQ,QAAQ,SAAS,MAAM;AAAA,EACnD;AACF;;;AC/CA,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,QAAAC,aAAY;AAIrB,IAAM,kBAAkB,IAAI,gBAAgB;AAE5C,eAAsB,kBACpB,KACgC;AAChC,SAAO,gBAAgB,OAAO,GAAG;AACnC;AAEO,SAAS,eAAe,KAAyD;AACtF,QAAM,UAAU;AAAA,IACd,MAAMC,YAAWC,MAAK,KAAK,YAAY,CAAC;AAAA,IACxC,YACED,YAAWC,MAAK,KAAK,cAAc,CAAC,KACpCD,YAAWC,MAAK,KAAK,eAAe,CAAC;AAAA,IACvC,QACED,YAAWC,MAAK,KAAK,gBAAgB,CAAC,KACtCD,YAAWC,MAAK,KAAK,UAAU,CAAC,KAChCD,YAAWC,MAAK,KAAK,kBAAkB,CAAC;AAAA,EAC5C;AAEA,QAAM,WAAW,OAAO,QAAQ,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC;AAC5D,MAAI,SAAS,SAAS,EAAG,QAAO;AAChC,MAAI,SAAS,WAAW,EAAG,QAAO,SAAS,CAAC,EAAE,CAAC;AAC/C,SAAO;AACT;;;AC7BA,SAAS,SAAS,YAAY;AAC9B,SAAS,QAAAC,OAAM,WAAAC,gBAAe;AAC9B,SAAS,cAAAC,mBAAkB;;;ACF3B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,QAAAC,aAAY;AACrB,SAAS,cAAAC,mBAAkB;AAU3B,eAAsB,cAAc,UAAkD;AACpF,QAAM,SAAmB,CAAC;AAC1B,QAAM,WAAqB,CAAC;AAC5B,MAAI,OAAsB;AAC1B,MAAI,cAA6B;AAEjC,QAAM,cAAcD,MAAK,UAAU,UAAU;AAC7C,MAAI,CAACC,YAAW,WAAW,GAAG;AAC5B,WAAO,KAAK,kBAAkB;AAC9B,WAAO,EAAE,OAAO,OAAO,MAAM,aAAa,QAAQ,SAAS;AAAA,EAC7D;AAEA,QAAM,UAAU,MAAMF,UAAS,aAAa,OAAO;AACnD,QAAM,cAAc,mBAAmB,OAAO;AAE9C,MAAI,CAAC,aAAa;AAChB,WAAO,KAAK,qDAAqD;AACjE,WAAO,EAAE,OAAO,OAAO,MAAM,aAAa,QAAQ,SAAS;AAAA,EAC7D;AAEA,SAAO,YAAY,QAAQ;AAC3B,gBAAc,YAAY,eAAe;AAEzC,MAAI,CAAC,KAAM,QAAO,KAAK,2CAA2C;AAClE,MAAI,CAAC,YAAa,QAAO,KAAK,kDAAkD;AAEhF,QAAM,eAAeC,MAAK,UAAU,eAAe;AACnD,MAAI,CAACC,YAAW,YAAY,GAAG;AAC7B,aAAS,KAAK,mDAAmD;AAAA,EACnE;AAEA,SAAO,EAAE,OAAO,OAAO,WAAW,GAAG,MAAM,aAAa,QAAQ,SAAS;AAC3E;AAEA,SAAS,mBACP,SAC+B;AAC/B,QAAM,QAAQ,QAAQ,MAAM,uBAAuB;AACnD,MAAI,CAAC,MAAO,QAAO;AAEnB,QAAM,SAAiC,CAAC;AACxC,QAAM,QAAQ,MAAM,CAAC,EAAE,MAAM,IAAI;AACjC,MAAI,aAA4B;AAChC,MAAI,eAAe;AAEnB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,MAAM,qBAAqB;AAChD,QAAI,SAAS;AACX,UAAI,WAAY,QAAO,UAAU,IAAI,aAAa,KAAK;AACvD,mBAAa,QAAQ,CAAC;AACtB,qBAAe,QAAQ,CAAC;AAAA,IAC1B,WAAW,eAAe,KAAK,WAAW,IAAI,KAAK,KAAK,WAAW,GAAI,IAAI;AACzE,sBAAgB,MAAM,KAAK,KAAK;AAAA,IAClC;AAAA,EACF;AACA,MAAI,WAAY,QAAO,UAAU,IAAI,aAAa,KAAK;AAEvD,SAAO;AACT;;;AD1DA,eAAsB,eACpB,aACA,KACsB;AACtB,QAAM,OAAO,OAAO,QAAQ,IAAI;AAChC,QAAM,SAAsB,CAAC;AAE7B,aAAW,OAAO,aAAa;AAC7B,UAAM,SAASC,SAAQ,MAAM,GAAG;AAChC,QAAI,CAACC,YAAW,MAAM,EAAG;AAEzB,UAAM,UAAU,MAAM,QAAQ,MAAM;AACpC,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWC,MAAK,QAAQ,KAAK;AACnC,YAAM,OAAO,MAAM,KAAK,QAAQ;AAChC,UAAI,CAAC,KAAK,YAAY,EAAG;AAEzB,YAAM,UAAUA,MAAK,UAAU,UAAU;AACzC,UAAI,CAACD,YAAW,OAAO,EAAG;AAE1B,YAAM,aAAa,MAAM,cAAc,QAAQ;AAC/C,aAAO,KAAK;AAAA,QACV,MAAM,WAAW,QAAQ;AAAA,QACzB,aAAa,WAAW,eAAe;AAAA,QACvC,MAAM;AAAA,QACN,OAAO,WAAW;AAAA,MACpB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;AAEA,eAAsB,qBAAqB,KAAiC;AAC1E,QAAM,OAAO,OAAO,QAAQ,IAAI;AAChC,QAAM,aAAa,CAAC,iBAAiB;AACrC,SAAO,WACJ,IAAI,CAAC,MAAMD,SAAQ,MAAM,CAAC,CAAC,EAC3B,OAAO,CAAC,MAAMC,YAAW,CAAC,CAAC;AAChC;;;AEnDA,SAAS,OAAO,iBAAiB;AACjC,SAAS,QAAAE,aAAY;;;ACUd,SAAS,OAAO,UAAkB,SAAkC;AACzE,MAAI,SAAS;AAEb,WAAS,YAAY,QAAQ,OAAO;AACpC,WAAS,oBAAoB,QAAQ,OAAO;AAC5C,WAAS,qBAAqB,QAAQ,OAAO;AAE7C,SAAO;AACT;AAEA,SAAS,YAAY,UAAkB,SAAkC;AACvE,QAAM,YAAY;AAClB,SAAO,SAAS,QAAQ,WAAW,CAAC,QAAQ,KAAa,SAAiB;AACxE,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,QAAO;AAClC,WAAO,MAAM,IAAI,CAAC,SAAS,KAAK,QAAQ,eAAe,IAAI,CAAC,EAAE,KAAK,EAAE;AAAA,EACvE,CAAC;AACH;AAEA,SAAS,oBAAoB,UAAkB,SAAkC;AAC/E,QAAM,cACJ;AACF,MAAI,SAAS,SAAS;AAAA,IACpB;AAAA,IACA,CAAC,QAAQ,KAAa,QAAgB,aAAqB;AACzD,aAAO,SAAS,QAAQ,GAAG,CAAC,IAAI,SAAS;AAAA,IAC3C;AAAA,EACF;AAEA,QAAM,UAAU;AAChB,WAAS,OAAO,QAAQ,SAAS,CAAC,QAAQ,KAAa,SAAiB;AACtE,WAAO,SAAS,QAAQ,GAAG,CAAC,IAAI,OAAO;AAAA,EACzC,CAAC;AAED,SAAO;AACT;AAEA,SAAS,qBAAqB,UAAkB,SAAkC;AAChF,SAAO,SAAS,QAAQ,kBAAkB,CAAC,QAAQ,QAAgB;AACjE,UAAM,QAAQ,QAAQ,GAAG;AACzB,QAAI,UAAU,OAAW,QAAO;AAChC,QAAI,OAAO,UAAU,UAAW,QAAO,OAAO,KAAK;AACnD,QAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,KAAK,IAAI;AAChD,WAAO;AAAA,EACT,CAAC;AACH;AAEA,SAAS,SAAS,OAAyD;AACzE,MAAI,UAAU,UAAa,UAAU,SAAS,UAAU,GAAI,QAAO;AACnE,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,SAAS;AAChD,SAAO;AACT;;;AD1DA,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuB1B,eAAsB,cACpB,WACA,SACiB;AACjB,QAAM,WAAWC,MAAK,WAAW,QAAQ,IAAI;AAE7C,QAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAEzC,QAAM,UAAU,OAAO,mBAAmB;AAAA,IACxC,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ;AAAA,IACrB,aAAa,QAAQ;AAAA,EACvB,CAAC;AACD,QAAM,UAAUA,MAAK,UAAU,UAAU,GAAG,SAAS,OAAO;AAE5D,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,EAAE,aAAa,QAAQ,aAAa,aAAa,QAAQ,YAAY;AAAA,EACvE;AACA,QAAM,UAAUA,MAAK,UAAU,eAAe,GAAG,iBAAiB,OAAO;AAEzE,aAAW,OAAO,QAAQ,aAAa,CAAC,GAAG;AACzC,UAAM,MAAMA,MAAK,UAAU,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,UAAM,UAAUA,MAAK,UAAU,KAAK,UAAU,GAAG,IAAI,OAAO;AAAA,EAC9D;AAEA,SAAO;AACT;;;AE1CA,eAAsB,gBACpB,QACuB;AACvB,QAAM,UAA+B,CAAC;AAEtC,aAAW,SAAS,QAAQ;AAC1B,QAAI;AACF,YAAM,SAAS,MAAM,MAAM,MAAM;AACjC,cAAQ,KAAK,EAAE,MAAM,MAAM,MAAM,OAAO,CAAC;AAAA,IAC3C,SAAS,KAAK;AACZ,cAAQ,KAAK;AAAA,QACX,MAAM,MAAM;AAAA,QACZ,QAAQ;AAAA,UACN,QAAQ;AAAA,UACR,SAAS,gBAAgB,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAAA,QAC3E;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,QAAM,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE;AAC5C,aAAW,KAAK,SAAS;AACvB,YAAQ,EAAE,OAAO,MAAM;AAAA,EACzB;AAEA,SAAO,EAAE,SAAS,QAAQ;AAC5B;AAEO,SAAS,aAAa,QAA8B;AACzD,QAAM,QAAQ,CAAC,8BAA8B,4BAA4B;AAEzE,QAAM,aAAa,EAAE,MAAM,UAAU,MAAM,UAAU,MAAM,SAAS;AAEpE,aAAW,SAAS,OAAO,SAAS;AAClC,UAAM,KAAK,GAAG,WAAW,MAAM,OAAO,MAAM,CAAC,IAAI,MAAM,OAAO,OAAO,EAAE;AAAA,EACzE;AAEA,QAAM,KAAK,EAAE;AACb,QAAM;AAAA,IACJ,YAAY,OAAO,QAAQ,IAAI,YAAY,OAAO,QAAQ,IAAI,gBAAgB,OAAO,QAAQ,IAAI;AAAA,EACnG;AAEA,SAAO,MAAM,KAAK,IAAI;AACxB;;;ACvDA,SAAS,YAAAC,WAAU,aAAAC,YAAW,SAAAC,QAAO,WAAAC,UAAS,QAAAC,aAAY;AAC1D,SAAS,QAAAC,OAAM,SAAS,gBAAgB;AAGxC,IAAM,eAAe;AAErB,eAAsB,WACpB,cACA,YACA,SACe;AACf,QAAM,WAAW,MAAMC,UAAS,cAAc,OAAO;AACrD,QAAM,WAAW,OAAO,UAAU,OAAO;AAEzC,QAAM,aAAa,WAAW,SAAS,YAAY,IAC/C,WAAW,MAAM,GAAG,CAAC,aAAa,MAAM,IACxC;AAEJ,QAAMC,OAAM,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,QAAMC,WAAU,YAAY,UAAU,OAAO;AAC/C;AAEA,eAAsB,gBACpB,aACA,WACA,SACmB;AACnB,QAAM,WAAqB,CAAC;AAE5B,iBAAe,KAAK,KAA4B;AAC9C,UAAM,UAAU,MAAMC,SAAQ,GAAG;AACjC,eAAW,SAAS,SAAS;AAC3B,YAAM,WAAWC,MAAK,KAAK,KAAK;AAChC,YAAM,UAAU,SAAS,aAAa,QAAQ;AAC9C,YAAM,UAAUA,MAAK,WAAW,OAAO;AACvC,YAAM,OAAO,MAAMC,MAAK,QAAQ;AAEhC,UAAI,KAAK,YAAY,GAAG;AACtB,cAAMJ,OAAM,SAAS,EAAE,WAAW,KAAK,CAAC;AACxC,cAAM,KAAK,QAAQ;AAAA,MACrB,WAAW,MAAM,SAAS,YAAY,GAAG;AACvC,cAAM,WAAW,UAAU,SAAS,OAAO;AAC3C,iBAAS,KAAK,QAAQ,MAAM,GAAG,CAAC,aAAa,MAAM,CAAC;AAAA,MACtD;AAAA,IACF;AAAA,EACF;AAEA,QAAM,KAAK,WAAW;AACtB,SAAO;AACT;;;ACjDA,SAAS,YAAY,SAAAK,cAAa;AAClC,SAAS,WAAAC,UAAS,WAAAC,gBAAe;AAGjC,IAAM,kBAAkB;AACxB,IAAM,WAAW;AAEV,IAAM,cAAN,MAAkB;AAAA,EACf;AAAA,EAER,YAAY,KAAa,QAAiB;AACxC,SAAK,UAAUD,SAAQ,KAAK,UAAU,iBAAiB,QAAQ;AAAA,EACjE;AAAA,EAEA,MAAM,IAAI,MAAsB,SAAiB,MAA+C;AAC9F,UAAM,QAAoB;AAAA,MACxB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAMD,OAAME,SAAQ,KAAK,OAAO,GAAG,EAAE,WAAW,KAAK,CAAC;AACtD,UAAM,WAAW,KAAK,SAAS,KAAK,UAAU,KAAK,IAAI,MAAM,OAAO;AAAA,EACtE;AAAA,EAEA,aAAqB;AACnB,WAAO,KAAK;AAAA,EACd;AACF;;;AC7BA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,UAAS,WAAAC,UAAS,YAAAC,WAAU,WAAW;AAKzC,IAAM,kBAAN,MAAsB;AAAA,EACnB,SAAyB,CAAC;AAAA,EAElC,SAAS,KAAa,SAAiB,WAAW,IAAU;AAC1D,SAAK,OAAO,KAAK,EAAE,KAAK,SAAS,SAAS,CAAC;AAAA,EAC7C;AAAA,EAEA,MAAM,cAAc,KAA4B;AAC9C,UAAM,WAAWC,SAAQ,KAAK,WAAW;AACzC,QAAIC,YAAW,QAAQ,GAAG;AACxB,YAAM,UAAU,MAAMC,UAAS,UAAU,OAAO;AAChD,WAAK,SAAS,eAAe,SAAS,EAAE;AAAA,IAC1C;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,oBAAoB,KAAa,aAAqC;AAC1E,UAAM,OAAO,eAAe,MAAM,gBAAgB,GAAG;AACrD,UAAM,OAAO,qBAAqB,MAAM,GAAG;AAE3C,aAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,YAAM,WAAW,KAAK,CAAC;AACvB,YAAM,UAAU,MAAMA,UAAS,UAAU,OAAO;AAChD,YAAM,QAAQ;AACd,WAAK,SAAS,aAAa,KAAK,IAAI,SAAS,KAAK,KAAK;AAAA,IACzD;AAAA,EACF;AAAA,EAEA,MAAM,iBAAiB,QAAuB,KAA4B;AACxE,UAAM,SAAS,MAAM,eAAe,OAAO,OAAO,aAAa,GAAG;AAClE,QAAI,OAAO,WAAW,EAAG;AAEzB,UAAM,QAAQ,CAAC,mBAAmB;AAClC,eAAW,SAAS,QAAQ;AAC1B,UAAI,MAAM,OAAO;AACf,cAAM,KAAK,KAAK,MAAM,IAAI,KAAK,MAAM,WAAW,EAAE;AAAA,MACpD;AAAA,IACF;AACA,SAAK,SAAS,UAAU,MAAM,KAAK,IAAI,GAAG,EAAE;AAAA,EAC9C;AAAA,EAEA,eAAe,OAAuB;AACpC,QAAI,MAAM,WAAW,EAAG;AACxB,UAAM,UAAU,MAAM,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,EAAE,KAAK,IAAI;AACpD,SAAK,SAAS,gBAAgB,SAAS,EAAE;AAAA,EAC3C;AAAA,EAEA,OAAO,KAAa,SAAiB,UAAyB;AAC5D,SAAK,SAAS,KAAK,SAAS,QAAQ;AAAA,EACtC;AAAA,EAEA,MAAM,SAAsD;AAC1D,UAAM,SAAS,CAAC,GAAG,KAAK,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAAQ;AACtE,UAAM,WAAqB,SAAS,YAAY;AAChD,UAAM,QAAkB,CAAC;AAEzB,eAAW,SAAS,QAAQ;AAC1B,YAAM,CAAC,MAAM,KAAK,IAAI,WAAW,MAAM,KAAK,QAAQ;AACpD,UAAI,KAAM,OAAM,KAAK,IAAI;AACzB,YAAM,KAAK,MAAM,OAAO;AACxB,UAAI,MAAO,OAAM,KAAK,KAAK;AAC3B,YAAM,KAAK,EAAE;AAAA,IACf;AAEA,WAAO;AAAA,MACL,QAAQ;AAAA,MACR,UAAU,MAAM,KAAK,IAAI,EAAE,KAAK;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS,CAAC;AAAA,EACjB;AACF;AAEA,SAAS,WAAW,KAAa,OAAiD;AAChF,UAAQ,OAAO;AAAA,IACb,KAAK;AACH,aAAO,CAAC,IAAI,GAAG,KAAK,KAAK,GAAG,GAAG;AAAA,IACjC,KAAK;AACH,aAAO,CAAC,QAAQ,GAAG,QAAQ,SAAS,GAAG,MAAM;AAAA,IAC/C,KAAK;AACH,aAAO,CAAC,MAAM,IAAI;AAAA,EACtB;AACF;AAEA,SAAS,qBAAqB,MAAc,KAAuB;AACjE,QAAM,QAAkB,CAAC;AACzB,MAAI,UAAUF,SAAQ,IAAI;AAC1B,QAAM,SAASA,SAAQ,GAAG;AAC1B,QAAM,QAAQG,UAAS,SAAS,MAAM,EACnC,MAAM,GAAG,EACT,OAAO,OAAO;AAEjB,QAAM,UAAU,CAAC,QAAsB;AACrC,UAAM,WAAWH,SAAQ,KAAK,WAAW;AACzC,QAAIC,YAAW,QAAQ,GAAG;AACxB,YAAM,KAAK,QAAQ;AAAA,IACrB;AAAA,EACF;AAEA,UAAQ,OAAO;AACf,aAAW,QAAQ,OAAO;AACxB,cAAUD,SAAQ,SAAS,IAAI;AAC/B,QAAI,CAAC,OAAO,WAAW,OAAO,EAAG;AACjC,YAAQ,OAAO;AAAA,EACjB;AAEA,SAAO;AACT;AAEA,eAAe,gBAAgB,KAA8B;AAC3D,MAAI,MAAMA,SAAQ,GAAG;AACrB,SAAO,MAAM;AACX,QAAIC,YAAWD,SAAQ,KAAK,UAAU,CAAC,KAAKC,YAAWD,SAAQ,KAAK,MAAM,CAAC,GAAG;AAC5E,aAAO;AAAA,IACT;AACA,UAAM,SAASI,SAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACF;;;AC7HO,IAAM,iBAAN,MAAqB;AAAA,EAClB,UAAsC,oBAAI,IAAI;AAAA,EAEtD,SAAS,QAA6B;AACpC,SAAK,QAAQ,IAAI,OAAO,MAAM,MAAM;AAAA,EACtC;AAAA,EAEA,IAAI,MAAyC;AAC3C,WAAO,KAAK,QAAQ,IAAI,IAAI;AAAA,EAC9B;AAAA,EAEA,OAAwB;AACtB,WAAO,CAAC,GAAG,KAAK,QAAQ,OAAO,CAAC;AAAA,EAClC;AAAA,EAEA,kBAAoC;AAClC,UAAM,WAA6B,CAAC;AACpC,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,SAAU,UAAS,KAAK,GAAG,OAAO,QAAQ;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,gBAAmC;AACjC,UAAM,SAA4B,CAAC;AACnC,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,OAAQ,QAAO,KAAK,GAAG,OAAO,MAAM;AAAA,IACjD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,eAA8B;AAC5B,UAAM,QAAuB,CAAC;AAC9B,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,MAAO,OAAM,KAAK,GAAG,OAAO,KAAK;AAAA,IAC9C;AACA,WAAO;AAAA,EACT;AAAA,EAEA,sBAAqC;AACnC,UAAM,SAAwB,CAAC;AAC/B,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,aAAc,QAAO,KAAK,GAAG,OAAO,YAAY;AAAA,IAC7D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,kBAAiC;AAC/B,UAAM,WAA0B,CAAC;AACjC,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,SAAU,UAAS,KAAK,GAAG,OAAO,QAAQ;AAAA,IACvD;AACA,WAAO;AAAA,EACT;AAAA,EAEA,0BAAoC;AAClC,UAAM,OAAiB,CAAC;AACxB,eAAW,UAAU,KAAK,QAAQ,OAAO,GAAG;AAC1C,UAAI,OAAO,iBAAkB,MAAK,KAAK,GAAG,OAAO,gBAAgB;AAAA,IACnE;AACA,WAAO;AAAA,EACT;AAAA,EAEA,QAAgB;AACd,WAAO,KAAK,QAAQ;AAAA,EACtB;AACF;;;ACtEO,IAAM,kBAAN,MAAsB;AAAA,EACnB,QAAkC,oBAAI,IAAI;AAAA,EAC1C,YAAkC,oBAAI,IAAI;AAAA,EAC1C,UAA+B,oBAAI,IAAI;AAAA,EACvC,cAAwB,CAAC;AAAA,EAEjC,SAAS,MAAyB;AAChC,SAAK,MAAM,IAAI,KAAK,IAAI,IAAI;AAAA,EAC9B;AAAA,EAEA,aAAa,OAA4B;AACvC,eAAW,QAAQ,OAAO;AACxB,WAAK,SAAS,IAAI;AAAA,IACpB;AAAA,EACF;AAAA,EAEA,cAAc,WAAmB,WAAyB;AACxD,SAAK,QAAQ,IAAI,WAAW,SAAS;AAAA,EACvC;AAAA,EAEA,gBAAgB,UAAwC;AACtD,eAAW,CAAC,QAAQ,EAAE,KAAK,OAAO,QAAQ,QAAQ,GAAG;AACnD,WAAK,cAAc,QAAQ,EAAE;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,eAAe,WAA0C;AACvD,eAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,SAAS,GAAG;AACpD,YAAM,OAAO,KAAK,UAAU,GAAG;AAC/B,UAAI,MAAM;AACR,YAAI,KAAK,UAAU,UAAW;AAC9B,aAAK,UAAU,IAAI,KAAK,IAAI,KAAK;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,UAAU,IAAqB;AAC7B,UAAM,WAAW,KAAK,aAAa,EAAE;AAErC,UAAM,WAAW,KAAK,UAAU,IAAI,QAAQ;AAC5C,QAAI,aAAa,OAAW,QAAO;AAEnC,UAAM,OAAO,KAAK,MAAM,IAAI,QAAQ;AACpC,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,KAAK,UAAU,UAAW,QAAO;AACrC,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAI,IAAqC;AACvC,UAAM,WAAW,KAAK,aAAa,EAAE;AACrC,WAAO,KAAK,MAAM,IAAI,QAAQ;AAAA,EAChC;AAAA,EAEA,OAAsB;AACpB,WAAO,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AAAA,EAChC;AAAA,EAEA,YAAY,OAAoC;AAC9C,WAAO,KAAK,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK;AAAA,EACpD;AAAA,EAEA,cAA6B;AAC3B,WAAO,KAAK,KAAK,EAAE,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,EAAE,CAAC;AAAA,EACvD;AAAA,EAEA,QAA8D;AAC5D,UAAM,QAAQ,KAAK,MAAM;AACzB,UAAM,UAAU,KAAK,YAAY,EAAE;AACnC,WAAO,EAAE,OAAO,SAAS,UAAU,QAAQ,QAAQ;AAAA,EACrD;AAAA,EAEA,iBAA2B;AACzB,WAAO,CAAC,GAAG,KAAK,WAAW;AAAA,EAC7B;AAAA,EAEQ,aAAa,KAAqB;AACxC,UAAM,SAAS,KAAK,QAAQ,IAAI,GAAG;AACnC,QAAI,QAAQ;AACV,WAAK,YAAY,KAAK,eAAe,GAAG,kBAAkB,MAAM,GAAG;AACnE,aAAO;AAAA,IACT;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,UAAU,KAAsC;AACtD,UAAM,WAAW,KAAK,aAAa,GAAG;AACtC,UAAM,SAAS,KAAK,MAAM,IAAI,QAAQ;AACtC,QAAI,OAAQ,QAAO;AAEnB,eAAW,QAAQ,KAAK,MAAM,OAAO,GAAG;AACtC,UAAI,KAAK,QAAQ,YAAY,KAAK,OAAO,SAAU,QAAO;AAAA,IAC5D;AACA,WAAO;AAAA,EACT;AACF;;;AChGA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,cAAAC,mBAAkB;AAC3B,SAAS,WAAAC,gBAAe;AACxB,SAAS,SAASC,kBAAiB;AAGnC,IAAM,mBAAmB,CAAC,cAAc,YAAY;AAEpD,eAAsB,cAAc,KAAqC;AACvE,QAAM,WAA0B,CAAC;AAEjC,QAAM,aAAaD,SAAQ,KAAK,UAAU;AAC1C,aAAW,YAAY,kBAAkB;AACvC,UAAM,WAAWA,SAAQ,YAAY,QAAQ;AAC7C,QAAI,CAACD,YAAW,QAAQ,EAAG;AAE3B,UAAM,UAAU,MAAMD,UAAS,UAAU,OAAO;AAChD,UAAM,SAAS,SAAS,SAAS,OAAO,IACpC,KAAK,MAAM,OAAO,IAClBG,WAAU,OAAO;AAErB,QAAI,UAAU,MAAM,QAAQ,OAAO,KAAK,GAAG;AACzC,iBAAW,QAAQ,OAAO,OAAO;AAC/B,YAAI,KAAK,SAAS,KAAK,SAAS;AAC9B,mBAAS,KAAK;AAAA,YACZ,OAAO,KAAK;AAAA,YACZ,SAAS,KAAK;AAAA,YACd,SAAS,KAAK;AAAA,UAChB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAEA;AAAA,EACF;AAEA,SAAO;AACT;;;ACrCA,SAAS,gBAAgB;AAGlB,IAAM,iBAAN,MAAqB;AAAA,EAClB;AAAA,EAER,YAAY,UAAyB;AACnC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,MAAM,SACJ,OACA,KACA,MACuB;AACvB,UAAM,WAAW,KAAK,SAAS,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK;AAC9D,QAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAEnC,UAAM,UAAuB;AAAA,MAC3B;AAAA,MACA,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC;AAAA,MACA;AAAA,IACF;AAEA,UAAM,cAAc,KAAK,UAAU,OAAO;AAC1C,UAAM,UAAwB,CAAC;AAE/B,eAAW,WAAW,UAAU;AAC9B,UAAI,QAAQ,WAAW,MAAM;AAC3B,cAAM,aAAa,OAAO,KAAK,SAAS,EAAE;AAC1C,YAAI,cAAc,CAAC,WAAW,SAAS,QAAQ,OAAO,EAAG;AAAA,MAC3D;AAEA,YAAM,QAAQ,KAAK,IAAI;AACvB,UAAI;AACF,cAAM,SAAS,SAAS,QAAQ,SAAS;AAAA,UACvC;AAAA,UACA,OAAO;AAAA,UACP,OAAO,CAAC,QAAQ,QAAQ,MAAM;AAAA,UAC9B,SAAS;AAAA,QACX,CAAC,EAAE,SAAS;AAEZ,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA,QAAQ;AAAA,UACR,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,cAAM,UAAU;AAChB,gBAAQ,KAAK;AAAA,UACX;AAAA,UACA,UAAU,QAAQ,UAAU;AAAA,UAC5B,QAAQ,QAAQ,QAAQ,SAAS,KAAK;AAAA,UACtC,QAAQ,QAAQ,QAAQ,SAAS,KAAK;AAAA,UACtC,YAAY,KAAK,IAAI,IAAI;AAAA,QAC3B,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,YAAY,OAA+B;AACzC,WAAO,KAAK,SAAS,KAAK,CAAC,MAAM,EAAE,UAAU,KAAK;AAAA,EACpD;AACF;;;ACpEA,SAAS,WAAAC,UAAS,WAAAC,gBAAe;AACjC,SAAS,SAAAC,QAAO,aAAAC,kBAAiB;AAoD1B,IAAM,iBAAN,MAAM,gBAAe;AAAA,EACjB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEQ;AAAA,EACA;AAAA,EAET,YAAY,MASjB;AACD,SAAK,MAAM,KAAK;AAChB,SAAK,mBAAmB,KAAK;AAC7B,SAAK,eAAe,KAAK;AACzB,SAAK,SAAS,KAAK;AACnB,SAAK,UAAU,KAAK;AACpB,SAAK,iBAAiB,KAAK;AAC3B,SAAK,cAAc,KAAK;AACxB,SAAK,kBAAkB,KAAK;AAC5B,SAAK,gBAAgB,IAAI,cAAc,KAAK,QAAQ,OAAO,eAAe,CAAC,CAAC;AAAA,EAC9E;AAAA,EAEA,aAAa,OAAO,MAA6D;AAC/E,UAAM,MAAM,MAAM,OAAO,QAAQ,IAAI;AACrC,UAAM,mBAAmB,oBAAoB,GAAG;AAChD,UAAM,eAAe,gBAAgB,GAAG;AAExC,QAAI,MAAM,wBAAwB,CAAC,kBAAkB;AACnD,YAAM,IAAI,MAAM,0EAA0E;AAAA,IAC5F;AAEA,UAAM,SAAS,mBAAmB,MAAM,WAAW,EAAE,IAAI,CAAC,IAAI;AAC9D,UAAM,UAAU,MAAM,kBAAkB,GAAG;AAC3C,UAAM,WAAW,mBAAmB,MAAM,cAAc,GAAG,IAAI,CAAC;AAChE,UAAM,kBAAkB,qBAAqB,MAAM;AAEnD,WAAO,IAAI,gBAAe;AAAA,MACxB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,gBAAgB,IAAI,eAAe,QAAQ;AAAA,MAC3C,aAAa,IAAI,YAAY,GAAG;AAAA,MAChC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,YAA2B;AACzB,UAAM,QAAQ,oBAAI,IAAyB;AAE3C,QAAI,KAAK,SAAS;AAChB,iBAAW,WAAW,KAAK,QAAQ,YAAY,GAAG;AAChD,cAAM,IAAI,QAAQ,MAAM,cAAc,SAAS,WAAW,KAAK,QAAQ,IAAI,CAAC;AAAA,MAC9E;AAAA,IACF;AAEA,QAAI,KAAK,QAAQ;AACf,iBAAW,CAAC,MAAM,OAAO,KAAK,OAAO,QAAQ,KAAK,OAAO,UAAU,QAAQ,GAAG;AAC5E,cAAM,IAAI,MAAM;AAAA,UACd;AAAA,UACA;AAAA,UACA,aAAa,qBAAqB,IAAI;AAAA,UACtC,QAAQ;AAAA,QACV,CAAC;AAAA,MACH;AAAA,IACF;AAEA,WAAO,CAAC,GAAG,MAAM,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,KAAK,cAAc,EAAE,IAAI,CAAC;AAAA,EACxE;AAAA,EAEA,QAAQ,MAAuC;AAC7C,WAAO,KAAK,UAAU,EAAE,KAAK,CAAC,SAAS,KAAK,SAAS,IAAI;AAAA,EAC3D;AAAA,EAEA,oBAA2C;AACzC,UAAM,qBAAqB,KAAK,QAAQ,YAAY,CAAC;AAErD,WAAO,KAAK,gBAAgB,KAAK,EAAE,IAAI,CAAC,UAAU;AAAA,MAChD;AAAA,MACA,SAAS,KAAK,gBAAgB,UAAU,KAAK,EAAE;AAAA,MAC/C,YAAY,OAAO,UAAU,eAAe,KAAK,oBAAoB,KAAK,GAAG;AAAA,MAC7E,iBAAiB,mBAAmB,KAAK,GAAG;AAAA,IAC9C,EAAE;AAAA,EACJ;AAAA,EAEA,MAAM,cACJ,OACA,MACuB;AACvB,QAAI,CAAC,KAAK,oBAAoB,CAAC,KAAK,eAAe,YAAY,KAAK,GAAG;AACrE,aAAO,CAAC;AAAA,IACV;AAEA,UAAM,UAAU,MAAM,KAAK,eAAe,SAAS,OAAO,KAAK,KAAK,IAAI;AACxE,UAAM,KAAK,IAAI,iBAAiB,YAAY,QAAQ,MAAM,gBAAgB,KAAK,IAAI;AAAA,MACjF;AAAA,MACA,SAAS,QAAQ,IAAI,CAAC,YAAY;AAAA,QAChC,SAAS,OAAO,QAAQ;AAAA,QACxB,UAAU,OAAO;AAAA,QACjB,YAAY,OAAO;AAAA,MACrB,EAAE;AAAA,IACJ,CAAC;AACD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,IACJ,MACA,SACA,MACe;AACf,QAAI,CAAC,KAAK,oBAAoB,SAAS,SAAS;AAC9C;AAAA,IACF;AACA,UAAM,KAAK,YAAY,IAAI,MAAM,SAAS,IAAI;AAAA,EAChD;AAAA,EAEA,MAAM,aACJ,MACgC;AAChC,UAAM,WAAW,IAAI,gBAAgB;AACrC,UAAM,SAAS,oBAAoB,KAAK,GAAG;AAE3C,QAAI,KAAK,WAAW,MAAM,sBAAsB,OAAO;AACrD,eAAS,eAAe,KAAK,OAAO,UAAU,UAAU,YAAY;AAAA,IACtE;AAEA,QAAI,KAAK,WAAW,MAAM,iBAAiB,OAAO;AAChD,YAAM,SAAS,iBAAiB,KAAK,QAAQ,KAAK,GAAG;AAAA,IACvD;AAEA,WAAO,SAAS,MAAM,EAAE,UAAU,MAAM,YAAY,WAAW,CAAC;AAAA,EAClE;AAAA,EAEA,MAAM,aACJ,MACgC;AAChC,UAAM,SAAS,MAAM,KAAK,aAAa,IAAI;AAC3C,UAAM,aAAaC,SAAQ,KAAK,KAAK,KAAK,UAAU;AACpD,UAAMC,OAAMC,SAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,UAAMC,WAAU,YAAY,OAAO,WAAW,MAAM,OAAO;AAC3D,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cACP,SACA,QACA,aACa;AACb,SAAO;AAAA,IACL,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ;AAAA,IACjB,aAAa,QAAQ;AAAA,IACrB;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,qBAAqB,QAAyC;AACrE,QAAM,WAAW,IAAI,gBAAgB;AACrC,QAAM,aAAa,QAAQ,YAAY,CAAC;AAExC,aAAW,OAAO,OAAO,KAAK,UAAU,GAAG;AACzC,aAAS,SAAS;AAAA,MAChB,IAAI;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP,gBAAgB;AAAA,MAChB,aAAa,gCAAgC,GAAG;AAAA,IAClD,CAAC;AAAA,EACH;AAEA,WAAS,eAAe,UAAU;AAClC,SAAO;AACT;","names":["existsSync","join","execSync","existsSync","join","existsSync","join","execSync","existsSync","join","existsSync","join","join","resolve","existsSync","readFile","join","existsSync","resolve","existsSync","join","join","join","readFile","writeFile","mkdir","readdir","stat","join","readFile","mkdir","writeFile","readdir","join","stat","mkdir","resolve","dirname","readFile","existsSync","resolve","dirname","relative","resolve","existsSync","readFile","relative","dirname","readFile","existsSync","resolve","parseYaml","dirname","resolve","mkdir","writeFile","resolve","mkdir","dirname","writeFile"]}
@@ -0,0 +1,124 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ AgentRegistry,
4
+ HarnessRuntime,
5
+ discoverSkills
6
+ } from "./chunk-R6VGYQOH.js";
7
+ import {
8
+ loadConfig,
9
+ projectConfigExists
10
+ } from "./chunk-3P72TGGQ.js";
11
+ import "./chunk-LOE6IDTT.js";
12
+
13
+ // src/cli/list.ts
14
+ async function runList(resource) {
15
+ switch (resource) {
16
+ case "skills":
17
+ await listSkills();
18
+ break;
19
+ case "agents":
20
+ await listAgents();
21
+ break;
22
+ case "commands":
23
+ await listCommands();
24
+ break;
25
+ case "templates":
26
+ listTemplates();
27
+ break;
28
+ case "features":
29
+ await listFeatures();
30
+ break;
31
+ default:
32
+ console.error(`Unknown resource: ${resource}`);
33
+ console.error("Available: skills, agents, commands, templates, features");
34
+ process.exitCode = 1;
35
+ }
36
+ }
37
+ async function listSkills() {
38
+ const cwd = process.cwd();
39
+ let dirs = [".harness/skills"];
40
+ if (projectConfigExists(cwd)) {
41
+ const config = await loadConfig({ cwd });
42
+ dirs = config.skills.directories;
43
+ }
44
+ const skills = await discoverSkills(dirs, cwd);
45
+ if (skills.length === 0) {
46
+ console.log("No skills found.");
47
+ return;
48
+ }
49
+ console.log(`Skills (${skills.length}):
50
+ `);
51
+ for (const skill of skills) {
52
+ const status = skill.valid ? "\u2713" : "\u2717";
53
+ console.log(` ${status} ${skill.name}`);
54
+ if (skill.description) {
55
+ console.log(` ${skill.description.slice(0, 80)}${skill.description.length > 80 ? "..." : ""}`);
56
+ }
57
+ }
58
+ }
59
+ async function listAgents() {
60
+ const cwd = process.cwd();
61
+ let customDefs = [];
62
+ if (projectConfigExists(cwd)) {
63
+ const config = await loadConfig({ cwd });
64
+ customDefs = config.agents.definitions;
65
+ }
66
+ const registry = new AgentRegistry(customDefs);
67
+ const counts = registry.count();
68
+ const domains = registry.domains();
69
+ console.log(`Agents (${counts.total} total: ${counts.builtin} built-in, ${counts.custom} custom):
70
+ `);
71
+ for (const domain of domains.sort()) {
72
+ const agents = registry.listByDomain(domain);
73
+ console.log(` [${domain}]`);
74
+ for (const a of agents) {
75
+ console.log(` ${a.name} (${a.tier})`);
76
+ }
77
+ }
78
+ }
79
+ async function listCommands() {
80
+ const runtime = await HarnessRuntime.create({ requireProjectConfig: true });
81
+ const tasks = runtime.listTasks();
82
+ if (tasks.length === 0) {
83
+ console.log("No commands registered.");
84
+ return;
85
+ }
86
+ console.log(`Commands (${tasks.length}):
87
+ `);
88
+ for (const task of tasks) {
89
+ const suffix = task.adapterName ? ` via ${task.adapterName}` : "";
90
+ console.log(` ${task.name}: ${task.command} [${task.source}${suffix}]`);
91
+ }
92
+ }
93
+ async function listFeatures() {
94
+ const runtime = await HarnessRuntime.create();
95
+ if (!runtime.hasAnyConfig) {
96
+ console.log("No harness configuration found. Run `agent-harness setup` first.");
97
+ return;
98
+ }
99
+ const features = runtime.listFeatureStates();
100
+ if (features.length === 0) {
101
+ console.log("No feature flags registered.");
102
+ return;
103
+ }
104
+ console.log(`Features (${features.length}):
105
+ `);
106
+ for (const feature of features) {
107
+ const configured = feature.configured ? ` configured=${String(feature.configuredValue)}` : "";
108
+ console.log(
109
+ ` ${feature.spec.key}: ${feature.enabled ? "enabled" : "disabled"} (${feature.spec.stage})${configured}`
110
+ );
111
+ }
112
+ }
113
+ function listTemplates() {
114
+ console.log("Available AGENTS.md templates:\n");
115
+ console.log(" minimal \u2014 Minimal AGENTS.md with basic structure");
116
+ console.log(" standard \u2014 Standard version with common rules");
117
+ console.log(" full \u2014 Complete version with orchestration rules");
118
+ console.log("\nAvailable skill templates:\n");
119
+ console.log(" basic \u2014 Basic skill (SKILL.md + metadata.yaml)");
120
+ }
121
+ export {
122
+ runList
123
+ };
124
+ //# sourceMappingURL=list-ABNY2TO7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/list.ts"],"sourcesContent":["import { discoverSkills } from \"../skill/manager.js\";\nimport { AgentRegistry } from \"../agent/registry.js\";\nimport { loadConfig, projectConfigExists } from \"../config/loader.js\";\nimport type { AgentDefinition } from \"../config/schema.js\";\nimport { HarnessRuntime } from \"../runtime/harness.js\";\n\nexport async function runList(resource: string): Promise<void> {\n switch (resource) {\n case \"skills\":\n await listSkills();\n break;\n case \"agents\":\n await listAgents();\n break;\n case \"commands\":\n await listCommands();\n break;\n case \"templates\":\n listTemplates();\n break;\n case \"features\":\n await listFeatures();\n break;\n default:\n console.error(`Unknown resource: ${resource}`);\n console.error(\"Available: skills, agents, commands, templates, features\");\n process.exitCode = 1;\n }\n}\n\nasync function listSkills(): Promise<void> {\n const cwd = process.cwd();\n let dirs = [\".harness/skills\"];\n if (projectConfigExists(cwd)) {\n const config = await loadConfig({ cwd });\n dirs = config.skills.directories;\n }\n const skills = await discoverSkills(dirs, cwd);\n\n if (skills.length === 0) {\n console.log(\"No skills found.\");\n return;\n }\n\n console.log(`Skills (${skills.length}):\\n`);\n for (const skill of skills) {\n const status = skill.valid ? \"✓\" : \"✗\";\n console.log(` ${status} ${skill.name}`);\n if (skill.description) {\n console.log(` ${skill.description.slice(0, 80)}${skill.description.length > 80 ? \"...\" : \"\"}`);\n }\n }\n}\n\nasync function listAgents(): Promise<void> {\n const cwd = process.cwd();\n let customDefs: AgentDefinition[] = [];\n if (projectConfigExists(cwd)) {\n const config = await loadConfig({ cwd });\n customDefs = config.agents.definitions;\n }\n\n const registry = new AgentRegistry(customDefs);\n const counts = registry.count();\n const domains = registry.domains();\n\n console.log(`Agents (${counts.total} total: ${counts.builtin} built-in, ${counts.custom} custom):\\n`);\n\n for (const domain of domains.sort()) {\n const agents = registry.listByDomain(domain);\n console.log(` [${domain}]`);\n for (const a of agents) {\n console.log(` ${a.name} (${a.tier})`);\n }\n }\n}\n\nasync function listCommands(): Promise<void> {\n const runtime = await HarnessRuntime.create({ requireProjectConfig: true });\n const tasks = runtime.listTasks();\n\n if (tasks.length === 0) {\n console.log(\"No commands registered.\");\n return;\n }\n\n console.log(`Commands (${tasks.length}):\\n`);\n for (const task of tasks) {\n const suffix = task.adapterName ? ` via ${task.adapterName}` : \"\";\n console.log(` ${task.name}: ${task.command} [${task.source}${suffix}]`);\n }\n}\n\nasync function listFeatures(): Promise<void> {\n const runtime = await HarnessRuntime.create();\n\n if (!runtime.hasAnyConfig) {\n console.log(\"No harness configuration found. Run `agent-harness setup` first.\");\n return;\n }\n\n const features = runtime.listFeatureStates();\n if (features.length === 0) {\n console.log(\"No feature flags registered.\");\n return;\n }\n\n console.log(`Features (${features.length}):\\n`);\n for (const feature of features) {\n const configured = feature.configured\n ? ` configured=${String(feature.configuredValue)}`\n : \"\";\n console.log(\n ` ${feature.spec.key}: ${feature.enabled ? \"enabled\" : \"disabled\"} (${feature.spec.stage})${configured}`,\n );\n }\n}\n\nfunction listTemplates(): void {\n console.log(\"Available AGENTS.md templates:\\n\");\n console.log(\" minimal — Minimal AGENTS.md with basic structure\");\n console.log(\" standard — Standard version with common rules\");\n console.log(\" full — Complete version with orchestration rules\");\n console.log(\"\\nAvailable skill templates:\\n\");\n console.log(\" basic — Basic skill (SKILL.md + metadata.yaml)\");\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ anyConfigExists,
4
+ configExists,
5
+ loadConfig,
6
+ loadConfigWithLayers,
7
+ projectConfigExists,
8
+ userConfigExists
9
+ } from "./chunk-3P72TGGQ.js";
10
+ import "./chunk-LOE6IDTT.js";
11
+ export {
12
+ anyConfigExists,
13
+ configExists,
14
+ loadConfig,
15
+ loadConfigWithLayers,
16
+ projectConfigExists,
17
+ userConfigExists
18
+ };
19
+ //# sourceMappingURL=loader-RDQZFHOB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ HarnessRuntime
4
+ } from "./chunk-R6VGYQOH.js";
5
+ import "./chunk-3P72TGGQ.js";
6
+ import "./chunk-LOE6IDTT.js";
7
+
8
+ // src/cli/run.ts
9
+ import { execSync } from "child_process";
10
+ async function runTask(taskName) {
11
+ const runtime = await HarnessRuntime.create({ requireProjectConfig: true });
12
+ const task = runtime.getTask(taskName);
13
+ if (!task) {
14
+ console.error(`Unknown task: "${taskName}"`);
15
+ console.error("\nAvailable tasks:");
16
+ for (const availableTask of runtime.listTasks()) {
17
+ console.error(
18
+ ` ${availableTask.name}: ${availableTask.command} [${availableTask.source}]`
19
+ );
20
+ }
21
+ process.exitCode = 1;
22
+ return;
23
+ }
24
+ console.log(`Running "${task.name}": ${task.command}
25
+ `);
26
+ try {
27
+ execSync(task.command, { cwd: runtime.cwd, stdio: "inherit", timeout: 3e5 });
28
+ await runtime.log("verify", `Task "${task.name}" passed`, {
29
+ task: task.name,
30
+ command: task.command,
31
+ source: task.source
32
+ });
33
+ } catch {
34
+ await runtime.log("verify", `Task "${task.name}" failed`, {
35
+ task: task.name,
36
+ command: task.command,
37
+ source: task.source
38
+ });
39
+ process.exitCode = 1;
40
+ }
41
+ }
42
+ export {
43
+ runTask
44
+ };
45
+ //# sourceMappingURL=run-I5GVJH3N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/run.ts"],"sourcesContent":["import { execSync } from \"node:child_process\";\nimport { HarnessRuntime } from \"../runtime/harness.js\";\n\nexport async function runTask(taskName: string): Promise<void> {\n const runtime = await HarnessRuntime.create({ requireProjectConfig: true });\n const task = runtime.getTask(taskName);\n\n if (!task) {\n console.error(`Unknown task: \"${taskName}\"`);\n console.error(\"\\nAvailable tasks:\");\n for (const availableTask of runtime.listTasks()) {\n console.error(\n ` ${availableTask.name}: ${availableTask.command} [${availableTask.source}]`,\n );\n }\n process.exitCode = 1;\n return;\n }\n\n console.log(`Running \"${task.name}\": ${task.command}\\n`);\n\n try {\n execSync(task.command, { cwd: runtime.cwd, stdio: \"inherit\", timeout: 300_000 });\n await runtime.log(\"verify\", `Task \"${task.name}\" passed`, {\n task: task.name,\n command: task.command,\n source: task.source,\n });\n } catch {\n await runtime.log(\"verify\", `Task \"${task.name}\" failed`, {\n task: task.name,\n command: task.command,\n source: task.source,\n });\n process.exitCode = 1;\n }\n}\n"],"mappings":";;;;;;;;AAAA,SAAS,gBAAgB;AAGzB,eAAsB,QAAQ,UAAiC;AAC7D,QAAM,UAAU,MAAM,eAAe,OAAO,EAAE,sBAAsB,KAAK,CAAC;AAC1E,QAAM,OAAO,QAAQ,QAAQ,QAAQ;AAErC,MAAI,CAAC,MAAM;AACT,YAAQ,MAAM,kBAAkB,QAAQ,GAAG;AAC3C,YAAQ,MAAM,oBAAoB;AAClC,eAAW,iBAAiB,QAAQ,UAAU,GAAG;AAC/C,cAAQ;AAAA,QACN,KAAK,cAAc,IAAI,KAAK,cAAc,OAAO,KAAK,cAAc,MAAM;AAAA,MAC5E;AAAA,IACF;AACA,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,UAAQ,IAAI,YAAY,KAAK,IAAI,MAAM,KAAK,OAAO;AAAA,CAAI;AAEvD,MAAI;AACF,aAAS,KAAK,SAAS,EAAE,KAAK,QAAQ,KAAK,OAAO,WAAW,SAAS,IAAQ,CAAC;AAC/E,UAAM,QAAQ,IAAI,UAAU,SAAS,KAAK,IAAI,YAAY;AAAA,MACxD,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,IACf,CAAC;AAAA,EACH,QAAQ;AACN,UAAM,QAAQ,IAAI,UAAU,SAAS,KAAK,IAAI,YAAY;AAAA,MACxD,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,QAAQ,KAAK;AAAA,IACf,CAAC;AACD,YAAQ,WAAW;AAAA,EACrB;AACF;","names":[]}
@@ -0,0 +1,98 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ render
4
+ } from "./chunk-JKJ3FP6T.js";
5
+ import {
6
+ HarnessRuntime
7
+ } from "./chunk-R6VGYQOH.js";
8
+ import {
9
+ loadConfig,
10
+ projectConfigExists
11
+ } from "./chunk-3P72TGGQ.js";
12
+ import "./chunk-LOE6IDTT.js";
13
+
14
+ // src/cli/scaffold.ts
15
+ import { resolve } from "path";
16
+
17
+ // src/skill/scaffold.ts
18
+ import { mkdir, writeFile } from "fs/promises";
19
+ import { join } from "path";
20
+ var SKILL_MD_TEMPLATE = `---
21
+ name: {{name}}
22
+ description: {{description}}
23
+ ---
24
+
25
+ # {{displayName}}
26
+
27
+ ## Overview
28
+
29
+ TODO: Describe what this skill does.
30
+
31
+ ## Usage
32
+
33
+ TODO: Describe how to use this skill.
34
+ `;
35
+ async function scaffoldSkill(targetDir, options) {
36
+ const skillDir = join(targetDir, options.name);
37
+ await mkdir(skillDir, { recursive: true });
38
+ const content = render(SKILL_MD_TEMPLATE, {
39
+ name: options.name,
40
+ description: options.description,
41
+ displayName: options.displayName
42
+ });
43
+ await writeFile(join(skillDir, "SKILL.md"), content, "utf-8");
44
+ const metadataContent = render(
45
+ "display_name: {{displayName}}\ndescription: {{description}}\n",
46
+ { displayName: options.displayName, description: options.description }
47
+ );
48
+ await writeFile(join(skillDir, "metadata.yaml"), metadataContent, "utf-8");
49
+ for (const res of options.resources ?? []) {
50
+ await mkdir(join(skillDir, res), { recursive: true });
51
+ await writeFile(join(skillDir, res, ".gitkeep"), "", "utf-8");
52
+ }
53
+ return skillDir;
54
+ }
55
+
56
+ // src/cli/scaffold.ts
57
+ async function runScaffoldSkill(name, opts) {
58
+ const cwd = process.cwd();
59
+ const runtime = await HarnessRuntime.create();
60
+ await runtime.dispatchHooks("scaffold.pre", {
61
+ command: "scaffold",
62
+ type: "skill",
63
+ name
64
+ });
65
+ let targetDir = resolve(cwd, ".harness/skills");
66
+ if (projectConfigExists(cwd)) {
67
+ const config = await loadConfig({ cwd });
68
+ const dirs = config.skills.directories;
69
+ if (dirs.length > 0) {
70
+ targetDir = resolve(cwd, dirs[0]);
71
+ }
72
+ }
73
+ const displayName = name.split("-").map((w) => w.charAt(0).toUpperCase() + w.slice(1)).join(" ");
74
+ const description = opts.description ?? `${displayName} skill`;
75
+ const skillDir = await scaffoldSkill(targetDir, {
76
+ name,
77
+ description,
78
+ displayName
79
+ });
80
+ await runtime.dispatchHooks("scaffold.post", {
81
+ command: "scaffold",
82
+ type: "skill",
83
+ name,
84
+ skillDir
85
+ });
86
+ await runtime.log("scaffold", `Skill "${name}" scaffolded`, {
87
+ name,
88
+ skillDir
89
+ });
90
+ console.log(`Skill scaffolded at ${skillDir}`);
91
+ console.log("\nFiles created:");
92
+ console.log(" SKILL.md \u2014 Skill definition with frontmatter");
93
+ console.log(" metadata.yaml \u2014 Skill metadata for discovery");
94
+ }
95
+ export {
96
+ runScaffoldSkill
97
+ };
98
+ //# sourceMappingURL=scaffold-C6JA3STC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/scaffold.ts","../src/skill/scaffold.ts"],"sourcesContent":["import { resolve } from \"node:path\";\nimport { loadConfig, projectConfigExists } from \"../config/loader.js\";\nimport { scaffoldSkill } from \"../skill/scaffold.js\";\nimport { HarnessRuntime } from \"../runtime/harness.js\";\n\nexport interface ScaffoldSkillOptions {\n description?: string;\n}\n\nexport async function runScaffoldSkill(\n name: string,\n opts: ScaffoldSkillOptions,\n): Promise<void> {\n const cwd = process.cwd();\n const runtime = await HarnessRuntime.create();\n\n await runtime.dispatchHooks(\"scaffold.pre\", {\n command: \"scaffold\",\n type: \"skill\",\n name,\n });\n\n let targetDir = resolve(cwd, \".harness/skills\");\n if (projectConfigExists(cwd)) {\n const config = await loadConfig({ cwd });\n const dirs = config.skills.directories;\n if (dirs.length > 0) {\n targetDir = resolve(cwd, dirs[0]);\n }\n }\n\n const displayName = name\n .split(\"-\")\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(\" \");\n const description = opts.description ?? `${displayName} skill`;\n\n const skillDir = await scaffoldSkill(targetDir, {\n name,\n description,\n displayName,\n });\n\n await runtime.dispatchHooks(\"scaffold.post\", {\n command: \"scaffold\",\n type: \"skill\",\n name,\n skillDir,\n });\n await runtime.log(\"scaffold\", `Skill \"${name}\" scaffolded`, {\n name,\n skillDir,\n });\n\n console.log(`Skill scaffolded at ${skillDir}`);\n console.log(\"\\nFiles created:\");\n console.log(\" SKILL.md — Skill definition with frontmatter\");\n console.log(\" metadata.yaml — Skill metadata for discovery\");\n}\n","import { mkdir, writeFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { render } from \"../template/engine.js\";\n\nconst SKILL_MD_TEMPLATE = `---\nname: {{name}}\ndescription: {{description}}\n---\n\n# {{displayName}}\n\n## Overview\n\nTODO: Describe what this skill does.\n\n## Usage\n\nTODO: Describe how to use this skill.\n`;\n\nexport interface ScaffoldOptions {\n name: string;\n description: string;\n displayName: string;\n resources?: (\"scripts\" | \"references\" | \"assets\")[];\n}\n\nexport async function scaffoldSkill(\n targetDir: string,\n options: ScaffoldOptions,\n): Promise<string> {\n const skillDir = join(targetDir, options.name);\n\n await mkdir(skillDir, { recursive: true });\n\n const content = render(SKILL_MD_TEMPLATE, {\n name: options.name,\n description: options.description,\n displayName: options.displayName,\n });\n await writeFile(join(skillDir, \"SKILL.md\"), content, \"utf-8\");\n\n const metadataContent = render(\n \"display_name: {{displayName}}\\ndescription: {{description}}\\n\",\n { displayName: options.displayName, description: options.description },\n );\n await writeFile(join(skillDir, \"metadata.yaml\"), metadataContent, \"utf-8\");\n\n for (const res of options.resources ?? []) {\n await mkdir(join(skillDir, res), { recursive: true });\n await writeFile(join(skillDir, res, \".gitkeep\"), \"\", \"utf-8\");\n }\n\n return skillDir;\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,eAAe;;;ACAxB,SAAS,OAAO,iBAAiB;AACjC,SAAS,YAAY;AAGrB,IAAM,oBAAoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuB1B,eAAsB,cACpB,WACA,SACiB;AACjB,QAAM,WAAW,KAAK,WAAW,QAAQ,IAAI;AAE7C,QAAM,MAAM,UAAU,EAAE,WAAW,KAAK,CAAC;AAEzC,QAAM,UAAU,OAAO,mBAAmB;AAAA,IACxC,MAAM,QAAQ;AAAA,IACd,aAAa,QAAQ;AAAA,IACrB,aAAa,QAAQ;AAAA,EACvB,CAAC;AACD,QAAM,UAAU,KAAK,UAAU,UAAU,GAAG,SAAS,OAAO;AAE5D,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,EAAE,aAAa,QAAQ,aAAa,aAAa,QAAQ,YAAY;AAAA,EACvE;AACA,QAAM,UAAU,KAAK,UAAU,eAAe,GAAG,iBAAiB,OAAO;AAEzE,aAAW,OAAO,QAAQ,aAAa,CAAC,GAAG;AACzC,UAAM,MAAM,KAAK,UAAU,GAAG,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,UAAM,UAAU,KAAK,UAAU,KAAK,UAAU,GAAG,IAAI,OAAO;AAAA,EAC9D;AAEA,SAAO;AACT;;;AD7CA,eAAsB,iBACpB,MACA,MACe;AACf,QAAM,MAAM,QAAQ,IAAI;AACxB,QAAM,UAAU,MAAM,eAAe,OAAO;AAE5C,QAAM,QAAQ,cAAc,gBAAgB;AAAA,IAC1C,SAAS;AAAA,IACT,MAAM;AAAA,IACN;AAAA,EACF,CAAC;AAED,MAAI,YAAY,QAAQ,KAAK,iBAAiB;AAC9C,MAAI,oBAAoB,GAAG,GAAG;AAC5B,UAAM,SAAS,MAAM,WAAW,EAAE,IAAI,CAAC;AACvC,UAAM,OAAO,OAAO,OAAO;AAC3B,QAAI,KAAK,SAAS,GAAG;AACnB,kBAAY,QAAQ,KAAK,KAAK,CAAC,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,QAAM,cAAc,KACjB,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,IAAI,EAAE,MAAM,CAAC,CAAC,EACjD,KAAK,GAAG;AACX,QAAM,cAAc,KAAK,eAAe,GAAG,WAAW;AAEtD,QAAM,WAAW,MAAM,cAAc,WAAW;AAAA,IAC9C;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,QAAQ,cAAc,iBAAiB;AAAA,IAC3C,SAAS;AAAA,IACT,MAAM;AAAA,IACN;AAAA,IACA;AAAA,EACF,CAAC;AACD,QAAM,QAAQ,IAAI,YAAY,UAAU,IAAI,gBAAgB;AAAA,IAC1D;AAAA,IACA;AAAA,EACF,CAAC;AAED,UAAQ,IAAI,uBAAuB,QAAQ,EAAE;AAC7C,UAAQ,IAAI,kBAAkB;AAC9B,UAAQ,IAAI,6DAAwD;AACpE,UAAQ,IAAI,wDAAmD;AACjE;","names":[]}
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ harnessConfigSchema
4
+ } from "./chunk-LOE6IDTT.js";
5
+
6
+ // src/cli/schema.ts
7
+ import { writeFile, mkdir } from "fs/promises";
8
+ import { resolve, dirname } from "path";
9
+ import { zodToJsonSchema } from "zod-to-json-schema";
10
+ async function runSchemaGenerate(opts) {
11
+ const outputPath = opts.output ?? resolve(process.cwd(), ".harness/schema.json");
12
+ console.log("Agent Harness Schema Generator");
13
+ console.log("==============================\n");
14
+ const jsonSchema = zodToJsonSchema(harnessConfigSchema, {
15
+ name: "HarnessConfig",
16
+ $refStrategy: "none"
17
+ });
18
+ await mkdir(dirname(outputPath), { recursive: true });
19
+ const content = JSON.stringify(jsonSchema, null, 2);
20
+ await writeFile(outputPath, content + "\n", "utf-8");
21
+ console.log(` Generated JSON Schema at ${outputPath}`);
22
+ console.log(` Schema size: ${content.length} bytes`);
23
+ }
24
+ export {
25
+ runSchemaGenerate
26
+ };
27
+ //# sourceMappingURL=schema-AHX7LXUQ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/cli/schema.ts"],"sourcesContent":["import { writeFile, mkdir } from \"node:fs/promises\";\nimport { resolve, dirname } from \"node:path\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { harnessConfigSchema } from \"../config/schema.js\";\n\nexport interface SchemaGenerateOptions {\n output?: string;\n}\n\nexport async function runSchemaGenerate(opts: SchemaGenerateOptions): Promise<void> {\n const outputPath = opts.output ?? resolve(process.cwd(), \".harness/schema.json\");\n\n console.log(\"Agent Harness Schema Generator\");\n console.log(\"==============================\\n\");\n\n const jsonSchema = zodToJsonSchema(harnessConfigSchema, {\n name: \"HarnessConfig\",\n $refStrategy: \"none\",\n });\n\n await mkdir(dirname(outputPath), { recursive: true });\n const content = JSON.stringify(jsonSchema, null, 2);\n await writeFile(outputPath, content + \"\\n\", \"utf-8\");\n\n console.log(` Generated JSON Schema at ${outputPath}`);\n console.log(` Schema size: ${content.length} bytes`);\n}\n"],"mappings":";;;;;;AAAA,SAAS,WAAW,aAAa;AACjC,SAAS,SAAS,eAAe;AACjC,SAAS,uBAAuB;AAOhC,eAAsB,kBAAkB,MAA4C;AAClF,QAAM,aAAa,KAAK,UAAU,QAAQ,QAAQ,IAAI,GAAG,sBAAsB;AAE/E,UAAQ,IAAI,gCAAgC;AAC5C,UAAQ,IAAI,kCAAkC;AAE9C,QAAM,aAAa,gBAAgB,qBAAqB;AAAA,IACtD,MAAM;AAAA,IACN,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,MAAM,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACpD,QAAM,UAAU,KAAK,UAAU,YAAY,MAAM,CAAC;AAClD,QAAM,UAAU,YAAY,UAAU,MAAM,OAAO;AAEnD,UAAQ,IAAI,8BAA8B,UAAU,EAAE;AACtD,UAAQ,IAAI,kBAAkB,QAAQ,MAAM,QAAQ;AACtD;","names":[]}