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.
Files changed (70) hide show
  1. {dna_cli-0.1.0 → dna_cli-0.3.0}/PKG-INFO +2 -2
  2. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/__init__.py +2 -0
  3. dna_cli-0.3.0/dna_cli/data/onboarding-scope/AGENTS.md +68 -0
  4. dna_cli-0.3.0/dna_cli/data/onboarding-scope/skills/dna-sdlc-cli/SKILL.md +190 -0
  5. dna_cli-0.3.0/dna_cli/init_cmd.py +569 -0
  6. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/memory_cmd.py +22 -26
  7. {dna_cli-0.1.0 → dna_cli-0.3.0}/pyproject.toml +3 -3
  8. dna_cli-0.3.0/tests/test_init_cmd.py +474 -0
  9. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_memory_cmd.py +36 -0
  10. {dna_cli-0.1.0 → dna_cli-0.3.0}/.gitignore +0 -0
  11. {dna_cli-0.1.0 → dna_cli-0.3.0}/LICENSE +0 -0
  12. {dna_cli-0.1.0 → dna_cli-0.3.0}/README.md +0 -0
  13. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_active_story.py +0 -0
  14. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_banner.py +0 -0
  15. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_ctx.py +0 -0
  16. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_git_symbiosis.py +0 -0
  17. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_github_bridge.py +0 -0
  18. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/_methodology_gates.py +0 -0
  19. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/data/git-hooks/prepare-commit-msg +0 -0
  20. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/doc_cmd.py +0 -0
  21. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/docs_cmd.py +0 -0
  22. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/eval_cmd.py +0 -0
  23. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/hooks_cmd.py +0 -0
  24. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/install_cmd.py +0 -0
  25. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/issue_bridge_cmd.py +0 -0
  26. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/kind_cmd.py +0 -0
  27. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/pr_cmd.py +0 -0
  28. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/recall_cmd.py +0 -0
  29. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/research_cmd.py +0 -0
  30. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/scope_cmd.py +0 -0
  31. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/sdlc_cmd.py +0 -0
  32. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/source_cmd.py +0 -0
  33. {dna_cli-0.1.0 → dna_cli-0.3.0}/dna_cli/testkit_cmd.py +0 -0
  34. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/conftest.py +0 -0
  35. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_changelog_cmd.py +0 -0
  36. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_doc_apply_bundle_entries.py +0 -0
  37. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_doc_apply_prompt_budget.py +0 -0
  38. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_docs_cmd.py +0 -0
  39. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_eval_cmd.py +0 -0
  40. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_focus_gates_cli.py +0 -0
  41. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_focus_gates_guards.py +0 -0
  42. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_git_symbiosis_hook.py +0 -0
  43. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_hooks_cli.py +0 -0
  44. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_install_cmd.py +0 -0
  45. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_install_github_real.py +0 -0
  46. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_issue_bridge_cli.py +0 -0
  47. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_issue_comment_cli.py +0 -0
  48. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_kaizen_event.py +0 -0
  49. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_kaizen_transitions.py +0 -0
  50. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_plan_from_file.py +0 -0
  51. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_produces_cmd.py +0 -0
  52. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_recall_cmd.py +0 -0
  53. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_research_cmd.py +0 -0
  54. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_scope_detect.py +0 -0
  55. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_sdlc_brief.py +0 -0
  56. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_sdlc_correctness.py +0 -0
  57. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_sdlc_ergonomics.py +0 -0
  58. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_sdlc_scope_default.py +0 -0
  59. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_sdlc_workitem_cli.py +0 -0
  60. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_source_url_resolution.py +0 -0
  61. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_spike_cli.py +0 -0
  62. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_check.py +0 -0
  63. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_commits_backref.py +0 -0
  64. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_done_guard.py +0 -0
  65. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_pr_cli.py +0 -0
  66. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_review_pr_guard.py +0 -0
  67. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_show.py +0 -0
  68. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_story_start_gate.py +0 -0
  69. {dna_cli-0.1.0 → dna_cli-0.3.0}/tests/test_tenant_write_note.py +0 -0
  70. {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.1.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.2,>=0.1
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).