@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
package/bin/init.js CHANGED
@@ -53,6 +53,9 @@ function resolveProjectRoot() {
53
53
  const PROJECT_ROOT = resolveProjectRoot();
54
54
  const HARNESS_DIR = path.join(PROJECT_ROOT, '.harness');
55
55
  const CLAUDE_SKILLS_DIR = path.join(PROJECT_ROOT, '.claude', 'skills');
56
+ const CLAUDE_COMMANDS_DIR = path.join(PROJECT_ROOT, '.claude', 'commands');
57
+ const CODEX_SKILLS_DIR = path.join(PROJECT_ROOT, '.codex', 'skills');
58
+ const CODEX_COMMANDS_DIR = path.join(PROJECT_ROOT, '.codex', 'commands');
56
59
 
57
60
  // ─────────────────────────────────────────
58
61
  // Utility
@@ -86,10 +89,91 @@ function fileExists(p) {
86
89
  return fs.existsSync(p);
87
90
  }
88
91
 
92
+ function deepMerge(base, override) {
93
+ if (!override || typeof override !== 'object' || Array.isArray(override)) return base;
94
+ const out = { ...(base || {}) };
95
+ for (const [key, value] of Object.entries(override)) {
96
+ if (value && typeof value === 'object' && !Array.isArray(value)) {
97
+ out[key] = deepMerge(out[key] || {}, value);
98
+ } else {
99
+ out[key] = value;
100
+ }
101
+ }
102
+ return out;
103
+ }
104
+
89
105
  function log(msg) {
90
106
  console.log(`[walwal-harness] ${msg}`);
91
107
  }
92
108
 
109
+ function readClaudeSettings() {
110
+ const settingsPath = path.join(PROJECT_ROOT, '.claude', 'settings.json');
111
+ if (!fileExists(settingsPath)) return {};
112
+ try {
113
+ return JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
114
+ } catch (e) {
115
+ log('WARNING: Could not parse existing .claude/settings.json, creating new');
116
+ return {};
117
+ }
118
+ }
119
+
120
+ function writeClaudeSettings(settings) {
121
+ const settingsPath = path.join(PROJECT_ROOT, '.claude', 'settings.json');
122
+ ensureDir(path.dirname(settingsPath));
123
+ fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
124
+ }
125
+
126
+ function mergeClaudePermissionAllow(settings, entries) {
127
+ if (!settings.permissions || typeof settings.permissions !== 'object') {
128
+ settings.permissions = {};
129
+ }
130
+ if (!Array.isArray(settings.permissions.allow)) {
131
+ settings.permissions.allow = [];
132
+ }
133
+
134
+ let changed = false;
135
+ for (const entry of entries) {
136
+ if (!settings.permissions.allow.includes(entry)) {
137
+ settings.permissions.allow.push(entry);
138
+ changed = true;
139
+ }
140
+ }
141
+ return changed;
142
+ }
143
+
144
+ const V7_REMOVED_CONVENTION_FILES = [
145
+ 'conductor.md',
146
+ 'coo-developer.md',
147
+ 'dispatcher.md',
148
+ 'documentationer.md',
149
+ 'evaluator-architecture.md',
150
+ 'evaluator-code-quality.md',
151
+ 'evaluator-functional.md',
152
+ 'evaluator-security.md',
153
+ 'evaluator-visual.md',
154
+ 'generator-backend.md',
155
+ 'generator-designer.md',
156
+ 'generator-devops.md',
157
+ 'generator-frontend.md',
158
+ 'meeting-manager.md',
159
+ 'planner.md',
160
+ 'service-ops.md',
161
+ ];
162
+
163
+ const V7_REMOVED_GOTCHA_FILES = [
164
+ ...V7_REMOVED_CONVENTION_FILES,
165
+ 'generator-backend-laravel.md',
166
+ ];
167
+
168
+ function removeLegacyV7Files(dir, files) {
169
+ for (const file of files) {
170
+ const target = path.join(dir, file);
171
+ if (fs.existsSync(target)) {
172
+ fs.rmSync(target, { force: true });
173
+ }
174
+ }
175
+ }
176
+
93
177
  // ─────────────────────────────────────────
94
178
  // First-install migration — extract Convention/Gotcha-shaped sections from
95
179
  // existing CLAUDE.md / AGENTS.md into .harness/conventions and .harness/gotchas.
@@ -114,12 +198,15 @@ function migrateExistingDocs() {
114
198
 
115
199
  const scopeFor = (body) => {
116
200
  const b = body.toLowerCase();
117
- if (/\b(backend|api|nestjs|controller|dto|service|msa|repository)\b/.test(b)) return 'generator-backend';
118
- if (/\b(frontend|react|next\.?js|ui|component|tsx|tailwind|hook)\b/.test(b)) return 'generator-frontend';
119
- if (/\b(planner|plan\.md|sprint|feature-list|api-contract)\b/.test(b)) return 'planner';
120
- if (/\b(playwright|e2e|functional test)\b/.test(b)) return 'evaluator-functional';
121
- if (/\b(visual|layout|screenshot|a11y|accessibility|responsive)\b/.test(b)) return 'evaluator-visual';
122
- if (/\b(code quality|lint|tsc|architecture|typescript strict)\b/.test(b)) return 'evaluator-code-quality';
201
+ if (/\b(ceo|dispatcher|owner|goal|hot-?fix|mission)\b/.test(b)) return 'ceo';
202
+ if (/\b(coo|planning|research|hypothesis|backtest|reference)\b/.test(b)) return 'coo';
203
+ if (/\b(cdo|design|brand|ui|ux|mock|visual)\b/.test(b)) return 'cdo';
204
+ if (/\b(cto|architecture|backend|frontend|api|platform|account|devops|implementation)\b/.test(b)) return 'cto';
205
+ if (/\b(cqo|quality|regression|e2e|test|archive|memory|gotcha)\b/.test(b)) return 'cqo';
206
+ if (/\b(ops|operation|service|log|incident|deploy|launch)\b/.test(b)) return 'ops';
207
+ if (/\b(hiring|hire|recruit|hr-resource|worker)\b/.test(b)) return 'hiring';
208
+ if (/\b(resource-manager|resource manager|alias|keyword|wording)\b/.test(b)) return 'resource-manager';
209
+ if (/\b(brick-office|dashboard)\b/.test(b)) return 'brick-office';
123
210
  return 'shared';
124
211
  };
125
212
 
@@ -187,13 +274,12 @@ function migrateExistingDocs() {
187
274
  report.push(`[${id}] "${sec.title}" → conventions/${scope}.md (from ${sourceRef})`);
188
275
  } else {
189
276
  const scope = scopeFor(sec.title + '\n' + body);
190
- const agent = scope === 'shared' ? 'planner' : scope; // default shared-gotchas to planner
191
277
  extractedGotcha.counter += 1;
192
278
  const id = `G-${String(extractedGotcha.counter).padStart(3, '0')}`;
193
- const target = path.join(HARNESS_DIR, 'gotchas', `${agent}.md`);
279
+ const target = path.join(HARNESS_DIR, 'gotchas', `${scope}.md`);
194
280
  appendEntry(target, id, 'gotcha', sec.title, body, sourceRef);
195
- extractedGotcha.byAgent[agent] = (extractedGotcha.byAgent[agent] || 0) + 1;
196
- report.push(`[${id}] "${sec.title}" → gotchas/${agent}.md (from ${sourceRef})`);
281
+ extractedGotcha.byAgent[scope] = (extractedGotcha.byAgent[scope] || 0) + 1;
282
+ report.push(`[${id}] "${sec.title}" → gotchas/${scope}.md (from ${sourceRef})`);
197
283
  }
198
284
  }
199
285
  }
