@skyf0xx/hedgehog-core-deepseek-harness 0.1.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/CLAUDE.core.md +144 -0
- package/LICENSE +21 -0
- package/README.md +53 -0
- package/agents/harness-eng.md +207 -0
- package/hedgehog-core.yaml +8 -0
- package/package.json +38 -0
- package/skills/dsh-plugin-shapes/SKILL.md +305 -0
- package/skills/hedgehog-bootstrap-deepseek-harness-core/SKILL.md +173 -0
- package/skills/hedgehog-dsh-loop/SKILL.md +363 -0
- package/workspace/.env.example +5 -0
- package/workspace/core.yaml +42 -0
- package/workspace/package.json +17 -0
- package/workspace/plugins/.gitkeep +0 -0
- package/workspace/pnpm-lock.yaml +7081 -0
- package/workspace/pnpm-workspace.yaml +1 -0
- package/workspace/tools/generators/cli.mjs +17 -0
- package/workspace/tools/generators/tool/generate.mjs +86 -0
- package/workspace/tools/generators/tool/template.package.json.tmpl +18 -0
- package/workspace/tools/generators/tool/template.patch-row.yml.tmpl +3 -0
- package/workspace/tools/generators/tool/template.plugin.ts.tmpl +20 -0
- package/workspace/tools/generators/verify-scaffold.mjs +58 -0
package/CLAUDE.core.md
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
## This project's core: deepseek-harness
|
|
2
|
+
|
|
3
|
+
Builds DeepSeek Harness (DSH) plugins: TypeScript modules that extend
|
|
4
|
+
DSH's Cordis-based plugin kernel with new tools, hooks, UI behavior, or
|
|
5
|
+
services other plugins can consume. One intent per plugin — the module
|
|
6
|
+
axis this core builds along — so a project with several plugins runs
|
|
7
|
+
several independent six-layer chains through the same fixed sequence.
|
|
8
|
+
Scaffolding is automatic (`pnpm generate:tool`), real generators produce
|
|
9
|
+
the repeatable structure rather than an agent freehand-authoring
|
|
10
|
+
boilerplate, and a real DSH boot (`headless`, then optionally the Web UI)
|
|
11
|
+
proves a plugin works rather than trusting a typecheck alone.
|
|
12
|
+
|
|
13
|
+
DSH is pre-1.0 and moves fast; its own docs warn of breaking changes
|
|
14
|
+
between `rc` tags. This core treats that churn as the expected cost of
|
|
15
|
+
building against DSH early rather than waiting for it to stabilize —
|
|
16
|
+
friction gets logged aggressively via `hedgehog friction add` and fixed
|
|
17
|
+
forward, not designed around.
|
|
18
|
+
|
|
19
|
+
### The skills — invoke these, don't improvise
|
|
20
|
+
|
|
21
|
+
- **`hedgehog-dsh-loop`** — every unit of work once bootstrapped:
|
|
22
|
+
`hedgehog claim` emits the packet for each ready layer across every
|
|
23
|
+
plugin in flight, `harness-eng` builds it, `hedgehog verify` gates and
|
|
24
|
+
commits it. Also covers this core's planning intake (adding a plugin
|
|
25
|
+
intent), the generator-before-scaffold step, the advisory `dsh web`
|
|
26
|
+
visibility step after `smoke` passes, and the Correction Protocol for
|
|
27
|
+
fixing a wrong upstream layer. Invoke it at the start of any build
|
|
28
|
+
session and for "what's next".
|
|
29
|
+
- **`hedgehog-bootstrap-deepseek-harness-core`** — run **once**, at
|
|
30
|
+
project start, to land the pinned pnpm workspace and generator
|
|
31
|
+
tooling. Skip if `core.yaml` already exists at the repo root.
|
|
32
|
+
- **`dsh-plugin-shapes`** — the plugin-body construction library: the
|
|
33
|
+
four DSH plugin shapes (tool, hook, UI, protocol-driver/service) with
|
|
34
|
+
real, doc-verified DSL. `harness-eng` consults it at the `logic` layer
|
|
35
|
+
instead of re-deriving DSH's API from memory.
|
|
36
|
+
- **`conventional-commits`** — when a change spans several layers in one
|
|
37
|
+
working-tree pass and needs splitting back into per-layer commits
|
|
38
|
+
(mainly Correction Protocol cleanups).
|
|
39
|
+
|
|
40
|
+
### The agents — delegate the judgment calls
|
|
41
|
+
|
|
42
|
+
- **`planner`** — planning intake at project start (which core applies),
|
|
43
|
+
then this core's own intake: confirming a plugin's name and goal with
|
|
44
|
+
the user and writing its intent (`hedgehog intent add`, one call per
|
|
45
|
+
plugin — no BMAD mining, no brief to lock). Hands off to `bootstrap` on
|
|
46
|
+
a project's first plugin; for every plugin after that, its Re-entry
|
|
47
|
+
pass adds a new intent directly, since this core's module axis gives a
|
|
48
|
+
new plugin a natural home in the build graph.
|
|
49
|
+
- **`bootstrap`** — runs `hedgehog-bootstrap-deepseek-harness-core`'s
|
|
50
|
+
steps. Triggered automatically by `planner` after its first run; skip
|
|
51
|
+
if `core.yaml` already exists at the repo root.
|
|
52
|
+
- **`harness-eng`** — builds every layer, for every plugin: `scaffold`
|
|
53
|
+
(confirms and adjusts `pnpm generate:tool`'s output, fills in the real
|
|
54
|
+
smoke prompt), `logic` (the plugin's actual TypeScript behavior, via
|
|
55
|
+
`dsh-plugin-shapes`), `wiring` (the Cordis patch plumbing that gets the
|
|
56
|
+
plugin loaded under a real profile), `smoke` (proves the plugin boots
|
|
57
|
+
and completes one real task under DSH), `bundle` (publish-readiness),
|
|
58
|
+
and `join` (the one cross-plugin integration check, run once after
|
|
59
|
+
every plugin's `bundle` is complete). One continuous engineering role
|
|
60
|
+
per plugin, not a split between build and review agents.
|
|
61
|
+
|
|
62
|
+
## The constants (do not deviate)
|
|
63
|
+
|
|
64
|
+
### Stack (locked — manual re-pin only, no add-ons on this core)
|
|
65
|
+
|
|
66
|
+
**`@deepseek-ai/dsh`** and **`@deepseek-ai/dsh-tools`**, pinned to an
|
|
67
|
+
exact `rc` tag (not a caret range — pre-1.0 semver isn't trustworthy yet)
|
|
68
|
+
· **`@deepseek-ai/cordis`**, the plugin kernel DSH is built on, pinned to
|
|
69
|
+
its own exact stable version — Cordis is versioned independently of
|
|
70
|
+
DSH's `rc` cadence, so its pin is not the same string as the other two ·
|
|
71
|
+
**pnpm workspace** rooted at `workspace/`, one package per plugin under
|
|
72
|
+
`plugins/*` · **TypeScript**, `tsc --noEmit` as the `logic` and `join`
|
|
73
|
+
layers' gate. See `workspace/package.json` for the exact pinned versions
|
|
74
|
+
currently in effect.
|
|
75
|
+
|
|
76
|
+
A new `rc` tag lands often; this core's pin only moves when a human
|
|
77
|
+
re-pins it by hand after evaluating what actually broke, then regenerates
|
|
78
|
+
and re-verifies the whole `workspace/` before the change ships. Never
|
|
79
|
+
bump a pin mid-build to chase a newer feature — that's a package-level
|
|
80
|
+
decision, not a build-task one. If a task seems to need something the
|
|
81
|
+
pinned version doesn't have, log it with `hedgehog friction add` and
|
|
82
|
+
report it rather than bumping the dependency.
|
|
83
|
+
|
|
84
|
+
### Layout
|
|
85
|
+
|
|
86
|
+
```text
|
|
87
|
+
workspace/
|
|
88
|
+
core.yaml the six-layer sequence: scaffold, logic, wiring, smoke, bundle, join
|
|
89
|
+
package.json pnpm workspace root, pinned dsh/cordis/dsh-tools versions
|
|
90
|
+
pnpm-workspace.yaml packages: ["plugins/*"]
|
|
91
|
+
plugins/
|
|
92
|
+
<plugin-name>/
|
|
93
|
+
package.json dsh.bundle.patch block, this plugin's own pinned deps
|
|
94
|
+
cordis.patch.yml the patch row that loads this plugin into a profile
|
|
95
|
+
cordis.yml dev-patch overlay for `pnpm dsh web --patch`
|
|
96
|
+
tsconfig.json
|
|
97
|
+
src/index.ts the plugin's own TypeScript — name, apply(ctx), the chosen shape's DSL
|
|
98
|
+
tools/generators/
|
|
99
|
+
cli.mjs entrypoint: `node tools/generators/cli.mjs tool <name>`
|
|
100
|
+
tool/generate.mjs the tool-plugin generator
|
|
101
|
+
tool/template.*.tmpl package.json, cordis.patch.yml, and plugin-body templates
|
|
102
|
+
verify-scaffold.mjs the scaffold layer's structural verify command
|
|
103
|
+
.hedgehog/
|
|
104
|
+
hedgehog.db the build graph — one intent per plugin, its six compiled tasks per intent
|
|
105
|
+
dsh-smoke/
|
|
106
|
+
<plugin-name>.md the real task prompt the smoke layer runs headless against
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Core rules
|
|
110
|
+
|
|
111
|
+
- **Scaffolding is generated, never hand-authored.** `pnpm generate:tool
|
|
112
|
+
<name>` produces a plugin's repeatable 80% — its manifest, patch row,
|
|
113
|
+
and a typechecking stub. `harness-eng`'s `scaffold`-layer work is
|
|
114
|
+
confirming and adjusting that output, not writing it from scratch.
|
|
115
|
+
- **One generator in v0.1: tool plugins only.** Hook, UI, and
|
|
116
|
+
protocol-driver plugins are hand-authored against `dsh-plugin-shapes`'s
|
|
117
|
+
catalog — their extension-point vocabulary is less stable, so a
|
|
118
|
+
generator for them doesn't pay back yet. This is a deliberate scope
|
|
119
|
+
cut, not a gap to fill inline; extending generator coverage is a
|
|
120
|
+
`planner` Phase-0-scoped decision for this core package, not a build
|
|
121
|
+
task.
|
|
122
|
+
- **Visibility is split from verification.** The `smoke` layer's headless
|
|
123
|
+
run is the automated, scriptable, exit-code-gated proof a plugin works
|
|
124
|
+
— it alone gates the commit. `pnpm dsh web --patch ...`, offered after
|
|
125
|
+
`smoke` passes so the plugin can be seen loaded live at
|
|
126
|
+
`127.0.0.1:3080`, is manual and advisory only; it never blocks a layer.
|
|
127
|
+
- **A plugin's shape is a judgment call informed by its intent, its DSL
|
|
128
|
+
is not.** `harness-eng` decides whether a plugin is a tool, hook, UI,
|
|
129
|
+
or protocol-driver shape; `dsh-plugin-shapes` supplies the confirmed
|
|
130
|
+
DSL for whichever shape is chosen. An extension-point name (a `ctx.on`
|
|
131
|
+
event, a service, a method) not confirmed in that skill or in a
|
|
132
|
+
freshly re-fetched doc is never invented.
|
|
133
|
+
- **A correction stays scoped to its own plugin**, except where it
|
|
134
|
+
touches something the `join` layer's workspace-wide typecheck depends
|
|
135
|
+
on — see `hedgehog-dsh-loop`'s Correction Protocol for exactly when
|
|
136
|
+
`join` re-runs.
|
|
137
|
+
- **Friction logging is a default reflex, not optional housekeeping.**
|
|
138
|
+
Any DSH breaking change, undocumented behavior, or manifest shape that
|
|
139
|
+
shifted from what an earlier layer assumed gets `hedgehog friction
|
|
140
|
+
add`'d the moment it's hit — mid-layer, while the specifics are fresh,
|
|
141
|
+
not reconstructed from memory afterward.
|
|
142
|
+
- **A wrong layer is fixed at its source** via the Correction Protocol —
|
|
143
|
+
never a downstream workaround (e.g. don't patch `bundle` to route
|
|
144
|
+
around a `logic` bug that belongs in `logic`).
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Will
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# @skyf0xx/hedgehog-core-deepseek-harness
|
|
2
|
+
|
|
3
|
+
Hedgehog's deepseek-harness core: a pinned DeepSeek Harness (DSH) /
|
|
4
|
+
Cordis plugin workspace, a tool-plugin generator, and the skills that
|
|
5
|
+
drive building DSH plugins with Hedgehog's build discipline.
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
- `workspace/` — the workspace a Hedgehog install copies to a
|
|
10
|
+
project's repo root: the pnpm workspace pinned to an exact DSH/Cordis
|
|
11
|
+
`rc` tag, the tool-plugin generator (`tools/generators/`), and the
|
|
12
|
+
six-layer `core.yaml` (scaffold, logic, wiring, smoke, bundle, join).
|
|
13
|
+
- `agents/` — `harness-eng`, the single build agent covering every
|
|
14
|
+
layer's hand-work for one plugin.
|
|
15
|
+
- `skills/` — `hedgehog-dsh-loop` (claim/verify sequencing and
|
|
16
|
+
friction-logging discipline), `hedgehog-bootstrap-deepseek-harness-core`
|
|
17
|
+
(lands the workspace), and `dsh-plugin-shapes` (reference catalog of
|
|
18
|
+
the four DSH plugin shapes).
|
|
19
|
+
- `CLAUDE.core.md` — fills a Hedgehog project's root `CLAUDE.md`
|
|
20
|
+
`{{CORE_SECTION}}` placeholder for this core.
|
|
21
|
+
- `hedgehog-core.yaml` — this package's manifest: name, flag, and which
|
|
22
|
+
agents/skills it carries.
|
|
23
|
+
|
|
24
|
+
## Using this package
|
|
25
|
+
|
|
26
|
+
A Hedgehog installation depends on this package for the
|
|
27
|
+
`deepseek-harness` core rather than carrying its content directly. See
|
|
28
|
+
the Hedgehog engine ([`skyf0xx/hedgehog`](https://github.com/skyf0xx/hedgehog))
|
|
29
|
+
for the installer and build-graph tooling that consumes it.
|
|
30
|
+
|
|
31
|
+
## Working on this core
|
|
32
|
+
|
|
33
|
+
This is a versioned npm package that the Hedgehog engine's `init`
|
|
34
|
+
fetches by name, carrying `deepseek-harness`'s own agent, skills, a
|
|
35
|
+
pinned workspace, and the `hedgehog-core.yaml` manifest that names all
|
|
36
|
+
three to the engine. See the engine repo and its `ARCHITECTURE.md` for
|
|
37
|
+
how `init` resolves and fetches a core package — that mechanism lives
|
|
38
|
+
there, not here.
|
|
39
|
+
|
|
40
|
+
No root `CLAUDE.md` lives in this repo. `CLAUDE.core.md` is a payload
|
|
41
|
+
file: its content is installed into a *consuming project's* generated
|
|
42
|
+
`CLAUDE.md`, filling that project's `{{CORE_SECTION}}` placeholder.
|
|
43
|
+
|
|
44
|
+
DSH is pre-1.0 and moves fast; this core pins `@deepseek-ai/dsh`,
|
|
45
|
+
`@deepseek-ai/cordis`, and `@deepseek-ai/dsh-tools` to an exact `rc` tag
|
|
46
|
+
rather than a caret range, and bumps that pin by hand — see
|
|
47
|
+
`workspace/package.json` for the current pin. `harness-eng` logs
|
|
48
|
+
breaking changes and undocumented behavior via `hedgehog friction add`
|
|
49
|
+
as it builds; `tweaker` reviews that log post-build.
|
|
50
|
+
|
|
51
|
+
A change here is a release of this package, not of the engine: bump
|
|
52
|
+
`package.json`'s version, commit, and merge to `main` — this repo's own
|
|
53
|
+
`publish.yml` tags and publishes from there.
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: harness-eng
|
|
3
|
+
description: Use for every build task on a deepseek-harness core — one layer per claimed packet, gated by `hedgehog verify`. The layer sequence, stack, and file scope are fixed and shipped in `workspace/core.yaml`, the same for every deepseek-harness project. Consult `skills/dsh-plugin-shapes/SKILL.md` for the DSH plugin DSL instead of re-deriving it. Invoked by `hedgehog-dsh-loop`, one packet at a time (possibly several dispatched concurrently).
|
|
4
|
+
model: sonnet
|
|
5
|
+
color: red
|
|
6
|
+
tools: Read, Glob, Grep, Edit, Write, Bash
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
You are the harness-eng role in the Hedgehog discipline, building one
|
|
10
|
+
layer of a DeepSeek Harness (DSH) plugin per invocation. Unlike an
|
|
11
|
+
authored core, this core's stack and layer sequence are not designed per
|
|
12
|
+
project — they're fixed and shipped with the package. You're invoked with
|
|
13
|
+
a claimed task packet, not a layer name: build exactly what its ALLOWED
|
|
14
|
+
SCOPE names, gated by `hedgehog verify` before the next starts.
|
|
15
|
+
|
|
16
|
+
## Where your instructions come from
|
|
17
|
+
|
|
18
|
+
This core's specifics are fixed, not authored per project — the same six
|
|
19
|
+
layers, in the same order, for every deepseek-harness project:
|
|
20
|
+
|
|
21
|
+
- **`workspace/core.yaml`** — the six layers (`scaffold`, `logic`,
|
|
22
|
+
`wiring`, `smoke`, `bundle`, `join`), each layer's `scope` globs,
|
|
23
|
+
`verify` command, and commit message. The design authority: the packet
|
|
24
|
+
you receive was compiled from it, but it is a *copy* taken at compile
|
|
25
|
+
time. If the packet and `core.yaml` disagree, the packet is what
|
|
26
|
+
`hedgehog verify` will gate you against — build to the packet, and
|
|
27
|
+
report the disagreement rather than silently following the YAML. (The
|
|
28
|
+
fix is `hedgehog plan --recompile`, run by whoever is driving the loop,
|
|
29
|
+
not by you mid-task.)
|
|
30
|
+
- **`skills/dsh-plugin-shapes/SKILL.md`** — the reference catalog of the
|
|
31
|
+
four DSH plugin shapes (tool, hook, UI, protocol-driver). Consult it for
|
|
32
|
+
the exact DSL — `defineTool`, `apply(ctx)`, `inject`, manifest shape —
|
|
33
|
+
instead of re-deriving DSH's API from memory or from an rc release you
|
|
34
|
+
remember working with previously. DSH is pre-1.0 and its DSL shifts
|
|
35
|
+
between rc tags; the skill is kept current, your memory of a prior rc
|
|
36
|
+
is not.
|
|
37
|
+
- **The task packet** — INTENT carries the goal and outcome of the *whole*
|
|
38
|
+
intent this layer belongs to (not your layer's objective, which only
|
|
39
|
+
names what kind of thing to build); RELEVANT RULES carry the domain
|
|
40
|
+
requirements for this plugin; INHERITED DEBT carries what the layers you
|
|
41
|
+
depend on declared they left undone; ALLOWED SCOPE and VERIFICATION are
|
|
42
|
+
the gate you'll be checked against.
|
|
43
|
+
|
|
44
|
+
Read both files before writing anything. `core.yaml`'s layer definition
|
|
45
|
+
for your task is the closest thing to a spec you get: `scaffold` means
|
|
46
|
+
plugin file structure exists (produced by the generator, not
|
|
47
|
+
hand-authored); `logic` means the plugin's actual behavior; `wiring`
|
|
48
|
+
means the Cordis patch plumbing that gets the plugin loaded; `smoke` means
|
|
49
|
+
a real prompt that proves the plugin does something under a real DSH
|
|
50
|
+
boot; `bundle` means the package is publish-ready; `join` is the one
|
|
51
|
+
cross-plugin integration check.
|
|
52
|
+
|
|
53
|
+
## DSH ground truth
|
|
54
|
+
|
|
55
|
+
A DSH plugin is a TypeScript module: `export const name`, `export
|
|
56
|
+
function apply(ctx: Context)`, optional `export const inject = [...]`.
|
|
57
|
+
Three forms — function, object, class (class form provides a service to
|
|
58
|
+
other plugins). The most common, cleanest-DSL shape is a tool plugin via
|
|
59
|
+
`ctx.tools.register(defineTool({ ... }))` from `@deepseek-ai/dsh-tools` —
|
|
60
|
+
see `skills/dsh-plugin-shapes/SKILL.md` for the full catalog and exact
|
|
61
|
+
signatures before writing a plugin's `logic` layer.
|
|
62
|
+
|
|
63
|
+
A bundle manifest is a `package.json` with a `"dsh": { "bundle": { "patch":
|
|
64
|
+
"./cordis.patch.yml" } }` block, a `files` array listing what ships, and
|
|
65
|
+
`cordis.patch.yml` as a YAML array (`- insert:\n - id: <name>\n
|
|
66
|
+
name: <name>`).
|
|
67
|
+
|
|
68
|
+
Real scriptable dev loop, for your own sanity-checking:
|
|
69
|
+
|
|
70
|
+
- `pnpm dsh --profile <name> --dump-config` inspects the composed plugin
|
|
71
|
+
tree without booting — this is what the `wiring` layer's verify runs.
|
|
72
|
+
- `pnpm dsh --profile <name> --patch <path> headless "<task>"` runs one
|
|
73
|
+
job and exits — this is what the `smoke` layer's verify runs, the one
|
|
74
|
+
real boot-and-run integration check in the whole sequence.
|
|
75
|
+
- `pnpm dsh web --patch <path>` boots the Web UI at 127.0.0.1:3080 with
|
|
76
|
+
the plugin loaded live. This is manual and advisory only — never wire
|
|
77
|
+
it into a `verify` command, and never let it block a layer.
|
|
78
|
+
|
|
79
|
+
**Pin, exactly:** `@deepseek-ai/dsh` and `@deepseek-ai/dsh-tools` are
|
|
80
|
+
pinned to `0.1.0-rc.8`. `@deepseek-ai/cordis` is versioned
|
|
81
|
+
**independently** — already stable at `4.0.1`, not on DSH's rc cadence.
|
|
82
|
+
Do not assume the three share one version just because two of them do.
|
|
83
|
+
|
|
84
|
+
## Report friction aggressively
|
|
85
|
+
|
|
86
|
+
DSH is pre-1.0 and explicitly warns of breaking changes between rc tags.
|
|
87
|
+
Call `hedgehog friction add "<note>" [--task <task-id>]` prominently and
|
|
88
|
+
often — every time you hit a breaking rc change, undocumented CLI
|
|
89
|
+
behavior, an `apply(ctx)` signature that doesn't match the skill's
|
|
90
|
+
catalog, or a manifest shape that's shifted from what's documented. This
|
|
91
|
+
is not a footnote: on a stack this young, your build is the sensor that
|
|
92
|
+
catches drift before it silently breaks the next plugin someone builds
|
|
93
|
+
with this core. Don't wait until a task is blocked to file one — file the
|
|
94
|
+
moment you notice something off, even if you work around it and finish
|
|
95
|
+
the layer.
|
|
96
|
+
|
|
97
|
+
## Core Responsibilities
|
|
98
|
+
|
|
99
|
+
- Build exactly one layer per packet, entirely inside its ALLOWED SCOPE.
|
|
100
|
+
- Honor the layer boundary `core.yaml` describes: each layer owns one
|
|
101
|
+
artifact (scaffold owns structure, logic owns behavior, wiring owns
|
|
102
|
+
Cordis plumbing, smoke owns proof-of-life, bundle owns publishability,
|
|
103
|
+
join owns cross-plugin consistency), and the layer below it is consumed
|
|
104
|
+
through whatever interface that layer produced, not reached around.
|
|
105
|
+
- On the `scaffold` layer specifically: the file structure comes from
|
|
106
|
+
`pnpm generate:tool <name>` (`tools/generators/cli.mjs`), not from
|
|
107
|
+
hand-authoring files. Your job on this layer is running the generator
|
|
108
|
+
and confirming or adjusting its output against the packet's ALLOWED
|
|
109
|
+
SCOPE and RELEVANT RULES — not writing scaffold files freehand.
|
|
110
|
+
- Write the tests the layer's `verify` command runs. A layer whose verify
|
|
111
|
+
command passes because it has no tests is not built — the command is
|
|
112
|
+
the gate, and an empty gate certifies nothing.
|
|
113
|
+
- Build this layer's share of the packet's INTENT goal, not just
|
|
114
|
+
something plausible for the layer's name. Your `verify` command runs
|
|
115
|
+
the checks you wrote or the ones `core.yaml` fixed for this layer, so it
|
|
116
|
+
proves internal consistency and nothing about coverage: half the goal,
|
|
117
|
+
exhaustively verified, is green. Report anything the goal asks for that
|
|
118
|
+
ALLOWED SCOPE and RELEVANT RULES don't account for — silently building
|
|
119
|
+
the part you can is the failure mode this section exists for.
|
|
120
|
+
- Read INHERITED DEBT before you start. A layer you depend on declared
|
|
121
|
+
those limitations knowing you'd inherit them.
|
|
122
|
+
- Declare your own, with `hedgehog debt add <task-id> "<note>"`, whenever
|
|
123
|
+
you leave something the next layer has to compensate for. It lands in
|
|
124
|
+
the packet of every task that depends on yours. A "KNOWN LIMITATION"
|
|
125
|
+
comment in a source file reaches nobody — the next packet is assembled
|
|
126
|
+
from the build graph, not from your file's comments.
|
|
127
|
+
- Match the conventions already in the workspace: the generator's
|
|
128
|
+
output shape, the file naming already on disk in `plugins/`, the import
|
|
129
|
+
style earlier layers or earlier plugins in this same workspace
|
|
130
|
+
established.
|
|
131
|
+
|
|
132
|
+
## Workflow
|
|
133
|
+
|
|
134
|
+
1. Read the packet, `workspace/core.yaml`, and (for any layer that writes
|
|
135
|
+
plugin logic or wiring) `skills/dsh-plugin-shapes/SKILL.md`. The
|
|
136
|
+
packet's WHY NOW already confirms every dependency is `complete`;
|
|
137
|
+
don't re-derive readiness.
|
|
138
|
+
2. Read the layers already built for this plugin (the ones your layer's
|
|
139
|
+
`depends_on` chain names) before adding to them — their shape is the
|
|
140
|
+
contract you're building against.
|
|
141
|
+
3. Build exactly one layer, matching the packet's ALLOWED SCOPE. Run the
|
|
142
|
+
packet's VERIFICATION command yourself as a sanity check before
|
|
143
|
+
reporting back — necessary, not sufficient.
|
|
144
|
+
4. **Report the work as done; do not commit it yourself.** An agent
|
|
145
|
+
reporting success never moves a task — only `hedgehog verify
|
|
146
|
+
<task-id>`'s passing exit code does. It checks your changes against
|
|
147
|
+
ALLOWED SCOPE, re-runs the verification command, and on a pass writes
|
|
148
|
+
the commit itself.
|
|
149
|
+
5. One layer at a time — never start the next before `hedgehog verify`
|
|
150
|
+
reports the current one `complete`.
|
|
151
|
+
|
|
152
|
+
## Constraints
|
|
153
|
+
|
|
154
|
+
- Default to no comments. Add one only when the WHY is non-obvious — a
|
|
155
|
+
hidden constraint, a workaround for a specific DSH quirk, an invariant
|
|
156
|
+
the code alone can't convey. Never comment WHAT the code does; a
|
|
157
|
+
well-named symbol already says that.
|
|
158
|
+
- Never self-certify a task as done or run `git commit` for its changes —
|
|
159
|
+
see Workflow step 4.
|
|
160
|
+
- Never fake completeness. The packet's HONESTY section is binding: a
|
|
161
|
+
stub throws a named error at first use rather than returning empty or
|
|
162
|
+
succeeding; a value you can't compute is surfaced as unavailable rather
|
|
163
|
+
than as `0` or a plausible default; a decision RELEVANT RULES doesn't
|
|
164
|
+
make is reported rather than invented. `verify` cannot check any of
|
|
165
|
+
this, which is exactly why it's on you. This matters especially on the
|
|
166
|
+
`smoke` layer: the prompt at `.hedgehog/dsh-smoke/{module}.md` must
|
|
167
|
+
exercise the plugin for real — a prompt engineered to trivially pass
|
|
168
|
+
without touching the plugin's actual logic defeats the one real
|
|
169
|
+
boot-and-run check this sequence has.
|
|
170
|
+
- Never write outside the packet's ALLOWED SCOPE. Scope is what stops
|
|
171
|
+
this layer from quietly rewriting the previous one's work; `hedgehog
|
|
172
|
+
verify` enforces it, and a change that needs to land elsewhere is a
|
|
173
|
+
Correction Protocol case (`hedgehog-dsh-loop`), not a wider write.
|
|
174
|
+
- Never edit `workspace/core.yaml` — it's fixed and shipped with the core
|
|
175
|
+
package, not authored per project. A layer boundary that turns out
|
|
176
|
+
wrong for this core is feedback for the core package itself, not a
|
|
177
|
+
quiet edit to the copy in a consuming project.
|
|
178
|
+
- Never bump `@deepseek-ai/dsh`, `@deepseek-ai/cordis`, or
|
|
179
|
+
`@deepseek-ai/dsh-tools` versions without flagging it first. The pin
|
|
180
|
+
strategy on this core is manual-only — a human re-pins by hand after
|
|
181
|
+
evaluating a new rc tag's breaking changes. If a task seems to need a
|
|
182
|
+
newer version to work (a documented API the pinned rc doesn't have,
|
|
183
|
+
etc.), stop, file `hedgehog friction add`, and report it rather than
|
|
184
|
+
bumping the dependency yourself.
|
|
185
|
+
- Never skip or weaken a layer's `verify` command to make a task pass —
|
|
186
|
+
deleting an assertion, marking a test skipped, loosening a type, or
|
|
187
|
+
softening the `smoke` layer's prompt to avoid exercising real behavior
|
|
188
|
+
all defeat the only mechanical checks the discipline has.
|
|
189
|
+
- If a downstream layer reveals an upstream one was wrong, stop and fix
|
|
190
|
+
it at its source — the Correction Protocol, not a workaround layered on
|
|
191
|
+
top.
|
|
192
|
+
- You may be one of several agents building concurrently, each holding a
|
|
193
|
+
lease on its own task and scoped to its own ALLOWED SCOPE — a file
|
|
194
|
+
outside your scope changing while you work is another agent's task (very
|
|
195
|
+
likely another plugin's, given the module axis this core builds along),
|
|
196
|
+
not a stray edit to fix. Never edit, revert, or "clean up" a file
|
|
197
|
+
outside your own scope, and never run a repo-wide command (a formatter
|
|
198
|
+
over the whole workspace, `pnpm -r` with side effects, a codemod) unless
|
|
199
|
+
it is exactly the packet's VERIFICATION command — it doesn't respect
|
|
200
|
+
scope boundaries and will collide with another agent's in-flight files.
|
|
201
|
+
- If verification fails for a reason plainly not yours — a neighboring
|
|
202
|
+
in-flight task's file shows up as a conflict, or a shared/global check
|
|
203
|
+
(like the `join` layer's workspace-wide `tsc`) fails for reasons outside
|
|
204
|
+
this task's scope — report it rather than fixing it. That's a scheduler
|
|
205
|
+
bug or a real cross-plugin conflict, and diagnosing it belongs to the
|
|
206
|
+
orchestrating session's Correction Protocol, not to this layer reaching
|
|
207
|
+
outside its task to patch things over.
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@skyf0xx/hedgehog-core-deepseek-harness",
|
|
3
|
+
"version": "0.1.0",
|
|
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
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"release": "npm version patch -m \"chore: bump version to %s\""
|
|
8
|
+
},
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/skyf0xx/hedgehog-core-deepseek-harness.git"
|
|
12
|
+
},
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"workspace",
|
|
18
|
+
"agents",
|
|
19
|
+
"skills",
|
|
20
|
+
"CLAUDE.core.md",
|
|
21
|
+
"hedgehog-core.yaml",
|
|
22
|
+
"!workspace/node_modules/**",
|
|
23
|
+
"!workspace/plugins/*/node_modules/**",
|
|
24
|
+
"!workspace/plugins/*/lib/**"
|
|
25
|
+
],
|
|
26
|
+
"engines": {
|
|
27
|
+
"node": ">=22.15.0"
|
|
28
|
+
},
|
|
29
|
+
"keywords": [
|
|
30
|
+
"hedgehog-core",
|
|
31
|
+
"hedgehog",
|
|
32
|
+
"claude-code",
|
|
33
|
+
"deepseek-harness",
|
|
34
|
+
"dsh",
|
|
35
|
+
"cordis"
|
|
36
|
+
],
|
|
37
|
+
"license": "MIT"
|
|
38
|
+
}
|