@kienntpixon/dieu-phoi 0.7.1 → 0.7.2

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 CHANGED
@@ -1,5 +1,26 @@
1
1
  # Changelog — @kienntpixon/dieu-phoi
2
2
 
3
+ ## 0.7.2 (2026-11-05)
4
+
5
+ Đề xuất core K1–K7 của retro 2026-11-05 (run ipmwxitv). `CORE_VERSION` 0.7.2; đi cùng skill 1.6.2.
6
+ **Thứ tự phát hành:** deploy `sheet/Code.gs` bản mới (cột `source`, K4) TRƯỚC, rồi `npm i -g` + `dieu-phoi setup`.
7
+ **Sink cần deploy:** Code.gs cũ làm rơi cột `source` nên `stats` ở sink vẫn đếm override ngầm (implicit) như lựa chọn người dùng, lệch CLI tới khi dán lại.
8
+
9
+ - **K1 — `accept` không gộp knowledge lặng lẽ:** tìm delta qua `dispatch.run` + quét tên file, nhận `-h<n>`, ghi event `knowledge_merge` (chỉ ở máy); `state` tách nhóm "accepted-unmerged".
10
+ - **K2 — agent mồ côi:** `complete.ended_without_status`; `state`/SessionStart liệt kê dispatch không có STATUS.
11
+ - **K3 — gate `verify-orphan`:** PreToolUse(Agent) từ chối `role=verify` cho task chưa có dispatch exec và không nằm trong kế hoạch đã duyệt (`|batch` được miễn).
12
+ - **K4 — override ngầm:** exec không có bản ghi `choose` → nhắc chạy `choose`; tier giao khác `choose_tier` mà chưa có override → ghi override `source=implicit`. Không phải lựa chọn người dùng: `aggregate` tách riêng, không vào `overridePrior`/`approved_tier`. **Sink:** `Code.gs` thêm cột `source`, `summarizeOverrides_` bỏ implicit (parity + simulate kiểm).
13
+ - **K5 — trần phiên cứng (`session-cap`):** từ chối exec mở root mới khi context điều phối > 800000 token hoặc ≥ 10 lần nén; lượt tiếp nối (root đã có dispatch) qua; cờ `|session_ok` trong thẻ cho qua.
14
+ - **K6 — bí danh nhãn:** `test-run`/`test-verify`/`device-qa` → `test-write`; `git-ops`/`release-build` → `mechanical-edit`; `read-scan` → `search`.
15
+ - **K7 — `prune` giữ delta chưa gộp** (hash không nằm trong `applied` của kho nào) và luôn giữ `contract-r*`, `steps-r*`, `plan*`, `handoff-*`; báo `keep_deltas` trong dry-run/`--json`.
16
+ - **Fast-mode:** `MODE_ASK_LINE` không còn bảo hỏi mode ngay lượt đầu; `plan-table` in "Mode: HỎI …" chỉ khi root chưa có mode và có ≥ 4 bước s≤6, root đã có mode thì in mode đó, còn lại "normal (không hỏi)".
17
+ - **s11 — đếm nén trên transcript lớn:** transcript > 32 MB không cache từng đặt `compactions = null` cả phiên; nay đếm `compact_boundary` bằng quét byte trên [0, offset) (cache cũ null được probe lại, không mất `cum_usd`). `ORCH_NEW_SESSION_TOKENS` 400k → **250k** (chi phí điều phối mỗi lượt nhảy ở ~250k); trần K5 vẫn 800k/10, test `ctx-compact-count` khoá bất biến ngưỡng nhắc < trần.
18
+ - **Profile (CLI):** `profile scan` (quét secret/dữ liệu máy, exit 2 nếu có, không in giá trị) và `profile publish --to <repo>/skill/profile` (chép bản tuyển đã cài, bỏ dòng riêng máy, LF, scan trước khi ghi); `profile apply` ghi `.lessons.curated.md`.
19
+ - **Gói npm mang lessons đã tuyển; setup gộp dòng mới:** `prepack` (`scripts/pack-profile.cjs`) quét rồi chép `skill/profile/lessons.md` + `unity-lanes.md` vào `cli/profile/` (không kèm `profile.json`; `/cli/profile/` nằm trong .gitignore, nguồn vẫn là `skill/profile`). `setup` gộp vào profile đã cài: dòng bài học chưa có → nối cuối `lessons.md` và cộng dồn `.lessons.published.md`; dòng cũ và dòng riêng của máy không đụng tới; `unity-lanes.md` đã có thì không ghi đè, chỉ báo số dòng khác; chạy lại không thêm gì. `setup --dry-run` chỉ báo số dòng sẽ thêm, không ghi hook, settings, agent hay config.
20
+ - **s15 — gate task nền:** SubagentStop chặn MỘT lần khi transcript của agent `dp-*` còn Bash/PowerShell `run_in_background` hoặc Monitor chưa dừng (agent phải `TaskStop` đúng id của mình); `stop_hook_active` đã bật thì không chặn lần hai. Cờ tắt: config `block_leftover_tasks` (mặc định true). Agent nội bộ không bị chặn.
21
+ - **s16 — quét process con (chỉ báo):** SubagentStop ghi sự kiện `leftover` (chỉ ở máy) khi còn tiến trình con được tạo sau lúc dispatch và không phải claude.exe/cbm. Kill chỉ khi config `kill_leftovers: true` **và** không có agent dp- nào khác đang chạy trong khoảng sống của agent; mặc định tắt — chỉ bật khi không có subagent không-dp chạy cùng máy. `doctor`: mục `orphan-processes` cảnh báo claude.exe/cbm mồ côi > 6 giờ (không tự kill, gợi ý `Stop-Process`); `state`: dòng `orphan_procs`.
22
+ - **s17 — worktree có dấu:** `dieu-phoi wt add --task <id> [--repo R] [--path D] [--branch B]` tạo `<cha repo>/<tên repo>-wt-<id>` trên nhánh `dp/<id>` và ghi dấu `dieu-phoi.json` trong git-dir (không làm worktree dirty). `verdict --task <id> accept` của người dùng (kể cả `--root`) và `discard` gỡ worktree CÓ DẤU của đúng task nếu sạch (không `--force`, nhánh giữ nguyên); còn thay đổi chưa commit thì giữ và báo; reject không gỡ. Worktree không dấu không bị đụng. `dieu-phoi wt clean [--repo R] [--yes]`: dry-run mặc định, liệt kê worktree có dấu mà task đã nghiệm thu / bị loại hoặc thư mục đã mất; `--yes` mới gỡ (thư mục mất → chỉ bỏ đăng ký của worktree đó). Lưu ý: `git worktree remove` xoá cả file ignored (vd. `node_modules`) trong worktree đã sạch.
23
+
3
24
  ## 0.7.1 (2026-10-26)
