@walwal-harness/cli 7.1.8 → 7.1.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (86) hide show
  1. package/HR-Resource/ceo/SKILL.md +4 -4
  2. package/HR-Resource/cqo/SKILL.md +3 -3
  3. package/HR-Resource/cto/SKILL.md +4 -4
  4. package/README.md +58 -5
  5. package/apps/harness-dashboard/app/api/env/route.ts +62 -0
  6. package/apps/harness-dashboard/app/api/log/route.ts +19 -0
  7. package/apps/harness-dashboard/app/api/missions/route.ts +15 -0
  8. package/apps/harness-dashboard/app/api/snapshot/route.ts +15 -0
  9. package/apps/harness-dashboard/app/api/stream/route.ts +71 -0
  10. package/apps/harness-dashboard/app/globals.css +17 -0
  11. package/apps/harness-dashboard/app/layout.tsx +29 -0
  12. package/apps/harness-dashboard/app/page.tsx +35 -0
  13. package/apps/harness-dashboard/components/Drawer.tsx +97 -0
  14. package/apps/harness-dashboard/components/Header.tsx +40 -0
  15. package/apps/harness-dashboard/components/MissionTimeline.tsx +214 -0
  16. package/apps/harness-dashboard/components/OrgTree.tsx +330 -0
  17. package/apps/harness-dashboard/components/Scene.tsx +563 -0
  18. package/apps/harness-dashboard/components/Wordmark.tsx +14 -0
  19. package/apps/harness-dashboard/components/drawer/AgentLogTab.tsx +56 -0
  20. package/apps/harness-dashboard/components/drawer/GotchasTab.tsx +89 -0
  21. package/apps/harness-dashboard/components/drawer/HypothesisTab.tsx +42 -0
  22. package/apps/harness-dashboard/components/drawer/IncidentsTab.tsx +50 -0
  23. package/apps/harness-dashboard/components/drawer/MissionDocTab.tsx +92 -0
  24. package/apps/harness-dashboard/components/drawer/MissionFlowTab.tsx +520 -0
  25. package/apps/harness-dashboard/components/drawer/OwnerHistoryTab.tsx +160 -0
  26. package/apps/harness-dashboard/components/drawer/RoomMetricsTab.tsx +90 -0
  27. package/apps/harness-dashboard/components/drawer/TracksTab.tsx +47 -0
  28. package/apps/harness-dashboard/components/three/ArchiveBoxes.tsx +95 -0
  29. package/apps/harness-dashboard/components/three/DeptBoard.tsx +175 -0
  30. package/apps/harness-dashboard/components/three/Floor3D.tsx +404 -0
  31. package/apps/harness-dashboard/components/three/GoalCard3D.tsx +123 -0
  32. package/apps/harness-dashboard/components/three/HypothesisCards.tsx +71 -0
  33. package/apps/harness-dashboard/components/three/MeetingWhiteboard.tsx +98 -0
  34. package/apps/harness-dashboard/components/three/Minifig3D.tsx +391 -0
  35. package/apps/harness-dashboard/components/three/OpsSiren.tsx +99 -0
  36. package/apps/harness-dashboard/components/three/Stage3D.tsx +104 -0
  37. package/apps/harness-dashboard/components/three/TrackRibbons.tsx +81 -0
  38. package/apps/harness-dashboard/hooks/useHarnessStream.ts +53 -0
  39. package/apps/harness-dashboard/lib/__tests__/company-flow.test.ts +270 -0
  40. package/apps/harness-dashboard/lib/__tests__/harness-state.test.ts +194 -0
  41. package/apps/harness-dashboard/lib/__tests__/i18n.test.ts +16 -0
  42. package/apps/harness-dashboard/lib/__tests__/iso.test.ts +42 -0
  43. package/apps/harness-dashboard/lib/__tests__/safe-json.test.ts +46 -0
  44. package/apps/harness-dashboard/lib/__tests__/state-mapping.test.ts +159 -0
  45. package/apps/harness-dashboard/lib/__tests__/watcher.test.ts +48 -0
  46. package/apps/harness-dashboard/lib/agent-roster.ts +42 -0
  47. package/apps/harness-dashboard/lib/furniture.ts +165 -0
  48. package/apps/harness-dashboard/lib/harness-root.ts +20 -0
  49. package/apps/harness-dashboard/lib/harness-state.ts +1193 -0
  50. package/apps/harness-dashboard/lib/i18n.ts +26 -0
  51. package/apps/harness-dashboard/lib/iso.ts +150 -0
  52. package/apps/harness-dashboard/lib/log-filter.ts +23 -0
  53. package/apps/harness-dashboard/lib/markdown.tsx +306 -0
  54. package/apps/harness-dashboard/lib/path-planning.ts +72 -0
  55. package/apps/harness-dashboard/lib/safe-json.ts +24 -0
  56. package/apps/harness-dashboard/lib/state-mapping.ts +126 -0
  57. package/apps/harness-dashboard/lib/types.ts +329 -0
  58. package/apps/harness-dashboard/lib/watcher.ts +64 -0
  59. package/apps/harness-dashboard/next-env.d.ts +6 -0
  60. package/apps/harness-dashboard/next.config.mjs +9 -0
  61. package/apps/harness-dashboard/package-lock.json +4280 -0
  62. package/apps/harness-dashboard/package.json +38 -0
  63. package/apps/harness-dashboard/playwright.config.ts +23 -0
  64. package/apps/harness-dashboard/postcss.config.js +6 -0
  65. package/apps/harness-dashboard/tailwind.config.ts +49 -0
  66. package/apps/harness-dashboard/tsconfig.json +24 -0
  67. package/apps/harness-dashboard/vitest.config.ts +15 -0
  68. package/assets/templates/AGENTS-ko.md.template +19 -6
  69. package/assets/templates/AGENTS.md.template +20 -7
  70. package/assets/templates/HARNESS.md +75 -199
  71. package/assets/templates/config.json +2 -2
  72. package/bin/init.js +11 -11
  73. package/commands/goal.md +6 -4
  74. package/commands/hot-fix.md +16 -13
  75. package/commands/submission.md +28 -0
  76. package/conventions/ceo.md +3 -3
  77. package/conventions/shared.md +4 -3
  78. package/package.json +11 -1
  79. package/scripts/harness-dashboard-up.sh +24 -4
  80. package/scripts/harness-session-start.sh +1 -1
  81. package/scripts/harness-stop.sh +1 -1
  82. package/scripts/harness-user-prompt-submit.sh +12 -4
  83. package/scripts/harness-worker-evidence-validate.sh +8 -3
  84. package/scripts/import-agency-agents.js +1 -1
  85. package/scripts/init-agents-md.sh +17 -2
  86. package/assets/templates/AGENTS-ko /341/204/207/341/205/251/341/206/250/341/204/211/341/205/241/341/204/207/341/205/251/341/206/253.md" +0 -114
