@harness-engineering/cli 1.16.0 → 1.18.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.
Files changed (49) hide show
  1. package/dist/agents/skills/claude-code/harness-roadmap-pilot/SKILL.md +204 -0
  2. package/dist/agents/skills/claude-code/harness-roadmap-pilot/skill.yaml +52 -0
  3. package/dist/agents/skills/codex/harness-roadmap-pilot/SKILL.md +204 -0
  4. package/dist/agents/skills/codex/harness-roadmap-pilot/skill.yaml +52 -0
  5. package/dist/agents/skills/cursor/harness-roadmap-pilot/SKILL.md +204 -0
  6. package/dist/agents/skills/cursor/harness-roadmap-pilot/skill.yaml +52 -0
  7. package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/SKILL.md +204 -0
  8. package/dist/agents/skills/gemini-cli/harness-roadmap-pilot/skill.yaml +52 -0
  9. package/dist/agents/skills/package.json +5 -5
  10. package/dist/{agents-md-VYDFPIRW.js → agents-md-DUYNKHJZ.js} +1 -1
  11. package/dist/{architecture-K5HSRBGB.js → architecture-UBO5KKUV.js} +2 -2
  12. package/dist/bin/harness-mcp.js +13 -12
  13. package/dist/bin/harness.js +18 -15
  14. package/dist/{check-phase-gate-5AS6SXL6.js → check-phase-gate-OSHN2AEL.js} +3 -3
  15. package/dist/{chunk-JOP2NDNB.js → chunk-2DMIQ35P.js} +151 -79
  16. package/dist/{chunk-TF6ZLHJV.js → chunk-5FM64G6D.js} +2 -2
  17. package/dist/{chunk-5ZXHMCPL.js → chunk-ABQUCXRE.js} +2 -1
  18. package/dist/{chunk-AV6KMDO5.js → chunk-APNPXLB2.js} +4 -4
  19. package/dist/{chunk-FTMXDOR6.js → chunk-CZZXE6BL.js} +1 -1
  20. package/dist/{chunk-SFRGPAK6.js → chunk-GWXP3JVA.js} +3 -3
  21. package/dist/{chunk-SHYWICGA.js → chunk-OA3MOZGG.js} +22 -22
  22. package/dist/{chunk-RWZPHW4H.js → chunk-OHZVGIPE.js} +9 -9
  23. package/dist/{chunk-C7DTKLPW.js → chunk-QSRRBNLY.js} +8 -8
  24. package/dist/{chunk-QDF7COPQ.js → chunk-TG7IUJ3J.js} +1 -1
  25. package/dist/{chunk-DNDBFIZN.js → chunk-TZIHFNEG.js} +7 -7
  26. package/dist/{chunk-ZJMU7MEV.js → chunk-UX3JHYEA.js} +1 -1
  27. package/dist/{chunk-ALFKNAZW.js → chunk-VF23UTNB.js} +545 -36
  28. package/dist/{chunk-7MJAPE3Z.js → chunk-YLN34N65.js} +1 -0
  29. package/dist/{chunk-OCDDCGDE.js → chunk-ZA2I7S3E.js} +20 -1
  30. package/dist/{ci-workflow-CRWU723U.js → ci-workflow-FJZMNZPT.js} +1 -1
  31. package/dist/{dist-4LPXJYVZ.js → dist-MF5BK5AD.js} +19 -1
  32. package/dist/{dist-B26DFXMP.js → dist-U7EAO6T2.js} +110 -60
  33. package/dist/{docs-4JRHTLUZ.js → docs-WZHW4N4P.js} +3 -3
  34. package/dist/{engine-3G3VIM6L.js → engine-VS6ZJ2VZ.js} +2 -2
  35. package/dist/{entropy-G6CZ2A6P.js → entropy-FCIGJIIT.js} +2 -2
  36. package/dist/{feedback-QYKQ65HB.js → feedback-O3FYTZIE.js} +1 -1
  37. package/dist/{generate-agent-definitions-SAAOAPT4.js → generate-agent-definitions-EYG263XD.js} +1 -1
  38. package/dist/{graph-loader-2M2HXDQI.js → graph-loader-KMHDQYDT.js} +1 -1
  39. package/dist/index.d.ts +70 -11
  40. package/dist/index.js +15 -15
  41. package/dist/{loader-VCOK3PF7.js → loader-B4XWX4K6.js} +1 -1
  42. package/dist/{mcp-YENEPHBW.js → mcp-DVVUODN7.js} +12 -12
  43. package/dist/{performance-UBCFI2UP.js → performance-NMJDV6HF.js} +3 -3
  44. package/dist/{review-pipeline-IQAVCWAX.js → review-pipeline-MSEJWTKM.js} +1 -1
  45. package/dist/{runtime-PYFFIESU.js → runtime-YHVLJNPG.js} +1 -1
  46. package/dist/{security-ZDADTPYW.js → security-HTDKKGMX.js} +1 -1
  47. package/dist/{validate-VRTUHALQ.js → validate-SPSTH2YW.js} +2 -2
  48. package/dist/{validate-cross-check-4Y6NHNK3.js → validate-cross-check-YTDWIMFI.js} +1 -1
  49. package/package.json +21 -21
