@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.
- package/CHANGELOG.md +12 -0
- package/HR-Resource/academic-academic-anthropologist/SKILL.md +142 -0
- package/HR-Resource/academic-academic-geographer/SKILL.md +144 -0
- package/HR-Resource/academic-academic-historian/SKILL.md +140 -0
- package/HR-Resource/academic-academic-narratologist/SKILL.md +135 -0
- package/HR-Resource/academic-academic-psychologist/SKILL.md +135 -0
- package/HR-Resource/brick-office/SKILL.md +20 -0
- package/HR-Resource/cdo/SKILL.md +33 -0
- package/HR-Resource/ceo/SKILL.md +36 -0
- package/HR-Resource/coo/SKILL.md +36 -0
- package/HR-Resource/cqo/SKILL.md +33 -0
- package/HR-Resource/cto/SKILL.md +36 -0
- package/HR-Resource/design-design-brand-guardian/SKILL.md +339 -0
- package/HR-Resource/design-design-image-prompt-engineer/SKILL.md +253 -0
- package/HR-Resource/design-design-inclusive-visuals-specialist/SKILL.md +88 -0
- package/HR-Resource/design-design-ui-designer/SKILL.md +400 -0
- package/HR-Resource/design-design-ux-architect/SKILL.md +486 -0
- package/HR-Resource/design-design-ux-researcher/SKILL.md +346 -0
- package/HR-Resource/design-design-visual-storyteller/SKILL.md +166 -0
- package/HR-Resource/design-design-whimsy-injector/SKILL.md +455 -0
- package/HR-Resource/engineering-engineering-ai-data-remediation-engineer/SKILL.md +227 -0
- package/HR-Resource/engineering-engineering-ai-engineer/SKILL.md +163 -0
- package/HR-Resource/engineering-engineering-autonomous-optimization-architect/SKILL.md +124 -0
- package/HR-Resource/engineering-engineering-backend-architect/SKILL.md +252 -0
- package/HR-Resource/engineering-engineering-cms-developer/SKILL.md +553 -0
- package/HR-Resource/engineering-engineering-code-reviewer/SKILL.md +93 -0
- package/HR-Resource/engineering-engineering-codebase-onboarding-engineer/SKILL.md +190 -0
- package/HR-Resource/engineering-engineering-data-engineer/SKILL.md +323 -0
- package/HR-Resource/engineering-engineering-database-optimizer/SKILL.md +193 -0
- package/HR-Resource/engineering-engineering-devops-automator/SKILL.md +393 -0
- package/HR-Resource/engineering-engineering-email-intelligence-engineer/SKILL.md +370 -0
- package/HR-Resource/engineering-engineering-embedded-firmware-engineer/SKILL.md +190 -0
- package/HR-Resource/engineering-engineering-feishu-integration-developer/SKILL.md +615 -0
- package/HR-Resource/engineering-engineering-filament-optimization-specialist/SKILL.md +300 -0
- package/HR-Resource/engineering-engineering-frontend-developer/SKILL.md +242 -0
- package/HR-Resource/engineering-engineering-git-workflow-master/SKILL.md +101 -0
- package/HR-Resource/engineering-engineering-incident-response-commander/SKILL.md +461 -0
- package/HR-Resource/engineering-engineering-minimal-change-engineer/SKILL.md +224 -0
- package/HR-Resource/engineering-engineering-mobile-app-builder/SKILL.md +510 -0
- package/HR-Resource/engineering-engineering-rapid-prototyper/SKILL.md +479 -0
- package/HR-Resource/engineering-engineering-security-engineer/SKILL.md +321 -0
- package/HR-Resource/engineering-engineering-senior-developer/SKILL.md +193 -0
- package/HR-Resource/engineering-engineering-software-architect/SKILL.md +98 -0
- package/HR-Resource/engineering-engineering-solidity-smart-contract-engineer/SKILL.md +539 -0
- package/HR-Resource/engineering-engineering-sre/SKILL.md +107 -0
- package/HR-Resource/engineering-engineering-technical-writer/SKILL.md +410 -0
- package/HR-Resource/engineering-engineering-threat-detection-engineer/SKILL.md +551 -0
- package/HR-Resource/engineering-engineering-voice-ai-integration-engineer/SKILL.md +578 -0
- package/HR-Resource/engineering-engineering-wechat-mini-program-developer/SKILL.md +367 -0
- package/HR-Resource/finance-finance-bookkeeper-controller/SKILL.md +277 -0
- package/HR-Resource/finance-finance-financial-analyst/SKILL.md +251 -0
- package/HR-Resource/finance-finance-fpa-analyst/SKILL.md +280 -0
- package/HR-Resource/finance-finance-investment-researcher/SKILL.md +289 -0
- package/HR-Resource/finance-finance-tax-strategist/SKILL.md +256 -0
- package/HR-Resource/game-development-blender-blender-addon-engineer/SKILL.md +251 -0
- package/HR-Resource/game-development-game-audio-engineer/SKILL.md +281 -0
- package/HR-Resource/game-development-game-designer/SKILL.md +184 -0
- package/HR-Resource/game-development-godot-godot-gameplay-scripter/SKILL.md +351 -0
- package/HR-Resource/game-development-godot-godot-multiplayer-engineer/SKILL.md +314 -0
- package/HR-Resource/game-development-godot-godot-shader-developer/SKILL.md +283 -0
- package/HR-Resource/game-development-level-designer/SKILL.md +225 -0
- package/HR-Resource/game-development-narrative-designer/SKILL.md +260 -0
- package/HR-Resource/game-development-roblox-studio-roblox-avatar-creator/SKILL.md +314 -0
- package/HR-Resource/game-development-roblox-studio-roblox-experience-designer/SKILL.md +322 -0
- package/HR-Resource/game-development-roblox-studio-roblox-systems-scripter/SKILL.md +342 -0
- package/HR-Resource/game-development-technical-artist/SKILL.md +246 -0
- package/HR-Resource/game-development-unity-unity-architect/SKILL.md +288 -0
- package/HR-Resource/game-development-unity-unity-editor-tool-developer/SKILL.md +327 -0
- package/HR-Resource/game-development-unity-unity-multiplayer-engineer/SKILL.md +338 -0
- package/HR-Resource/game-development-unity-unity-shader-graph-artist/SKILL.md +286 -0
- package/HR-Resource/game-development-unreal-engine-unreal-multiplayer-architect/SKILL.md +330 -0
- package/HR-Resource/game-development-unreal-engine-unreal-systems-engineer/SKILL.md +327 -0
- package/HR-Resource/game-development-unreal-engine-unreal-technical-artist/SKILL.md +273 -0
- package/HR-Resource/game-development-unreal-engine-unreal-world-builder/SKILL.md +290 -0
- package/HR-Resource/hiring/SKILL.md +28 -0
- package/HR-Resource/index.json +747 -0
- package/HR-Resource/integrations-mcp-memory-backend-architect-with-memory/SKILL.md +264 -0
- package/HR-Resource/marketing-marketing-agentic-search-optimizer/SKILL.md +328 -0
- package/HR-Resource/marketing-marketing-ai-citation-strategist/SKILL.md +187 -0
- package/HR-Resource/marketing-marketing-app-store-optimizer/SKILL.md +338 -0
- package/HR-Resource/marketing-marketing-baidu-seo-specialist/SKILL.md +243 -0
- package/HR-Resource/marketing-marketing-bilibili-content-strategist/SKILL.md +216 -0
- package/HR-Resource/marketing-marketing-book-co-author/SKILL.md +127 -0
- package/HR-Resource/marketing-marketing-carousel-growth-engine/SKILL.md +216 -0
- package/HR-Resource/marketing-marketing-china-ecommerce-operator/SKILL.md +300 -0
- package/HR-Resource/marketing-marketing-china-market-localization-strategist/SKILL.md +300 -0
- package/HR-Resource/marketing-marketing-content-creator/SKILL.md +71 -0
- package/HR-Resource/marketing-marketing-cross-border-ecommerce/SKILL.md +276 -0
- package/HR-Resource/marketing-marketing-douyin-strategist/SKILL.md +166 -0
- package/HR-Resource/marketing-marketing-growth-hacker/SKILL.md +71 -0
- package/HR-Resource/marketing-marketing-instagram-curator/SKILL.md +130 -0
- package/HR-Resource/marketing-marketing-kuaishou-strategist/SKILL.md +240 -0
- package/HR-Resource/marketing-marketing-linkedin-content-creator/SKILL.md +230 -0
- package/HR-Resource/marketing-marketing-livestream-commerce-coach/SKILL.md +322 -0
- package/HR-Resource/marketing-marketing-podcast-strategist/SKILL.md +294 -0
- package/HR-Resource/marketing-marketing-private-domain-operator/SKILL.md +325 -0
- package/HR-Resource/marketing-marketing-reddit-community-builder/SKILL.md +140 -0
- package/HR-Resource/marketing-marketing-seo-specialist/SKILL.md +338 -0
- package/HR-Resource/marketing-marketing-short-video-editing-coach/SKILL.md +429 -0
- package/HR-Resource/marketing-marketing-social-media-strategist/SKILL.md +142 -0
- package/HR-Resource/marketing-marketing-tiktok-strategist/SKILL.md +142 -0
- package/HR-Resource/marketing-marketing-twitter-engager/SKILL.md +143 -0
- package/HR-Resource/marketing-marketing-video-optimization-specialist/SKILL.md +136 -0
- package/HR-Resource/marketing-marketing-wechat-official-account/SKILL.md +162 -0
- package/HR-Resource/marketing-marketing-weibo-strategist/SKILL.md +257 -0
- package/HR-Resource/marketing-marketing-xiaohongshu-specialist/SKILL.md +155 -0
- package/HR-Resource/marketing-marketing-zhihu-strategist/SKILL.md +179 -0
- package/HR-Resource/ops/SKILL.md +46 -0
- package/HR-Resource/paid-media-paid-media-auditor/SKILL.md +88 -0
- package/HR-Resource/paid-media-paid-media-creative-strategist/SKILL.md +88 -0
- package/HR-Resource/paid-media-paid-media-paid-social-strategist/SKILL.md +88 -0
- package/HR-Resource/paid-media-paid-media-ppc-strategist/SKILL.md +88 -0
- package/HR-Resource/paid-media-paid-media-programmatic-buyer/SKILL.md +88 -0
- package/HR-Resource/paid-media-paid-media-search-query-analyst/SKILL.md +88 -0
- package/HR-Resource/paid-media-paid-media-tracking-specialist/SKILL.md +88 -0
- package/HR-Resource/product-product-behavioral-nudge-engine/SKILL.md +97 -0
- package/HR-Resource/product-product-feedback-synthesizer/SKILL.md +136 -0
- package/HR-Resource/product-product-manager/SKILL.md +486 -0
- package/HR-Resource/product-product-sprint-prioritizer/SKILL.md +171 -0
- package/HR-Resource/product-product-trend-researcher/SKILL.md +176 -0
- package/HR-Resource/project-management-project-management-experiment-tracker/SKILL.md +215 -0
- package/HR-Resource/project-management-project-management-jira-workflow-steward/SKILL.md +247 -0
- package/HR-Resource/project-management-project-management-project-shepherd/SKILL.md +211 -0
- package/HR-Resource/project-management-project-management-studio-operations/SKILL.md +217 -0
- package/HR-Resource/project-management-project-management-studio-producer/SKILL.md +220 -0
- package/HR-Resource/project-management-project-manager-senior/SKILL.md +152 -0
- package/HR-Resource/resource-manager/SKILL.md +23 -0
- package/HR-Resource/sales-sales-account-strategist/SKILL.md +244 -0
- package/HR-Resource/sales-sales-coach/SKILL.md +288 -0
- package/HR-Resource/sales-sales-deal-strategist/SKILL.md +197 -0
- package/HR-Resource/sales-sales-discovery-coach/SKILL.md +242 -0
- package/HR-Resource/sales-sales-engineer/SKILL.md +199 -0
- package/HR-Resource/sales-sales-outbound-strategist/SKILL.md +218 -0
- package/HR-Resource/sales-sales-pipeline-analyst/SKILL.md +284 -0
- package/HR-Resource/sales-sales-proposal-strategist/SKILL.md +234 -0
- package/HR-Resource/spatial-computing-macos-spatial-metal-engineer/SKILL.md +354 -0
- package/HR-Resource/spatial-computing-terminal-integration-specialist/SKILL.md +87 -0
- package/HR-Resource/spatial-computing-visionos-spatial-engineer/SKILL.md +71 -0
- package/HR-Resource/spatial-computing-xr-cockpit-interaction-specialist/SKILL.md +49 -0
- package/HR-Resource/spatial-computing-xr-immersive-developer/SKILL.md +49 -0
- package/HR-Resource/spatial-computing-xr-interface-architect/SKILL.md +49 -0
- package/HR-Resource/specialized-accounts-payable-agent/SKILL.md +202 -0
- package/HR-Resource/specialized-agentic-identity-trust/SKILL.md +404 -0
- package/HR-Resource/specialized-agents-orchestrator/SKILL.md +384 -0
- package/HR-Resource/specialized-automation-governance-architect/SKILL.md +233 -0
- package/HR-Resource/specialized-blockchain-security-auditor/SKILL.md +480 -0
- package/HR-Resource/specialized-compliance-auditor/SKILL.md +175 -0
- package/HR-Resource/specialized-corporate-training-designer/SKILL.md +209 -0
- package/HR-Resource/specialized-customer-service/SKILL.md +415 -0
- package/HR-Resource/specialized-data-consolidation-agent/SKILL.md +77 -0
- package/HR-Resource/specialized-government-digital-presales-consultant/SKILL.md +380 -0
- package/HR-Resource/specialized-healthcare-customer-service/SKILL.md +406 -0
- package/HR-Resource/specialized-healthcare-marketing-compliance/SKILL.md +412 -0
- package/HR-Resource/specialized-hospitality-guest-services/SKILL.md +620 -0
- package/HR-Resource/specialized-hr-onboarding/SKILL.md +468 -0
- package/HR-Resource/specialized-identity-graph-operator/SKILL.md +277 -0
- package/HR-Resource/specialized-language-translator/SKILL.md +281 -0
- package/HR-Resource/specialized-legal-billing-time-tracking/SKILL.md +586 -0
- package/HR-Resource/specialized-legal-client-intake/SKILL.md +509 -0
- package/HR-Resource/specialized-legal-document-review/SKILL.md +471 -0
- package/HR-Resource/specialized-loan-officer-assistant/SKILL.md +572 -0
- package/HR-Resource/specialized-lsp-index-engineer/SKILL.md +331 -0
- package/HR-Resource/specialized-real-estate-buyer-seller/SKILL.md +613 -0
- package/HR-Resource/specialized-recruitment-specialist/SKILL.md +526 -0
- package/HR-Resource/specialized-report-distribution-agent/SKILL.md +82 -0
- package/HR-Resource/specialized-retail-customer-returns/SKILL.md +583 -0
- package/HR-Resource/specialized-sales-data-extraction-agent/SKILL.md +84 -0
- package/HR-Resource/specialized-sales-outreach/SKILL.md +442 -0
- package/HR-Resource/specialized-specialized-chief-of-staff/SKILL.md +296 -0
- package/HR-Resource/specialized-specialized-civil-engineer/SKILL.md +373 -0
- package/HR-Resource/specialized-specialized-cultural-intelligence-strategist/SKILL.md +105 -0
- package/HR-Resource/specialized-specialized-developer-advocate/SKILL.md +334 -0
- package/HR-Resource/specialized-specialized-document-generator/SKILL.md +72 -0
- package/HR-Resource/specialized-specialized-french-consulting-market/SKILL.md +209 -0
- package/HR-Resource/specialized-specialized-korean-business-navigator/SKILL.md +233 -0
- package/HR-Resource/specialized-specialized-mcp-builder/SKILL.md +265 -0
- package/HR-Resource/specialized-specialized-model-qa/SKILL.md +505 -0
- package/HR-Resource/specialized-specialized-salesforce-architect/SKILL.md +197 -0
- package/HR-Resource/specialized-specialized-workflow-architect/SKILL.md +614 -0
- package/HR-Resource/specialized-study-abroad-advisor/SKILL.md +299 -0
- package/HR-Resource/specialized-supply-chain-strategist/SKILL.md +599 -0
- package/HR-Resource/specialized-zk-steward/SKILL.md +228 -0
- package/HR-Resource/support-support-analytics-reporter/SKILL.md +382 -0
- package/HR-Resource/support-support-executive-summary-generator/SKILL.md +229 -0
- package/HR-Resource/support-support-finance-tracker/SKILL.md +459 -0
- package/HR-Resource/support-support-infrastructure-maintainer/SKILL.md +635 -0
- package/HR-Resource/support-support-legal-compliance-checker/SKILL.md +605 -0
- package/HR-Resource/support-support-support-responder/SKILL.md +602 -0
- package/HR-Resource/testing-testing-accessibility-auditor/SKILL.md +333 -0
- package/HR-Resource/testing-testing-api-tester/SKILL.md +323 -0
- package/HR-Resource/testing-testing-evidence-collector/SKILL.md +227 -0
- package/HR-Resource/testing-testing-performance-benchmarker/SKILL.md +285 -0
- package/HR-Resource/testing-testing-reality-checker/SKILL.md +253 -0
- package/HR-Resource/testing-testing-test-results-analyzer/SKILL.md +322 -0
- package/HR-Resource/testing-testing-tool-evaluator/SKILL.md +411 -0
- package/HR-Resource/testing-testing-workflow-optimizer/SKILL.md +467 -0
- package/assets/launchd/com.walwal.harness-wake.plist.template +1 -1
- package/assets/templates/company-pipeline-manifest.json +71 -0
- package/assets/templates/config.json +40 -2
- package/bin/init.js +208 -109
- package/commands/goal.md +25 -0
- package/commands/hot-fix.md +25 -0
- package/commands/play-harness.md +22 -0
- package/commands/release-harness.md +22 -0
- package/commands/stop-harness.md +21 -0
- package/conventions/README.md +14 -88
- package/conventions/brick-office.md +5 -0
- package/conventions/cdo.md +6 -0
- package/conventions/ceo.md +9 -0
- package/conventions/coo.md +6 -0
- package/conventions/cqo.md +6 -23
- package/conventions/cto.md +5 -23
- package/conventions/hiring.md +7 -0
- package/conventions/ops.md +9 -0
- package/conventions/resource-manager.md +6 -0
- package/conventions/shared.md +29 -40
- package/gotchas/README.md +14 -82
- package/gotchas/brick-office.md +9 -0
- package/gotchas/cdo.md +9 -0
- package/gotchas/ceo.md +9 -0
- package/gotchas/coo.md +9 -0
- package/gotchas/cqo.md +6 -19
- package/gotchas/cto.md +6 -19
- package/gotchas/hiring.md +9 -0
- package/gotchas/ops.md +17 -0
- package/gotchas/resource-manager.md +9 -0
- package/gotchas/shared.md +13 -0
- package/package.json +11 -17
- package/scripts/conductor-tick.sh +97 -4
- package/scripts/harness-hourly-review.sh +284 -5
- package/scripts/harness-parity-audit.sh +101 -0
- package/scripts/harness-queue-manager.sh +1 -1
- package/scripts/harness-runtime-stop.sh +58 -0
- package/scripts/harness-service-ops-monitor.sh +207 -18
- package/scripts/harness-stop.sh +18 -0
- package/scripts/harness-wake-install.sh +1 -0
- package/scripts/harness-wake.sh +100 -8
- package/scripts/harness-worker-dispatch.sh +52 -21
- package/scripts/harness-worker-evidence-validate.sh +59 -0
- package/scripts/import-agency-agents.js +102 -0
- package/scripts/lib/harness-agent-resolver.sh +127 -0
- package/scripts/play.sh +104 -0
- package/scripts/release.sh +89 -0
- package/conventions/conductor.md +0 -24
- package/conventions/coo-developer.md +0 -24
- package/conventions/dispatcher.md +0 -24
- package/conventions/documentationer.md +0 -24
- package/conventions/evaluator-architecture.md +0 -24
- package/conventions/evaluator-code-quality.md +0 -24
- package/conventions/evaluator-functional.md +0 -24
- package/conventions/evaluator-security.md +0 -24
- package/conventions/evaluator-visual.md +0 -24
- package/conventions/generator-backend.md +0 -24
- package/conventions/generator-designer.md +0 -24
- package/conventions/generator-devops.md +0 -24
- package/conventions/generator-frontend.md +0 -24
- package/conventions/meeting-manager.md +0 -24
- package/conventions/planner.md +0 -24
- package/conventions/service-ops.md +0 -24
- package/gotchas/conductor.md +0 -38
- package/gotchas/coo-developer.md +0 -22
- package/gotchas/dispatcher.md +0 -38
- package/gotchas/documentationer.md +0 -22
- package/gotchas/evaluator-architecture.md +0 -22
- package/gotchas/evaluator-code-quality.md +0 -22
- package/gotchas/evaluator-functional.md +0 -22
- package/gotchas/evaluator-security.md +0 -22
- package/gotchas/evaluator-visual.md +0 -22
- package/gotchas/generator-backend-laravel.md +0 -19
- package/gotchas/generator-backend.md +0 -22
- package/gotchas/generator-designer.md +0 -22
- package/gotchas/generator-devops.md +0 -22
- package/gotchas/generator-frontend.md +0 -22
- package/gotchas/meeting-manager.md +0 -30
- package/gotchas/planner.md +0 -22
- package/gotchas/service-ops.md +0 -30
- package/skills/_shared/dynamic-registration.md +0 -120
- package/skills/brainstorming/SKILL.md +0 -220
- package/skills/brainstorming/references/attribution.md +0 -109
- package/skills/brainstorming/references/spec-document-reviewer-prompt.md +0 -49
- package/skills/brainstorming/references/visual-companion.md +0 -287
- package/skills/brainstorming/scripts/frame-template.html +0 -214
- package/skills/brainstorming/scripts/helper.js +0 -88
- package/skills/brainstorming/scripts/server.cjs +0 -354
- package/skills/brainstorming/scripts/start-server.sh +0 -148
- package/skills/brainstorming/scripts/stop-server.sh +0 -56
- package/skills/conductor/SKILL.md +0 -336
- package/skills/coo-developer/SKILL.md +0 -72
- package/skills/cqo/SKILL.md +0 -146
- package/skills/cto/SKILL.md +0 -141
- package/skills/dispatcher/SKILL.md +0 -298
- package/skills/dispatcher/persona-ceo.md +0 -169
- package/skills/dispatcher/references/convention-flow.md +0 -111
- package/skills/dispatcher/references/gotcha-flow.md +0 -79
- package/skills/dispatcher/references/initialization.md +0 -53
- package/skills/dispatcher/references/pipeline-definitions.md +0 -151
- package/skills/documentationer/SKILL.md +0 -92
- package/skills/evaluator-architecture/SKILL.md +0 -173
- package/skills/evaluator-code-quality/SKILL.md +0 -218
- package/skills/evaluator-code-quality/references/scoring-rubric.md +0 -104
- package/skills/evaluator-functional/SKILL.md +0 -271
- package/skills/evaluator-functional/references/ia-compliance.md +0 -37
- package/skills/evaluator-functional/references/playwright-tools.md +0 -43
- package/skills/evaluator-functional/references/scoring-rubric.md +0 -52
- package/skills/evaluator-security/SKILL.md +0 -172
- package/skills/evaluator-visual/SKILL.md +0 -165
- package/skills/evaluator-visual/references/responsive-checklist.md +0 -44
- package/skills/evaluator-visual/references/scoring-rubric.md +0 -59
- package/skills/generator-backend/SKILL.md +0 -153
- package/skills/generator-backend/references/nestjs-msa-patterns.md +0 -69
- package/skills/generator-backend/references/sprint-contract-be.md +0 -32
- package/skills/generator-designer/SKILL.md +0 -219
- package/skills/generator-devops/SKILL.md +0 -201
- package/skills/generator-frontend/SKILL.md +0 -155
- package/skills/generator-frontend/references/_web-react-legacy/ai-forbidden-patterns.md +0 -89
- package/skills/generator-frontend/references/_web-react-legacy/component-patterns.md +0 -52
- package/skills/generator-frontend/references/_web-react-legacy/design-system-rules.md +0 -139
- package/skills/generator-frontend/references/_web-react-legacy/vercel-best-practices.md +0 -54
- package/skills/meeting-manager/SKILL.md +0 -419
- package/skills/planner/SKILL.md +0 -243
- package/skills/planner/hr-onboard.md +0 -134
- package/skills/planner/hr-recruit.md +0 -99
- package/skills/planner/persona-coo-hr.md +0 -182
- package/skills/planner/references/api-contract-schema.md +0 -34
- package/skills/planner/references/fe-stack-detection.md +0 -164
- package/skills/planner/references/ia-map-guide.md +0 -31
- package/skills/planner/references/plan-template.md +0 -51
- 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(
|
|
118
|
-
if (/\b(
|
|
119
|
-
if (/\b(
|
|
120
|
-
if (/\b(
|
|
121
|
-
if (/\b(
|
|
122
|
-
if (/\b(
|
|
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', `${
|
|
279
|
+
const target = path.join(HARNESS_DIR, 'gotchas', `${scope}.md`);
|
|
194
280
|
appendEntry(target, id, 'gotcha', sec.title, body, sourceRef);
|
|
195
|
-
extractedGotcha.byAgent[
|
|
196
|
-
report.push(`[${id}] "${sec.title}" → gotchas/${
|
|
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
|
|
453
|
-
|
|
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
|
-
|
|
459
|
-
|
|
460
|
-
const existing = fs.readdirSync(
|
|
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(
|
|
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
|
|
470
|
-
|
|
471
|
-
|
|
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
|
-
|
|
474
|
-
|
|
475
|
-
const
|
|
476
|
-
|
|
477
|
-
|
|
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
|
|
532
|
-
ensureDir
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
740
|
+
writeClaudeSettings(settings);
|
|
612
741
|
log('SessionStart hook installed in .claude/settings.json');
|
|
613
742
|
} else if (migrated) {
|
|
614
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
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
|
-
|
|
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
|
-
|
|
808
|
-
|
|
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
|
|
961
|
-
npx walwal-harness --force
|
|
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/
|
|
975
|
-
2. Installs
|
|
976
|
-
3.
|
|
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
|
|
983
|
-
2.
|
|
984
|
-
3.
|
|
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
|
|
1560
|
-
log(' 2.
|
|
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
|
}
|
package/commands/goal.md
ADDED
|
@@ -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
|
+
```
|