@walwal-harness/cli 6.1.5 → 7.1.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.
Files changed (328) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/HR-Resource/academic-academic-anthropologist/SKILL.md +142 -0
  3. package/HR-Resource/academic-academic-geographer/SKILL.md +144 -0
  4. package/HR-Resource/academic-academic-historian/SKILL.md +140 -0
  5. package/HR-Resource/academic-academic-narratologist/SKILL.md +135 -0
  6. package/HR-Resource/academic-academic-psychologist/SKILL.md +135 -0
  7. package/HR-Resource/brick-office/SKILL.md +20 -0
  8. package/HR-Resource/cdo/SKILL.md +33 -0
  9. package/HR-Resource/ceo/SKILL.md +36 -0
  10. package/HR-Resource/coo/SKILL.md +36 -0
  11. package/HR-Resource/cqo/SKILL.md +33 -0
  12. package/HR-Resource/cto/SKILL.md +36 -0
  13. package/HR-Resource/design-design-brand-guardian/SKILL.md +339 -0
  14. package/HR-Resource/design-design-image-prompt-engineer/SKILL.md +253 -0
  15. package/HR-Resource/design-design-inclusive-visuals-specialist/SKILL.md +88 -0
  16. package/HR-Resource/design-design-ui-designer/SKILL.md +400 -0
  17. package/HR-Resource/design-design-ux-architect/SKILL.md +486 -0
  18. package/HR-Resource/design-design-ux-researcher/SKILL.md +346 -0
  19. package/HR-Resource/design-design-visual-storyteller/SKILL.md +166 -0
  20. package/HR-Resource/design-design-whimsy-injector/SKILL.md +455 -0
  21. package/HR-Resource/engineering-engineering-ai-data-remediation-engineer/SKILL.md +227 -0
  22. package/HR-Resource/engineering-engineering-ai-engineer/SKILL.md +163 -0
  23. package/HR-Resource/engineering-engineering-autonomous-optimization-architect/SKILL.md +124 -0
  24. package/HR-Resource/engineering-engineering-backend-architect/SKILL.md +252 -0
  25. package/HR-Resource/engineering-engineering-cms-developer/SKILL.md +553 -0
  26. package/HR-Resource/engineering-engineering-code-reviewer/SKILL.md +93 -0
  27. package/HR-Resource/engineering-engineering-codebase-onboarding-engineer/SKILL.md +190 -0
  28. package/HR-Resource/engineering-engineering-data-engineer/SKILL.md +323 -0
  29. package/HR-Resource/engineering-engineering-database-optimizer/SKILL.md +193 -0
  30. package/HR-Resource/engineering-engineering-devops-automator/SKILL.md +393 -0
  31. package/HR-Resource/engineering-engineering-email-intelligence-engineer/SKILL.md +370 -0
  32. package/HR-Resource/engineering-engineering-embedded-firmware-engineer/SKILL.md +190 -0
  33. package/HR-Resource/engineering-engineering-feishu-integration-developer/SKILL.md +615 -0
  34. package/HR-Resource/engineering-engineering-filament-optimization-specialist/SKILL.md +300 -0
  35. package/HR-Resource/engineering-engineering-frontend-developer/SKILL.md +242 -0
  36. package/HR-Resource/engineering-engineering-git-workflow-master/SKILL.md +101 -0
  37. package/HR-Resource/engineering-engineering-incident-response-commander/SKILL.md +461 -0
  38. package/HR-Resource/engineering-engineering-minimal-change-engineer/SKILL.md +224 -0
  39. package/HR-Resource/engineering-engineering-mobile-app-builder/SKILL.md +510 -0
  40. package/HR-Resource/engineering-engineering-rapid-prototyper/SKILL.md +479 -0
  41. package/HR-Resource/engineering-engineering-security-engineer/SKILL.md +321 -0
  42. package/HR-Resource/engineering-engineering-senior-developer/SKILL.md +193 -0
  43. package/HR-Resource/engineering-engineering-software-architect/SKILL.md +98 -0
  44. package/HR-Resource/engineering-engineering-solidity-smart-contract-engineer/SKILL.md +539 -0
  45. package/HR-Resource/engineering-engineering-sre/SKILL.md +107 -0
  46. package/HR-Resource/engineering-engineering-technical-writer/SKILL.md +410 -0
  47. package/HR-Resource/engineering-engineering-threat-detection-engineer/SKILL.md +551 -0
  48. package/HR-Resource/engineering-engineering-voice-ai-integration-engineer/SKILL.md +578 -0
  49. package/HR-Resource/engineering-engineering-wechat-mini-program-developer/SKILL.md +367 -0
  50. package/HR-Resource/finance-finance-bookkeeper-controller/SKILL.md +277 -0
  51. package/HR-Resource/finance-finance-financial-analyst/SKILL.md +251 -0
  52. package/HR-Resource/finance-finance-fpa-analyst/SKILL.md +280 -0
  53. package/HR-Resource/finance-finance-investment-researcher/SKILL.md +289 -0
  54. package/HR-Resource/finance-finance-tax-strategist/SKILL.md +256 -0
  55. package/HR-Resource/game-development-blender-blender-addon-engineer/SKILL.md +251 -0
  56. package/HR-Resource/game-development-game-audio-engineer/SKILL.md +281 -0
  57. package/HR-Resource/game-development-game-designer/SKILL.md +184 -0
  58. package/HR-Resource/game-development-godot-godot-gameplay-scripter/SKILL.md +351 -0
  59. package/HR-Resource/game-development-godot-godot-multiplayer-engineer/SKILL.md +314 -0
  60. package/HR-Resource/game-development-godot-godot-shader-developer/SKILL.md +283 -0
  61. package/HR-Resource/game-development-level-designer/SKILL.md +225 -0
  62. package/HR-Resource/game-development-narrative-designer/SKILL.md +260 -0
  63. package/HR-Resource/game-development-roblox-studio-roblox-avatar-creator/SKILL.md +314 -0
  64. package/HR-Resource/game-development-roblox-studio-roblox-experience-designer/SKILL.md +322 -0
  65. package/HR-Resource/game-development-roblox-studio-roblox-systems-scripter/SKILL.md +342 -0
  66. package/HR-Resource/game-development-technical-artist/SKILL.md +246 -0
  67. package/HR-Resource/game-development-unity-unity-architect/SKILL.md +288 -0
  68. package/HR-Resource/game-development-unity-unity-editor-tool-developer/SKILL.md +327 -0
  69. package/HR-Resource/game-development-unity-unity-multiplayer-engineer/SKILL.md +338 -0
  70. package/HR-Resource/game-development-unity-unity-shader-graph-artist/SKILL.md +286 -0
  71. package/HR-Resource/game-development-unreal-engine-unreal-multiplayer-architect/SKILL.md +330 -0
  72. package/HR-Resource/game-development-unreal-engine-unreal-systems-engineer/SKILL.md +327 -0
  73. package/HR-Resource/game-development-unreal-engine-unreal-technical-artist/SKILL.md +273 -0
  74. package/HR-Resource/game-development-unreal-engine-unreal-world-builder/SKILL.md +290 -0
  75. package/HR-Resource/hiring/SKILL.md +28 -0
  76. package/HR-Resource/index.json +747 -0
  77. package/HR-Resource/integrations-mcp-memory-backend-architect-with-memory/SKILL.md +264 -0
  78. package/HR-Resource/marketing-marketing-agentic-search-optimizer/SKILL.md +328 -0
  79. package/HR-Resource/marketing-marketing-ai-citation-strategist/SKILL.md +187 -0
  80. package/HR-Resource/marketing-marketing-app-store-optimizer/SKILL.md +338 -0
  81. package/HR-Resource/marketing-marketing-baidu-seo-specialist/SKILL.md +243 -0
  82. package/HR-Resource/marketing-marketing-bilibili-content-strategist/SKILL.md +216 -0
  83. package/HR-Resource/marketing-marketing-book-co-author/SKILL.md +127 -0
  84. package/HR-Resource/marketing-marketing-carousel-growth-engine/SKILL.md +216 -0
  85. package/HR-Resource/marketing-marketing-china-ecommerce-operator/SKILL.md +300 -0
  86. package/HR-Resource/marketing-marketing-china-market-localization-strategist/SKILL.md +300 -0
  87. package/HR-Resource/marketing-marketing-content-creator/SKILL.md +71 -0
  88. package/HR-Resource/marketing-marketing-cross-border-ecommerce/SKILL.md +276 -0
  89. package/HR-Resource/marketing-marketing-douyin-strategist/SKILL.md +166 -0
  90. package/HR-Resource/marketing-marketing-growth-hacker/SKILL.md +71 -0
  91. package/HR-Resource/marketing-marketing-instagram-curator/SKILL.md +130 -0
  92. package/HR-Resource/marketing-marketing-kuaishou-strategist/SKILL.md +240 -0
  93. package/HR-Resource/marketing-marketing-linkedin-content-creator/SKILL.md +230 -0
  94. package/HR-Resource/marketing-marketing-livestream-commerce-coach/SKILL.md +322 -0
  95. package/HR-Resource/marketing-marketing-podcast-strategist/SKILL.md +294 -0
  96. package/HR-Resource/marketing-marketing-private-domain-operator/SKILL.md +325 -0
  97. package/HR-Resource/marketing-marketing-reddit-community-builder/SKILL.md +140 -0
  98. package/HR-Resource/marketing-marketing-seo-specialist/SKILL.md +338 -0
  99. package/HR-Resource/marketing-marketing-short-video-editing-coach/SKILL.md +429 -0
  100. package/HR-Resource/marketing-marketing-social-media-strategist/SKILL.md +142 -0
  101. package/HR-Resource/marketing-marketing-tiktok-strategist/SKILL.md +142 -0
  102. package/HR-Resource/marketing-marketing-twitter-engager/SKILL.md +143 -0
  103. package/HR-Resource/marketing-marketing-video-optimization-specialist/SKILL.md +136 -0
  104. package/HR-Resource/marketing-marketing-wechat-official-account/SKILL.md +162 -0
  105. package/HR-Resource/marketing-marketing-weibo-strategist/SKILL.md +257 -0
  106. package/HR-Resource/marketing-marketing-xiaohongshu-specialist/SKILL.md +155 -0
  107. package/HR-Resource/marketing-marketing-zhihu-strategist/SKILL.md +179 -0
  108. package/HR-Resource/ops/SKILL.md +46 -0
  109. package/HR-Resource/paid-media-paid-media-auditor/SKILL.md +88 -0
  110. package/HR-Resource/paid-media-paid-media-creative-strategist/SKILL.md +88 -0
  111. package/HR-Resource/paid-media-paid-media-paid-social-strategist/SKILL.md +88 -0
  112. package/HR-Resource/paid-media-paid-media-ppc-strategist/SKILL.md +88 -0
  113. package/HR-Resource/paid-media-paid-media-programmatic-buyer/SKILL.md +88 -0
  114. package/HR-Resource/paid-media-paid-media-search-query-analyst/SKILL.md +88 -0
  115. package/HR-Resource/paid-media-paid-media-tracking-specialist/SKILL.md +88 -0
  116. package/HR-Resource/product-product-behavioral-nudge-engine/SKILL.md +97 -0
  117. package/HR-Resource/product-product-feedback-synthesizer/SKILL.md +136 -0
  118. package/HR-Resource/product-product-manager/SKILL.md +486 -0
  119. package/HR-Resource/product-product-sprint-prioritizer/SKILL.md +171 -0
  120. package/HR-Resource/product-product-trend-researcher/SKILL.md +176 -0
  121. package/HR-Resource/project-management-project-management-experiment-tracker/SKILL.md +215 -0
  122. package/HR-Resource/project-management-project-management-jira-workflow-steward/SKILL.md +247 -0
  123. package/HR-Resource/project-management-project-management-project-shepherd/SKILL.md +211 -0
  124. package/HR-Resource/project-management-project-management-studio-operations/SKILL.md +217 -0
  125. package/HR-Resource/project-management-project-management-studio-producer/SKILL.md +220 -0
  126. package/HR-Resource/project-management-project-manager-senior/SKILL.md +152 -0
  127. package/HR-Resource/resource-manager/SKILL.md +23 -0
  128. package/HR-Resource/sales-sales-account-strategist/SKILL.md +244 -0
  129. package/HR-Resource/sales-sales-coach/SKILL.md +288 -0
  130. package/HR-Resource/sales-sales-deal-strategist/SKILL.md +197 -0
  131. package/HR-Resource/sales-sales-discovery-coach/SKILL.md +242 -0
  132. package/HR-Resource/sales-sales-engineer/SKILL.md +199 -0
  133. package/HR-Resource/sales-sales-outbound-strategist/SKILL.md +218 -0
  134. package/HR-Resource/sales-sales-pipeline-analyst/SKILL.md +284 -0
  135. package/HR-Resource/sales-sales-proposal-strategist/SKILL.md +234 -0
  136. package/HR-Resource/spatial-computing-macos-spatial-metal-engineer/SKILL.md +354 -0
  137. package/HR-Resource/spatial-computing-terminal-integration-specialist/SKILL.md +87 -0
  138. package/HR-Resource/spatial-computing-visionos-spatial-engineer/SKILL.md +71 -0
  139. package/HR-Resource/spatial-computing-xr-cockpit-interaction-specialist/SKILL.md +49 -0
  140. package/HR-Resource/spatial-computing-xr-immersive-developer/SKILL.md +49 -0
  141. package/HR-Resource/spatial-computing-xr-interface-architect/SKILL.md +49 -0
  142. package/HR-Resource/specialized-accounts-payable-agent/SKILL.md +202 -0
  143. package/HR-Resource/specialized-agentic-identity-trust/SKILL.md +404 -0
  144. package/HR-Resource/specialized-agents-orchestrator/SKILL.md +384 -0
  145. package/HR-Resource/specialized-automation-governance-architect/SKILL.md +233 -0
  146. package/HR-Resource/specialized-blockchain-security-auditor/SKILL.md +480 -0
  147. package/HR-Resource/specialized-compliance-auditor/SKILL.md +175 -0
  148. package/HR-Resource/specialized-corporate-training-designer/SKILL.md +209 -0
  149. package/HR-Resource/specialized-customer-service/SKILL.md +415 -0
  150. package/HR-Resource/specialized-data-consolidation-agent/SKILL.md +77 -0
  151. package/HR-Resource/specialized-government-digital-presales-consultant/SKILL.md +380 -0
  152. package/HR-Resource/specialized-healthcare-customer-service/SKILL.md +406 -0
  153. package/HR-Resource/specialized-healthcare-marketing-compliance/SKILL.md +412 -0
  154. package/HR-Resource/specialized-hospitality-guest-services/SKILL.md +620 -0
  155. package/HR-Resource/specialized-hr-onboarding/SKILL.md +468 -0
  156. package/HR-Resource/specialized-identity-graph-operator/SKILL.md +277 -0
  157. package/HR-Resource/specialized-language-translator/SKILL.md +281 -0
  158. package/HR-Resource/specialized-legal-billing-time-tracking/SKILL.md +586 -0
  159. package/HR-Resource/specialized-legal-client-intake/SKILL.md +509 -0
  160. package/HR-Resource/specialized-legal-document-review/SKILL.md +471 -0
  161. package/HR-Resource/specialized-loan-officer-assistant/SKILL.md +572 -0
  162. package/HR-Resource/specialized-lsp-index-engineer/SKILL.md +331 -0
  163. package/HR-Resource/specialized-real-estate-buyer-seller/SKILL.md +613 -0
  164. package/HR-Resource/specialized-recruitment-specialist/SKILL.md +526 -0
  165. package/HR-Resource/specialized-report-distribution-agent/SKILL.md +82 -0
  166. package/HR-Resource/specialized-retail-customer-returns/SKILL.md +583 -0
  167. package/HR-Resource/specialized-sales-data-extraction-agent/SKILL.md +84 -0
  168. package/HR-Resource/specialized-sales-outreach/SKILL.md +442 -0
  169. package/HR-Resource/specialized-specialized-chief-of-staff/SKILL.md +296 -0
  170. package/HR-Resource/specialized-specialized-civil-engineer/SKILL.md +373 -0
  171. package/HR-Resource/specialized-specialized-cultural-intelligence-strategist/SKILL.md +105 -0
  172. package/HR-Resource/specialized-specialized-developer-advocate/SKILL.md +334 -0
  173. package/HR-Resource/specialized-specialized-document-generator/SKILL.md +72 -0
  174. package/HR-Resource/specialized-specialized-french-consulting-market/SKILL.md +209 -0
  175. package/HR-Resource/specialized-specialized-korean-business-navigator/SKILL.md +233 -0
  176. package/HR-Resource/specialized-specialized-mcp-builder/SKILL.md +265 -0
  177. package/HR-Resource/specialized-specialized-model-qa/SKILL.md +505 -0
  178. package/HR-Resource/specialized-specialized-salesforce-architect/SKILL.md +197 -0
  179. package/HR-Resource/specialized-specialized-workflow-architect/SKILL.md +614 -0
  180. package/HR-Resource/specialized-study-abroad-advisor/SKILL.md +299 -0
  181. package/HR-Resource/specialized-supply-chain-strategist/SKILL.md +599 -0
  182. package/HR-Resource/specialized-zk-steward/SKILL.md +228 -0
  183. package/HR-Resource/support-support-analytics-reporter/SKILL.md +382 -0
  184. package/HR-Resource/support-support-executive-summary-generator/SKILL.md +229 -0
  185. package/HR-Resource/support-support-finance-tracker/SKILL.md +459 -0
  186. package/HR-Resource/support-support-infrastructure-maintainer/SKILL.md +635 -0
  187. package/HR-Resource/support-support-legal-compliance-checker/SKILL.md +605 -0
  188. package/HR-Resource/support-support-support-responder/SKILL.md +602 -0
  189. package/HR-Resource/testing-testing-accessibility-auditor/SKILL.md +333 -0
  190. package/HR-Resource/testing-testing-api-tester/SKILL.md +323 -0
  191. package/HR-Resource/testing-testing-evidence-collector/SKILL.md +227 -0
  192. package/HR-Resource/testing-testing-performance-benchmarker/SKILL.md +285 -0
  193. package/HR-Resource/testing-testing-reality-checker/SKILL.md +253 -0
  194. package/HR-Resource/testing-testing-test-results-analyzer/SKILL.md +322 -0
  195. package/HR-Resource/testing-testing-tool-evaluator/SKILL.md +411 -0
  196. package/HR-Resource/testing-testing-workflow-optimizer/SKILL.md +467 -0
  197. package/assets/launchd/com.walwal.harness-wake.plist.template +1 -1
  198. package/assets/templates/company-pipeline-manifest.json +71 -0
  199. package/assets/templates/config.json +40 -2
  200. package/bin/init.js +208 -109
  201. package/commands/goal.md +25 -0
  202. package/commands/hot-fix.md +25 -0
  203. package/commands/play-harness.md +22 -0
  204. package/commands/release-harness.md +22 -0
  205. package/commands/stop-harness.md +21 -0
  206. package/conventions/README.md +14 -88
  207. package/conventions/brick-office.md +5 -0
  208. package/conventions/cdo.md +6 -0
  209. package/conventions/ceo.md +9 -0
  210. package/conventions/coo.md +6 -0
  211. package/conventions/cqo.md +6 -23
  212. package/conventions/cto.md +5 -23
  213. package/conventions/hiring.md +7 -0
  214. package/conventions/ops.md +9 -0
  215. package/conventions/resource-manager.md +6 -0
  216. package/conventions/shared.md +29 -40
  217. package/gotchas/README.md +14 -82
  218. package/gotchas/brick-office.md +9 -0
  219. package/gotchas/cdo.md +9 -0
  220. package/gotchas/ceo.md +9 -0
  221. package/gotchas/coo.md +9 -0
  222. package/gotchas/cqo.md +6 -19
  223. package/gotchas/cto.md +6 -19
  224. package/gotchas/hiring.md +9 -0
  225. package/gotchas/ops.md +17 -0
  226. package/gotchas/resource-manager.md +9 -0
  227. package/gotchas/shared.md +13 -0
  228. package/package.json +11 -17
  229. package/scripts/conductor-tick.sh +97 -4
  230. package/scripts/harness-hourly-review.sh +284 -5
  231. package/scripts/harness-parity-audit.sh +101 -0
  232. package/scripts/harness-queue-manager.sh +1 -1
  233. package/scripts/harness-runtime-stop.sh +58 -0
  234. package/scripts/harness-service-ops-monitor.sh +207 -18
  235. package/scripts/harness-stop.sh +18 -0
  236. package/scripts/harness-wake-install.sh +1 -0
  237. package/scripts/harness-wake.sh +100 -8
  238. package/scripts/harness-worker-dispatch.sh +52 -21
  239. package/scripts/harness-worker-evidence-validate.sh +59 -0
  240. package/scripts/import-agency-agents.js +102 -0
  241. package/scripts/lib/harness-agent-resolver.sh +127 -0
  242. package/scripts/play.sh +104 -0
  243. package/scripts/release.sh +89 -0
  244. package/conventions/conductor.md +0 -24
  245. package/conventions/coo-developer.md +0 -24
  246. package/conventions/dispatcher.md +0 -24
  247. package/conventions/documentationer.md +0 -24
  248. package/conventions/evaluator-architecture.md +0 -24
  249. package/conventions/evaluator-code-quality.md +0 -24
  250. package/conventions/evaluator-functional.md +0 -24
  251. package/conventions/evaluator-security.md +0 -24
  252. package/conventions/evaluator-visual.md +0 -24
  253. package/conventions/generator-backend.md +0 -24
  254. package/conventions/generator-designer.md +0 -24
  255. package/conventions/generator-devops.md +0 -24
  256. package/conventions/generator-frontend.md +0 -24
  257. package/conventions/meeting-manager.md +0 -24
  258. package/conventions/planner.md +0 -24
  259. package/conventions/service-ops.md +0 -24
  260. package/gotchas/conductor.md +0 -38
  261. package/gotchas/coo-developer.md +0 -22
  262. package/gotchas/dispatcher.md +0 -38
  263. package/gotchas/documentationer.md +0 -22
  264. package/gotchas/evaluator-architecture.md +0 -22
  265. package/gotchas/evaluator-code-quality.md +0 -22
  266. package/gotchas/evaluator-functional.md +0 -22
  267. package/gotchas/evaluator-security.md +0 -22
  268. package/gotchas/evaluator-visual.md +0 -22
  269. package/gotchas/generator-backend-laravel.md +0 -19
  270. package/gotchas/generator-backend.md +0 -22
  271. package/gotchas/generator-designer.md +0 -22
  272. package/gotchas/generator-devops.md +0 -22
  273. package/gotchas/generator-frontend.md +0 -22
  274. package/gotchas/meeting-manager.md +0 -30
  275. package/gotchas/planner.md +0 -22
  276. package/gotchas/service-ops.md +0 -30
  277. package/skills/_shared/dynamic-registration.md +0 -120
  278. package/skills/brainstorming/SKILL.md +0 -220
  279. package/skills/brainstorming/references/attribution.md +0 -109
  280. package/skills/brainstorming/references/spec-document-reviewer-prompt.md +0 -49
  281. package/skills/brainstorming/references/visual-companion.md +0 -287
  282. package/skills/brainstorming/scripts/frame-template.html +0 -214
  283. package/skills/brainstorming/scripts/helper.js +0 -88
  284. package/skills/brainstorming/scripts/server.cjs +0 -354
  285. package/skills/brainstorming/scripts/start-server.sh +0 -148
  286. package/skills/brainstorming/scripts/stop-server.sh +0 -56
  287. package/skills/conductor/SKILL.md +0 -336
  288. package/skills/coo-developer/SKILL.md +0 -72
  289. package/skills/cqo/SKILL.md +0 -146
  290. package/skills/cto/SKILL.md +0 -141
  291. package/skills/dispatcher/SKILL.md +0 -298
  292. package/skills/dispatcher/persona-ceo.md +0 -169
  293. package/skills/dispatcher/references/convention-flow.md +0 -111
  294. package/skills/dispatcher/references/gotcha-flow.md +0 -79
  295. package/skills/dispatcher/references/initialization.md +0 -53
  296. package/skills/dispatcher/references/pipeline-definitions.md +0 -151
  297. package/skills/documentationer/SKILL.md +0 -92
  298. package/skills/evaluator-architecture/SKILL.md +0 -173
  299. package/skills/evaluator-code-quality/SKILL.md +0 -218
  300. package/skills/evaluator-code-quality/references/scoring-rubric.md +0 -104
  301. package/skills/evaluator-functional/SKILL.md +0 -271
  302. package/skills/evaluator-functional/references/ia-compliance.md +0 -37
  303. package/skills/evaluator-functional/references/playwright-tools.md +0 -43
  304. package/skills/evaluator-functional/references/scoring-rubric.md +0 -52
  305. package/skills/evaluator-security/SKILL.md +0 -172
  306. package/skills/evaluator-visual/SKILL.md +0 -165
  307. package/skills/evaluator-visual/references/responsive-checklist.md +0 -44
  308. package/skills/evaluator-visual/references/scoring-rubric.md +0 -59
  309. package/skills/generator-backend/SKILL.md +0 -153
  310. package/skills/generator-backend/references/nestjs-msa-patterns.md +0 -69
  311. package/skills/generator-backend/references/sprint-contract-be.md +0 -32
  312. package/skills/generator-designer/SKILL.md +0 -219
  313. package/skills/generator-devops/SKILL.md +0 -201
  314. package/skills/generator-frontend/SKILL.md +0 -155
  315. package/skills/generator-frontend/references/_web-react-legacy/ai-forbidden-patterns.md +0 -89
  316. package/skills/generator-frontend/references/_web-react-legacy/component-patterns.md +0 -52
  317. package/skills/generator-frontend/references/_web-react-legacy/design-system-rules.md +0 -139
  318. package/skills/generator-frontend/references/_web-react-legacy/vercel-best-practices.md +0 -54
  319. package/skills/meeting-manager/SKILL.md +0 -419
  320. package/skills/planner/SKILL.md +0 -243
  321. package/skills/planner/hr-onboard.md +0 -134
  322. package/skills/planner/hr-recruit.md +0 -99
  323. package/skills/planner/persona-coo-hr.md +0 -182
  324. package/skills/planner/references/api-contract-schema.md +0 -34
  325. package/skills/planner/references/fe-stack-detection.md +0 -164
  326. package/skills/planner/references/ia-map-guide.md +0 -31
  327. package/skills/planner/references/plan-template.md +0 -51
  328. package/skills/service-ops/SKILL.md +0 -295