@@ -0,0 +1,204 @@
1
+ # Harness Roadmap Pilot
2
+
3
+ > AI-assisted selection of the next highest-impact unblocked roadmap item. Scores candidates, recommends one, assigns it, and transitions to the appropriate next skill.
4
+
5
+ ## When to Use
6
+
7
+ - When the team or individual needs to pick the next item to work on from the roadmap
8
+ - When there are multiple unblocked items and prioritization guidance is needed
9
+ - After completing a feature and looking for the next highest-impact work
10
+ - NOT when the roadmap does not exist (direct user to harness-roadmap --create)
11
+ - NOT when the user already knows what to work on (use harness-brainstorming or harness-autopilot directly)
12
+
13
+ ## Process
14
+
15
+ ### Iron Law
16
+
17
+ **Never assign or transition without the human confirming the recommendation first.**
18
+
19
+ Present the ranked candidates, the AI reasoning, and the recommended pick. Wait for explicit confirmation before making any changes.
20
+
21
+ ---
22
+
23
+ ### Phase 1: SCAN -- Score Candidates
24
+
25
+ 1. Check if `docs/roadmap.md` exists.
26
+ - If missing: error. "No roadmap found at docs/roadmap.md. Run harness-roadmap --create first."
27
+ 2. Parse the roadmap using `parseRoadmap` from `@harness-engineering/core`.
28
+ 3. Determine the current user:
29
+ - Use the `--user` argument if provided
30
+ - Otherwise, attempt to detect from git config: `git config user.name` or `git config user.email`
31
+ - If neither available, proceed without affinity scoring
32
+ 4. Call `scoreRoadmapCandidates(roadmap, { currentUser })` from `@harness-engineering/core`.
33
+ 5. If no candidates: inform the human. "No unblocked planned or backlog items found. All items are either in-progress, done, blocked, or the roadmap is empty."
34
+
35
+ Present the top 5 candidates:
36
+
37
+ ```
38
+ ROADMAP PILOT -- Candidate Scoring
39
+
40
+ Top candidates (scored by position 50%, dependents 30%, affinity 20%):
41
+
42
+ # Feature Milestone Priority Score Breakdown
43
+ 1. Feature A MVP Release P0 0.85 pos:0.9 dep:0.8 aff:1.0
44
+ 2. Feature B MVP Release P1 0.72 pos:0.8 dep:0.6 aff:0.5
45
+ 3. Feature C Q2 Release -- 0.65 pos:0.7 dep:0.5 aff:0.0
46
+ 4. Feature D Backlog -- 0.40 pos:0.3 dep:0.4 aff:0.0
47
+ 5. Feature E Backlog -- 0.35 pos:0.2 dep:0.3 aff:0.0
48
+ ```
49
+
50
+ ### Phase 2: RECOMMEND -- AI-Assisted Analysis
51
+
52
+ 1. For the top 3 candidates, read their spec files (if they exist):
53
+ - Read the spec's Overview and Goals section
54
+ - Read the spec's Success Criteria section
55
+ - Assess effort and impact from the spec content
56
+
57
+ 2. Provide a recommendation with reasoning:
58
+
59
+ ```
60
+ RECOMMENDATION
61
+
62
+ I recommend Feature A (MVP Release, P0, score: 0.85).
63
+
64
+ Reasoning:
65
+ - Highest priority (P0) with strong positional signal (first in MVP milestone)
66
+ - Unblocks 2 downstream features (Feature X, Feature Y)
67
+ - You completed its blocker "Foundation" -- high context affinity
68
+ - Spec exists with clear success criteria (12 acceptance tests)
69
+ - Estimated effort: medium (8 tasks in the plan)
70
+
71
+ Alternative: Feature B (P1, score: 0.72) -- consider if Feature A's scope is too large for the current time window.
72
+
73
+ Proceed with Feature A? (y/n/pick another)
74
+ ```
75
+
76
+ ### Phase 3: CONFIRM -- Human Decision
77
+
78
+ 1. Wait for human confirmation.
79
+ - If **yes**: proceed to Phase 4.
80
+ - If **pick another**: ask which candidate number, then proceed with that pick.
81
+ - If **no**: stop. No changes made.
82
+
83
+ ### Phase 4: ASSIGN -- Execute Assignment and Transition
84
+
85
+ 1. Call `assignFeature(roadmap, feature, currentUser, todayDate)` from `@harness-engineering/core`.
86
+ - This updates the feature's `Assignee` field
87
+ - Appends `assigned` record to assignment history (and `unassigned` for previous assignee if reassignment)
88
+
89
+ 2. Serialize and write the updated roadmap to `docs/roadmap.md`.
90
+
91
+ 3. If tracker config exists in `harness.config.json`, sync the assignment:
92
+ - Call the external tracker's `assignTicket` to push the assignment
93
+ - Log result but do not block on failure
94
+
95
+ 4. Determine the transition target:
96
+ - If the feature has a `spec` field (non-null): transition to `harness:autopilot`
97
+ - If the feature has no `spec`: transition to `harness:brainstorming`
98
+
99
+ 5. Present the transition to the human via `emit_interaction`:
100
+
101
+ ```json
102
+ emit_interaction({
103
+ path: "<project-root>",
104
+ type: "transition",
105
+ transition: {
106
+ completedPhase: "roadmap-pilot",
107
+ suggestedNext: "<brainstorming|autopilot>",
108
+ reason: "Feature '<name>' assigned and ready for <brainstorming|execution>",
109
+ artifacts: ["docs/roadmap.md"],
110
+ requiresConfirmation: true,
111
+ summary: "Assigned '<name>' to <user>. <Spec exists -- ready for autopilot|No spec -- needs brainstorming first>.",
112
+ qualityGate: {
113
+ checks: [
114
+ { "name": "roadmap-parsed", "passed": true },
115
+ { "name": "candidate-scored", "passed": true },
116
+ { "name": "human-confirmed", "passed": true },
117
+ { "name": "assignment-written", "passed": true }
118
+ ],
119
+ allPassed: true
120
+ }
121
+ }
122
+ })
123
+ ```
124
+
125
+ 6. Run `harness validate`.
126
+
127
+ ---
128
+
129
+ ## Harness Integration
130
+
131
+ - **`parseRoadmap` / `serializeRoadmap`** -- Parse and write `docs/roadmap.md`. Import from `@harness-engineering/core`.
132
+ - **`scoreRoadmapCandidates`** -- Core scoring algorithm. Import from `@harness-engineering/core`. Takes a `Roadmap` and optional `PilotScoringOptions` (currentUser for affinity).
133
+ - **`assignFeature`** -- Assignment with history tracking. Import from `@harness-engineering/core`. Handles new assignment and reassignment (unassigned + assigned records).
134
+ - **`emit_interaction`** -- Used for the skill transition at the end. Transitions to `harness:brainstorming` (no spec) or `harness:autopilot` (spec exists).
135
+ - **`harness validate`** -- Run after assignment is written.
136
+ - **External sync** -- If `harness.config.json` has tracker config, use `fullSync` or direct `assignTicket` to push assignment to external service.
137
+
138
+ ## Success Criteria
139
+
140
+ 1. Roadmap is parsed and unblocked planned/backlog items are scored
141
+ 2. Scoring uses two-tier sort: explicit priority first, then weighted score
142
+ 3. AI reads top candidates' specs and provides recommendation with reasoning
143
+ 4. Human confirms before any changes are made
144
+ 5. Assignment updates feature field, appends history records, and syncs externally
145
+ 6. Reassignment produces two history records (unassigned + assigned)
146
+ 7. Transition routes to brainstorming (no spec) or autopilot (spec exists)
147
+ 8. `harness validate` passes after all changes
148
+
149
+ ## Examples
150
+
151
+ ### Example: Pick Next Item from a Multi-Milestone Roadmap
152
+
153
+ **Context:** A roadmap with 3 milestones, 8 features. 2 are in-progress, 1 is done, 2 are blocked, 3 are planned/backlog and unblocked. User is @cwarner who completed "Core Library Design".
154
+
155
+ **Phase 1: SCAN**
156
+
157
+ ```
158
+ ROADMAP PILOT -- Candidate Scoring
159
+
160
+ Top candidates:
161
+ # Feature Milestone Priority Score Breakdown
162
+ 1. Graph Connector MVP Release P2 0.78 pos:0.8 dep:0.6 aff:1.0
163
+ 2. Performance Baselines Q3 Hardening -- 0.45 pos:0.5 dep:0.3 aff:0.0
164
+ 3. Push Notifications Backlog -- 0.30 pos:0.2 dep:0.2 aff:0.5
165
+ ```
166
+
167
+ **Phase 2: RECOMMEND**
168
+
169
+ ```
170
+ I recommend Graph Connector (MVP Release, P2, score: 0.78).
171
+
172
+ Reasoning:
173
+ - Only prioritized item among candidates (P2)
174
+ - You completed its blocker "Core Library Design" -- maximum affinity bonus
175
+ - Unblocks "API Integration" downstream
176
+ - Spec exists at docs/changes/graph-connector/proposal.md
177
+
178
+ Proceed? (y/n/pick another)
179
+ ```
180
+
181
+ Human confirms **y**.
182
+
183
+ **Phase 4: ASSIGN**
184
+
185
+ ```
186
+ Assigned: Graph Connector -> @cwarner
187
+ History: +1 record (assigned, 2026-04-02)
188
+ Roadmap updated: docs/roadmap.md
189
+ External sync: github:harness-eng/harness#43 assigned
190
+
191
+ Transitioning to harness:autopilot (spec exists)...
192
+ ```
193
+
194
+ ## Gates
195
+
196
+ - **No assignment without human confirmation.** The CONFIRM phase must complete with explicit approval. Never auto-assign.
197
+ - **No transition without assignment.** The skill must write the assignment before transitioning to the next skill.
198
+ - **No scoring without a parsed roadmap.** If `docs/roadmap.md` does not exist or fails to parse, stop with an error.
199
+
200
+ ## Escalation
201
+
202
+ - **When no unblocked candidates exist:** Inform the human. Suggest reviewing blocked items to see if blockers can be resolved, or adding new features via `harness-roadmap --add`.
203
+ - **When affinity data is unavailable:** Proceed without affinity scoring (weight falls to 0 for all candidates). Note this in the output.
204
+ - **When external sync fails:** Log the error, complete the local assignment, and note that external sync can be retried with `harness-roadmap --sync`.
@@ -0,0 +1,52 @@
1
+ name: harness-roadmap-pilot
2
+ version: "1.0.0"
3
+ description: AI-assisted selection of the next highest-impact roadmap item with scoring, assignment, and skill transition
4
+ cognitive_mode: constructive-architect
5
+ triggers:
6
+ - manual
7
+ platforms:
8
+ - claude-code
9
+ - gemini-cli
10
+ tools:
11
+ - Bash
12
+ - Read
13
+ - Write
14
+ - Edit
15
+ - Glob
16
+ - Grep
17
+ - emit_interaction
18
+ cli:
19
+ command: harness skill run harness-roadmap-pilot
20
+ args:
21
+ - name: path
22
+ description: Project root path
23
+ required: false
24
+ - name: user
25
+ description: "Current user identifier (e.g., @cwarner) for affinity matching"
26
+ required: false
27
+ mcp:
28
+ tool: run_skill
29
+ input:
30
+ skill: harness-roadmap-pilot
31
+ path: string
32
+ type: rigid
33
+ tier: 2
34
+ phases:
35
+ - name: scan
36
+ description: Parse roadmap, filter unblocked candidates, compute scores
37
+ required: true
38
+ - name: recommend
39
+ description: AI reads top candidates specs and provides recommendation
40
+ required: true
41
+ - name: confirm
42
+ description: Present recommendation to human for approval
43
+ required: true
44
+ - name: assign
45
+ description: Update assignee, history, sync external, transition to next skill
46
+ required: true
47
+ state:
48
+ persistent: false
49
+ depends_on:
50
+ - harness-brainstorming
51
+ - harness-autopilot
52
+ - harness-roadmap
@@ -0,0 +1,204 @@
1
+ # Harness Roadmap Pilot
2
+
3
+ > AI-assisted selection of the next highest-impact unblocked roadmap item. Scores candidates, recommends one, assigns it, and transitions to the appropriate next skill.
4
+
5
+ ## When to Use
6
+
7
+ - When the team or individual needs to pick the next item to work on from the roadmap
8
+ - When there are multiple unblocked items and prioritization guidance is needed
9
+ - After completing a feature and looking for the next highest-impact work
10
+ - NOT when the roadmap does not exist (direct user to harness-roadmap --create)
11
+ - NOT when the user already knows what to work on (use harness-brainstorming or harness-autopilot directly)
12
+
13
+ ## Process
14
+
15
+ ### Iron Law
16
+
17
+ **Never assign or transition without the human confirming the recommendation first.**
18
+
19
+ Present the ranked candidates, the AI reasoning, and the recommended pick. Wait for explicit confirmation before making any changes.
20
+
21
+ ---
22
+
23
+ ### Phase 1: SCAN -- Score Candidates
24
+
25
+ 1. Check if `docs/roadmap.md` exists.
26
+ - If missing: error. "No roadmap found at docs/roadmap.md. Run harness-roadmap --create first."
27
+ 2. Parse the roadmap using `parseRoadmap` from `@harness-engineering/core`.
28
+ 3. Determine the current user:
29
+ - Use the `--user` argument if provided
30
+ - Otherwise, attempt to detect from git config: `git config user.name` or `git config user.email`
31
+ - If neither available, proceed without affinity scoring
32
+ 4. Call `scoreRoadmapCandidates(roadmap, { currentUser })` from `@harness-engineering/core`.
33
+ 5. If no candidates: inform the human. "No unblocked planned or backlog items found. All items are either in-progress, done, blocked, or the roadmap is empty."
34
+
35
+ Present the top 5 candidates:
36
+
37
+ ```
38
+ ROADMAP PILOT -- Candidate Scoring
39
+
40
+ Top candidates (scored by position 50%, dependents 30%, affinity 20%):
41
+
42
+ # Feature Milestone Priority Score Breakdown
43
+ 1. Feature A MVP Release P0 0.85 pos:0.9 dep:0.8 aff:1.0
44
+ 2. Feature B MVP Release P1 0.72 pos:0.8 dep:0.6 aff:0.5
45
+ 3. Feature C Q2 Release -- 0.65 pos:0.7 dep:0.5 aff:0.0
46
+ 4. Feature D Backlog -- 0.40 pos:0.3 dep:0.4 aff:0.0
47
+ 5. Feature E Backlog -- 0.35 pos:0.2 dep:0.3 aff:0.0
48
+ ```
49
+
50
+ ### Phase 2: RECOMMEND -- AI-Assisted Analysis
51
+
52
+ 1. For the top 3 candidates, read their spec files (if they exist):
53
+ - Read the spec's Overview and Goals section
54
+ - Read the spec's Success Criteria section
55
+ - Assess effort and impact from the spec content
56
+
57
+ 2. Provide a recommendation with reasoning:
58
+
59
+ ```
60
+ RECOMMENDATION
61
+
62
+ I recommend Feature A (MVP Release, P0, score: 0.85).
63
+
64
+ Reasoning:
65
+ - Highest priority (P0) with strong positional signal (first in MVP milestone)
66
+ - Unblocks 2 downstream features (Feature X, Feature Y)
67
+ - You completed its blocker "Foundation" -- high context affinity
68
+ - Spec exists with clear success criteria (12 acceptance tests)
69
+ - Estimated effort: medium (8 tasks in the plan)
70
+
71
+ Alternative: Feature B (P1, score: 0.72) -- consider if Feature A's scope is too large for the current time window.
72
+
73
+ Proceed with Feature A? (y/n/pick another)
74
+ ```
75
+
76
+ ### Phase 3: CONFIRM -- Human Decision
77
+
78
+ 1. Wait for human confirmation.
79
+ - If **yes**: proceed to Phase 4.
80
+ - If **pick another**: ask which candidate number, then proceed with that pick.
81
+ - If **no**: stop. No changes made.
82
+
83
+ ### Phase 4: ASSIGN -- Execute Assignment and Transition
84
+
85
+ 1. Call `assignFeature(roadmap, feature, currentUser, todayDate)` from `@harness-engineering/core`.
86
+ - This updates the feature's `Assignee` field
87
+ - Appends `assigned` record to assignment history (and `unassigned` for previous assignee if reassignment)
88
+
89
+ 2. Serialize and write the updated roadmap to `docs/roadmap.md`.
90
+
91
+ 3. If tracker config exists in `harness.config.json`, sync the assignment:
92
+ - Call the external tracker's `assignTicket` to push the assignment
93
+ - Log result but do not block on failure
94
+
95
+ 4. Determine the transition target:
96
+ - If the feature has a `spec` field (non-null): transition to `harness:autopilot`
97
+ - If the feature has no `spec`: transition to `harness:brainstorming`
98
+
99
+ 5. Present the transition to the human via `emit_interaction`:
100
+
101
+ ```json
102
+ emit_interaction({
103
+ path: "<project-root>",
104
+ type: "transition",
105
+ transition: {
106
+ completedPhase: "roadmap-pilot",
107
+ suggestedNext: "<brainstorming|autopilot>",
108
+ reason: "Feature '<name>' assigned and ready for <brainstorming|execution>",
109
+ artifacts: ["docs/roadmap.md"],
110
+ requiresConfirmation: true,
111
+ summary: "Assigned '<name>' to <user>. <Spec exists -- ready for autopilot|No spec -- needs brainstorming first>.",
112
+ qualityGate: {
113
+ checks: [
114
+ { "name": "roadmap-parsed", "passed": true },
115
+ { "name": "candidate-scored", "passed": true },
116
+ { "name": "human-confirmed", "passed": true },
117
+ { "name": "assignment-written", "passed": true }
118
+ ],
119
+ allPassed: true
120
+ }
121
+ }
122
+ })
123
+ ```
124
+
125
+ 6. Run `harness validate`.
126
+
127
+ ---
128
+
129
+ ## Harness Integration
130
+
131
+ - **`parseRoadmap` / `serializeRoadmap`** -- Parse and write `docs/roadmap.md`. Import from `@harness-engineering/core`.
132
+ - **`scoreRoadmapCandidates`** -- Core scoring algorithm. Import from `@harness-engineering/core`. Takes a `Roadmap` and optional `PilotScoringOptions` (currentUser for affinity).
133
+ - **`assignFeature`** -- Assignment with history tracking. Import from `@harness-engineering/core`. Handles new assignment and reassignment (unassigned + assigned records).
134
+ - **`emit_interaction`** -- Used for the skill transition at the end. Transitions to `harness:brainstorming` (no spec) or `harness:autopilot` (spec exists).
135
+ - **`harness validate`** -- Run after assignment is written.
136
+ - **External sync** -- If `harness.config.json` has tracker config, use `fullSync` or direct `assignTicket` to push assignment to external service.
137
+
138
+ ## Success Criteria
139
+
140
+ 1. Roadmap is parsed and unblocked planned/backlog items are scored
141
+ 2. Scoring uses two-tier sort: explicit priority first, then weighted score
142
+ 3. AI reads top candidates' specs and provides recommendation with reasoning
143
+ 4. Human confirms before any changes are made
144
+ 5. Assignment updates feature field, appends history records, and syncs externally
145
+ 6. Reassignment produces two history records (unassigned + assigned)
146
+ 7. Transition routes to brainstorming (no spec) or autopilot (spec exists)
147
+ 8. `harness validate` passes after all changes
148
+
149
+ ## Examples
150
+
151
+ ### Example: Pick Next Item from a Multi-Milestone Roadmap
152
+
153
+ **Context:** A roadmap with 3 milestones, 8 features. 2 are in-progress, 1 is done, 2 are blocked, 3 are planned/backlog and unblocked. User is @cwarner who completed "Core Library Design".
154
+
155
+ **Phase 1: SCAN**
156
+
157
+ ```
158
+ ROADMAP PILOT -- Candidate Scoring
159
+
160
+ Top candidates:
161
+ # Feature Milestone Priority Score Breakdown
162
+ 1. Graph Connector MVP Release P2 0.78 pos:0.8 dep:0.6 aff:1.0
163
+ 2. Performance Baselines Q3 Hardening -- 0.45 pos:0.5 dep:0.3 aff:0.0
164
+ 3. Push Notifications Backlog -- 0.30 pos:0.2 dep:0.2 aff:0.5
165
+ ```
166
+
167
+ **Phase 2: RECOMMEND**
168
+
169
+ ```
170
+ I recommend Graph Connector (MVP Release, P2, score: 0.78).
171
+
172
+ Reasoning:
173
+ - Only prioritized item among candidates (P2)
174
+ - You completed its blocker "Core Library Design" -- maximum affinity bonus
175
+ - Unblocks "API Integration" downstream
176
+ - Spec exists at docs/changes/graph-connector/proposal.md
177
+
178
+ Proceed? (y/n/pick another)
179
+ ```
180
+
181
+ Human confirms **y**.
182
+
183
+ **Phase 4: ASSIGN**
184
+
185
+ ```
186
+ Assigned: Graph Connector -> @cwarner
187
+ History: +1 record (assigned, 2026-04-02)
188
+ Roadmap updated: docs/roadmap.md
189
+ External sync: github:harness-eng/harness#43 assigned
190
+
191
+ Transitioning to harness:autopilot (spec exists)...
192
+ ```
193
+
194
+ ## Gates
195
+
196
+ - **No assignment without human confirmation.** The CONFIRM phase must complete with explicit approval. Never auto-assign.
197
+ - **No transition without assignment.** The skill must write the assignment before transitioning to the next skill.
198
+ - **No scoring without a parsed roadmap.** If `docs/roadmap.md` does not exist or fails to parse, stop with an error.
199
+
200
+ ## Escalation
201
+
202
+ - **When no unblocked candidates exist:** Inform the human. Suggest reviewing blocked items to see if blockers can be resolved, or adding new features via `harness-roadmap --add`.
203
+ - **When affinity data is unavailable:** Proceed without affinity scoring (weight falls to 0 for all candidates). Note this in the output.
204
+ - **When external sync fails:** Log the error, complete the local assignment, and note that external sync can be retried with `harness-roadmap --sync`.
@@ -0,0 +1,52 @@
1
+ name: harness-roadmap-pilot
2
+ version: "1.0.0"
3
+ description: AI-assisted selection of the next highest-impact roadmap item with scoring, assignment, and skill transition
4
+ cognitive_mode: constructive-architect
5
+ triggers:
6
+ - manual
7
+ platforms:
8
+ - claude-code
9
+ - gemini-cli
10
+ tools:
11
+ - Bash
12
+ - Read
13
+ - Write
14
+ - Edit
15
+ - Glob
16
+ - Grep
17
+ - emit_interaction
18
+ cli:
19
+ command: harness skill run harness-roadmap-pilot
20
+ args:
21
+ - name: path
22
+ description: Project root path
23
+ required: false
24
+ - name: user
25
+ description: "Current user identifier (e.g., @cwarner) for affinity matching"
26
+ required: false
27
+ mcp:
28
+ tool: run_skill
29
+ input:
30
+ skill: harness-roadmap-pilot
31
+ path: string
32
+ type: rigid
33
+ tier: 2
34
+ phases:
35
+ - name: scan
36
+ description: Parse roadmap, filter unblocked candidates, compute scores
37
+ required: true
38
+ - name: recommend
39
+ description: AI reads top candidates specs and provides recommendation
40
+ required: true
41
+ - name: confirm
42
+ description: Present recommendation to human for approval
43
+ required: true
44
+ - name: assign
45
+ description: Update assignee, history, sync external, transition to next skill
46
+ required: true
47
+ state:
48
+ persistent: false
49
+ depends_on:
50
+ - harness-brainstorming
51
+ - harness-autopilot
52
+ - harness-roadmap
@@ -9,10 +9,10 @@
9
9
  "test:coverage": "vitest run --coverage"