4
25
 
5
26
  Đề xuất core C1–C6 của retro 2026-10-26 (run 4b3mohix, task fgcq8dl9). `CORE_VERSION` 0.7.1; đi cùng skill 1.6.1.
package/README.md CHANGED
@@ -44,6 +44,8 @@ khác).
44
44
 
45
45
  `CLAUDE_CONFIG_DIR` được tôn trọng (thay cho `~/.claude`). Thử trên thư mục tạm: thêm `--claude-dir <thư mục>` vào mọi lệnh.
46
46
 
47
+ Gói npm mang sẵn bài học đã tuyển (`lessons.md`, `unity-lanes.md`); `dieu-phoi setup` chỉ nối dòng mới vào profile đã cài và giữ nguyên dòng riêng của máy. `dieu-phoi setup --dry-run` chỉ báo số dòng sẽ thêm.
48
+
47
49
  ## Lệnh
48
50
 
49
51
  | Lệnh | Việc |
@@ -70,6 +72,7 @@ khác).
70
72
  | `knowledge merge --run <id> --task a,b [--untagged]` | (0.6.0) chỉ gộp `knowledge-delta-<task_id>[-r<n>].md` của các task đó (`--untagged`: thêm file không mang task_id) — bước `verdict … accept` tự gọi |
71
73
  | `knowledge bootstrap [--repo R] [--children "pff-*,fff-*"] [--json]` | (0.6.0) **chỉ đọc**, không tạo kho: liệt kê nguồn để seed (CLAUDE.md/AGENTS.md/README/CONTRACT ở gốc + 1 cấp, ≤ 15 context-r/contract/handoff cũ có nhắc repo), repo anh em khớp mẫu cho mục `children` (không link — link sẽ tạo kho cho con), mục đã có, mục nên có, mẫu delta. Agent seed theo brief G của skill |
