lithermes-ai 0.8.6 → 0.8.8

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/README.md CHANGED
@@ -39,6 +39,15 @@ Install the plugin:
39
39
  npx lithermes-ai install --yes
40
40
  ```
41
41
 
42
+ For a non-interactive first install through npx, pass both approvals:
43
+
44
+ ```sh
45
+ npx --yes lithermes-ai@latest install --yes
46
+ ```
47
+
48
+ The first `--yes` is for npx; the second `--yes` is for LitHermes. The npm
49
+ package is `lithermes-ai`; `lithermes` is the installed CLI/plugin name.
50
+
42
51
  Restart any running Hermes CLI or Hermes gateway process. Then open Hermes and try:
43
52
 
44
53
  ```text
@@ -53,7 +62,9 @@ Restart any running Hermes CLI or Hermes gateway process. Then open Hermes and t
53
62
  - `/lit-plan`: create a durable implementation plan.
54
63
  - Natural routing: a standalone `lit` or `litwork` in normal prose activates Litwork;
55
64
  `lit plan`, `lit review`, `lit research`, and `lit goal` route to the matching
56
- Lithermes mode contract. Tokens inside code spans, fenced code, substrings,
65
+ Lithermes mode contract; `lit workflow` / `lit kanban` route durable work to
66
+ Hermes Kanban setup/proposal guidance, and `lit team` maps team-like work to
67
+ Kanban profile lanes instead of claiming a literal native team mode. Tokens inside code spans, fenced code, substrings,
57
68
  compounds, paths, and real slash-command mentions are ignored.
58
69
  - `/litwork-loop` and `/litwork-plan`: longer aliases.
59
70
  - `/lit_loop` and `/lit_plan`: gateway-friendly aliases for Telegram dispatch.
@@ -61,6 +72,8 @@ Restart any running Hermes CLI or Hermes gateway process. Then open Hermes and t
61
72
  - Interactive install spinner keeps terminal installs lively while redirected or scripted installs stay plain; use `npx lithermes-ai install --yes --no-spinner` for quiet terminal installs.
62
73
  - `/start-work`: execution-only for an approved plan. Natural-language `lit start work`
63
74
  is `BLOCKED` because a hook cannot switch Hermes commands; invoke `/start-work <plan>` explicitly.
75
+ - `/review-work` records a local redacted `delegate_batch_intent` summary for its
76
+ single five-lane `delegate_task` batch under `.hermes/lithermes/runs/<run>/delegate_batches/<batch>/`.
64
77
  - LitHermes workflow skill set: `ai-slop-remover`, `comment-checker`,
65
78
  `debugging`, `deep-interview`, `frontend-ui-ux`, `git-master`, `init-deep`,
66
79
  `lsp`, `programming`, `refactor`,
@@ -84,6 +97,11 @@ Restart any running Hermes CLI or Hermes gateway process. Then open Hermes and t
84
97
  and uncertainty; keep any journal under `.hermes/lithermes/litresearch/`.
85
98
  - `lit goal`: litgoal mode. Bind one objective plus checkable criteria through
86
99
  `goal_set` / `goal_*` tools; state lives in `.hermes/lithermes/litgoal/`.
100
+ - `lit workflow` / `lit kanban`: durable-workflow mode. Probe `hermes version`,
101
+ `hermes kanban --help`, and `hermes profile list`; if setup is missing, print
102
+ `hermes kanban init` and `hermes gateway start` next steps. Create/propose a
103
+ Kanban root card only when setup and approval are present.
104
+ - `lit team`: no literal native team mode is claimed; use Hermes Kanban profile lanes.
87
105
  - `lit start work`: `BLOCKED` unless the user invokes the native `/start-work`
88
106
  command. `/start-work` is execution-only for approved plans.
89
107
 
@@ -128,6 +146,16 @@ Install with npm:
128
146
  npx lithermes-ai install --yes
129
147
  ```
130
148
 
149
+ Non-interactive npx install:
150
+
151
+ ```sh
152
+ npx --yes lithermes-ai@latest install --yes
153
+ ```
154
+
155
+ `npx --yes` only suppresses npm's prompt to download/run the package. LitHermes
156
+ still requires `install --yes` before it mutates Hermes config. Running
157
+ `npx --yes lithermes-ai@latest install` is therefore expected to stop safely.
158
+
131
159
  Install with Bun:
132
160
 
133
161
  ```sh
@@ -142,6 +170,10 @@ npx lithermes-ai install --yes --hermes-home /path/to/.hermes
142
170
 
143
171
  LitHermes refuses to mutate Hermes config unless you pass `--yes`. If `~/.hermes/plugins/lithermes` already exists but was not created by this installer, installation stops instead of overwriting user files.
