@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 +1 -1
- package/skills/hedgehog-bootstrap-deepseek-harness-core/SKILL.md +15 -5
- package/skills/hedgehog-dsh-loop/SKILL.md +34 -8
- package/workspace/README.md +9 -0
- package/workspace/core.yaml +2 -1
- package/workspace/gitignore.template +0 -1
- package/workspace/package.json +6 -0
- package/workspace/pnpm-lock.yaml +224 -230
- package/workspace/pnpm-workspace.yaml +7 -0
- package/workspace/tools/generators/tool/generate.mjs +29 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skyf0xx/hedgehog-core-deepseek-harness",
|
|
3
|
-
"version": "0.2.
|
|
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
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
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. `
|
|
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
|
package/workspace/core.yaml
CHANGED
|
@@ -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
|