@hippo-digital/hippocampus 1.0.0-rc.2 → 1.0.0-rc.3
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/CHANGELOG.md +16 -2
- package/README.md +15 -6
- package/agents/README.md +32 -0
- package/agents/accessibility-tester.md +21 -0
- package/agents/ingestion-curator.md +29 -0
- package/agents/knowledge-builder.md +29 -0
- package/agents/prototype-builder.md +23 -0
- package/agents/screenshot-runner.md +22 -0
- package/agents/workflow-orchestrator.md +37 -0
- package/bin/hippocampus.js +2 -1
- package/instructions/knowledge-source.instructions.md +29 -0
- package/instructions/nhs-frontend.instructions.md +22 -0
- package/instructions/nhs-prototype-kit.instructions.md +30 -0
- package/lib/package-paths.js +2 -0
- package/package.json +3 -1
- package/scripts/init.js +50 -0
- package/scripts/install-skills.js +84 -32
- package/scripts/validate-skills.js +45 -0
- package/skills/add-prototype-screen.skill.md +0 -1
- package/skills/add-scenario.skill.md +0 -1
- package/skills/add-user-needs.skill.md +0 -1
- package/skills/audit-knowledge-source.skill.md +0 -1
- package/skills/create-journey-from-scenario.skill.md +0 -1
- package/skills/deliver-service-slice.skill.md +0 -1
- package/skills/generate-service-slice.skill.md +0 -1
- package/skills/ingest-project-context.skill.md +0 -1
- package/skills/ingest-user-personas.skill.md +1 -0
- package/skills/map-research-to-graph.skill.md +0 -1
- package/skills/onboard-team-member.skill.md +109 -0
- package/skills/record-design-decision.skill.md +4 -0
- package/skills/skills.json +28 -0
- package/skills/structure-project-context-draft.skill.md +0 -1
- package/skills/write-delivery-summary.skill.md +0 -1
- package/templates/artefacts/README.md +23 -0
- package/templates/artefacts/accessibility/README.md +30 -0
- package/templates/artefacts/delivery-summaries/README.md +20 -0
- package/templates/artefacts/screenshots/README.md +30 -0
package/CHANGELOG.md
CHANGED
|
@@ -49,7 +49,21 @@ journeys and screens they justify, rendered as a viewer inside your prototype.
|
|
|
49
49
|
|
|
50
50
|
- The 13 guides are served at `{basePath}/docs`, version-matched to the
|
|
51
51
|
installed package rather than copied into your repo.
|
|
52
|
-
- `skills install` copies the
|
|
53
|
-
|
|
52
|
+
- `skills install` copies the 21 skills into `.github/skills`, the six agents
|
|
53
|
+
into `.github/agents` and the instructions into `.github/instructions`, with
|
|
54
|
+
content hashes so an upgrade can tell a stale copy from one your team has
|
|
55
|
+
edited. They install together because every agent's preferred skills point
|
|
56
|
+
into `.github/skills` and every skill names its `owners` by agent, so either
|
|
57
|
+
half alone is a set of dangling references. `--no-agents` installs the skills
|
|
58
|
+
only.
|
|
59
|
+
- Everything the agents and skills reference that is not a repo file is read
|
|
60
|
+
from the installed package, so those references are version-matched too.
|
|
61
|
+
- `skills validate` checks both directions between skills and agents: a skill
|
|
62
|
+
owned by an agent that does not exist, an agent naming a skill that is not in
|
|
63
|
+
the catalog, and a skill in the catalog that no agent lists - the last of
|
|
64
|
+
which was true of four skills, installed but invisible to the runtime.
|
|
65
|
+
- `init` scaffolds `artefacts/` with the READMEs carrying the naming
|
|
66
|
+
conventions, so the skills writing accessibility notes, screenshot review
|
|
67
|
+
packs and delivery summaries have somewhere to put them in a fresh host.
|
|
54
68
|
- `init` reports research material in `hippocampus/source-artefacts/` rather
|
|
55
69
|
than silently committing it; `--private-artefacts` gitignores it.
|
package/README.md
CHANGED
|
@@ -34,11 +34,18 @@ back out and leaves every byte of your knowledge base where it is.
|
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
36
|
npx hippocampus doctor # what is wired, what is not, and where it looked
|
|
37
|
-
npx hippocampus skills install # copy the
|
|
37
|
+
npx hippocampus skills install # copy the skills, agents and instructions in
|
|
38
38
|
```
|
|
39
39
|
|
|
40
|
-
`skills install`
|
|
41
|
-
|
|
40
|
+
`skills install` writes three directories: `.github/skills` (the skill catalog),
|
|
41
|
+
`.github/agents` (role wrappers naming who runs each skill) and
|
|
42
|
+
`.github/instructions`. They install together because every agent's preferred
|
|
43
|
+
skills point into `.github/skills`, and every skill names its `owners` by agent,
|
|
44
|
+
so either half on its own is a set of dangling references. `--no-agents`
|
|
45
|
+
installs the skills alone for a host whose agent runtime is not Copilot.
|
|
46
|
+
|
|
47
|
+
It records a hash of what it wrote, so a later upgrade can tell a stale copy
|
|
48
|
+
from one your team has edited - the edited one is left alone and named.
|
|
42
49
|
|
|
43
50
|
## Wiring it by hand
|
|
44
51
|
|
|
@@ -119,9 +126,11 @@ describe the version you have installed. Nothing is copied into your repo -
|
|
|
119
126
|
a copied guide goes stale within a release, and the stale one is the copy people
|
|
120
127
|
read, because it is the one sitting in their editor.
|
|
121
128
|
|
|
122
|
-
`skills install` is the deliberate exception: an agent reads skills
|
|
123
|
-
files, so those are copied, with hashes so
|
|
124
|
-
one your team has edited.
|
|
129
|
+
`skills install` is the deliberate exception: an agent reads skills, agent
|
|
130
|
+
definitions and instructions as repo files, so those are copied, with hashes so
|
|
131
|
+
an upgrade can tell a stale copy from one your team has edited. Everything they
|
|
132
|
+
reference that is not a repo file is read from the installed package, so those
|
|
133
|
+
references cannot go stale either.
|
|
125
134
|
|
|
126
135
|
## Keeping research material out of the repo
|
|
127
136
|
|
package/agents/README.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Agents
|
|
2
|
+
|
|
3
|
+
These agent definitions are Copilot-friendly role wrappers for the portable skill catalog in `.github/skills/`.
|
|
4
|
+
|
|
5
|
+
Use role agents to decide **who** should do the work. Use skill files to decide **how** the task should be run with repo docs, scripts and finish checks.
|
|
6
|
+
|
|
7
|
+
Use the source model as the handoff contract between agents.
|
|
8
|
+
|
|
9
|
+
## Agents
|
|
10
|
+
|
|
11
|
+
- `knowledge-builder.md`
|
|
12
|
+
- `prototype-builder.md`
|
|
13
|
+
- `ingestion-curator.md`
|
|
14
|
+
- `screenshot-runner.md`
|
|
15
|
+
- `accessibility-tester.md`
|
|
16
|
+
- `workflow-orchestrator.md`
|
|
17
|
+
|
|
18
|
+
## Portable skills
|
|
19
|
+
|
|
20
|
+
- See `.github/skills/README.md` for the catalog.
|
|
21
|
+
- See `.github/skills/skills.json` for a machine-readable index that other agent runtimes can parse.
|
|
22
|
+
- See `.github/skills/COVERAGE-MATRIX.md` for archived prompt to current skill mapping.
|
|
23
|
+
|
|
24
|
+
## Common entrypoints
|
|
25
|
+
|
|
26
|
+
- End-to-end research ingestion: `.github/skills/ingest-research-round.skill.md`
|
|
27
|
+
- End-to-end project context ingestion: `.github/skills/ingest-project-context.skill.md`
|
|
28
|
+
- End-to-end service slice delivery: `.github/skills/deliver-service-slice.skill.md`
|
|
29
|
+
- Route review pack: `.github/skills/capture-route-review-pack.skill.md`
|
|
30
|
+
- Accessibility review note: `.github/skills/record-accessibility-review.skill.md`
|
|
31
|
+
- Route review handover: `.github/skills/write-route-review-summary.skill.md`
|
|
32
|
+
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# accessibility-tester
|
|
2
|
+
|
|
3
|
+
Reviews accessibility of changed prototype and Hippocampus pages.
|
|
4
|
+
|
|
5
|
+
## Responsibilities
|
|
6
|
+
|
|
7
|
+
- Check heading order, labels, link text and keyboard flow.
|
|
8
|
+
- Check NHS component usage.
|
|
9
|
+
- Store findings under `artefacts/accessibility/`.
|
|
10
|
+
- Separate blockers from improvements.
|
|
11
|
+
|
|
12
|
+
## Preferred Skills
|
|
13
|
+
|
|
14
|
+
- `.github/skills/record-accessibility-review.skill.md`
|
|
15
|
+
- `.github/skills/write-route-review-summary.skill.md`
|
|
16
|
+
|
|
17
|
+
## Read First
|
|
18
|
+
|
|
19
|
+
- `.github/instructions/nhs-frontend.instructions.md`
|
|
20
|
+
- `node_modules/@hippo-digital/hippocampus/docs/custom-agents-usage.md`
|
|
21
|
+
- `artefacts/accessibility/README.md`
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# ingestion-curator
|
|
2
|
+
|
|
3
|
+
Improves script-generated research and project-context drafts before human review and promotion.
|
|
4
|
+
|
|
5
|
+
## Responsibilities
|
|
6
|
+
|
|
7
|
+
- Work in `hippocampus/imports/research/` and `hippocampus/imports/project/`.
|
|
8
|
+
- Combine extracted draft files with source-model docs and promotion scripts.
|
|
9
|
+
- Keep reviewable metadata and extracted text intact.
|
|
10
|
+
- Run dry-run promotion checks, not direct promotion.
|
|
11
|
+
- Summarise changed draft fields, evidence gaps and remaining warnings.
|
|
12
|
+
|
|
13
|
+
## Preferred Skills
|
|
14
|
+
|
|
15
|
+
- `.github/skills/ingest-project-context.skill.md`
|
|
16
|
+
- `.github/skills/ingest-research-round.skill.md`
|
|
17
|
+
- `.github/skills/structure-project-context-draft.skill.md`
|
|
18
|
+
- `.github/skills/structure-research-draft.skill.md`
|
|
19
|
+
- `.github/skills/review-research-import-draft.skill.md`
|
|
20
|
+
- `.github/skills/map-research-to-graph.skill.md`
|
|
21
|
+
- `.github/skills/ingest-user-personas.skill.md`
|
|
22
|
+
- `.github/skills/record-design-decision.skill.md`
|
|
23
|
+
- `.github/skills/triage-research-corpus.skill.md`
|
|
24
|
+
|
|
25
|
+
## Read First
|
|
26
|
+
|
|
27
|
+
- `node_modules/@hippo-digital/hippocampus/docs/repeatable-research-round-ingestion.md`
|
|
28
|
+
- `.github/instructions/knowledge-source.instructions.md`
|
|
29
|
+
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# knowledge-builder
|
|
2
|
+
|
|
3
|
+
Maintains the Hippocampus source model.
|
|
4
|
+
|
|
5
|
+
## Responsibilities
|
|
6
|
+
|
|
7
|
+
- Edit `hippocampus/source`.
|
|
8
|
+
- Preserve linked source relationships.
|
|
9
|
+
- Add assumptions when evidence is missing.
|
|
10
|
+
- Run `npx hippocampus validate`.
|
|
11
|
+
- Summarise records changed and unresolved assumptions.
|
|
12
|
+
|
|
13
|
+
## Preferred Skills
|
|
14
|
+
|
|
15
|
+
- `.github/skills/deliver-service-slice.skill.md`
|
|
16
|
+
- `.github/skills/generate-service-slice.skill.md`
|
|
17
|
+
- `.github/skills/add-user-needs.skill.md`
|
|
18
|
+
- `.github/skills/add-scenario.skill.md`
|
|
19
|
+
- `.github/skills/create-journey-from-scenario.skill.md`
|
|
20
|
+
- `.github/skills/audit-knowledge-source.skill.md`
|
|
21
|
+
- `.github/skills/ingest-user-personas.skill.md`
|
|
22
|
+
- `.github/skills/record-design-decision.skill.md`
|
|
23
|
+
- `.github/skills/onboard-team-member.skill.md`
|
|
24
|
+
|
|
25
|
+
## Read First
|
|
26
|
+
|
|
27
|
+
- `node_modules/@hippo-digital/hippocampus/docs/source-model.md`
|
|
28
|
+
- `.github/instructions/knowledge-source.instructions.md`
|
|
29
|
+
- `node_modules/@hippo-digital/hippocampus/lib/schema.js`
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# prototype-builder
|
|
2
|
+
|
|
3
|
+
Builds NHS Prototype Kit routes and views from the source model.
|
|
4
|
+
|
|
5
|
+
## Responsibilities
|
|
6
|
+
|
|
7
|
+
- Edit `app/routes.js` and `app/views`.
|
|
8
|
+
- Use source data rather than hard-coded service facts.
|
|
9
|
+
- Reuse Hippocampus components where practical.
|
|
10
|
+
- Keep NHS UK Frontend conventions.
|
|
11
|
+
- Run `npx hippocampus validate` and `npx hippocampus doctor` when routes, views or screen routes change.
|
|
12
|
+
|
|
13
|
+
## Preferred Skills
|
|
14
|
+
|
|
15
|
+
- `.github/skills/deliver-service-slice.skill.md`
|
|
16
|
+
- `.github/skills/add-prototype-screen.skill.md`
|
|
17
|
+
- `.github/skills/audit-knowledge-source.skill.md`
|
|
18
|
+
|
|
19
|
+
## Read First
|
|
20
|
+
|
|
21
|
+
- `.github/instructions/nhs-prototype-kit.instructions.md`
|
|
22
|
+
- `.github/instructions/nhs-frontend.instructions.md`
|
|
23
|
+
- `app/routes.js`
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# screenshot-runner
|
|
2
|
+
|
|
3
|
+
Captures review evidence for prototype and Hippocampus routes.
|
|
4
|
+
|
|
5
|
+
## Responsibilities
|
|
6
|
+
|
|
7
|
+
- Start the prototype kit when needed.
|
|
8
|
+
- Visit changed routes.
|
|
9
|
+
- Capture screenshots or concise route notes.
|
|
10
|
+
- Store outputs under `artefacts/screenshots/<YYYY-MM-DD>-<topic>/`.
|
|
11
|
+
- Write a manifest describing routes captured and issues found.
|
|
12
|
+
|
|
13
|
+
## Preferred Skills
|
|
14
|
+
|
|
15
|
+
- `.github/skills/capture-route-review-pack.skill.md`
|
|
16
|
+
- `.github/skills/write-route-review-summary.skill.md`
|
|
17
|
+
|
|
18
|
+
## Read First
|
|
19
|
+
|
|
20
|
+
- `node_modules/@hippo-digital/hippocampus/docs/custom-agents-usage.md`
|
|
21
|
+
- `artefacts/screenshots/README.md`
|
|
22
|
+
- `app/routes.js`
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# workflow-orchestrator
|
|
2
|
+
|
|
3
|
+
Coordinates larger Hippocampus delivery work.
|
|
4
|
+
|
|
5
|
+
## Responsibilities
|
|
6
|
+
|
|
7
|
+
- Break work into source, prototype, validation and review steps.
|
|
8
|
+
- Use `knowledge-builder` before `prototype-builder` for service content.
|
|
9
|
+
- Use `ingestion-curator` for script-generated research and project-context drafts.
|
|
10
|
+
- Request screenshot and accessibility review for visible journeys.
|
|
11
|
+
- Store delivery summaries under `artefacts/delivery-summaries/`.
|
|
12
|
+
|
|
13
|
+
## Preferred Skills
|
|
14
|
+
|
|
15
|
+
- `.github/skills/deliver-service-slice.skill.md`
|
|
16
|
+
- `.github/skills/ingest-project-context.skill.md`
|
|
17
|
+
- `.github/skills/ingest-research-round.skill.md`
|
|
18
|
+
- `.github/skills/write-delivery-summary.skill.md`
|
|
19
|
+
- `.github/skills/capture-route-review-pack.skill.md`
|
|
20
|
+
- `.github/skills/record-accessibility-review.skill.md`
|
|
21
|
+
- `.github/skills/write-route-review-summary.skill.md`
|
|
22
|
+
- `.github/skills/generate-service-slice.skill.md`
|
|
23
|
+
- `.github/skills/add-prototype-screen.skill.md`
|
|
24
|
+
- `.github/skills/structure-project-context-draft.skill.md`
|
|
25
|
+
- `.github/skills/structure-research-draft.skill.md`
|
|
26
|
+
- `.github/skills/review-research-import-draft.skill.md`
|
|
27
|
+
- `.github/skills/map-research-to-graph.skill.md`
|
|
28
|
+
- `.github/skills/audit-knowledge-source.skill.md`
|
|
29
|
+
- `.github/skills/triage-research-corpus.skill.md`
|
|
30
|
+
- `.github/skills/onboard-team-member.skill.md`
|
|
31
|
+
|
|
32
|
+
## Required Finish
|
|
33
|
+
|
|
34
|
+
- Validation result.
|
|
35
|
+
- Routes or artefacts reviewed.
|
|
36
|
+
- Assumptions and unresolved risks.
|
|
37
|
+
- Suggested next action.
|
package/bin/hippocampus.js
CHANGED
|
@@ -24,7 +24,7 @@ const COMMANDS = {
|
|
|
24
24
|
'link insight-needs': 'link-insights-to-needs.js',
|
|
25
25
|
'source index': 'index-source-artefacts.js',
|
|
26
26
|
'source audit': 'audit-provenance.js',
|
|
27
|
-
'skills install': 'install-skills.js',
|
|
27
|
+
'skills install': 'install-skills.js', // also installs agents and instructions
|
|
28
28
|
'skills validate': 'validate-skills.js'
|
|
29
29
|
}
|
|
30
30
|
|
|
@@ -37,6 +37,7 @@ function usage () {
|
|
|
37
37
|
for (const name of Object.keys(COMMANDS)) console.log(` ${name}`)
|
|
38
38
|
console.log('\nOptions:')
|
|
39
39
|
console.log(' --root <dir> the project to act on (default: nearest project above the cwd)')
|
|
40
|
+
console.log(' --no-agents skills install: skills only, no agents or instructions')
|
|
40
41
|
console.log(' --version print the installed version')
|
|
41
42
|
console.log(' --help this message')
|
|
42
43
|
console.log('\nEvery command resolves a project root the same way; run `hippocampus validate`')
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "hippocampus/source/**/*.json,app/lib/hippocampus/**/*.js,scripts/validate-knowledge.js,docs/source-model.md"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Knowledge Source Instructions
|
|
6
|
+
|
|
7
|
+
The Hippocampus knowledge base is source-model first. JSON records in `hippocampus/source` drive the visible artefacts and prototype traceability.
|
|
8
|
+
|
|
9
|
+
## Editing Rules
|
|
10
|
+
|
|
11
|
+
- Read `docs/source-model.md` before editing records.
|
|
12
|
+
- Use structured JSON edits. Do not rely on fragile string manipulation.
|
|
13
|
+
- Keep IDs lowercase kebab-case.
|
|
14
|
+
- Preserve IDs unless a rename is explicitly requested.
|
|
15
|
+
- Keep arrays ordered for human review: project context first, then journey/user-facing order.
|
|
16
|
+
- Add assumptions instead of unsupported evidence claims.
|
|
17
|
+
- Use fictional and synthetic content only.
|
|
18
|
+
|
|
19
|
+
## Required Checks
|
|
20
|
+
|
|
21
|
+
Run:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
npm run validate:knowledge
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Validation must pass before the work is considered done.
|
|
28
|
+
|
|
29
|
+
If validation fails, fix the source relationships or schema issue before changing views.
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "app/views/**/*.html,app/views/**/*.njk,app/assets/sass/**/*.scss"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# NHS Frontend Instructions
|
|
6
|
+
|
|
7
|
+
Use NHS UK Frontend conventions.
|
|
8
|
+
|
|
9
|
+
## Interface Rules
|
|
10
|
+
|
|
11
|
+
- Use NHS component classes before custom styling.
|
|
12
|
+
- Keep headings hierarchical and page-specific.
|
|
13
|
+
- Use summary lists, cards, tables and tags only when they improve scanning.
|
|
14
|
+
- Use clear link text that makes sense out of context.
|
|
15
|
+
- Keep prototype screens accessible and keyboard-friendly.
|
|
16
|
+
- Avoid decorative UI that does not help the service-design task.
|
|
17
|
+
|
|
18
|
+
## Content Rules
|
|
19
|
+
|
|
20
|
+
- Write plain, task-focused NHS-style content.
|
|
21
|
+
- Keep clinical and service details synthetic unless explicitly provided as approved source material.
|
|
22
|
+
- Avoid overclaiming certainty. Represent unknowns as assumptions or risks.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
applyTo: "app/routes.js,app/views/**/*.html,app/views/**/*.njk,app/config.js"
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# NHS Prototype Kit Instructions
|
|
6
|
+
|
|
7
|
+
Use the existing NHS Prototype Kit structure.
|
|
8
|
+
|
|
9
|
+
## Routes
|
|
10
|
+
|
|
11
|
+
- Keep route handlers in `app/routes.js` concise.
|
|
12
|
+
- Load knowledge through `app/lib/hippocampus/load-knowledge.js`.
|
|
13
|
+
- Return useful not-found states instead of crashing on missing IDs.
|
|
14
|
+
|
|
15
|
+
## Views
|
|
16
|
+
|
|
17
|
+
- Use Nunjucks and NHS UK Frontend classes.
|
|
18
|
+
- Reuse components from `app/views/hippocampus/components` when patterns repeat.
|
|
19
|
+
- Keep page content driven by source data wherever possible.
|
|
20
|
+
- Do not put service facts only in Nunjucks if they belong in `hippocampus/source`.
|
|
21
|
+
|
|
22
|
+
## Checks
|
|
23
|
+
|
|
24
|
+
After route or view changes, run:
|
|
25
|
+
|
|
26
|
+
```bash
|
|
27
|
+
npm run validate:knowledge
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
When practical, start the kit and smoke-test affected routes.
|
package/lib/package-paths.js
CHANGED
|
@@ -28,5 +28,7 @@ module.exports = {
|
|
|
28
28
|
scriptsDir: path.join(packageRoot, 'scripts'),
|
|
29
29
|
templatesDir: path.join(packageRoot, 'templates'),
|
|
30
30
|
skillsDir: path.join(packageRoot, 'skills'),
|
|
31
|
+
agentsDir: path.join(packageRoot, 'agents'),
|
|
32
|
+
instructionsDir: path.join(packageRoot, 'instructions'),
|
|
31
33
|
docsDir: path.join(packageRoot, 'docs')
|
|
32
34
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hippo-digital/hippocampus",
|
|
3
|
-
"version": "1.0.0-rc.
|
|
3
|
+
"version": "1.0.0-rc.3",
|
|
4
4
|
"description": "A design-knowledge base for NHS Prototype Kit projects: research, insights, needs, journeys and screens, traceable end to end.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"main": "index.js",
|
|
@@ -15,6 +15,8 @@
|
|
|
15
15
|
"assets",
|
|
16
16
|
"scripts",
|
|
17
17
|
"skills",
|
|
18
|
+
"agents",
|
|
19
|
+
"instructions",
|
|
18
20
|
"templates",
|
|
19
21
|
"docs",
|
|
20
22
|
"README.md",
|
package/scripts/init.js
CHANGED
|
@@ -4,6 +4,7 @@ const path = require('path')
|
|
|
4
4
|
const { resolveRoot, CONFIG_FILENAME } = require('../lib/resolve-root')
|
|
5
5
|
const { CURRENT_SCHEMA_VERSION } = require('../lib/schema-version')
|
|
6
6
|
const hostEdit = require('../lib/host-edit')
|
|
7
|
+
const packagePaths = require('../lib/package-paths')
|
|
7
8
|
|
|
8
9
|
// Set a host project up to use Hippocampus: write the config and an empty
|
|
9
10
|
// knowledge base, then make the two host edits - both inside marked blocks, both
|
|
@@ -37,6 +38,7 @@ function main () {
|
|
|
37
38
|
|
|
38
39
|
planConfig(root)
|
|
39
40
|
planKnowledgeBase(root)
|
|
41
|
+
planArtefacts(root, artefactsDir(root))
|
|
40
42
|
planArtefactGovernance(root)
|
|
41
43
|
if (!noWire) {
|
|
42
44
|
planHostEdit(path.join(root, 'app/routes.js'), wireRoutes)
|
|
@@ -75,6 +77,54 @@ function planConfig (root) {
|
|
|
75
77
|
}, null, 2) + '\n'))
|
|
76
78
|
}
|
|
77
79
|
|
|
80
|
+
// Several skills write into `artefacts/` - accessibility notes, screenshot
|
|
81
|
+
// review packs, delivery summaries - and two agents name the READMEs there as
|
|
82
|
+
// required reading. A fresh host had none of it, so those skills had nowhere to
|
|
83
|
+
// put their output and the agents pointed at files that did not exist. The
|
|
84
|
+
// READMEs carry the naming conventions, which is the part that stops every
|
|
85
|
+
// project inventing its own.
|
|
86
|
+
//
|
|
87
|
+
// Each file is written only when absent: these are the host's to edit.
|
|
88
|
+
// The host may have renamed it in the config; honour that rather than assuming.
|
|
89
|
+
function artefactsDir (root) {
|
|
90
|
+
const configPath = path.join(root, CONFIG_FILENAME)
|
|
91
|
+
if (!fs.existsSync(configPath)) return 'artefacts'
|
|
92
|
+
try {
|
|
93
|
+
return JSON.parse(fs.readFileSync(configPath, 'utf8')).artefactsDir || 'artefacts'
|
|
94
|
+
} catch {
|
|
95
|
+
return 'artefacts'
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function planArtefacts (root, artefactsDir) {
|
|
100
|
+
const from = path.join(packagePaths.templatesDir, 'artefacts')
|
|
101
|
+
const to = path.join(root, artefactsDir)
|
|
102
|
+
const missing = []
|
|
103
|
+
|
|
104
|
+
for (const rel of listTemplateFiles(from)) {
|
|
105
|
+
if (!fs.existsSync(path.join(to, rel))) missing.push(rel)
|
|
106
|
+
}
|
|
107
|
+
if (!missing.length) return
|
|
108
|
+
|
|
109
|
+
plan(`${artefactsDir}/ and ${missing.length} README${missing.length === 1 ? '' : 's'}`, () => {
|
|
110
|
+
for (const rel of missing) {
|
|
111
|
+
const target = path.join(to, rel)
|
|
112
|
+
fs.mkdirSync(path.dirname(target), { recursive: true })
|
|
113
|
+
fs.copyFileSync(path.join(from, rel), target)
|
|
114
|
+
}
|
|
115
|
+
})
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function listTemplateFiles (dir, prefix = '') {
|
|
119
|
+
const found = []
|
|
120
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
121
|
+
const rel = prefix ? path.posix.join(prefix, entry.name) : entry.name
|
|
122
|
+
if (entry.isDirectory()) found.push(...listTemplateFiles(path.join(dir, entry.name), rel))
|
|
123
|
+
else found.push(rel)
|
|
124
|
+
}
|
|
125
|
+
return found
|
|
126
|
+
}
|
|
127
|
+
|
|
78
128
|
function planKnowledgeBase (root) {
|
|
79
129
|
const sourceDir = path.join(root, 'hippocampus/source')
|
|
80
130
|
const projectPath = path.join(sourceDir, 'project.json')
|
|
@@ -17,50 +17,121 @@ const packagePaths = require('../lib/package-paths')
|
|
|
17
17
|
//
|
|
18
18
|
// Shared files a host is entitled to own - the README, the format contract, the
|
|
19
19
|
// schema - are written only when absent.
|
|
20
|
+
//
|
|
21
|
+
// Agents and instructions install alongside skills rather than under a command
|
|
22
|
+
// of their own. Every agent's "Preferred Skills" list points into
|
|
23
|
+
// `.github/skills/`, so an agent installed without its skills is a file full of
|
|
24
|
+
// dangling links, and a skill catalog with no agents has nothing naming who runs
|
|
25
|
+
// what - all 21 skills declare `owners`. Installing them together is the only
|
|
26
|
+
// combination that leaves the host consistent. `--no-agents` opts out for a host
|
|
27
|
+
// whose agent runtime is not Copilot; the skills still install.
|
|
20
28
|
|
|
21
29
|
const argv = process.argv.slice(2)
|
|
22
30
|
const dryRun = argv.includes('--dry-run')
|
|
23
31
|
const force = argv.includes('--force')
|
|
32
|
+
const withAgents = !argv.includes('--no-agents')
|
|
24
33
|
const MANIFEST = '.hippocampus-skills.json'
|
|
25
34
|
const NEVER_OVERWRITE = new Set(['README.md', 'SKILL-FORMAT.md', 'skills.schema.json', 'COVERAGE-MATRIX.md'])
|
|
26
35
|
|
|
36
|
+
// The manifest records a hash per installed file. Skills and agents both ship a
|
|
37
|
+
// README.md, so the three trees get their own maps rather than one flat one -
|
|
38
|
+
// a single map would have the agents' README silently claim the skills' hash and
|
|
39
|
+
// then report both as locally edited on the next upgrade.
|
|
40
|
+
const TREES = [
|
|
41
|
+
{ key: 'files', source: 'skillsDir', target: '.github/skills', label: 'skills' },
|
|
42
|
+
{ key: 'agents', source: 'agentsDir', target: '.github/agents', label: 'agents' },
|
|
43
|
+
{ key: 'instructions', source: 'instructionsDir', target: '.github/instructions', label: 'instructions' }
|
|
44
|
+
]
|
|
45
|
+
|
|
27
46
|
function hash (text) {
|
|
28
47
|
return crypto.createHash('sha256').update(text).digest('hex').slice(0, 16)
|
|
29
48
|
}
|
|
30
49
|
|
|
31
50
|
function main () {
|
|
32
51
|
const { root } = resolveRoot({ argv })
|
|
33
|
-
const
|
|
34
|
-
const manifestPath = path.join(
|
|
52
|
+
const skillsTarget = path.join(root, '.github/skills')
|
|
53
|
+
const manifestPath = path.join(skillsTarget, MANIFEST)
|
|
35
54
|
const manifest = fs.existsSync(manifestPath)
|
|
36
55
|
? JSON.parse(fs.readFileSync(manifestPath, 'utf8'))
|
|
37
|
-
: {
|
|
38
|
-
manifest.files = manifest.files || {}
|
|
56
|
+
: {}
|
|
39
57
|
manifest.skillIds = manifest.skillIds || []
|
|
40
58
|
|
|
41
|
-
console.log(`Project root: ${root}`)
|
|
42
|
-
|
|
59
|
+
console.log(`Project root: ${root}\n`)
|
|
60
|
+
|
|
61
|
+
const trees = TREES.filter((tree) => tree.key === 'files' || withAgents)
|
|
62
|
+
let wroteAnything = false
|
|
63
|
+
let anySkipped = false
|
|
64
|
+
|
|
65
|
+
for (const tree of trees) {
|
|
66
|
+
manifest[tree.key] = manifest[tree.key] || {}
|
|
67
|
+
const sourceDir = packagePaths[tree.source]
|
|
68
|
+
if (!fs.existsSync(sourceDir)) continue
|
|
43
69
|
|
|
70
|
+
const result = installTree(sourceDir, path.join(root, tree.target), manifest[tree.key])
|
|
71
|
+
wroteAnything = wroteAnything || result.written.length > 0
|
|
72
|
+
anySkipped = anySkipped || result.skipped.length > 0
|
|
73
|
+
|
|
74
|
+
console.log(`${tree.target}`)
|
|
75
|
+
console.log(` ${dryRun ? 'would install' : 'installed'}: ${result.written.length} files`)
|
|
76
|
+
if (result.unchanged.length) console.log(` already current: ${result.unchanged.length}`)
|
|
77
|
+
if (result.kept.length) console.log(` left as yours: ${result.kept.join(', ')}`)
|
|
78
|
+
if (result.skipped.length) {
|
|
79
|
+
console.log(` left alone because they have been edited here (${result.skipped.length}):`)
|
|
80
|
+
for (const name of result.skipped) console.log(` ${name}`)
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (tree.key === 'files') {
|
|
84
|
+
const merged = mergeCatalog(skillsTarget, manifest)
|
|
85
|
+
wroteAnything = wroteAnything || merged.added.length > 0
|
|
86
|
+
console.log(` ${dryRun ? 'would add' : 'added'} to the catalog: ${merged.added.length} skills` +
|
|
87
|
+
(merged.existing ? ` (alongside ${merged.existing} already there)` : ''))
|
|
88
|
+
if (merged.refreshed) console.log(` refreshed in the catalog: ${merged.refreshed} entries`)
|
|
89
|
+
}
|
|
90
|
+
console.log('')
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (!withAgents) {
|
|
94
|
+
console.log('Agents and instructions were not installed (--no-agents).')
|
|
95
|
+
console.log('Skills declare owners by agent name, so without them nothing names who runs each skill.\n')
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (anySkipped) {
|
|
99
|
+
console.log('Re-install edited files with --force once you have kept whatever you changed.\n')
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
if (!dryRun && wroteAnything) {
|
|
103
|
+
manifest.version = require('../package.json').version
|
|
104
|
+
manifest.updatedAt = new Date().toISOString()
|
|
105
|
+
fs.mkdirSync(skillsTarget, { recursive: true })
|
|
106
|
+
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n')
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Copy one tree of package-owned files into the host, recording a hash of each
|
|
112
|
+
* so a later upgrade can tell "we wrote this and it is untouched" from "someone
|
|
113
|
+
* has edited it here". Untouched files are refreshed silently; edited ones are
|
|
114
|
+
* named and left alone unless --force.
|
|
115
|
+
*/
|
|
116
|
+
function installTree (sourceDir, targetDir, manifestFiles) {
|
|
44
117
|
const written = []
|
|
45
118
|
const skipped = []
|
|
46
119
|
const unchanged = []
|
|
47
120
|
const kept = []
|
|
48
121
|
|
|
49
|
-
for (const name of fs.readdirSync(
|
|
122
|
+
for (const name of fs.readdirSync(sourceDir)) {
|
|
50
123
|
if (name === 'skills.json' || !/\.(skill\.md|md|json)$/.test(name)) continue
|
|
51
124
|
|
|
52
125
|
const to = path.join(targetDir, name)
|
|
53
|
-
const content = fs.readFileSync(path.join(
|
|
126
|
+
const content = fs.readFileSync(path.join(sourceDir, name), 'utf8')
|
|
54
127
|
const incoming = hash(content)
|
|
55
128
|
|
|
56
129
|
if (fs.existsSync(to)) {
|
|
57
130
|
const current = hash(fs.readFileSync(to, 'utf8'))
|
|
58
131
|
if (current === incoming) { unchanged.push(name); continue }
|
|
59
132
|
if (NEVER_OVERWRITE.has(name)) { kept.push(name); continue }
|
|
60
|
-
const installed =
|
|
133
|
+
const installed = manifestFiles[name]
|
|
61
134
|
if (installed && current !== installed && !force) { skipped.push(name); continue }
|
|
62
|
-
} else if (NEVER_OVERWRITE.has(name) && name !== 'SKILL-FORMAT.md' && name !== 'skills.schema.json') {
|
|
63
|
-
// A README the host does not have is worth providing; one it does is not.
|
|
64
135
|
}
|
|
65
136
|
|
|
66
137
|
written.push(name)
|
|
@@ -68,29 +139,10 @@ function main () {
|
|
|
68
139
|
fs.mkdirSync(targetDir, { recursive: true })
|
|
69
140
|
fs.writeFileSync(to, content)
|
|
70
141
|
}
|
|
71
|
-
|
|
142
|
+
manifestFiles[name] = incoming
|
|
72
143
|
}
|
|
73
144
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
if (!dryRun && (written.length || merged.added.length)) {
|
|
77
|
-
manifest.version = require('../package.json').version
|
|
78
|
-
manifest.updatedAt = new Date().toISOString()
|
|
79
|
-
fs.mkdirSync(targetDir, { recursive: true })
|
|
80
|
-
fs.writeFileSync(manifestPath, JSON.stringify(manifest, null, 2) + '\n')
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
console.log(`${dryRun ? 'would install' : 'installed'}: ${written.length} files`)
|
|
84
|
-
console.log(`${dryRun ? 'would add' : 'added'} to the catalog: ${merged.added.length} skills` +
|
|
85
|
-
(merged.existing ? ` (alongside ${merged.existing} already there)` : ''))
|
|
86
|
-
if (merged.refreshed) console.log(`refreshed in the catalog: ${merged.refreshed} entries`)
|
|
87
|
-
if (unchanged.length) console.log(`already current: ${unchanged.length}`)
|
|
88
|
-
if (kept.length) console.log(`left as yours: ${kept.join(', ')}`)
|
|
89
|
-
if (skipped.length) {
|
|
90
|
-
console.log(`\nleft alone because they have been edited here (${skipped.length}):`)
|
|
91
|
-
for (const name of skipped) console.log(` ${name}`)
|
|
92
|
-
console.log('\nRe-install them with --force once you have kept whatever you changed.')
|
|
93
|
-
}
|
|
145
|
+
return { written, skipped, unchanged, kept }
|
|
94
146
|
}
|
|
95
147
|
|
|
96
148
|
/**
|
|
@@ -103,6 +103,8 @@ function main () {
|
|
|
103
103
|
validateSkillFile(skillPath, entry, catalogIds, errors)
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
+
validateAgents(catalog, errors)
|
|
107
|
+
|
|
106
108
|
if (errors.length) {
|
|
107
109
|
console.error('Skill catalog is invalid')
|
|
108
110
|
for (const error of errors) {
|
|
@@ -114,6 +116,49 @@ function main () {
|
|
|
114
116
|
console.log(`Skill catalog is valid (${catalog.skills.length} skills)`)
|
|
115
117
|
}
|
|
116
118
|
|
|
119
|
+
/**
|
|
120
|
+
* Agents and skills point at each other and nothing was checking either
|
|
121
|
+
* direction. Both halves rot the same way and both are silent:
|
|
122
|
+
*
|
|
123
|
+
* - a skill names an `owners` agent that does not exist, so nobody runs it;
|
|
124
|
+
* - an agent lists a Preferred Skill that has been renamed or removed, so the
|
|
125
|
+
* agent opens a file that is not there;
|
|
126
|
+
* - a skill exists, declares owners, and no agent lists it - which is how four
|
|
127
|
+
* skills ended up installed but invisible to the runtime.
|
|
128
|
+
*
|
|
129
|
+
* The third is the one worth having a test for, because the skill looks fine
|
|
130
|
+
* from every angle except the only one that matters.
|
|
131
|
+
*/
|
|
132
|
+
function validateAgents (catalog, errors) {
|
|
133
|
+
const agentsDir = packagePaths.agentsDir
|
|
134
|
+
if (!fs.existsSync(agentsDir)) return
|
|
135
|
+
|
|
136
|
+
const agentFiles = fs.readdirSync(agentsDir).filter((name) => name.endsWith('.md'))
|
|
137
|
+
const agentNames = new Set(agentFiles.filter((name) => name !== 'README.md').map((name) => name.replace(/\.md$/, '')))
|
|
138
|
+
|
|
139
|
+
const referenced = new Set()
|
|
140
|
+
for (const name of agentFiles) {
|
|
141
|
+
const text = fs.readFileSync(path.join(agentsDir, name), 'utf8')
|
|
142
|
+
for (const match of text.matchAll(/\.github\/skills\/([a-z0-9-]+\.skill\.md)/g)) {
|
|
143
|
+
referenced.add(match[1])
|
|
144
|
+
if (!catalog.skills.some((skill) => skill.file === match[1])) {
|
|
145
|
+
errors.push(`agents/${name} names a skill that is not in the catalog: ${match[1]}`)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
for (const skill of catalog.skills) {
|
|
151
|
+
for (const owner of skill.owners) {
|
|
152
|
+
if (!agentNames.has(owner)) {
|
|
153
|
+
errors.push(`${skill.file} is owned by an agent that does not exist: ${owner}`)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
if (!referenced.has(skill.file)) {
|
|
157
|
+
errors.push(`${skill.file} is in the catalog but no agent lists it, so no agent will find it`)
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
117
162
|
function validateSkillFile (skillPath, catalogEntry, catalogIds, errors) {
|
|
118
163
|
let parsed
|
|
119
164
|
|
|
@@ -6,7 +6,6 @@ owners:
|
|
|
6
6
|
- knowledge-builder
|
|
7
7
|
- workflow-orchestrator
|
|
8
8
|
reads:
|
|
9
|
-
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
10
9
|
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
11
10
|
- hippocampus/source/scenarios.json
|
|
12
11
|
- hippocampus/source/journeys.json
|
|
@@ -16,7 +16,6 @@ composes:
|
|
|
16
16
|
reads:
|
|
17
17
|
- node_modules/@hippo-digital/hippocampus/docs/agent-workflow.md
|
|
18
18
|
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
19
|
-
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
20
19
|
- app/routes.js
|
|
21
20
|
- hippocampus/source/
|
|
22
21
|
- app/views/
|
|
@@ -11,7 +11,6 @@ reads:
|
|
|
11
11
|
- node_modules/@hippo-digital/hippocampus/docs/repeatable-research-round-ingestion.md
|
|
12
12
|
- node_modules/@hippo-digital/hippocampus/docs/hippocampus-technical.md
|
|
13
13
|
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
14
|
-
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
15
14
|
- hippocampus/inbox/project/
|
|
16
15
|
- hippocampus/imports/project/[draft-id].review.md
|
|
17
16
|
- hippocampus/imports/project/[draft-id].json
|
|
@@ -9,7 +9,6 @@ owners:
|
|
|
9
9
|
reads:
|
|
10
10
|
- node_modules/@hippo-digital/hippocampus/docs/research-knowledge-graph.md
|
|
11
11
|
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
12
|
-
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
13
12
|
- hippocampus/source/users.json
|
|
14
13
|
- hippocampus/source/needs.json
|
|
15
14
|
- hippocampus/source/scenarios.json
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
id: onboard-team-member
|
|
3
|
+
title: Onboard a team member
|
|
4
|
+
purpose: Orient someone new to the project from what the knowledge base already knows, and leave them a dated briefing they can read without an agent.
|
|
5
|
+
owners:
|
|
6
|
+
- knowledge-builder
|
|
7
|
+
- workflow-orchestrator
|
|
8
|
+
composes:
|
|
9
|
+
- ingest-project-context
|
|
10
|
+
- audit-knowledge-source
|
|
11
|
+
reads:
|
|
12
|
+
- hippocampus/source/project.json
|
|
13
|
+
- hippocampus/source/project-context.json
|
|
14
|
+
- hippocampus/source/users.json
|
|
15
|
+
- hippocampus/source/needs.json
|
|
16
|
+
- hippocampus/source/insights.json
|
|
17
|
+
- hippocampus/source/design-actions.json
|
|
18
|
+
- hippocampus/source/decisions.json
|
|
19
|
+
- hippocampus/source/screens.json
|
|
20
|
+
- hippocampus/source/research-rounds.json
|
|
21
|
+
- hippocampus/source/relationships.json
|
|
22
|
+
edits:
|
|
23
|
+
- artefacts/onboarding/
|
|
24
|
+
runs:
|
|
25
|
+
- npx hippocampus validate
|
|
26
|
+
outputs:
|
|
27
|
+
- Answers to a new joiner's questions, grounded in the knowledge base
|
|
28
|
+
- A dated briefing under artefacts/onboarding/ when one is asked for
|
|
29
|
+
guardrails:
|
|
30
|
+
- Separate what was counted from what was written. State every figure as of today's date and name the file each narrative claim came from.
|
|
31
|
+
- Do not invent the project narrative. If project-context.json is empty, say so and point at ingest-project-context rather than describing the project from the graph alone.
|
|
32
|
+
- Write for content, service and interaction designers and user researchers. No file paths, schema names or CLI commands in the briefing itself - link to viewer pages instead.
|
|
33
|
+
- Do not present coverage gaps as failures. "Most needs have no screen" is normal on a project where one slice has been designed; say which slice, not just the number.
|
|
34
|
+
- A project with no rounds, insights or actions is new, not failing. Say so, drop the empty sections, and write a starting guide instead of a status report.
|
|
35
|
+
- The briefing must stand alone. Someone with no agent and no terminal should be able to read it and know where to go next.
|
|
36
|
+
acceptance:
|
|
37
|
+
- Every figure in the output is derived from the knowledge base, not recalled.
|
|
38
|
+
- Narrative claims are attributed, or their absence is stated.
|
|
39
|
+
- Each named role has something specific to do next.
|
|
40
|
+
- A briefing, if produced, is dated and readable without an agent.
|
|
41
|
+
- npx hippocampus validate passes.
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
# Onboard a team member
|
|
45
|
+
|
|
46
|
+
## Use when
|
|
47
|
+
- Someone joins a project that already has a knowledge base and needs to know what is known, what is decided, and what is open.
|
|
48
|
+
- Someone is picking up work after a handover and wants the current state rather than the history.
|
|
49
|
+
|
|
50
|
+
Works in two modes. **Live** - answer their questions in conversation, grounded in the records. **Briefing** - write a dated document to `artefacts/onboarding/` for someone who does not have an agent set up yet, or who wants something to keep.
|
|
51
|
+
|
|
52
|
+
## Workflow
|
|
53
|
+
|
|
54
|
+
### Read these first
|
|
55
|
+
|
|
56
|
+
1. `project.json` and `project-context.json` for what the project is. **`project-context.json` is the narrative half.** If its `purpose`, `problemStatement` and `constraints` are empty, the project has never recorded why it exists - say that plainly and suggest `ingest-project-context`. Do not reconstruct a purpose from the graph.
|
|
57
|
+
2. The graph for the state. Everything below is counted, not remembered.
|
|
58
|
+
3. `npx hippocampus validate` for the coverage notes.
|
|
59
|
+
|
|
60
|
+
### Compute rather than recall
|
|
61
|
+
|
|
62
|
+
| Question a joiner asks | Where the answer comes from |
|
|
63
|
+
| --- | --- |
|
|
64
|
+
| What have we learned? | insights, grouped by research round, with participant counts |
|
|
65
|
+
| Who are we designing for? | users, and how many needs each carries |
|
|
66
|
+
| What has been designed? | screens, and which needs they address |
|
|
67
|
+
| What is still open? | design actions by status |
|
|
68
|
+
| What has been decided? | decisions by status; flag any whose consequence is unrecorded |
|
|
69
|
+
| Where are the gaps? | needs with no screen, insights with no need, rounds with no insights |
|
|
70
|
+
|
|
71
|
+
Give the figure and the reading of it. "108 of 132 needs have no screen" is data; "only patient search has been designed, so most needs are untouched - that is the backlog, not a fault" is orientation.
|
|
72
|
+
|
|
73
|
+
### When the knowledge base is thin
|
|
74
|
+
|
|
75
|
+
A new project has few records, and a briefing full of zeros reads as though something is
|
|
76
|
+
broken. Check before writing: a project with no research rounds, no insights and no design
|
|
77
|
+
actions is **new, not failing**, and the briefing should say so in its first line and become
|
|
78
|
+
a starting guide rather than a status report.
|
|
79
|
+
|
|
80
|
+
In that case, skip the research and open-work sections entirely - an empty section invites
|
|
81
|
+
the reader to think something is missing - and tell them what the project does have and what
|
|
82
|
+
the first records should be. A project with screens and needs but no research has been
|
|
83
|
+
designed on assumptions; that is worth naming, because it is exactly the thing a new
|
|
84
|
+
researcher is there to fix.
|
|
85
|
+
|
|
86
|
+
Only report a count as a gap when there is enough around it for the gap to mean something.
|
|
87
|
+
|
|
88
|
+
### By role
|
|
89
|
+
|
|
90
|
+
Give each person one specific thing to look at and one they could do this week.
|
|
91
|
+
|
|
92
|
+
- **User researcher** - which rounds produced insights and which did not, insights not yet linked to a need, and whether participants are recorded for each round. The unlinked insights are usually the most useful first contribution.
|
|
93
|
+
- **Content designer** - the screens that exist and the needs behind them. Words on a screen trace back to a need statement written in a user's own language; that is where to check whether the two still agree.
|
|
94
|
+
- **Service designer** - the journeys and their blueprint lanes, and which lanes are empty. An empty backstage or governance lane is a question nobody has answered yet.
|
|
95
|
+
- **Interaction / UX designer** - needs with no screen, and design actions still `proposed`. Those two lists together are the design backlog.
|
|
96
|
+
|
|
97
|
+
## Guardrails
|
|
98
|
+
|
|
99
|
+
- Separate what was counted from what was written. State figures as of today's date; name the file each narrative claim came from.
|
|
100
|
+
- Do not invent the project narrative.
|
|
101
|
+
- No file paths, schema names or CLI commands in the briefing - link to viewer pages.
|
|
102
|
+
- Do not present coverage gaps as failures.
|
|
103
|
+
- The briefing must stand alone.
|
|
104
|
+
|
|
105
|
+
## Finish
|
|
106
|
+
|
|
107
|
+
- Run `npx hippocampus validate` and reflect its coverage notes in what you report.
|
|
108
|
+
- In live mode, end by asking which role they are in, and give them the section for it.
|
|
109
|
+
- In briefing mode, write `artefacts/onboarding/<date>-orientation.md` and report where it is, which figures it carries, and anything you could not answer because the project context is empty.
|
|
@@ -9,6 +9,10 @@ reads:
|
|
|
9
9
|
- node_modules/@hippo-digital/hippocampus/docs/design-actions-and-decisions.md
|
|
10
10
|
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
11
11
|
- node_modules/@hippo-digital/hippocampus/templates/insight-design-action-tracker.xlsx
|
|
12
|
+
- hippocampus/source/design-actions.json
|
|
13
|
+
- hippocampus/source/decisions.json
|
|
14
|
+
- hippocampus/source/relationships.json
|
|
15
|
+
- hippocampus/source/insights.json
|
|
12
16
|
edits:
|
|
13
17
|
- hippocampus/source/design-actions.json
|
|
14
18
|
- hippocampus/source/decisions.json
|
package/skills/skills.json
CHANGED
|
@@ -485,6 +485,34 @@
|
|
|
485
485
|
"Missing artefacts or unresolved blockers stay visible.",
|
|
486
486
|
"The summary path is reported."
|
|
487
487
|
]
|
|
488
|
+
},
|
|
489
|
+
{
|
|
490
|
+
"id": "onboard-team-member",
|
|
491
|
+
"title": "Onboard a team member",
|
|
492
|
+
"purpose": "Orient someone new to the project from what the knowledge base already knows, and leave them a dated briefing they can read without an agent.",
|
|
493
|
+
"file": "onboard-team-member.skill.md",
|
|
494
|
+
"owners": [
|
|
495
|
+
"knowledge-builder",
|
|
496
|
+
"workflow-orchestrator"
|
|
497
|
+
],
|
|
498
|
+
"composes": [
|
|
499
|
+
"ingest-project-context",
|
|
500
|
+
"audit-knowledge-source"
|
|
501
|
+
],
|
|
502
|
+
"runs": [
|
|
503
|
+
"npx hippocampus validate"
|
|
504
|
+
],
|
|
505
|
+
"outputs": [
|
|
506
|
+
"Answers to a new joiner's questions, grounded in the knowledge base",
|
|
507
|
+
"A dated briefing under artefacts/onboarding/ when one is asked for"
|
|
508
|
+
],
|
|
509
|
+
"acceptance": [
|
|
510
|
+
"Every figure in the output is derived from the knowledge base, not recalled.",
|
|
511
|
+
"Narrative claims are attributed, or their absence is stated.",
|
|
512
|
+
"Each named role has something specific to do next.",
|
|
513
|
+
"A briefing, if produced, is dated and readable without an agent.",
|
|
514
|
+
"npx hippocampus validate passes."
|
|
515
|
+
]
|
|
488
516
|
}
|
|
489
517
|
]
|
|
490
518
|
}
|
|
@@ -8,7 +8,6 @@ owners:
|
|
|
8
8
|
reads:
|
|
9
9
|
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
10
10
|
- node_modules/@hippo-digital/hippocampus/docs/hippocampus-technical.md
|
|
11
|
-
- node_modules/@hippo-digital/hippocampus/docs/source-model.md
|
|
12
11
|
- hippocampus/imports/project/[draft-id].review.md
|
|
13
12
|
- hippocampus/imports/project/[draft-id].json
|
|
14
13
|
edits:
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Artefacts
|
|
2
|
+
|
|
3
|
+
`artefacts/` stores generated review outputs and delivery evidence.
|
|
4
|
+
|
|
5
|
+
It is not canonical source data. Deleting `artefacts/` should not break the app or the knowledge model.
|
|
6
|
+
|
|
7
|
+
## Subfolders
|
|
8
|
+
|
|
9
|
+
- `screenshots/` - dated review packs for routes, screenshots, and per-route notes
|
|
10
|
+
- `accessibility/` - dated review notes with blockers and follow-up improvements
|
|
11
|
+
- `delivery-summaries/` - handover notes for multi-step work
|
|
12
|
+
- `generated-docs/` - importer and AI-generated review drafts
|
|
13
|
+
|
|
14
|
+
## Naming conventions
|
|
15
|
+
|
|
16
|
+
Use dated, reviewable paths:
|
|
17
|
+
|
|
18
|
+
- `artefacts/screenshots/<YYYY-MM-DD>-<topic>/manifest.md`
|
|
19
|
+
- `artefacts/accessibility/<YYYY-MM-DD>-<topic>.md`
|
|
20
|
+
- `artefacts/delivery-summaries/<YYYY-MM-DD>-<topic>.md`
|
|
21
|
+
|
|
22
|
+
If a workflow cannot produce images, store notes instead of pretending a screenshot exists.
|
|
23
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Accessibility review notes
|
|
2
|
+
|
|
3
|
+
Store one dated note per review run:
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
artefacts/accessibility/<YYYY-MM-DD>-<topic>.md
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
## Suggested sections
|
|
10
|
+
|
|
11
|
+
- scope
|
|
12
|
+
- routes reviewed
|
|
13
|
+
- blockers
|
|
14
|
+
- improvements
|
|
15
|
+
- unanswered questions
|
|
16
|
+
- manual follow-up
|
|
17
|
+
|
|
18
|
+
## What to check
|
|
19
|
+
|
|
20
|
+
Document what was actually reviewed:
|
|
21
|
+
|
|
22
|
+
- heading order
|
|
23
|
+
- labels and legends
|
|
24
|
+
- link text
|
|
25
|
+
- focus flow and keyboard reachability
|
|
26
|
+
- NHS component usage
|
|
27
|
+
- error-state clarity
|
|
28
|
+
|
|
29
|
+
If the review is code-based rather than runtime-based, say so explicitly.
|
|
30
|
+
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
# Delivery summaries
|
|
2
|
+
|
|
3
|
+
Store one dated summary per multi-step change:
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
artefacts/delivery-summaries/<YYYY-MM-DD>-<topic>.md
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Use delivery summaries for handover notes, route reviews, ingestion proofs, and other orchestrated work.
|
|
10
|
+
|
|
11
|
+
## Include
|
|
12
|
+
|
|
13
|
+
- request or outcome delivered
|
|
14
|
+
- files changed
|
|
15
|
+
- commands run and their results
|
|
16
|
+
- linked screenshot or accessibility artefacts
|
|
17
|
+
- assumptions, blockers, and follow-up work
|
|
18
|
+
|
|
19
|
+
Keep summaries concise, factual, and reviewable.
|
|
20
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Screenshot review packs
|
|
2
|
+
|
|
3
|
+
Use one folder per route-review run:
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
artefacts/screenshots/<YYYY-MM-DD>-<topic>/
|
|
7
|
+
manifest.md
|
|
8
|
+
01-route-slug.png
|
|
9
|
+
02-route-slug.png
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
If image capture is not available, keep the folder and write route notes in `manifest.md` instead.
|
|
13
|
+
|
|
14
|
+
## Manifest checklist
|
|
15
|
+
|
|
16
|
+
Record:
|
|
17
|
+
|
|
18
|
+
- review purpose
|
|
19
|
+
- commands run, especially `npx hippocampus doctor`
|
|
20
|
+
- routes reviewed
|
|
21
|
+
- whether each route has an image or notes only
|
|
22
|
+
- issues found
|
|
23
|
+
- routes skipped or still needing manual review
|
|
24
|
+
|
|
25
|
+
## Conventions
|
|
26
|
+
|
|
27
|
+
- Prefer one screenshot per route state that matters.
|
|
28
|
+
- Use lowercase route slugs in filenames where practical.
|
|
29
|
+
- Keep fictional data fictional.
|
|
30
|
+
|