domain-knowledge-kit 0.2.14 → 0.2.16
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/.github/skills/{flow-implementer → dkk-flow-implementer}/skill.md +17 -8
- package/.github/skills/{story-analyst → dkk-story-analyst}/skill.md +23 -13
- package/README.md +5 -0
- package/dist/cli.js +20 -0
- package/dist/cli.js.map +1 -1
- package/dist/features/agent/commands/init.d.ts.map +1 -1
- package/dist/features/agent/commands/init.js +141 -3
- package/dist/features/agent/commands/init.js.map +1 -1
- package/dist/features/agent/commands/prime.d.ts +11 -0
- package/dist/features/agent/commands/prime.d.ts.map +1 -1
- package/dist/features/agent/commands/prime.js +122 -10
- package/dist/features/agent/commands/prime.js.map +1 -1
- package/dist/features/federation/commands/consumers.d.ts +40 -0
- package/dist/features/federation/commands/consumers.d.ts.map +1 -0
- package/dist/features/federation/commands/consumers.js +126 -0
- package/dist/features/federation/commands/consumers.js.map +1 -0
- package/dist/features/federation/commands/peers-add.d.ts +14 -0
- package/dist/features/federation/commands/peers-add.d.ts.map +1 -0
- package/dist/features/federation/commands/peers-add.js +79 -0
- package/dist/features/federation/commands/peers-add.js.map +1 -0
- package/dist/features/federation/commands/peers-list.d.ts +8 -0
- package/dist/features/federation/commands/peers-list.d.ts.map +1 -0
- package/dist/features/federation/commands/peers-list.js +51 -0
- package/dist/features/federation/commands/peers-list.js.map +1 -0
- package/dist/features/federation/commands/peers-status.d.ts +8 -0
- package/dist/features/federation/commands/peers-status.d.ts.map +1 -0
- package/dist/features/federation/commands/peers-status.js +78 -0
- package/dist/features/federation/commands/peers-status.js.map +1 -0
- package/dist/features/federation/commands/pull.d.ts +18 -0
- package/dist/features/federation/commands/pull.d.ts.map +1 -0
- package/dist/features/federation/commands/pull.js +153 -0
- package/dist/features/federation/commands/pull.js.map +1 -0
- package/dist/features/federation/git-fetcher.d.ts +45 -0
- package/dist/features/federation/git-fetcher.d.ts.map +1 -0
- package/dist/features/federation/git-fetcher.js +70 -0
- package/dist/features/federation/git-fetcher.js.map +1 -0
- package/dist/features/federation/loader.d.ts +60 -0
- package/dist/features/federation/loader.d.ts.map +1 -0
- package/dist/features/federation/loader.js +193 -0
- package/dist/features/federation/loader.js.map +1 -0
- package/dist/features/federation/lock.d.ts +12 -0
- package/dist/features/federation/lock.d.ts.map +1 -0
- package/dist/features/federation/lock.js +48 -0
- package/dist/features/federation/lock.js.map +1 -0
- package/dist/features/federation/tests/git-fetcher.test.d.ts +2 -0
- package/dist/features/federation/tests/git-fetcher.test.d.ts.map +1 -0
- package/dist/features/federation/tests/git-fetcher.test.js +167 -0
- package/dist/features/federation/tests/git-fetcher.test.js.map +1 -0
- package/dist/features/federation/tests/loader.test.d.ts +2 -0
- package/dist/features/federation/tests/loader.test.d.ts.map +1 -0
- package/dist/features/federation/tests/loader.test.js +144 -0
- package/dist/features/federation/tests/loader.test.js.map +1 -0
- package/dist/features/federation/tests/phase5.test.d.ts +2 -0
- package/dist/features/federation/tests/phase5.test.d.ts.map +1 -0
- package/dist/features/federation/tests/phase5.test.js +137 -0
- package/dist/features/federation/tests/phase5.test.js.map +1 -0
- package/dist/features/federation/tests/schema-load.test.d.ts +2 -0
- package/dist/features/federation/tests/schema-load.test.d.ts.map +1 -0
- package/dist/features/federation/tests/schema-load.test.js +97 -0
- package/dist/features/federation/tests/schema-load.test.js.map +1 -0
- package/dist/features/federation/tests/validator.test.d.ts +2 -0
- package/dist/features/federation/tests/validator.test.d.ts.map +1 -0
- package/dist/features/federation/tests/validator.test.js +319 -0
- package/dist/features/federation/tests/validator.test.js.map +1 -0
- package/dist/features/mcp/commands/serve.d.ts +10 -0
- package/dist/features/mcp/commands/serve.d.ts.map +1 -0
- package/dist/features/mcp/commands/serve.js +12 -0
- package/dist/features/mcp/commands/serve.js.map +1 -0
- package/dist/features/mcp/server.d.ts +15 -0
- package/dist/features/mcp/server.d.ts.map +1 -0
- package/dist/features/mcp/server.js +438 -0
- package/dist/features/mcp/server.js.map +1 -0
- package/dist/features/pipeline/commands/validate.d.ts.map +1 -1
- package/dist/features/pipeline/commands/validate.js +7 -0
- package/dist/features/pipeline/commands/validate.js.map +1 -1
- package/dist/features/pipeline/indexer.d.ts +28 -2
- package/dist/features/pipeline/indexer.d.ts.map +1 -1
- package/dist/features/pipeline/indexer.js +84 -29
- package/dist/features/pipeline/indexer.js.map +1 -1
- package/dist/features/pipeline/validator.d.ts +10 -0
- package/dist/features/pipeline/validator.d.ts.map +1 -1
- package/dist/features/pipeline/validator.js +274 -27
- package/dist/features/pipeline/validator.js.map +1 -1
- package/dist/features/query/commands/list.d.ts +10 -0
- package/dist/features/query/commands/list.d.ts.map +1 -1
- package/dist/features/query/commands/list.js +1 -1
- package/dist/features/query/commands/list.js.map +1 -1
- package/dist/features/query/commands/locate.d.ts +1 -0
- package/dist/features/query/commands/locate.d.ts.map +1 -1
- package/dist/features/query/commands/locate.js +1 -1
- package/dist/features/query/commands/locate.js.map +1 -1
- package/dist/features/query/commands/search.d.ts.map +1 -1
- package/dist/features/query/commands/search.js +2 -0
- package/dist/features/query/commands/search.js.map +1 -1
- package/dist/features/query/commands/show.d.ts +15 -0
- package/dist/features/query/commands/show.d.ts.map +1 -1
- package/dist/features/query/commands/show.js +116 -58
- package/dist/features/query/commands/show.js.map +1 -1
- package/dist/features/query/commands/story.d.ts +70 -0
- package/dist/features/query/commands/story.d.ts.map +1 -1
- package/dist/features/query/commands/story.js +3 -2
- package/dist/features/query/commands/story.js.map +1 -1
- package/dist/features/query/commands/summary.d.ts +3 -0
- package/dist/features/query/commands/summary.d.ts.map +1 -1
- package/dist/features/query/commands/summary.js +1 -1
- package/dist/features/query/commands/summary.js.map +1 -1
- package/dist/features/query/searcher.d.ts +18 -1
- package/dist/features/query/searcher.d.ts.map +1 -1
- package/dist/features/query/searcher.js +11 -2
- package/dist/features/query/searcher.js.map +1 -1
- package/dist/features/scaffold/commands/service-init.d.ts +12 -0
- package/dist/features/scaffold/commands/service-init.d.ts.map +1 -0
- package/dist/features/scaffold/commands/service-init.js +69 -0
- package/dist/features/scaffold/commands/service-init.js.map +1 -0
- package/dist/shared/graph.d.ts +8 -0
- package/dist/shared/graph.d.ts.map +1 -1
- package/dist/shared/graph.js +180 -112
- package/dist/shared/graph.js.map +1 -1
- package/dist/shared/index.d.ts +4 -1
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +6 -1
- package/dist/shared/index.js.map +1 -1
- package/dist/shared/loader.d.ts +22 -0
- package/dist/shared/loader.d.ts.map +1 -1
- package/dist/shared/loader.js +31 -1
- package/dist/shared/loader.js.map +1 -1
- package/dist/shared/paths.d.ts +59 -7
- package/dist/shared/paths.d.ts.map +1 -1
- package/dist/shared/paths.js +93 -11
- package/dist/shared/paths.js.map +1 -1
- package/dist/shared/refs.d.ts +96 -0
- package/dist/shared/refs.d.ts.map +1 -0
- package/dist/shared/refs.js +182 -0
- package/dist/shared/refs.js.map +1 -0
- package/dist/shared/service-id.d.ts +11 -0
- package/dist/shared/service-id.d.ts.map +1 -0
- package/dist/shared/service-id.js +64 -0
- package/dist/shared/service-id.js.map +1 -0
- package/dist/shared/tests/paths.test.d.ts +2 -0
- package/dist/shared/tests/paths.test.d.ts.map +1 -0
- package/dist/shared/tests/paths.test.js +111 -0
- package/dist/shared/tests/paths.test.js.map +1 -0
- package/dist/shared/tests/refs.test.d.ts +2 -0
- package/dist/shared/tests/refs.test.d.ts.map +1 -0
- package/dist/shared/tests/refs.test.js +104 -0
- package/dist/shared/tests/refs.test.js.map +1 -0
- package/dist/shared/types/domain.d.ts +20 -0
- package/dist/shared/types/domain.d.ts.map +1 -1
- package/dist/shared/types/federation.d.ts +60 -0
- package/dist/shared/types/federation.d.ts.map +1 -0
- package/dist/shared/types/federation.js +12 -0
- package/dist/shared/types/federation.js.map +1 -0
- package/package.json +6 -3
- package/tools/dkk/claude/agents/dkk-domain-reviewer.md +69 -0
- package/tools/dkk/claude/commands/dkk-adr.md +11 -0
- package/tools/dkk/claude/commands/dkk-impact.md +34 -0
- package/tools/dkk/claude/commands/dkk-implement.md +12 -0
- package/tools/dkk/claude/commands/dkk-prime.md +6 -0
- package/tools/dkk/claude/commands/dkk-review.md +12 -0
- package/tools/dkk/claude/commands/dkk-story.md +12 -0
- package/tools/dkk/claude/hooks/post-edit-validate.mjs +51 -0
- package/tools/dkk/claude/hooks/pre-edit-block-generated.mjs +39 -0
- package/tools/dkk/claude/hooks/session-start-prime.mjs +33 -0
- package/tools/dkk/claude/hooks/stop-validate.mjs +48 -0
- package/tools/dkk/claude/settings.json +62 -0
- package/tools/dkk/claude/skills/dkk-adr-author/SKILL.md +54 -0
- package/tools/dkk/claude/skills/dkk-flow-implementer/SKILL.md +51 -0
- package/tools/dkk/claude/skills/dkk-story-analyst/SKILL.md +108 -0
- package/tools/dkk/schema/actors.schema.json +11 -1
- package/tools/dkk/schema/adr-frontmatter.schema.json +4 -4
- package/tools/dkk/schema/aggregate.schema.json +1 -1
- package/tools/dkk/schema/command.schema.json +1 -1
- package/tools/dkk/schema/event.schema.json +1 -1
- package/tools/dkk/schema/federation.schema.json +71 -0
- package/tools/dkk/schema/glossary.schema.json +1 -1
- package/tools/dkk/schema/index.schema.json +2 -2
- package/tools/dkk/schema/policy.schema.json +1 -1
- package/tools/dkk/schema/read-model.schema.json +15 -1
- package/tools/dkk/schema/service.schema.json +30 -0
- package/.github/skills/domain-knowledge/skill.md +0 -93
|
@@ -1,11 +1,14 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: flow-implementer
|
|
3
|
-
description: Portable Agent Skill for guiding developers through framework-agnostic implementation of a flow based on a Domain Knowledge Pack.
|
|
2
|
+
name: dkk-flow-implementer
|
|
3
|
+
description: Portable Agent Skill for guiding developers through framework-agnostic implementation of a flow based directly on a local Domain Knowledge Pack (not external issue trackers).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Flow Implementer Skill
|
|
7
7
|
|
|
8
|
-
> Portable Agent Skill for guiding developers through framework-agnostic implementation of a flow based on a Domain Knowledge Pack.
|
|
8
|
+
> Portable Agent Skill for guiding developers through framework-agnostic implementation of a flow based entirely on a local Domain Knowledge Pack (DKK).
|
|
9
|
+
>
|
|
10
|
+
> **CRITICAL INSTRUCTION FOR AI AGENTS:**
|
|
11
|
+
> Do NOT look for, query, or mention any external issue/ticket management tools (like Jira, GitHub Issues, Linear, Trello, etc.) for requirements. Follow the flow definitions and rules sourced strictly from the local `dkk` CLI tool. All "requirements" and "flows" are documented via the local Domain Knowledge Kit.
|
|
9
12
|
|
|
10
13
|
## Description
|
|
11
14
|
|
|
@@ -23,16 +26,22 @@ dkk story <flow-id> --json # Machine-readable output for agents
|
|
|
23
26
|
When asked to implement, build, or code a flow/feature:
|
|
24
27
|
|
|
25
28
|
1. **Identify the flow** — Ask the user for the relevant flow ID if not provided, or search for it: \`dkk list --type flow\`.
|
|
26
|
-
2. **Retrieve full context** — Run \`dkk story <flow-id>\` or \`dkk story <flow-id> --json\` to obtain domain rules.
|
|
27
|
-
3. **
|
|
28
|
-
|
|
29
|
+
2. **Retrieve full context from DKK** — Run \`dkk story <flow-id>\` or \`dkk story <flow-id> --json\` to obtain domain rules and requirements locally. Do NOT request external tickets.
|
|
30
|
+
3. **Clarify scope** — Use \`askQuestions\` to ask **1–7 clarifying questions** before proceeding. Derive each question, its options, and your recommended default from the DKK output, the project's existing codebase conventions, and any prior ADR decisions — do not use a fixed set. Each question must offer concrete options with one marked as recommended. Skip entirely for trivial flows (≤2 steps, no cross-context effects, no ambiguity). Questions should target **implementation behavior and UX details**, e.g.:
|
|
31
|
+
- What should the user see/experience immediately after this command succeeds?
|
|
32
|
+
- How should validation errors surface to the user (inline, toast, page-level)?
|
|
33
|
+
- Should this action be optimistic (instant UI update) or wait for confirmation?
|
|
34
|
+
- Are there concurrency scenarios — can two users trigger this simultaneously?
|
|
35
|
+
- Should the flow include an undo/cancel path, or is it one-way?
|
|
36
|
+
4. **Present Architectural Constraints** — Before any implementation begins, output the ADRs (Architecture Decision Records) from the local DKK context. Ask the user to acknowledge these constraints before proceeding.
|
|
37
|
+
5. **Generate Implementation Checklist** — Create a logical, framework-agnostic checklist of work needed. Typical buckets include:
|
|
29
38
|
- **Domain/Aggregates**: Entities, state transitions, and invariants to model.
|
|
30
39
|
- **Commands/Controllers**: Handlers for incoming commands, preconditions, and validations.
|
|
31
40
|
- **Events**: Domain events to be explicitly published upon successful command validation.
|
|
32
41
|
- **Policies**: Side-effects and reactive logic that triggers when events occur.
|
|
33
42
|
- **Read Models**: Projections that need to be updated in response to events.
|
|
34
|
-
|
|
35
|
-
|
|
43
|
+
6. **Interactive Step-by-step Delivery** — Ask the user which checklist item they want to tackle first. Guide them through the logic without writing framework-specific boilerplate initially (unless explicitly requested by the user's overarching project instructions). Keep guidance focused on the domain logic, invariants, and policies defined in the \`dkk story\` output.
|
|
44
|
+
7. **Noun Enforcement (MANDATORY)** — You MUST use the exact terminology defined in the DKK output. Do not invent new names for entities, commands, or events.
|
|
36
45
|
|
|
37
46
|
## Interaction Rules
|
|
38
47
|
- Do NOT generate full boilerplate application code initially. Wait for the user to request code generation for a specific checklist item.
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: story-analyst
|
|
3
|
-
description: Portable Agent Skill for generating, splitting, and reshaping user stories
|
|
2
|
+
name: dkk-story-analyst
|
|
3
|
+
description: Portable Agent Skill for generating, splitting, and reshaping user stories based entirely on the local Domain Knowledge Pack (not external issue trackers).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Story Analyst Skill
|
|
7
7
|
|
|
8
|
-
> Portable Agent Skill for generating, splitting, and reshaping user stories from a Domain Knowledge Pack.
|
|
8
|
+
> Portable Agent Skill for generating, splitting, and reshaping user stories and epics directly from a local Domain Knowledge Pack (DKK).
|
|
9
|
+
>
|
|
10
|
+
> **CRITICAL INSTRUCTION FOR AI AGENTS:**
|
|
11
|
+
> Do NOT look for, query, or mention any external issue/ticket management tools (like Jira, GitHub Issues, Linear, Trello, etc.). In this context, "User Stories" and "Epics" refer exclusively to behavioral requirements derived from Domain-Driven Design (DDD) and Event Storming models stored locally in YAML format. Your source of truth is ALWAYS the local `dkk` CLI tool.
|
|
9
12
|
|
|
10
13
|
## Description
|
|
11
14
|
|
|
12
|
-
This skill enables an AI agent to generate accurate, domain-grounded user stories, epics, and acceptance criteria by leveraging the structured domain model managed by DKK. It uses the `dkk story` command to aggregate a flow's complete context in a single call, then maps that context onto standard Agile story formats.
|
|
15
|
+
This skill enables an AI agent to generate accurate, domain-grounded user stories, epics, and acceptance criteria by leveraging the structured domain model managed by DKK. It uses the `dkk story` command to aggregate a flow's complete context in a single call, then maps that context onto standard Agile story formats based purely on the domain model.
|
|
13
16
|
|
|
14
17
|
## Primary Command
|
|
15
18
|
|
|
@@ -25,16 +28,22 @@ Accepts both `flow.Name` and bare `Name` (auto-prefixes `flow.`).
|
|
|
25
28
|
When asked to write, draft, or generate a user story:
|
|
26
29
|
|
|
27
30
|
1. **Identify the flow** — Ask the user for the relevant flow ID, or search for it: `dkk list --type flow`. If the user provides a feature name, run `dkk search "<feature>"` to locate the matching flow or command.
|
|
28
|
-
2. **Retrieve full context** — Run `dkk story <flow-id>`. This returns actors, ordered steps, triggered policies, BDD examples, ADRs, and downstream effects in one call.
|
|
29
|
-
3. **
|
|
31
|
+
2. **Retrieve full context** — Run `dkk story <flow-id>`. This returns actors, ordered steps, triggered policies, BDD examples, ADRs, and downstream effects in one call from the local domain model.
|
|
32
|
+
3. **Clarify scope** — Use `askQuestions` to ask **1–7 clarifying questions** before drafting. Derive each question, its options, and your recommended default from the actual DKK output and the project's conventions — do not use a fixed set. Each question must offer concrete options with one marked as recommended. Skip entirely for trivial flows (≤2 steps, 1 actor, no ambiguity). Questions should target **product behavior and story scope**, e.g.:
|
|
33
|
+
- Which user-facing outcome matters most for this story?
|
|
34
|
+
- Should the user receive confirmation/feedback after this action, and how?
|
|
35
|
+
- When a step fails or is rejected, what should the user experience?
|
|
36
|
+
- Are there optional steps the user can skip, or is the flow strictly linear?
|
|
37
|
+
- Should this story cover the happy path only, or include edge cases?
|
|
38
|
+
4. **Map to story format** using the output:
|
|
30
39
|
- **As a** `[Actor from "Actors" section]`
|
|
31
40
|
- **I want to** `[Command description from Steps]`
|
|
32
41
|
- **So that** `[Flow description]`
|
|
33
|
-
|
|
42
|
+
5. **Write acceptance criteria** from the "Policies" and "BDD Examples" sections:
|
|
34
43
|
- Policies provide the **Given/When/Then** structure: When [triggering event] → Then [consequent command]
|
|
35
44
|
- BDD Examples from commands and events are pre-written scenarios — use them directly or expand them
|
|
36
|
-
|
|
37
|
-
|
|
45
|
+
6. **Add an Architectural Constraints section** listing all ADRs from the output. Developers must respect these when implementing the story.
|
|
46
|
+
7. **Add an Implementation Notes section** from "Downstream Effects": read models that must be updated, secondary policies that will fire.
|
|
38
47
|
|
|
39
48
|
## Noun Enforcement (MANDATORY)
|
|
40
49
|
|
|
@@ -42,12 +51,13 @@ Only use terminology present in the `dkk story` output. Never:
|
|
|
42
51
|
- Invent entity names, command names, or event names not in the output
|
|
43
52
|
- Rename domain terms (if DKK says `OrderBasket`, the story must not say `ShoppingCart`)
|
|
44
53
|
- Reference bounded contexts not mentioned in the step refs
|
|
54
|
+
- Pull context from external APIs or issue trackers.
|
|
45
55
|
|
|
46
56
|
If you are uncertain whether a term is canonical, run `dkk search "<term>"` to verify.
|
|
47
57
|
|
|
48
|
-
## Epic vs. Story Decision Rules
|
|
58
|
+
## Epic vs. Story Decision Rules (Domain Level)
|
|
49
59
|
|
|
50
|
-
After retrieving the flow context, apply these rules:
|
|
60
|
+
After retrieving the flow context from DKK, apply these rules:
|
|
51
61
|
|
|
52
62
|
- **Single story:** Flow has ≤3 command steps and spans ≤1 bounded context.
|
|
53
63
|
- **Epic with story slices:** Flow has >3 command steps OR spans >1 bounded context. Slice by:
|
|
@@ -55,14 +65,14 @@ After retrieving the flow context, apply these rules:
|
|
|
55
65
|
2. Each policy trigger becomes an explicit story ("As a system, when X happens, I want Y to be triggered, so that Z")
|
|
56
66
|
3. Each slice that produces an event consumed by a read model must explicitly include updating that read model in its scope or acceptance criteria
|
|
57
67
|
|
|
58
|
-
When recommending an epic breakdown, present the slice boundaries and explain which downstream effects belong to each slice.
|
|
68
|
+
When recommending an epic breakdown, present the slice boundaries and explain which downstream effects belong to each slice based on the DKK model.
|
|
59
69
|
|
|
60
70
|
## Story Reshaping Workflow
|
|
61
71
|
|
|
62
72
|
When asked to refine, split, or revise an existing story:
|
|
63
73
|
|
|
64
74
|
1. Run `dkk story <flow-id>` for the relevant flow to get the current domain truth
|
|
65
|
-
2. Compare the
|
|
75
|
+
2. Compare the text's entities and terminology against the local DKK output
|
|
66
76
|
3. Flag any mismatches: invented terms, missing actors, acceptance criteria that contradict policies
|
|
67
77
|
4. Suggest corrections using exact DKK terminology
|
|
68
78
|
5. Ensure the reshaped story still covers all downstream effects (read models, secondary policies)
|
package/README.md
CHANGED
|
@@ -24,6 +24,10 @@ Architectural decisions aren't born in a vacuum. Understanding *why* a choice wa
|
|
|
24
24
|
|
|
25
25
|
Knowledge that lives next to the code is knowledge that gets used. DKK colocates your domain model, ADRs, and generated docs inside the repository itself. AI agents can discover, query, and traverse this knowledge without leaving the codebase — making every interaction domain-aware.
|
|
26
26
|
|
|
27
|
+
### One domain model can span many repositories
|
|
28
|
+
|
|
29
|
+
In enterprise architectures each service lives in its own repo, but the domain it participates in does not. DKK supports **multi-repo federation**: a repo declares itself a service with `.dkk/service.yml`, lists peer services in `.dkk/federation.yml` (by filesystem path or git URL + branch), and the loader transparently merges peer domain models into the local one. Cross-service references use the additive grammar `<service>:<context>.<Item>` — bare refs stay local-only. No CI required, no publish step, no orphan branches: a peer's raw `.dkk/` directory is the artifact. The AI assistant in any repo can answer "what does `ordering:OrderPlaced` contain, and who else consumes it?" without leaving the current working directory.
|
|
30
|
+
|
|
27
31
|
---
|
|
28
32
|
|
|
29
33
|
## Documentation
|
|
@@ -38,6 +42,7 @@ All technical details, CLI references, and integration guides live in the [`docs
|
|
|
38
42
|
| **[ADR Guide](docs/adr-guide.md)** | Writing, linking, and querying ADRs |
|
|
39
43
|
| **[AI Agent Integration](docs/ai-agent-integration.md)** | Onboarding agents, context-efficient retrieval |
|
|
40
44
|
| **[Way of Working](docs/way-of-working.md)** | Team adoption practices, PR review, CI, governance |
|
|
45
|
+
| **[Iterative Modeling](docs/iterative-modeling.md)** | Decision patterns, modeling phases, external constraints |
|
|
41
46
|
|
|
42
47
|
## License
|
|
43
48
|
|
package/dist/cli.js
CHANGED
|
@@ -16,10 +16,17 @@ import { registerNewDomain } from "./features/scaffold/commands/new-domain.js";
|
|
|
16
16
|
import { registerNewContext } from "./features/scaffold/commands/new-context.js";
|
|
17
17
|
import { registerNewAdr } from "./features/scaffold/commands/new-adr.js";
|
|
18
18
|
import { registerAddItem } from "./features/scaffold/commands/add-item.js";
|
|
19
|
+
import { registerServiceInit } from "./features/scaffold/commands/service-init.js";
|
|
20
|
+
import { registerPeersAdd } from "./features/federation/commands/peers-add.js";
|
|
21
|
+
import { registerPeersList } from "./features/federation/commands/peers-list.js";
|
|
22
|
+
import { registerPeersStatus } from "./features/federation/commands/peers-status.js";
|
|
23
|
+
import { registerPull } from "./features/federation/commands/pull.js";
|
|
24
|
+
import { registerConsumers } from "./features/federation/commands/consumers.js";
|
|
19
25
|
import { registerRename } from "./features/refactor/commands/rename.js";
|
|
20
26
|
import { registerRm } from "./features/refactor/commands/rm.js";
|
|
21
27
|
import { registerMove } from "./features/refactor/commands/move.js";
|
|
22
28
|
import { registerStats } from "./features/audit/commands/stats.js";
|
|
29
|
+
import { registerMcp } from "./features/mcp/commands/serve.js";
|
|
23
30
|
import { formatCliError } from "./shared/errors.js";
|
|
24
31
|
/** Whether to show full stack traces (set DEBUG=1 in env). */
|
|
25
32
|
const DEBUG = Boolean(process.env.DEBUG);
|
|
@@ -55,6 +62,7 @@ registerRename(program);
|
|
|
55
62
|
registerRm(program);
|
|
56
63
|
registerMove(program);
|
|
57
64
|
registerStats(program);
|
|
65
|
+
registerMcp(program);
|
|
58
66
|
// "new" sub-command group
|
|
59
67
|
const newCmd = program
|
|
60
68
|
.command("new")
|
|
@@ -64,6 +72,18 @@ registerNewContext(newCmd);
|
|
|
64
72
|
registerNewAdr(newCmd);
|
|
65
73
|
// Top-level "add" command for individual domain items
|
|
66
74
|
registerAddItem(program);
|
|
75
|
+
// Federation: service identity
|
|
76
|
+
registerServiceInit(program);
|
|
77
|
+
// Federation: peer management
|
|
78
|
+
const peersCmd = program
|
|
79
|
+
.command("peers")
|
|
80
|
+
.description("Federation peer management");
|
|
81
|
+
registerPeersAdd(peersCmd);
|
|
82
|
+
registerPeersList(peersCmd);
|
|
83
|
+
registerPeersStatus(peersCmd);
|
|
84
|
+
// Federation: dkk pull + dkk consumers
|
|
85
|
+
registerPull(program);
|
|
86
|
+
registerConsumers(program);
|
|
67
87
|
// ── Agent mode injection ─────────────────────────────────────────────
|
|
68
88
|
program.option("--agent", "Enable agent mode (JSON + minify by default)");
|
|
69
89
|
// Add --no-json to commands that have --json
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,sCAAsC,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,qCAAqC,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,gBAAgB,EAAE,MAAM,0CAA0C,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,6CAA6C,CAAC;AACjF,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,0CAA0C,CAAC;AAC3E,OAAO,EAAE,cAAc,EAAE,MAAM,wCAAwC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,oCAAoC,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AACpE,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,8DAA8D;AAC9D,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;AAEzC,yEAAyE;AAEzE,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,KAAK,CAAC;KACX,WAAW,CAAC,0BAA0B,CAAC;KACvC,OAAO,CAAC,OAAO,CAAC;KAChB,aAAa,CAAC,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC;KACjC,WAAW,CACV,OAAO,EACP;;;;;;;CAOH,CACE,CAAC;AAEJ,qBAAqB;AACrB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,eAAe,CAAC,OAAO,CAAC,CAAC;AACzB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,gBAAgB,CAAC,OAAO,CAAC,CAAC;AAC1B,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,UAAU,CAAC,OAAO,CAAC,CAAC;AACpB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/features/agent/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../../src/features/agent/commands/init.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,WAAW,CAAC;AA+RhD,sCAAsC;AACtC,wBAAgB,YAAY,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CA6C/C"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync } from "node:fs";
|
|
1
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync, readdirSync, statSync, chmodSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
|
-
import { repoRoot, packageSkillsDir } from "../../../shared/paths.js";
|
|
3
|
+
import { repoRoot, packageSkillsDir, packageClaudeDir } from "../../../shared/paths.js";
|
|
4
4
|
const START_MARKER = "<!-- dkk:start -->";
|
|
5
5
|
const END_MARKER = "<!-- dkk:end -->";
|
|
6
6
|
/**
|
|
@@ -62,7 +62,10 @@ dkk stats # Domain statistics + orphaned items
|
|
|
62
62
|
|
|
63
63
|
# Agent
|
|
64
64
|
dkk init # Create/update AGENTS.md with DKK section
|
|
65
|
+
dkk init --claude # Also scaffold .claude/ (settings, hooks, skills, agents, commands)
|
|
66
|
+
dkk init --skills # Also install agent skills into .github/skills/
|
|
65
67
|
dkk prime # Output full agent context
|
|
68
|
+
dkk mcp # Run the DKK MCP server (stdio) for Claude Code etc.
|
|
66
69
|
\`\`\`
|
|
67
70
|
|
|
68
71
|
### Quality Gates
|
|
@@ -118,13 +121,145 @@ function installSkills(root, force) {
|
|
|
118
121
|
}
|
|
119
122
|
}
|
|
120
123
|
}
|
|
124
|
+
/**
|
|
125
|
+
* Copy every file in `srcDir` (one level deep) into `destDir`. Skips files
|
|
126
|
+
* that already exist unless `force` is true. Reports each file with a
|
|
127
|
+
* `.claude/<relSubpath>/<filename>` label.
|
|
128
|
+
*
|
|
129
|
+
* If `executable` is true, sets 0o755 on each copied file (used for hook
|
|
130
|
+
* scripts).
|
|
131
|
+
*/
|
|
132
|
+
function copyFlatDir(opts) {
|
|
133
|
+
const { srcDir, destDir, relSubpath, force, executable } = opts;
|
|
134
|
+
if (!existsSync(srcDir))
|
|
135
|
+
return;
|
|
136
|
+
mkdirSync(destDir, { recursive: true });
|
|
137
|
+
for (const fileName of readdirSync(srcDir)) {
|
|
138
|
+
const srcFile = join(srcDir, fileName);
|
|
139
|
+
if (!statSync(srcFile).isFile())
|
|
140
|
+
continue;
|
|
141
|
+
const destFile = join(destDir, fileName);
|
|
142
|
+
const relPath = `${relSubpath}/${fileName}`;
|
|
143
|
+
if (existsSync(destFile) && !force) {
|
|
144
|
+
console.log(`Skipped ${relPath} (already exists — use --force to overwrite)`);
|
|
145
|
+
continue;
|
|
146
|
+
}
|
|
147
|
+
const alreadyExisted = existsSync(destFile);
|
|
148
|
+
writeFileSync(destFile, readFileSync(srcFile, "utf-8"), "utf-8");
|
|
149
|
+
if (executable) {
|
|
150
|
+
try {
|
|
151
|
+
chmodSync(destFile, 0o755);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Non-POSIX filesystems may reject chmod — safe to ignore.
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
console.log(`${alreadyExisted ? "Updated" : "Created"} ${relPath}`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Copy a directory of skill subdirectories. Layout is `<srcDir>/<skill>/<file>`,
|
|
162
|
+
* mirrored under `<destDir>/<skill>/<file>`. Skips files that already exist
|
|
163
|
+
* unless `force` is true.
|
|
164
|
+
*/
|
|
165
|
+
function copyNestedDir(opts) {
|
|
166
|
+
const { srcDir, destDir, relSubpath, force } = opts;
|
|
167
|
+
if (!existsSync(srcDir))
|
|
168
|
+
return;
|
|
169
|
+
for (const subName of readdirSync(srcDir)) {
|
|
170
|
+
const subSrc = join(srcDir, subName);
|
|
171
|
+
if (!statSync(subSrc).isDirectory())
|
|
172
|
+
continue;
|
|
173
|
+
const subDest = join(destDir, subName);
|
|
174
|
+
mkdirSync(subDest, { recursive: true });
|
|
175
|
+
for (const fileName of readdirSync(subSrc)) {
|
|
176
|
+
const srcFile = join(subSrc, fileName);
|
|
177
|
+
if (!statSync(srcFile).isFile())
|
|
178
|
+
continue;
|
|
179
|
+
const destFile = join(subDest, fileName);
|
|
180
|
+
const relPath = `${relSubpath}/${subName}/${fileName}`;
|
|
181
|
+
if (existsSync(destFile) && !force) {
|
|
182
|
+
console.log(`Skipped ${relPath} (already exists — use --force to overwrite)`);
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
const alreadyExisted = existsSync(destFile);
|
|
186
|
+
writeFileSync(destFile, readFileSync(srcFile, "utf-8"), "utf-8");
|
|
187
|
+
console.log(`${alreadyExisted ? "Updated" : "Created"} ${relPath}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Copy the bundled Claude Code config (`settings.json`, hooks, skills,
|
|
193
|
+
* subagents, slash commands) from the DKK package into the consumer
|
|
194
|
+
* project's `.claude/` directory.
|
|
195
|
+
*
|
|
196
|
+
* Layout produced (all skip-if-present unless `--force`):
|
|
197
|
+
* .claude/
|
|
198
|
+
* settings.json
|
|
199
|
+
* hooks/<hook>.mjs (executable bit set)
|
|
200
|
+
* skills/<skill>/SKILL.md
|
|
201
|
+
* agents/<agent>.md
|
|
202
|
+
* commands/<command>.md
|
|
203
|
+
*/
|
|
204
|
+
function installClaudeConfig(root, force) {
|
|
205
|
+
const srcDir = packageClaudeDir();
|
|
206
|
+
const destDir = join(root, ".claude");
|
|
207
|
+
if (!existsSync(srcDir)) {
|
|
208
|
+
console.warn(`Warning: DKK package Claude template not found at ${srcDir}`);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
mkdirSync(destDir, { recursive: true });
|
|
212
|
+
// 1. settings.json
|
|
213
|
+
const settingsSrc = join(srcDir, "settings.json");
|
|
214
|
+
const settingsDest = join(destDir, "settings.json");
|
|
215
|
+
if (existsSync(settingsSrc)) {
|
|
216
|
+
if (existsSync(settingsDest) && !force) {
|
|
217
|
+
console.log(`Skipped .claude/settings.json (already exists — use --force to overwrite)`);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
const alreadyExisted = existsSync(settingsDest);
|
|
221
|
+
writeFileSync(settingsDest, readFileSync(settingsSrc, "utf-8"), "utf-8");
|
|
222
|
+
console.log(`${alreadyExisted ? "Updated" : "Created"} .claude/settings.json`);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// 2. hooks/ (flat, executable)
|
|
226
|
+
copyFlatDir({
|
|
227
|
+
srcDir: join(srcDir, "hooks"),
|
|
228
|
+
destDir: join(destDir, "hooks"),
|
|
229
|
+
relSubpath: ".claude/hooks",
|
|
230
|
+
force,
|
|
231
|
+
executable: true,
|
|
232
|
+
});
|
|
233
|
+
// 3. skills/<skill>/SKILL.md (nested)
|
|
234
|
+
copyNestedDir({
|
|
235
|
+
srcDir: join(srcDir, "skills"),
|
|
236
|
+
destDir: join(destDir, "skills"),
|
|
237
|
+
relSubpath: ".claude/skills",
|
|
238
|
+
force,
|
|
239
|
+
});
|
|
240
|
+
// 4. agents/<agent>.md (flat)
|
|
241
|
+
copyFlatDir({
|
|
242
|
+
srcDir: join(srcDir, "agents"),
|
|
243
|
+
destDir: join(destDir, "agents"),
|
|
244
|
+
relSubpath: ".claude/agents",
|
|
245
|
+
force,
|
|
246
|
+
});
|
|
247
|
+
// 5. commands/<command>.md (flat)
|
|
248
|
+
copyFlatDir({
|
|
249
|
+
srcDir: join(srcDir, "commands"),
|
|
250
|
+
destDir: join(destDir, "commands"),
|
|
251
|
+
relSubpath: ".claude/commands",
|
|
252
|
+
force,
|
|
253
|
+
});
|
|
254
|
+
}
|
|
121
255
|
/** Register the `init` subcommand. */
|
|
122
256
|
export function registerInit(program) {
|
|
123
257
|
program
|
|
124
258
|
.command("init")
|
|
125
259
|
.description("Create or update AGENTS.md with DKK onboarding section")
|
|
126
260
|
.option("--skills", "Also install DKK skill files into .github/skills/")
|
|
127
|
-
.option("--
|
|
261
|
+
.option("--claude", "Also install Claude Code config (.claude/ settings, hooks, skills, agents, commands)")
|
|
262
|
+
.option("--force", "Overwrite existing skill or Claude files (applies with --skills or --claude)")
|
|
128
263
|
.option("-r, --root <path>", "Override repository root")
|
|
129
264
|
.action((opts) => {
|
|
130
265
|
const root = repoRoot(opts.root);
|
|
@@ -157,6 +292,9 @@ export function registerInit(program) {
|
|
|
157
292
|
if (opts.skills) {
|
|
158
293
|
installSkills(root, opts.force ?? false);
|
|
159
294
|
}
|
|
295
|
+
if (opts.claude) {
|
|
296
|
+
installClaudeConfig(root, opts.force ?? false);
|
|
297
|
+
}
|
|
160
298
|
});
|
|
161
299
|
}
|
|
162
300
|
//# sourceMappingURL=init.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/features/agent/commands/init.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../../src/features/agent/commands/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,6 +10,17 @@
|
|
|
10
10
|
* CLI reference, and file conventions.
|
|
11
11
|
*/
|
|
12
12
|
import type { Command as Cmd } from "commander";
|
|
13
|
+
/**
|
|
14
|
+
* The full agent context document.
|
|
15
|
+
* Keep the CLI Command Reference tables in sync with the Quick Reference block in init.ts#dkkSection.
|
|
16
|
+
*/
|
|
17
|
+
export declare function primeContent(): string;
|
|
18
|
+
/**
|
|
19
|
+
* Build a dynamic "Current Domain Summary" section from the live domain
|
|
20
|
+
* model on disk. Returns the Markdown string to append after the static
|
|
21
|
+
* instructions.
|
|
22
|
+
*/
|
|
23
|
+
export declare function buildDomainSummary(root?: string): string;
|
|
13
24
|
/** Register the `prime` subcommand. */
|
|
14
25
|
export declare function registerPrime(program: Cmd): void;
|
|
15
26
|
//# sourceMappingURL=prime.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prime.d.ts","sourceRoot":"","sources":["../../../../src/features/agent/commands/prime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"prime.d.ts","sourceRoot":"","sources":["../../../../src/features/agent/commands/prime.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,OAAO,IAAI,GAAG,EAAE,MAAM,WAAW,CAAC;AAOhD;;;GAGG;AACH,wBAAgB,YAAY,IAAI,MAAM,CA6arC;AAID;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAiJxD;AAED,uCAAuC;AACvC,wBAAgB,aAAa,CAAC,OAAO,EAAE,GAAG,GAAG,IAAI,CAYhD"}
|