144
172
 
173
+ Do not install as `npx lithermes@latest ...`: `lithermes` is not the npm package
174
+ name. Use `lithermes-ai` (or `npx --package lithermes-ai@latest lithermes ...`
175
+ when you explicitly want the `lithermes` binary name).
176
+
145
177
  ## Verify
146
178
 
147
179
  Check the package and Hermes compatibility:
@@ -229,6 +261,28 @@ Uninstall intentionally preserves unrelated files in `~/.hermes/plugins`.
229
261
 
230
262
  ## Troubleshooting
231
263
 
264
+ ### `Refusing to mutate Hermes config without --yes`
265
+
266
+ You passed `--yes` to npx but not to the LitHermes installer. Use:
267
+
268
+ ```sh
269
+ npx --yes lithermes-ai@latest install --yes
270
+ ```
271
+
272
+ ### `No matching version found for lithermes@latest`
273
+
274
+ The npm package is `lithermes-ai`, not `lithermes`:
275
+
276
+ ```sh
277
+ npx --yes lithermes-ai@latest install --yes
278
+ ```
279
+
280
+ If you need the `lithermes` binary explicitly, run:
281
+
282
+ ```sh
283
+ npx --yes --package lithermes-ai@latest lithermes install --yes
284
+ ```
285
+
232
286
  ### `Hermes installation not found`
233
287
 
234
288
  Pass the Hermes home explicitly:
package/README_Ko-KR.md CHANGED
@@ -39,6 +39,16 @@ bunx lithermes-ai doctor
39
39
  npx lithermes-ai install --yes
40
40
  ```
41
41
 
42
+ npx를 통한 첫 설치에서 확인 질문을 모두 생략하려면 두 종류의 `--yes`를 모두
43
+ 전달합니다.
44
+
45
+ ```sh
46
+ npx --yes lithermes-ai@latest install --yes
47
+ ```
48
+
49
+ 앞의 `--yes`는 npx용이고, 뒤의 `install --yes`는 LitHermes installer용입니다.
50
+ npm 패키지명은 `lithermes-ai`이며, `lithermes`는 설치 후 CLI/plugin 이름입니다.
51
+
42
52
  실행 중인 Hermes CLI 또는 Hermes gateway를 재시작합니다. 그 다음 Hermes에서 이렇게 사용합니다.
43
53
 
44
54
  ```text
@@ -52,13 +62,16 @@ npx lithermes-ai install --yes
52
62
  - `/lit-loop`: 같은 실행 loop를 명시적으로 호출합니다.
53
63
  - `/lit-plan`: 구현 계획을 먼저 세웁니다.
54
64
  - natural routing: 일반 문장 속 standalone lit / litwork / lit plan / lit review /
55
- lit research / lit goal을 Hermes-native mode로 라우팅합니다. code spans,
65
+ lit research / lit goal을 Hermes-native mode로 라우팅하고, lit workflow / lit kanban은
66
+ Hermes Kanban setup/proposal 안내로, lit team은 literal native team mode가 아니라
67
+ Kanban profile lane으로 매핑합니다. code spans,
56
68
  fenced code, substring, compound token, path 안의 lit, 실제 slash-command 언급은 무시합니다.
57
69
  - `/litwork-loop`, `/litwork-plan`: 긴 이름의 alias입니다.
58
70
  - `/lit_loop`, `/lit_plan`: Telegram dispatch에 맞춘 gateway alias입니다.
59
71
  - 네이티브 `/goal` 바인딩: Hermes에는 model-facing goal tool이 없으므로 `/lit`, `/lit-loop`, `/lit-plan`은 세션 goal manager를 통해 네이티브 standing `/goal`을 대신 설정합니다(턴을 넘어 유지되고 네이티브 evidence-judge가 완료를 판정). success criteria와 증거는 durable `goal_*` 도구로 추적합니다.
60
72
  - interactive install spinner가 terminal 설치는 더 생동감 있게 보여주고, redirect/script 설치는 기존처럼 plain output을 유지합니다. 조용한 terminal 설치가 필요하면 `npx lithermes-ai install --yes --no-spinner`를 사용합니다.
61
73
  - `/start-work`: 승인된 plan만 실행하는 execution-only 명령입니다. 자연어 `lit start work`는 hook이 Hermes command 전환을 할 수 없으므로 `BLOCKED`되고, 사용자가 `/start-work <plan>`을 직접 호출해야 합니다.
