-
Notifications
You must be signed in to change notification settings - Fork 1
feat(epic-store): file-backed Epic store (opt-in hybrid) #198
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
Merged
Changes from 10 commits
Commits
Show all changes
11 commits
Select commit
Hold shift + click to select a range
a17dcea
docs(epic-store): plan + decisions log for Epic #190
thejustinwalsh 4648a72
Merge branch 'main' into middle-issue-190
thejustinwalsh a5620e9
refactor(dispatcher): string-keyed epicRef seam (EpicGateway/PollGate…
thejustinwalsh 2a81fac
feat(epic-store): file-backed gateway implementations (Epic, State, P…
thejustinwalsh 89de4c8
feat(epic-store): bootstrap selector + postQuestion file-mode wiring
thejustinwalsh b9b0fe8
feat(cli): mm init/dispatch/doctor/resume — file-mode support
thejustinwalsh b1bfe38
refactor(skills): abstract Epic-aware skills + dispatch-brief mode in…
thejustinwalsh b915faf
test(epic-store): parity test (github ⇔ file) + Phase 1 smoke
thejustinwalsh dd32eeb
feat(epic-store): Phase 2 — file-watcher Q&A loop on the poller cron
thejustinwalsh 84d0d9f
fix(epic-store): route the poller + recovery surface; guard the watch…
thejustinwalsh de4a179
fix(epic-store): address review — GitHub casing, TSDoc, separator-saf…
thejustinwalsh File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
111 changes: 111 additions & 0 deletions
111
...bootstrap-assets/skills/creating-github-issues/references/file-mode-commands.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,111 @@ | ||
| # creating-github-issues — file-mode commands | ||
|
|
||
| Authoring Epic **files** from a planning doc, for a repo running `epic_store = "file"`. | ||
| There is **no `gh issue create` in file mode** — Epics and their sub-issues are | ||
| Markdown, not GitHub issues. PRs/reviews/CI remain GitHub-native, but issue | ||
| creation is not part of file mode at all. | ||
|
|
||
| The workflow phases (read the source, inventory, decide hierarchy, triage unknowns, | ||
| audit against the integration rubric) are identical to the github-mode body. Only | ||
| the "file the issues" mechanics change: instead of `gh issue create` + sub-issue | ||
| REST attaches, you write one Epic file per Epic. | ||
|
|
||
| ## Where files go | ||
|
|
||
| `epics_dir` from the repo's `.middle/<repo>.toml` (default `planning/epics/`). One | ||
| file per Epic: `planning/epics/<slug>.md`. The `<slug>` is the filename stem **and** | ||
| the canonical Epic reference — it must equal the `slug:` in the file's meta. | ||
|
|
||
| ## Author one Epic file | ||
|
|
||
| Write `planning/epics/<slug>.md` with this structure (mirror the marker names | ||
| exactly — the markers ARE the structural contract): | ||
|
|
||
| ```markdown | ||
| <!-- middle:epic v1 --> | ||
| # <Epic title> | ||
|
|
||
| <!-- middle:meta | ||
| slug: <slug> | ||
| adapter: claude | ||
| complexity_ceiling: 3 | ||
| approved: false | ||
| labels: [phase:10, dogfood] | ||
| blocked-by: [other-epic-slug] | ||
| --> | ||
|
|
||
| ## Context | ||
|
|
||
| <1-3 paragraphs pointing to the spec section; same content as a github-mode | ||
| parent's Context.> | ||
|
|
||
| ## Acceptance criteria | ||
|
|
||
| - [ ] <Epic-level, concrete, verifiable criterion> | ||
| - [ ] <…> | ||
|
|
||
| ## Sub-issues | ||
|
|
||
| <!-- middle:sub-issue id=1 --> | ||
| - [ ] **1 — <verb-led title>** | ||
| <prose body> | ||
| *Acceptance:* <concrete criteria for this phase> | ||
| <!-- /middle:sub-issue --> | ||
|
|
||
| <!-- middle:sub-issue id=2 --> | ||
| - [ ] **2 — <verb-led title>** | ||
| <prose body> | ||
| *Blocked by:* 1 | ||
| <!-- /middle:sub-issue --> | ||
|
|
||
| <!-- middle:conversation --> | ||
| <!-- /middle:conversation --> | ||
| ``` | ||
|
|
||
| ## The `<!-- middle:meta -->` keys | ||
|
|
||
| YAML-lite, one key per line, between `<!-- middle:meta` and `-->`: | ||
|
|
||
| | Key | Required | Meaning | | ||
| |---|---|---| | ||
| | `slug` | yes | Canonical Epic reference; must equal the filename stem. | | ||
| | `adapter` | no | `claude` / `codex` — the file-mode peer of an `agent:<name>` label. | | ||
| | `labels` | no | Display labels (informational; no GitHub side-effect in file mode). | | ||
| | `blocked-by` | no | List of other Epic slugs this one waits on (cross-Epic deps). | | ||
| | `complexity_ceiling` | no | Per-Epic override of the repo's default ceiling. | | ||
| | `approved` | no | File-mode stand-in for the `approved` label. | | ||
|
|
||
| (`pr:` and `closed:` also live in meta but are written by the dispatcher at | ||
| runtime — do not author them.) | ||
|
|
||
| ## Rules that carry over from the github-mode body | ||
|
|
||
| - **Acceptance criteria are mandatory** — both Epic-level (`## Acceptance criteria`) | ||
| and per sub-issue (`*Acceptance:*`). Same concrete/verifiable/scoped bar. | ||
| - **Integration rubric (Phase 8.5)** — every feature Epic carries ≥1 criterion that | ||
| wires the feature into the running product and proves it with an | ||
| integration/smoke/e2e test, or a declared `<!-- integration-exempt: <reason> -->`. | ||
| - **Hierarchy by default** — the Epic file *is* the parent; its sub-issue blocks are | ||
| the children. A genuinely cross-workstream item is a separate Epic file. | ||
| - **Titles are the most-read line** — verb-led, scoped, ≤72 chars, both for the H1 | ||
| and each sub-issue title. | ||
|
|
||
| ## Leave the conversation empty | ||
|
|
||
| Author the file with an empty `<!-- middle:conversation --><!-- /middle:conversation -->`. | ||
| The dispatcher's renderer is the **sole writer** of conversation entries (plan, | ||
| dispatch events, questions, answers). Never seed conversation content by hand — that | ||
| would break the strict-marker contract and the byte-identical round-trip invariant. | ||
|
|
||
| ## Verify the set | ||
|
|
||
| There's no `gh issue list` to confirm against in file mode. Verify by: | ||
|
|
||
| ```bash | ||
| ls planning/epics/*.md | ||
| ``` | ||
|
|
||
| and re-reading each file: the H1 matches `slug`, every sub-issue has an id + an | ||
| unchecked box, acceptance criteria are present, and the conversation section is | ||
| empty. Optionally run the dispatcher's parser over each file (it refuses malformed | ||
| markers) before considering the set filed. |
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Uh oh!
There was an error while loading. Please reload this page.