10
10
  },
11
11
  "devDependencies": {
12
- "@vitest/coverage-v8": "^4.0.18",
13
- "glob": "^10.3.0",
14
- "vitest": "^4.0.18",
15
- "yaml": "^2.3.0",
16
- "zod": "^3.22.0"
12
+ "@vitest/coverage-v8": "^4.1.2",
13
+ "glob": "^10.5.0",
14
+ "vitest": "^4.1.2",
15
+ "yaml": "^2.8.3",
16
+ "zod": "^3.25.76"
17
17
  }
18
18
  }
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  generateAgentsMd
3
3
  } from "./chunk-OD3S2NHN.js";
4
- import "./chunk-ALFKNAZW.js";
4
+ import "./chunk-VF23UTNB.js";
5
5
  import "./chunk-ERS5EVUZ.js";
6
6
  export {
7
7
  generateAgentsMd
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  checkDependenciesDefinition,
3
3
  handleCheckDependencies
4
- } from "./chunk-SFRGPAK6.js";
4
+ } from "./chunk-GWXP3JVA.js";
5
5
  import "./chunk-H7Y5CKTM.js";
6
6
  import "./chunk-IDZNPTYD.js";
7
7
  import "./chunk-W6Y7ZW3Y.js";
8
- import "./chunk-ALFKNAZW.js";
8
+ import "./chunk-VF23UTNB.js";
9
9
  import "./chunk-ERS5EVUZ.js";
