@skyf0xx/hedgehog-core-deepseek-harness 0.2.0 → 0.2.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skyf0xx/hedgehog-core-deepseek-harness",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Hedgehog's deepseek-harness core: a pinned DSH/Cordis plugin workspace, a tool-plugin generator, and the skills that drive building DeepSeek Harness plugins with Hedgehog's build discipline.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -56,6 +56,11 @@ Everything under this package's `workspace/`, copied to the repo root:
56
56
  `dsh-credentials-local` provider reads from a project-root `.env`.
57
57
  Copy to `.env` and fill in before any layer past `wiring` runs; `.env`
58
58
  itself is gitignored, never committed.
59
+ - `README.md` — a thin index: what the workspace is, plus a `## Plugins`
60
+ section. `pnpm generate:tool <name>` appends one bullet here per new
61
+ plugin, right after the `<!-- plugin-readme-links -->` marker, linking
62
+ to that plugin's own generated README — this file is never hand-edited
63
+ beyond that.
59
64
 
60
65
  `node_modules` is not part of the copy — `pnpm install` regenerates it
61
66
  from the committed `pnpm-lock.yaml`.
@@ -114,11 +119,16 @@ are typecheck/structural checks against source files, not a real DSH
114
119
  boot. `smoke` (and later, `dsh web`) does: it boots a real profile and
115
120
  calls the model, so it needs `DEEPSEEK_API_KEY` resolvable by DSH's
116
121
  `dsh-credentials-local` provider. The simplest path is a `.env` file at
117
- the workspace root — `workspace/.env.example` documents this; copy it
118
- to `workspace/.env` and fill in the key (gitignored, never committed).
119
- Confirm with the user this exists or that they'll add it before
120
- `harness-eng` reaches a plugin's `smoke` layer — raise it now rather
121
- than letting it surface as a late failure three layers in.
122
+ the repo root — `.env.example` documents this.
123
+
124
+ Copy `.env.example` to `.env` yourself, leaving `DEEPSEEK_API_KEY=`
125
+ blank — do not put a value in it. Never ask the user to paste the key
126
+ into the conversation; a live credential has no reason to pass through
127
+ chat history or logs. Tell them the file exists and where, and that
128
+ they need to fill in the value directly in their editor or filesystem
129
+ before `harness-eng` reaches a plugin's `smoke` layer — raise this now
130
+ rather than letting it surface as a late failure three layers in. `.env`
131
+ itself is gitignored, never committed.
122
132
 
123
133
  ### 5. Install
124
134
 
@@ -31,13 +31,33 @@ is the cross-plugin integration check the per-plugin layers can't be.
31
31
  ## Planning intake (Phase 0, before any build layer)
32
32
 
33
33
  Run once per new plugin, before that plugin's `scaffold` task can be
