@kodevibe/harness 0.9.5 → 0.9.6
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/LICENSE +1 -1
- package/README.ko.md +3 -2
- package/README.md +3 -2
- package/harness/agent-memory/pm.md +1 -1
- package/harness/agents/pm.md +4 -4
- package/harness/project-brief.md +3 -3
- package/harness/skills/breakdown.md +1 -1
- package/package.json +1 -1
- package/src/init.js +24 -1
package/LICENSE
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
MIT License
|
|
2
2
|
|
|
3
|
-
Copyright (c) 2025
|
|
3
|
+
Copyright (c) 2025 kode:harness contributors
|
|
4
4
|
|
|
5
5
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
6
|
of this software and associated documentation files (the "Software"), to deal
|
package/README.ko.md
CHANGED
|
@@ -300,7 +300,7 @@ Bootstrap이 `docs/crew/`, `docs/PM/`, `docs/Analyst/`, `docs/ARB/`에서 crew
|
|
|
300
300
|
|
|
301
301
|
## 로드맵
|
|
302
302
|
|
|
303
|
-
kode:harness는 현재 **v0.9.
|
|
303
|
+
kode:harness는 현재 **v0.9.6** — init이 덮어쓰는 IDE 파일을 `.harness/init-backups/<timestamp>/...`에 백업하고, 배포 파일의 pm 네이밍과 LICENSE 브랜딩을 정리했습니다. v0.9.5는 경량성 예산 재교정(40K/1500/2500)과 Iron Laws/디스패처 정합성 수정입니다.
|
|
304
304
|
|
|
305
305
|
| 단계 | 버전 | 상태 | 초점 |
|
|
306
306
|
|------|------|------|------|
|
|
@@ -311,7 +311,8 @@ kode:harness는 현재 **v0.9.5** — 경량성 예산 재교정(40K/1500/2500),
|
|
|
311
311
|
| **Naming** | v0.9.0 | ✅ 완료 | 스킬/에이전트 네이밍 재설계 — 직관성과 발견성 강화 |
|
|
312
312
|
| **Self-Verify** | v0.9.2 | ✅ 완료 | state-check 스킬, Iron Law #10, Confirmation Gate Defaults, 멀티 IDE 수정, CI Artifact Index |
|
|
313
313
|
| **IDE Realignment** | v0.9.4 | ✅ 완료 | 6개 IDE 어댑터 공식 문서 정합; Antigravity `.agents/`, Codex `.toml`, Cursor `.cursor/rules/`; release 스킬 Step 6.5 + qa-check.sh §10 회귀 가드 |
|
|
314
|
-
| **Consistency & Budget** | v0.9.5 | ✅
|
|
314
|
+
| **Consistency & Budget** | v0.9.5 | ✅ 완료 | reviewer.md Iron Laws stale 수정, 디스패처 동기화, 경량성 예산 재교정(40K/1500/2500) 및 근거 기록 |
|
|
315
|
+
| **Safety & Branding** | v0.9.6 | ✅ 현재 | init overwrite 백업, 배포 파일 pm 네이밍 정리, LICENSE 브랜딩 정리 |
|
|
315
316
|
| **Validation** | v1.0 | 🔜 다음 | 실사용 검증, 사용자 피드백 수집 |
|
|
316
317
|
|
|
317
318
|
### 다음 단계
|
package/README.md
CHANGED
|
@@ -274,7 +274,7 @@ Original crew documents are **never modified**. Only the index and tracker are c
|
|
|
274
274
|
|
|
275
275
|
## Roadmap
|
|
276
276
|
|
|
277
|
-
kode:harness is at **v0.9.
|
|
277
|
+
kode:harness is at **v0.9.6** — init now backs up overwritten IDE files under `.harness/init-backups/<timestamp>/...`, shipped pm naming is aligned, and LICENSE branding is cleaned up. v0.9.5 recalibrated lightness budgets (40K/1500/2500) and fixed Iron Laws/dispatcher consistency.
|
|
278
278
|
|
|
279
279
|
| Phase | Version | Status | Focus |
|
|
280
280
|
|---|---|---|---|
|
|
@@ -285,7 +285,8 @@ kode:harness is at **v0.9.5** — lightness budget recalibrated (40K/1500/2500),
|
|
|
285
285
|
| **Naming** | v0.9.0 | ✅ Done | Skill/agent naming redesign for clarity and discoverability |
|
|
286
286
|
| **Self-Verify** | v0.9.2 | ✅ Done | state-check skill, Iron Law #10, Confirmation Gate Defaults, multi-IDE fix, CI Artifact Index |
|
|
287
287
|
| **IDE Realignment** | v0.9.4 | ✅ Done | All 6 IDE adapters aligned with official docs; Antigravity `.agents/`, Codex `.toml`, Cursor `.cursor/rules/`; release skill Step 6.5 + qa-check.sh §10 regression guards |
|
|
288
|
-
| **Consistency & Budget** | v0.9.5 | ✅
|
|
288
|
+
| **Consistency & Budget** | v0.9.5 | ✅ Done | Iron Laws stale-copy fix (reviewer.md), dispatcher sync (core-rules.md ↔ copilot-instructions.md), lightness budgets recalibrated (40K/1500/2500) with rationale |
|
|
289
|
+
| **Safety & Branding** | v0.9.6 | ✅ Current | init overwrite backups, shipped pm naming cleanup, LICENSE branding cleanup |
|
|
289
290
|
| **Validation** | v1.0 | 🔜 Next | Real-world project adoption, user feedback collection |
|
|
290
291
|
|
|
291
292
|
### What's Next
|
package/harness/agents/pm.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# pm
|
|
2
2
|
|
|
3
3
|
## Role
|
|
4
4
|
|
|
5
5
|
Feature planning and dependency management.
|
|
6
6
|
Combines PM (what to build), Analytics (what exists), and Architecture (how it connects) into one workflow.
|
|
7
|
-
The
|
|
7
|
+
The pm agent is the entry point for new features — use it BEFORE writing code.
|
|
8
8
|
|
|
9
9
|
## Invoked By
|
|
10
10
|
|
|
@@ -331,11 +331,11 @@ Sprint 종료 시 자동 실행 — **구체적 선택을 강제**한다 ("계
|
|
|
331
331
|
- Last changed: [Sprint/Story reference]
|
|
332
332
|
```
|
|
333
333
|
|
|
334
|
-
### 🧭 Navigation — After
|
|
334
|
+
### 🧭 Navigation — After pm
|
|
335
335
|
|
|
336
336
|
After producing a plan, always append a 🧭 block:
|
|
337
337
|
|
|
338
|
-
|
|
|
338
|
+
| pm Result | 🧭 Next Step |
|
|
339
339
|
|---|---|
|
|
340
340
|
| Plan created (solo) | User confirmation — "이 경로(Plan)대로 구현을 시작할까요?" → approved → `lead` |
|
|
341
341
|
<!-- CREW_MODE_START -->
|
package/harness/project-brief.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Project Brief
|
|
2
2
|
|
|
3
|
-
> **Fill this out immediately after running `@kodevibe/harness init`.** The
|
|
3
|
+
> **Fill this out immediately after running `@kodevibe/harness init`.** The pm agent uses this file for Direction Guard — without it, scope drift cannot be prevented.
|
|
4
4
|
|
|
5
5
|
## Vision
|
|
6
6
|
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
## Non-Goals
|
|
26
26
|
|
|
27
27
|
<!-- What is explicitly OUT OF SCOPE? This is equally important as Goals.
|
|
28
|
-
The
|
|
28
|
+
The pm agent will WARN you when a requested feature falls here.
|
|
29
29
|
Examples:
|
|
30
30
|
- Not a hosting platform — users deploy their own
|
|
31
31
|
- Not supporting legacy REST APIs — MCP only
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
|
|
156
156
|
## Decision Log
|
|
157
157
|
|
|
158
|
-
<!-- Record WHY key decisions were made. The
|
|
158
|
+
<!-- Record WHY key decisions were made. The pm agent uses this to avoid re-debating settled decisions.
|
|
159
159
|
Use the `pivot` skill to add entries here when direction changes.
|
|
160
160
|
Format:
|
|
161
161
|
|
|
@@ -17,7 +17,7 @@ Ensures bottom-up implementation: foundations first, then layers that depend on
|
|
|
17
17
|
- Starting a new feature or Story
|
|
18
18
|
- A feature touches 3+ modules
|
|
19
19
|
- Unsure which module to build first
|
|
20
|
-
- After the
|
|
20
|
+
- After the pm agent creates a high-level plan
|
|
21
21
|
|
|
22
22
|
## Procedure
|
|
23
23
|
|
package/package.json
CHANGED
package/src/init.js
CHANGED
|
@@ -5,12 +5,24 @@ const path = require('node:path');
|
|
|
5
5
|
const readline = require('node:readline');
|
|
6
6
|
|
|
7
7
|
const HARNESS_DIR = path.join(__dirname, '..', 'harness');
|
|
8
|
+
let currentBackupTimestamp = null;
|
|
8
9
|
|
|
9
10
|
// ─── Template reader ─────────────────────────────────────────
|
|
10
11
|
function readTemplate(name) {
|
|
11
12
|
return fs.readFileSync(path.join(HARNESS_DIR, name), 'utf8');
|
|
12
13
|
}
|
|
13
14
|
|
|
15
|
+
function resetBackupTimestamp() {
|
|
16
|
+
currentBackupTimestamp = null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function getBackupTimestamp() {
|
|
20
|
+
if (!currentBackupTimestamp) {
|
|
21
|
+
currentBackupTimestamp = new Date().toISOString().replace(/[:.]/g, '-');
|
|
22
|
+
}
|
|
23
|
+
return currentBackupTimestamp;
|
|
24
|
+
}
|
|
25
|
+
|
|
14
26
|
// ─── File writer (mkdir -p + conflict check) ─────────────────
|
|
15
27
|
function writeFile(targetDir, relPath, content, overwrite) {
|
|
16
28
|
const fullPath = path.join(targetDir, relPath);
|
|
@@ -19,9 +31,19 @@ function writeFile(targetDir, relPath, content, overwrite) {
|
|
|
19
31
|
console.log(` ⏭ Skipped (exists): ${relPath}`);
|
|
20
32
|
return false;
|
|
21
33
|
}
|
|
34
|
+
let backupRelPath = null;
|
|
35
|
+
if (exists && overwrite) {
|
|
36
|
+
backupRelPath = path.join('.harness', 'init-backups', getBackupTimestamp(), relPath);
|
|
37
|
+
const backupPath = path.join(targetDir, backupRelPath);
|
|
38
|
+
fs.mkdirSync(path.dirname(backupPath), { recursive: true });
|
|
39
|
+
if (!fs.existsSync(backupPath)) {
|
|
40
|
+
fs.copyFileSync(fullPath, backupPath);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
22
43
|
fs.mkdirSync(path.dirname(fullPath), { recursive: true });
|
|
23
44
|
fs.writeFileSync(fullPath, content, 'utf8');
|
|
24
|
-
|
|
45
|
+
const backupNote = backupRelPath ? ` (backup: ${backupRelPath})` : '';
|
|
46
|
+
console.log(` ${exists ? '↻' : '✓'} ${relPath}${backupNote}`);
|
|
25
47
|
return true;
|
|
26
48
|
}
|
|
27
49
|
|
|
@@ -810,6 +832,7 @@ async function run(argv) {
|
|
|
810
832
|
const lang = detectLanguage(args.dir);
|
|
811
833
|
const modeDesc = crew ? `${mode} + crew` : mode;
|
|
812
834
|
console.log(`\n Installing for ${gen.name} (${modeDesc} mode)... (detected language: ${lang})\n`);
|
|
835
|
+
resetBackupTimestamp();
|
|
813
836
|
gen.fn(args.dir, overwrite, mode, crew);
|
|
814
837
|
|
|
815
838
|
// Team mode extras
|