dna-cli 0.1.0__tar.gz → 0.3.0__tar.gz
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.
- {dna_cli-0.1.0 → dna_cli-0.3.0}/PKG-INFO +2 -2
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/__init__.py +2 -0
- dna_cli-0.3.0/dna_cli/data/onboarding-scope/AGENTS.md +68 -0
- dna_cli-0.3.0/dna_cli/data/onboarding-scope/skills/dna-sdlc-cli/SKILL.md +190 -0
- dna_cli-0.3.0/dna_cli/init_cmd.py +569 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/memory_cmd.py +22 -26
- {dna_cli-0.1.0 → dna_cli-0.3.0}/pyproject.toml +3 -3
- dna_cli-0.3.0/tests/test_init_cmd.py +474 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_memory_cmd.py +36 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/.gitignore +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/LICENSE +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/README.md +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_active_story.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_banner.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_ctx.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_git_symbiosis.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_github_bridge.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_methodology_gates.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/data/git-hooks/prepare-commit-msg +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/doc_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/docs_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/eval_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/hooks_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/install_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/issue_bridge_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/kind_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/pr_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/recall_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/research_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/scope_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/sdlc_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/source_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/testkit_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/conftest.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_changelog_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_doc_apply_bundle_entries.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_doc_apply_prompt_budget.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_docs_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_eval_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_focus_gates_cli.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_focus_gates_guards.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_git_symbiosis_hook.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_hooks_cli.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_install_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_install_github_real.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_issue_bridge_cli.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_issue_comment_cli.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_kaizen_event.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_kaizen_transitions.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_plan_from_file.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_produces_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_recall_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_research_cmd.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_scope_detect.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_sdlc_brief.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_sdlc_correctness.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_sdlc_ergonomics.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_sdlc_scope_default.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_sdlc_workitem_cli.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_source_url_resolution.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_spike_cli.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_check.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_commits_backref.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_done_guard.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_pr_cli.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_review_pr_guard.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_show.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_start_gate.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_tenant_write_note.py +0 -0
- {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_testkit_cmd.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dna-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: DNA command-line interface — the `dna` binary for the declarative SDLC + document CRUD (kernel-local, no service required)
|
|
5
5
|
Project-URL: Homepage, https://ruinosus.github.io/dna/
|
|
6
6
|
Project-URL: Repository, https://github.com/ruinosus/dna
|
|
@@ -16,7 +16,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.13
|
|
17
17
|
Requires-Python: <3.14,>=3.12
|
|
18
18
|
Requires-Dist: click>=8.1.0
|
|
19
|
-
Requires-Dist: dna-sdk<0.
|
|
19
|
+
Requires-Dist: dna-sdk<0.4,>=0.3
|
|
20
20
|
Requires-Dist: pyyaml>=6.0
|
|
21
21
|
Requires-Dist: rich>=13.0
|
|
22
22
|
Provides-Extra: dev
|
|
@@ -19,6 +19,7 @@ from dna_cli import (
|
|
|
19
19
|
doc_cmd,
|
|
20
20
|
docs_cmd,
|
|
21
21
|
eval_cmd,
|
|
22
|
+
init_cmd,
|
|
22
23
|
install_cmd,
|
|
23
24
|
kind_cmd,
|
|
24
25
|
memory_cmd,
|
|
@@ -79,6 +80,7 @@ from dna_cli import pr_cmd as _pr_cmd # noqa: E402,F401
|
|
|
79
80
|
# the GitHub Issues side of the symbiosis (bridge with provenance).
|
|
80
81
|
from dna_cli import issue_bridge_cmd as _issue_bridge_cmd # noqa: E402,F401
|
|
81
82
|
main.add_command(source_cmd.source)
|
|
83
|
+
main.add_command(init_cmd.init)
|
|
82
84
|
main.add_command(install_cmd.install)
|
|
83
85
|
main.add_command(eval_cmd.eval_)
|
|
84
86
|
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# AGENTS.md — how work is tracked in this project
|
|
2
|
+
|
|
3
|
+
This project uses [DNA](https://github.com/ruinosus/dna) (Domain Notation of
|
|
4
|
+
Anything) to track its own lifecycle: Stories, Features, Epics and Issues are
|
|
5
|
+
declarative YAML documents in the board scope under `.dna/`, written and
|
|
6
|
+
transitioned via the `dna sdlc` CLI. This file was materialized by `dna init`
|
|
7
|
+
and is itself a live `agents.md/v1` instance the DNA SDK parses and
|
|
8
|
+
round-trips byte-faithfully.
|
|
9
|
+
|
|
10
|
+
## SDLC protocol — work is tracked in-repo via `dna sdlc`
|
|
11
|
+
|
|
12
|
+
The flow is **story-first**: file the Story before the work, narrate while
|
|
13
|
+
building, verify before closing.
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
dna sdlc brief # session start — what's in flight
|
|
17
|
+
dna sdlc hooks install # one-time per clone — commit trailers
|
|
18
|
+
dna sdlc feature create f-my-area --title "..." --desc "..." # parent Feature
|
|
19
|
+
dna sdlc story create s-my-work --feature f-my-area --desc "..." \
|
|
20
|
+
--ac "Given/When/Then ..." --dod "code+tests+docs ..." # AC + DoD required
|
|
21
|
+
dna sdlc story start s-my-work --plan "plan of attack" # plan gate
|
|
22
|
+
dna sdlc story comment s-my-work --body "decided X because Y" # narrate as you go
|
|
23
|
+
dna sdlc test-guide create tg-my-work --verifies Story/s-my-work --step "run :: expect"
|
|
24
|
+
dna sdlc test-run record tg-my-work --outcome pass # test gate for done
|
|
25
|
+
dna sdlc story pr s-my-work # gh pr create, pre-filled FROM the story
|
|
26
|
+
dna sdlc story done s-my-work # only after the PR merges
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
While a story is active, every commit is stamped with `Work-Item:` +
|
|
30
|
+
`dna-sdlc[bot]` trailers by the versioned hook — that is the provenance
|
|
31
|
+
seal linking git history to the work item (`dna sdlc story commits s-x`).
|
|
32
|
+
|
|
33
|
+
## Conventions
|
|
34
|
+
|
|
35
|
+
- **Story-first.** Non-trivial work starts with `dna sdlc story create`
|
|
36
|
+
(AC + DoD are mandatory at create time) and `story start` (the plan
|
|
37
|
+
gate — substantial work gets a real plan via `--plan-file`, not a
|
|
38
|
+
one-liner).
|
|
39
|
+
- **Narrate as you go.** Status changes record *that* something happened,
|
|
40
|
+
not *what*. Post `dna sdlc story comment` for each meaningful step or
|
|
41
|
+
decision — the timeline is what stakeholders and future sessions read.
|
|
42
|
+
- **Gapless definition of done.** Never mark a story `done` with a gap:
|
|
43
|
+
finish to market standard, or keep it `in-progress` / decompose into
|
|
44
|
+
tracked child stories. `story done` requires a passing TestRun
|
|
45
|
+
(`--allow-no-tests` is for recorded exceptions only).
|
|
46
|
+
- **Review = open PR; done = merged.** `story review` expects an open PR
|
|
47
|
+
on the branch; a story in `review` with no PR is stale. Once a PR is
|
|
48
|
+
approved, stop pushing to its branch — further work goes to a new branch.
|
|
49
|
+
- **Surface IDs.** Print full slug IDs in backticks (`s-foo`, `i-012-bar`)
|
|
50
|
+
so they are paste-able into `dna sdlc story show` / `git log --grep`.
|
|
51
|
+
|
|
52
|
+
## Do not
|
|
53
|
+
|
|
54
|
+
- **Never hand-edit `.dna/**.yaml` for status changes** — the CLI is the
|
|
55
|
+
canonical write path (validation, timeline and journey events fire there).
|
|
56
|
+
- **Never do non-trivial work without an active story** — unstamped commits
|
|
57
|
+
are invisible to `story commits` / `story show`; absence is signal.
|
|
58
|
+
- **Never mark a story `done` with a gap** — finish to market standard or
|
|
59
|
+
keep it `in-progress` / decompose into tracked child stories.
|
|
60
|
+
|
|
61
|
+
## Learn more
|
|
62
|
+
|
|
63
|
+
- Skill: the `dna-sdlc-cli` skill (agentskills.io SKILL.md format) is
|
|
64
|
+
materialized by `dna init` into your agent tool's skills directory —
|
|
65
|
+
`.claude/skills/`, `.github/skills/`, `.cursor/skills/` or
|
|
66
|
+
`.opencode/skills/` — with the full workflow. Same content everywhere.
|
|
67
|
+
- Docs: <https://ruinosus.github.io/dna/> — CLI reference, Kinds guide,
|
|
68
|
+
SDLC guide ("Your git log is your SDLC").
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dna-sdlc-cli
|
|
3
|
+
description: "Use whenever work in this project needs SDLC tracking (Epic, Feature, Story, Issue, Spec, Plan, Spike, TestGuide/TestRun), or the user asks to file/start/narrate/close lifecycle docs, open a story PR, or wire the git hooks. Operate via the `dna sdlc` CLI \u2014 never edit `.dna/` YAMLs by hand for status changes; the CLI is the canonical write path (validation, timeline events and the derived journey fire correctly)."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DNA SDLC CLI — the work tracker for this project
|
|
7
|
+
|
|
8
|
+
This project tracks its own lifecycle as DNA documents: Stories, Features,
|
|
9
|
+
Epics and Issues are first-class YAML documents in the board scope under
|
|
10
|
+
`.dna/` (the CLI's default source `./.dna` — run `dna` from the project
|
|
11
|
+
root, no env var needed; the sole board scope is auto-detected, or set
|
|
12
|
+
`DNA_SDLC_SCOPE`). Don't manually edit those YAMLs when changing status —
|
|
13
|
+
the CLI is the canonical write path.
|
|
14
|
+
|
|
15
|
+
## ⚖️ Maxim — zero gaps (the supreme rule)
|
|
16
|
+
|
|
17
|
+
**Never ship an activity with a gap.** Every Story/Feature/Epic/Issue is
|
|
18
|
+
either finished to market standard with no gaps, or it **stays
|
|
19
|
+
`in-progress`** until it is. There is no "ship with a TODO for later"
|
|
20
|
+
without a tracked Story covering it.
|
|
21
|
+
|
|
22
|
+
Before `story done`, the work must satisfy its own AC + DoD — close them
|
|
23
|
+
granularly with evidence:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
dna sdlc story check s-foo --ac 1 --dod "tests" --evidence "PR #42"
|
|
27
|
+
dna sdlc story check s-foo --all --evidence "commit abc123 + CI green"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
When a gap appears mid-story:
|
|
31
|
+
|
|
32
|
+
1. **Small + adjacent** (lint fix, doc tweak): include in the same Story.
|
|
33
|
+
2. **Medium + orthogonal**: file a follow-up Story; current one goes
|
|
34
|
+
`dna sdlc story block s-foo --reason "waiting on s-foo-followup"`.
|
|
35
|
+
3. **Large + systemic**: file a Feature; the Story stays blocked until its
|
|
36
|
+
first covering Story ships.
|
|
37
|
+
|
|
38
|
+
## Vocabulary
|
|
39
|
+
|
|
40
|
+
| Kind | Equivalent | Slug prefix | Verb group |
|
|
41
|
+
|------|------------|-------------|------------|
|
|
42
|
+
| Initiative / Roadmap | Initiative | free-form | `initiative` |
|
|
43
|
+
| Epic | Epic | `e-...` | `epic` |
|
|
44
|
+
| Feature | Feature | `f-...` | `feature` |
|
|
45
|
+
| Story | User Story | `s-...` | `story` |
|
|
46
|
+
| Issue | Bug/Task/Question | `i-NNN-...` (auto-numbered) | `issue` |
|
|
47
|
+
| Spec / Plan | RFC / implementation plan | free-form | `spec` / `plan` |
|
|
48
|
+
| Spike | time-boxed investigation | `sp-...` | `spike` |
|
|
49
|
+
| TestGuide / TestRun | test script / execution record | `tg-...` / `tr-...` | `test-guide` / `test-run` |
|
|
50
|
+
|
|
51
|
+
Story statuses: `needs-triage | todo | in-progress | review | done | blocked
|
|
52
|
+
| deferred | cancelled`. Issue arc: `file → triage → start → resolve`.
|
|
53
|
+
|
|
54
|
+
**Command shape:** *listing* is `dna sdlc list <Kind>` (capital-K:
|
|
55
|
+
`list Story --status in-progress`, `list Issue`); *acting on one doc* is
|
|
56
|
+
`dna sdlc <noun> <verb> <name>` (`story start`, `issue resolve`,
|
|
57
|
+
`feature`/`epic` verbs via their groups). There is no `story list`. When
|
|
58
|
+
unsure: `dna sdlc <noun> --help`.
|
|
59
|
+
|
|
60
|
+
## Session start
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
dna sdlc brief # one-screen bootstrap: in-flight work, spikes, lessons, hot issues
|
|
64
|
+
dna sdlc current # every doc currently in-progress
|
|
65
|
+
dna sdlc next # snapshot of active work
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## The story-first lifecycle
|
|
69
|
+
|
|
70
|
+
### 1. File it — AC + DoD are required at create time
|
|
71
|
+
|
|
72
|
+
```bash
|
|
73
|
+
dna sdlc story create s-my-work \
|
|
74
|
+
--feature f-parent \
|
|
75
|
+
--desc "what and why, one line" \
|
|
76
|
+
--priority high --labels cli,docs --reporter my-agent \
|
|
77
|
+
--ac "Given/When/Then acceptance criterion" \
|
|
78
|
+
--dod "code + tests green + docs updated"
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
The CLI refuses Stories without `--ac`/`--dod` (exit criteria are not
|
|
82
|
+
optional). `--ac`/`--dod` are repeatable. Bugs/tasks are Issues:
|
|
83
|
+
`dna sdlc issue file --slug my-bug --type bug --severity high --desc "..."`.
|
|
84
|
+
|
|
85
|
+
### 2. Start it — the plan gate
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
dna sdlc story start s-my-work --plan "plan of attack in 1-3 lines" # inline Plan
|
|
89
|
+
dna sdlc story start s-my-work --plan-file plan.md # rich multi-section plan
|
|
90
|
+
dna sdlc story start s-my-work --no-plan --skip-reason "1-line hotfix" # honest, recorded skip
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Substantial work gets a real plan (`--plan-file`), not a one-liner. Side
|
|
94
|
+
effect: `story start` stamps `.dna/active-story.txt`, which the git hook
|
|
95
|
+
reads (below).
|
|
96
|
+
|
|
97
|
+
### 3. Build — narrate as you go
|
|
98
|
+
|
|
99
|
+
Status changes record *that* something happened, not *what*. Post a comment
|
|
100
|
+
for each meaningful step or decision — the timeline is what stakeholders
|
|
101
|
+
(and future sessions) read:
|
|
102
|
+
|
|
103
|
+
```bash
|
|
104
|
+
dna sdlc story comment s-my-work --body "now refactoring the cache to LRU"
|
|
105
|
+
dna sdlc story comment s-my-work --body "decided maxsize=64 because scans are heavy" --type decision
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
`--type` auto-detects decision-shaped comments; `--commit-ref` ties a note
|
|
109
|
+
to a SHA (auto-detected from HEAD). The transition verbs (`start`, `review`,
|
|
110
|
+
`done`) warn when the timeline went mute — narrate inline with `--note "..."`.
|
|
111
|
+
|
|
112
|
+
### 4. Verify — the test gate
|
|
113
|
+
|
|
114
|
+
`story done` **requires a passing TestRun** that verifies the Story
|
|
115
|
+
(mirroring the AC/DoD guard at create):
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
dna sdlc test-guide create tg-my-work --description "what it validates" \
|
|
119
|
+
--verifies Story/s-my-work --step "run X :: expect Y" --step "run Z :: expect W"
|
|
120
|
+
dna sdlc test-guide create tg-my-work --from-ac s-my-work # or stub steps from the AC
|
|
121
|
+
dna sdlc test-run record tg-my-work --outcome pass --note "all green locally + CI"
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Escape hatch `story done --allow-no-tests` is for recorded exceptions only.
|
|
125
|
+
|
|
126
|
+
### 5. PR — born from the story, review = open PR
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
dna sdlc story pr s-my-work # gh pr create, pre-filled FROM the story
|
|
130
|
+
dna sdlc story pr s-my-work --dry-run # print title + body, no gh call
|
|
131
|
+
dna sdlc pr-footer s-my-work # just the attribution footer, for hand-made PRs
|
|
132
|
+
dna sdlc story review s-my-work # requires an open PR on the branch (or --no-pr --reason)
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
`story pr` assembles title (`feat(<label>): <title> (<s-x>)`), body
|
|
136
|
+
(description + AC as a checklist) and the attribution footer, then stamps
|
|
137
|
+
the PR URL back onto the timeline. **PR ready = stop pushing to its
|
|
138
|
+
branch** — squash-merge captures the branch at the merge click; commits
|
|
139
|
+
pushed after approval are silently dropped. Further work goes to a new
|
|
140
|
+
branch off the merged base.
|
|
141
|
+
|
|
142
|
+
### 6. Done — only after merge
|
|
143
|
+
|
|
144
|
+
```bash
|
|
145
|
+
dna sdlc story done s-my-work --summary "what shipped"
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
A Story in `review` with no open PR is stale; `done` before the merge is a
|
|
149
|
+
lie. `done` auto-stamps `commit_ref`, warns on empty outputs (link
|
|
150
|
+
artifacts via `dna sdlc produces add`), and honors the test gate.
|
|
151
|
+
|
|
152
|
+
## Git symbiosis — trailers close the git↔SDLC loop
|
|
153
|
+
|
|
154
|
+
```bash
|
|
155
|
+
dna sdlc hooks install # one-time per clone → git config core.hooksPath scripts/git-hooks
|
|
156
|
+
dna sdlc hooks status # show wiring: hooksPath, active story, coauthor
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
While a Story is active, every `git commit` is stamped with
|
|
160
|
+
`Work-Item: Story/<name>` + the `dna-sdlc[bot]` co-author trailer. No
|
|
161
|
+
active story → no stamp (absence is signal). The way back needs no
|
|
162
|
+
bookkeeping:
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
dna sdlc story show s-my-work # header + AC/DoD + plan + recent timeline
|
|
166
|
+
dna sdlc story commits s-my-work # every commit tied to the Story (trailers + timeline)
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Surface IDs in chat (always)
|
|
170
|
+
|
|
171
|
+
When starting or shipping a doc, print the **full slug ID in backticks**
|
|
172
|
+
(`s-foo-bar`, `i-012-some-bug`) so the human can paste it into
|
|
173
|
+
`dna sdlc story show` / `git log --grep`. After a chunk of work, list each
|
|
174
|
+
ID touched with its transition (`s-foo: todo → done`).
|
|
175
|
+
|
|
176
|
+
## Other verbs (one-liners — `dna sdlc <verb> --help`)
|
|
177
|
+
|
|
178
|
+
`epic` / `feature` / `initiative` (parents; `feature` rolls up child
|
|
179
|
+
Stories) · `spike` (investigation arc: comment → answer with findings +
|
|
180
|
+
follow-up) · `adr` / `spec` / `plan` (design docs, ADR-style statuses) ·
|
|
181
|
+
`kaizen` (continuous-improvement observations) · `journey` (phase ledger —
|
|
182
|
+
derived; rarely needs manual writes) · `demand` (Story + journey-discover
|
|
183
|
+
in one shot) · `produces` / `cite` (link artifacts / sources) ·
|
|
184
|
+
`changelog` (release notes per scope) · `extract-decisions` (mine timelines).
|
|
185
|
+
|
|
186
|
+
## When NOT to use this skill
|
|
187
|
+
|
|
188
|
+
- Reading documents programmatically (use the SDK: `Kernel.quick(...)` /
|
|
189
|
+
`mi.all("Story")` — see the dna-sdk docs).
|
|
190
|
+
- Bulk renames/deletes (use `dna doc` + a git commit, not the SDLC verbs).
|