10
10
  export {
11
11
  checkDependenciesDefinition,
@@ -1,28 +1,29 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  startServer
4
- } from "../chunk-JOP2NDNB.js";
5
- import "../chunk-AV6KMDO5.js";
6
- import "../chunk-DNDBFIZN.js";
7
- import "../chunk-RWZPHW4H.js";
8
- import "../chunk-QDF7COPQ.js";
9
- import "../chunk-ZJMU7MEV.js";
4
+ } from "../chunk-2DMIQ35P.js";
5
+ import "../chunk-APNPXLB2.js";
6
+ import "../chunk-TZIHFNEG.js";
7
+ import "../chunk-OHZVGIPE.js";
8
+ import "../chunk-TG7IUJ3J.js";
9
+ import "../chunk-UX3JHYEA.js";
10
10
  import "../chunk-CJDVBBPB.js";
11
- import "../chunk-TF6ZLHJV.js";
12
- import "../chunk-FTMXDOR6.js";
13
- import "../chunk-SFRGPAK6.js";
11
+ import "../chunk-5FM64G6D.js";
12
+ import "../chunk-CZZXE6BL.js";
13
+ import "../chunk-GWXP3JVA.js";
14
14
  import "../chunk-H7Y5CKTM.js";
15
- import "../chunk-C7DTKLPW.js";
16
- import "../chunk-OCDDCGDE.js";
15
+ import "../chunk-QSRRBNLY.js";
16
+ import "../chunk-ZA2I7S3E.js";
17
17
  import "../chunk-IDZNPTYD.js";