72
74
  | `profile base --save <dir>` / `profile apply --base <dir> [--lessons F] [--profile F] [--dry-run]` | (0.6.0) retro không ghi đè bài học mới: `base` chụp `profile/lessons.md` + `profile.json` vào `<dir>/profile-base/` (kèm sha256); `apply` dưới `profile/profile.lock`: file sống chưa đổi → ghi đề xuất; lessons chỉ có dòng thêm mới → tự gộp (chèn sau dòng neo); dòng cũ bị sửa/xoá hoặc `profile.json` đổi → exit 2, không ghi gì; kiểm lại ngay trước rename, lệch thì làm lại (≤ 5 lần) |
75
+ | `profile scan [--dir P]` / `profile publish --to <repo>/skill/profile [--curated F] [--include-local] [--dry-run]` | (0.7.2) `scan` tìm secret/dữ liệu máy trong `lessons.md`, `profile.json`, `unity-lanes.md` (in `file:dòng:loại`, không in giá trị; exit 2 khi có). `publish` chép profile đã cài vào repo, bỏ dòng bài học riêng của máy, scan trước khi ghi (có chỗ nghi ngờ → exit 2, không ghi gì); không commit/push |
73
76
  | `retro [--json]` | tóm tắt cho vòng retro: số liệu từng ô, đếm `reason_code`, danh sách loại task, tóm tắt điều phối (`orchestration`) |
74
77
  | `uninstall [--purge]` | gỡ hook và đúng các quyền thư mục `runs` đã thêm khỏi settings (có sao lưu); `--purge` xoá cả `hook.cjs`. Dữ liệu giữ lại |
75
78
 
