create-pathfinder 1.6.0 → 1.8.0
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/CLAUDE.md +2 -0
- package/README.md +21 -4
- package/bin/create-pathfinder.mjs +22 -0
- package/context/ai-interaction.md +1 -0
- package/package.json +1 -1
- package/skills/complete-feature/SKILL.md +3 -2
- package/skills/load-feature/SKILL.md +2 -1
- package/skills/setup-tracker/SKILL.md +74 -0
- package/skills/start-feature/SKILL.md +1 -0
- package/skills/sync-tracker/SKILL.md +120 -0
- package/skills/to-specs/SKILL.md +4 -0
- package/src/cells.mjs +324 -0
- package/src/cli.mjs +46 -18
- package/src/detect.mjs +1 -1
- package/src/kickstart-prompt.mjs +1 -1
- package/src/prompt.mjs +116 -11
- package/src/select.mjs +426 -0
- package/src/theme.mjs +241 -13
- package/templates/feature-spec.template.md +6 -0
- package/templates/tracker.template.md +359 -0
package/CLAUDE.md
CHANGED
|
@@ -76,3 +76,5 @@ An adapter carries the canonical skill's frontmatter and a pointer to it, and no
|
|
|
76
76
|
- `reflect` — review completed work, and the reflection itself, and propose reusable workflow improvements for human approval
|
|
77
77
|
- `handoff` — preserve useful state between sessions or tools
|
|
78
78
|
- `skillsmith` — teach and create small local skills
|
|
79
|
+
- `setup-tracker` — configure an optional external work tracker
|
|
80
|
+
- `sync-tracker` — publish approved feature specs to the configured tracker, one-way and idempotently
|
package/README.md
CHANGED
|
@@ -27,7 +27,7 @@ The installer copies five things into your repository and nothing else:
|
|
|
27
27
|
| --- | --- |
|
|
28
28
|
| `AGENTS.md`, `CLAUDE.md` | Entry files that tell an agent how to work in the project |
|
|
29
29
|
| `context/` | Project truth — overview, standards, interaction rules, current feature |
|
|
30
|
-
| `skills/` |
|
|
30
|
+
| `skills/` | Skills covering discovery, specs, delivery, debugging, review, learning, and optional work tracking |
|
|
31
31
|
| `templates/` | Starting points the project copies when it needs them |
|
|
32
32
|
|
|
33
33
|
On request it also writes one thing it does not copy:
|
|
@@ -84,9 +84,17 @@ Every install ends by printing the one prompt that starts a session, and the pro
|
|
|
84
84
|
In a terminal you are then asked whether to copy it, in a question that says what it replaces:
|
|
85
85
|
|
|
86
86
|
```text
|
|
87
|
-
? Copy that prompt to your clipboard? This replaces what is on it now.
|
|
87
|
+
? Copy that prompt to your clipboard? This replaces what is on it now.
|
|
88
|
+
|
|
89
|
+
❯ Yes
|
|
90
|
+
No
|
|
91
|
+
|
|
92
|
+
↑↓ move enter confirm
|
|
88
93
|
```
|
|
89
94
|
|
|
95
|
+
`y` and `n` still answer it in one keystroke, and under
|
|
96
|
+
`PATHFINDER_PROMPT=classic` it asks as `[Y/n]` on one line.
|
|
97
|
+
|
|
90
98
|
- **Nothing is copied without an explicit yes.** Declining, an unanswered question, `--no-clipboard`, `--yes`, `--dry-run`, and any run without a terminal on both ends all leave your clipboard exactly as it was.
|
|
91
99
|
- **The prompt is printed either way.** Copying is a convenience, never the only way to get it.
|
|
92
100
|
- **No dependency, and no clipboard is ever read.** The copy uses whatever your system already has — `pbcopy`, `clip.exe` including under WSL, or `wl-copy`, `xclip`, or `xsel` — chosen by what is actually installed rather than by your platform's name. If none of them is there, or one of them fails, the installer says so in one line and still exits 0.
|
|
@@ -95,8 +103,8 @@ In a terminal you are then asked whether to copy it, in a question that says wha
|
|
|
95
103
|
|
|
96
104
|
The last question is whether to open the project, and it is only ever about an editor you already have. The installer looks for `code` (VS Code) and `cursor` (Cursor) on your `PATH`:
|
|
97
105
|
|
|
98
|
-
- **One found** — a
|
|
99
|
-
- **Several found** — a
|
|
106
|
+
- **One found** — a Yes/No naming it: `? Open this project in VS Code?`
|
|
107
|
+
- **Several found** — a list, alphabetical, ending in `Don't open`
|
|
100
108
|
- **None found** — no question at all
|
|
101
109
|
|
|
102
110
|
Neither editor is a Pathfinder requirement, and the alphabetical order is not a recommendation. There is no way to name an editor or pass a path. The launch is detached: the installer hands over the project directory and exits immediately.
|
|
@@ -118,6 +126,15 @@ Neither editor is a Pathfinder requirement, and the alphabetical order is not a
|
|
|
118
126
|
| `--yes`, `--no-input` | Take the defaults and ask nothing. It does not authorize `git init`, configure any tool, touch your clipboard, or open an editor — pass `--git-init` and `--agents` for the first two |
|
|
119
127
|
| `-h`, `--help` | Show usage |
|
|
120
128
|
|
|
129
|
+
### Environment
|
|
130
|
+
|
|
131
|
+
| Variable | Effect |
|
|
132
|
+
| --- | --- |
|
|
133
|
+
| `PATHFINDER_PROMPT=classic` | Ask every question as a numbered list and `y`/`n` rather than an arrow-key selector |
|
|
134
|
+
| `NO_COLOR` | Print no colour. It does not disable the selector |
|
|
135
|
+
|
|
136
|
+
**Both prompt styles are supported.** By default a terminal answers questions with `↑`/`↓`, `Space`, and `Enter`. `PATHFINDER_PROMPT=classic` asks for typed numbers and `y`/`n` instead — the right choice for a screen reader, for a script driving the installer's stdin, and for anyone who simply prefers it. A terminal narrower than 49 columns and `TERM=dumb` select it on their own, and `y`/`n` keep working at a Yes/No question either way.
|
|
137
|
+
|
|
121
138
|
Questions are asked only when stdin and stdout are both terminals. Piped, redirected, or in CI, nothing is asked and nothing is prompted for — so a directory that is not a repository needs `--git-init`, or the install is refused, no tool is configured without `--agents`, the clipboard is never touched at all, and no editor is ever launched.
|
|
122
139
|
|
|
123
140
|
## Requirements
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { run } from "../src/cli.mjs";
|
|
3
3
|
import { createPrompter } from "../src/prompt.mjs";
|
|
4
|
+
import { createTheme } from "../src/theme.mjs";
|
|
4
5
|
|
|
5
6
|
// Everything the CLI learns about the outside world arrives through this call.
|
|
6
7
|
// `run` reads no globals of its own, so a test can hand it a synthesized
|
|
@@ -13,10 +14,30 @@ import { createPrompter } from "../src/prompt.mjs";
|
|
|
13
14
|
// is a run whose stdout is a pipe.
|
|
14
15
|
const interactive = Boolean(process.stdin.isTTY) && Boolean(process.stdout.isTTY);
|
|
15
16
|
|
|
17
|
+
// One theme for the whole run, built here because this is the only file allowed
|
|
18
|
+
// to read the process, and threaded into both consumers rather than built twice.
|
|
19
|
+
// Two themes over the same terminal would be two opinions about it, and they
|
|
20
|
+
// would differ in exactly the value that decides how a question is asked: `run`
|
|
21
|
+
// is handed no stdin, so a theme it built for itself would answer no to
|
|
22
|
+
// `selection` while the prompter's answered yes.
|
|
23
|
+
//
|
|
24
|
+
// Note what the capability is told about stdin and what it is not. Whether
|
|
25
|
+
// `setRawMode` exists is asked of the stream; it is never called, here or
|
|
26
|
+
// anywhere in this package — readline owns raw mode for the whole run.
|
|
27
|
+
const theme = createTheme({
|
|
28
|
+
env: process.env,
|
|
29
|
+
platform: process.platform,
|
|
30
|
+
isTTY: Boolean(process.stdout.isTTY),
|
|
31
|
+
inputIsTTY: Boolean(process.stdin.isTTY),
|
|
32
|
+
setRawMode: typeof process.stdin.setRawMode === "function",
|
|
33
|
+
columns: process.stdout.columns,
|
|
34
|
+
});
|
|
35
|
+
|
|
16
36
|
const prompter = createPrompter({
|
|
17
37
|
input: process.stdin,
|
|
18
38
|
output: process.stdout,
|
|
19
39
|
interactive,
|
|
40
|
+
theme,
|
|
20
41
|
});
|
|
21
42
|
|
|
22
43
|
try {
|
|
@@ -27,6 +48,7 @@ try {
|
|
|
27
48
|
env: process.env,
|
|
28
49
|
platform: process.platform,
|
|
29
50
|
stdoutIsTTY: Boolean(process.stdout.isTTY),
|
|
51
|
+
theme,
|
|
30
52
|
prompter,
|
|
31
53
|
});
|
|
32
54
|
} finally {
|
|
@@ -20,6 +20,7 @@ Follow the project's documented policy. Unless explicitly pre-approved, ask befo
|
|
|
20
20
|
- Git history rewriting
|
|
21
21
|
- commits, merges, releases, or deployments
|
|
22
22
|
- adopting prototype code into production
|
|
23
|
+
- writes that leave this repository, such as creating or editing items on a shared work tracker — writing files inside the repository is an ordinary file edit and is not covered
|
|
23
24
|
|
|
24
25
|
## Git and Delivery
|
|
25
26
|
|
package/package.json
CHANGED
|
@@ -11,7 +11,8 @@ description: Close an accepted feature through final verification, records, deli
|
|
|
11
11
|
4. Follow the approved commit, PR, merge, changelog, versioning, release, and deployment policy—requesting approval where required. After the merge, verify the merged mainline and clean up the merged branch as that policy requires.
|
|
12
12
|
5. Append the durable outcome to `context/history.md` while completing the feature, not afterwards. If the feature was merged without this skill running, still write the entry and record that it was written after the fact.
|
|
13
13
|
6. Mark/reset `context/current-feature.md` and identify the next action.
|
|
14
|
-
7.
|
|
15
|
-
8.
|
|
14
|
+
7. If `context/tracker.md` exists, reconcile this feature's tracked item with `sync-tracker` after the merge.
|
|
15
|
+
8. Offer or invoke `learn-feature` when learning is enabled.
|
|
16
|
+
9. Produce a compact completion summary.
|
|
16
17
|
|
|
17
18
|
Do not claim completion when checks failed, evidence is missing, or the feature remains unaccepted.
|
|
@@ -12,6 +12,7 @@ description: Prepare one feature for implementation by checking readiness, conte
|
|
|
12
12
|
5. Assess whether the feature fits a focused LLM context window.
|
|
13
13
|
6. Split or revise it before implementation if the context is too broad.
|
|
14
14
|
7. Populate `context/current-feature.md` with the feature, first delivery chunk, context boundary, assumptions, Git state, definition of done, and out-of-scope work.
|
|
15
|
-
8.
|
|
15
|
+
8. If `context/tracker.md` exists, note this feature's tracked item, or that it has none yet. The lookup is best-effort: an unreachable tracker is reported and never blocks loading.
|
|
16
|
+
9. Present a short readiness summary.
|
|
16
17
|
|
|
17
18
|
Do not implement, create Git history, or resolve `TBD` decisions silently.
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: setup-tracker
|
|
3
|
+
description: Configure an optional external work tracker by interviewing the human and writing context/tracker.md from the shipped template.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Setup Tracker
|
|
7
|
+
|
|
8
|
+
Use this skill to describe, in prose, which tracker a project uses and how
|
|
9
|
+
Pathfinder's work items project onto it. The result is `context/tracker.md`.
|
|
10
|
+
|
|
11
|
+
Work Tracking is **optional**. A project that never runs this skill is
|
|
12
|
+
unaffected: no file, no prompt, no behaviour change anywhere. Do not run this
|
|
13
|
+
skill unasked, and do not propose it as a missing step.
|
|
14
|
+
|
|
15
|
+
This skill configures. It never contacts a tracker.
|
|
16
|
+
|
|
17
|
+
## Rules
|
|
18
|
+
|
|
19
|
+
- Do not write `context/tracker.md` without human approval.
|
|
20
|
+
- Do not add code, dependencies, or an adapter for any tracker.
|
|
21
|
+
- Do not invent a taxonomy the team did not ask for.
|
|
22
|
+
- Keep the model section backend-neutral; vendor vocabulary belongs only under
|
|
23
|
+
the projection heading.
|
|
24
|
+
- Never remove the work-item marker block. It is the one machine-stable token in
|
|
25
|
+
a prose contract, and identity depends on it.
|
|
26
|
+
|
|
27
|
+
## Interview
|
|
28
|
+
|
|
29
|
+
Ask progressively, in small groups. Ask only what the config cannot be written
|
|
30
|
+
without:
|
|
31
|
+
|
|
32
|
+
1. Which tracker, and where it lives.
|
|
33
|
+
2. How an agent reaches it — a CLI, a path, or a described manual step.
|
|
34
|
+
3. Which tag namespaces the project actually uses. `area`, `type`, `priority`,
|
|
35
|
+
and `agent` are available; a project needing none of them says so.
|
|
36
|
+
4. What the tracker already carries. **List its existing labels, fields, or
|
|
37
|
+
conventions before proposing any tag value.** If something already means the
|
|
38
|
+
same thing, reuse it and record the mapping rather than creating a
|
|
39
|
+
near-duplicate.
|
|
40
|
+
5. Anything about the projection that the shipped starting points do not cover.
|
|
41
|
+
|
|
42
|
+
## Process
|
|
43
|
+
|
|
44
|
+
1. Check whether `context/tracker.md` already exists. If it does, read it, and
|
|
45
|
+
treat this run as a revision — show what would change and change nothing
|
|
46
|
+
else. Never overwrite a working config wholesale.
|
|
47
|
+
2. Read `templates/tracker.template.md`.
|
|
48
|
+
3. Run the interview.
|
|
49
|
+
4. Choose the projection:
|
|
50
|
+
- **GitHub Issues via `gh`** and **local Markdown files** ship as starting
|
|
51
|
+
points, both proven.
|
|
52
|
+
- Any other tracker is supported by the human describing it in prose, using a
|
|
53
|
+
shipped projection as the shape to follow. **That is the mechanism, not a
|
|
54
|
+
gap** — do not report an unsupported tracker as a blocker.
|
|
55
|
+
5. Fill the placeholders and keep **one** projection block. Delete, in the
|
|
56
|
+
written config:
|
|
57
|
+
- the template's guidance blockquote at the top;
|
|
58
|
+
- the projection block you did not keep;
|
|
59
|
+
- the `pathfinder:model-start` and `pathfinder:projection-boundary` markers;
|
|
60
|
+
- the italic *"Keep this block for…"* line under the projection you kept — it
|
|
61
|
+
is an instruction to you, not content for the project to read.
|
|
62
|
+
|
|
63
|
+
**The model — everything between the two markers — is kept byte-for-byte.**
|
|
64
|
+
The tracker-identity paragraph above it is the one part you rewrite, because
|
|
65
|
+
it names the tracker and how to reach it.
|
|
66
|
+
6. Present the proposed file and request approval.
|
|
67
|
+
7. Write `context/tracker.md` only after the human approves.
|
|
68
|
+
8. Report what was configured, and say plainly that nothing has been published.
|
|
69
|
+
|
|
70
|
+
## Stop Condition
|
|
71
|
+
|
|
72
|
+
Stop once the config is written. Publishing to a tracker is `sync-tracker`, not
|
|
73
|
+
this skill. If `sync-tracker` is not installed, say so rather than publishing by
|
|
74
|
+
hand.
|
|
@@ -23,3 +23,4 @@ Restate goal, chunk, files/areas, context, risks, assumptions, verification, exc
|
|
|
23
23
|
- Stop on conflicts between spec, durable context, and repository reality.
|
|
24
24
|
- Do not add dependencies, expand scope, adopt prototype code, commit, merge, or deploy without the documented approval.
|
|
25
25
|
- Do not hide multiple features inside one delivery chunk.
|
|
26
|
+
- Do not publish to a work tracker, even when `context/tracker.md` exists — the repository is canonical and a chunk boundary is not a tracker event.
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sync-tracker
|
|
3
|
+
description: Publish approved feature specs to the configured work tracker, one-way and idempotently, writing nothing when nothing has changed.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Sync Tracker
|
|
7
|
+
|
|
8
|
+
Use this skill to project the project's approved feature specs onto the tracker
|
|
9
|
+
described in `context/tracker.md`.
|
|
10
|
+
|
|
11
|
+
The repository is canonical. This is a **one-way projection** of work that
|
|
12
|
+
already exists. Nothing here reads tracker state back into a spec,
|
|
13
|
+
`context/current-feature.md`, or `context/history.md`.
|
|
14
|
+
|
|
15
|
+
## The off switch comes first
|
|
16
|
+
|
|
17
|
+
**If `context/tracker.md` does not exist, do nothing at all.** Report that work
|
|
18
|
+
tracking is not configured for this project, and stop.
|
|
19
|
+
|
|
20
|
+
Do not create the config, do not propose configuring one, and do not describe
|
|
21
|
+
its absence as a gap. Work Tracking is optional, and a project without it is
|
|
22
|
+
behaving correctly.
|
|
23
|
+
|
|
24
|
+
## The config is the contract
|
|
25
|
+
|
|
26
|
+
Read `context/tracker.md` in full and follow its prose. It states the model, the
|
|
27
|
+
projection, and the publishing rules for this project.
|
|
28
|
+
|
|
29
|
+
There is **no adapter code, no vendor branch, and no required tool** beyond what
|
|
30
|
+
the config itself names. If the config describes a tracker this skill has never
|
|
31
|
+
heard of, that is the design working, not a blocker.
|
|
32
|
+
|
|
33
|
+
Where the config is silent on something a run needs, **ask the human**. Do not
|
|
34
|
+
fill the gap with a convention of your own — the next run would fill it
|
|
35
|
+
differently, and every item would look modified.
|
|
36
|
+
|
|
37
|
+
## What gets published
|
|
38
|
+
|
|
39
|
+
**Approved feature specs only**, from `to-specs` onward — one work item per spec.
|
|
40
|
+
Never debate notes, kickstart output, or prototypes. The one exception is a
|
|
41
|
+
prototype that gates a decision, published as a single item phrased as the
|
|
42
|
+
decision it resolves, never as a deliverable.
|
|
43
|
+
|
|
44
|
+
**Do not decompose a feature.** Choosing units of execution inside a feature is a
|
|
45
|
+
judgement about how work will be shared out, and it belongs to a human or to a
|
|
46
|
+
skill written for it. Publish the feature.
|
|
47
|
+
|
|
48
|
+
## Process
|
|
49
|
+
|
|
50
|
+
1. Check for `context/tracker.md`. If it is absent, report and stop.
|
|
51
|
+
2. Read the config. Read the approved specs. Read nothing else.
|
|
52
|
+
3. Build the work items: key, kind, title, body, blocked-by edges, tags, and
|
|
53
|
+
chunks, derived and composed exactly as the config's model section says. Every
|
|
54
|
+
field comes from the spec — **tags only from its optional `## Tags` section,
|
|
55
|
+
never inferred.** A spec without one has no tags, which is correct and common.
|
|
56
|
+
4. Order them by dependency, blockers first. If the edges contain a cycle,
|
|
57
|
+
report it and publish nothing — a guessed order is a wrong order that looks
|
|
58
|
+
fine.
|
|
59
|
+
5. **Ask the human before the first write that leaves this repository.** See
|
|
60
|
+
below.
|
|
61
|
+
6. Publish, following the config's *Publishing, and re-publishing* section
|
|
62
|
+
exactly: index existing items by key, create what is missing, compare
|
|
63
|
+
normalized, and leave an unchanged item completely alone.
|
|
64
|
+
7. Report what was created, what was edited, and what was left alone.
|
|
65
|
+
|
|
66
|
+
## The approval gate
|
|
67
|
+
|
|
68
|
+
**Ask before the first write to a tracker outside this repository in a session.**
|
|
69
|
+
Creating items on a shared board is outward-facing and is not covered by ordinary
|
|
70
|
+
file-edit approval. One approval covers the run; do not ask per item.
|
|
71
|
+
|
|
72
|
+
**A projection onto files inside this repository is not gated.** It is an
|
|
73
|
+
ordinary file edit and reaches nothing outside the repository. The gate is about
|
|
74
|
+
leaving the repository, not about writing.
|
|
75
|
+
|
|
76
|
+
## Idempotency is the whole feature
|
|
77
|
+
|
|
78
|
+
A second run over unchanged specs must **create nothing, change nothing, and
|
|
79
|
+
issue zero writes**. Not writes that happen to be no-ops — no writes.
|
|
80
|
+
|
|
81
|
+
- **Compare normalized, never raw bytes.** A tracker is not obliged to hand a
|
|
82
|
+
body back exactly as it was sent, and APIs differ in whether they adjust
|
|
83
|
+
trailing whitespace. Where that happens, a naive byte comparison reports every
|
|
84
|
+
item as changed on every run and rewrites all of them forever, which looks like
|
|
85
|
+
working sync and is not. Strip trailing whitespace from each line and collapse
|
|
86
|
+
trailing blank lines at the end, **on both sides**, before comparing. It costs
|
|
87
|
+
nothing when the round-trip is exact.
|
|
88
|
+
- **Compare tag sets as sets**, not as ordered lists. Application order is not
|
|
89
|
+
preserved.
|
|
90
|
+
- Never close, reopen, delete, or recreate an item. Edit in place.
|
|
91
|
+
- Never touch an item whose key is absent from the current set. It belongs to
|
|
92
|
+
work outside this run.
|
|
93
|
+
- Match on the key alone, never on the title.
|
|
94
|
+
|
|
95
|
+
**Report writes, not final state.** "The tracker looks right" is satisfied by a
|
|
96
|
+
run that rewrote every item, which is the specific failure this skill exists to
|
|
97
|
+
avoid. `3 items, 0 changes` is the expected result of a second run and the most
|
|
98
|
+
important line of output.
|
|
99
|
+
|
|
100
|
+
## Rules
|
|
101
|
+
|
|
102
|
+
- Do not add code, dependencies, or an adapter for any tracker.
|
|
103
|
+
- Do not branch on `kind`.
|
|
104
|
+
- Do not infer tags, and do not apply a value the config's mapping table does not
|
|
105
|
+
carry. A spec naming an unmapped tag is a question for the human, not a
|
|
106
|
+
judgement call.
|
|
107
|
+
- Do not drop an edge that resolves outside the published set, and do not invent
|
|
108
|
+
an item for it. Resolve it against the tracker as a whole: render the item's
|
|
109
|
+
identifier if the key already has one, and name the key as untracked only when
|
|
110
|
+
it genuinely has none.
|
|
111
|
+
- Do not read anything back. A ticked checkbox means nothing to Pathfinder and
|
|
112
|
+
never advances any state.
|
|
113
|
+
- Do not close, reopen, or delete anything, ever.
|
|
114
|
+
- Stop and report when the config, the specs, and the tracker disagree.
|
|
115
|
+
|
|
116
|
+
## Stop Condition
|
|
117
|
+
|
|
118
|
+
Stop once the run is reported. Configuring a tracker is `setup-tracker`, not this
|
|
119
|
+
skill. If a spec set is not ready to publish, say so rather than publishing part
|
|
120
|
+
of it.
|
package/skills/to-specs/SKILL.md
CHANGED
|
@@ -36,8 +36,12 @@ Create only the coherent MVP roadmap in `context/features/`, using `templates/fe
|
|
|
36
36
|
|
|
37
37
|
Each spec must include Context Boundary, Delivery Chunks, and Learning Targets.
|
|
38
38
|
|
|
39
|
+
Write a `## Tags` section only when the project has configured work tracking and its `context/tracker.md` defines tag namespaces. Use the values that config already lists, never invented ones. No tags is a valid and common answer — omit the section rather than guessing.
|
|
40
|
+
|
|
39
41
|
After creation, summarize file, outcome, dependency, visible/verifiable win, context risk, and recommended first feature.
|
|
40
42
|
|
|
43
|
+
If `context/tracker.md` exists, offer to publish the new specs with `sync-tracker`. If it does not, say nothing about tracking.
|
|
44
|
+
|
|
41
45
|
## Rules
|
|
42
46
|
|
|
43
47
|
- Do not implement or install packages.
|