74
+ - `/review-work`: 단일 5-lane `delegate_task` batch에 대해 redacted local `delegate_batch_intent` 요약을 `.hermes/lithermes/runs/<run>/delegate_batches/<batch>/`에 기록합니다.
62
75
  - LitHermes workflow skill set: `ai-slop-remover`, `comment-checker`,
63
76
  `debugging`, `deep-interview`, `frontend-ui-ux`, `git-master`, `init-deep`,
64
77
  `lsp`, `programming`, `refactor`,
@@ -75,6 +88,10 @@ npx lithermes-ai install --yes
75
88
  - `lit review`: review-work mode입니다. behavior, tests, docs/package readiness, security/safety, cleanup evidence를 5-lane으로 검증합니다.
76
89
  - `lit research`: verified facts, hypotheses, sources, uncertainty를 분리하고 journal은 `.hermes/lithermes/litresearch/`에 둡니다.
77
90
  - `lit goal`: one objective plus checkable criteria를 `.hermes/lithermes/litgoal/`에 `goal_*` 도구로 기록합니다.
91
+ - `lit workflow` / `lit kanban`: durable-workflow mode입니다. `hermes version`,
92
+ `hermes kanban --help`, `hermes profile list`를 먼저 확인하고, setup이 없으면
93
+ `hermes kanban init`, `hermes gateway start` 안내만 출력합니다. setup과 승인이 있을 때만 Kanban root card를 만들거나 제안합니다.
94
+ - `lit team`: literal native team mode를 주장하지 않고 Hermes Kanban profile lane을 사용합니다.
78
95
  - `lit start work`: `BLOCKED`; 승인된 plan에 대해 native `/start-work <approved-plan>`을 직접 호출해야 합니다.
79
96
 
80
97
  Natural routing은 `code spans`, fenced code, `/lit` 같은 실제 slash-command mention,
@@ -114,6 +131,16 @@ npm으로 설치합니다.
114
131
  npx lithermes-ai install --yes
115
132
  ```
116
133
 
134
+ npx 확인 질문까지 생략하는 설치:
135
+
136
+ ```sh
137
+ npx --yes lithermes-ai@latest install --yes
138
+ ```
139
+
140
+ `npx --yes`는 npm의 패키지 다운로드/실행 확인만 생략합니다. LitHermes가 Hermes
141
+ config를 수정하려면 여전히 `install --yes`가 필요합니다. 따라서 `npx --yes
142
+ lithermes-ai@latest install`이 안전하게 멈추는 것은 정상 동작입니다.
143
+
117
144
  Bun으로 설치합니다.
118
145
 
119
146
  ```sh
@@ -128,6 +155,10 @@ npx lithermes-ai install --yes --hermes-home /path/to/.hermes
128
155
 
129
156
  LitHermes는 `--yes`가 없으면 Hermes config를 수정하지 않습니다. 또한 `~/.hermes/plugins/lithermes`가 이미 있는데 이 installer가 만든 파일이 아니면, 사용자 파일을 덮어쓰지 않고 멈춥니다.
130
157
 
158
+ `npx lithermes@latest ...`로 설치하지 마세요. npm 패키지명은 `lithermes-ai`이고,
159
+ `lithermes`는 binary/plugin 이름입니다. binary 이름을 명시하고 싶다면
160
+ `npx --package lithermes-ai@latest lithermes install --yes`를 사용하세요.
161
+
131
162
  ## 확인
132
163
 
133
164
  패키지와 Hermes 호환성을 확인합니다.
@@ -215,6 +246,28 @@ npx lithermes-ai uninstall --yes
215
246
 
216
247
  ## 문제 해결
217
248
 
249
+ ### `Refusing to mutate Hermes config without --yes`
250
+
251
+ `--yes`를 npx에는 넘겼지만 LitHermes installer에는 넘기지 않은 경우입니다.
252
+
253
+ ```sh
254
+ npx --yes lithermes-ai@latest install --yes
255
+ ```
256
+
257
+ ### `No matching version found for lithermes@latest`
258
+
259
+ npm 패키지는 `lithermes`가 아니라 `lithermes-ai`입니다.
260
+
261
+ ```sh
262
+ npx --yes lithermes-ai@latest install --yes
263
+ ```
264
+
265
+ `lithermes` binary 이름을 꼭 명시하려면 다음처럼 실행하세요.
266
+
267
+ ```sh
268
+ npx --yes --package lithermes-ai@latest lithermes install --yes
269
+ ```
270
+
218
271
  ### `Hermes installation not found`
219
272
 
220
273
  Hermes home을 직접 지정하세요.
@@ -3,6 +3,16 @@
3
3
  Hermes-native workflow tools for plan-first execution, evidence ledgers, and
4
4
  first-class Hermes skills:
5
5
 
6
+ Install from npm with the package name `lithermes-ai`:
7
+
8
+ ```sh
9
+ npx --yes lithermes-ai@latest install --yes
10
+ ```
11
+
12
+ `npx --yes` only approves npm package execution; `install --yes` is the LitHermes
13
+ installer approval to mutate Hermes config. `lithermes` is the installed
14
+ CLI/plugin name, not the npm package name.
15
+
6
16
  - `/lit-plan` and `/litwork-plan` create durable plans in `plans/`, then forward a
7
17
  goal bootstrap to the Hermes agent instead of stopping at plan creation.
8
18
  - `/lit-loop` and `/litwork-loop` create run state under
@@ -11,7 +21,10 @@ first-class Hermes skills:
11
21
  execution-only and never bootstraps a plan from a brief.
12
22
  - The `pre_llm_call` hook injects an Litwork directive when the user says
13
23
  a standalone `lit` or `litwork`. It also routes `lit plan`, `lit review`,
14
- `lit research`, and `lit goal` to the matching `lithermes:*` skill contract.
24
+ `lit research`, `lit goal`, and durable `lit workflow` / `lit kanban` / `lit team`
25
+ intents to the matching Hermes-native contract. Kanban routes are setup/proposal
26
+ guidance for Hermes Kanban profile lanes; `lit team` does not claim a literal
27
+ native team mode.
15
28
  Hermes has no model-facing goal tools, so a direct `lit <task>` (and the /lit
16
29
  command) binds the native standing `/goal` via the session goal manager;
17
30
  criteria + evidence use the durable `goal_*` tools.
@@ -26,7 +39,8 @@ first-class Hermes skills:
26
39
  `lithermes:lit-plan`, `lithermes:litgoal`, and `lithermes:litwork`.
27
40
  - Delegation fans lanes out through the native `delegate_task` tool (children
28
41
  run in parallel, the parent blocks for all); there is no named-agent registry
29
- and no per-child model selection.
42
+ and no per-child model selection. Broad review commands record a local redacted
43
+ `delegate_batch_intent` summary under `.hermes/lithermes/runs/<run>/delegate_batches/<batch>/`.
30
44
 
31
45
  ## Mode Contract
32
46
 
@@ -40,6 +54,11 @@ first-class Hermes skills:
40
54
  journals live under `.hermes/lithermes/litresearch/<slug>/`.
41
55
  - `lit goal`: bind one objective plus checkable criteria in
42
56
  `.hermes/lithermes/litgoal/`.
57
+ - `lit workflow` / `lit kanban`: durable-workflow setup/proposal mode through
58
+ Hermes Kanban. Probe `hermes version`, `hermes kanban --help`, and
59
+ `hermes profile list`; initialize/start gateway if missing; create/propose a
60
+ Kanban root card only after setup and approval.
61
+ - `lit team`: no literal native team mode is claimed; use Hermes Kanban profile lanes.
43
62
  - `lit start work`: `BLOCKED` in natural routing because `pre_llm_call` cannot
44
63
  switch Hermes commands. The user must invoke `/start-work <approved-plan>`.
45
64
 
@@ -198,6 +198,66 @@ def record_event(event: str, **fields: Any) -> None:
198
198
  pass
199
199
 
200
200
 
