@walwal-harness/cli 6.0.5 → 6.1.1

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 (49) hide show
  1. package/CHANGELOG.md +65 -0
  2. package/commands/harness-solo.md +20 -20
  3. package/commands/harness-team.md +1 -1
  4. package/gotchas/coo-developer.md +13 -0
  5. package/gotchas/documentationer.md +13 -0
  6. package/package.json +1 -1
  7. package/scripts/conductor-tick.sh +416 -0
  8. package/scripts/harness-archive.sh +123 -0
  9. package/scripts/harness-dashboard-up.sh +72 -0
  10. package/scripts/harness-dashboard.sh +509 -0
  11. package/scripts/harness-goal-init.sh +72 -0
  12. package/scripts/harness-goal-show.sh +37 -0
  13. package/scripts/harness-gotcha-memory.sh +348 -0
  14. package/scripts/harness-gotcha-register.sh +393 -0
  15. package/scripts/harness-meeting-doc.sh +153 -0
  16. package/scripts/harness-monitor.sh +398 -0
  17. package/scripts/harness-next.sh +577 -0
  18. package/scripts/harness-progress-set.sh +41 -0
  19. package/scripts/harness-prompt-history.sh +164 -0
  20. package/scripts/harness-queue-manager.sh +694 -0
  21. package/scripts/harness-session-start.sh +140 -0
  22. package/scripts/harness-statusline.sh +139 -0
  23. package/scripts/harness-task-session.sh +48 -0
  24. package/scripts/harness-tmux.sh +372 -0
  25. package/scripts/harness-user-prompt-submit.sh +123 -0
  26. package/scripts/init-agents-md.sh +337 -0
  27. package/scripts/init-ref-docs.sh +262 -0
  28. package/scripts/lib/harness-audit.sh +113 -0
  29. package/scripts/lib/harness-guardrail.sh +148 -0
  30. package/scripts/lib/harness-keywait.sh +57 -0
  31. package/scripts/lib/harness-render-progress.sh +346 -0
  32. package/scripts/scan-project.sh +367 -0
  33. package/skills/brainstorming/SKILL.md +4 -4
  34. package/skills/conductor/SKILL.md +19 -16
  35. package/skills/coo-developer/SKILL.md +42 -0
  36. package/skills/cqo/SKILL.md +7 -0
  37. package/skills/cto/SKILL.md +7 -0
  38. package/skills/dispatcher/SKILL.md +17 -28
  39. package/skills/dispatcher/persona-ceo.md +2 -1
  40. package/skills/documentationer/SKILL.md +46 -0
  41. package/skills/evaluator-code-quality/SKILL.md +1 -1
  42. package/skills/evaluator-functional/SKILL.md +1 -1
  43. package/skills/evaluator-visual/SKILL.md +1 -1
  44. package/skills/generator-backend/SKILL.md +1 -1
  45. package/skills/generator-frontend/SKILL.md +1 -1
  46. package/skills/meeting-manager/SKILL.md +34 -1
  47. package/skills/planner/SKILL.md +23 -9
  48. package/skills/planner/persona-coo-hr.md +17 -0
  49. package/skills/service-ops/SKILL.md +19 -4
