@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.
- package/CHANGELOG.md +65 -0
- package/commands/harness-solo.md +20 -20
- package/commands/harness-team.md +1 -1
- package/gotchas/coo-developer.md +13 -0
- package/gotchas/documentationer.md +13 -0
- package/package.json +1 -1
- package/scripts/conductor-tick.sh +416 -0
- package/scripts/harness-archive.sh +123 -0
- package/scripts/harness-dashboard-up.sh +72 -0
- package/scripts/harness-dashboard.sh +509 -0
- package/scripts/harness-goal-init.sh +72 -0
- package/scripts/harness-goal-show.sh +37 -0
- package/scripts/harness-gotcha-memory.sh +348 -0
- package/scripts/harness-gotcha-register.sh +393 -0
- package/scripts/harness-meeting-doc.sh +153 -0
- package/scripts/harness-monitor.sh +398 -0
- package/scripts/harness-next.sh +577 -0
- package/scripts/harness-progress-set.sh +41 -0
- package/scripts/harness-prompt-history.sh +164 -0
- package/scripts/harness-queue-manager.sh +694 -0
- package/scripts/harness-session-start.sh +140 -0
- package/scripts/harness-statusline.sh +139 -0
- package/scripts/harness-task-session.sh +48 -0
- package/scripts/harness-tmux.sh +372 -0
- package/scripts/harness-user-prompt-submit.sh +123 -0
- package/scripts/init-agents-md.sh +337 -0
- package/scripts/init-ref-docs.sh +262 -0
- package/scripts/lib/harness-audit.sh +113 -0
- package/scripts/lib/harness-guardrail.sh +148 -0
- package/scripts/lib/harness-keywait.sh +57 -0
- package/scripts/lib/harness-render-progress.sh +346 -0
- package/scripts/scan-project.sh +367 -0
- package/skills/brainstorming/SKILL.md +4 -4
- package/skills/conductor/SKILL.md +19 -16
- package/skills/coo-developer/SKILL.md +42 -0
- package/skills/cqo/SKILL.md +7 -0
- package/skills/cto/SKILL.md +7 -0
- package/skills/dispatcher/SKILL.md +17 -28
- package/skills/dispatcher/persona-ceo.md +2 -1
- package/skills/documentationer/SKILL.md +46 -0
- package/skills/evaluator-code-quality/SKILL.md +1 -1
- package/skills/evaluator-functional/SKILL.md +1 -1
- package/skills/evaluator-visual/SKILL.md +1 -1
- package/skills/generator-backend/SKILL.md +1 -1
- package/skills/generator-frontend/SKILL.md +1 -1
- package/skills/meeting-manager/SKILL.md +34 -1
- package/skills/planner/SKILL.md +23 -9
- package/skills/planner/persona-coo-hr.md +17 -0
- 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}"
|