package/agents/dp-exec.md CHANGED
@@ -32,6 +32,8 @@ Repo đích và knowledge: dòng `repo:` của brief là repo ĐÍCH (có thể
32
32
 
33
33
  Helper thế hệ 2 (tuỳ chọn, chỉ khi giúp giữ ngữ cảnh nhỏ): tối đa 4 agent `subagent_type: dp-helper`, `model` đặt rõ `haiku` hoặc `sonnet`, cho đúng hai loại việc — (a) đọc/quét code hoặc tài liệu rồi trả tóm tắt ≤ 15 dòng, (b) chạy test / Unity smoke rồi tóm tắt log. Dòng đầu prompt helper: `[dp:<type>|s<n>|<urgency>|try1|task=<id mới từ dieu-phoi new-id>|role=helper|parent=<task của bạn>]`. Hook từ chối mọi lần giao sai luật. Không giao helper sửa code.
34
34
 
35
+ Trước STATUS/VERDICT: dừng mọi Bash/PowerShell `run_in_background` và Monitor bạn đã mở (TaskStop), chờ helper đã giao trả xong; không dừng được → ghi `LEFTOVER: <id/lệnh>` trong dp-out.
36
+
35
37
  Giữ ngữ cảnh nhỏ (mỗi lượt gửi lại toàn bộ ngữ cảnh — số lượt mới là thứ làm phình):
36
38
  - Grep/Glob trước, rồi Read đúng đoạn cần bằng offset/limit; không cat/sed -n cả file qua Bash.
37
39
  - Không đọc lại file đã đọc — ghi chú điều cần nhớ ngay khi đọc.
@@ -15,6 +15,8 @@ hooks:
15
15
  ---
16
16
  Bạn là helper thế hệ 2 của dieu-phoi, do một agent exec giao (thẻ `[dp:...|role=helper|parent=...]`). Chỉ làm một trong hai việc: (a) đọc/quét code hoặc tài liệu được chỉ định rồi trả tóm tắt ≤ 15 dòng (đường dẫn + dòng + kết luận, không dán nguyên văn dài); (b) chạy test / Unity smoke được chỉ định rồi tóm tắt log (pass/fail, lỗi đầu tiên, đường dẫn log). Không sửa file, không giao việc tiếp. Câu trả lời cuối ≤ 15 dòng, trả bằng chữ cho dp-exec cha (helper không ghi file).
17
17
 
18
+ Trước khi trả kết quả: dừng mọi Bash/PowerShell `run_in_background` và Monitor bạn đã mở (TaskStop); không dừng được → ghi `LEFTOVER: <id/lệnh>` vào phần trả lời.
19
+
18
20
  Giữ ngữ cảnh nhỏ (mỗi lượt gửi lại toàn bộ ngữ cảnh — số lượt mới là thứ làm phình):
19
21
  - Grep/Glob trước, rồi Read đúng đoạn cần bằng offset/limit; không cat/sed -n cả file qua Bash.
20
22
  - codebase-memory-mcp lỗi kết nối/không phản hồi → Grep/Glob ngay, ghi một dòng `codebase-memory: unavailable (<lý do>)` trong tóm tắt, không thử lại.
@@ -21,6 +21,8 @@ Bàn giao qua file: ghi TOÀN BỘ kết quả vào `dp-out-<task_id>-plan-try<n
21
21
 
22
22
  Repo đích và knowledge: `repo:` trong prompt là repo ĐÍCH (phiên ở repo cha làm việc trên repo con → repo con). Bắt đầu bằng `dieu-phoi knowledge list --repo <repo>` + `knowledge get <id|từ khoá> --repo <repo>` (`--follow` cho phần chép từ repo cha); chưa có kho → ghi vào NOTES. Cấu trúc code: codebase-memory-mcp khi repo đã có index (`list_projects`), không thì Grep/Glob — không tự index. MCP lỗi kết nối/không phản hồi/báo daemon khác version → Grep/Glob ngay, ghi một dòng `codebase-memory: unavailable (<lý do>)` trong dp-out, không thử lại. Bước sửa code chạy song song cùng repo → ghi cần worktree + cổng riêng. Điều không suy ra từ code → `<run>/knowledge-delta-<task_id>.md` (header `repo:`, `## +id` + `paths:`), không tự merge.
23
23
 
24
+ Trước STATUS/VERDICT: dừng mọi Bash/PowerShell `run_in_background` và Monitor bạn đã mở (TaskStop), chờ helper đã giao trả xong; không dừng được → ghi `LEFTOVER: <id/lệnh>` trong dp-out.
25
+
24
26
  Giữ ngữ cảnh nhỏ (mỗi lượt gửi lại toàn bộ ngữ cảnh — số lượt mới là thứ làm phình):
25
27
  - Grep/Glob trước, rồi Read đúng đoạn cần bằng offset/limit; không cat/sed -n cả file qua Bash.
26
28
  - Không đọc lại file đã đọc — ghi chú điều cần nhớ ngay khi đọc.
@@ -21,6 +21,8 @@ Bàn giao qua file: ghi TOÀN BỘ kết quả vào `dp-out-<task_id>-verify-try
21
21
 
22
22
  Repo đích và knowledge: chạy lệnh trong `worktree:` của bước nếu brief có, không thì trong `repo:` đích; chỉ xem diff trong thư mục đó. Cách build/test, cổng/DB test: `dieu-phoi knowledge get build-test ports-resources --repo <repo>` nếu kho có; chỉ dừng tiến trình do chính mình mở. Không ghi delta knowledge trừ khi phát hiện mục sai.
23
23
 
24
+ Trước STATUS/VERDICT: dừng mọi Bash/PowerShell `run_in_background` và Monitor bạn đã mở (TaskStop), chờ helper đã giao trả xong; không dừng được → ghi `LEFTOVER: <id/lệnh>` trong dp-out.
25
+
24
26
  Giữ ngữ cảnh nhỏ (mỗi lượt gửi lại toàn bộ ngữ cảnh — số lượt mới là thứ làm phình):
25
27
  - Grep/Glob trước, rồi Read đúng đoạn cần bằng offset/limit; không cat/sed -n cả file qua Bash.
26
28
  - codebase-memory-mcp lỗi kết nối/không phản hồi → Grep/Glob ngay, ghi một dòng `codebase-memory: unavailable (<lý do>)` trong dp-out, không thử lại.
package/bin/dieu-phoi.cjs CHANGED
@@ -21,7 +21,8 @@ Cách dùng: dieu-phoi <lệnh> [tuỳ chọn]
21
21
  start [--mode fast|normal|strict] [--json]
22
22
  khởi động cổng 1 trong một lệnh (~150 ms, không gọi mạng): kiểm cục bộ, task_id gốc,
23
23
  tạo run dir, đường dẫn brief scout — dùng khi hook UserPromptSubmit không chạy;
24
- không có --mode thì in dòng nhắc HỎI người dùng chọn mode (mặc định normal)
24
+ không có --mode thì ghi "mode: chưa chọn" (mặc định normal); chỉ hỏi người dùng ở cổng 1
25
+ khi plan-table báo ≥ 4 bước s≤6
25
26
  mode --root <root_task_id> [fast|normal|strict] [--reason R] [--session S] [--json]
26
27
  xem/đổi mode của một yêu cầu (một sự kiện mỗi lần đổi, cục bộ); bước chưa giao áp mode mới,
27
28
  bước đã giao giữ mode lúc giao; không bao giờ tự đổi
@@ -36,7 +37,14 @@ Cách dùng: dieu-phoi <lệnh> [tuỳ chọn]
36
37
  người dùng nhận mọi bước đã giao exec của kế hoạch đã duyệt chưa có verdict người dùng
37
38
  accept (--task/--root) tự gộp knowledge-delta-<task_id>*.md của run vào kho (--no-knowledge: bỏ)
38
39
  discard --task <task_id> [--reason R]
39
- loại một task nhầm khỏi thống kê/choose/state (ghi sự kiện discard, không sửa log)
40
+ loại một task nhầm khỏi thống kê/choose/state (ghi sự kiện discard, không sửa log);
41
+ gỡ worktree có dấu của task nếu sạch (còn thay đổi thì giữ và báo)
42
+ wt add --task <task_id> [--repo R] [--path D] [--branch B]
43
+ tạo worktree cho một bước: <cha repo>/<tên repo>-wt-<task_id> trên nhánh dp/<task_id>,
44
+ có dấu dieu-phoi (điều phối viên dùng lệnh này, không git worktree add tay)
45
+ wt clean [--repo R] [--yes]
46
+ liệt kê worktree có dấu mà task đã nghiệm thu / bị loại, hoặc thư mục đã mất;
47
+ mặc định dry-run, --yes mới gỡ (worktree còn thay đổi luôn giữ; nhánh giữ nguyên)
40
48
  steer <agent_id> --kind minor|plan|redirect [--reason R]
41
49
  steer --task <task_id> --kind minor|plan|redirect [--reason R]
42
50
  ghi một lần người dùng lái giữa chừng (--task: chỉ các agent đang chạy của task)
@@ -70,6 +78,9 @@ Cách dùng: dieu-phoi <lệnh> [tuỳ chọn]
70
78
  profile base --save <dir> | apply --base <dir> [--lessons F] [--profile F] [--dry-run]
71
79
  áp retro lên profile/ không ghi đè phiên khác: chụp base trước khi retro đọc, apply dưới khoá;
72
80
  lessons chỉ thêm dòng → tự gộp, sửa/xoá dòng cũ hoặc profile.json đổi → dừng (exit 2); profile --help
81
+ profile scan [--dir P] quét secret/dữ liệu máy trong profile (exit 2 khi có; không in giá trị)
82
+ profile publish --to <repo>/skill/profile [--curated F] [--include-local] [--dry-run]
83
+ chép profile đã cài vào repo (bỏ dòng riêng của máy, scan trước, không commit/push)
73
84
  uninstall [--purge] gỡ hook khỏi settings.json (--purge xoá cả hook.cjs; dữ liệu giữ lại)
74
85
  hook (nội bộ) đọc payload hook từ stdin
75
86
 
@@ -112,6 +123,7 @@ async function main(argv) {
112
123
  verdict: c.cmdVerdict,
113
124
  steer: c.cmdSteer,
114
125
  discard: c.cmdDiscard,
126
+ wt: (o) => require('../lib/worktree.cjs').cmdWt(o),
115
127
  'plan-table': c.cmdPlanTable,
116
128
  'new-id': c.cmdNewId,
117
129
  stats: c.cmdStats,