@@ -246,6 +332,30 @@ function scaffoldHarness() {
246
332
  ensureDir(path.join(HARNESS_DIR, 'archive'));
247
333
  ensureDir(path.join(HARNESS_DIR, 'gotchas'));
248
334
  ensureDir(path.join(HARNESS_DIR, 'conventions'));
335
+ ensureDir(path.join(HARNESS_DIR, 'documents'));
336
+ ensureDir(path.join(HARNESS_DIR, 'logs'));
337
+ ensureDir(path.join(HARNESS_DIR, 'memories'));
338
+ ensureDir(path.join(HARNESS_DIR, 'shared'));
339
+
340
+ removeLegacyV7Files(path.join(HARNESS_DIR, 'conventions'), V7_REMOVED_CONVENTION_FILES);
341
+ removeLegacyV7Files(path.join(HARNESS_DIR, 'gotchas'), V7_REMOVED_GOTCHA_FILES);
342
+
343
+ const hrResourceSrc = path.join(PKG_ROOT, 'HR-Resource');
344
+ const hrResourceDest = path.join(HARNESS_DIR, 'shared', 'HR-Resource');
345
+ if (fs.existsSync(hrResourceSrc) && (!fs.existsSync(hrResourceDest) || isForce)) {
346
+ copyDir(hrResourceSrc, hrResourceDest);
347
+ log('HR-Resource copied to .harness/shared/HR-Resource');
348
+ }
349
+
350
+ const rosterPath = path.join(HARNESS_DIR, 'shared', 'hr-roster.json');
351
+ if (!fileExists(rosterPath) || isForce) {
352
+ fs.writeFileSync(rosterPath, JSON.stringify({ hired: [] }, null, 2) + '\n');
353
+ }
354
+
355
+ const resourceIndexPath = path.join(HARNESS_DIR, 'shared', 'resource-index.json');
356
+ if (!fileExists(resourceIndexPath) || isForce) {
357
+ fs.writeFileSync(resourceIndexPath, JSON.stringify({ aliases: {}, keywords: {} }, null, 2) + '\n');
358
+ }
249
359
 
250
360
  // Copy gotchas — preserve any existing file that has accumulated entries.
251
361
  // Dispatcher appends `### [G-NNN] ...` entries directly; we must NEVER overwrite
@@ -372,6 +482,7 @@ function scaffoldHarness() {
372
482
  // Preserve user customizations
373
483
  const userPreserve = {
374
484
  behavior: existing.behavior,
485
+ runtime: existing.runtime,
375
486
  'flow.pre_eval_gate.frontend_cwd': existing?.flow?.pre_eval_gate?.frontend_cwd,
376
487
  'flow.pre_eval_gate.backend_cwd': existing?.flow?.pre_eval_gate?.backend_cwd,
377
488
  'flow.pre_eval_gate.frontend_checks': existing?.flow?.pre_eval_gate?.frontend_checks,
@@ -382,6 +493,9 @@ function scaffoldHarness() {
382
493
  // Re-apply preserved user settings
383
494
  const merged = JSON.parse(fs.readFileSync(configDest, 'utf8'));
384
495
  if (userPreserve.behavior) merged.behavior = userPreserve.behavior;
496
+ if (userPreserve.runtime) {
497
+ merged.runtime = deepMerge(merged.runtime || {}, userPreserve.runtime);
498
+ }
385
499
  if (userPreserve['flow.pre_eval_gate.frontend_cwd']) {
386
500
  merged.flow.pre_eval_gate.frontend_cwd = userPreserve['flow.pre_eval_gate.frontend_cwd'];
387
501
  }
@@ -405,6 +519,8 @@ function scaffoldHarness() {
405
519
  }
406
520
  }
407
521
 
522
+ ensureHarnessEnv();
523
+
408
524
  // HARNESS.md — ALWAYS update
409
525
  const harnessMdSrc = path.join(PKG_ROOT, 'assets', 'templates', 'HARNESS.md');
410
526
  const harnessMdDest = path.join(HARNESS_DIR, 'HARNESS.md');
@@ -443,38 +559,57 @@ function scaffoldHarness() {
443
559
  log('.harness/ scaffolding complete');
444
560
  }
445
561
 
562
+ function ensureHarnessEnv() {
563
+ const envPath = path.join(PROJECT_ROOT, '.env');
564
+ const marker = 'HARNESS_BASE_PORT';
565
+ const re = new RegExp(`^${marker}`, 'm');
566
+
567
+ let content = '';
568
+ if (fileExists(envPath)) {
569
+ content = fs.readFileSync(envPath, 'utf8');
570
+ }
571
+
572
+ if (re.test(content)) return;
573
+
574
+ const prefix = content && !content.endsWith('\n') ? '\n' : '';
575
+ const block = `${prefix}${content ? '\n' : ''}# Walwal Harness — CEO must agree on a {xx}000 base port with the Owner.\n# Set HARNESS_BASE_PORT before CXX agents allocate any service ports.\n# HARNESS_BASE_PORT=\n`;
576
+ fs.writeFileSync(envPath, content + block);
577
+ log('.env: HARNESS_BASE_PORT placeholder added — set value with Owner approval before starting services');
578
+ }
579
+
446
580
  // ─────────────────────────────────────────
447
581
  // 2. Skills → .claude/skills/
448
582
  // ─────────────────────────────────────────
449
583
  function installSkills() {
450
- log('Installing skills to .claude/skills/...');
584
+ log('Installing skills to .claude/skills/ and .codex/skills/...');
451
585
 
452
- const skillsSrc = path.join(PKG_ROOT, 'skills');
453
- if (!fs.existsSync(skillsSrc)) {
454
- log('WARNING: skills/ directory not found in package');
455
- return;
456
- }
586
+ const hrSrc = path.join(PKG_ROOT, 'HR-Resource');
587
+ const destinations = [CLAUDE_SKILLS_DIR, CODEX_SKILLS_DIR];
457
588
 
458
- // harness- 프리픽스 스킬 전체 삭제 후 재복사 — 잔류 방지
459
- if (fs.existsSync(CLAUDE_SKILLS_DIR)) {
460
- const existing = fs.readdirSync(CLAUDE_SKILLS_DIR, { withFileTypes: true });
589
+ for (const destRoot of destinations) {
590
+ ensureDir(destRoot);
591
+ const existing = fs.readdirSync(destRoot, { withFileTypes: true });
461
592
  for (const entry of existing) {
462
593
  if (entry.isDirectory() && entry.name.startsWith('harness-')) {
463
- fs.rmSync(path.join(CLAUDE_SKILLS_DIR, entry.name), { recursive: true, force: true });
594
+ fs.rmSync(path.join(destRoot, entry.name), { recursive: true, force: true });
464
595
  }
465
596
  }
466
- log(' Cleared existing harness-* skills');
467
597
  }
598
+ log(' Cleared existing harness-* skills');
468
599
 
469
- const skills = fs.readdirSync(skillsSrc, { withFileTypes: true })
470
- .filter(d => d.isDirectory())
471
- .map(d => d.name);
600
+ const installSkillDir = (src, destName) => {
601
+ for (const destRoot of destinations) {
602
+ copyDir(src, path.join(destRoot, destName));
603
+ }
604
+ log(` Installed: ${destName}`);
605
+ };
472
606
 
473
- for (const skill of skills) {
474
- const src = path.join(skillsSrc, skill);
475
- const dest = path.join(CLAUDE_SKILLS_DIR, `harness-${skill}`);
476
- copyDir(src, dest);
477
- log(` Installed: harness-${skill}`);
607
+ const coreHrSkills = ['ceo', 'coo', 'cdo', 'cto', 'cqo', 'ops', 'hiring', 'resource-manager', 'brick-office'];
608
+ if (fs.existsSync(hrSrc)) {
609
+ for (const skill of coreHrSkills) {
610
+ const src = path.join(hrSrc, skill);
611
+ if (fs.existsSync(src)) installSkillDir(src, `harness-${skill}`);
612
+ }
478
613
  }
479
614
 
480
615
  log('Skills installation complete');
@@ -520,7 +655,7 @@ function installScripts() {
520
655
  // 3a. Commands → .claude/commands/
521
656
  // ─────────────────────────────────────────
522
657
  function installCommands() {
523
- log('Installing commands to .claude/commands/...');
658
+ log('Installing commands to .claude/commands/ and .codex/commands/...');
524
659
 
525
660
  const commandsSrc = path.join(PKG_ROOT, 'commands');
526
661
  if (!fs.existsSync(commandsSrc)) {
@@ -528,24 +663,26 @@ function installCommands() {
528
663
  return;
529
664
  }
530
665
 
531
- const commandsDest = path.join(PROJECT_ROOT, '.claude', 'commands');
532
- ensureDir(commandsDest);
666
+ const commandDests = [CLAUDE_COMMANDS_DIR, CODEX_COMMANDS_DIR];
667
+ commandDests.forEach(ensureDir);
533
668
 
534
669
  // Remove existing harness-* commands to prevent stale files
535
- if (fs.existsSync(commandsDest)) {
670
+ for (const commandsDest of commandDests) {
536
671
  const existing = fs.readdirSync(commandsDest);
537
672
  for (const f of existing) {
538
- if (f.startsWith('harness-')) {
673
+ if (f.startsWith('harness-') || ['goal.md', 'hot-fix.md', 'play-harness.md', 'release-harness.md', 'stop-harness.md', 'brick-office.md', 'hiring.md', 'resource-manager.md', 'ceo.md', 'coo.md', 'cdo.md', 'cto.md', 'cqo.md', 'ops.md'].includes(f)) {
539
674
  fs.unlinkSync(path.join(commandsDest, f));
540
675
  }
541
676
  }
542
- log(' Cleared existing harness-* commands');
543
677
  }
678
+ log(' Cleared existing harness commands');
544
679
 
545
680
  // Copy all command files
546
681
  const files = fs.readdirSync(commandsSrc).filter(f => f.endsWith('.md'));
547
682
  for (const file of files) {
548
- copyFile(path.join(commandsSrc, file), path.join(commandsDest, file));
683
+ for (const commandsDest of commandDests) {
684
+ copyFile(path.join(commandsSrc, file), path.join(commandsDest, file));
685
+ }
549
686
  log(` Installed: /${file.replace('.md', '')}`);
550
687
  }
551
688
 
@@ -559,18 +696,10 @@ function installSessionHook() {
559
696
  log('Installing SessionStart hook...');
560
697
 
561
698
  const settingsDir = path.join(PROJECT_ROOT, '.claude');
562
- const settingsFile = path.join(settingsDir, 'settings.json');
563
699
 
564
700
  ensureDir(settingsDir);
565
701
 
566
- let settings = {};
567
- if (fileExists(settingsFile)) {
568
- try {
569
- settings = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
570
- } catch (e) {
571
- log('WARNING: Could not parse existing .claude/settings.json, creating new');
572
- }
573
- }
702
+ let settings = readClaudeSettings();
574
703
 
575
704
  // Ensure hooks.SessionStart array exists
576
705
  if (!settings.hooks) settings.hooks = {};
@@ -608,10 +737,10 @@ function installSessionHook() {
608
737
  matcher: '',
609
738
  hooks: [{ type: 'command', command: hookCmd }]
610
739
  });
611
- fs.writeFileSync(settingsFile, JSON.stringify(settings, null, 2) + '\n');
740
+ writeClaudeSettings(settings);
612
741
  log('SessionStart hook installed in .claude/settings.json');
613
742
  } else if (migrated) {
614
- fs.writeFileSync(settingsFile, JSON.stringify(settings, null, 2) + '\n');
743
+ writeClaudeSettings(settings);
615
744
  log('SessionStart hook migrated to matcher + hooks-array format');
616
745
  } else {
617
746
  log('SessionStart hook already installed');
@@ -625,18 +754,10 @@ function installStatusline() {
625
754
  log('Installing statusline...');
626
755
 
627
756
  const settingsDir = path.join(PROJECT_ROOT, '.claude');
628
- const settingsFile = path.join(settingsDir, 'settings.json');
629
757
 
630
758
  ensureDir(settingsDir);
631
759
 
632
- let settings = {};
633
- if (fileExists(settingsFile)) {
634
- try {
635
- settings = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
636
- } catch (e) {
637
- log('WARNING: Could not parse existing .claude/settings.json, creating new');
638
- }
639
- }
760
+ let settings = readClaudeSettings();
640
761
 
641
762
  // Check if statusLine is already configured
642
763
  if (settings.statusLine && settings.statusLine.command &&
@@ -651,7 +772,7 @@ function installStatusline() {
651
772
  refreshInterval: 3
652
773
  };
653
774
 
654
- fs.writeFileSync(settingsFile, JSON.stringify(settings, null, 2) + '\n');
775
+ writeClaudeSettings(settings);
655
776
  log('Statusline installed — persistent status bar at terminal bottom');
656
777
  }
657
778
 
@@ -662,18 +783,10 @@ function installUserPromptSubmitHook() {
662
783
  log('Installing UserPromptSubmit hook (auto dispatcher routing)...');
663
784
 
664
785
  const settingsDir = path.join(PROJECT_ROOT, '.claude');
665
- const settingsFile = path.join(settingsDir, 'settings.json');
666
786
 
667
787
  ensureDir(settingsDir);
668
788
 
669
- let settings = {};
670
- if (fileExists(settingsFile)) {
671
- try {
672
- settings = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
673
- } catch (e) {
674
- log('WARNING: Could not parse existing .claude/settings.json, creating new');
675
- }
676
- }
789
+ let settings = readClaudeSettings();
677
790
 
678
791
  if (!settings.hooks) settings.hooks = {};
679
792
  if (!settings.hooks.UserPromptSubmit) settings.hooks.UserPromptSubmit = [];
@@ -699,7 +812,7 @@ function installUserPromptSubmitHook() {
699
812
  matcher: '',
700
813
  hooks: [{ type: 'command', command: hookCmd }]
701
814
  });
702
- fs.writeFileSync(settingsFile, JSON.stringify(settings, null, 2) + '\n');
815
+ writeClaudeSettings(settings);
703
816
  log('UserPromptSubmit hook installed in .claude/settings.json');
704
817
  log(' → All prompts will be routed through harness-dispatcher');
705
818
  log(' → Opt-out per message: say "harness skip" or "without harness"');
@@ -716,18 +829,10 @@ function installStopHook() {
716
829
  log('Installing Stop hook (auto-chain conductor tick)...');
717
830
 
718
831
  const settingsDir = path.join(PROJECT_ROOT, '.claude');
719
- const settingsFile = path.join(settingsDir, 'settings.json');
720
832
 
721
833
  ensureDir(settingsDir);
722
834
 
723
- let settings = {};
724
- if (fileExists(settingsFile)) {
725
- try {
726
- settings = JSON.parse(fs.readFileSync(settingsFile, 'utf8'));
727
- } catch (e) {
728
- log('WARNING: Could not parse existing .claude/settings.json, creating new');
729
- }
730
- }
835
+ let settings = readClaudeSettings();
731
836
 
732
837
  if (!settings.hooks) settings.hooks = {};
733
838
  if (!settings.hooks.Stop) settings.hooks.Stop = [];
@@ -752,7 +857,7 @@ function installStopHook() {
752
857
  matcher: '',
753
858
  hooks: [{ type: 'command', command: hookCmd }]
754
859
  });
755
- fs.writeFileSync(settingsFile, JSON.stringify(settings, null, 2) + '\n');
860
+ writeClaudeSettings(settings);
756
861
  log('Stop hook installed in .claude/settings.json');
757
862
  log(' → Conductor 가 running 인 동안 turn 종료 시 자동으로 다음 tick 으로 연쇄');
758
863
  log(' → 비활성: .harness/config.json behavior.auto_chain_on_stop = false');
@@ -769,11 +874,7 @@ function installStopHook() {
769
874
  // 3d. Agent Teams env var
770
875
  // ─────────────────────────────────────────
771
876
  function installAgentTeamsEnv() {
772
- const settingsPath = path.join(PROJECT_ROOT, '.claude', 'settings.json');
773
- let settings = {};
774
- if (fileExists(settingsPath)) {
775
- try { settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8')); } catch (e) {}
776
- }
877
+ let settings = readClaudeSettings();
777
878
 
778
879
  let changed = false;
779
880
 
@@ -787,26 +888,24 @@ function installAgentTeamsEnv() {
787
888
  log('Agent Teams already enabled');
788
889
  }
789
890
 
790
- // Add git worktree permission for parallel worker isolation
791
- if (!settings.permissions) settings.permissions = {};
792
- if (!settings.permissions.allow) settings.permissions.allow = [];
793
- const worktreePerms = [
891
+ // Add Claude Code permissions required for harness-driven edits, scripts,
892
+ // and parallel worker isolation. Existing permissions are preserved.
893
+ const harnessPerms = [
894
+ 'Bash(*)',
895
+ 'Write(*)',
896
+ 'Edit(*)',
897
+ 'Read(*)',
898
+ 'MultiEdit(*)',
794
899
  'Bash(git worktree *)',
795
900
  'Bash(git checkout *)',
796
901
  'Bash(git merge *)',
797
902
  'Bash(git branch *)'
798
903
  ];
799
- for (const perm of worktreePerms) {
800
- if (!settings.permissions.allow.includes(perm)) {
801
- settings.permissions.allow.push(perm);
802
- changed = true;
803
- }
804
- }
904
+ changed = mergeClaudePermissionAllow(settings, harnessPerms) || changed;
805
905
 
806
906
  if (changed) {
807
- ensureDir(path.dirname(settingsPath));
808
- fs.writeFileSync(settingsPath, JSON.stringify(settings, null, 2) + '\n');
809
- log('Git worktree permissions added for parallel worker isolation');
907
+ writeClaudeSettings(settings);
908
+ log('Claude settings merged: harness permissions/env preserved with existing settings');
810
909
  }
811
910
  }
812
911
 
@@ -957,8 +1056,8 @@ function showHelp() {
957
1056
  ╚══════════════════════════════════════╝
958
1057
 
959
1058
  Usage:
960
- npx walwal-harness Initialize project for harness engineering
961
- npx walwal-harness --force Re-initialize (overwrites existing files)
1059
+ npx walwal-harness init Initialize project for harness engineering
1060
+ npx walwal-harness init --force Re-initialize (overwrites existing harness files)
962
1061
  npx walwal-harness migrate Apply migration (always-on company mode)
963
1062
  npx walwal-harness migrate --dry-run Preview migration changes without applying
964
1063
  npx walwal-harness verify Verify install integrity
@@ -971,18 +1070,18 @@ Runtime (always-on company mode):
971
1070
  - Owner 입력은 GOAL 모호성, escalation, 결과 보고에만 필요합니다.
972
1071
 
973
1072
  What it does:
974
- 1. Scaffolds .harness/ directory (actions, archive, gotchas, config)
975
- 2. Installs skills to .claude/skills/ (dispatcher, planner, generators, evaluators)
976
- 3. Copies helper scripts to scripts/
1073
+ 1. Scaffolds project-local .harness/ runtime state
1074
+ 2. Installs commands to .claude/commands/ and .codex/commands/
1075
+ 3. Installs CXX and harness skills to .claude/skills/ and .codex/skills/
1076
+ 4. Copies HR-Resource to .harness/shared/HR-Resource for hiring
977
1077
  4. Registers SessionStart + UserPromptSubmit + Stop hooks
978
1078
  5. Installs statusline (persistent 1-line status bar)
979
- 6. Creates AGENTS.md + CLAUDE.md symlink
1079
+ 6. Creates AGENTS.md + CLAUDE.md symlink when needed
980
1080
 
981
1081
  After init:
982
- 1. Restart Claude Code session (/exit → re-enter directory)
983
- 2. Say "하네스 엔지니어링 시작" or /harness-dispatcher
984
- 3. After GOAL intake, Conductor runs the company loop autonomously.
985
- 4. (선택) bash scripts/harness-wake-install.sh install . — 1시간마다 자동 wake.
1082
+ 1. Restart Claude/Codex session if command discovery needs refresh.
1083
+ 2. Use /goal or /hot-fix.
1084
+ 3. Internal agents must call hired agents/skills, not slash commands.
986
1085
  `);
987
1086
  }
988
1087
 
@@ -1357,6 +1456,7 @@ function runVerify() {
1357
1456
  'generator-backend', 'generator-frontend', 'generator-designer', 'generator-devops',
1358
1457
  'evaluator-code-quality', 'evaluator-functional', 'evaluator-visual',
1359
1458
  'evaluator-architecture', 'evaluator-security',
1459
+ 'coo-developer', 'documentationer',
1360
1460
  'brainstorming',
1361
1461
  ];
1362
1462
  const requiredFrontmatter = ['name', 'description'];
@@ -1538,7 +1638,6 @@ function main() {
1538
1638
  console.log('╚══════════════════════════════════════════════════════════╝');
1539
1639
  console.log(' bash scripts/harness-dashboard-up.sh');
1540
1640
  console.log(' → http://localhost:3001 에서 .harness/ 상태 실시간 시각화');
1541
- console.log(' → 첫 실행 시 git sparse-checkout 으로 ~5MB 만 가져옵니다.');
1542
1641
  console.log('');
1543
1642
 
1544
1643
  console.log('');
@@ -1556,9 +1655,9 @@ function main() {
1556
1655
  log('╚═══════════════════════════════════════════════════════════╝');
1557
1656
  } else {
1558
1657
  log('Next steps:');
1559
- log(' 1. Restart Claude Code session (/exit → re-enter directory)');
1560
- log(' 2. Say "하네스 엔지니어링 시작" or /harness-dispatcher');
1561
- log(' 3. 회사모드가 자동으로 병렬 실행합니다. 진행 여부를 묻지 않습니다.');
1658
+ log(' 1. Restart Claude/Codex if command discovery needs refresh.');
1659
+ log(' 2. Use /goal or /hot-fix.');
1660
+ log(' 3. Internal agents call hired agents/skills, not slash commands.');
1562
1661
  }
1563
1662
  console.log('');
1564
1663
  }
@@ -0,0 +1,25 @@
1
+ ---
2
+ description: Set, revise, or extend a company mission goal.
3
+ argument-hint: "<goal request>"
4
+ ---
5
+
6
+ # /goal
7
+
8
+ Route the Owner request to the installed `harness-ceo` agent/skill.
9
+
10
+ Required flow:
11
+ 1. Create or update a mission under `.harness/documents/{mission_name}/`.
12
+ 2. Record CEO decisions in `.harness/documents/{mission_name}/ceo.md`.
13
+ 3. CEO decides whether brainstorming is needed or whether CXX questions can be issued immediately.
14
+ 4. CEO asks COO, CDO, CTO, and CQO only the questions needed for this goal.
15
+ 5. CXX roles must start in a fresh session context. Do not let the default model impersonate a missing worker.
16
+ 6. CXX roles must not directly execute specialist deliverables. They must use hired workers for research, planning, design, implementation, QA, ops checks, and documentation.
17
+ 7. If a required CXX or worker skill is missing, CEO must invoke the installed `harness-hiring` skill before assigning the work.
18
+ 8. CEO must require worker report paths under `.harness/documents/{mission_name}/workers/` before accepting CXX completion.
19
+ 9. Do not invoke internal roles through slash commands; commands are Owner entrypoints only.
20
+
21
+ Owner request:
22
+
23
+ ```
24
+ $ARGUMENTS
25
+ ```
@@ -0,0 +1,25 @@
1
+ ---
2
+ description: Start an urgent fix outside the active goal.
3
+ argument-hint: "<incident or fix request>"
4
+ ---
5
+
6
+ # /hot-fix
7
+
8
+ Route the Owner request to the installed `harness-ceo` agent/skill as an emergency mission.
9
+
10
+ Required flow:
11
+ 1. Create `.harness/documents/{hotfix_name}/ceo.md`.
12
+ 2. CEO summons CTO and CQO; summon COO/CDO only when planning or UX decisions are involved.
13
+ 3. CTO applies the smallest correct patch path through hired implementation skills.
14
+ 4. CXX roles must not directly execute specialist deliverables. They must use hired workers for implementation, QA, ops checks, and documentation even when the fix is small.
15
+ 5. If a required worker is missing, CEO or the responsible CXX must invoke the installed `harness-hiring` skill before assigning the work.
16
+ 6. CQO records regression coverage and recurrence prevention with worker report paths under `.harness/documents/{hotfix_name}/workers/`.
17
+ 7. Register durable lessons in `.harness/gotchas/`, `.harness/conventions/`, or `.harness/memories/` as appropriate.
18
+ 8. Archive only after CQO has accepted the fix.
19
+ 9. Do not invoke internal roles through slash commands; commands are Owner entrypoints only.
20
+
21
+ Hot-fix request:
22
+
23
+ ```
24
+ $ARGUMENTS
25
+ ```
@@ -0,0 +1,22 @@
1
+ ---
2
+ description: Run the harness play build and notify OPS monitoring.
3
+ argument-hint: "[additional play args]"
4
+ ---
5
+
6
+ # /play-harness
7
+
8
+ Run the target project's harness play mode.
9
+
10
+ Required flow:
11
+ 1. Confirm `.harness/` exists in the current project.
12
+ 2. Run `bash scripts/play.sh $ARGUMENTS`.
13
+ 3. Treat play mode and release mode as mutually exclusive. If release mode is active, stop it first with `/stop-harness` or report the conflict to the Owner.
14
+ 4. After the script returns, read the emitted OPS report path and notify the installed `harness-ops` skill/agent that play monitoring has started.
15
+ 5. Record the build result in `.harness/documents/{mission_name}/ops.md` when a mission is active.
16
+ 6. Do not route this through `/goal`; this command is an Owner-facing runtime control entrypoint.
17
+
18
+ Play arguments:
19
+
20
+ ```
21
+ $ARGUMENTS
22
+ ```
@@ -0,0 +1,22 @@
1
+ ---
2
+ description: Run the harness release build, start service operation, and notify OPS monitoring.
3
+ argument-hint: "[additional release args]"
4
+ ---
5
+
6
+ # /release-harness
7
+
8
+ Run the target project's harness release mode and begin service operation.
9
+
10
+ Required flow:
11
+ 1. Confirm `.harness/` exists in the current project.
12
+ 2. Run `bash scripts/release.sh release $ARGUMENTS`.
13
+ 3. Treat play mode and release mode as mutually exclusive. If play mode is active, stop it first with `/stop-harness` or report the conflict to the Owner.
14
+ 4. After the script returns, read the emitted OPS report path and notify the installed `harness-ops` skill/agent that release monitoring has started.
15
+ 5. Record the release result in `.harness/documents/{mission_name}/ops.md` when a mission is active.
16
+ 6. Do not route this through `/goal`; this command is an Owner-facing runtime control entrypoint.
17
+
18
+ Release arguments:
19
+
20
+ ```
21
+ $ARGUMENTS
22
+ ```