201
+ _REMOTE_REF_RE = re.compile(r"https?://[^\s,;\"'<>]+", re.IGNORECASE)
202
+
203
+
204
+ def _redact_local_only_preview(value: Any) -> str:
205
+ """Small local-only diagnostic preview for event metadata.
206
+
207
+ Delegate batch events must never become remote telemetry. Keep the preview
208
+ bounded, secret-redacted, and URL-redacted so audit logs prove intent without
209
+ preserving endpoints or pasted secret-bearing child context.
210
+ """
211
+ text = json.dumps(redact_obj(value), sort_keys=True) if not isinstance(value, str) else redact_text(value)
212
+ text = _REMOTE_REF_RE.sub("[REDACTED_URL]", text)
213
+ return text[:1000]
214
+
215
+
216
+ def record_delegate_batch_intent(
217
+ *,
218
+ workspace: Path,
219
+ mode: str,
220
+ lanes: Iterable[str],
221
+ session_id: str = "",
222
+ context: Any = None,
223
+ ) -> dict[str, Any]:
224
+ """Record a local, redacted intent event for a Hermes delegate_task batch.
225
+
226
+ This is evidence only: it does not orchestrate workers, create persistent
227
+ teams, or send telemetry anywhere. Hermes still performs the actual short
228
+ parallel work through one synchronous delegate_task batch.
229
+ """
230
+ rid = run_id("lithermes")
231
+ batch_id = run_id("delegate-batch")
232
+ lane_list = [str(lane) for lane in lanes]
233
+ artifact_dir = lithermes_dir(workspace) / "runs" / rid / "delegate_batches" / batch_id
234
+ payload = {
235
+ "event": "delegate_batch_intent",
236
+ "timestamp": utc_now().isoformat(),
237
+ "session_id": session_id,
238
+ "run_id": rid,
239
+ "batch_id": batch_id,
240
+ "mode": mode,
241
+ "lanes": lane_list,
242
+ "artifact_dir": str(artifact_dir) + "/",
243
+ }
244
+ if context is not None:
245
+ payload["context_preview"] = _redact_local_only_preview(context)
246
+ try:
247
+ artifact_dir.mkdir(parents=True, exist_ok=True)
248
+ (artifact_dir / "summary.json").write_text(
249
+ json.dumps(redact_obj(payload), indent=2, sort_keys=True) + "\n",
250
+ encoding="utf-8",
251
+ )
252
+ except OSError:
253
+ pass
254
+ try:
255
+ append_jsonl(event_log_path(), payload)
256
+ except OSError:
257
+ pass
258
+ return redact_obj(payload)
259
+
260
+
201
261
  _RUN_CONTEXT_TASK_PATTERN = re.compile(r"^task:\s*(?P<task>.+?)\s*$", re.MULTILINE)
202
262
 
203
263
 
@@ -282,6 +342,17 @@ def detect_lit_mode(message: str) -> NaturalLitRoute | None:
282
342
  if token == "litwork":
283
343
  return NaturalLitRoute(mode="litwork", objective=_clamp_task(after), visible_message=visible)
284
344
 
345
+ for word in ("workflow", "kanban"):
346
+ rest = _after_mode_word(after, word)
347
+ if rest is not None:
348
+ return NaturalLitRoute(mode="durable-workflow", objective=_clamp_task(rest), visible_message=visible)
349
+
350
+ team_rest = _after_mode_word(after, "team")
351
+ if team_rest is not None:
352
+ mode_rest = _after_mode_word(team_rest, "mode")
353
+ objective = mode_rest if mode_rest is not None else team_rest
354
+ return NaturalLitRoute(mode="kanban-team", objective=_clamp_task(objective), visible_message=visible)
355
+
285
356
  start_rest = _after_start_work(after)
286
357
  if start_rest is not None:
287
358
  block = (
@@ -312,6 +383,33 @@ def detect_lit_mode(message: str) -> NaturalLitRoute | None:
312
383
 
313
384
  def build_natural_mode_context(route: NaturalLitRoute) -> str:
314
385
  objective = route.objective or "(no objective text supplied — ask for the missing objective if needed)"
386
+ if route.mode in {"durable-workflow", "kanban-team"}:
387
+ team_note = (
388
+ "Hermes has no literal native team mode; team-like work maps to Hermes Kanban profile lanes and worker lanes."
389
+ if route.mode == "kanban-team"
390
+ else "Hermes durable-workflow route: use Hermes Kanban for broad/background work."
391
+ )
392
+ return "\n".join(
393
+ [
394
+ f"<lithermes-natural-route mode=\"{route.mode}\">",
395
+ "Natural routing: durable-workflow intent -> Hermes Kanban.",
396
+ team_note,
397
+ f"Objective: {objective}",
398
+ "Mode Contract: setup/propose only unless Kanban is already available, initialized, and the user approved creation.",
399
+ "Capability probe before creating anything:",
400
+ "- hermes version",
401
+ "- hermes kanban --help",
402
+ "- hermes profile list",
403
+ "If setup is missing, do not fake a workflow start; print these next commands:",
404
+ "- hermes kanban init",
405
+ "- hermes gateway start",
406
+ "- hermes profile list",
407
+ "If setup and approval are present, create/propose a Kanban root card via kanban_create or `hermes kanban create`.",
408
+ "Root card fields: title/objective, acceptance criteria, assignee/profile, workspace, skills, dependencies, and goal_mode when open-ended.",
409
+ "External CLI worker lanes are not paved without a separate spawn_fn integration; do not promise them.",
410
+ "</lithermes-natural-route>",
411
+ ]
412
+ )
315
413
  if route.blocked:
316
414
  return "\n".join(
317
415
  [
@@ -986,6 +1084,16 @@ def command_review_work(raw_args: str) -> dict[str, str]:
986
1084
  diff = diff[:60000] + "\n... [diff truncated at 60k chars — lanes should read full files as needed]"
987
1085
  run_cmd = detect_run_command(workspace)
988
1086
  files_block = changed or "(no changed files detected vs " + base + ")"
1087
+ batch_event = record_delegate_batch_intent(
1088
+ workspace=workspace,
1089
+ mode="review-work",
1090
+ lanes=[key for key, _ in REVIEW_LANES],
1091
+ context={
1092
+ "base": base,
1093
+ "changed_file_count": len([f for f in changed.splitlines() if f.strip()]),
1094
+ "run_command": run_cmd,
1095
+ },
1096
+ )
989
1097
 
990
1098
  lane_lines = []
991
1099
  for key, brief in REVIEW_LANES:
@@ -998,6 +1106,7 @@ def command_review_work(raw_args: str) -> dict[str, str]:
998
1106
  f"workspace: {workspace}",
999
1107
  f"base: {base}",
1000
1108
  f"run command (for QA lane): {run_cmd}",
1109
+ f"delegate batch evidence: {batch_event.get('artifact_dir', '')}",
1001
1110
  "",
1002
1111
  "Changed files:",
1003
1112
  files_block,
@@ -1,7 +1,7 @@
1
1
  {
2
- "syncedAt": "2026-06-19T02:30:00.000Z",
2
+ "syncedAt": "2026-06-21T06:34:00.000Z",
3
3
  "source": "source-reference",
4
- "sourceHash": "0a2b29742e4410128d26429945f694c77d47dc5a0d3f80a6bda8b1cbbb21200f",
4
+ "sourceHash": "19037e85902a521d49548d34c1ceaefa0894d89343ed1829ed5cb85500eeedfb",
5
5
  "files": [
6
6
  {
7
7
  "path": "NOTICE.md",
@@ -9,7 +9,7 @@
9
9
  },
10
10
  {
11
11
  "path": "README.md",
12
- "sha256": "29a32fca9db9fd12a2a9e307e93f44ba2a8274fde19946011944958c1a1ebc6d"
12
+ "sha256": "9eea08f516c7db2a6d1f8c622b6ea3f6b18a37e800013c38cfbb062a0594b28a"
13
13
  },
14
14
  {
15
15
  "path": "__init__.py",
@@ -17,7 +17,7 @@
17
17
  },
18
18
  {
19
19
  "path": "core.py",
20
- "sha256": "d0689b196a2721c99c3c83a5e82482869da0d80e57a52c07f54d9268989c31b0"
20
+ "sha256": "2784fd77147e539e32aee44db81ecc6744ae084732eaf134e90313b3e2cacd48"
21
21
  },
22
22
  {
23
23
  "path": "litgoal/__init__.py",
@@ -49,7 +49,7 @@
49
49
  },
50
50
  {
51
51
  "path": "plugin.yaml",
52
- "sha256": "9d49a09370193484755d21941af9f6d977dfef780c7a8d6657c115ff643b0bbd"
52
+ "sha256": "92bb4dabbc0de842b811471a407a426dd6165d96a433937ab9ab687c4291ad5e"
53
53
  },
54
54
  {
55
55
  "path": "redaction.py",
@@ -65,7 +65,7 @@
65
65
  },
66
66
  {
67
67
  "path": "skills/debugging/SKILL.md",
68
- "sha256": "48bdb0df0f41633aca17d6193aa98aabac4c49cc25c36e50f26b020f89f77d43"
68
+ "sha256": "5b1b4f536579d0fb459eb9e5a79ee7d70bad26149799c0417b3c258b3f00bba5"
69
69
  },
70
70
  {
71
71
  "path": "skills/debugging/references/methodology/00-setup.md",
@@ -169,7 +169,7 @@
169
169
  },
170
170
  {
171
171
  "path": "skills/litresearch/SKILL.md",
172
- "sha256": "363468a509f7743037b2f132171b7b1351d11c10680985a49cab1693855a0a20"
172
+ "sha256": "31ee558ac64f3cadd229adf5255255cd7bf3fa5a8dbc049920d7ed7692ea2c96"
173
173
  },
174
174
  {
175
175
  "path": "skills/litwork/SKILL.md",
@@ -281,7 +281,7 @@
281
281
  },
282
282
  {
283
283
  "path": "skills/programming/SKILL.md",
284
- "sha256": "ffb201197e7386c848f8efb9b90d0a024d7b8000e8bea1b13b0ed7a83627a56b"
284
+ "sha256": "a373df296ce4ce7e0fed2118a11e6cc70eedcc6e81520035d097d079a6484f99"
285
285
  },
286
286
  {
287
287
  "path": "skills/programming/references/go/README.md",
@@ -569,7 +569,7 @@
569
569
  },
570
570
  {
571
571
  "path": "skills/refactor/SKILL.md",
572
- "sha256": "d4e160e256b5a5e1fae4170edeee7a6bc8e2338bbebec797e24f07ea70687a10"
572
+ "sha256": "37913c1154e1110492f14cafe3836e344728b1fd85a7a324e837e52b9f03e3d6"
573
573
  },
574
574
  {
575
575
  "path": "skills/remove-ai-slops/SKILL.md",
@@ -577,7 +577,7 @@
577
577
  },
578
578
  {
579
579
  "path": "skills/review-work/SKILL.md",
580
- "sha256": "4af425ec7924f1cd3d5fac633351f84d587cbaa68498d46daad9faf066c937ec"
580
+ "sha256": "a232c83f95b2109231c4b752267d5bc0a96a4c853c7e7b8b590c73445391d94a"
581
581
  },
582
582
  {
583
583
  "path": "skills/rules/SKILL.md",
@@ -1,5 +1,5 @@
1
1
  name: lithermes
2
- version: 0.8.6
2
+ version: 0.8.8
3
3
  description: "Hermes-native workflow toolkit: litgoal durable runtime, 5-lane review orchestrator, Litwork commands, skills, and prompt steering."
4
4
  author: "Hermes Agent"
5
5
  kind: standalone
@@ -67,7 +67,7 @@ Each phase has exactly one reference. Read it as you enter the phase — not in
67
67
  | 0 | **Environment assessment** — know the runtime, ports, symbols, env vars, watchers before attaching | [references/methodology/00-setup.md](references/methodology/00-setup.md) |
68
68
  | 1 | **Journal setup** — single `.debug-journal.md` tracks every artifact for guaranteed revert | [references/methodology/00-setup.md](references/methodology/00-setup.md) |
69
69
  | 2 | **Hypothesis formation** — minimum three, across orthogonal axes, each with distinguishing evidence | [references/methodology/02-investigate.md](references/methodology/02-investigate.md) |
70
- | 3 | **Parallel investigation** — team mode `debug-squad` when enabled, async subagents otherwise | [references/methodology/02-investigate.md](references/methodology/02-investigate.md) |
70
+ | 3 | **Parallel investigation** — one Hermes-native `delegate_task` batch for short investigations; use Kanban profile lanes for durable/background debugging programs | [references/methodology/02-investigate.md](references/methodology/02-investigate.md) |
71
71
  | 4 | **Oracle Triple** — after 2 consecutive failed rounds, spawn three Oracles with orthogonal framings and synthesize | [references/methodology/04-oracle-triple.md](references/methodology/04-oracle-triple.md) |
72
72
  | 5 | **User decision escalation** — only when evidence exhausted and the call has policy implications | [references/methodology/05-escalate.md](references/methodology/05-escalate.md) |
73
73
  | 6 | **Root cause confirmation** — confirmed only when toggling the suspected cause toggles the bug | [references/methodology/06-fix.md](references/methodology/06-fix.md) |
@@ -28,6 +28,11 @@ If a single retrieval would answer it, do that directly and do not invoke litres
28
28
 
29
29
  Everything in this skill runs on one tool: the native `delegate_task`.
30
30
 
31
+ Use this mode for short, in-turn research where the parent should wait for the
32
+ parallel children and synthesize their returns. If the user asks for durable,
33
+ background, dynamic-workflow-style collaboration, route to Hermes Kanban (`lit workflow`
34
+ / `lit kanban`) instead of stretching `delegate_task` into a queue.
35
+
31
36
  - **Parallel swarm fan-out** is a single `delegate_task` call carrying a `tasks` array — one entry per worker. The parent blocks until every child in the batch stops, then you merge their returns. This replaces any notion of a separate workflow tool, background spawning, or named-agent registry: there is no `subagent_type`, no per-child model selection, and no foreign agent name. You shape each child entirely through its `goal`, `context`, optional `toolsets`, and optional `role`.
32
37
  - **Worker roles** (codebase explorer, web/docs librarian, browsing, repo deep-dive, verifier) are not registered agents. Each is a read-only `delegate_task` child whose `goal`/`context` fully describe the role's mandate, scope, protocol, and required reply tail. Two children differ only by the text you give them.
33
38
  - **Recursion** comes from your expansion waves, not from a child spawning its own children. Children are leaves; depth is the parent's job.
@@ -11,7 +11,40 @@ This skill is an index. The hard per-language rules live under `references/`. Lo
11
11
 
12
12
  ---
13
13
 
14
- ## PHASE 0LANGUAGE GATE (RUN THIS FIRST, EVERY TIME)
14
+ ## PHASE -1BUILD-DECISION GATE (RUN BEFORE PHASE 0)
15
+
16
+ Before writing or editing a single line of implementation code, work down these
17
+ checks and stop at the first one that cleanly meets the need:
18
+
19
+ 1. Does this need to exist at all? If the outcome does not require it, do not build it.
20
+ 2. Does the standard library already do it well? If so, use it.
21
+ 3. Is there a native platform, runtime, or framework feature for it? If so, use it.
22
+ 4. Does an already-installed dependency cover it cleanly? If so, reuse it — do not add or hand-roll.
23
+ 5. Can the remaining gap be one clear line? If so, write the one line.
24
+ 6. Only after all of the above fail: write the minimum code that genuinely works — nothing speculative.
25
+
26
+ Scope and floor (these keep the gate from under-building):
27
+
28
+ - Judge "minimum that works" over the WHOLE task, not per call site. If the same
29
+ logic appears at more than one call site, the minimum that works IS one small
30
+ shared helper — extract it.
31
+ - "Works" includes error handling for any failure the code can realistically hit
32
+ (network, parse, missing file, bad state) and the tests that prove the behavior
33
+ you just wrote. Only handling for states that genuinely cannot occur is the
34
+ speculative part to cut.
35
+ - Reach for a stdlib / native / dependency option only when it fits the need
36
+ cleanly, not merely because it technically can.
37
+ - Never shorten away, for the sake of fewer lines: input validation at trust
38
+ boundaries, handling that prevents data loss or corruption, security controls
39
+ (auth, secret handling, injection/escaping), or accessibility. The point is to
40
+ remove redundancy and speculation, never to lower the correctness floor.
41
+
42
+ PHASE -1 decides WHETHER and FROM WHAT to build; PHASE 0 and the per-language iron
43
+ list decide HOW.
44
+
45
+ ---
46
+
47
+ ## PHASE 0 — LANGUAGE GATE (RUN AFTER PHASE -1, EVERY TIME)
15
48
 
16
49
  **DO NOT WRITE OR EDIT A SINGLE LINE OF CODE BEFORE COMPLETING THIS GATE.**
17
50
 
@@ -355,6 +388,7 @@ After every code-writing session, answer these out loud (in your reply) before d
355
388
  5. **Defensive layer?** Any null check, try/except, or `isinstance` guarding a value the type system already proves? If yes, delete.
356
389
  6. **Helpers for one-off?** Any function, class, or trait introduced for a single caller that will never get a second caller? If yes, inline.
357
390
  7. **Tests?** Is the behavior I just introduced locked by a test that would fail if I revert this commit?
391
+ 8. **Necessity & reuse?** Did everything I wrote need to exist, and did I confirm the standard library, a native feature, or an already-installed dependency did not already cover it before I hand-rolled? If not, remove it.
358
392
 
359
393
  **If any answer fails, fix it before declaring done.** This loop is the difference between "the code compiles" and "the code is correct."
360
394
 
@@ -32,6 +32,11 @@ section wins — every foreign delegation call in the prose below is a LEGACY il
32
32
  copied from another harness; never call any of them literally, map each to a
33
33
  `delegate_task` child.
34
34
 
35
+ For durable/background refactor programs that need profile assignees, dependencies,
36
+ comments, and audit trails over time, use Hermes Kanban through the `lit workflow` /
37
+ `lit kanban` route. Do not fake a persistent refactor team on top of short `delegate_task`
38
+ batches.
39
+
35
40
  export const REFACTOR_TEMPLATE = `# Intelligent Refactor Command
36
41
 
37
42
  ## Usage
@@ -22,6 +22,11 @@ the five lane briefs plus the gate contract. Then:
22
22
  Lane → child mapping (dispatch all five in the single batch):
23
23
  `goal` · `qa` · `code-quality` · `security` (supplementary) · `context/docs/package`.
24
24
 
25
+ The `/review-work` command records a local, redacted `delegate_batch_intent` event and
26
+ summary directory before handing off to the model. Treat this as audit evidence only:
27
+ it does not create a persistent team, does not make remote telemetry, and does not
28
+ replace Hermes' fork/join `delegate_task` execution.
29
+
25
30
  Each child returns: `verdict` (PASS|FAIL), `confidence`, and findings with `file:line`.
26
31
  The review must cover behavior, tests, docs/package readiness, security/safety,
27
32
  and cleanup evidence; green tests without a real-surface probe are insufficient.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lithermes-ai",
3
- "version": "0.8.6",
3
+ "version": "0.8.8",
4
4
  "description": "npx/bunx installer for the LitHermes Hermes plugin",
5
5
  "license": "MIT",
6
6
  "repository": {