18
18
  import "../chunk-W6Y7ZW3Y.js";
19
19
  import "../chunk-N5G5QMS3.js";
20
20
  import "../chunk-3WGJMBKH.js";
21
21
  import "../chunk-HKUX2X7O.js";
22
- import "../chunk-ALFKNAZW.js";
22
+ import "../chunk-VF23UTNB.js";
23
23
  import "../chunk-ERS5EVUZ.js";
24
24
 
25
25
  // src/bin/harness-mcp.ts
26
+ import "dotenv/config";
26
27
  startServer().catch((error) => {
27
28
  console.error("Failed to start MCP server:", error);
28
29
  process.exit(1);
@@ -2,9 +2,9 @@
2
2
  import {
3
3
  createProgram,
4
4
  printFirstRunWelcome
5
- } from "../chunk-SHYWICGA.js";
5
+ } from "../chunk-OA3MOZGG.js";
6
6
  import "../chunk-SD3SQOZ2.js";
7
- import "../chunk-5ZXHMCPL.js";
7
+ import "../chunk-ABQUCXRE.js";
8
8
  import "../chunk-6KWBH4EO.js";
9
9
  import "../chunk-YQ6KC6TE.js";
10
10
  import "../chunk-TRAPF4IX.js";
@@ -16,22 +16,22 @@ import "../chunk-DBSOCI3G.js";
16
16
  import "../chunk-FIAPHX37.js";
17
17
  import "../chunk-KET4QQZB.js";
18
18
  import "../chunk-OD3S2NHN.js";
19
- import "../chunk-JOP2NDNB.js";
20
- import "../chunk-AV6KMDO5.js";
21
- import "../chunk-DNDBFIZN.js";
22
- import "../chunk-RWZPHW4H.js";
23
- import "../chunk-QDF7COPQ.js";
24
- import "../chunk-ZJMU7MEV.js";
19
+ import "../chunk-2DMIQ35P.js";
20
+ import "../chunk-APNPXLB2.js";
21
+ import "../chunk-TZIHFNEG.js";
22
+ import "../chunk-OHZVGIPE.js";
23
+ import "../chunk-TG7IUJ3J.js";
24
+ import "../chunk-UX3JHYEA.js";
25
25
  import "../chunk-CJDVBBPB.js";
26
- import "../chunk-TF6ZLHJV.js";
27
- import "../chunk-FTMXDOR6.js";
28
- import "../chunk-SFRGPAK6.js";
26
+ import "../chunk-5FM64G6D.js";
27
+ import "../chunk-CZZXE6BL.js";
28
+ import "../chunk-GWXP3JVA.js";
29
29
  import "../chunk-H7Y5CKTM.js";
30
- import "../chunk-C7DTKLPW.js";
30
+ import "../chunk-QSRRBNLY.js";
31
31
  import {
32
32
  findConfigFile,
33
33
  loadConfig
34
- } from "../chunk-OCDDCGDE.js";
34
+ } from "../chunk-ZA2I7S3E.js";
35
35
  import "../chunk-IDZNPTYD.js";