@@ -11,6 +11,8 @@
11
11
 
12
12
  set -uo pipefail
13
13
 
14
+ export PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:${PATH:-}"
15
+
14
16
  LOG_DIR="${HOME}/.walwal-harness/logs"
15
17
  mkdir -p "$LOG_DIR"
16
18
  LOG="$LOG_DIR/wake.log"
@@ -57,14 +59,81 @@ find_tmux_session() {
57
59
  return 1
58
60
  }
59
61
 
62
+ resolve_agent_bin() {
63
+ local executor="$1"
64
+ local env_name cand
65
+
66
+ case "$executor" in
67
+ codex)
68
+ env_name="${HARNESS_CODEX_BIN:-${CODEX_BIN:-}}"
69
+ ;;
70
+ claude|*)
71
+ env_name="${HARNESS_CLAUDE_BIN:-${CLAUDE_BIN:-}}"
72
+ executor="claude"
73
+ ;;
74
+ esac
75
+
76
+ for cand in "$env_name" "$HOME/.local/bin/$executor" "/opt/homebrew/bin/$executor" "/usr/local/bin/$executor"; do
77
+ [ -n "$cand" ] && [ -x "$cand" ] && { echo "$cand"; return 0; }
78
+ done
79
+
80
+ command -v "$executor" 2>/dev/null && return 0
81
+ return 1
82
+ }
83
+
84
+ run_conductor_fallback() {
85
+ local project_root="$1"
86
+ local reason="$2"
87
+ local tick="$project_root/scripts/conductor-tick.sh"
88
+ local progress="$project_root/.harness/progress.json"
89
+ local progress_set="$project_root/scripts/harness-progress-set.sh"
90
+ local before after status
91
+
92
+ [ "${HARNESS_WAKE_CONDUCTOR_FALLBACK:-1}" = "1" ] || return 0
93
+ [ -x "$tick" ] || return 0
94
+ [ -f "$progress" ] || return 0
95
+ command -v jq >/dev/null 2>&1 || return 0
96
+
97
+ before="$(jq -c '{current_agent,next_agent,agent_status,conductor:(.conductor.state // null),decision:(.meetings.decision // {})}' "$progress" 2>/dev/null || echo '{}')"
98
+
99
+ if [ -x "$progress_set" ] &&
100
+ jq -e '
101
+ (.meetings.decision.owner // "") != "" and
102
+ ((((.meetings.active // []) | length) > 0) or ((.meetings.decision.required_execution // null) != null))
103
+ ' "$progress" >/dev/null 2>&1 && {
104
+ [ "$(jq -r '.current_agent // ""' "$progress")" != "meeting-manager" ] ||
105
+ [ "$(jq -r '.agent_status // ""' "$progress")" != "completed" ];
106
+ }; then
107
+ bash "$progress_set" "$project_root" '
108
+ .current_agent = "meeting-manager" |
109
+ .agent_status = "completed" |
110
+ .conductor.state = "running" |
111
+ .conductor.current_action = "wake-meeting-decision-ready" |
112
+ .workflow.last_transition = (now | todate) |
113
+ .workflow.last_reason = "wake-meeting-decision-ready"
114
+ ' >/dev/null 2>&1 || true
115
+ fi
116
+
117
+ if bash "$tick" "$project_root" >/dev/null 2>&1; then
118
+ status="ok"
119
+ else
120
+ status="failed"
121
+ fi
122
+
123
+ after="$(jq -c '{current_agent,next_agent,agent_status,conductor:(.conductor.state // null),last_action:(.conductor.current_action // null)}' "$progress" 2>/dev/null || echo '{}')"
124
+ echo "$(date -u "+%Y-%m-%dT%H:%M:%SZ") | wake | conductor-fallback | $status | reason=$reason | before=$before | after=$after" >> "$project_root/.harness/progress.log"
125
+ say "conductor-fallback: $project_root ($status, reason=$reason)"
126
+ }
127
+
60
128
  start_headless_tick() {
61
129
  local project_root="$1"
62
130
  local idle="$2"
63
131
  local force="$3"
64
132
  local review_path="$4"
65
- local mode stamp wake_dir ops_dir prompt_rel log_rel prompt_path log_path pid_file old_pid pid status tmux_session
133
+ local mode executor agent_bin stamp wake_dir ops_dir prompt_rel log_rel prompt_path log_path pid_file old_pid pid status tmux_session session_name session_safe
66
134
 
67
135
  mode="${HARNESS_WAKE_MODE:-headless}"
136
+ executor="${HARNESS_WAKE_EXECUTOR:-claude}"
68
137
  stamp="$(date -u "+%Y%m%dT%H%M%SZ")"
69
138
  wake_dir="$project_root/.harness/actions/wake"
70
139
  ops_dir="$project_root/.harness/ops/wake"
@@ -105,7 +174,8 @@ Tasks:
105
174
  3. Treat the hourly review as Executive Meeting Minutes. Verify it contains CEO/COO/CTO/CQO/Service-Ops role positions, discussion, decision JSON, and action items.
106
175
  4. Check conductor state against the current GOAL and route the next department without waiting for Owner.
107
176
  5. If there is an active incident or operational warning, make sure meeting-manager has shared context and an action decision that names CTO/CQO/Service-Ops responsibilities.
108
- 6. Append a short factual summary to .harness/progress.log and any normal harness artifacts used by this project.
177
+ 6. Split meaningful progress from paperwork-only artifacts in your summary.
178
+ 7. Append a short factual summary to .harness/progress.log and any normal harness artifacts used by this project.
109
179
  EOF
110
180
 
111
181
  case "$mode" in
@@ -113,16 +183,36 @@ EOF
113
183
  status="recorded"
114
184
  ;;
115
185
  headless|"")
116
- if command -v claude >/dev/null 2>&1; then
186
+ if agent_bin="$(resolve_agent_bin "$executor")"; then
117
187
  (
118
188
  cd "$project_root" || exit 1
119
- claude -p "$(cat "$prompt_path")" > "$log_path" 2>&1
189
+ if [ "$executor" = "codex" ]; then
190
+ "$agent_bin" exec -C "$project_root" "$(cat "$prompt_path")" > "$log_path" 2>&1
191
+ else
192
+ "$agent_bin" -p "$(cat "$prompt_path")" > "$log_path" 2>&1
193
+ fi
120
194
  ) &
121
195
  pid=$!
122
196
  echo "$pid" > "$pid_file"
123
- status="spawned pid=$pid"
197
+ status="spawned executor=$executor pid=$pid"
124
198
  else
125
- status="recorded claude-not-found"
199
+ status="BLOCKED_RUNTIME ${executor}-not-found"
200
+ fi
201
+ ;;
202
+ tmux)
203
+ if ! command -v tmux >/dev/null 2>&1; then
204
+ status="BLOCKED_RUNTIME tmux-not-found"
205
+ elif agent_bin="$(resolve_agent_bin "$executor")"; then
206
+ session_safe="$(basename "$project_root" | tr -c '[:alnum:]_' '_')"
207
+ session_name="walwal_${session_safe}_${stamp}"
208
+ if [ "$executor" = "codex" ]; then
209
+ tmux new-session -d -s "$session_name" "cd '$project_root' && '$agent_bin' exec -C '$project_root' - < '$prompt_path' 2>&1 | tee '$log_path'"
210
+ else
211
+ tmux new-session -d -s "$session_name" "cd '$project_root' && '$agent_bin' -p \"\$(cat '$prompt_path')\" 2>&1 | tee '$log_path'"
212
+ fi
213
+ status="spawned-tmux executor=$executor session=$session_name"
214
+ else
215
+ status="BLOCKED_RUNTIME ${executor}-not-found"
126
216
  fi
127
217
  ;;
128
218
  *)
@@ -130,8 +220,10 @@ EOF
130
220
  ;;
131
221
  esac
132
222
 
133
- echo "$(date -u "+%Y-%m-%dT%H:%M:%SZ") | wake | headless | $status | idle=${idle}s | force=${force} | prompt=$prompt_rel | log=$log_rel" >> "$project_root/.harness/progress.log"
134
- say "wake-headless: $project_root (idle ${idle}s, force=${force}, mode=${mode}) → $status $log_rel"
223
+ echo "$(date -u "+%Y-%m-%dT%H:%M:%SZ") | wake | agent-tick | $status | idle=${idle}s | force=${force} | mode=${mode} | prompt=$prompt_rel | log=$log_rel" >> "$project_root/.harness/progress.log"
224
+ say "wake-agent: $project_root (idle ${idle}s, force=${force}, mode=${mode}, executor=${executor}) → $status $log_rel"
225
+
226
+ run_conductor_fallback "$project_root" "$status"
135
227
 
136
228
  if tmux_session="$(find_tmux_session "$project_root" 2>/dev/null)"; then
137
229
  tmux display-message -t "$tmux_session" "walwal wake headless tick: $status ($log_rel)" 2>/dev/null || true
@@ -11,6 +11,7 @@ set -uo pipefail
11
11
 
12
12
  SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
13
13
  source "$SCRIPT_DIR/lib/harness-render-progress.sh"
14
+ source "$SCRIPT_DIR/lib/harness-agent-resolver.sh"
14
15
 
15
16
  PROJECT_ROOT="$(resolve_harness_root "${1:-.}")" || exit 0
16
17
  PROGRESS="$PROJECT_ROOT/.harness/progress.json"
@@ -19,6 +20,8 @@ FEATURES="$PROJECT_ROOT/.harness/actions/feature-list.json"
19
20
  QUEUE="$PROJECT_ROOT/.harness/actions/feature-queue.json"
20
21
  WORKER_DIR="$PROJECT_ROOT/.harness/actions/workers"
21
22
  LOG_DIR="$PROJECT_ROOT/.harness/ops/workers"
23
+ DISPATCH_LOCK="$PROJECT_ROOT/.harness/.worker-dispatch-lock"
24
+ DISPATCH_LOCK_STALE_SEC="${DISPATCH_LOCK_STALE_SEC:-900}"
22
25
 
23
26
  [ -f "$PROGRESS" ] || exit 0
24
27
  [ -f "$CONFIG" ] || exit 0
@@ -28,27 +31,41 @@ command -v jq >/dev/null 2>&1 || exit 0
28
31
 
29
32
  mkdir -p "$WORKER_DIR" "$LOG_DIR"
30
33
 
34
+ acquire_dispatch_lock() {
35
+ if mkdir "$DISPATCH_LOCK" 2>/dev/null; then
36
+ printf '%s\n' "$$" > "$DISPATCH_LOCK/pid"
37
+ printf '%s\n' "$(date +%s)" > "$DISPATCH_LOCK/created_at"
38
+ trap 'rm -rf "$DISPATCH_LOCK" 2>/dev/null || true' EXIT INT TERM
39
+ return 0
40
+ fi
41
+
42
+ local now created age holder
43
+ now="$(date +%s)"
44
+ created="$(cat "$DISPATCH_LOCK/created_at" 2>/dev/null || echo "$now")"
45
+ holder="$(cat "$DISPATCH_LOCK/pid" 2>/dev/null || echo unknown)"
46
+ age=$((now - created))
47
+ if [ "$age" -ge "$DISPATCH_LOCK_STALE_SEC" ]; then
48
+ rm -rf "$DISPATCH_LOCK" 2>/dev/null || true
49
+ if mkdir "$DISPATCH_LOCK" 2>/dev/null; then
50
+ printf '%s\n' "$$" > "$DISPATCH_LOCK/pid"
51
+ printf '%s\n' "$now" > "$DISPATCH_LOCK/created_at"
52
+ trap 'rm -rf "$DISPATCH_LOCK" 2>/dev/null || true' EXIT INT TERM
53
+ return 0
54
+ fi
55
+ fi
56
+
57
+ echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | conductor | worker-dispatch | skipped-locked | holder=${holder} age=${age}s" >> "$PROJECT_ROOT/.harness/progress.log"
58
+ echo "[]"
59
+ exit 0
60
+ }
61
+
62
+ acquire_dispatch_lock
63
+
31
64
  spawn_mode="$(jq -r '.company_mode.worker_spawn // "claude"' "$CONFIG" 2>/dev/null || echo claude)"
32
65
  pipeline="$(jq -r '.pipeline // "FULLSTACK"' "$PROGRESS" 2>/dev/null || echo FULLSTACK)"
33
66
  ts="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
34
67
  stamp="$(date -u +%Y%m%dT%H%M%SZ)"
35
68
 
36
- agent_for_feature() {
37
- local fid="$1"
38
- local layer service title
39
- layer="$(jq -r --arg id "$fid" '.features[]? | select(.id == $id) | (.layer // .type // "")' "$FEATURES" 2>/dev/null | head -1)"
40
- service="$(jq -r --arg id "$fid" '.features[]? | select(.id == $id) | (.service // "")' "$FEATURES" 2>/dev/null | head -1)"
41
- title="$(jq -r --arg id "$fid" '.features[]? | select(.id == $id) | (.title // .name // .description // "")' "$FEATURES" 2>/dev/null | head -1)"
42
- case "$(printf '%s %s %s' "$layer" "$service" "$title" | tr '[:upper:]' '[:lower:]')" in
43
- *frontend*|*ui*|*web*|*react*|*next*) echo "generator-frontend" ;;
44
- *design*|*token*|*component-spec*) echo "generator-designer" ;;
45
- *devops*|*infra*|*deploy*|*ci*) echo "generator-devops" ;;
46
- *)
47
- if [ "$pipeline" = "FE-ONLY" ]; then echo "generator-frontend"; else echo "generator-backend"; fi
48
- ;;
49
- esac
50
- }
51
-
52
69
  build_prompt() {
53
70
  local team="$1" fid="$2" agent="$3" prompt_path="$4" log_path="$5"
54
71
  cat > "$prompt_path" <<EOF
@@ -103,12 +120,24 @@ i=0
103
120
  while [ "$i" -lt "$count" ]; do
104
121
  team="$(jq -r ".[$i].team" <<<"$pairs")"
105
122
  fid="$(jq -r ".[$i].feature" <<<"$pairs")"
106
- agent="$(agent_for_feature "$fid")"
123
+ phase="$(jq -r --arg fid "$fid" '.queue.in_progress[$fid].phase // "gen"' "$QUEUE" 2>/dev/null || echo gen)"
124
+ agent="$(resolve_feature_agent "$PROJECT_ROOT" "$fid" "$phase" "$pipeline" 2>/dev/null || true)"
107
125
  prompt_rel=".harness/actions/workers/T${team}-${fid}-${stamp}.prompt.md"
108
126
  log_rel=".harness/ops/workers/T${team}-${fid}-${stamp}.log"
109
127
  prompt_path="$PROJECT_ROOT/$prompt_rel"
110
128
  log_path="$PROJECT_ROOT/$log_rel"
111
129
 
130
+ if [ -z "$agent" ]; then
131
+ reason="agent_resolution_failed phase=${phase}"
132
+ bash "$SCRIPT_DIR/harness-queue-manager.sh" fail "$fid" "$PROJECT_ROOT" >/dev/null 2>&1 || true
133
+ printf '%s\n' "$reason" > "$log_path"
134
+ jq -n --argjson team "$team" --arg feature "$fid" --arg phase "$phase" --arg status "blocked" --arg reason "$reason" \
135
+ '{team:$team, feature:$feature, phase:$phase, agent:null, prompt:null, log:null, status:$status, reason:$reason, pid:null}' >> "$dispatches_file"
136
+ echo "$ts | conductor | worker-dispatch | blocked | T${team}/${fid} | ${reason}" >> "$PROJECT_ROOT/.harness/progress.log"
137
+ i=$((i + 1))
138
+ continue
139
+ fi
140
+
112
141
  build_prompt "$team" "$fid" "$agent" "$prompt_path" "$log_path"
113
142
 
114
143
  pid="null"
@@ -123,22 +152,24 @@ while [ "$i" -lt "$count" ]; do
123
152
  fi
124
153
 
125
154
  tmpq="${QUEUE}.tmp.$$.$i"
126
- jq --arg tid "$team" --arg agent "$agent" --arg prompt "$prompt_rel" --arg log "$log_rel" --arg status "$status" --argjson pid "$pid" --arg ts "$ts" '
155
+ jq --arg tid "$team" --arg agent "$agent" --arg phase "$phase" --arg prompt "$prompt_rel" --arg log "$log_rel" --arg status "$status" --argjson pid "$pid" --arg ts "$ts" '
127
156
  .teams[$tid].pid = $pid |
128
157
  .teams[$tid].agent = $agent |
158
+ .teams[$tid].phase = $phase |
129
159
  .teams[$tid].prompt = $prompt |
130
160
  .teams[$tid].log = $log |
131
161
  .teams[$tid].spawn_status = $status |
132
162
  .teams[$tid].started_at = $ts |
133
163
  .queue.in_progress[.teams[$tid].feature].agent = $agent |
164
+ .queue.in_progress[.teams[$tid].feature].phase = $phase |
134
165
  .queue.in_progress[.teams[$tid].feature].prompt = $prompt |
135
166
  .queue.in_progress[.teams[$tid].feature].log = $log |
136
167
  .queue.in_progress[.teams[$tid].feature].pid = $pid
137
168
  ' "$QUEUE" > "$tmpq" && mv "$tmpq" "$QUEUE"
138
169
 
139
- jq -n --argjson team "$team" --arg feature "$fid" --arg agent "$agent" --arg prompt "$prompt_rel" --arg log "$log_rel" --arg status "$status" --argjson pid "$pid" \
140
- '{team:$team, feature:$feature, agent:$agent, prompt:$prompt, log:$log, status:$status, pid:$pid}' >> "$dispatches_file"
141
- echo "$ts | conductor | worker-dispatch | $status | T${team}/${fid} | $agent pid=$pid" >> "$PROJECT_ROOT/.harness/progress.log"
170
+ jq -n --argjson team "$team" --arg feature "$fid" --arg agent "$agent" --arg phase "$phase" --arg prompt "$prompt_rel" --arg log "$log_rel" --arg status "$status" --argjson pid "$pid" \
171
+ '{team:$team, feature:$feature, agent:$agent, phase:$phase, prompt:$prompt, log:$log, status:$status, pid:$pid}' >> "$dispatches_file"
172
+ echo "$ts | conductor | worker-dispatch | $status | T${team}/${fid} | $agent phase=$phase pid=$pid" >> "$PROJECT_ROOT/.harness/progress.log"
142
173
  i=$((i + 1))
143
174
  done
144
175
 
@@ -0,0 +1,59 @@
1
+ #!/bin/bash
2
+ # harness-worker-evidence-validate.sh — block CXX direct execution without worker reports
3
+ set -euo pipefail
4
+
5
+ PROJECT_ROOT="${1:-.}"
6
+ DOC_ROOT="$PROJECT_ROOT/.harness/documents"
7
+
8
+ [ -d "$DOC_ROOT" ] || exit 0
9
+
10
+ mode="${2:-text}"
11
+ violations=()
12
+
13
+ has_worker_report() {
14
+ local mission_dir="$1"
15
+ find "$mission_dir/workers" -maxdepth 1 -type f -name '*.md' 2>/dev/null | grep -q .
16
+ }
17
+
18
+ for mission_dir in "$DOC_ROOT"/*; do
19
+ [ -d "$mission_dir" ] || continue
20
+ mission_name="$(basename "$mission_dir")"
21
+
22
+ cxx_docs=()
23
+ for cxx in coo cdo cto cqo ops; do
24
+ cxx_path="$mission_dir/$cxx.md"
25
+ [ -s "$cxx_path" ] || continue
26
+ cxx_docs+=("$cxx.md")
27
+ done
28
+
29
+ [ "${#cxx_docs[@]}" -gt 0 ] || continue
30
+ if ! has_worker_report "$mission_dir"; then
31
+ violations+=("$mission_name:${cxx_docs[*]}")
32
+ fi
33
+ done
34
+
35
+ if [ "${#violations[@]}" -eq 0 ]; then
36
+ if [ "$mode" = "json" ]; then
37
+ jq -nc '{ok:true, violations:[]}'
38
+ fi
39
+ exit 0
40
+ fi
41
+
42
+ if [ "$mode" = "json" ]; then
43
+ printf '%s\n' "${violations[@]}" | jq -Rcs '
44
+ split("\n")[:-1]
45
+ | map(capture("(?<mission>[^:]+):(?<docs>.*)") | .docs = (.docs | split(" ")))
46
+ | {ok:false, violations:.}
47
+ '
48
+ else
49
+ echo "CXX worker evidence violation:"
50
+ for violation in "${violations[@]}"; do
51
+ mission="${violation%%:*}"
52
+ docs="${violation#*:}"
53
+ echo "- mission: $mission"
54
+ echo " cxx_docs: $docs"
55
+ echo " required: at least one .harness/documents/$mission/workers/{worker-name}.md report"
56
+ done
57
+ fi
58
+
59
+ exit 1
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env node
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+
6
+ const sourceRoot = process.argv[2] || '/Users/ted/Downloads/agency-agents-main';
7
+ const targetRoot = process.argv[3] || path.resolve(process.cwd(), 'HR-Resource');
8
+
9
+ function walk(dir, out = []) {
10
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
11
+ const full = path.join(dir, entry.name);
12
+ if (entry.isDirectory()) walk(full, out);
13
+ else if (entry.isFile() && entry.name.endsWith('.md')) out.push(full);
14
+ }
15
+ return out;
16
+ }
17
+
18
+ function slugify(value) {
19
+ return value
20
+ .toLowerCase()
21
+ .replace(/[^a-z0-9]+/g, '-')
22
+ .replace(/^-+|-+$/g, '');
23
+ }
24
+
25
+ function parseFrontmatter(content) {
26
+ const match = /^---\n([\s\S]*?)\n---\n?/.exec(content);
27
+ if (!match) return null;
28
+ const frontmatter = match[1];
29
+ const fields = {};
30
+ for (const line of frontmatter.split('\n')) {
31
+ const m = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line);
32
+ if (m) fields[m[1]] = m[2].replace(/^["']|["']$/g, '');
33
+ }
34
+ return { frontmatter, fields, body: content.slice(match[0].length) };
35
+ }
36
+
37
+ function hasAgentShape(parsed) {
38
+ return Boolean(parsed && parsed.fields.name && parsed.fields.description);
39
+ }
40
+
41
+ function convertFile(file) {
42
+ const content = fs.readFileSync(file, 'utf8');
43
+ const parsed = parseFrontmatter(content);
44
+ if (!hasAgentShape(parsed)) return null;
45
+
46
+ const sourceRel = path.relative(sourceRoot, file);
47
+ const sourceSlug = slugify(sourceRel.replace(/\.md$/, ''));
48
+ const agentName = slugify(parsed.fields.name);
49
+ const skillName = sourceSlug || agentName;
50
+ const destDir = path.join(targetRoot, skillName);
51
+ const dest = path.join(destDir, 'SKILL.md');
52
+
53
+ const description = parsed.fields.description.replace(/"/g, '\\"');
54
+ const body = parsed.body.replace(/^# /, `# ${parsed.fields.name}\n\n`);
55
+ const skill = [
56
+ '---',
57
+ `name: ${skillName}`,
58
+ `description: "${description}"`,
59
+ 'model: sonnet',
60
+ 'disable-model-invocation: false',
61
+ '---',
62
+ '',
63
+ '<!--',
64
+ `Imported from agency-agents: ${sourceRel}`,
65
+ 'Original frontmatter:',
66
+ parsed.frontmatter,
67
+ '-->',
68
+ '',
69
+ body.trim(),
70
+ '',
71
+ '## Harness Operating Contract',
72
+ '',
73
+ '- You are a hireable HR-Resource worker, not a CXX executive.',
74
+ '- Work only after a CXX assigns a mission through `/hiring` and `/resource-manager` wiring.',
75
+ '- Start each assignment from fresh context.',
76
+ '- Record mission output in `.harness/documents/{mission_name}/workers/{name}.md` unless the requester specifies another mission document.',
77
+ '- Follow DDD boundaries for domain, application, infrastructure, and interface decisions.',
78
+ ''
79
+ ].join('\n');
80
+
81
+ fs.mkdirSync(destDir, { recursive: true });
82
+ fs.writeFileSync(dest, skill);
83
+ return { sourceRel, skillName };
84
+ }
85
+
86
+ const converted = [];
87
+ for (const file of walk(sourceRoot)) {
88
+ const result = convertFile(file);
89
+ if (result) converted.push(result);
90
+ }
91
+
92
+ converted.sort((a, b) => a.skillName.localeCompare(b.skillName));
93
+ const index = {
94
+ source: sourceRoot,
95
+ imported_at: new Date().toISOString(),
96
+ count: converted.length,
97
+ resources: converted
98
+ };
99
+ fs.mkdirSync(targetRoot, { recursive: true });
100
+ fs.writeFileSync(path.join(targetRoot, 'index.json'), JSON.stringify(index, null, 2) + '\n');
101
+
102
+ console.log(`Imported ${converted.length} agency agents into ${targetRoot}`);
@@ -0,0 +1,127 @@
1
+ #!/bin/bash
2
+ # harness-agent-resolver.sh — canonical feature/phase → harness agent resolver
3
+ #
4
+ # Worker dispatch must not guess the department when Planner already wrote
5
+ # owner_agents/applicable_eval_axes. This resolver is intentionally strict:
6
+ # declared metadata wins; keyword fallback is only allowed when metadata is
7
+ # absent.
8
+
9
+ set -uo pipefail
10
+
11
+ resolve_feature_agent() {
12
+ local project_root="$1" fid="$2" phase="${3:-gen}" pipeline="${4:-FULLSTACK}"
13
+ local features="$project_root/.harness/actions/feature-list.json"
14
+
15
+ [ -f "$features" ] || return 2
16
+ command -v jq >/dev/null 2>&1 || return 2
17
+
18
+ local feature_json
19
+ feature_json="$(jq -c --arg id "$fid" '.features[]? | select(.id == $id)' "$features" 2>/dev/null | head -1)"
20
+ [ -n "$feature_json" ] && [ "$feature_json" != "null" ] || return 3
21
+
22
+ case "$phase" in
23
+ eval|eval:*|evaluation|evaluator-*)
24
+ _resolve_eval_agent "$feature_json" "$phase"
25
+ return $?
26
+ ;;
27
+ *)
28
+ _resolve_generation_agent "$feature_json" "$pipeline"
29
+ return $?
30
+ ;;
31
+ esac
32
+ }
33
+
34
+ _resolve_generation_agent() {
35
+ local feature_json="$1" pipeline="$2"
36
+ local owner_count agent
37
+
38
+ owner_count="$(jq '(.owner_agents // []) | length' <<<"$feature_json")"
39
+ if [ "${owner_count:-0}" -gt 0 ]; then
40
+ agent="$(jq -r '
41
+ (.owner_agents // [])
42
+ | map(select(
43
+ . == "generator-backend" or
44
+ . == "generator-frontend" or
45
+ . == "generator-designer" or
46
+ . == "generator-devops"
47
+ ))
48
+ | .[0] // empty
49
+ ' <<<"$feature_json")"
50
+ [ -n "$agent" ] || return 4
51
+ echo "$agent"
52
+ return 0
53
+ fi
54
+
55
+ local layer service title text
56
+ layer="$(jq -r '(.layer // .type // "")' <<<"$feature_json")"
57
+ service="$(jq -r '(.service // "")' <<<"$feature_json")"
58
+ title="$(jq -r '(.title // .name // .description // "")' <<<"$feature_json")"
59
+ text="$(printf '%s %s %s' "$layer" "$service" "$title" | tr '[:upper:]' '[:lower:]')"
60
+
61
+ case "$text" in
62
+ *frontend*|*ui*|*web*|*react*|*next*) echo "generator-frontend" ;;
63
+ *design*|*token*|*component-spec*) echo "generator-designer" ;;
64
+ *devops*|*infra*|*deploy*|*ci*) echo "generator-devops" ;;
65
+ *)
66
+ if [ "$pipeline" = "FE-ONLY" ]; then echo "generator-frontend"; else echo "generator-backend"; fi
67
+ ;;
68
+ esac
69
+ }
70
+
71
+ _resolve_eval_agent() {
72
+ local feature_json="$1" phase="$2"
73
+ local requested_axis axes_count agent
74
+
75
+ requested_axis="${phase#eval:}"
76
+ requested_axis="${requested_axis#evaluator-}"
77
+ [ "$requested_axis" = "$phase" ] && requested_axis=""
78
+ [ "$requested_axis" = "eval" ] && requested_axis=""
79
+ [ "$requested_axis" = "evaluation" ] && requested_axis=""
80
+
81
+ axes_count="$(jq '(.applicable_eval_axes // []) | length' <<<"$feature_json")"
82
+ [ "${axes_count:-0}" -gt 0 ] || return 5
83
+
84
+ if [ -n "$requested_axis" ]; then
85
+ agent="$(_axis_to_evaluator "$requested_axis")" || return 6
86
+ jq -e --arg agent "$agent" '
87
+ def map_axis:
88
+ if . == "code-quality" or . == "code_quality" or . == "evaluator-code-quality" then "evaluator-code-quality"
89
+ elif . == "functional" or . == "evaluator-functional" then "evaluator-functional"
90
+ elif . == "visual" or . == "evaluator-visual" then "evaluator-visual"
91
+ elif . == "architecture" or . == "evaluator-architecture" then "evaluator-architecture"
92
+ elif . == "security" or . == "evaluator-security" then "evaluator-security"
93
+ else empty end;
94
+ (.applicable_eval_axes // []) | map(map_axis) | index($agent)
95
+ ' <<<"$feature_json" >/dev/null || return 7
96
+ echo "$agent"
97
+ return 0
98
+ fi
99
+
100
+ agent="$(jq -r '
101
+ def map_axis:
102
+ if . == "code-quality" or . == "code_quality" or . == "evaluator-code-quality" then "evaluator-code-quality"
103
+ elif . == "functional" or . == "evaluator-functional" then "evaluator-functional"
104
+ elif . == "visual" or . == "evaluator-visual" then "evaluator-visual"
105
+ elif . == "architecture" or . == "evaluator-architecture" then "evaluator-architecture"
106
+ elif . == "security" or . == "evaluator-security" then "evaluator-security"
107
+ else empty end;
108
+ (.applicable_eval_axes // []) | map(map_axis) | .[0] // empty
109
+ ' <<<"$feature_json")"
110
+ [ -n "$agent" ] || return 6
111
+ echo "$agent"
112
+ }
113
+
114
+ _axis_to_evaluator() {
115
+ case "$1" in
116
+ code-quality|code_quality|evaluator-code-quality) echo "evaluator-code-quality" ;;
117
+ functional|evaluator-functional) echo "evaluator-functional" ;;
118
+ visual|evaluator-visual) echo "evaluator-visual" ;;
119
+ architecture|evaluator-architecture) echo "evaluator-architecture" ;;
120
+ security|evaluator-security) echo "evaluator-security" ;;
121
+ *) return 1 ;;
122
+ esac
123
+ }
124
+
125
+ if [ "${BASH_SOURCE[0]}" = "$0" ]; then
126
+ resolve_feature_agent "${1:-.}" "${2:-}" "${3:-gen}" "${4:-FULLSTACK}"
127
+ fi