@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/scripts/harness-wake.sh
CHANGED
|
@@ -11,6 +11,8 @@
|
|
|
11
11
|
|
|
12
12
|
set -uo pipefail
|
|
13
13
|
|
|
14
|
+
export PATH="$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:${PATH:-}"
|
|
15
|
+
|
|
14
16
|
LOG_DIR="${HOME}/.walwal-harness/logs"
|
|
15
17
|
mkdir -p "$LOG_DIR"
|
|
16
18
|
LOG="$LOG_DIR/wake.log"
|
|
@@ -57,14 +59,81 @@ find_tmux_session() {
|
|
|
57
59
|
return 1
|
|
58
60
|
}
|
|
59
61
|
|
|
62
|
+
resolve_agent_bin() {
|
|
63
|
+
local executor="$1"
|
|
64
|
+
local env_name cand
|
|
65
|
+
|
|
66
|
+
case "$executor" in
|
|
67
|
+
codex)
|
|
68
|
+
env_name="${HARNESS_CODEX_BIN:-${CODEX_BIN:-}}"
|
|
69
|
+
;;
|
|
70
|
+
claude|*)
|
|
71
|
+
env_name="${HARNESS_CLAUDE_BIN:-${CLAUDE_BIN:-}}"
|
|
72
|
+
executor="claude"
|
|
73
|
+
;;
|
|
74
|
+
esac
|
|
75
|
+
|
|
76
|
+
for cand in "$env_name" "$HOME/.local/bin/$executor" "/opt/homebrew/bin/$executor" "/usr/local/bin/$executor"; do
|
|
77
|
+
[ -n "$cand" ] && [ -x "$cand" ] && { echo "$cand"; return 0; }
|
|
78
|
+
done
|
|
79
|
+
|
|
80
|
+
command -v "$executor" 2>/dev/null && return 0
|
|
81
|
+
return 1
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
run_conductor_fallback() {
|
|
85
|
+
local project_root="$1"
|
|
86
|
+
local reason="$2"
|
|
87
|
+
local tick="$project_root/scripts/conductor-tick.sh"
|
|
88
|
+
local progress="$project_root/.harness/progress.json"
|
|
89
|
+
local progress_set="$project_root/scripts/harness-progress-set.sh"
|
|
90
|
+
local before after status
|
|
91
|
+
|
|
92
|
+
[ "${HARNESS_WAKE_CONDUCTOR_FALLBACK:-1}" = "1" ] || return 0
|
|
93
|
+
[ -x "$tick" ] || return 0
|
|
94
|
+
[ -f "$progress" ] || return 0
|
|
95
|
+
command -v jq >/dev/null 2>&1 || return 0
|
|
96
|
+
|
|
97
|
+
before="$(jq -c '{current_agent,next_agent,agent_status,conductor:(.conductor.state // null),decision:(.meetings.decision // {})}' "$progress" 2>/dev/null || echo '{}')"
|
|
98
|
+
|
|
99
|
+
if [ -x "$progress_set" ] &&
|
|
100
|
+
jq -e '
|
|
101
|
+
(.meetings.decision.owner // "") != "" and
|
|
102
|
+
((((.meetings.active // []) | length) > 0) or ((.meetings.decision.required_execution // null) != null))
|
|
103
|
+
' "$progress" >/dev/null 2>&1 && {
|
|
104
|
+
[ "$(jq -r '.current_agent // ""' "$progress")" != "meeting-manager" ] ||
|
|
105
|
+
[ "$(jq -r '.agent_status // ""' "$progress")" != "completed" ];
|
|
106
|
+
}; then
|
|
107
|
+
bash "$progress_set" "$project_root" '
|
|
108
|
+
.current_agent = "meeting-manager" |
|
|
109
|
+
.agent_status = "completed" |
|
|
110
|
+
.conductor.state = "running" |
|
|
111
|
+
.conductor.current_action = "wake-meeting-decision-ready" |
|
|
112
|
+
.workflow.last_transition = (now | todate) |
|
|
113
|
+
.workflow.last_reason = "wake-meeting-decision-ready"
|
|
114
|
+
' >/dev/null 2>&1 || true
|
|
115
|
+
fi
|
|
116
|
+
|
|
117
|
+
if bash "$tick" "$project_root" >/dev/null 2>&1; then
|
|
118
|
+
status="ok"
|
|
119
|
+
else
|
|
120
|
+
status="failed"
|
|
121
|
+
fi
|
|
122
|
+
|
|
123
|
+
after="$(jq -c '{current_agent,next_agent,agent_status,conductor:(.conductor.state // null),last_action:(.conductor.current_action // null)}' "$progress" 2>/dev/null || echo '{}')"
|
|
124
|
+
echo "$(date -u "+%Y-%m-%dT%H:%M:%SZ") | wake | conductor-fallback | $status | reason=$reason | before=$before | after=$after" >> "$project_root/.harness/progress.log"
|
|
125
|
+
say "conductor-fallback: $project_root ($status, reason=$reason)"
|
|
126
|
+
}
|
|
127
|
+
|
|
60
128
|
start_headless_tick() {
|
|
61
129
|
local project_root="$1"
|
|
62
130
|
local idle="$2"
|
|
63
131
|
local force="$3"
|
|
64
132
|
local review_path="$4"
|
|
65
|
-
local mode stamp wake_dir ops_dir prompt_rel log_rel prompt_path log_path pid_file old_pid pid status tmux_session
|
|
133
|
+
local mode executor agent_bin stamp wake_dir ops_dir prompt_rel log_rel prompt_path log_path pid_file old_pid pid status tmux_session session_name session_safe
|
|
66
134
|
|
|
67
135
|
mode="${HARNESS_WAKE_MODE:-headless}"
|
|
136
|
+
executor="${HARNESS_WAKE_EXECUTOR:-claude}"
|
|
68
137
|
stamp="$(date -u "+%Y%m%dT%H%M%SZ")"
|
|
69
138
|
wake_dir="$project_root/.harness/actions/wake"
|
|
70
139
|
ops_dir="$project_root/.harness/ops/wake"
|
|
@@ -105,7 +174,8 @@ Tasks:
|
|
|
105
174
|
3. Treat the hourly review as Executive Meeting Minutes. Verify it contains CEO/COO/CTO/CQO/Service-Ops role positions, discussion, decision JSON, and action items.
|
|
106
175
|
4. Check conductor state against the current GOAL and route the next department without waiting for Owner.
|
|
107
176
|
5. If there is an active incident or operational warning, make sure meeting-manager has shared context and an action decision that names CTO/CQO/Service-Ops responsibilities.
|
|
108
|
-
6.
|
|
177
|
+
6. Split meaningful progress from paperwork-only artifacts in your summary.
|
|
178
|
+
7. Append a short factual summary to .harness/progress.log and any normal harness artifacts used by this project.
|
|
109
179
|
EOF
|
|
110
180
|
|
|
111
181
|
case "$mode" in
|
|
@@ -113,16 +183,36 @@ EOF
|
|
|
113
183
|
status="recorded"
|
|
114
184
|
;;
|
|
115
185
|
headless|"")
|
|
116
|
-
if
|
|
186
|
+
if agent_bin="$(resolve_agent_bin "$executor")"; then
|
|
117
187
|
(
|
|
118
188
|
cd "$project_root" || exit 1
|
|
119
|
-
|
|
189
|
+
if [ "$executor" = "codex" ]; then
|
|
190
|
+
"$agent_bin" exec -C "$project_root" "$(cat "$prompt_path")" > "$log_path" 2>&1
|
|
191
|
+
else
|
|
192
|
+
"$agent_bin" -p "$(cat "$prompt_path")" > "$log_path" 2>&1
|
|
193
|
+
fi
|
|
120
194
|
) &
|
|
121
195
|
pid=$!
|
|
122
196
|
echo "$pid" > "$pid_file"
|
|
123
|
-
status="spawned pid=$pid"
|
|
197
|
+
status="spawned executor=$executor pid=$pid"
|
|
124
198
|
else
|
|
125
|
-
status="
|
|
199
|
+
status="BLOCKED_RUNTIME ${executor}-not-found"
|
|
200
|
+
fi
|
|
201
|
+
;;
|
|
202
|
+
tmux)
|
|
203
|
+
if ! command -v tmux >/dev/null 2>&1; then
|
|
204
|
+
status="BLOCKED_RUNTIME tmux-not-found"
|
|
205
|
+
elif agent_bin="$(resolve_agent_bin "$executor")"; then
|
|
206
|
+
session_safe="$(basename "$project_root" | tr -c '[:alnum:]_' '_')"
|
|
207
|
+
session_name="walwal_${session_safe}_${stamp}"
|
|
208
|
+
if [ "$executor" = "codex" ]; then
|
|
209
|
+
tmux new-session -d -s "$session_name" "cd '$project_root' && '$agent_bin' exec -C '$project_root' - < '$prompt_path' 2>&1 | tee '$log_path'"
|
|
210
|
+
else
|
|
211
|
+
tmux new-session -d -s "$session_name" "cd '$project_root' && '$agent_bin' -p \"\$(cat '$prompt_path')\" 2>&1 | tee '$log_path'"
|
|
212
|
+
fi
|
|
213
|
+
status="spawned-tmux executor=$executor session=$session_name"
|
|
214
|
+
else
|
|
215
|
+
status="BLOCKED_RUNTIME ${executor}-not-found"
|
|
126
216
|
fi
|
|
127
217
|
;;
|
|
128
218
|
*)
|
|
@@ -130,8 +220,10 @@ EOF
|
|
|
130
220
|
;;
|
|
131
221
|
esac
|
|
132
222
|
|
|
133
|
-
echo "$(date -u "+%Y-%m-%dT%H:%M:%SZ") | wake |
|
|
134
|
-
say "wake-
|
|
223
|
+
echo "$(date -u "+%Y-%m-%dT%H:%M:%SZ") | wake | agent-tick | $status | idle=${idle}s | force=${force} | mode=${mode} | prompt=$prompt_rel | log=$log_rel" >> "$project_root/.harness/progress.log"
|
|
224
|
+
say "wake-agent: $project_root (idle ${idle}s, force=${force}, mode=${mode}, executor=${executor}) → $status $log_rel"
|
|
225
|
+
|
|
226
|
+
run_conductor_fallback "$project_root" "$status"
|
|
135
227
|
|
|
136
228
|
if tmux_session="$(find_tmux_session "$project_root" 2>/dev/null)"; then
|
|
137
229
|
tmux display-message -t "$tmux_session" "walwal wake headless tick: $status ($log_rel)" 2>/dev/null || true
|
|
@@ -11,6 +11,7 @@ set -uo pipefail
|
|
|
11
11
|
|
|
12
12
|
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
13
13
|
source "$SCRIPT_DIR/lib/harness-render-progress.sh"
|
|
14
|
+
source "$SCRIPT_DIR/lib/harness-agent-resolver.sh"
|
|
14
15
|
|
|
15
16
|
PROJECT_ROOT="$(resolve_harness_root "${1:-.}")" || exit 0
|
|
16
17
|
PROGRESS="$PROJECT_ROOT/.harness/progress.json"
|
|
@@ -19,6 +20,8 @@ FEATURES="$PROJECT_ROOT/.harness/actions/feature-list.json"
|
|
|
19
20
|
QUEUE="$PROJECT_ROOT/.harness/actions/feature-queue.json"
|
|
20
21
|
WORKER_DIR="$PROJECT_ROOT/.harness/actions/workers"
|
|
21
22
|
LOG_DIR="$PROJECT_ROOT/.harness/ops/workers"
|
|
23
|
+
DISPATCH_LOCK="$PROJECT_ROOT/.harness/.worker-dispatch-lock"
|
|
24
|
+
DISPATCH_LOCK_STALE_SEC="${DISPATCH_LOCK_STALE_SEC:-900}"
|
|
22
25
|
|
|
23
26
|
[ -f "$PROGRESS" ] || exit 0
|
|
24
27
|
[ -f "$CONFIG" ] || exit 0
|
|
@@ -28,27 +31,41 @@ command -v jq >/dev/null 2>&1 || exit 0
|
|
|
28
31
|
|
|
29
32
|
mkdir -p "$WORKER_DIR" "$LOG_DIR"
|
|
30
33
|
|
|
34
|
+
acquire_dispatch_lock() {
|
|
35
|
+
if mkdir "$DISPATCH_LOCK" 2>/dev/null; then
|
|
36
|
+
printf '%s\n' "$$" > "$DISPATCH_LOCK/pid"
|
|
37
|
+
printf '%s\n' "$(date +%s)" > "$DISPATCH_LOCK/created_at"
|
|
38
|
+
trap 'rm -rf "$DISPATCH_LOCK" 2>/dev/null || true' EXIT INT TERM
|
|
39
|
+
return 0
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
local now created age holder
|
|
43
|
+
now="$(date +%s)"
|
|
44
|
+
created="$(cat "$DISPATCH_LOCK/created_at" 2>/dev/null || echo "$now")"
|
|
45
|
+
holder="$(cat "$DISPATCH_LOCK/pid" 2>/dev/null || echo unknown)"
|
|
46
|
+
age=$((now - created))
|
|
47
|
+
if [ "$age" -ge "$DISPATCH_LOCK_STALE_SEC" ]; then
|
|
48
|
+
rm -rf "$DISPATCH_LOCK" 2>/dev/null || true
|
|
49
|
+
if mkdir "$DISPATCH_LOCK" 2>/dev/null; then
|
|
50
|
+
printf '%s\n' "$$" > "$DISPATCH_LOCK/pid"
|
|
51
|
+
printf '%s\n' "$now" > "$DISPATCH_LOCK/created_at"
|
|
52
|
+
trap 'rm -rf "$DISPATCH_LOCK" 2>/dev/null || true' EXIT INT TERM
|
|
53
|
+
return 0
|
|
54
|
+
fi
|
|
55
|
+
fi
|
|
56
|
+
|
|
57
|
+
echo "$(date -u +%Y-%m-%dT%H:%M:%SZ) | conductor | worker-dispatch | skipped-locked | holder=${holder} age=${age}s" >> "$PROJECT_ROOT/.harness/progress.log"
|
|
58
|
+
echo "[]"
|
|
59
|
+
exit 0
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
acquire_dispatch_lock
|
|
63
|
+
|
|
31
64
|
spawn_mode="$(jq -r '.company_mode.worker_spawn // "claude"' "$CONFIG" 2>/dev/null || echo claude)"
|
|
32
65
|
pipeline="$(jq -r '.pipeline // "FULLSTACK"' "$PROGRESS" 2>/dev/null || echo FULLSTACK)"
|
|
33
66
|
ts="$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
34
67
|
stamp="$(date -u +%Y%m%dT%H%M%SZ)"
|
|
35
68
|
|
|
36
|
-
agent_for_feature() {
|
|
37
|
-
local fid="$1"
|
|
38
|
-
local layer service title
|
|
39
|
-
layer="$(jq -r --arg id "$fid" '.features[]? | select(.id == $id) | (.layer // .type // "")' "$FEATURES" 2>/dev/null | head -1)"
|
|
40
|
-
service="$(jq -r --arg id "$fid" '.features[]? | select(.id == $id) | (.service // "")' "$FEATURES" 2>/dev/null | head -1)"
|
|
41
|
-
title="$(jq -r --arg id "$fid" '.features[]? | select(.id == $id) | (.title // .name // .description // "")' "$FEATURES" 2>/dev/null | head -1)"
|
|
42
|
-
case "$(printf '%s %s %s' "$layer" "$service" "$title" | tr '[:upper:]' '[:lower:]')" in
|
|
43
|
-
*frontend*|*ui*|*web*|*react*|*next*) echo "generator-frontend" ;;
|
|
44
|
-
*design*|*token*|*component-spec*) echo "generator-designer" ;;
|
|
45
|
-
*devops*|*infra*|*deploy*|*ci*) echo "generator-devops" ;;
|
|
46
|
-
*)
|
|
47
|
-
if [ "$pipeline" = "FE-ONLY" ]; then echo "generator-frontend"; else echo "generator-backend"; fi
|
|
48
|
-
;;
|
|
49
|
-
esac
|
|
50
|
-
}
|
|
51
|
-
|
|
52
69
|
build_prompt() {
|
|
53
70
|
local team="$1" fid="$2" agent="$3" prompt_path="$4" log_path="$5"
|
|
54
71
|
cat > "$prompt_path" <<EOF
|
|
@@ -103,12 +120,24 @@ i=0
|
|
|
103
120
|
while [ "$i" -lt "$count" ]; do
|
|
104
121
|
team="$(jq -r ".[$i].team" <<<"$pairs")"
|
|
105
122
|
fid="$(jq -r ".[$i].feature" <<<"$pairs")"
|
|
106
|
-
|
|
123
|
+
phase="$(jq -r --arg fid "$fid" '.queue.in_progress[$fid].phase // "gen"' "$QUEUE" 2>/dev/null || echo gen)"
|
|
124
|
+
agent="$(resolve_feature_agent "$PROJECT_ROOT" "$fid" "$phase" "$pipeline" 2>/dev/null || true)"
|
|
107
125
|
prompt_rel=".harness/actions/workers/T${team}-${fid}-${stamp}.prompt.md"
|
|
108
126
|
log_rel=".harness/ops/workers/T${team}-${fid}-${stamp}.log"
|
|
109
127
|
prompt_path="$PROJECT_ROOT/$prompt_rel"
|
|
110
128
|
log_path="$PROJECT_ROOT/$log_rel"
|
|
111
129
|
|
|
130
|
+
if [ -z "$agent" ]; then
|
|
131
|
+
reason="agent_resolution_failed phase=${phase}"
|
|
132
|
+
bash "$SCRIPT_DIR/harness-queue-manager.sh" fail "$fid" "$PROJECT_ROOT" >/dev/null 2>&1 || true
|
|
133
|
+
printf '%s\n' "$reason" > "$log_path"
|
|
134
|
+
jq -n --argjson team "$team" --arg feature "$fid" --arg phase "$phase" --arg status "blocked" --arg reason "$reason" \
|
|
135
|
+
'{team:$team, feature:$feature, phase:$phase, agent:null, prompt:null, log:null, status:$status, reason:$reason, pid:null}' >> "$dispatches_file"
|
|
136
|
+
echo "$ts | conductor | worker-dispatch | blocked | T${team}/${fid} | ${reason}" >> "$PROJECT_ROOT/.harness/progress.log"
|
|
137
|
+
i=$((i + 1))
|
|
138
|
+
continue
|
|
139
|
+
fi
|
|
140
|
+
|
|
112
141
|
build_prompt "$team" "$fid" "$agent" "$prompt_path" "$log_path"
|
|
113
142
|
|
|
114
143
|
pid="null"
|
|
@@ -123,22 +152,24 @@ while [ "$i" -lt "$count" ]; do
|
|
|
123
152
|
fi
|
|
124
153
|
|
|
125
154
|
tmpq="${QUEUE}.tmp.$$.$i"
|
|
126
|
-
jq --arg tid "$team" --arg agent "$agent" --arg prompt "$prompt_rel" --arg log "$log_rel" --arg status "$status" --argjson pid "$pid" --arg ts "$ts" '
|
|
155
|
+
jq --arg tid "$team" --arg agent "$agent" --arg phase "$phase" --arg prompt "$prompt_rel" --arg log "$log_rel" --arg status "$status" --argjson pid "$pid" --arg ts "$ts" '
|
|
127
156
|
.teams[$tid].pid = $pid |
|
|
128
157
|
.teams[$tid].agent = $agent |
|
|
158
|
+
.teams[$tid].phase = $phase |
|
|
129
159
|
.teams[$tid].prompt = $prompt |
|
|
130
160
|
.teams[$tid].log = $log |
|
|
131
161
|
.teams[$tid].spawn_status = $status |
|
|
132
162
|
.teams[$tid].started_at = $ts |
|
|
133
163
|
.queue.in_progress[.teams[$tid].feature].agent = $agent |
|
|
164
|
+
.queue.in_progress[.teams[$tid].feature].phase = $phase |
|
|
134
165
|
.queue.in_progress[.teams[$tid].feature].prompt = $prompt |
|
|
135
166
|
.queue.in_progress[.teams[$tid].feature].log = $log |
|
|
136
167
|
.queue.in_progress[.teams[$tid].feature].pid = $pid
|
|
137
168
|
' "$QUEUE" > "$tmpq" && mv "$tmpq" "$QUEUE"
|
|
138
169
|
|
|
139
|
-
jq -n --argjson team "$team" --arg feature "$fid" --arg agent "$agent" --arg prompt "$prompt_rel" --arg log "$log_rel" --arg status "$status" --argjson pid "$pid" \
|
|
140
|
-
'{team:$team, feature:$feature, agent:$agent, prompt:$prompt, log:$log, status:$status, pid:$pid}' >> "$dispatches_file"
|
|
141
|
-
echo "$ts | conductor | worker-dispatch | $status | T${team}/${fid} | $agent pid=$pid" >> "$PROJECT_ROOT/.harness/progress.log"
|
|
170
|
+
jq -n --argjson team "$team" --arg feature "$fid" --arg agent "$agent" --arg phase "$phase" --arg prompt "$prompt_rel" --arg log "$log_rel" --arg status "$status" --argjson pid "$pid" \
|
|
171
|
+
'{team:$team, feature:$feature, agent:$agent, phase:$phase, prompt:$prompt, log:$log, status:$status, pid:$pid}' >> "$dispatches_file"
|
|
172
|
+
echo "$ts | conductor | worker-dispatch | $status | T${team}/${fid} | $agent phase=$phase pid=$pid" >> "$PROJECT_ROOT/.harness/progress.log"
|
|
142
173
|
i=$((i + 1))
|
|
143
174
|
done
|
|
144
175
|
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# harness-worker-evidence-validate.sh — block CXX direct execution without worker reports
|
|
3
|
+
set -euo pipefail
|
|
4
|
+
|
|
5
|
+
PROJECT_ROOT="${1:-.}"
|
|
6
|
+
DOC_ROOT="$PROJECT_ROOT/.harness/documents"
|
|
7
|
+
|
|
8
|
+
[ -d "$DOC_ROOT" ] || exit 0
|
|
9
|
+
|
|
10
|
+
mode="${2:-text}"
|
|
11
|
+
violations=()
|
|
12
|
+
|
|
13
|
+
has_worker_report() {
|
|
14
|
+
local mission_dir="$1"
|
|
15
|
+
find "$mission_dir/workers" -maxdepth 1 -type f -name '*.md' 2>/dev/null | grep -q .
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
for mission_dir in "$DOC_ROOT"/*; do
|
|
19
|
+
[ -d "$mission_dir" ] || continue
|
|
20
|
+
mission_name="$(basename "$mission_dir")"
|
|
21
|
+
|
|
22
|
+
cxx_docs=()
|
|
23
|
+
for cxx in coo cdo cto cqo ops; do
|
|
24
|
+
cxx_path="$mission_dir/$cxx.md"
|
|
25
|
+
[ -s "$cxx_path" ] || continue
|
|
26
|
+
cxx_docs+=("$cxx.md")
|
|
27
|
+
done
|
|
28
|
+
|
|
29
|
+
[ "${#cxx_docs[@]}" -gt 0 ] || continue
|
|
30
|
+
if ! has_worker_report "$mission_dir"; then
|
|
31
|
+
violations+=("$mission_name:${cxx_docs[*]}")
|
|
32
|
+
fi
|
|
33
|
+
done
|
|
34
|
+
|
|
35
|
+
if [ "${#violations[@]}" -eq 0 ]; then
|
|
36
|
+
if [ "$mode" = "json" ]; then
|
|
37
|
+
jq -nc '{ok:true, violations:[]}'
|
|
38
|
+
fi
|
|
39
|
+
exit 0
|
|
40
|
+
fi
|
|
41
|
+
|
|
42
|
+
if [ "$mode" = "json" ]; then
|
|
43
|
+
printf '%s\n' "${violations[@]}" | jq -Rcs '
|
|
44
|
+
split("\n")[:-1]
|
|
45
|
+
| map(capture("(?<mission>[^:]+):(?<docs>.*)") | .docs = (.docs | split(" ")))
|
|
46
|
+
| {ok:false, violations:.}
|
|
47
|
+
'
|
|
48
|
+
else
|
|
49
|
+
echo "CXX worker evidence violation:"
|
|
50
|
+
for violation in "${violations[@]}"; do
|
|
51
|
+
mission="${violation%%:*}"
|
|
52
|
+
docs="${violation#*:}"
|
|
53
|
+
echo "- mission: $mission"
|
|
54
|
+
echo " cxx_docs: $docs"
|
|
55
|
+
echo " required: at least one .harness/documents/$mission/workers/{worker-name}.md report"
|
|
56
|
+
done
|
|
57
|
+
fi
|
|
58
|
+
|
|
59
|
+
exit 1
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
const fs = require('fs');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
|
|
6
|
+
const sourceRoot = process.argv[2] || '/Users/ted/Downloads/agency-agents-main';
|
|
7
|
+
const targetRoot = process.argv[3] || path.resolve(process.cwd(), 'HR-Resource');
|
|
8
|
+
|
|
9
|
+
function walk(dir, out = []) {
|
|
10
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
11
|
+
const full = path.join(dir, entry.name);
|
|
12
|
+
if (entry.isDirectory()) walk(full, out);
|
|
13
|
+
else if (entry.isFile() && entry.name.endsWith('.md')) out.push(full);
|
|
14
|
+
}
|
|
15
|
+
return out;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function slugify(value) {
|
|
19
|
+
return value
|
|
20
|
+
.toLowerCase()
|
|
21
|
+
.replace(/[^a-z0-9]+/g, '-')
|
|
22
|
+
.replace(/^-+|-+$/g, '');
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function parseFrontmatter(content) {
|
|
26
|
+
const match = /^---\n([\s\S]*?)\n---\n?/.exec(content);
|
|
27
|
+
if (!match) return null;
|
|
28
|
+
const frontmatter = match[1];
|
|
29
|
+
const fields = {};
|
|
30
|
+
for (const line of frontmatter.split('\n')) {
|
|
31
|
+
const m = /^([A-Za-z0-9_-]+):\s*(.*)$/.exec(line);
|
|
32
|
+
if (m) fields[m[1]] = m[2].replace(/^["']|["']$/g, '');
|
|
33
|
+
}
|
|
34
|
+
return { frontmatter, fields, body: content.slice(match[0].length) };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function hasAgentShape(parsed) {
|
|
38
|
+
return Boolean(parsed && parsed.fields.name && parsed.fields.description);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
function convertFile(file) {
|
|
42
|
+
const content = fs.readFileSync(file, 'utf8');
|
|
43
|
+
const parsed = parseFrontmatter(content);
|
|
44
|
+
if (!hasAgentShape(parsed)) return null;
|
|
45
|
+
|
|
46
|
+
const sourceRel = path.relative(sourceRoot, file);
|
|
47
|
+
const sourceSlug = slugify(sourceRel.replace(/\.md$/, ''));
|
|
48
|
+
const agentName = slugify(parsed.fields.name);
|
|
49
|
+
const skillName = sourceSlug || agentName;
|
|
50
|
+
const destDir = path.join(targetRoot, skillName);
|
|
51
|
+
const dest = path.join(destDir, 'SKILL.md');
|
|
52
|
+
|
|
53
|
+
const description = parsed.fields.description.replace(/"/g, '\\"');
|
|
54
|
+
const body = parsed.body.replace(/^# /, `# ${parsed.fields.name}\n\n`);
|
|
55
|
+
const skill = [
|
|
56
|
+
'---',
|
|
57
|
+
`name: ${skillName}`,
|
|
58
|
+
`description: "${description}"`,
|
|
59
|
+
'model: sonnet',
|
|
60
|
+
'disable-model-invocation: false',
|
|
61
|
+
'---',
|
|
62
|
+
'',
|
|
63
|
+
'<!--',
|
|
64
|
+
`Imported from agency-agents: ${sourceRel}`,
|
|
65
|
+
'Original frontmatter:',
|
|
66
|
+
parsed.frontmatter,
|
|
67
|
+
'-->',
|
|
68
|
+
'',
|
|
69
|
+
body.trim(),
|
|
70
|
+
'',
|
|
71
|
+
'## Harness Operating Contract',
|
|
72
|
+
'',
|
|
73
|
+
'- You are a hireable HR-Resource worker, not a CXX executive.',
|
|
74
|
+
'- Work only after a CXX assigns a mission through `/hiring` and `/resource-manager` wiring.',
|
|
75
|
+
'- Start each assignment from fresh context.',
|
|
76
|
+
'- Record mission output in `.harness/documents/{mission_name}/workers/{name}.md` unless the requester specifies another mission document.',
|
|
77
|
+
'- Follow DDD boundaries for domain, application, infrastructure, and interface decisions.',
|
|
78
|
+
''
|
|
79
|
+
].join('\n');
|
|
80
|
+
|
|
81
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
82
|
+
fs.writeFileSync(dest, skill);
|
|
83
|
+
return { sourceRel, skillName };
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const converted = [];
|
|
87
|
+
for (const file of walk(sourceRoot)) {
|
|
88
|
+
const result = convertFile(file);
|
|
89
|
+
if (result) converted.push(result);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
converted.sort((a, b) => a.skillName.localeCompare(b.skillName));
|
|
93
|
+
const index = {
|
|
94
|
+
source: sourceRoot,
|
|
95
|
+
imported_at: new Date().toISOString(),
|
|
96
|
+
count: converted.length,
|
|
97
|
+
resources: converted
|
|
98
|
+
};
|
|
99
|
+
fs.mkdirSync(targetRoot, { recursive: true });
|
|
100
|
+
fs.writeFileSync(path.join(targetRoot, 'index.json'), JSON.stringify(index, null, 2) + '\n');
|
|
101
|
+
|
|
102
|
+
console.log(`Imported ${converted.length} agency agents into ${targetRoot}`);
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# harness-agent-resolver.sh — canonical feature/phase → harness agent resolver
|
|
3
|
+
#
|
|
4
|
+
# Worker dispatch must not guess the department when Planner already wrote
|
|
5
|
+
# owner_agents/applicable_eval_axes. This resolver is intentionally strict:
|
|
6
|
+
# declared metadata wins; keyword fallback is only allowed when metadata is
|
|
7
|
+
# absent.
|
|
8
|
+
|
|
9
|
+
set -uo pipefail
|
|
10
|
+
|
|
11
|
+
resolve_feature_agent() {
|
|
12
|
+
local project_root="$1" fid="$2" phase="${3:-gen}" pipeline="${4:-FULLSTACK}"
|
|
13
|
+
local features="$project_root/.harness/actions/feature-list.json"
|
|
14
|
+
|
|
15
|
+
[ -f "$features" ] || return 2
|
|
16
|
+
command -v jq >/dev/null 2>&1 || return 2
|
|
17
|
+
|
|
18
|
+
local feature_json
|
|
19
|
+
feature_json="$(jq -c --arg id "$fid" '.features[]? | select(.id == $id)' "$features" 2>/dev/null | head -1)"
|
|
20
|
+
[ -n "$feature_json" ] && [ "$feature_json" != "null" ] || return 3
|
|
21
|
+
|
|
22
|
+
case "$phase" in
|
|
23
|
+
eval|eval:*|evaluation|evaluator-*)
|
|
24
|
+
_resolve_eval_agent "$feature_json" "$phase"
|
|
25
|
+
return $?
|
|
26
|
+
;;
|
|
27
|
+
*)
|
|
28
|
+
_resolve_generation_agent "$feature_json" "$pipeline"
|
|
29
|
+
return $?
|
|
30
|
+
;;
|
|
31
|
+
esac
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
_resolve_generation_agent() {
|
|
35
|
+
local feature_json="$1" pipeline="$2"
|
|
36
|
+
local owner_count agent
|
|
37
|
+
|
|
38
|
+
owner_count="$(jq '(.owner_agents // []) | length' <<<"$feature_json")"
|
|
39
|
+
if [ "${owner_count:-0}" -gt 0 ]; then
|
|
40
|
+
agent="$(jq -r '
|
|
41
|
+
(.owner_agents // [])
|
|
42
|
+
| map(select(
|
|
43
|
+
. == "generator-backend" or
|
|
44
|
+
. == "generator-frontend" or
|
|
45
|
+
. == "generator-designer" or
|
|
46
|
+
. == "generator-devops"
|
|
47
|
+
))
|
|
48
|
+
| .[0] // empty
|
|
49
|
+
' <<<"$feature_json")"
|
|
50
|
+
[ -n "$agent" ] || return 4
|
|
51
|
+
echo "$agent"
|
|
52
|
+
return 0
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
local layer service title text
|
|
56
|
+
layer="$(jq -r '(.layer // .type // "")' <<<"$feature_json")"
|
|
57
|
+
service="$(jq -r '(.service // "")' <<<"$feature_json")"
|
|
58
|
+
title="$(jq -r '(.title // .name // .description // "")' <<<"$feature_json")"
|
|
59
|
+
text="$(printf '%s %s %s' "$layer" "$service" "$title" | tr '[:upper:]' '[:lower:]')"
|
|
60
|
+
|
|
61
|
+
case "$text" in
|
|
62
|
+
*frontend*|*ui*|*web*|*react*|*next*) echo "generator-frontend" ;;
|
|
63
|
+
*design*|*token*|*component-spec*) echo "generator-designer" ;;
|
|
64
|
+
*devops*|*infra*|*deploy*|*ci*) echo "generator-devops" ;;
|
|
65
|
+
*)
|
|
66
|
+
if [ "$pipeline" = "FE-ONLY" ]; then echo "generator-frontend"; else echo "generator-backend"; fi
|
|
67
|
+
;;
|
|
68
|
+
esac
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
_resolve_eval_agent() {
|
|
72
|
+
local feature_json="$1" phase="$2"
|
|
73
|
+
local requested_axis axes_count agent
|
|
74
|
+
|
|
75
|
+
requested_axis="${phase#eval:}"
|
|
76
|
+
requested_axis="${requested_axis#evaluator-}"
|
|
77
|
+
[ "$requested_axis" = "$phase" ] && requested_axis=""
|
|
78
|
+
[ "$requested_axis" = "eval" ] && requested_axis=""
|
|
79
|
+
[ "$requested_axis" = "evaluation" ] && requested_axis=""
|
|
80
|
+
|
|
81
|
+
axes_count="$(jq '(.applicable_eval_axes // []) | length' <<<"$feature_json")"
|
|
82
|
+
[ "${axes_count:-0}" -gt 0 ] || return 5
|
|
83
|
+
|
|
84
|
+
if [ -n "$requested_axis" ]; then
|
|
85
|
+
agent="$(_axis_to_evaluator "$requested_axis")" || return 6
|
|
86
|
+
jq -e --arg agent "$agent" '
|
|
87
|
+
def map_axis:
|
|
88
|
+
if . == "code-quality" or . == "code_quality" or . == "evaluator-code-quality" then "evaluator-code-quality"
|
|
89
|
+
elif . == "functional" or . == "evaluator-functional" then "evaluator-functional"
|
|
90
|
+
elif . == "visual" or . == "evaluator-visual" then "evaluator-visual"
|
|
91
|
+
elif . == "architecture" or . == "evaluator-architecture" then "evaluator-architecture"
|
|
92
|
+
elif . == "security" or . == "evaluator-security" then "evaluator-security"
|
|
93
|
+
else empty end;
|
|
94
|
+
(.applicable_eval_axes // []) | map(map_axis) | index($agent)
|
|
95
|
+
' <<<"$feature_json" >/dev/null || return 7
|
|
96
|
+
echo "$agent"
|
|
97
|
+
return 0
|
|
98
|
+
fi
|
|
99
|
+
|
|
100
|
+
agent="$(jq -r '
|
|
101
|
+
def map_axis:
|
|
102
|
+
if . == "code-quality" or . == "code_quality" or . == "evaluator-code-quality" then "evaluator-code-quality"
|
|
103
|
+
elif . == "functional" or . == "evaluator-functional" then "evaluator-functional"
|
|
104
|
+
elif . == "visual" or . == "evaluator-visual" then "evaluator-visual"
|
|
105
|
+
elif . == "architecture" or . == "evaluator-architecture" then "evaluator-architecture"
|
|
106
|
+
elif . == "security" or . == "evaluator-security" then "evaluator-security"
|
|
107
|
+
else empty end;
|
|
108
|
+
(.applicable_eval_axes // []) | map(map_axis) | .[0] // empty
|
|
109
|
+
' <<<"$feature_json")"
|
|
110
|
+
[ -n "$agent" ] || return 6
|
|
111
|
+
echo "$agent"
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
_axis_to_evaluator() {
|
|
115
|
+
case "$1" in
|
|
116
|
+
code-quality|code_quality|evaluator-code-quality) echo "evaluator-code-quality" ;;
|
|
117
|
+
functional|evaluator-functional) echo "evaluator-functional" ;;
|
|
118
|
+
visual|evaluator-visual) echo "evaluator-visual" ;;
|
|
119
|
+
architecture|evaluator-architecture) echo "evaluator-architecture" ;;
|
|
120
|
+
security|evaluator-security) echo "evaluator-security" ;;
|
|
121
|
+
*) return 1 ;;
|
|
122
|
+
esac
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
if [ "${BASH_SOURCE[0]}" = "$0" ]; then
|
|
126
|
+
resolve_feature_agent "${1:-.}" "${2:-}" "${3:-gen}" "${4:-FULLSTACK}"
|
|
127
|
+
fi
|