package/bin/init.js CHANGED
@@ -766,7 +766,7 @@ function installCommands() {
766
766
  for (const commandsDest of commandDests) {
767
767
  const existing = fs.readdirSync(commandsDest);
768
768
  for (const f of existing) {
769
- 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)) {
769
+ if (f.startsWith('harness-') || ['goal.md', 'hot-fix.md', 'submission.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)) {
770
770
  fs.unlinkSync(path.join(commandsDest, f));
771
771
  }
772
772
  }
@@ -910,7 +910,7 @@ function installUserPromptSubmitHook() {
910
910
  });
911
911
  writeClaudeSettings(settings);
912
912
  log('UserPromptSubmit hook installed in .claude/settings.json');
913
- log(' → /goal and /hot-fix are guided through harness-ceo and CXX workflow');
913
+ log(' → /goal, /submission, and /hot-fix are guided through harness-ceo and CXX workflow');
914
914
  log(' → Opt-out per message: say "harness skip" or "without harness"');
915
915
  log(' → Disable globally: set .harness/config.json behavior.auto_route_ceo = false');
916
916
  } else {
@@ -1163,7 +1163,7 @@ Runtime (always-on company mode):
1163
1163
  - Stop 훅이 매 turn 종료 시 다음 부서로 자동 연쇄.
1164
1164
  - 1시간 안전망 wake (선택): bash scripts/harness-wake-install.sh install .
1165
1165
  - 3D 대시보드 (선택): bash scripts/harness-dashboard-up.sh
1166
- - Owner 입력은 GOAL 모호성, escalation, 결과 보고에만 필요합니다.
1166
+ - Owner 입력은 GOAL 모호성, submission, hot-fix, escalation, 결과 보고에만 필요합니다.
1167
1167
 
1168
1168
  What it does:
1169
1169
  1. Scaffolds project-local .harness/ runtime state
@@ -1176,7 +1176,7 @@ What it does:
1176
1176
 
1177
1177
  After init:
1178
1178
  1. Restart Claude/Codex session if command discovery needs refresh.
1179
- 2. Use /goal or /hot-fix.
1179
+ 2. Use /goal, /submission, or /hot-fix.
1180
1180
  3. Internal agents must call hired agents/skills, not slash commands.
1181
1181
  `);
1182
1182
  }
@@ -1408,7 +1408,7 @@ function showMigrationProposal(flags) {
1408
1408
  }
1409
1409
  if (flags.configMissingCompanyMode) {
1410
1410
  console.log(' • config.json: company_mode 섹션 동기화 가능');
1411
- console.log(' Owner /goal, /hot-fix → CEO/CXX/worker 흐름으로 고정합니다.');
1411
+ console.log(' Owner /goal, /submission, /hot-fix → CEO/CXX/worker 흐름으로 고정합니다.');
1412
1412
  }
1413
1413
  if (flags.configLegacyRouting) {
1414
1414
  console.log(' • config.json: legacy dispatcher/conductor wording → v7 CEO/CXX wording');
@@ -1536,7 +1536,7 @@ function runMigrate(opts = {}) {
1536
1536
  c.flow = tpl.flow || c.flow;
1537
1537
  c.behavior = c.behavior || {};
1538
1538
  c.behavior.auto_route_ceo = c.behavior.auto_route_ceo ?? c.behavior.auto_route_dispatcher ?? true;
1539
- c.behavior.auto_route_ceo_description = 'true 이면 /goal 또는 /hot-fix 이후 Owner 입력을 v7 CEO/CXX mission flow 기준으로 안내한다.';
1539
+ c.behavior.auto_route_ceo_description = 'true 이면 /goal, /submission, /hot-fix 이후 Owner 입력을 v7 CEO/CXX mission flow 기준으로 안내한다.';
1540
1540
  delete c.behavior.auto_route_dispatcher;
1541
1541
  delete c.behavior.auto_route_dispatcher_description;
1542
1542
  delete c.mode_selection;
@@ -1726,7 +1726,7 @@ function runMigrate(opts = {}) {
1726
1726
  log('Dry-run 완료 — 실제 변경 적용하려면 `npx walwal-harness migrate` 실행');
1727
1727
  } else {
1728
1728
  log(`Migration 완료. 백업: ${backupDir}`);
1729
- log('v7 routing 기준으로 /goal 또는 /hot-fix 가 CEO/CXX/worker 흐름을 시작합니다.');
1729
+ log('v7 routing 기준으로 /goal, /submission, /hot-fix 가 CEO/CXX/worker 흐름을 시작합니다.');
1730
1730
  log('회사모드는 기본값이며 사용자 override 는 사용하지 않습니다.');
1731
1731
  }
1732
1732
  console.log('');
@@ -1781,7 +1781,7 @@ function runVerify() {
1781
1781
  log(` skills: ${pass}/${expectedSkills.length * skillRoots.length} OK`);
1782
1782
 
1783
1783
  // 2) owner-facing commands
1784
- const allowedCommands = new Set(['goal.md', 'hot-fix.md']);
1784
+ const allowedCommands = new Set(['goal.md', 'submission.md', 'hot-fix.md']);
1785
1785
  const forbiddenCommands = new Set(['ceo.md', 'coo.md', 'cdo.md', 'cto.md', 'cqo.md', 'ops.md', 'hiring.md', 'resource-manager.md', 'brick-office.md']);
1786
1786
  const commandRoots = [
1787
1787
  ['.claude', CLAUDE_COMMANDS_DIR],
@@ -1807,7 +1807,7 @@ function runVerify() {
1807
1807
  }
1808
1808
  }
1809
1809
  }
1810
- log(` commands: /goal + /hot-fix checked`);
1810
+ log(` commands: /goal + /submission + /hot-fix checked`);
1811
1811
 
1812
1812
  // 3) progress.json schema (v6+ = version 4 + mode_decision)
1813
1813
  const progressPath = path.join(HARNESS_DIR, 'progress.json');
@@ -1991,14 +1991,14 @@ function main() {
1991
1991
  log('╔═══════════════════════════════════════════════════════════╗');
1992
1992
  log('║ Restart Claude Code for skills & commands to activate! ║');
1993
1993
  log('║ ║');
1994
- log('║ Then invoke /goal or /hot-fix ║');
1994
+ log('║ Then invoke /goal, /submission, or /hot-fix ║');
1995
1995
  log('║ ║');
1996
1996
  log('║ 기본은 회사모드: 병렬 · 자율 진행. 추가 입력 불필요. ║');
1997
1997
  log('╚═══════════════════════════════════════════════════════════╝');
1998
1998
  } else {
1999
1999
  log('Next steps:');
2000
2000
  log(' 1. Restart Claude/Codex if command discovery needs refresh.');
2001
- log(' 2. Use /goal or /hot-fix.');
2001
+ log(' 2. Use /goal, /submission, or /hot-fix.');
2002
2002
  log(' 3. Internal agents call hired agents/skills, not slash commands.');
2003
2003
  }
2004
2004
  console.log('');
package/commands/goal.md CHANGED
@@ -8,17 +8,19 @@ argument-hint: "<goal request>"
8
8
  Route the Owner request to the installed `harness-ceo` agent/skill.
9
9
 
10
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`.
11
+ 1. Create or update a goal under `.harness/documents/goal-{goal_index}-{goal_name}/`.
12
+ 2. Record CEO decisions in `.harness/documents/goal-{goal_index}-{goal_name}/ceo.md`.
13
13
  3. CEO decides whether brainstorming is needed or whether CXX questions can be issued immediately.
14
14
  4. CEO asks COO, CDO, CTO, and CQO only the questions needed for this goal.
15
15
  5. CXX roles must start in a fresh session context. Do not let the default model impersonate a missing worker.
16
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
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.
18
+ 8. CEO must require worker report paths under `.harness/documents/goal-{goal_index}-{goal_name}/{owning-cxx}/workers/` before accepting CXX completion.
19
19
  9. Do not invoke internal roles through slash commands; commands are Owner entrypoints only.
20
20
 
21
- Note: Harness documents (ceo.md, cto.md, cqo.md, worker reports) are mission records, not derived output documents. A docmeta skip decision on these files does not authorize skipping any harness protocol step.
21
+ Note: A goal is the company's objective. Submissions and hot-fixes that happen while pursuing it should be recorded under that goal directory.
22
+
23
+ Harness documents (ceo.md, cto.md, cqo.md, worker reports) are mission records, not derived output documents. A docmeta skip decision on these files does not authorize skipping any harness protocol step.
22
24
 
23
25
  Owner request:
24
26
 
@@ -1,25 +1,28 @@
1
1
  ---
2
- description: Start an urgent fix outside the active goal.
2
+ description: Start an urgent fix under the active goal.
3
3
  argument-hint: "<incident or fix request>"
4
4
  ---
5
5
 
6
6
  # /hot-fix
7
7
 
8
- Route the Owner request to the installed `harness-ceo` agent/skill as an emergency mission.
8
+ Route the Owner request to the installed `harness-ceo` agent/skill as an emergency mission under the active goal.
9
9
 
10
10
  Required flow:
11
- 1. Create `.harness/documents/{hotfix_name}/ceo.md`.
12
- 2. CEO summons CTO and CQO first; 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 start in a fresh session context. Do not let the default model impersonate a missing CXX or worker.
15
- 5. 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.
16
- 6. If a required worker is missing, CEO or the responsible CXX must invoke the installed `harness-hiring` skill before assigning the work.
17
- 7. CEO must require worker report paths under `.harness/documents/{hotfix_name}/workers/` before accepting CXX completion.
18
- 8. CQO must register durable lessons in `.harness/gotchas/`, `.harness/conventions/`, or `.harness/memories/`. This step is mandatory, not optional, even for small fixes.
19
- 9. Archive only after CQO has accepted the fix.
20
- 10. Do not invoke internal roles through slash commands; commands are Owner entrypoints only.
11
+ 1. Locate the active goal document root under `.harness/documents/{goal_name}/`. If no active goal exists, CEO must create/select one before proceeding.
12
+ 2. Create `.harness/documents/{goal_name}/hotfix-{hotfix_index}-{hotfix_name}/ceo.md`.
13
+ 3. CEO summons CTO and CQO first; summon COO/CDO only when planning or UX decisions are involved.
14
+ 4. CTO applies the smallest correct patch path through hired implementation skills.
15
+ 5. CXX roles must start in a fresh session context. Do not let the default model impersonate a missing CXX or worker.
16
+ 6. 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.
17
+ 7. If a required worker is missing, CEO or the responsible CXX must invoke the installed `harness-hiring` skill before assigning the work.
18
+ 8. CEO must require worker report paths under `.harness/documents/{goal_name}/hotfix-{hotfix_index}-{hotfix_name}/{owning-cxx}/workers/` before accepting CXX completion.
19
+ 9. CQO must register durable lessons in `.harness/gotchas/`, `.harness/conventions/`, or `.harness/memories/`. This step is mandatory, not optional, even for small fixes.
20
+ 10. Archive only after CQO has accepted the fix.
21
+ 11. Do not invoke internal roles through slash commands; commands are Owner entrypoints only.
21
22
 
22
- Note: Harness documents (ceo.md, cto.md, cqo.md, worker reports) are mission records, not derived output documents. A docmeta skip decision on these files does not authorize skipping any harness protocol step.
23
+ Note: `/hot-fix` is a problem-fix flow while pursuing the active goal. It belongs under that goal in history.
24
+
25
+ Harness documents (ceo.md, cto.md, cqo.md, worker reports) are mission records, not derived output documents. A docmeta skip decision on these files does not authorize skipping any harness protocol step.
23
26
 
24
27
  Hot-fix request:
25
28
 
@@ -0,0 +1,28 @@
1
+ ---
2
+ description: Add a requirement under the active goal.
3
+ argument-hint: "<additional requirement>"
4
+ ---
5
+
6
+ # /submission
7
+
8
+ Route the Owner request to the installed `harness-ceo` agent/skill as an additional requirement under the active goal.
9
+
10
+ Required flow:
11
+ 1. Locate the active goal document root under `.harness/documents/{goal_name}/`. If no active goal exists, CEO must ask the Owner to create or select one with `/goal` before proceeding.
12
+ 2. Create a submission record under `.harness/documents/{goal_name}/submission-{submission_index}-{submission_name}/`.
13
+ 3. Record CEO decisions in `.harness/documents/{goal_name}/submission-{submission_index}-{submission_name}/ceo.md`.
14
+ 4. CEO routes only to the CXX agents needed for this additional requirement.
15
+ 5. CXX roles must start in a fresh session context. Do not let the default model impersonate a missing CXX or 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 worker is missing, the responsible CXX must invoke the installed `harness-hiring` skill before assigning the work.
18
+ 8. CXX must manage conventions for new requirements. Durable changes in behavior, architecture, UI, process, or policy must be reflected in `.harness/conventions/` when accepted.
19
+ 9. CEO must require worker report paths under `.harness/documents/{goal_name}/submission-{submission_index}-{submission_name}/{owning-cxx}/workers/` before accepting CXX completion.
20
+ 10. Do not invoke internal roles through slash commands; commands are Owner entrypoints only.
21
+
22
+ Note: `/submission` is not a new company goal and not an emergency fix. It is an additional requirement while pursuing the active goal. It belongs under that goal in history.
23
+
24
+ Submission request:
25
+
26
+ ```
27
+ $ARGUMENTS
28
+ ```
@@ -1,9 +1,9 @@
1
1
  # CEO Conventions
2
2
 
3
3
  - CEO is the only Owner-facing internal role.
4
- - CEO receives `/goal` and `/hot-fix` through command entrypoints.
4
+ - CEO receives `/goal`, `/submission`, and `/hot-fix` through command entrypoints.
5
5
  - CEO routes work to CXX agents through agent/skill invocation, not slash commands.
6
- - CEO records mission framing and routing decisions in `.harness/documents/{mission_name}/ceo.md`.
6
+ - CEO records mission framing and routing decisions in `.harness/documents/{goal-or-child-mission}/ceo.md`.
7
7
  - CEO asks only mission-relevant questions to COO, CDO, CTO, CQO, and OPS.
8
8
  - CEO does not accept CXX completion unless specialist deliverables were produced by hired workers.
9
- - CEO requires worker names and `.harness/documents/{mission_name}/workers/{worker-name}.md` paths in CXX completion reports.
9
+ - CEO requires worker names and `.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/{worker-name}.md` paths in CXX completion reports.
@@ -4,7 +4,7 @@
4
4
 
5
5
  - This package repository must not contain project runtime `.harness/` state.
6
6
  - `walwal-harness init` creates `.harness/` in the target project.
7
- - `.claude/commands` and `.codex/commands` contain only `/goal` and `/hot-fix`.
7
+ - `.claude/commands` and `.codex/commands` contain only `/goal`, `/submission`, and `/hot-fix`.
8
8
  - CXX and worker execution uses installed agents/skills, not slash commands.
9
9
 
10
10
  ## Hiring Boundary
@@ -19,9 +19,10 @@
19
19
 
20
20
  ## Mission Documents
21
21
 
22
- - Mission records live under `.harness/documents/{mission_name}/`.
22
+ - Goal records live under `.harness/documents/goal-{index}-{name}/`.
23
+ - Submission and hot-fix records live below the active goal directory.
23
24
  - CXX decisions use `{cxx}.md`.
24
- - Worker reports use `workers/{worker-name}.md`.
25
+ - Worker reports use `{owning-cxx}/workers/{worker-name}.md`.
25
26
 
26
27
  ## DDD
27
28
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@walwal-harness/cli",
3
- "version": "7.1.8",
3
+ "version": "7.1.10",
4
4
  "description": "Company-style AI agent harness for Claude and Codex. Installs commands, CXX agents, skills, HR-Resource hiring pool, and project-local .harness runtime state.",
5
5
  "bin": {
6
6
  "walwal-harness": "bin/init.js"
@@ -43,6 +43,16 @@
43
43
  "files": [
44
44
  "bin/",
45
45
  "HR-Resource/",
46
+ "apps/harness-dashboard/app/",
47
+ "apps/harness-dashboard/components/",
48
+ "apps/harness-dashboard/hooks/",
49
+ "apps/harness-dashboard/lib/",
50
+ "apps/harness-dashboard/public/",
51
+ "apps/harness-dashboard/*.json",
52
+ "apps/harness-dashboard/*.js",
53
+ "apps/harness-dashboard/*.mjs",
54
+ "apps/harness-dashboard/*.ts",
55
+ "apps/harness-dashboard/*.tsx",
46
56
  "scripts/",
47
57
  "commands/",
48
58
  "assets/",
@@ -2,9 +2,9 @@
2
2
  # walwal-harness — Brick Office dashboard launcher
3
3
  #
4
4
  # 처음 쓰는 사용자도 한 줄로 대시보드를 띄워볼 수 있게 만든 helper.
5
- # walwal-harness CLI 패키지에는 R3F + Next.js 무게 때문에 dashboard 가 미포함이고,
6
- # 본 스크립트가 git sparse-checkout 으로 apps/harness-dashboard/ 만 가져와서
7
- # 사용자 프로젝트 외부 (~/.walwal-harness/dashboard/<project-key>) 에 격리 설치 후 dev 실행한다.
5
+ # npm 패키지에 포함된 apps/harness-dashboard 를 사용자 프로젝트 외부
6
+ # (~/.walwal-harness/dashboard/<project-key>) 에 격리 복사 후 dev 실행한다.
7
+ # 구버전 호환을 위해 패키지에 dashboard 가 없으면 git sparse-checkout 으로 fallback 한다.
8
8
  #
9
9
  # Usage:
10
10
  # bash scripts/harness-dashboard-up.sh # install + dev (port 3001)
@@ -16,6 +16,7 @@ REPO_URL="${WALWAL_HARNESS_REPO:-https://github.com/30eggis/walwal-harness.git}"
16
16
  DASHBOARD_PATH="apps/harness-dashboard"
17
17
  PORT="${PORT:-3001}"
18
18
  REINSTALL=false
19
+ PACKAGE_VERSION="unknown"
19
20
 
20
21
  while [[ $# -gt 0 ]]; do
21
22
  case "$1" in
@@ -40,6 +41,13 @@ fi
40
41
  PROJECT_KEY="$(printf '%s' "${HARNESS_ROOT}" | shasum -a 1 | awk '{print substr($1,1,12)}')"
41
42
  PROJECT_NAME="$(basename "${HARNESS_ROOT}")"
42
43
  LOCAL_DIR="${HOME}/.walwal-harness/dashboard/${PROJECT_NAME}-${PROJECT_KEY}"
44
+ VERSION_FILE="${LOCAL_DIR}/.walwal-dashboard-version"
45
+
46
+ PACKAGE_ROOT="${HARNESS_ROOT}/node_modules/@walwal-harness/cli"
47
+ PACKAGED_DASHBOARD="${PACKAGE_ROOT}/${DASHBOARD_PATH}"
48
+ if [[ -f "${PACKAGE_ROOT}/package.json" ]]; then
49
+ PACKAGE_VERSION="$(node -p "require('${PACKAGE_ROOT}/package.json').version" 2>/dev/null || echo unknown)"
50
+ fi
43
51
 
44
52
  if [[ "$REINSTALL" == "true" ]]; then
45
53
  rm -rf "$LOCAL_DIR"
@@ -48,7 +56,19 @@ fi
48
56
  echo "[brick-office] HARNESS_ROOT = ${HARNESS_ROOT}"
49
57
  echo "[brick-office] dashboard 격리 경로 = ${LOCAL_DIR}"
50
58
 
51
- if [[ ! -d "${LOCAL_DIR}/${DASHBOARD_PATH}" ]]; then
59
+ if [[ -d "${PACKAGED_DASHBOARD}" ]]; then
60
+ INSTALLED_VERSION=""
61
+ if [[ -f "${VERSION_FILE}" ]]; then
62
+ INSTALLED_VERSION="$(cat "${VERSION_FILE}" 2>/dev/null || true)"
63
+ fi
64
+ if [[ ! -d "${LOCAL_DIR}/${DASHBOARD_PATH}" || "${INSTALLED_VERSION}" != "${PACKAGE_VERSION}" ]]; then
65
+ echo "[brick-office] dashboard sync from npm package @walwal-harness/cli@${PACKAGE_VERSION}"
66
+ rm -rf "${LOCAL_DIR:?}/${DASHBOARD_PATH}"
67
+ mkdir -p "${LOCAL_DIR}/apps"
68
+ cp -R "${PACKAGED_DASHBOARD}" "${LOCAL_DIR}/apps/"
69
+ printf '%s\n' "${PACKAGE_VERSION}" > "${VERSION_FILE}"
70
+ fi
71
+ elif [[ ! -d "${LOCAL_DIR}/${DASHBOARD_PATH}" ]]; then
52
72
  echo "[brick-office] 첫 실행 — git sparse-checkout 으로 dashboard 만 가져옵니다 (~5MB)."
53
73
  mkdir -p "${LOCAL_DIR}"
54
74
  cd "${LOCAL_DIR}"
@@ -172,7 +172,7 @@ if [ "$sprint_status" = "init" ]; then
172
172
  echo "# Harness Company Mode active"
173
173
  echo "# Sprint is init, but next_agent=${next_agent}; continue the autonomous loop instead of waiting for Owner."
174
174
  else
175
- echo "# Harness ready — use /goal or /hot-fix"
175
+ echo "# Harness ready — use /goal, /submission, or /hot-fix"
176
176
  echo "# 기본 경로는 v7 회사 루프입니다: CEO -> 필요한 CXX -> resource-manager/hiring -> worker reports -> CXX review -> CEO report."
177
177
  exit 0
178
178
  fi
@@ -38,7 +38,7 @@ if [ -x "$SCRIPT_DIR/harness-worker-evidence-validate.sh" ]; then
38
38
  REASON=$(echo "$WORKER_EVIDENCE_JSON" | jq -r '
39
39
  "CXX 직접 실행 차단: " +
40
40
  ([.violations[] | "\(.mission) has CXX docs without worker reports: \(.docs | join(","))"] | join("; ")) +
41
- ". harness-hiring/resource-manager로 전문 worker를 고용 또는 배정하고 .harness/documents/{mission}/workers/{worker-name}.md 를 남긴 뒤 계속하라."
41
+ ". harness-hiring/resource-manager로 전문 worker를 고용 또는 배정하고 .harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/{worker-name}.md 를 남긴 뒤 계속하라."
42
42
  ' 2>/dev/null || echo "CXX 직접 실행 차단: worker report가 없는 mission이 있습니다. hired worker 보고서를 먼저 생성하세요.")
43
43
  jq -nc --arg reason "$REASON" '{decision:"block", reason:$reason}'
44
44
  exit 0
@@ -62,7 +62,15 @@ if [ -n "$PROMPT" ] && [ -d "$CWD/.harness" ]; then
62
62
  fi
63
63
  PROMPT_SHORT=$(echo "$PROMPT" | tr '\n' ' ' | sed 's/ */ /g' | cut -c1-80)
64
64
  if [ ${#PROMPT_SHORT} -gt 2 ]; then
65
- echo "$(date +"%Y-%m-%d %H:%M") | user-prompt | input | ${PROMPT_SHORT}" >> "$PROGRESS_LOG"
65
+ COMMAND_TYPE="other"
66
+ if echo "$PROMPT_SHORT" | grep -qiE '^/goal(\s|$)'; then
67
+ COMMAND_TYPE="goal"
68
+ elif echo "$PROMPT_SHORT" | grep -qiE '^/submission(\s|$)'; then
69
+ COMMAND_TYPE="submission"
70
+ elif echo "$PROMPT_SHORT" | grep -qiE '^/hot-fix(\s|$)'; then
71
+ COMMAND_TYPE="hot-fix"
72
+ fi
73
+ echo "$(date +"%Y-%m-%d %H:%M") | user-prompt | ${COMMAND_TYPE} | ${PROMPT_SHORT}" >> "$PROGRESS_LOG"
66
74
  fi
67
75
  fi
68
76
 
@@ -114,13 +122,13 @@ cat <<EOF
114
122
  [harness] company | S${SPRINT_NUM} | ${PIPELINE} | agent=${CURRENT_AGENT} (${AGENT_STATUS}) | next=${NEXT_AGENT} | queue=${T_PASSED}/${T_TOTAL} passed | failed=${T_FAILED}
115
123
  ${CONTEXT_WARNING}
116
124
  ## Route
117
- - pipeline=none/init → harness-ceo 스킬로 Owner goal/hot-fix를 접수하고 mission 문서를 생성
125
+ - pipeline=none/init → harness-ceo 스킬로 Owner /goal, /submission, /hot-fix를 접수하고 mission 문서를 생성
118
126
  - 기본 경로는 v7 CXX 회사 루프다: CEO -> COO/CDO/CTO/CQO/OPS -> harness-resource-manager -> harness-hiring -> hired workers -> CXX review -> CEO report
119
- - CXX는 직접 전문 산출물을 만들지 않고 worker report를 `.harness/documents/{mission}/workers/`에 남겨야 한다
127
+ - CXX는 직접 전문 산출물을 만들지 않고 worker report를 `.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/`에 남겨야 한다
120
128
  - Owner에게 "계속 진행", "진행할까요?", "다음 명령을 입력하세요"를 요구하지 않는다. GOAL이 있고 escalation이 아니면 즉시 next_agent/current_agent 업무를 수행한다
121
129
  - Owner 입력은 목표 변경·사고·결과 확인용이지 회사 진행을 펌프하는 신호가 아니다
122
130
  - CEO는 필요한 CXX만 호출하고, CXX는 resource-manager/hiring 없이 worker 업무를 수행하지 않는다
123
- - 기능 요청 → CEO mission flow | 긴급 수정 → hot-fix flow | 메타 질문 → 짧게 응답 (skip)
131
+ - 목표 설정/변경 → goal flow | 추가 요구사항 → submission flow | 긴급 수정 → hot-fix flow | 메타 질문 → 짧게 응답 (skip)
124
132
  - 활성 pipeline → next_agent/current_agent 컨텍스트로 계속
125
133
  - skip: "harness skip", "just answer" 등 명시 시 단일 메시지 건너뜀
126
134
  EOF
@@ -35,9 +35,12 @@ has_legacy_flat_worker_report() {
35
35
  find "$mission_dir/workers" -maxdepth 1 -type f -name '*.md' 2>/dev/null | grep -q .
36
36
  }
37
37
 
38
- for mission_dir in "$DOC_ROOT"/*; do
38
+ mission_dirs=$(find "$DOC_ROOT" -type f \( -name 'ceo.md' -o -name 'coo.md' -o -name 'cdo.md' -o -name 'cto.md' -o -name 'cqo.md' -o -name 'ops.md' \) -exec dirname {} \; 2>/dev/null | sort -u)
39
+
40
+ while IFS= read -r mission_dir; do
41
+ [ -n "$mission_dir" ] || continue
39
42
  [ -d "$mission_dir" ] || continue
40
- mission_name="$(basename "$mission_dir")"
43
+ mission_name="${mission_dir#$DOC_ROOT/}"
41
44
 
42
45
  ceo_path="$mission_dir/ceo.md"
43
46
  if [ -s "$ceo_path" ] && ! has_implementation_notes "$ceo_path"; then
@@ -71,7 +74,9 @@ for mission_dir in "$DOC_ROOT"/*; do
71
74
  if [ -s "$cqo_path" ] && grep -Eq '\b(ACCEPTED|REJECTED|PASS|FAIL)\b' "$cqo_path" && ! has_worker_report "$mission_dir" "cqo"; then
72
75
  violations+=("$mission_name:cqo-verdict-without-evaluator")
73
76
  fi
74
- done
77
+ done <<EOF
78
+ $mission_dirs
79
+ EOF
75
80
 
76
81
  if [ "${#violations[@]}" -eq 0 ]; then
77
82
  if [ "$mode" = "json" ]; then
@@ -73,7 +73,7 @@ function convertFile(file) {
73
73
  '- You are a hireable HR-Resource worker, not a CXX executive.',
74
74
  '- Work only after a CXX assigns a mission through `/hiring` and `/resource-manager` wiring.',
75
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.',
76
+ '- Record mission output in `.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/{name}.md` unless the requester specifies another mission document.',
77
77
  '- Follow DDD boundaries for domain, application, infrastructure, and interface decisions.',
78
78
  ''
79
79
  ].join('\n');
@@ -239,6 +239,18 @@ cat > "$AGENTS_FILE" << AGENTSEOF
239
239
  - Monorepo: ${TECH_MONO}
240
240
  - OpenAPI: ${OPENAPI}
241
241
 
242
+ ## Harness Entry Points
243
+
244
+ Owner-facing commands are limited to:
245
+
246
+ | Command | Purpose | History path |
247
+ |------|------|------|
248
+ | \`/goal\` | Set or change the company goal | \`.harness/documents/goal-{index}-{name}/\` |
249
+ | \`/submission\` | Add a requirement under the active goal | \`.harness/documents/goal-{index}-{name}/submission-{index}-{name}/\` |
250
+ | \`/hot-fix\` | Fix an urgent issue under the active goal | \`.harness/documents/goal-{index}-{name}/hotfix-{index}-{name}/\` |
251
+
252
+ Owner speaks only to CEO. CEO speaks only to CXX. CXX agents coordinate and hire workers; they do not directly produce specialist deliverables. Worker reports must live under \`.harness/documents/{goal-or-child-mission}/{owning-cxx}/workers/\`.
253
+
242
254
  ## IA-MAP (Information Architecture)
243
255
 
244
256
  > 자동 스캔으로 생성됨. Planner가 검토 후 확정해야 합니다.
@@ -300,6 +312,9 @@ AGENTS.md 또는 api-contract.json 변경이 필요할 때:
300
312
 
301
313
  | 명령 | 설명 |
302
314
  |------|------|
315
+ | \`/goal\` | 회사 목표 설정 또는 변경 |
316
+ | \`/submission\` | 활성 goal 하위 추가 요구사항 |
317
+ | \`/hot-fix\` | 활성 goal 하위 긴급 수정 |
303
318
  | \`bash scripts/scan-project.sh\` | 프로젝트 구조 재스캔 |
304
319
  | \`.harness/progress.json\` | 현재 진행 상태 (기계 판독) |
305
320
  | \`.harness/actions/\` | 활성 스프린트 문서 |
@@ -332,6 +347,6 @@ echo ""
332
347
  echo "=== Initialization Complete ==="
333
348
  echo ""
334
349
  echo "Next steps:"
335
- echo " 1. AGENTS.md의 [?] 태그를 확인하고 Planner에게 분류를 요청하세요"
350
+ echo " 1. AGENTS.md의 [?] 태그를 확인하고 COO에게 분류를 요청하세요"
336
351
  echo " 2. 'Preserved Rules' 섹션에서 불필요한 규칙을 정리하세요"
337
- echo " 3. '하네스 엔지니어링 시작'으로 Dispatcher를 실행하세요"
352
+ echo " 3. /goal, /submission, 또는 /hot-fix로 CEO/CXX 흐름을 시작하세요"
@@ -1,114 +0,0 @@
1
- # AGENTS.md — {{PROJECT_NAME}}
2
- # walwal-harness v7.1 | Company Mode
3
- # 설치일: {{DATE}} | CLAUDE.md는 이 파일의 심볼릭 링크입니다.
4
-
5
- ---
6
-
7
- ## 1. 진입점
8
-
9
- Owner가 회사에 접근하는 명령은 두 개뿐이다. 그 외의 경로는 없다.
10
-
11
- | 명령 | 사용 시점 |
12
- |---|---|
13
- | `/goal` | 미션 설정, 수정, 추가 |
14
- | `/hot-fix` | 활성 goal과 독립된 긴급 수정 |
15
-
16
- `/ceo`, `/cto`, `/cqo`, `/coo`, `/cdo`, `/ops`, `/hiring`은 slash command가 아니다.
17
- 내부 라우팅은 agent/skill wiring으로만 처리한다.
18
-
19
- ---
20
-
21
- ## 2. 행동 전 확인
22
-
23
- 가정하지 않는다. 불명확한 것을 숨기지 않는다.
24
-
25
- - 구현 전 가정을 명시한다. 불확실하면 질문한다.
26
- - 여러 접근이 가능하면 모두 제시한다 — 조용히 선택하지 않는다.
27
- - 요청을 해결하는 최소한의 변경만 한다. 추측성 scope는 금지.
28
- - 불명확한 부분이 있으면 멈춘다. 무엇이 불명확한지 명시하고 질문한다.
29
-
30
- hot-fix: 가장 작은 올바른 패치만. 인접 코드를 "개선"하지 않는다.
31
- goal: CEO가 CXX에 라우팅하기 전에 검증 가능한 성공 기준을 정의한다.
32
-
33
- ---
34
-
35
- ## 3. Company 구조
36
-
37
- ```
38
- Owner
39
- └─ /goal 또는 /hot-fix
40
- └─ harness-ceo 오케스트레이터 — Owner의 유일한 접점
41
- ├─ harness-coo 리서치, 가설, 서비스 방향
42
- ├─ harness-cdo 브랜딩, UI/UX, 디자인 리뷰
43
- ├─ harness-cto 아키텍처, API, 플랫폼, 구현 총괄
44
- ├─ harness-cqo 품질 게이트, 회귀, archive, gotcha/convention 관리
45
- └─ harness-ops 빌드 모니터링, 로그 분석, 서비스 이벤트
46
- ```
47
-
48
- 각 CXX는:
49
- - **독립된 fresh session 컨텍스트**에서 실행된다 — CEO 세션과 메모리를 공유하지 않는다
50
- - 결정을 `.harness/documents/{mission_name}/{cxx}.md`에 기록한다
51
- - 모든 전문 작업을 hired worker에게 위임한다 — 직접 실행하지 않는다
52
- - 필요한 worker가 없으면 `harness-hiring`을 먼저 호출한다
53
-
54
- CEO는 worker 기록 없이 완료된 산출물을 포함한 CXX 보고서를 거부한다.
55
-
56
- ---
57
-
58
- ## 4. 미션 플로우
59
-
60
- ### Goal
61
-
62
- 1. CEO가 Owner 요청을 읽고 판단한다: 브레인스토밍 먼저, 또는 즉시 실행.
63
- 2. CEO가 관련 CXX에게만 범위를 한정한 질문을 전달한다.
64
- 3. 각 CXX가 worker를 고용하고, 위임하고, 결과를 수집하여 `{cxx}.md`에 기록한다.
65
- 4. CEO가 CXX 산출물을 종합하여 다음 CXX에 라우팅하거나 Owner에게 보고한다.
66
-
67
- **완료 기준:** `.harness/documents/{mission_name}/ceo.md`에 최종 Owner 보고가 존재한다.
68
-
69
- ### Hot Fix
70
-
71
- 1. CEO가 긴급 요청을 받고 즉시 CTO와 CQO를 소집한다.
72
- 2. CTO가 최소 패치 경로를 설계하고 구현 worker를 고용한다.
73
- 3. Worker가 구현한다. CTO가 worker 증거를 검증하고 `cto.md`를 작성한다.
74
- 4. CQO가 회귀 게이트를 실행한다. `.harness/gotchas/` 또는 `.harness/conventions/`에 교훈을 등록하고 `cqo.md`를 작성한다.
75
- 5. CQO 판정 **PASS** 이후에만 archive한다.
76
-
77
- **완료 기준:** `cto.md`, `cqo.md`, 그리고 최소 하나의 신규 gotcha 또는 convention 항목이 존재한다.
78
-
79
- 주의: harness 문서(ceo.md, cto.md, cqo.md, worker 보고서)에 대한 docmeta skip 판단은 미션 프로토콜 단계를 건너뛸 권한을 부여하지 않는다. 이 파일들은 분석 산출물이 아니라 미션 기록이다.
80
-
81
- ---
82
-
83
- ## 5. 하네스 런타임
84
-
85
- | 경로 | 역할 |
86
- |---|---|
87
- | `.harness/documents/{mission}/` | 미션별 CXX 결정 기록 및 worker 보고서 |
88
- | `.harness/conventions/` | 지속 규칙 (CQO가 작성, 미션을 넘어 유지) |
89
- | `.harness/gotchas/` | 재발 방지 기록 (CQO가 hot-fix마다 작성) |
90
- | `.harness/memories/` | 장기 공유 컨텍스트 |
91
- | `.harness/shared/HR-Resource/` | 채용 가능한 worker skill pool |
92
- | `.harness/archive/` | CQO 승인 완료 미션 (불변) |
93
- | `.harness/logs/YYYY-MM-DD/` | OPS 예외 로그 (비정상 케이스만) |
94
-
95
- `.harness/`는 미션 상태 저장소다. 빌드 산출물이 아니다. 삭제하지 않는다.
96
-
97
- ---
98
-
99
- ## 6. 금지 규칙
100
-
101
- 1. **`{mission}/cto.md` 없이 소스 코드 편집 금지** — CTO의 범위 승인이 있어야 소스 파일을 수정할 수 있다.
102
- 2. **CXX 사칭 금지** — 현재 모델이 CEO/CTO/CQO를 인라인으로 대행하지 않는다. 설치된 harness skill을 fresh session에서 사용한다.
103
- 3. **이름 없는 worker 금지** — 모든 전문 작업은 `harness-hiring` → `harness-resource-manager`를 거친다.
104
- 4. **CQO 판정 없이 archive 금지** — 명시적 PASS가 담긴 `{mission}/cqo.md`가 존재해야 한다.
105
- 5. **gotcha 등록 생략 금지** — 모든 hot-fix는 `.harness/gotchas/` 또는 `.harness/conventions/`에 최소 하나의 항목을 만든다.
106
- 6. **미션 중 이 파일 편집 금지** — AGENTS.md를 수정하려면 별도 `/goal`을 제출한다.
107
-
108
- ---
109
-
110
- ## 7. 프로젝트 컨텍스트
111
-
112
- - **기술 스택**: {{TECH_STACK}}
113
- - **프로젝트 구조**: {{PROJECT_STRUCTURE}}
114
- - **하네스 설치일**: {{DATE}}