34
- claimed. Ask the user directly, before anything else: mechanical intake
35
- (name + goal + outcome, fast) or the full BMAD shelf (brainstorming →
36
- brief → PRD → UX spec, the same procedure `full-stack-app`/`pwa-app` run,
37
- archived to `.hedgehog/BMAD/`)? A trivial single-tool plugin usually
38
- wants mechanical; a plugin with real ambiguity in its hook, UI, or
39
- protocol-driver shape can genuinely benefit from BMAD's elicitation —
40
- the choice is the user's, not fixed by this core.
34
+ claimed. Always surface this as an explicit question to the user, even
35
+ when confident which answer fits — never infer the answer from the
36
+ plugin's apparent complexity and proceed without asking: mechanical
37
+ intake (name + goal + outcome, fast) or the full BMAD shelf
38
+ (brainstorming → brief → PRD → UX spec, the same procedure
39
+ `full-stack-app`/`pwa-app` run, archived to `.hedgehog/BMAD/`)? A trivial
40
+ single-tool plugin usually wants mechanical; a plugin with real ambiguity
41
+ in its hook, UI, or protocol-driver shape can genuinely benefit from
42
+ BMAD's elicitation — that's context for how to phrase the question and
43
+ state a recommendation ("this sounds trivial enough for mechanical
44
+ intake — sound right, or do you want the full BMAD pass?"), not a license
45
+ to skip asking it. The choice is the user's, not fixed by this core.
46
+
47
+ Ask it as its own distinct, dedicated prompt — a yes/no or
48
+ multiple-choice tool call, not folded into the same turn as any other
49
+ question (e.g. confirming the plugin's name, the mechanical path's next
50
+ step). End the turn there and wait for the user's actual answer before
51
+ starting either path; do not proceed to any step of either path in the
52
+ same response that states the question.
53
+
54
+ **Anti-pattern:** stating a recommendation and continuing in the same
55
+ turn — "Let's do mechanical intake since this is trivial — now, what
56
+ should we call the plugin?" — does not satisfy "surfacing it as an
57
+ explicit question," even though it names both options and states a
58
+ recommendation. Mentioning the choice is not the same as asking it: the
59
+ turn must end on the question alone, with intake work starting only
60
+ after the user replies.
41
61
 
42
62
  **Mechanical path:**
43
63
 
@@ -370,7 +390,13 @@ boundary`'s check applies regardless of which framing prompted the ask.
370
390
  Confirm it with `hedgehog boundary` before offering the handoff: it
371
391
  exits 0 only when nothing is in flight, the working tree is clean, and
372
392
  the last closed task completed its intent, and names which of the three
373
- failed otherwise. `hedgehog quiesce` answers only the in-flight third —
393
+ failed otherwise. No layer's `ALLOWED SCOPE` covers `.hedgehog/friction/log.md`,
394
+ so friction entries logged mid-build never ride along with a layer's own
395
+ verify-commit — if it shows uncommitted at this point, commit it
396
+ standalone first (`git add .hedgehog/friction/log.md && git commit -m
397
+ "chore: friction log"`) before running `hedgehog boundary`, or its
398
+ clean-tree check fails on a path no layer was ever going to commit.
399
+ `hedgehog quiesce` answers only the in-flight third —
374
400
  the right check while waiting out a correction, not the one for clearing
375
401
  context. The same command is what decides any mid-build `/clear` too,
376
402
  and `hedgehog boundary --handoff` prints the block the next session
@@ -0,0 +1,9 @@
1
+ # DeepSeek Harness Plugin Workspace
2
+
3
+ A DeepSeek Harness (DSH) plugin workspace built with Hedgehog.
4
+
5
+ ## Plugins
6
+
7
+ See each plugin's own README for what it does and how to run it:
8
+
9
+ <!-- plugin-readme-links -->
@@ -3,6 +3,7 @@
3
3
  # plugin per project just never has a second intent; nothing forces or
4
4
  # blocks multi-plugin.
5
5
  id: deepseek-harness
6
+ pluralizes: false
6
7
  layers:
7
8
  - id: scaffold
8
9
  scope: ["plugins/{module}/**", ".hedgehog/dsh-smoke/{module}.md"]
@@ -30,7 +31,7 @@ layers:
30
31
  - id: bundle
31
32
  depends_on: smoke
32
33
  scope: ["plugins/{module}/package.json", "plugins/{module}/lib/**"]
33
- verify: "pnpm --filter {module} pack --pack-destination \"$(mktemp -d)\""
34
+ verify: "pnpm --filter {module} build && pnpm --filter {module} pack --pack-destination \"$(mktemp -d)\""
34
35
  commit: "feat({module}): bundle"
35
36
 
36
37
  - id: join
@@ -1,5 +1,4 @@
1
1
  node_modules/
2
- plugins/*/lib/
3
2
  .env
4
3
  .hedgehog/hedgehog.db
5
4
  .hedgehog/hedgehog.db-*
@@ -13,5 +13,11 @@
13
13
  "@deepseek-ai/dsh": "0.1.0-rc.8",
14
14
  "@deepseek-ai/cordis": "4.0.1",
15
15
  "@deepseek-ai/dsh-tools": "0.1.0-rc.8"
16
+ },
17
+ "pnpm": {
18
+ "overrides": {
19
+ "react": "19.2.8",
20
+ "react-dom": "19.2.8"
21
+ }
16
22
  }
17
23
  }