@@ -0,0 +1,123 @@
1
+ #!/bin/bash
2
+ # harness-archive.sh — 스프린트 종료 시 자동 아카이빙
3
+ #
4
+ # 동작:
5
+ # 1. .harness/actions/ 의 스프린트 산출물을 .harness/archive/D-NNN/S-NNN/ 로 이동
6
+ # 2. progress.json 의 sprint 상태를 초기화 (신규 dispatch 준비)
7
+ # 3. dispatch.id 가 없으면 counter++ 로 새 dispatch 시작
8
+ #
9
+ # 유지되는 파일 (이동하지 않음):
10
+ # - .harness/gotchas/**, .harness/conventions/**, .harness/ref/**
11
+ # - .harness/config.json, .harness/memory.md
12
+ # - .harness/progress.json (초기화만)
13
+ #
14
+ # 호출 주체: harness-next.sh (next_agent="archive" 도달 시 자동)
15
+
16
+ set -e
17
+
18
+ SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
19
+ source "$SCRIPT_DIR/lib/harness-render-progress.sh" 2>/dev/null || true
20
+
21
+ PROJECT_ROOT="${1:-.}"
22
+ PROJECT_ROOT="$(cd "$PROJECT_ROOT" && pwd)"
23
+
24
+ PROGRESS="$PROJECT_ROOT/.harness/progress.json"
25
+ ACTIONS_DIR="$PROJECT_ROOT/.harness/actions"
26
+ ARCHIVE_ROOT="$PROJECT_ROOT/.harness/archive"
27
+
28
+ if [ ! -f "$PROGRESS" ]; then
29
+ echo "[archive] ERROR: progress.json not found" >&2
30
+ exit 1
31
+ fi
32
+
33
+ command -v jq >/dev/null 2>&1 || { echo "[archive] ERROR: jq required" >&2; exit 1; }
34
+
35
+ # ── Read current dispatch/sprint numbers ──
36
+ dispatch_counter=$(jq -r '.dispatch.counter // 0' "$PROGRESS")
37
+ dispatch_id=$(jq -r '.dispatch.id // empty' "$PROGRESS")
38
+ sprint_num=$(jq -r '.sprint.number // 0' "$PROGRESS")
39
+
40
+ # Ensure dispatch id exists (fallback for legacy progress.json without dispatch)
41
+ if [ -z "$dispatch_id" ] || [ "$dispatch_id" = "null" ]; then
42
+ if [ "$dispatch_counter" -lt 1 ]; then
43
+ dispatch_counter=1
44
+ fi
45
+ dispatch_id=$(printf 'D-%03d' "$dispatch_counter")
46
+ fi
47
+
48
+ sprint_id=$(printf 'S-%03d' "$sprint_num")
49
+ target_dir="$ARCHIVE_ROOT/$dispatch_id/$sprint_id"
50
+
51
+ echo ""
52
+ echo " ── Archive ────────────────────────────"
53
+ echo " Dispatch : $dispatch_id"
54
+ echo " Sprint : $sprint_id"
55
+ echo " Target : ${target_dir#$PROJECT_ROOT/}"
56
+
57
+ # ── Move actions/ contents into archive ──
58
+ if [ -d "$ACTIONS_DIR" ] && [ "$(ls -A "$ACTIONS_DIR" 2>/dev/null)" ]; then
59
+ mkdir -p "$target_dir"
60
+ moved=0
61
+ for f in "$ACTIONS_DIR"/*; do
62
+ [ -e "$f" ] || continue
63
+ name="$(basename "$f")"
64
+ if [ -e "$target_dir/$name" ]; then
65
+ # Collision — suffix with timestamp to avoid overwrite
66
+ ts=$(date +%Y%m%d-%H%M%S)
67
+ mv "$f" "$target_dir/${name%.}.${ts}"
68
+ else
69
+ mv "$f" "$target_dir/"
70
+ fi
71
+ moved=$((moved + 1))
72
+ done
73
+ echo " Moved : $moved file(s)"
74
+ else
75
+ echo " Moved : 0 file(s) (actions/ empty)"
76
+ fi
77
+
78
+ # ── Reset progress.json for next dispatch ──
79
+ # - sprint → init
80
+ # - agents → cleared
81
+ # - artifacts → pending
82
+ # - dispatch.id cleared (next dispatcher run will allocate new D-NNN)
83
+ # - failure → cleared
84
+ jq --arg now "$(date -u +%Y-%m-%dT%H:%M:%SZ)" '
85
+ .pipeline = null
86
+ | .dispatch.id = null
87
+ | .sprint = { number: 0, status: "init", retry_count: 0 }
88
+ | .current_agent = null
89
+ | .agent_status = "pending"
90
+ | .completed_agents = []
91
+ | .next_agent = "dispatcher"
92
+ | .workflow = { stage: "goal-intake", last_transition: null, loop_count: 0, last_reason: null }
93
+ | .task_sessions.current = { agent: null, id: null, path: null, source: null }
94
+ | .failure = { agent: null, location: null, message: null, retry_target: null }
95
+ | .meetings.active = []
96
+ | .meetings.current_id = null
97
+ | .meetings.current_record_path = null
98
+ | .meetings.requested_type = null
99
+ | .meetings.requested_reason = null
100
+ | .meetings.last_type = null
101
+ | .meetings.last_reason = null
102
+ | .meetings.last_decision = null
103
+ | .meetings.decision = { owner: null, action_type: null, rationale: null, evidence: [], drift_classification: null, source_path: null }
104
+ | .service_ops.requested_mode = null
105
+ | .service_ops.drift_classification = null
106
+ | .service_ops.evidence = []
107
+ | (.artifacts // {}) as $a
108
+ | .artifacts = ($a | with_entries(
109
+ if (.value | type) == "object"
110
+ then .value = { status: "pending", updated_by: null, updated_at: null }
111
+ else .
112
+ end))
113
+ | .updated_at = $now
114
+ ' "$PROGRESS" > "${PROGRESS}.tmp" && mv "${PROGRESS}.tmp" "$PROGRESS"
115
+
116
+ # ── Clear handoff so next session starts fresh ──
117
+ HANDOFF="$PROJECT_ROOT/.harness/handoff.json"
118
+ echo '{}' > "$HANDOFF"
119
+
120
+ echo " Status : archived, progress reset"
121
+ echo ""
122
+ echo " ✓ 다음 요청은 새로운 dispatch 로 시작합니다."
123
+ echo ""
@@ -0,0 +1,72 @@
1
+ #!/usr/bin/env bash
2
+ # walwal-harness — Brick Office dashboard launcher
3
+ #
4
+ # 처음 쓰는 사용자도 한 줄로 대시보드를 띄워볼 수 있게 만든 helper.
5
+ # walwal-harness CLI 패키지에는 R3F + Next.js 무게 때문에 dashboard 가 미포함이고,
6
+ # 본 스크립트가 git sparse-checkout 으로 apps/harness-dashboard/ 만 가져와서
7
+ # 사용자 프로젝트 외부 (~/.walwal-harness/dashboard) 에 격리 설치 후 dev 실행한다.
8
+ #
9
+ # Usage:
10
+ # bash scripts/harness-dashboard-up.sh # install + dev (port 3001)
11
+ # bash scripts/harness-dashboard-up.sh --port 3050 # override port
12
+ # HARNESS_ROOT=/path/to/project bash ... # explicit harness root
13
+ set -euo pipefail
14
+
15
+ REPO_URL="${WALWAL_HARNESS_REPO:-https://github.com/30eggis/walwal-harness.git}"
16
+ DASHBOARD_PATH="apps/harness-dashboard"
17
+ LOCAL_DIR="${HOME}/.walwal-harness/dashboard"
18
+ PORT="${PORT:-3001}"
19
+
20
+ while [[ $# -gt 0 ]]; do
21
+ case "$1" in
22
+ --port) PORT="$2"; shift 2 ;;
23
+ --reinstall) rm -rf "$LOCAL_DIR"; shift ;;
24
+ --help|-h)
25
+ sed -n '2,16p' "$0"
26
+ exit 0 ;;
27
+ *) echo "[brick-office] unknown arg: $1" >&2; exit 2 ;;
28
+ esac
29
+ done
30
+
31
+ if [[ -z "${HARNESS_ROOT:-}" ]]; then
32
+ HARNESS_ROOT="$(pwd)"
33
+ fi
34
+ if [[ ! -d "${HARNESS_ROOT}/.harness" ]]; then
35
+ echo "[brick-office] FAIL: ${HARNESS_ROOT} 에 .harness/ 가 없습니다."
36
+ echo " 먼저 'npx walwal-harness' 로 초기화하세요."
37
+ exit 3
38
+ fi
39
+
40
+ echo "[brick-office] HARNESS_ROOT = ${HARNESS_ROOT}"
41
+ echo "[brick-office] dashboard 격리 경로 = ${LOCAL_DIR}"
42
+
43
+ if [[ ! -d "${LOCAL_DIR}/${DASHBOARD_PATH}" ]]; then
44
+ echo "[brick-office] 첫 실행 — git sparse-checkout 으로 dashboard 만 가져옵니다 (~5MB)."
45
+ mkdir -p "${LOCAL_DIR}"
46
+ cd "${LOCAL_DIR}"
47
+ git init -q
48
+ git remote add origin "${REPO_URL}" 2>/dev/null || true
49
+ git config core.sparseCheckout true
50
+ echo "${DASHBOARD_PATH}/" > .git/info/sparse-checkout
51
+ git fetch --depth=1 origin main -q
52
+ git checkout main -q
53
+ echo "[brick-office] 다운로드 완료."
54
+ fi
55
+
56
+ cd "${LOCAL_DIR}/${DASHBOARD_PATH}"
57
+
58
+ if [[ ! -d node_modules ]]; then
59
+ echo "[brick-office] npm install (한 번만 실행, ~30s)..."
60
+ npm install --no-audit --no-fund --loglevel=error
61
+ fi
62
+
63
+ echo ""
64
+ echo "╔══════════════════════════════════════════════════════════╗"
65
+ echo "║ Brick Office — http://localhost:${PORT}"
66
+ echo "║ ║"
67
+ echo "║ HARNESS_ROOT 이 가리키는 프로젝트의 .harness/ 상태를 ║"
68
+ echo "║ 실시간 (SSE) 시각화합니다. Ctrl+C 로 종료. ║"
69
+ echo "╚══════════════════════════════════════════════════════════╝"
70
+ echo ""
71
+
72
+ HARNESS_ROOT="${HARNESS_ROOT}" npm run dev:dashboard -- -p "${PORT}"