lithermes-ai 0.5.1 → 0.6.0
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 +5 -4
- package/README_Ko-KR.md +2 -2
- package/assets/lithermes-plugin/README.md +5 -3
- package/assets/lithermes-plugin/__init__.py +10 -0
- package/assets/lithermes-plugin/core.py +40 -0
- package/assets/lithermes-plugin/payload-version.json +53 -49
- package/assets/lithermes-plugin/plugin.yaml +1 -1
- package/assets/lithermes-plugin/skills/comment-checker/SKILL.md +3 -3
- package/assets/lithermes-plugin/skills/deep-interview/SKILL.md +307 -0
- package/assets/lithermes-plugin/skills/rules/SKILL.md +32 -28
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -57,12 +57,13 @@ Restart any running Hermes CLI or Hermes gateway process. Then open Hermes and t
|
|
|
57
57
|
- 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.
|
|
58
58
|
- `start-work`: open or dry-run a LitHermes plan inside Hermes.
|
|
59
59
|
- LitHermes workflow skill set: `ai-slop-remover`, `comment-checker`,
|
|
60
|
-
`debugging`, `frontend-ui-ux`, `lsp`, `programming`, `refactor`,
|
|
60
|
+
`debugging`, `deep-interview`, `frontend-ui-ux`, `lsp`, `programming`, `refactor`,
|
|
61
61
|
`remove-ai-slops`, `review-work`, `rules`, `start-work`, `lit-plan`,
|
|
62
62
|
`litgoal`, and `litwork` are installed as `lithermes:*` skills.
|
|
63
|
-
- The full plugin payload — the `pre_llm_call` / `subagent_stop`
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
- The full plugin payload — the `pre_llm_call` / `subagent_stop` hooks, every
|
|
64
|
+
skill, and the durable goal tooling — ships in the bundle exactly as installed,
|
|
65
|
+
so each release is reproducible and auditable. Repo-rule loading is handled by
|
|
66
|
+
Hermes' native context-files feature, not a LitHermes hook.
|
|
66
67
|
|
|
67
68
|
## Requirements
|
|
68
69
|
|
package/README_Ko-KR.md
CHANGED
|
@@ -57,10 +57,10 @@ npx lithermes-ai install --yes
|
|
|
57
57
|
- interactive install spinner가 terminal 설치는 더 생동감 있게 보여주고, redirect/script 설치는 기존처럼 plain output을 유지합니다. 조용한 terminal 설치가 필요하면 `npx lithermes-ai install --yes --no-spinner`를 사용합니다.
|
|
58
58
|
- `start-work`: LitHermes plan을 Hermes 작업으로 엽니다.
|
|
59
59
|
- LitHermes workflow skill set: `ai-slop-remover`, `comment-checker`,
|
|
60
|
-
`debugging`, `frontend-ui-ux`, `lsp`, `programming`, `refactor`,
|
|
60
|
+
`debugging`, `deep-interview`, `frontend-ui-ux`, `lsp`, `programming`, `refactor`,
|
|
61
61
|
`remove-ai-slops`, `review-work`, `rules`, `start-work`, `lit-plan`,
|
|
62
62
|
`litgoal`, `litwork`가 `lithermes:*` skill로 함께 설치됩니다.
|
|
63
|
-
- 전체 plugin payload — `pre_llm_call` / `subagent_stop`
|
|
63
|
+
- 전체 plugin payload — `pre_llm_call` / `subagent_stop`
|
|
64
64
|
hook, 모든 skill, durable goal tooling — 이 설치 상태 그대로 번들에 들어가므로,
|
|
65
65
|
각 릴리스는 재현 가능하고 감사할 수 있습니다.
|
|
66
66
|
|
|
@@ -14,7 +14,8 @@ first-class Hermes skills:
|
|
|
14
14
|
session goal manager; criteria + evidence use the durable `goal_*` tools.
|
|
15
15
|
- Explicit skills are available as:
|
|
16
16
|
`lithermes:ai-slop-remover`, `lithermes:comment-checker`,
|
|
17
|
-
`lithermes:debugging`, `lithermes:
|
|
17
|
+
`lithermes:debugging`, `lithermes:deep-interview`,
|
|
18
|
+
`lithermes:frontend-ui-ux`, `lithermes:lsp`,
|
|
18
19
|
`lithermes:programming`, `lithermes:refactor`,
|
|
19
20
|
`lithermes:remove-ai-slops`, `lithermes:review-work`,
|
|
20
21
|
`lithermes:rules`, `lithermes:start-work`, `lithermes:lit-plan`,
|
|
@@ -36,5 +37,6 @@ plugins:
|
|
|
36
37
|
The bundled workflow reference is adapted for LitHermes command names and
|
|
37
38
|
Hermes gateway behavior. LitHermes runs entirely on Hermes-native primitives
|
|
38
39
|
(`delegate_task`, the durable `goal_*` tools, and the `pre_llm_call` /
|
|
39
|
-
`subagent_stop`
|
|
40
|
-
prompt-runtime installer in the plugin payload.
|
|
40
|
+
`subagent_stop` hooks) and ships no external
|
|
41
|
+
prompt-runtime installer in the plugin payload. Repo-rule loading is handled by
|
|
42
|
+
Hermes' native context-files feature, not a LitHermes hook.
|
|
@@ -22,6 +22,10 @@ PORTED_SKILLS = [
|
|
|
22
22
|
"debugging",
|
|
23
23
|
"Run the LitHermes hypothesis-driven debugging workflow.",
|
|
24
24
|
),
|
|
25
|
+
(
|
|
26
|
+
"deep-interview",
|
|
27
|
+
"Run the LitHermes Socratic deep-interview clarity gate before planning.",
|
|
28
|
+
),
|
|
25
29
|
(
|
|
26
30
|
"frontend-ui-ux",
|
|
27
31
|
"Apply the LitHermes frontend UI/UX review discipline.",
|
|
@@ -170,6 +174,12 @@ def register(ctx) -> None:
|
|
|
170
174
|
description="Open or dry-run a LitHermes plan against a workspace",
|
|
171
175
|
args_hint="[plan-name] [--worktree PATH] [--dry-run]",
|
|
172
176
|
)
|
|
177
|
+
ctx.register_command(
|
|
178
|
+
"deep-interview",
|
|
179
|
+
core.command_deep_interview,
|
|
180
|
+
description="Run the LitHermes Socratic clarity gate before planning/execution",
|
|
181
|
+
args_hint="[--quick|--standard|--deep] <idea>",
|
|
182
|
+
)
|
|
173
183
|
|
|
174
184
|
for name, description in PORTED_SKILLS:
|
|
175
185
|
ctx.register_skill(
|
|
@@ -805,6 +805,46 @@ def command_litgoal(raw_args: str) -> dict[str, str]:
|
|
|
805
805
|
}
|
|
806
806
|
|
|
807
807
|
|
|
808
|
+
def command_deep_interview(raw_args: str) -> dict[str, str]:
|
|
809
|
+
args = parse_args(raw_args)
|
|
810
|
+
workspace = workspace_from_option(args.options.get("worktree"))
|
|
811
|
+
# `--quick|--standard|--deep` are bare profile flags, but parse_args greedily
|
|
812
|
+
# binds the next bare word as a flag value — so `--quick build a widget` would
|
|
813
|
+
# consume "build". Recover any such word back into the idea text.
|
|
814
|
+
profile = "standard"
|
|
815
|
+
for flag in ("deep", "quick", "standard"):
|
|
816
|
+
value = args.options.get(flag)
|
|
817
|
+
if value:
|
|
818
|
+
profile = flag
|
|
819
|
+
if isinstance(value, str):
|
|
820
|
+
args.positional.insert(0, value)
|
|
821
|
+
break
|
|
822
|
+
idea = _join_positional(args.positional)
|
|
823
|
+
agent_lines = [
|
|
824
|
+
idea or "Run a deep-interview clarification pass before planning.",
|
|
825
|
+
"",
|
|
826
|
+
"<lithermes-deep-interview-command>",
|
|
827
|
+
f"workspace: {workspace}",
|
|
828
|
+
f"profile: {profile}",
|
|
829
|
+
"Run the LitHermes deep-interview clarity gate — load the lithermes:deep-interview skill",
|
|
830
|
+
"and follow it. This is a requirements mode, NOT implementation:",
|
|
831
|
+
"- one Socratic question per round, intent before detail; re-score ambiguity each round;",
|
|
832
|
+
"- gather repo facts with read-only search / delegate_task before asking the user;",
|
|
833
|
+
"- keep Non-goals + Decision Boundaries explicit and run one pressure pass before crystallizing;",
|
|
834
|
+
"- persist state under .hermes/lithermes/deep-interview/<slug>-state.json so it can resume.",
|
|
835
|
+
"When the spec is ready, do NOT build here — hand off: /lit-plan to plan it, or /lit-loop to",
|
|
836
|
+
"execute it, carrying the non-goals, decision boundaries, and acceptance criteria forward.",
|
|
837
|
+
"</lithermes-deep-interview-command>",
|
|
838
|
+
]
|
|
839
|
+
return {
|
|
840
|
+
"display": (
|
|
841
|
+
f"Opened the LitHermes deep-interview clarity gate ({profile} profile).\n"
|
|
842
|
+
"Requirements mode — clarifies, then hands off to /lit-plan or /lit-loop."
|
|
843
|
+
),
|
|
844
|
+
"agent_message": "\n".join(agent_lines),
|
|
845
|
+
}
|
|
846
|
+
|
|
847
|
+
|
|
808
848
|
def command_start_work(raw_args: str) -> str | dict[str, str]:
|
|
809
849
|
args = parse_args(raw_args)
|
|
810
850
|
workspace = workspace_from_option(args.options.get("worktree"))
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
{
|
|
2
|
-
"syncedAt": "2026-06-
|
|
2
|
+
"syncedAt": "2026-06-14T02:25:40.475Z",
|
|
3
3
|
"source": "source-reference",
|
|
4
|
-
"sourceHash": "
|
|
4
|
+
"sourceHash": "09f07fa73866ccb4c0a7dc271d4d1ce45a9ac662ff911fab6f4a6d6e7db73c07",
|
|
5
5
|
"files": [
|
|
6
|
+
{
|
|
7
|
+
"path": "NOTICE.md",
|
|
8
|
+
"sha256": "452ad24ca1ecd65e2f2ab0f21ff6c1cefb13aacf0db875f327b62027106685ab"
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
"path": "README.md",
|
|
12
|
+
"sha256": "32bbef20afd99f774502c2b4cbf2e2326d40c4e4cd71108645849dddcc2608c4"
|
|
13
|
+
},
|
|
6
14
|
{
|
|
7
15
|
"path": "__init__.py",
|
|
8
|
-
"sha256": "
|
|
16
|
+
"sha256": "e545ac92efb1a8d50c467b21b180eb41dad5e9a19379a8cbe5086956c21c3654"
|
|
9
17
|
},
|
|
10
18
|
{
|
|
11
19
|
"path": "core.py",
|
|
12
|
-
"sha256": "
|
|
20
|
+
"sha256": "c8cac49c17e573dabc59c4d5aa56402a71320f62145fabf9552e7fdb648f340a"
|
|
13
21
|
},
|
|
14
22
|
{
|
|
15
23
|
"path": "litgoal/__init__.py",
|
|
@@ -39,17 +47,9 @@
|
|
|
39
47
|
"path": "litgoal/tools.py",
|
|
40
48
|
"sha256": "2e12124666c4dab32087af11c76c970656077e449cca1dbb4f299bab2efdd24a"
|
|
41
49
|
},
|
|
42
|
-
{
|
|
43
|
-
"path": "NOTICE.md",
|
|
44
|
-
"sha256": "452ad24ca1ecd65e2f2ab0f21ff6c1cefb13aacf0db875f327b62027106685ab"
|
|
45
|
-
},
|
|
46
50
|
{
|
|
47
51
|
"path": "plugin.yaml",
|
|
48
|
-
"sha256": "
|
|
49
|
-
},
|
|
50
|
-
{
|
|
51
|
-
"path": "README.md",
|
|
52
|
-
"sha256": "d67b9f8d74aa861483cc28144eefc417493a3d2ac3cf6a6204c77235886b6d6c"
|
|
52
|
+
"sha256": "e90d47b24dc2cb5340d9485929ba40e62b2b5d6858951992c414701f015286fe"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"path": "skills/ai-slop-remover/SKILL.md",
|
|
@@ -57,7 +57,11 @@
|
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
59
|
"path": "skills/comment-checker/SKILL.md",
|
|
60
|
-
"sha256": "
|
|
60
|
+
"sha256": "2fb1c4de76d1cc340b63f92141d36d0a351325d9c9411b9af622dd8b6fca5567"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"path": "skills/debugging/SKILL.md",
|
|
64
|
+
"sha256": "aff2ca5765f490ed1e45d2eaa77c48db3ef98cec12fa10ebff3f91b82eab1254"
|
|
61
65
|
},
|
|
62
66
|
{
|
|
63
67
|
"path": "skills/debugging/references/methodology/00-setup.md",
|
|
@@ -132,8 +136,8 @@
|
|
|
132
136
|
"sha256": "0123de928e1e88186487adfee0b69d7a886c596fdd0c5132256cf9319fea466e"
|
|
133
137
|
},
|
|
134
138
|
{
|
|
135
|
-
"path": "skills/
|
|
136
|
-
"sha256": "
|
|
139
|
+
"path": "skills/deep-interview/SKILL.md",
|
|
140
|
+
"sha256": "4f8e7217b72724921cdc68b5214cc99d7b45ec51fd05b237fac20c75fc35988c"
|
|
137
141
|
},
|
|
138
142
|
{
|
|
139
143
|
"path": "skills/frontend-ui-ux/SKILL.md",
|
|
@@ -159,6 +163,14 @@
|
|
|
159
163
|
"path": "skills/lsp/SKILL.md",
|
|
160
164
|
"sha256": "3e793aaa158156dd60ec11add7375050bbeeb7b3eb77497f1c432d0842abff5c"
|
|
161
165
|
},
|
|
166
|
+
{
|
|
167
|
+
"path": "skills/programming/SKILL.md",
|
|
168
|
+
"sha256": "ffb201197e7386c848f8efb9b90d0a024d7b8000e8bea1b13b0ed7a83627a56b"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"path": "skills/programming/references/go/README.md",
|
|
172
|
+
"sha256": "faedb8ab4e13f4ff03ad3497f3ed44df1b5b71463b741a58ee61b60ddb68b188"
|
|
173
|
+
},
|
|
162
174
|
{
|
|
163
175
|
"path": "skills/programming/references/go/backend-stack.md",
|
|
164
176
|
"sha256": "1ba7769bfe7cd7a001251fabf01133a9df7eaae700705eecb3261955e4cfbfa9"
|
|
@@ -203,10 +215,6 @@
|
|
|
203
215
|
"path": "skills/programming/references/go/one-liners.md",
|
|
204
216
|
"sha256": "ff354a8700a9987ad21f4fb0cf4d5695857cae093c42358bc3eef13826f8ddfb"
|
|
205
217
|
},
|
|
206
|
-
{
|
|
207
|
-
"path": "skills/programming/references/go/README.md",
|
|
208
|
-
"sha256": "faedb8ab4e13f4ff03ad3497f3ed44df1b5b71463b741a58ee61b60ddb68b188"
|
|
209
|
-
},
|
|
210
218
|
{
|
|
211
219
|
"path": "skills/programming/references/go/sqlc-pgx.md",
|
|
212
220
|
"sha256": "26243d7b26e3ffadce87b4f78739e6582c69d5c144af89f2ef55c076b5e1b399"
|
|
@@ -219,6 +227,10 @@
|
|
|
219
227
|
"path": "skills/programming/references/go/type-patterns.md",
|
|
220
228
|
"sha256": "87d930ed6cdc57b3c20aae802679a4f419f77b5fcf4a630a6973271cc62545c7"
|
|
221
229
|
},
|
|
230
|
+
{
|
|
231
|
+
"path": "skills/programming/references/python/README.md",
|
|
232
|
+
"sha256": "23ef4282a10fce99de314ddc3c8d93eca79c92f256c87cf8caa54a2ee703e738"
|
|
233
|
+
},
|
|
222
234
|
{
|
|
223
235
|
"path": "skills/programming/references/python/async-anyio.md",
|
|
224
236
|
"sha256": "26e069cfc9debf45ff1629d0246a6831c64a33f8e595976f8cb19d4b5647ca95"
|
|
@@ -263,10 +275,6 @@
|
|
|
263
275
|
"path": "skills/programming/references/python/pyproject-strict.md",
|
|
264
276
|
"sha256": "655eb106a165d3730d656a9689ac98a00abf7d32cc89f2decaf33ddf43ac0e45"
|
|
265
277
|
},
|
|
266
|
-
{
|
|
267
|
-
"path": "skills/programming/references/python/README.md",
|
|
268
|
-
"sha256": "23ef4282a10fce99de314ddc3c8d93eca79c92f256c87cf8caa54a2ee703e738"
|
|
269
|
-
},
|
|
270
278
|
{
|
|
271
279
|
"path": "skills/programming/references/python/textual-tui.md",
|
|
272
280
|
"sha256": "bf59c001a76b30777882b2c729321d809a2a81bf75b720e72da1c38a3e7708d9"
|
|
@@ -275,18 +283,22 @@
|
|
|
275
283
|
"path": "skills/programming/references/python/type-patterns.md",
|
|
276
284
|
"sha256": "4fa0bf3c7e82c6a7141c54aac9e1703cd9ce86122903dbe2fe00700930ca4626"
|
|
277
285
|
},
|
|
278
|
-
{
|
|
279
|
-
"path": "skills/programming/references/rust-ub/miri-sanitizers-loom.md",
|
|
280
|
-
"sha256": "b3b56208978286dd975440fa1f28d01b9ed05b23d33a1faaa904e62ca310c4e8"
|
|
281
|
-
},
|
|
282
286
|
{
|
|
283
287
|
"path": "skills/programming/references/rust-ub/README.md",
|
|
284
288
|
"sha256": "25300ebe1a467f47695959b00964ded8c560e51bb5d92dffe178f9d3f24b87a9"
|
|
285
289
|
},
|
|
290
|
+
{
|
|
291
|
+
"path": "skills/programming/references/rust-ub/miri-sanitizers-loom.md",
|
|
292
|
+
"sha256": "b3b56208978286dd975440fa1f28d01b9ed05b23d33a1faaa904e62ca310c4e8"
|
|
293
|
+
},
|
|
286
294
|
{
|
|
287
295
|
"path": "skills/programming/references/rust-ub/ub-taxonomy.md",
|
|
288
296
|
"sha256": "7c0b369732920f6e59e67fa2f7a9a10fa4ba5b0a23b95ddd1aa2c4011a661326"
|
|
289
297
|
},
|
|
298
|
+
{
|
|
299
|
+
"path": "skills/programming/references/rust/README.md",
|
|
300
|
+
"sha256": "7502ee277c86df00388ea7cdbc5b54fc743d4eacab8b4015cd00ad0483ead727"
|
|
301
|
+
},
|
|
290
302
|
{
|
|
291
303
|
"path": "skills/programming/references/rust/async-tokio.md",
|
|
292
304
|
"sha256": "48e54d0b4be71fe1765e9bc62e0073a767abd966e29d4b456ae1326d0dc7b760"
|
|
@@ -319,10 +331,6 @@
|
|
|
319
331
|
"path": "skills/programming/references/rust/proptest-insta.md",
|
|
320
332
|
"sha256": "be787a4e174f55062931b70c53027a6c46423e3473608b315ac800b52325c3d1"
|
|
321
333
|
},
|
|
322
|
-
{
|
|
323
|
-
"path": "skills/programming/references/rust/README.md",
|
|
324
|
-
"sha256": "7502ee277c86df00388ea7cdbc5b54fc743d4eacab8b4015cd00ad0483ead727"
|
|
325
|
-
},
|
|
326
334
|
{
|
|
327
335
|
"path": "skills/programming/references/rust/type-state.md",
|
|
328
336
|
"sha256": "3dc21686fa0b2f1cb0c6206e38b800aa8b9ecf482d02faa9c1c4fd925da051e5"
|
|
@@ -335,6 +343,10 @@
|
|
|
335
343
|
"path": "skills/programming/references/rust/zero-cost-safety.md",
|
|
336
344
|
"sha256": "a03623f9e0d80cdb5c2addddb97b27932c84adb5232b2d659442ba5e74e37bbb"
|
|
337
345
|
},
|
|
346
|
+
{
|
|
347
|
+
"path": "skills/programming/references/typescript/README.md",
|
|
348
|
+
"sha256": "c54f997b70659b574ce805196aefd9978354da5f73d5fdb6defbce1abf11041e"
|
|
349
|
+
},
|
|
338
350
|
{
|
|
339
351
|
"path": "skills/programming/references/typescript/backend-hono.md",
|
|
340
352
|
"sha256": "7df19dd33da142423412ad4a0fa67a8b800e79d200adc62e20d05bcb15ff8e4f"
|
|
@@ -351,10 +363,6 @@
|
|
|
351
363
|
"path": "skills/programming/references/typescript/error-handling.md",
|
|
352
364
|
"sha256": "5d99ea45d454723b1d8292357a7a20b434801101336863df89e000c67bf1e807"
|
|
353
365
|
},
|
|
354
|
-
{
|
|
355
|
-
"path": "skills/programming/references/typescript/README.md",
|
|
356
|
-
"sha256": "c54f997b70659b574ce805196aefd9978354da5f73d5fdb6defbce1abf11041e"
|
|
357
|
-
},
|
|
358
366
|
{
|
|
359
367
|
"path": "skills/programming/references/typescript/tsconfig-strict.md",
|
|
360
368
|
"sha256": "e844903aa4dcf9c5e45592eccbbf04d6146c602c70067c72be74f523b0e2134d"
|
|
@@ -383,6 +391,14 @@
|
|
|
383
391
|
"path": "skills/programming/scripts/go/templates/AGENTS.md.tmpl",
|
|
384
392
|
"sha256": "ac81f2614b1417dfc5b0ca21c40ee74c357b55a97c92cb02db84ac418587c744"
|
|
385
393
|
},
|
|
394
|
+
{
|
|
395
|
+
"path": "skills/programming/scripts/go/templates/README.md.tmpl",
|
|
396
|
+
"sha256": "b0780490defb300a8ec5cd46555074ab58f9147d298964ff5ce2a40d24dde066"
|
|
397
|
+
},
|
|
398
|
+
{
|
|
399
|
+
"path": "skills/programming/scripts/go/templates/Taskfile.yml",
|
|
400
|
+
"sha256": "eb59766ea776398a4109383dc279c13673dbad3645f1a2a4f70da92bd08f48b6"
|
|
401
|
+
},
|
|
386
402
|
{
|
|
387
403
|
"path": "skills/programming/scripts/go/templates/ci.yml",
|
|
388
404
|
"sha256": "8403a5a4dd6d55773aa651600dc95d01bfc2462ce6756903ec3d2a4330371df7"
|
|
@@ -399,18 +415,10 @@
|
|
|
399
415
|
"path": "skills/programming/scripts/go/templates/main.go.tmpl",
|
|
400
416
|
"sha256": "de00e3621a5e9e7c4639936f3822bdffc512c7fd04bc089144f0e3f49c8e31a5"
|
|
401
417
|
},
|
|
402
|
-
{
|
|
403
|
-
"path": "skills/programming/scripts/go/templates/README.md.tmpl",
|
|
404
|
-
"sha256": "b0780490defb300a8ec5cd46555074ab58f9147d298964ff5ce2a40d24dde066"
|
|
405
|
-
},
|
|
406
418
|
{
|
|
407
419
|
"path": "skills/programming/scripts/go/templates/run.go",
|
|
408
420
|
"sha256": "b59b73b7d0fe0122531d4523b8d72be3517bee015af41358e18edb18f183823f"
|
|
409
421
|
},
|
|
410
|
-
{
|
|
411
|
-
"path": "skills/programming/scripts/go/templates/Taskfile.yml",
|
|
412
|
-
"sha256": "eb59766ea776398a4109383dc279c13673dbad3645f1a2a4f70da92bd08f48b6"
|
|
413
|
-
},
|
|
414
422
|
{
|
|
415
423
|
"path": "skills/programming/scripts/python/check-no-excuse-rules.py",
|
|
416
424
|
"sha256": "2b2f629dcbbf05f2ab533d23ecab0825d5c6d091e5a5837090200e93afdc0767"
|
|
@@ -443,10 +451,6 @@
|
|
|
443
451
|
"path": "skills/programming/scripts/typescript/new-project.ts",
|
|
444
452
|
"sha256": "495e5add86f0ca9819f537e51083c34b6480e1f7d147ded7c9cf93fdbe48ccc5"
|
|
445
453
|
},
|
|
446
|
-
{
|
|
447
|
-
"path": "skills/programming/SKILL.md",
|
|
448
|
-
"sha256": "ffb201197e7386c848f8efb9b90d0a024d7b8000e8bea1b13b0ed7a83627a56b"
|
|
449
|
-
},
|
|
450
454
|
{
|
|
451
455
|
"path": "skills/refactor/SKILL.md",
|
|
452
456
|
"sha256": "d4e160e256b5a5e1fae4170edeee7a6bc8e2338bbebec797e24f07ea70687a10"
|
|
@@ -461,7 +465,7 @@
|
|
|
461
465
|
},
|
|
462
466
|
{
|
|
463
467
|
"path": "skills/rules/SKILL.md",
|
|
464
|
-
"sha256": "
|
|
468
|
+
"sha256": "bc0a046745c455b5abb5ff8966d1d19245bf41576a44ed9be2c7917198ddbc03"
|
|
465
469
|
},
|
|
466
470
|
{
|
|
467
471
|
"path": "skills/start-work/SKILL.md",
|
|
@@ -5,9 +5,9 @@ description: Use after edits to self-review the comments you just wrote or touch
|
|
|
5
5
|
|
|
6
6
|
# Comment Checker
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
The LitHermes plugin registers only the `pre_llm_call` and `subagent_stop` hooks —
|
|
9
|
+
it wires **no** per-edit hook that fires after a write or edit. So this is not an
|
|
10
|
+
automatic gate; it is a discipline **you self-apply** immediately after you change a
|
|
11
11
|
file. Treat every successful write/edit/patch as the trigger to run the checklist below
|
|
12
12
|
on the comments in that diff before you move on.
|
|
13
13
|
|
|
@@ -0,0 +1,307 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: deep-interview
|
|
3
|
+
description: Socratic deep-interview loop that turns a vague idea into an execution-ready spec, using a quantitative ambiguity score to gate when requirements are clear enough to build. Use this BEFORE planning or implementation whenever a request is broad, underspecified, or missing acceptance criteria — or when the user says "interview me", "ask me everything", "don't assume", or "deep interview". Invoke directly with /deep-interview.
|
|
4
|
+
argument-hint: "[--quick|--standard|--deep] <idea or vague description>"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
<Purpose>
|
|
8
|
+
Deep Interview is an intent-first Socratic clarification loop that runs before planning or implementation. It turns vague ideas into execution-ready specifications by asking targeted questions about why the user wants a change, how far it should go, what should stay out of scope, and what the implementer may decide without confirmation. In LitHermes it is the clarity gate that feeds `/lit-plan` and then `/lit-loop`.
|
|
9
|
+
</Purpose>
|
|
10
|
+
|
|
11
|
+
<Use_When>
|
|
12
|
+
- The request is broad, ambiguous, or missing concrete acceptance criteria
|
|
13
|
+
- The user says "deep interview", "interview me", "ask me everything", or "don't assume"
|
|
14
|
+
- The user wants to avoid misaligned implementation from underspecified requirements
|
|
15
|
+
- You need a clear requirements artifact before handing off to planning or implementation
|
|
16
|
+
</Use_When>
|
|
17
|
+
|
|
18
|
+
<Do_Not_Use_When>
|
|
19
|
+
- The request already has concrete file/symbol targets and clear acceptance criteria
|
|
20
|
+
- The user explicitly asks to skip planning/interview and execute immediately
|
|
21
|
+
- The user asks for lightweight, open-ended brainstorming only
|
|
22
|
+
- A complete spec/plan already exists and execution should start
|
|
23
|
+
</Do_Not_Use_When>
|
|
24
|
+
|
|
25
|
+
<Why_This_Exists>
|
|
26
|
+
Execution quality is usually bottlenecked by intent clarity, not just missing implementation detail. A single expansion pass often misses why the user wants a change, where the scope should stop, which tradeoffs are unacceptable, and which decisions still require user approval. This workflow applies Socratic pressure + quantitative ambiguity scoring so downstream planning and execution begin with an explicit, testable, intent-aligned spec.
|
|
27
|
+
</Why_This_Exists>
|
|
28
|
+
|
|
29
|
+
<Depth_Profiles>
|
|
30
|
+
| Profile | Flag | Target ambiguity | Max rounds | Use for |
|
|
31
|
+
|---------|------|-----------------:|-----------:|---------|
|
|
32
|
+
| Quick | `--quick` | ≤ 30% | 5 | Fast pre-spec pass |
|
|
33
|
+
| Standard *(default)* | `--standard` | ≤ 20% | 12 | Full requirement interview |
|
|
34
|
+
| Deep | `--deep` | ≤ 15% | 20 | High-rigor exploration |
|
|
35
|
+
|
|
36
|
+
If no flag is provided, use **Standard**.
|
|
37
|
+
</Depth_Profiles>
|
|
38
|
+
|
|
39
|
+
<Execution_Policy>
|
|
40
|
+
- Ask ONE question per round (never batch)
|
|
41
|
+
- Ask about intent and boundaries before implementation detail
|
|
42
|
+
- Target the weakest clarity dimension each round after applying the stage-priority rules below
|
|
43
|
+
- Treat every answer as a claim to pressure-test before moving on: the next question should usually demand evidence or examples, expose a hidden assumption, force a tradeoff or boundary, or reframe root cause vs symptom
|
|
44
|
+
- Do not rotate to a new clarity dimension just for coverage when the current answer is still vague; stay on the same thread until one layer deeper, one assumption clearer, or one boundary tighter
|
|
45
|
+
- Before crystallizing, complete at least one explicit pressure pass that revisits an earlier answer with a deeper, assumption-focused, or tradeoff-focused follow-up
|
|
46
|
+
- Gather codebase facts with read-only search tools (or a read-only `delegate_task` exploration child) before asking the user about internals
|
|
47
|
+
- Keep exploration prompts narrow and concrete; fall back to the user only for facts that can't be discovered directly
|
|
48
|
+
- Always run a preflight context intake before the first interview question
|
|
49
|
+
- Reduce user effort: ask only the highest-leverage unresolved question, and never ask the user for codebase facts you can discover yourself
|
|
50
|
+
- For brownfield work, prefer evidence-backed confirmation questions such as "I found X in Y. Should this change follow that pattern?"
|
|
51
|
+
- Ask each round as one concise plain-text question (the Hermes reply channel has no structured multiple-choice prompt); render the ambiguity meter immediately above it
|
|
52
|
+
- Re-score ambiguity after each answer and show progress transparently
|
|
53
|
+
- Do not hand off to execution while ambiguity remains above threshold unless the user explicitly opts to proceed with warning
|
|
54
|
+
- Do not crystallize or hand off while `Non-goals` or `Decision Boundaries` remain unresolved, even if the weighted ambiguity threshold is met
|
|
55
|
+
- Treat early exit as a safety valve, not the default success path
|
|
56
|
+
- Persist progress to a state file after each round so the interview can resume if interrupted
|
|
57
|
+
</Execution_Policy>
|
|
58
|
+
|
|
59
|
+
<Steps>
|
|
60
|
+
|
|
61
|
+
## Phase 0: Preflight Context Intake
|
|
62
|
+
|
|
63
|
+
1. Parse `{{ARGUMENTS}}` and derive a short task slug.
|
|
64
|
+
2. Attempt to load the latest relevant context snapshot from `.hermes/lithermes/deep-interview/{slug}-context.md`.
|
|
65
|
+
3. If no snapshot exists, create a minimum context snapshot with:
|
|
66
|
+
- Task statement
|
|
67
|
+
- Desired outcome
|
|
68
|
+
- Stated solution (what the user asked for)
|
|
69
|
+
- Probable intent hypothesis (why they likely want it)
|
|
70
|
+
- Known facts/evidence
|
|
71
|
+
- Constraints
|
|
72
|
+
- Unknowns/open questions
|
|
73
|
+
- Decision-boundary unknowns
|
|
74
|
+
- Likely codebase touchpoints
|
|
75
|
+
4. Save the snapshot to `.hermes/lithermes/deep-interview/{slug}-context.md` and reference it in the state file.
|
|
76
|
+
|
|
77
|
+
## Phase 1: Initialize
|
|
78
|
+
|
|
79
|
+
1. Parse `{{ARGUMENTS}}` and depth profile (`--quick|--standard|--deep`).
|
|
80
|
+
2. Detect project context:
|
|
81
|
+
- Classify **brownfield** (existing codebase target) vs **greenfield** using read-only search.
|
|
82
|
+
- For brownfield, collect relevant codebase context before questioning.
|
|
83
|
+
3. Initialize the state file at `.hermes/lithermes/deep-interview/{slug}-state.json`. Set `threshold` and `max_rounds` from the chosen profile (see the Depth Profiles table) — the values below are illustrative:
|
|
84
|
+
|
|
85
|
+
```json
|
|
86
|
+
{
|
|
87
|
+
"active": true,
|
|
88
|
+
"current_phase": "deep-interview",
|
|
89
|
+
"state": {
|
|
90
|
+
"interview_id": "<uuid>",
|
|
91
|
+
"profile": "quick|standard|deep",
|
|
92
|
+
"type": "greenfield|brownfield",
|
|
93
|
+
"initial_idea": "<user input>",
|
|
94
|
+
"rounds": [],
|
|
95
|
+
"current_ambiguity": 1.0,
|
|
96
|
+
"threshold": 0.2,
|
|
97
|
+
"max_rounds": 12,
|
|
98
|
+
"challenge_modes_used": [],
|
|
99
|
+
"codebase_context": null,
|
|
100
|
+
"current_stage": "intent-first",
|
|
101
|
+
"current_focus": "intent",
|
|
102
|
+
"context_snapshot_path": ".hermes/lithermes/deep-interview/<slug>-context.md"
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
4. Announce kickoff with a compact banner so the user immediately understands the contract (profile, target, budget, starting point). Render it before the first question:
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
🎯 Deep Interview · {Quick|Standard|Deep} · {greenfield|brownfield}
|
|
111
|
+
Goal turn "{short initial idea}" into an execution-ready spec
|
|
112
|
+
Target ambiguity ≤ {threshold}% · Budget up to {max_rounds} rounds
|
|
113
|
+
Starting ambiguity {score}% · One question per round, intent before detail
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Phase 2: Socratic Interview Loop
|
|
117
|
+
|
|
118
|
+
Repeat until ambiguity `<= threshold`, the pressure pass is complete, the readiness gates are explicit, the user exits with warning, or max rounds are reached.
|
|
119
|
+
|
|
120
|
+
### 2a) Generate next question
|
|
121
|
+
Use:
|
|
122
|
+
- Original idea
|
|
123
|
+
- Prior Q&A rounds
|
|
124
|
+
- Current dimension scores
|
|
125
|
+
- Brownfield context (if any)
|
|
126
|
+
- Activated challenge mode injection (Phase 3)
|
|
127
|
+
|
|
128
|
+
Target the lowest-scoring dimension, but respect stage priority:
|
|
129
|
+
- **Stage 1 — Intent-first:** Intent, Outcome, Scope, Non-goals, Decision Boundaries
|
|
130
|
+
- **Stage 2 — Feasibility:** Constraints, Success Criteria
|
|
131
|
+
- **Stage 3 — Brownfield grounding:** Context Clarity (brownfield only)
|
|
132
|
+
|
|
133
|
+
Follow-up pressure ladder after each answer:
|
|
134
|
+
1. Ask for a concrete example, counterexample, or evidence signal behind the latest claim
|
|
135
|
+
2. Probe the hidden assumption, dependency, or belief that makes the claim true
|
|
136
|
+
3. Force a boundary or tradeoff: what would you explicitly not do, defer, or reject?
|
|
137
|
+
4. If the answer still describes symptoms, reframe toward essence / root cause before moving on
|
|
138
|
+
|
|
139
|
+
Prefer staying on the same thread for multiple rounds when it has the highest leverage. Breadth without pressure is not progress.
|
|
140
|
+
|
|
141
|
+
Detailed dimensions:
|
|
142
|
+
- Intent Clarity — why the user wants this
|
|
143
|
+
- Outcome Clarity — what end state they want
|
|
144
|
+
- Scope Clarity — how far the change should go
|
|
145
|
+
- Constraint Clarity — technical or business limits that must hold
|
|
146
|
+
- Success Criteria Clarity — how completion will be judged
|
|
147
|
+
- Context Clarity — existing codebase understanding (brownfield only)
|
|
148
|
+
|
|
149
|
+
`Non-goals` and `Decision Boundaries` are mandatory readiness gates. Ask about them early and keep revisiting them until they are explicit.
|
|
150
|
+
|
|
151
|
+
### 2b) Ask the question
|
|
152
|
+
Lead with a one-glance ambiguity meter so the user always sees how close the spec is to ready and how much budget remains. The meter is a *draining gauge*: the filled cells represent the ambiguity that still remains, and a `┊` tick marks the target — the job each round is to drain the filled edge down to or under the tick.
|
|
153
|
+
|
|
154
|
+
```
|
|
155
|
+
Round {n}/{max_rounds} · Stage {1-3}: {stage name} · Focus: {weakest_dimension}
|
|
156
|
+
Ambiguity {score}% [███████░░░░░░░░░░░░░░░] target ≤ {threshold}%
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
Then ask exactly one plain-text question.
|
|
160
|
+
|
|
161
|
+
### 2c) Score ambiguity
|
|
162
|
+
Score each weighted dimension in `[0.0, 1.0]` with justification + gap.
|
|
163
|
+
|
|
164
|
+
Greenfield: `ambiguity = 1 - (intent × 0.30 + outcome × 0.25 + scope × 0.20 + constraints × 0.15 + success × 0.10)`
|
|
165
|
+
|
|
166
|
+
Brownfield: `ambiguity = 1 - (intent × 0.25 + outcome × 0.20 + scope × 0.20 + constraints × 0.15 + success × 0.10 + context × 0.10)`
|
|
167
|
+
|
|
168
|
+
Readiness gate:
|
|
169
|
+
- `Non-goals` must be explicit
|
|
170
|
+
- `Decision Boundaries` must be explicit
|
|
171
|
+
- A pressure pass must be complete: at least one earlier answer has been revisited with an evidence, assumption, or tradeoff follow-up
|
|
172
|
+
- If either gate is unresolved, or the pressure pass is incomplete, continue interviewing even when weighted ambiguity is below threshold
|
|
173
|
+
|
|
174
|
+
### 2d) Report progress
|
|
175
|
+
After scoring, show a compact breakdown so the user sees *what moved* and *what's still blocking readiness*. The readiness gates are shown every round (not just at the end), because they can block crystallization even when the weighted score is already under threshold.
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
Clarity
|
|
179
|
+
Intent ▓▓▓▓▓▓▓▓░░ 0.80 why they want it — clear
|
|
180
|
+
Outcome ▓▓▓▓▓▓░░░░ 0.60 end state — partially defined
|
|
181
|
+
Scope ▓▓▓▓░░░░░░ 0.40 ← weakest, next focus
|
|
182
|
+
Constraints ▓▓▓▓▓▓▓░░░ 0.70 limits mostly known
|
|
183
|
+
Success ▓▓▓░░░░░░░ 0.30 no acceptance criteria yet
|
|
184
|
+
(Context) ▓▓▓▓▓░░░░░ 0.50 brownfield only
|
|
185
|
+
|
|
186
|
+
Readiness gates
|
|
187
|
+
✅ Non-goals explicit ⬜ Decision Boundaries ✅ Pressure pass done
|
|
188
|
+
→ blocked by: Decision Boundaries (not yet explicit)
|
|
189
|
+
|
|
190
|
+
Ambiguity {prev}% → {new}% · Next: {weakest_dimension}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Use `✅` for met gates and `⬜` for open ones, and name what's blocking. If all gates are met and ambiguity is under threshold, say so plainly: "All gates met — ready to crystallize."
|
|
194
|
+
|
|
195
|
+
### 2e) Persist state
|
|
196
|
+
Append the round result and updated scores to the state file.
|
|
197
|
+
|
|
198
|
+
### 2f) Round controls
|
|
199
|
+
- Do not offer early exit before the first explicit assumption probe and one persistent follow-up have happened
|
|
200
|
+
- Round 4+: allow explicit early exit with risk warning. Make it visible once available — add a quiet footer line, e.g. `(You can say "good enough" to stop early and crystallize with the current clarity.)`
|
|
201
|
+
- Soft warning at profile midpoint (e.g., round 3/6/10 depending on profile): surface remaining budget, e.g. `⚠️ Round {n}/{max_rounds} — {remaining} rounds left before the cap.`
|
|
202
|
+
- Hard cap at profile `max_rounds`
|
|
203
|
+
|
|
204
|
+
## Phase 3: Challenge Modes (assumption stress tests)
|
|
205
|
+
|
|
206
|
+
Use each mode once when applicable. These are normal escalation tools, not rare rescue moves:
|
|
207
|
+
|
|
208
|
+
- **Contrarian** (round 2+ or immediately when an answer rests on an untested assumption): challenge core assumptions
|
|
209
|
+
- **Simplifier** (round 4+ or when scope expands faster than outcome clarity): probe minimal viable scope
|
|
210
|
+
- **Essence** (round 5+ and ambiguity > 0.25, or when the user keeps describing symptoms): ask for essence-level reframing
|
|
211
|
+
|
|
212
|
+
Track used modes in the state file to prevent repetition.
|
|
213
|
+
|
|
214
|
+
## Phase 4: Crystallize Artifacts
|
|
215
|
+
|
|
216
|
+
When threshold is met (or user exits with warning / hard cap):
|
|
217
|
+
|
|
218
|
+
1. Write the interview transcript summary to `.hermes/lithermes/deep-interview/{slug}-transcript.md`.
|
|
219
|
+
2. Write the execution-ready spec to `.hermes/lithermes/deep-interview/{slug}-spec.md`.
|
|
220
|
+
|
|
221
|
+
Spec should include:
|
|
222
|
+
- Metadata (profile, rounds, final ambiguity, threshold, context type)
|
|
223
|
+
- Context snapshot reference/path (for downstream reuse)
|
|
224
|
+
- Clarity breakdown table
|
|
225
|
+
- Intent (why the user wants this)
|
|
226
|
+
- Desired Outcome
|
|
227
|
+
- In-Scope
|
|
228
|
+
- Out-of-Scope / Non-goals
|
|
229
|
+
- Decision Boundaries (what the implementer may decide without confirmation)
|
|
230
|
+
- Constraints
|
|
231
|
+
- Testable acceptance criteria
|
|
232
|
+
- Assumptions exposed + resolutions
|
|
233
|
+
- Pressure-pass findings (which answer was revisited, and what changed)
|
|
234
|
+
- Brownfield evidence vs inference notes for any repository-grounded confirmation questions
|
|
235
|
+
- Technical context findings
|
|
236
|
+
- Full or condensed transcript
|
|
237
|
+
|
|
238
|
+
## Phase 5: Handoff
|
|
239
|
+
|
|
240
|
+
Deep-interview is a requirements mode. When the spec is ready, hand off to planning or implementation — do **not** implement directly here. The spec is the requirements source of truth: preserve intent, non-goals, decision boundaries, acceptance criteria, and any residual-risk warning across the handoff.
|
|
241
|
+
|
|
242
|
+
Present a short menu of next steps and let the user choose:
|
|
243
|
+
|
|
244
|
+
```
|
|
245
|
+
Spec ready → .hermes/lithermes/deep-interview/{slug}-spec.md · final ambiguity {score}%{ · residual risk: <reason>}
|
|
246
|
+
|
|
247
|
+
1. Plan /lit-plan — turn the spec into a detailed implementation/architecture plan first
|
|
248
|
+
2. Build /lit-loop — implement directly; the spec is strong enough to start
|
|
249
|
+
3. Refine keep interviewing — ambiguity or boundaries are still too loose
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
When handing the spec to `/lit-plan` or `/lit-loop`:
|
|
253
|
+
- Pass the spec file as the requirements source of truth; don't re-run the interview unless the user asks to refine.
|
|
254
|
+
- Carry the non-goals, decision boundaries, and acceptance criteria forward as binding constraints.
|
|
255
|
+
|
|
256
|
+
**Residual-Risk Rule:** if the interview ended via early exit, hard-cap completion, or proceed-with-warning, state that residual risk explicitly in the handoff so the downstream step knows it inherited a partially clarified brief.
|
|
257
|
+
|
|
258
|
+
</Steps>
|
|
259
|
+
|
|
260
|
+
<Tool_Usage>
|
|
261
|
+
- Use read-only search tools (or a read-only `delegate_task` exploration child) for codebase fact gathering
|
|
262
|
+
- Ask each interview round as a single concise plain-text question; keep the same stage order
|
|
263
|
+
- Persist round state to `.hermes/lithermes/deep-interview/{slug}-state.json` for resumability; read it back to resume
|
|
264
|
+
- Read/write the context snapshot at `.hermes/lithermes/deep-interview/{slug}-context.md`
|
|
265
|
+
- Save transcript and spec artifacts to `.hermes/lithermes/deep-interview/{slug}-transcript.md` and `.hermes/lithermes/deep-interview/{slug}-spec.md`
|
|
266
|
+
</Tool_Usage>
|
|
267
|
+
|
|
268
|
+
<Escalation_And_Stop_Conditions>
|
|
269
|
+
- User says stop/cancel/abort -> persist state and stop
|
|
270
|
+
- Ambiguity stalls for 3 rounds (+/- 0.05) -> force Essence mode once
|
|
271
|
+
- Max rounds reached -> proceed with explicit residual-risk warning
|
|
272
|
+
- All dimensions >= 0.9 -> allow early crystallization even before max rounds
|
|
273
|
+
</Escalation_And_Stop_Conditions>
|
|
274
|
+
|
|
275
|
+
<Final_Checklist>
|
|
276
|
+
- [ ] Preflight context snapshot exists at `.hermes/lithermes/deep-interview/{slug}-context.md`
|
|
277
|
+
- [ ] Progress strip (round budget + ambiguity bar) shown each round
|
|
278
|
+
- [ ] Readiness-gate status (`Non-goals`, `Decision Boundaries`, pressure pass) shown each round with what's blocking
|
|
279
|
+
- [ ] Intent-first stage priority used before implementation detail
|
|
280
|
+
- [ ] Weakest-dimension targeting used within the active stage
|
|
281
|
+
- [ ] At least one explicit assumption probe happened before crystallization
|
|
282
|
+
- [ ] At least one persistent follow-up / pressure pass deepened a prior answer
|
|
283
|
+
- [ ] Challenge modes triggered at thresholds (when applicable)
|
|
284
|
+
- [ ] Transcript written to `.hermes/lithermes/deep-interview/{slug}-transcript.md`
|
|
285
|
+
- [ ] Spec written to `.hermes/lithermes/deep-interview/{slug}-spec.md`
|
|
286
|
+
- [ ] Brownfield questions use evidence-backed confirmation when applicable
|
|
287
|
+
- [ ] Next-step handoff menu presented (`/lit-plan` / `/lit-loop` / Refine)
|
|
288
|
+
- [ ] No direct implementation performed in this mode
|
|
289
|
+
</Final_Checklist>
|
|
290
|
+
|
|
291
|
+
<Advanced>
|
|
292
|
+
## Resume
|
|
293
|
+
|
|
294
|
+
If interrupted, rerun the skill. Resume by reading the persisted state file (`.hermes/lithermes/deep-interview/{slug}-state.json`) and continuing from the last completed round.
|
|
295
|
+
|
|
296
|
+
## Recommended pipeline
|
|
297
|
+
|
|
298
|
+
```
|
|
299
|
+
deep-interview → /lit-plan → /lit-loop
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
- Stage 1 (deep-interview): clarity gate — this skill
|
|
303
|
+
- Stage 2 (`/lit-plan`): feasibility + architecture gate
|
|
304
|
+
- Stage 3 (`/lit-loop`): build + QA + validation gate
|
|
305
|
+
</Advanced>
|
|
306
|
+
|
|
307
|
+
Task: {{ARGUMENTS}}
|
|
@@ -1,41 +1,45 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: rules
|
|
3
|
-
description: Use when the user asks about LitHermes repo-rule loading, injected project
|
|
3
|
+
description: Use when the user asks about LitHermes/Hermes repo-rule loading, injected project context files, supported file locations, discovery order, or how repository instructions reach the model.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Repo Rules
|
|
7
7
|
|
|
8
|
-
Repo
|
|
9
|
-
|
|
8
|
+
Repo-rule loading in a LitHermes workspace is provided by **Hermes' native
|
|
9
|
+
context-files feature**, not by a LitHermes plugin engine. Hermes discovers and
|
|
10
|
+
injects your repository instruction files automatically; the LitHermes plugin
|
|
11
|
+
does not register its own rules hook (it registers only `pre_llm_call` and
|
|
12
|
+
`subagent_stop`) and does not re-implement rule loading. This skill documents how
|
|
13
|
+
the native behavior works so you can rely on it and apply matched guidance.
|
|
10
14
|
|
|
11
|
-
|
|
12
|
-
- file-specific rules are surfaced as guidance the model self-applies whenever it
|
|
13
|
-
edits a matching file (there is no per-edit plugin hook in Hermes; the matching
|
|
14
|
-
rule text is treated as a standing instruction the model checks before/after edits)
|
|
15
|
+
## What Hermes loads
|
|
15
16
|
|
|
16
|
-
|
|
17
|
-
|
|
17
|
+
At session start Hermes loads the project context file from your working
|
|
18
|
+
directory into the system prompt. As the agent reads files in subdirectories
|
|
19
|
+
during the session, it **progressively discovers** context files there and
|
|
20
|
+
injects them when they become relevant — so subdirectory guidance appears only
|
|
21
|
+
when needed and the system prompt stays cache-stable.
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
Only **one** project context type is loaded per session (first match wins):
|
|
20
24
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
- `.cursor/rules/**/*.md`
|
|
27
|
-
- `.github/instructions/**/*.md`
|
|
28
|
-
- `.github/copilot-instructions.md`
|
|
25
|
+
1. `.hermes.md` / `HERMES.md` — project instructions (highest priority)
|
|
26
|
+
2. `AGENTS.md` — primary project conventions / architecture
|
|
27
|
+
3. `CLAUDE.md` — Claude Code context files (also detected)
|
|
28
|
+
4. `.cursorrules` — Cursor IDE conventions
|
|
29
|
+
5. `.cursor/rules/*.mdc` — Cursor IDE rule modules
|
|
29
30
|
|
|
30
|
-
|
|
31
|
+
`SOUL.md` is loaded independently as the agent identity and is global to the
|
|
32
|
+
Hermes instance (read from `HERMES_HOME/SOUL.md` only), not per-project.
|
|
31
33
|
|
|
32
|
-
|
|
33
|
-
-
|
|
34
|
-
- `HERMES_RULES_MAX_RULE_CHARS=<number>`
|
|
35
|
-
- `HERMES_RULES_MAX_RESULT_CHARS=<number>`
|
|
36
|
-
- `HERMES_RULES_ENABLED_SOURCES=AGENTS.md,.hermes/rules`
|
|
34
|
+
Discovered context files go through Hermes' security scan, so malicious or
|
|
35
|
+
prompt-injecting files are blocked before they reach the model.
|
|
37
36
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
37
|
+
## How LitHermes uses it
|
|
38
|
+
|
|
39
|
+
- There is no per-edit plugin hook in Hermes' LitHermes plugin, so file-specific
|
|
40
|
+
guidance you read from a discovered `AGENTS.md`/`CLAUDE.md` is a **standing
|
|
41
|
+
instruction you self-apply** before and after edits to matching files.
|
|
42
|
+
- Repo rules only add context; they never rewrite tool output.
|
|
43
|
+
|
|
44
|
+
For the authoritative, version-specific details (priority, subdirectory
|
|
45
|
+
discovery, and the security scan) see the Hermes "Context Files" documentation.
|