36
36
  import "../chunk-W6Y7ZW3Y.js";
37
37
  import "../chunk-N5G5QMS3.js";
@@ -43,16 +43,19 @@ import {
43
43
  CLI_VERSION
44
44
  } from "../chunk-BM3PWGXQ.js";
45
45
  import "../chunk-GZKSBLQL.js";
46
- import "../chunk-7MJAPE3Z.js";
46
+ import "../chunk-YLN34N65.js";
47
47
  import {
48
48
  getUpdateNotification,
49
49
  isUpdateCheckEnabled,
50
50
  readCheckState,
51
51
  shouldRunCheck,
52
52
  spawnBackgroundCheck
53
- } from "../chunk-ALFKNAZW.js";
53
+ } from "../chunk-VF23UTNB.js";
54
54
  import "../chunk-ERS5EVUZ.js";
55
55
 
56
+ // src/bin/harness.ts
57
+ import "dotenv/config";
58
+
56
59
  // src/bin/update-check-hooks.ts
57
60
  var DEFAULT_INTERVAL_MS = 864e5;
58
61
  var cachedConfigInterval = null;
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  createCheckPhaseGateCommand,
3
3
  runCheckPhaseGate
4
- } from "./chunk-5ZXHMCPL.js";
4
+ } from "./chunk-ABQUCXRE.js";
5
5
  import "./chunk-EBJQ6N4M.js";
6
- import "./chunk-OCDDCGDE.js";
6
+ import "./chunk-ZA2I7S3E.js";
7
7
  import "./chunk-3WGJMBKH.js";
8
- import "./chunk-ALFKNAZW.js";
8
+ import "./chunk-VF23UTNB.js";
9
9
  import "./chunk-ERS5EVUZ.js";
10
10
  export {
11
11
  createCheckPhaseGateCommand,