@cardor/agent-harness-kit 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -361,10 +361,30 @@ Reports three categories:
361
361
 
362
362
  - **lib version** — compares installed version against the latest on npm. Shows `[✓]` if up to date, `[!]` if an update is available, or `[~]` if the registry could not be reached.
363
363
  - **agent files** — checks only that a definition file exists for every role. Reports `[!]` with the file name if one is missing. The contents are never read, so **editing an agent file by hand is a fully supported state and is never reported** — customise the body, the description, or the restrictions freely and `ahk doctor` stays green.
364
- - **harness skills** — checks that `ahk-ask`, `ahk-consultant`, `ahk-triage`, and `ahk-review` skills exist and match the bundled source. Reports `[!]` if missing or outdated.
364
+ - **harness skills** — checks that `ahk-ask`, `ahk-consultant`, `ahk-triage`, `ahk-review`, and `ahk-test` skills exist and match the bundled source. Reports `[!]` if missing or outdated.
365
365
 
366
366
  Run `ahk build` to fix any reported issues.
367
367
 
368
+ ### Bundled skills
369
+
370
+ The kit ships five lightweight skills that are materialized into every provider's skills directory on `init` and restored by `build`. Each skill is read-only instruction text — no MCP tools, no CLI commands, no database changes. They guide AI agents through focused workflows using only subagent invocations.
371
+
372
+ | Skill | Purpose | Limits |
373
+ |-------|---------|--------|
374
+ | `ahk-ask` | Answer codebase questions by reading relevant files and summarizing findings | Read-only; no writes, no MCP calls, no builder/reviewer |
375
+ | `ahk-consultant` | Give technical advice on approaches, designs, or trade-offs before implementation | Advisory only; never writes code or creates tasks |
376
+ | `ahk-triage` | Diagnose bugs and unexpected behavior with deep diagnostic analysis | Diagnostic only; does not fix the bug itself |
377
+ | `ahk-review` | Preview a code review against ticket/objective alignment with semantic analysis | Review only; does not modify code |
378
+ | `ahk-test` | Design, write, and run behavior-focused tests for an objective or existing code | Test files only; production is READ-ONLY unless explicitly authorized; NO harness MCP calls |
379
+
380
+ Invocation example for `ahk-test`:
381
+
382
+ ```text
383
+ Use the ahk-test skill to create tests for toLibraryListBody. all must send movie and series; never anime.
384
+ ```
385
+
386
+ All skills follow the same contract: they invoke Explorer, Builder, or Reviewer as subagents with bounded instructions, never call harness MCP tools directly, and never create or modify harness tasks.
387
+
368
388
  ---
369
389
 
370
390
  ### `ahk sync`
package/dist/cli.js CHANGED
@@ -1057,7 +1057,7 @@ function slugify(title) {
1057
1057
  return title.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 64);
1058
1058
  }
1059
1059
  function writeSkills(cwd2, skillsDir) {
1060
- const skillNames = ["ahk-ask", "ahk-consultant", "ahk-triage", "ahk-review"];
1060
+ const skillNames = ["ahk-ask", "ahk-consultant", "ahk-triage", "ahk-review", "ahk-test"];
1061
1061
  for (const skillName of skillNames) {
1062
1062
  const src = join6(__dirname2, "skills", skillName, "SKILL.md");
1063
1063
  const destDir = join6(cwd2, skillsDir, skillName);
@@ -1833,7 +1833,7 @@ var REGISTRY_URL = `https://registry.npmjs.org/${pkg.name}/latest`;
1833
1833
  var TIMEOUT_MS = 2e3;
1834
1834
  var LIB_VERSION_CACHE_TTL_MS = 5 * 60 * 1e3;
1835
1835
  var AGENT_NAMES = ["lead", "explorer", "consultant", "builder", "reviewer"];
1836
- var SKILL_NAMES = ["ahk-ask", "ahk-consultant", "ahk-triage", "ahk-review"];
1836
+ var SKILL_NAMES = ["ahk-ask", "ahk-consultant", "ahk-triage", "ahk-review", "ahk-test"];
1837
1837
  var __dirname4 = dirname6(fileURLToPath5(import.meta.url));
1838
1838
  var libVersionCache = null;
1839
1839
  async function checkLibVersion() {
@@ -1907,7 +1907,7 @@ function getProviderSkillsDir(provider) {
1907
1907
  }
1908
1908
  }
1909
1909
  function checkSkillsAtRoot(skillsRoot) {
1910
- const skillSourceBase = join13(__dirname4, "skills");
1910
+ const skillSourceBase = join13(__dirname4, "materializer", "skills");
1911
1911
  return SKILL_NAMES.map((name) => {
1912
1912
  const livePath = join13(skillsRoot, name, "SKILL.md");
1913
1913
  const sourcePath = join13(skillSourceBase, name, "SKILL.md");