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.
- package/LICENSE +21 -0
- package/README.md +236 -0
- package/README.zh-CN.md +236 -0
- package/dist/chunk-3P72TGGQ.js +82 -0
- package/dist/chunk-3P72TGGQ.js.map +1 -0
- package/dist/chunk-JKJ3FP6T.js +51 -0
- package/dist/chunk-JKJ3FP6T.js.map +1 -0
- package/dist/chunk-LOE6IDTT.js +65 -0
- package/dist/chunk-LOE6IDTT.js.map +1 -0
- package/dist/chunk-PQWK2OBN.js +18 -0
- package/dist/chunk-PQWK2OBN.js.map +1 -0
- package/dist/chunk-R6VGYQOH.js +771 -0
- package/dist/chunk-R6VGYQOH.js.map +1 -0
- package/dist/config-PUMLWJWT.js +46 -0
- package/dist/config-PUMLWJWT.js.map +1 -0
- package/dist/context-SRWWNVTI.js +33 -0
- package/dist/context-SRWWNVTI.js.map +1 -0
- package/dist/doctor-TYLZH27K.js +199 -0
- package/dist/doctor-TYLZH27K.js.map +1 -0
- package/dist/harness.js +62 -0
- package/dist/harness.js.map +1 -0
- package/dist/index.d.ts +846 -0
- package/dist/index.js +1181 -0
- package/dist/index.js.map +1 -0
- package/dist/list-ABNY2TO7.js +124 -0
- package/dist/list-ABNY2TO7.js.map +1 -0
- package/dist/loader-RDQZFHOB.js +19 -0
- package/dist/loader-RDQZFHOB.js.map +1 -0
- package/dist/run-I5GVJH3N.js +45 -0
- package/dist/run-I5GVJH3N.js.map +1 -0
- package/dist/scaffold-C6JA3STC.js +98 -0
- package/dist/scaffold-C6JA3STC.js.map +1 -0
- package/dist/schema-AHX7LXUQ.js +27 -0
- package/dist/schema-AHX7LXUQ.js.map +1 -0
- package/dist/setup-CWDCKM34.js +115 -0
- package/dist/setup-CWDCKM34.js.map +1 -0
- package/dist/update-CTPDQCLU.js +87 -0
- package/dist/update-CTPDQCLU.js.map +1 -0
- package/dist/verify-NI3VCE2H.js +136 -0
- package/dist/verify-NI3VCE2H.js.map +1 -0
- package/package.json +61 -0
- package/templates/agents-md/full.md.tmpl +98 -0
- package/templates/agents-md/minimal.md.tmpl +20 -0
- package/templates/agents-md/standard.md.tmpl +43 -0
- package/templates/configs/harness.config.yaml.tmpl +28 -0
- package/templates/skills/basic/SKILL.md.tmpl +14 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/adapter/detector.ts","../src/adapter/rust.ts","../src/adapter/typescript.ts","../src/adapter/python.ts","../src/adapter/registry.ts","../src/config/defaults.ts","../src/agent/registry.ts","../src/skill/manager.ts","../src/skill/validator.ts","../src/runtime/harness.ts","../src/audit/logger.ts","../src/context/pipeline.ts","../src/feature/registry.ts","../src/hook/discovery.ts","../src/hook/dispatcher.ts"],"sourcesContent":["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 { 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 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 { 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 { 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","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 { 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"],"mappings":"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","names":["existsSync","join","execSync","existsSync","join","existsSync","join","execSync","existsSync","join","join","existsSync","join","existsSync","existsSync","join","dirname","resolve","mkdir","resolve","readFile","existsSync","resolve","dirname","resolve","existsSync","readFile","dirname","readFile","existsSync","resolve","resolve","mkdir","dirname"]}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
configExists,
|
|
4
|
+
loadConfigWithLayers
|
|
5
|
+
} from "./chunk-3P72TGGQ.js";
|
|
6
|
+
import "./chunk-LOE6IDTT.js";
|
|
7
|
+
|
|
8
|
+
// src/cli/config.ts
|
|
9
|
+
import { stringify as yamlStringify } from "yaml";
|
|
10
|
+
async function runConfigShow() {
|
|
11
|
+
const cwd = process.cwd();
|
|
12
|
+
if (!configExists(cwd)) {
|
|
13
|
+
console.log("No harness configuration found. Run `agent-harness setup` first.");
|
|
14
|
+
return;
|
|
15
|
+
}
|
|
16
|
+
const result = await loadConfigWithLayers({ cwd });
|
|
17
|
+
console.log("Configuration layers:\n");
|
|
18
|
+
for (const layer of result.layers) {
|
|
19
|
+
const status = layer.data ? "loaded" : "not found";
|
|
20
|
+
console.log(` [${layer.name}] ${layer.path} \u2014 ${status}`);
|
|
21
|
+
}
|
|
22
|
+
console.log("\nMerged configuration:\n");
|
|
23
|
+
console.log(yamlStringify(result.config));
|
|
24
|
+
}
|
|
25
|
+
async function runConfigValidate() {
|
|
26
|
+
const cwd = process.cwd();
|
|
27
|
+
if (!configExists(cwd)) {
|
|
28
|
+
console.log("[FAIL] No configuration file found at .harness/harness.config.yaml");
|
|
29
|
+
process.exitCode = 1;
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const result = await loadConfigWithLayers({ cwd });
|
|
34
|
+
const loadedLayers = result.layers.filter((l) => l.data);
|
|
35
|
+
console.log(`[PASS] Configuration is valid (${loadedLayers.length} layer(s) loaded).`);
|
|
36
|
+
} catch (err) {
|
|
37
|
+
console.log("[FAIL] Configuration validation failed:");
|
|
38
|
+
console.log(` ${err instanceof Error ? err.message : String(err)}`);
|
|
39
|
+
process.exitCode = 1;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export {
|
|
43
|
+
runConfigShow,
|
|
44
|
+
runConfigValidate
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=config-PUMLWJWT.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/config.ts"],"sourcesContent":["import { loadConfigWithLayers, configExists } from \"../config/loader.js\";\nimport { stringify as yamlStringify } from \"yaml\";\n\nexport async function runConfigShow(): Promise<void> {\n const cwd = process.cwd();\n\n if (!configExists(cwd)) {\n console.log(\"No harness configuration found. Run `agent-harness setup` first.\");\n return;\n }\n\n const result = await loadConfigWithLayers({ cwd });\n\n console.log(\"Configuration layers:\\n\");\n for (const layer of result.layers) {\n const status = layer.data ? \"loaded\" : \"not found\";\n console.log(` [${layer.name}] ${layer.path} — ${status}`);\n }\n\n console.log(\"\\nMerged configuration:\\n\");\n console.log(yamlStringify(result.config));\n}\n\nexport async function runConfigValidate(): Promise<void> {\n const cwd = process.cwd();\n\n if (!configExists(cwd)) {\n console.log(\"[FAIL] No configuration file found at .harness/harness.config.yaml\");\n process.exitCode = 1;\n return;\n }\n\n try {\n const result = await loadConfigWithLayers({ cwd });\n const loadedLayers = result.layers.filter((l) => l.data);\n console.log(`[PASS] Configuration is valid (${loadedLayers.length} layer(s) loaded).`);\n } catch (err) {\n console.log(\"[FAIL] Configuration validation failed:\");\n console.log(` ${err instanceof Error ? err.message : String(err)}`);\n process.exitCode = 1;\n }\n}\n"],"mappings":";;;;;;;;AACA,SAAS,aAAa,qBAAqB;AAE3C,eAAsB,gBAA+B;AACnD,QAAM,MAAM,QAAQ,IAAI;AAExB,MAAI,CAAC,aAAa,GAAG,GAAG;AACtB,YAAQ,IAAI,kEAAkE;AAC9E;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,qBAAqB,EAAE,IAAI,CAAC;AAEjD,UAAQ,IAAI,yBAAyB;AACrC,aAAW,SAAS,OAAO,QAAQ;AACjC,UAAM,SAAS,MAAM,OAAO,WAAW;AACvC,YAAQ,IAAI,MAAM,MAAM,IAAI,KAAK,MAAM,IAAI,WAAM,MAAM,EAAE;AAAA,EAC3D;AAEA,UAAQ,IAAI,2BAA2B;AACvC,UAAQ,IAAI,cAAc,OAAO,MAAM,CAAC;AAC1C;AAEA,eAAsB,oBAAmC;AACvD,QAAM,MAAM,QAAQ,IAAI;AAExB,MAAI,CAAC,aAAa,GAAG,GAAG;AACtB,YAAQ,IAAI,oEAAoE;AAChF,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,MAAI;AACF,UAAM,SAAS,MAAM,qBAAqB,EAAE,IAAI,CAAC;AACjD,UAAM,eAAe,OAAO,OAAO,OAAO,CAAC,MAAM,EAAE,IAAI;AACvD,YAAQ,IAAI,kCAAkC,aAAa,MAAM,oBAAoB;AAAA,EACvF,SAAS,KAAK;AACZ,YAAQ,IAAI,yCAAyC;AACrD,YAAQ,IAAI,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC,EAAE;AACnE,YAAQ,WAAW;AAAA,EACrB;AACF;","names":[]}
|
|
@@ -0,0 +1,33 @@
|
|
|
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/context.ts
|
|
9
|
+
async function runContextBuild(opts) {
|
|
10
|
+
const runtime = await HarnessRuntime.create({ requireProjectConfig: true });
|
|
11
|
+
const tagStyle = opts.format ?? "markdown";
|
|
12
|
+
if (opts.output) {
|
|
13
|
+
const result2 = await runtime.writeContext({
|
|
14
|
+
outputPath: opts.output,
|
|
15
|
+
tagStyle,
|
|
16
|
+
includeSkills: opts.includeSkills,
|
|
17
|
+
includeCustomRules: opts.includeRules
|
|
18
|
+
});
|
|
19
|
+
console.log(`Context written to ${opts.output}`);
|
|
20
|
+
console.log(`Blocks included: ${result2.blocks.length}`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const result = await runtime.buildContext({
|
|
24
|
+
tagStyle,
|
|
25
|
+
includeSkills: opts.includeSkills,
|
|
26
|
+
includeCustomRules: opts.includeRules
|
|
27
|
+
});
|
|
28
|
+
console.log(result.rendered);
|
|
29
|
+
}
|
|
30
|
+
export {
|
|
31
|
+
runContextBuild
|
|
32
|
+
};
|
|
33
|
+
//# sourceMappingURL=context-SRWWNVTI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cli/context.ts"],"sourcesContent":["import { HarnessRuntime } from \"../runtime/harness.js\";\nimport type { TagStyle } from \"../context/types.js\";\n\nexport interface ContextBuildCliOptions {\n format?: TagStyle;\n output?: string;\n includeSkills?: boolean;\n includeRules?: boolean;\n}\n\nexport async function runContextBuild(\n opts: ContextBuildCliOptions,\n): Promise<void> {\n const runtime = await HarnessRuntime.create({ requireProjectConfig: true });\n const tagStyle = opts.format ?? \"markdown\";\n\n if (opts.output) {\n const result = await runtime.writeContext({\n outputPath: opts.output,\n tagStyle,\n includeSkills: opts.includeSkills,\n includeCustomRules: opts.includeRules,\n });\n console.log(`Context written to ${opts.output}`);\n console.log(`Blocks included: ${result.blocks.length}`);\n return;\n }\n\n const result = await runtime.buildContext({\n tagStyle,\n includeSkills: opts.includeSkills,\n includeCustomRules: opts.includeRules,\n });\n console.log(result.rendered);\n}\n"],"mappings":";;;;;;;;AAUA,eAAsB,gBACpB,MACe;AACf,QAAM,UAAU,MAAM,eAAe,OAAO,EAAE,sBAAsB,KAAK,CAAC;AAC1E,QAAM,WAAW,KAAK,UAAU;AAEhC,MAAI,KAAK,QAAQ;AACf,UAAMA,UAAS,MAAM,QAAQ,aAAa;AAAA,MACxC,YAAY,KAAK;AAAA,MACjB;AAAA,MACA,eAAe,KAAK;AAAA,MACpB,oBAAoB,KAAK;AAAA,IAC3B,CAAC;AACD,YAAQ,IAAI,sBAAsB,KAAK,MAAM,EAAE;AAC/C,YAAQ,IAAI,oBAAoBA,QAAO,OAAO,MAAM,EAAE;AACtD;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,QAAQ,aAAa;AAAA,IACxC;AAAA,IACA,eAAe,KAAK;AAAA,IACpB,oBAAoB,KAAK;AAAA,EAC3B,CAAC;AACD,UAAQ,IAAI,OAAO,QAAQ;AAC7B;","names":["result"]}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
HarnessRuntime,
|
|
4
|
+
discoverSkills
|
|
5
|
+
} from "./chunk-R6VGYQOH.js";
|
|
6
|
+
import "./chunk-3P72TGGQ.js";
|
|
7
|
+
import "./chunk-LOE6IDTT.js";
|
|
8
|
+
|
|
9
|
+
// src/health/checker.ts
|
|
10
|
+
async function runHealthChecks(checks) {
|
|
11
|
+
const results = [];
|
|
12
|
+
for (const check of checks) {
|
|
13
|
+
try {
|
|
14
|
+
const result = await check.check();
|
|
15
|
+
results.push({ name: check.name, result });
|
|
16
|
+
} catch (err) {
|
|
17
|
+
results.push({
|
|
18
|
+
name: check.name,
|
|
19
|
+
result: {
|
|
20
|
+
status: "fail",
|
|
21
|
+
message: `Check threw: ${err instanceof Error ? err.message : String(err)}`
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
const summary = { pass: 0, warn: 0, fail: 0 };
|
|
27
|
+
for (const r of results) {
|
|
28
|
+
summary[r.result.status]++;
|
|
29
|
+
}
|
|
30
|
+
return { results, summary };
|
|
31
|
+
}
|
|
32
|
+
function formatReport(report) {
|
|
33
|
+
const lines = ["Agent Harness Health Check", "=========================="];
|
|
34
|
+
const statusIcon = { pass: "[PASS]", warn: "[WARN]", fail: "[FAIL]" };
|
|
35
|
+
for (const entry of report.results) {
|
|
36
|
+
lines.push(`${statusIcon[entry.result.status]} ${entry.result.message}`);
|
|
37
|
+
}
|
|
38
|
+
lines.push("");
|
|
39
|
+
lines.push(
|
|
40
|
+
`Summary: ${report.summary.pass} passed, ${report.summary.warn} warning(s), ${report.summary.fail} failure(s)`
|
|
41
|
+
);
|
|
42
|
+
return lines.join("\n");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// src/health/checks/config.ts
|
|
46
|
+
import { existsSync } from "fs";
|
|
47
|
+
import { resolve } from "path";
|
|
48
|
+
function configHealthCheck(cwd) {
|
|
49
|
+
return {
|
|
50
|
+
name: "harness-config",
|
|
51
|
+
check: async () => {
|
|
52
|
+
const configPath = resolve(cwd, ".harness/harness.config.yaml");
|
|
53
|
+
if (!existsSync(configPath)) {
|
|
54
|
+
return { status: "fail", message: "harness.config.yaml not found \u2014 run `agent-harness setup`" };
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const { loadConfig } = await import("./loader-RDQZFHOB.js");
|
|
58
|
+
await loadConfig({ cwd });
|
|
59
|
+
return { status: "pass", message: "harness.config.yaml exists and valid" };
|
|
60
|
+
} catch (err) {
|
|
61
|
+
return {
|
|
62
|
+
status: "fail",
|
|
63
|
+
message: `harness.config.yaml invalid: ${err instanceof Error ? err.message : String(err)}`
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// src/health/checks/skills.ts
|
|
71
|
+
import { existsSync as existsSync2 } from "fs";
|
|
72
|
+
import { resolve as resolve2 } from "path";
|
|
73
|
+
function skillsHealthCheck(cwd, directories) {
|
|
74
|
+
return {
|
|
75
|
+
name: "skills-directory",
|
|
76
|
+
check: async () => {
|
|
77
|
+
const dirs = directories ?? [".harness/skills"];
|
|
78
|
+
const existing = dirs.filter((d) => existsSync2(resolve2(cwd, d)));
|
|
79
|
+
if (existing.length === 0) {
|
|
80
|
+
return { status: "warn", message: "No skills directories found" };
|
|
81
|
+
}
|
|
82
|
+
const skills = await discoverSkills(dirs, cwd);
|
|
83
|
+
const valid = skills.filter((s) => s.valid).length;
|
|
84
|
+
const invalid = skills.length - valid;
|
|
85
|
+
if (invalid > 0) {
|
|
86
|
+
return {
|
|
87
|
+
status: "warn",
|
|
88
|
+
message: `${skills.length} skills found, ${invalid} with validation issues`
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return { status: "pass", message: `${skills.length} skills found, all valid` };
|
|
92
|
+
}
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// src/health/checks/agents-md.ts
|
|
97
|
+
import { existsSync as existsSync3 } from "fs";
|
|
98
|
+
import { resolve as resolve3 } from "path";
|
|
99
|
+
function agentsMdHealthCheck(cwd) {
|
|
100
|
+
return {
|
|
101
|
+
name: "agents-md",
|
|
102
|
+
check: async () => {
|
|
103
|
+
const agentsMd = resolve3(cwd, "AGENTS.md");
|
|
104
|
+
if (existsSync3(agentsMd)) {
|
|
105
|
+
return { status: "pass", message: "AGENTS.md exists" };
|
|
106
|
+
}
|
|
107
|
+
return { status: "warn", message: "AGENTS.md not found \u2014 consider running `agent-harness setup`" };
|
|
108
|
+
}
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// src/health/checks/tools.ts
|
|
113
|
+
import { execSync } from "child_process";
|
|
114
|
+
function toolCheck(name, command) {
|
|
115
|
+
return {
|
|
116
|
+
name: `tool-${name}`,
|
|
117
|
+
check: async () => {
|
|
118
|
+
try {
|
|
119
|
+
execSync(command, { stdio: "pipe" });
|
|
120
|
+
return { status: "pass", message: `${name} is available` };
|
|
121
|
+
} catch {
|
|
122
|
+
return { status: "warn", message: `${name} not found (recommended)` };
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
function toolHealthChecks() {
|
|
128
|
+
return [
|
|
129
|
+
toolCheck("git", "git --version"),
|
|
130
|
+
toolCheck("node", "node --version")
|
|
131
|
+
];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// src/cli/doctor.ts
|
|
135
|
+
async function runDoctor(opts = {}) {
|
|
136
|
+
const runtime = await HarnessRuntime.create();
|
|
137
|
+
const checks = [];
|
|
138
|
+
checks.push(configHealthCheck(runtime.cwd));
|
|
139
|
+
checks.push(agentsMdHealthCheck(runtime.cwd));
|
|
140
|
+
checks.push(...toolHealthChecks());
|
|
141
|
+
if (runtime.adapter) {
|
|
142
|
+
checks.push(...runtime.adapter.getHealthChecks());
|
|
143
|
+
}
|
|
144
|
+
if (runtime.config) {
|
|
145
|
+
checks.push(skillsHealthCheck(runtime.cwd, runtime.config.skills.directories));
|
|
146
|
+
const counts = runtime.agentRegistry.count();
|
|
147
|
+
checks.push({
|
|
148
|
+
name: "agent-definitions",
|
|
149
|
+
check: async () => ({
|
|
150
|
+
status: "pass",
|
|
151
|
+
message: `Agent definitions: ${counts.custom} custom + ${counts.builtin} built-in`
|
|
152
|
+
})
|
|
153
|
+
});
|
|
154
|
+
const features = runtime.listFeatureStates();
|
|
155
|
+
checks.push({
|
|
156
|
+
name: "feature-flags",
|
|
157
|
+
check: async () => ({
|
|
158
|
+
status: "pass",
|
|
159
|
+
message: `Feature flags: ${features.filter((feature) => feature.enabled).length} enabled of ${features.length}`
|
|
160
|
+
})
|
|
161
|
+
});
|
|
162
|
+
} else {
|
|
163
|
+
checks.push(skillsHealthCheck(runtime.cwd));
|
|
164
|
+
}
|
|
165
|
+
await runtime.dispatchHooks("doctor.pre", { command: "doctor" });
|
|
166
|
+
const report = await runHealthChecks(checks);
|
|
167
|
+
await runtime.dispatchHooks("doctor.post", {
|
|
168
|
+
command: "doctor",
|
|
169
|
+
summary: report.summary,
|
|
170
|
+
status: report.summary.fail > 0 ? "fail" : "pass"
|
|
171
|
+
});
|
|
172
|
+
await runtime.log("doctor", "Doctor run completed", {
|
|
173
|
+
summary: report.summary,
|
|
174
|
+
adapter: runtime.adapter?.name ?? null
|
|
175
|
+
});
|
|
176
|
+
if (opts.json) {
|
|
177
|
+
console.log(JSON.stringify({
|
|
178
|
+
adapter: runtime.adapter?.name ?? null,
|
|
179
|
+
results: report.results,
|
|
180
|
+
summary: report.summary,
|
|
181
|
+
features: runtime.listFeatureStates().map((feature) => ({
|
|
182
|
+
key: feature.spec.key,
|
|
183
|
+
stage: feature.spec.stage,
|
|
184
|
+
enabled: feature.enabled,
|
|
185
|
+
configured: feature.configured,
|
|
186
|
+
configuredValue: feature.configuredValue
|
|
187
|
+
}))
|
|
188
|
+
}, null, 2));
|
|
189
|
+
} else {
|
|
190
|
+
console.log(formatReport(report));
|
|
191
|
+
}
|
|
192
|
+
if (report.summary.fail > 0) {
|
|
193
|
+
process.exitCode = 1;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
export {
|
|
197
|
+
runDoctor
|
|
198
|
+
};
|
|
199
|
+
//# sourceMappingURL=doctor-TYLZH27K.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/health/checker.ts","../src/health/checks/config.ts","../src/health/checks/skills.ts","../src/health/checks/agents-md.ts","../src/health/checks/tools.ts","../src/cli/doctor.ts"],"sourcesContent":["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 { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { HealthCheck } from \"../../adapter/interface.js\";\n\nexport function configHealthCheck(cwd: string): HealthCheck {\n return {\n name: \"harness-config\",\n check: async () => {\n const configPath = resolve(cwd, \".harness/harness.config.yaml\");\n if (!existsSync(configPath)) {\n return { status: \"fail\", message: \"harness.config.yaml not found — run `agent-harness setup`\" };\n }\n\n try {\n const { loadConfig } = await import(\"../../config/loader.js\");\n await loadConfig({ cwd });\n return { status: \"pass\", message: \"harness.config.yaml exists and valid\" };\n } catch (err) {\n return {\n status: \"fail\",\n message: `harness.config.yaml invalid: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n },\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport { discoverSkills } from \"../../skill/manager.js\";\nimport type { HealthCheck } from \"../../adapter/interface.js\";\n\nexport function skillsHealthCheck(cwd: string, directories?: string[]): HealthCheck {\n return {\n name: \"skills-directory\",\n check: async () => {\n const dirs = directories ?? [\".harness/skills\"];\n const existing = dirs.filter((d) => existsSync(resolve(cwd, d)));\n if (existing.length === 0) {\n return { status: \"warn\", message: \"No skills directories found\" };\n }\n\n const skills = await discoverSkills(dirs, cwd);\n const valid = skills.filter((s) => s.valid).length;\n const invalid = skills.length - valid;\n\n if (invalid > 0) {\n return {\n status: \"warn\",\n message: `${skills.length} skills found, ${invalid} with validation issues`,\n };\n }\n return { status: \"pass\", message: `${skills.length} skills found, all valid` };\n },\n };\n}\n","import { existsSync } from \"node:fs\";\nimport { resolve } from \"node:path\";\nimport type { HealthCheck } from \"../../adapter/interface.js\";\n\nexport function agentsMdHealthCheck(cwd: string): HealthCheck {\n return {\n name: \"agents-md\",\n check: async () => {\n const agentsMd = resolve(cwd, \"AGENTS.md\");\n if (existsSync(agentsMd)) {\n return { status: \"pass\", message: \"AGENTS.md exists\" };\n }\n return { status: \"warn\", message: \"AGENTS.md not found — consider running `agent-harness setup`\" };\n },\n };\n}\n","import { execSync } from \"node:child_process\";\nimport type { HealthCheck } from \"../../adapter/interface.js\";\n\nfunction toolCheck(name: string, command: string): HealthCheck {\n return {\n name: `tool-${name}`,\n check: async () => {\n try {\n execSync(command, { stdio: \"pipe\" });\n return { status: \"pass\", message: `${name} is available` };\n } catch {\n return { status: \"warn\", message: `${name} not found (recommended)` };\n }\n },\n };\n}\n\nexport function toolHealthChecks(): HealthCheck[] {\n return [\n toolCheck(\"git\", \"git --version\"),\n toolCheck(\"node\", \"node --version\"),\n ];\n}\n","import { runHealthChecks, formatReport } from \"../health/checker.js\";\nimport { configHealthCheck } from \"../health/checks/config.js\";\nimport { skillsHealthCheck } from \"../health/checks/skills.js\";\nimport { agentsMdHealthCheck } from \"../health/checks/agents-md.js\";\nimport { toolHealthChecks } from \"../health/checks/tools.js\";\nimport type { HealthCheck } from \"../adapter/interface.js\";\nimport { HarnessRuntime } from \"../runtime/harness.js\";\n\nexport interface DoctorOptions {\n json?: boolean;\n}\n\nexport async function runDoctor(opts: DoctorOptions = {}): Promise<void> {\n const runtime = await HarnessRuntime.create();\n const checks: HealthCheck[] = [];\n\n checks.push(configHealthCheck(runtime.cwd));\n checks.push(agentsMdHealthCheck(runtime.cwd));\n checks.push(...toolHealthChecks());\n\n if (runtime.adapter) {\n checks.push(...runtime.adapter.getHealthChecks());\n }\n\n if (runtime.config) {\n checks.push(skillsHealthCheck(runtime.cwd, runtime.config.skills.directories));\n\n const counts = runtime.agentRegistry.count();\n checks.push({\n name: \"agent-definitions\",\n check: async () => ({\n status: \"pass\",\n message: `Agent definitions: ${counts.custom} custom + ${counts.builtin} built-in`,\n }),\n });\n\n const features = runtime.listFeatureStates();\n checks.push({\n name: \"feature-flags\",\n check: async () => ({\n status: \"pass\",\n message: `Feature flags: ${features.filter((feature) => feature.enabled).length} enabled of ${features.length}`,\n }),\n });\n } else {\n checks.push(skillsHealthCheck(runtime.cwd));\n }\n\n await runtime.dispatchHooks(\"doctor.pre\", { command: \"doctor\" });\n const report = await runHealthChecks(checks);\n await runtime.dispatchHooks(\"doctor.post\", {\n command: \"doctor\",\n summary: report.summary,\n status: report.summary.fail > 0 ? \"fail\" : \"pass\",\n });\n await runtime.log(\"doctor\", \"Doctor run completed\", {\n summary: report.summary,\n adapter: runtime.adapter?.name ?? null,\n });\n\n if (opts.json) {\n console.log(JSON.stringify({\n adapter: runtime.adapter?.name ?? null,\n results: report.results,\n summary: report.summary,\n features: runtime.listFeatureStates().map((feature) => ({\n key: feature.spec.key,\n stage: feature.spec.stage,\n enabled: feature.enabled,\n configured: feature.configured,\n configuredValue: feature.configuredValue,\n })),\n }, null, 2));\n } else {\n console.log(formatReport(report));\n }\n\n if (report.summary.fail > 0) {\n process.exitCode = 1;\n }\n}\n"],"mappings":"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","names":["existsSync","resolve","existsSync","resolve","existsSync","resolve"]}
|
package/dist/harness.js
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
// bin/harness.ts
|
|
4
|
+
import { Command } from "commander";
|
|
5
|
+
var program = new Command();
|
|
6
|
+
program.name("agent-harness").description(
|
|
7
|
+
"Universal development pipeline harness \u2014 config, templates, skills, and health checks for AI-assisted projects."
|
|
8
|
+
).version("0.1.0");
|
|
9
|
+
program.command("setup").description("Initialize harness in the current project").option("-l, --language <lang>", "Project language (rust|typescript|python|multi)").option("-t, --template <variant>", "AGENTS.md template variant (minimal|standard|full)", "standard").action(async (opts) => {
|
|
10
|
+
const { runSetup } = await import("./setup-CWDCKM34.js");
|
|
11
|
+
await runSetup(opts);
|
|
12
|
+
});
|
|
13
|
+
program.command("update").description("Sync/upgrade templates and configuration").option("--check", "Dry-run: show what would change without modifying files").option("--template <name>", "Only update a specific template (e.g. agents-md)").action(async (opts) => {
|
|
14
|
+
const { runUpdate } = await import("./update-CTPDQCLU.js");
|
|
15
|
+
await runUpdate(opts);
|
|
16
|
+
});
|
|
17
|
+
program.command("doctor").description("Run health checks on the current project").option("--json", "Output machine-readable JSON").action(async (opts) => {
|
|
18
|
+
const { runDoctor } = await import("./doctor-TYLZH27K.js");
|
|
19
|
+
await runDoctor(opts);
|
|
20
|
+
});
|
|
21
|
+
program.command("verify").description("Run verification checks (build, test, lint)").option("--fail-fast", "Stop on first failure").option("--json", "Output machine-readable JSON").action(async (opts) => {
|
|
22
|
+
const { runVerify } = await import("./verify-NI3VCE2H.js");
|
|
23
|
+
await runVerify(opts);
|
|
24
|
+
});
|
|
25
|
+
program.command("list <resource>").description("List available resources (skills|agents|commands|templates|features)").action(async (resource) => {
|
|
26
|
+
const { runList } = await import("./list-ABNY2TO7.js");
|
|
27
|
+
await runList(resource);
|
|
28
|
+
});
|
|
29
|
+
var configCmd = program.command("config").description("Configuration management");
|
|
30
|
+
configCmd.command("show").description("Display merged configuration").action(async () => {
|
|
31
|
+
const { runConfigShow } = await import("./config-PUMLWJWT.js");
|
|
32
|
+
await runConfigShow();
|
|
33
|
+
});
|
|
34
|
+
configCmd.command("validate").description("Validate configuration files").action(async () => {
|
|
35
|
+
const { runConfigValidate } = await import("./config-PUMLWJWT.js");
|
|
36
|
+
await runConfigValidate();
|
|
37
|
+
});
|
|
38
|
+
program.command("run <task>").description("Execute a named task from workflows.commands or adapter").action(async (task) => {
|
|
39
|
+
const { runTask } = await import("./run-I5GVJH3N.js");
|
|
40
|
+
await runTask(task);
|
|
41
|
+
});
|
|
42
|
+
var schemaCmd = program.command("schema").description("Schema management");
|
|
43
|
+
schemaCmd.command("generate").description("Generate JSON Schema from config definition").option("-o, --output <path>", "Output file path", ".harness/schema.json").action(async (opts) => {
|
|
44
|
+
const { runSchemaGenerate } = await import("./schema-AHX7LXUQ.js");
|
|
45
|
+
await runSchemaGenerate(opts);
|
|
46
|
+
});
|
|
47
|
+
var contextCmd = program.command("context").description("Context assembly and export");
|
|
48
|
+
contextCmd.command("build").description("Build assembled agent context").option("-f, --format <style>", "Tag style (markdown|xml|none)", "markdown").option("-o, --output <path>", "Write context to a file instead of stdout").option("--no-include-skills", "Skip skills summary").option("--no-include-rules", "Skip custom rules").action(async (opts) => {
|
|
49
|
+
const { runContextBuild } = await import("./context-SRWWNVTI.js");
|
|
50
|
+
await runContextBuild(opts);
|
|
51
|
+
});
|
|
52
|
+
program.command("scaffold").description("Scaffold a new skill").argument("<type>", "Resource type to scaffold (skill)").argument("<name>", "Name of the resource").option("-d, --description <desc>", "Description of the resource").action(async (type, name, opts) => {
|
|
53
|
+
if (type !== "skill") {
|
|
54
|
+
console.error(`Unknown scaffold type: ${type}. Available: skill`);
|
|
55
|
+
process.exitCode = 1;
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
const { runScaffoldSkill } = await import("./scaffold-C6JA3STC.js");
|
|
59
|
+
await runScaffoldSkill(name, opts);
|
|
60
|
+
});
|
|
61
|
+
program.parse();
|
|
62
|
+
//# sourceMappingURL=harness.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../bin/harness.ts"],"sourcesContent":["import { Command } from \"commander\";\n\nconst program = new Command();\n\nprogram\n .name(\"agent-harness\")\n .description(\n \"Universal development pipeline harness — config, templates, skills, and health checks for AI-assisted projects.\",\n )\n .version(\"0.1.0\");\n\nprogram\n .command(\"setup\")\n .description(\"Initialize harness in the current project\")\n .option(\"-l, --language <lang>\", \"Project language (rust|typescript|python|multi)\")\n .option(\"-t, --template <variant>\", \"AGENTS.md template variant (minimal|standard|full)\", \"standard\")\n .action(async (opts) => {\n const { runSetup } = await import(\"../src/cli/setup.js\");\n await runSetup(opts);\n });\n\nprogram\n .command(\"update\")\n .description(\"Sync/upgrade templates and configuration\")\n .option(\"--check\", \"Dry-run: show what would change without modifying files\")\n .option(\"--template <name>\", \"Only update a specific template (e.g. agents-md)\")\n .action(async (opts) => {\n const { runUpdate } = await import(\"../src/cli/update.js\");\n await runUpdate(opts);\n });\n\nprogram\n .command(\"doctor\")\n .description(\"Run health checks on the current project\")\n .option(\"--json\", \"Output machine-readable JSON\")\n .action(async (opts) => {\n const { runDoctor } = await import(\"../src/cli/doctor.js\");\n await runDoctor(opts);\n });\n\nprogram\n .command(\"verify\")\n .description(\"Run verification checks (build, test, lint)\")\n .option(\"--fail-fast\", \"Stop on first failure\")\n .option(\"--json\", \"Output machine-readable JSON\")\n .action(async (opts) => {\n const { runVerify } = await import(\"../src/cli/verify.js\");\n await runVerify(opts);\n });\n\nprogram\n .command(\"list <resource>\")\n .description(\"List available resources (skills|agents|commands|templates|features)\")\n .action(async (resource: string) => {\n const { runList } = await import(\"../src/cli/list.js\");\n await runList(resource);\n });\n\nconst configCmd = program\n .command(\"config\")\n .description(\"Configuration management\");\n\nconfigCmd\n .command(\"show\")\n .description(\"Display merged configuration\")\n .action(async () => {\n const { runConfigShow } = await import(\"../src/cli/config.js\");\n await runConfigShow();\n });\n\nconfigCmd\n .command(\"validate\")\n .description(\"Validate configuration files\")\n .action(async () => {\n const { runConfigValidate } = await import(\"../src/cli/config.js\");\n await runConfigValidate();\n });\n\nprogram\n .command(\"run <task>\")\n .description(\"Execute a named task from workflows.commands or adapter\")\n .action(async (task: string) => {\n const { runTask } = await import(\"../src/cli/run.js\");\n await runTask(task);\n });\n\nconst schemaCmd = program\n .command(\"schema\")\n .description(\"Schema management\");\n\nschemaCmd\n .command(\"generate\")\n .description(\"Generate JSON Schema from config definition\")\n .option(\"-o, --output <path>\", \"Output file path\", \".harness/schema.json\")\n .action(async (opts) => {\n const { runSchemaGenerate } = await import(\"../src/cli/schema.js\");\n await runSchemaGenerate(opts);\n });\n\nconst contextCmd = program\n .command(\"context\")\n .description(\"Context assembly and export\");\n\ncontextCmd\n .command(\"build\")\n .description(\"Build assembled agent context\")\n .option(\"-f, --format <style>\", \"Tag style (markdown|xml|none)\", \"markdown\")\n .option(\"-o, --output <path>\", \"Write context to a file instead of stdout\")\n .option(\"--no-include-skills\", \"Skip skills summary\")\n .option(\"--no-include-rules\", \"Skip custom rules\")\n .action(async (opts) => {\n const { runContextBuild } = await import(\"../src/cli/context.js\");\n await runContextBuild(opts);\n });\n\nprogram\n .command(\"scaffold\")\n .description(\"Scaffold a new skill\")\n .argument(\"<type>\", \"Resource type to scaffold (skill)\")\n .argument(\"<name>\", \"Name of the resource\")\n .option(\"-d, --description <desc>\", \"Description of the resource\")\n .action(async (type: string, name: string, opts) => {\n if (type !== \"skill\") {\n console.error(`Unknown scaffold type: ${type}. Available: skill`);\n process.exitCode = 1;\n return;\n }\n const { runScaffoldSkill } = await import(\"../src/cli/scaffold.js\");\n await runScaffoldSkill(name, opts);\n });\n\nprogram.parse();\n"],"mappings":"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","names":[]}
|