create-pathfinder 3.1.0 → 4.1.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/AGENTS.md +3 -3
- package/CLAUDE.md +26 -18
- package/README.md +3 -3
- package/context/ai-interaction.md +19 -13
- package/context/coding-standards.md +11 -7
- package/package.json +2 -2
- package/roles/developer.md +2 -1
- package/roles/planner.md +8 -6
- package/roles/tester.md +1 -1
- package/skills/debug-issue/SKILL.md +4 -4
- package/skills/hooksmith/SKILL.md +265 -0
- package/skills/kickstart-pathfinder/SKILL.md +6 -0
- package/skills/quiz-me/SKILL.md +1 -1
- package/skills/reverse-engineer/SKILL.md +1 -1
- package/skills/role/SKILL.md +8 -2
- package/skills/setup-tracker/SKILL.md +38 -18
- package/skills/teach-feature/SKILL.md +1 -1
- package/skills/ticket/SKILL.md +64 -0
- package/skills/ticket/actions/complete.md +50 -0
- package/skills/ticket/actions/load.md +72 -0
- package/skills/ticket/actions/review.md +44 -0
- package/skills/ticket/actions/start.md +50 -0
- package/skills/ticket/store.md +72 -0
- package/skills/to-specs/SKILL.md +15 -5
- package/skills/to-tickets/SKILL.md +98 -0
- package/skills/whereami/SKILL.md +17 -15
- package/src/kit.mjs +26 -10
- package/templates/feature-spec.template.md +0 -7
- package/templates/ticket.template.md +42 -0
- package/skills/feature/SKILL.md +0 -56
- package/skills/feature/actions/complete.md +0 -22
- package/skills/feature/actions/load.md +0 -45
- package/skills/feature/actions/review.md +0 -32
- package/skills/feature/actions/start.md +0 -33
- package/skills/sync-tracker/SKILL.md +0 -81
package/skills/whereami/SKILL.md
CHANGED
|
@@ -12,16 +12,18 @@ action. It reports state. It never changes it.
|
|
|
12
12
|
|
|
13
13
|
## Process
|
|
14
14
|
|
|
15
|
-
1. Role: report
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
15
|
+
1. Role: report an explicit `/role` override when one is active; otherwise
|
|
16
|
+
report `none`. Lifecycle role assumptions apply only to their own invocation,
|
|
17
|
+
so a previous `ticket` or planning action does not persist a role for
|
|
18
|
+
`whereami`. Roles are never written to disk. Do not infer one from the
|
|
19
|
+
current ticket or search `roles/`.
|
|
20
|
+
2. Read `context/current-ticket.md` if it exists.
|
|
21
|
+
Take Ticket, Feature, and Next from it verbatim. The ticket key and the
|
|
22
|
+
Feature number are the ones recorded there, from their filenames.
|
|
21
23
|
If the file is missing or still holds template placeholders, report `none`.
|
|
22
24
|
3. Run `git status --short --branch` once.
|
|
23
25
|
Report the branch/ref, and `clean` or the count of changed paths.
|
|
24
|
-
4. Compare the Git section of `context/current-
|
|
26
|
+
4. Compare the Git section of `context/current-ticket.md` with step 3.
|
|
25
27
|
Report a drift line only if the recorded branch differs from the real one.
|
|
26
28
|
5. Context telemetry: report it only if this harness exposes it.
|
|
27
29
|
Otherwise `unavailable`. Do not estimate.
|
|
@@ -33,7 +35,7 @@ Exactly this shape, one line each:
|
|
|
33
35
|
```
|
|
34
36
|
Role: <role | none>
|
|
35
37
|
Feature: <## — name | none>
|
|
36
|
-
|
|
38
|
+
Ticket: <key and name | none>
|
|
37
39
|
Git: <branch/ref> — <clean | N changed>
|
|
38
40
|
Context: <telemetry | unavailable>
|
|
39
41
|
Next: <single next action | none>
|
|
@@ -42,7 +44,7 @@ Next: <single next action | none>
|
|
|
42
44
|
Add at most one line after it, and only when step 4 found drift:
|
|
43
45
|
|
|
44
46
|
```
|
|
45
|
-
Drift: current-
|
|
47
|
+
Drift: current-ticket.md records <branch>, working tree is on <branch>
|
|
46
48
|
```
|
|
47
49
|
|
|
48
50
|
Then stop.
|
|
@@ -50,8 +52,8 @@ Then stop.
|
|
|
50
52
|
## Rules
|
|
51
53
|
|
|
52
54
|
- Read only. No writes, no commits, no `git` command that mutates anything.
|
|
53
|
-
- Read at most one file: `context/current-
|
|
54
|
-
- Do not open the feature spec, history, roadmap,
|
|
55
|
+
- Read at most one file: `context/current-ticket.md`.
|
|
56
|
+
- Do not open the ticket, the feature spec, history, roadmap, or source.
|
|
55
57
|
- Report `none` or `unavailable` instead of inferring a missing value.
|
|
56
58
|
- Do not offer to fix drift, update state, or start the next action.
|
|
57
59
|
The human decides what happens after the snapshot.
|
|
@@ -63,7 +65,7 @@ Then stop.
|
|
|
63
65
|
```
|
|
64
66
|
Role: developer
|
|
65
67
|
Feature: 12 — export saved searches
|
|
66
|
-
|
|
68
|
+
Ticket: 12.2 — CSV writer
|
|
67
69
|
Git: feature/12-export-saved-searches — 3 changed
|
|
68
70
|
Context: unavailable
|
|
69
71
|
Next: Verify the CSV writer against the acceptance criteria
|
|
@@ -76,12 +78,12 @@ Do not do this:
|
|
|
76
78
|
```
|
|
77
79
|
Role: developer (inferred from recent commits)
|
|
78
80
|
Feature: 12 — export saved searches
|
|
79
|
-
|
|
81
|
+
Ticket: 12.3 — probably the download endpoint
|
|
80
82
|
Git: feature/12-export-saved-searches — 3 changed
|
|
81
83
|
Context: ~60% used
|
|
82
|
-
Next: I can update current-
|
|
84
|
+
Next: I can update current-ticket.md and start ticket 12.3 — want me to?
|
|
83
85
|
```
|
|
84
86
|
|
|
85
|
-
It guesses the role from history, invents a
|
|
87
|
+
It guesses the role from history, invents a ticket that was never written,
|
|
86
88
|
estimates telemetry it cannot see, and turns a status report into a proposal
|
|
87
89
|
to write state.
|
package/src/kit.mjs
CHANGED
|
@@ -57,24 +57,38 @@ export function isExcluded(basename) {
|
|
|
57
57
|
* real, hand-written files that live inside a copy-list directory and must
|
|
58
58
|
* still never reach a destination project.
|
|
59
59
|
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
60
|
+
* Every one of them would be actively wrong in somebody else's project,
|
|
61
|
+
* though not all for the same reason — see `context/history.md` below.
|
|
62
62
|
*
|
|
63
|
-
* `context/tracker.md` is the original case.
|
|
64
|
-
*
|
|
65
|
-
*
|
|
66
|
-
* tracker it does not own, pointing at a spec directory it does not have, with
|
|
67
|
-
* the off switch already defeated on first install.
|
|
63
|
+
* `context/tracker.md` is the original case. Its absence selects the default
|
|
64
|
+
* local-Markdown ticket store, so shipping this repository's own copy would
|
|
65
|
+
* hand every new project a configuration naming a store it does not own.
|
|
68
66
|
*
|
|
69
|
-
* `context/current-
|
|
67
|
+
* `context/current-ticket.md` and `context/handoff.md` are transient session
|
|
70
68
|
* state, and they are here for the same reason one step further on: the kit
|
|
71
|
-
* stopped shipping a blank `current-
|
|
69
|
+
* stopped shipping a blank `current-ticket.md` stencil, because `/ticket load`
|
|
72
70
|
* writes the real one on first use and a placeholder is just a file a reader
|
|
73
71
|
* has to recognise as empty. Having stopped shipping the blank one, the thing
|
|
74
72
|
* to guard against is shipping a *filled-in* one — a destination project
|
|
75
|
-
* opening its first session to a note about whichever
|
|
73
|
+
* opening its first session to a note about whichever ticket a Pathfinder
|
|
76
74
|
* maintainer had loaded on the day of the release.
|
|
77
75
|
*
|
|
76
|
+
* `context/current-feature.md` is the same file under its former name. The
|
|
77
|
+
* delivery loop stopped writing it when tickets became the executable unit, and
|
|
78
|
+
* it stays on this list because a project installed before that change still
|
|
79
|
+
* has one sitting in `context/`, and an upgrade must not ship a maintainer's
|
|
80
|
+
* copy over it.
|
|
81
|
+
*
|
|
82
|
+
* `context/history.md` is the odd one out, and the reason this set now has two
|
|
83
|
+
* kinds in it. The others are transient or local session state, ignored by
|
|
84
|
+
* Git as well as excluded here. This one is durable project truth, tracked in
|
|
85
|
+
* version control exactly as `README.md` says a project should track it — it is
|
|
86
|
+
* simply *another project's* truth. A destination project gets its own, written
|
|
87
|
+
* by `/ticket complete` from `templates/history.template.md` on the day it
|
|
88
|
+
* first completes something, and that template must keep shipping. So the
|
|
89
|
+
* promise made about this path is the publication half only: never shipped, but
|
|
90
|
+
* emphatically tracked.
|
|
91
|
+
*
|
|
78
92
|
* `context` is a *directory* entry in the copy list, so anything placed beneath
|
|
79
93
|
* it ships by default. Making the invariant enforced rather than intended is
|
|
80
94
|
* the same move `check_no_junk_tracked` made: an ignore rule is advisory, one
|
|
@@ -86,8 +100,10 @@ export function isExcluded(basename) {
|
|
|
86
100
|
*/
|
|
87
101
|
const NEVER_SHIPS = new Set([
|
|
88
102
|
"context/tracker.md",
|
|
103
|
+
"context/current-ticket.md",
|
|
89
104
|
"context/current-feature.md",
|
|
90
105
|
"context/handoff.md",
|
|
106
|
+
"context/history.md",
|
|
91
107
|
]);
|
|
92
108
|
|
|
93
109
|
/**
|
|
@@ -26,13 +26,6 @@ Include only what materially helps someone implement this Feature.
|
|
|
26
26
|
|
|
27
27
|
- `[explicit exclusion]`
|
|
28
28
|
|
|
29
|
-
## Delivery Chunks
|
|
30
|
-
|
|
31
|
-
1. `[small, stable, verifiable increment]`
|
|
32
|
-
2. `[next increment, if needed]`
|
|
33
|
-
|
|
34
|
-
Use one chunk when the Feature is already small.
|
|
35
|
-
|
|
36
29
|
## Acceptance Criteria
|
|
37
30
|
|
|
38
31
|
- `[observable result proving the Feature works]`
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# [Ticket Title]
|
|
2
|
+
|
|
3
|
+
## Status
|
|
4
|
+
|
|
5
|
+
Proposed
|
|
6
|
+
|
|
7
|
+
## Parent Feature
|
|
8
|
+
|
|
9
|
+
`[NN-feature-name.md]`
|
|
10
|
+
|
|
11
|
+
## Blocked by
|
|
12
|
+
|
|
13
|
+
- `[NN.TT]` — `[what this ticket needs from it, in a few words]`
|
|
14
|
+
|
|
15
|
+
Write `None` when nothing blocks this ticket.
|
|
16
|
+
|
|
17
|
+
## Goal
|
|
18
|
+
|
|
19
|
+
[One vertical slice: a change that leaves the project working and is worth
|
|
20
|
+
reviewing on its own.]
|
|
21
|
+
|
|
22
|
+
## Context
|
|
23
|
+
|
|
24
|
+
- Read: `[specific files or sections this ticket needs]`
|
|
25
|
+
- Relevant area: `[path or component]`
|
|
26
|
+
|
|
27
|
+
## Changes
|
|
28
|
+
|
|
29
|
+
- `[required change]`
|
|
30
|
+
- `[important constraint]`
|
|
31
|
+
|
|
32
|
+
## Verification
|
|
33
|
+
|
|
34
|
+
- `[command to run, or behavior to observe, and what proves it worked]`
|
|
35
|
+
|
|
36
|
+
## Out of Scope
|
|
37
|
+
|
|
38
|
+
- `[explicit exclusion, or None]`
|
|
39
|
+
|
|
40
|
+
## Notes / Decisions
|
|
41
|
+
|
|
42
|
+
- `[ticket-specific decision or constraint, or None]`
|
package/skills/feature/SKILL.md
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: feature
|
|
3
|
-
description: Run one action of the Feature delivery loop — load, start, review, or complete.
|
|
4
|
-
argument-hint: load|start|review|complete
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Feature
|
|
8
|
-
|
|
9
|
-
The Feature delivery loop, as one skill. The human names the action:
|
|
10
|
-
|
|
11
|
-
`/feature load`
|
|
12
|
-
`/feature start`
|
|
13
|
-
`/feature review`
|
|
14
|
-
`/feature complete`
|
|
15
|
-
|
|
16
|
-
## Process
|
|
17
|
-
|
|
18
|
-
1. Take the action from the invocation.
|
|
19
|
-
If none was given, list the four actions below and stop.
|
|
20
|
-
If it is not one of the four, say so, list them, and stop.
|
|
21
|
-
2. Read only `skills/feature/actions/<action>.md` and follow it exactly.
|
|
22
|
-
|
|
23
|
-
## Actions
|
|
24
|
-
|
|
25
|
-
- `load` — prepare one Feature for execution. Reads its spec and the minimum
|
|
26
|
-
context around it, checks for blockers, records the approval in the spec, and
|
|
27
|
-
writes the session's workspace state.
|
|
28
|
-
- `start` — implement the active delivery chunk in small, stable increments,
|
|
29
|
-
restating the pre-implementation summary before editing anything.
|
|
30
|
-
- `review` — verify implemented work against its Feature and report findings.
|
|
31
|
-
It changes no implementation and accepts nothing.
|
|
32
|
-
- `complete` — complete work the human has accepted, through the project's
|
|
33
|
-
delivery workflow and its durable records.
|
|
34
|
-
|
|
35
|
-
## Lifecycle
|
|
36
|
-
|
|
37
|
-
The Feature spec's `## Status` holds the durable lifecycle state named in
|
|
38
|
-
`context/ai-interaction.md`:
|
|
39
|
-
|
|
40
|
-
`Proposed` → `Ready` → `In Progress` → `Complete`
|
|
41
|
-
|
|
42
|
-
`Cancelled` and `Superseded` are terminal alternatives.
|
|
43
|
-
|
|
44
|
-
- `load` writes `Proposed` → `Ready`.
|
|
45
|
-
- `start` writes `Ready` → `In Progress`.
|
|
46
|
-
- `complete` writes `Complete`.
|
|
47
|
-
- `review` writes no status. Review is workflow activity, not lifecycle state.
|
|
48
|
-
|
|
49
|
-
`context/current-feature.md` is transient workspace state and records no status.
|
|
50
|
-
|
|
51
|
-
## Rules
|
|
52
|
-
|
|
53
|
-
- Run the one action the human named. Do not continue into the next one.
|
|
54
|
-
- Read only that action's file. The other three are not context for this work.
|
|
55
|
-
- Human authority is unchanged: approval, acceptance, merge, and release are
|
|
56
|
-
the human's, whichever action is running.
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# Feature: Complete
|
|
2
|
-
|
|
3
|
-
Invoking this action is the human's acceptance of the Feature. Do not ask for
|
|
4
|
-
acceptance again.
|
|
5
|
-
|
|
6
|
-
Acceptance of the Feature is not approval of the delivery steps below. Each one
|
|
7
|
-
that the project's documented workflow gates is still asked for.
|
|
8
|
-
|
|
9
|
-
1. Run the project's required final checks.
|
|
10
|
-
2. Follow the documented Git, merge, version, release, and deployment workflow.
|
|
11
|
-
Ask for approval where it requires it. If that workflow is undocumented or
|
|
12
|
-
`TBD`, stop and ask rather than choosing one.
|
|
13
|
-
3. Mark the Feature `Complete` in its spec's `## Status`.
|
|
14
|
-
4. Add a compact entry to `context/history.md`.
|
|
15
|
-
Create it from `templates/history.template.md` if it does not exist.
|
|
16
|
-
5. Clear or update `context/current-feature.md`. Do nothing if it does not exist.
|
|
17
|
-
6. If work tracking is configured, sync the completed state.
|
|
18
|
-
7. Report the completed outcome and any remaining follow-up.
|
|
19
|
-
|
|
20
|
-
Do not re-review accepted work unless final verification exposes a new problem.
|
|
21
|
-
|
|
22
|
-
Do not claim completion if required checks or delivery steps failed.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# Feature: Load
|
|
2
|
-
|
|
3
|
-
Prepare one Feature for execution.
|
|
4
|
-
|
|
5
|
-
1. Select the Feature the human named. Being invoked on it is the approval to
|
|
6
|
-
prepare it for execution, so its spec does not already have to say `Ready`.
|
|
7
|
-
Its spec is `NN-feature-name.md` in the spec source, and `NN` is its Feature
|
|
8
|
-
number.
|
|
9
|
-
2. Read the Feature spec.
|
|
10
|
-
3. Read only the files or context needed for the current work.
|
|
11
|
-
4. Inspect the current Git state.
|
|
12
|
-
5. Stop if a required human decision or explicit dependency blocks the work.
|
|
13
|
-
6. Record the approval in the Feature spec's `## Status`, which holds the
|
|
14
|
-
durable lifecycle state:
|
|
15
|
-
- `Proposed` becomes `Ready`. That is the only value this action writes.
|
|
16
|
-
- `Ready` or `In Progress` is left exactly as it is. Reloading a Feature
|
|
17
|
-
mid-work is normal and must not rewrite its state.
|
|
18
|
-
- `Complete`, `Cancelled`, or `Superseded` blocks the load. Report it and
|
|
19
|
-
stop. Reopening terminal work is the human's decision.
|
|
20
|
-
|
|
21
|
-
Do this only once steps 1-5 found no blocker, and before the next step, so a
|
|
22
|
-
blocked load never leaves a promoted spec behind.
|
|
23
|
-
7. Create or update `context/current-feature.md` — it does not ship, so the
|
|
24
|
-
first load writes it — with:
|
|
25
|
-
- Feature number, name, and spec path
|
|
26
|
-
- active delivery chunk
|
|
27
|
-
- Git state
|
|
28
|
-
- blocker, if any
|
|
29
|
-
- next action
|
|
30
|
-
|
|
31
|
-
Do not record the lifecycle status here. This file is transient workspace
|
|
32
|
-
state belonging to one session on one machine; the spec carries the durable
|
|
33
|
-
status.
|
|
34
|
-
8. If `context/tracker.md` exists, name the tracked item for this Feature —
|
|
35
|
-
its key is that Feature number. Do nothing here if it does not.
|
|
36
|
-
9. Present a short readiness summary.
|
|
37
|
-
|
|
38
|
-
Do not implement the Feature. That is `/feature start`.
|
|
39
|
-
|
|
40
|
-
Do not scan unrelated repository areas, load history or roadmap by default, or
|
|
41
|
-
silently resolve `TBD` decisions.
|
|
42
|
-
|
|
43
|
-
Do not rewrite the Feature's substance — its Goal, Context, Requirements, Out of
|
|
44
|
-
Scope, Delivery Chunks, or Acceptance Criteria. `## Status` is the one field this
|
|
45
|
-
action maintains.
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
# Feature: Review
|
|
2
|
-
|
|
3
|
-
Review the actual diff and behavior, not only the developer's summary.
|
|
4
|
-
|
|
5
|
-
## Check
|
|
6
|
-
|
|
7
|
-
- acceptance criteria
|
|
8
|
-
- regressions and important edge cases
|
|
9
|
-
- security/privacy when relevant
|
|
10
|
-
- accessibility, performance, compatibility, and operations when relevant
|
|
11
|
-
- tests and verification
|
|
12
|
-
- scope creep
|
|
13
|
-
- documentation accuracy
|
|
14
|
-
|
|
15
|
-
Use the project's quality priorities and existing standards where relevant.
|
|
16
|
-
|
|
17
|
-
## Output
|
|
18
|
-
|
|
19
|
-
Report:
|
|
20
|
-
|
|
21
|
-
- `PASS`, or findings by severity
|
|
22
|
-
- file/location and impact for each finding
|
|
23
|
-
- what was actually verified
|
|
24
|
-
- anything important that remains unverified
|
|
25
|
-
|
|
26
|
-
Do not modify the implementation unless the human explicitly asks.
|
|
27
|
-
|
|
28
|
-
Do not invent findings or treat passing tests as automatic acceptance.
|
|
29
|
-
|
|
30
|
-
Do not write the Feature's `## Status`. Review is workflow activity, not
|
|
31
|
-
lifecycle state, and a reviewed Feature stays `In Progress` until it is
|
|
32
|
-
completed.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
# Feature: Start
|
|
2
|
-
|
|
3
|
-
Implement the active delivery chunk.
|
|
4
|
-
|
|
5
|
-
1. Read only the context needed for the current work.
|
|
6
|
-
2. Restate the pre-implementation summary the project's agent guide requires,
|
|
7
|
-
and wait for it to be answered where it names a human decision. Do not edit
|
|
8
|
-
any file before this step is done.
|
|
9
|
-
3. Record the Feature spec's `## Status` as `In Progress`, before the first file
|
|
10
|
-
edit of the first chunk:
|
|
11
|
-
- `Ready` becomes `In Progress`. That is the only value this action writes.
|
|
12
|
-
- `In Progress` is left exactly as it is. Continuing a Feature across
|
|
13
|
-
sessions and chunks is normal and must not rewrite its state.
|
|
14
|
-
- Any other status stops the session. Report it. A Feature that was never
|
|
15
|
-
loaded is not approved for execution, and terminal work is the human's to
|
|
16
|
-
reopen.
|
|
17
|
-
4. Follow the Feature and existing project conventions.
|
|
18
|
-
5. Make the smallest complete change.
|
|
19
|
-
6. Verify the behavior you changed.
|
|
20
|
-
7. Keep the repository stable.
|
|
21
|
-
8. Create or update `context/current-feature.md` with the current state and next
|
|
22
|
-
action. Do not record the lifecycle status there; the spec carries it.
|
|
23
|
-
|
|
24
|
-
## Rules
|
|
25
|
-
|
|
26
|
-
- Stay inside the approved scope.
|
|
27
|
-
- Stop if implementation requires a human decision or material scope change.
|
|
28
|
-
- Do not silently add dependencies or adopt prototype code.
|
|
29
|
-
- Follow the project's approval and Git rules.
|
|
30
|
-
- Do not decide that your own work is accepted.
|
|
31
|
-
|
|
32
|
-
When the chunk is done, report what changed, what was verified, and anything
|
|
33
|
-
unresolved.
|
|
@@ -1,81 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: sync-tracker
|
|
3
|
-
description: Project Feature specs onto the configured work tracker.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Sync Tracker
|
|
7
|
-
|
|
8
|
-
Sync project Features to the tracker configured in `context/tracker.md`.
|
|
9
|
-
|
|
10
|
-
The repository is canonical.
|
|
11
|
-
Tracker state never changes Pathfinder state.
|
|
12
|
-
|
|
13
|
-
## Process
|
|
14
|
-
|
|
15
|
-
1. If `context/tracker.md` does not exist, report that tracking is not
|
|
16
|
-
configured and stop. Do not propose configuring one.
|
|
17
|
-
2. Read the tracker configuration. It names the tracker, how to reach it, the
|
|
18
|
-
spec source, and how a published item records its Pathfinder key. Stop if it
|
|
19
|
-
does not say how the key is recorded — without it a re-run cannot recognise
|
|
20
|
-
what it published last time, and would duplicate every item.
|
|
21
|
-
3. Read the approved Feature specs from the spec source. A config that names
|
|
22
|
-
none means `context/features/`. If the named source does not exist, report
|
|
23
|
-
it and stop rather than falling back.
|
|
24
|
-
4. Build one item per Feature: key, title, and body, composed only from the
|
|
25
|
-
spec.
|
|
26
|
-
5. Show the proposed writes.
|
|
27
|
-
6. Ask before the first write that leaves this repository. One approval covers
|
|
28
|
-
the run. A projection onto files inside the repository is an ordinary file
|
|
29
|
-
write and is not gated.
|
|
30
|
-
7. Create or update only the items that changed.
|
|
31
|
-
8. Report created, updated, and unchanged as counts of writes, not as final
|
|
32
|
-
tracker state.
|
|
33
|
-
|
|
34
|
-
## Identity
|
|
35
|
-
|
|
36
|
-
Each Feature has one stable key derived from the number in its spec filename.
|
|
37
|
-
`to-specs` names every spec `NN-feature-name.md`, so
|
|
38
|
-
`27-export-saved-searches.md` is `pathfinder:feature/27` in whichever directory
|
|
39
|
-
it sits — moving specs orphans nothing.
|
|
40
|
-
|
|
41
|
-
Read the number from the basename only. Never from the directory above it, the
|
|
42
|
-
title inside it, or the order the specs happen to be read in.
|
|
43
|
-
|
|
44
|
-
Match published items on that key alone. Titles are edited by humans.
|
|
45
|
-
|
|
46
|
-
Skip a spec whose filename carries no number and report it by name. Do not
|
|
47
|
-
assign one — numbering is `to-specs`' job, and inventing one here would publish
|
|
48
|
-
an item that the next run cannot recognise.
|
|
49
|
-
|
|
50
|
-
## Idempotency
|
|
51
|
-
|
|
52
|
-
A second run over unchanged Features must issue **zero writes** — not writes
|
|
53
|
-
that happen to be no-ops.
|
|
54
|
-
|
|
55
|
-
- Compose the body as a pure function of the spec: fixed section order, no
|
|
56
|
-
timestamps, no counters, nothing derived from the run.
|
|
57
|
-
- Compare normalized, never raw bytes. Strip trailing whitespace per line and
|
|
58
|
-
collapse trailing blank lines, on both sides. A tracker is not obliged to
|
|
59
|
-
return a body byte-for-byte, and a naive comparison then rewrites every item
|
|
60
|
-
forever while looking like working sync.
|
|
61
|
-
- Where the config defines tags, compare them as sets, not ordered lists.
|
|
62
|
-
- Edit in place. Never close, reopen, delete, or recreate an item.
|
|
63
|
-
- Leave any item whose key is absent from this run completely alone.
|
|
64
|
-
|
|
65
|
-
`3 items, 0 changes` is the expected second run and the most important line of
|
|
66
|
-
output.
|
|
67
|
-
|
|
68
|
-
## Rules
|
|
69
|
-
|
|
70
|
-
- Do not decompose Features into tickets.
|
|
71
|
-
- Do not derive dependency edges, ordering, or a graph from a spec. A Feature
|
|
72
|
-
may mention a dependency under `## Notes / Decisions` for a human to read;
|
|
73
|
-
it is prose, not structure, and this skill does not parse or orchestrate it.
|
|
74
|
-
- Do not infer labels, tags, status, or other metadata.
|
|
75
|
-
- Do not modify Feature specs from tracker state.
|
|
76
|
-
- Do not read tracker state back into anything.
|
|
77
|
-
- Do not delete tracker items automatically.
|
|
78
|
-
- Do not rewrite unchanged items.
|
|
79
|
-
- Local Markdown tracking is an ordinary repository/file write.
|
|
80
|
-
- External trackers require human approval before writing.
|
|
81
|
-
- Stop and report when the config, the specs, and the tracker disagree.
|