@mgiles/perk 1.0.1 → 2.0.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 (157) hide show
  1. package/README.md +67 -57
  2. package/extension/adapters/planAdapterPlannotator.ts +27 -41
  3. package/extension/adapters/planAdapterTombell.ts +15 -28
  4. package/extension/adapters/todoAdapterJuicesharp.ts +10 -13
  5. package/extension/checkpoints/checkpoints.ts +21 -13
  6. package/extension/doors/address.ts +6 -5
  7. package/extension/doors/askUser.ts +12 -8
  8. package/extension/doors/ciExecutor.ts +23 -15
  9. package/extension/doors/hunkHandoff.ts +202 -0
  10. package/extension/doors/land.ts +33 -10
  11. package/extension/doors/learn.ts +240 -34
  12. package/extension/doors/learnFactory.ts +144 -0
  13. package/extension/doors/lifecycleGates.ts +2 -1
  14. package/extension/doors/plannotatorHandoff.ts +509 -0
  15. package/extension/doors/prReview.ts +22 -37
  16. package/extension/doors/prReviewBrowser.ts +341 -0
  17. package/extension/doors/prReviewTerminal.ts +267 -0
  18. package/extension/doors/ready.ts +2 -1
  19. package/extension/doors/selfcheck.ts +240 -6
  20. package/extension/doors/submit.ts +37 -19
  21. package/extension/doors/submitPrReview.ts +408 -0
  22. package/extension/factories/implementHere.ts +116 -0
  23. package/extension/factories/objective.ts +17 -6
  24. package/extension/factories/objectiveAuthor.ts +15 -32
  25. package/extension/factories/objectiveDraft.ts +1 -1
  26. package/extension/factories/objectivePlan.ts +16 -34
  27. package/extension/factories/objectiveSave.ts +7 -17
  28. package/extension/factories/planMode.ts +24 -38
  29. package/extension/factories/planReview.ts +291 -177
  30. package/extension/factories/planSave.ts +23 -8
  31. package/extension/index.ts +117 -20
  32. package/extension/substrate/bindingDelivery.ts +32 -10
  33. package/extension/substrate/bindings.ts +4 -2
  34. package/extension/substrate/cache.ts +36 -9
  35. package/extension/substrate/clipboard.ts +81 -0
  36. package/extension/substrate/command.ts +25 -0
  37. package/extension/substrate/config.ts +98 -76
  38. package/extension/substrate/consoleCapture.ts +90 -0
  39. package/extension/substrate/git.ts +77 -0
  40. package/extension/substrate/miniJinja.ts +480 -0
  41. package/extension/substrate/paths.ts +38 -0
  42. package/extension/substrate/prompts.ts +15 -24
  43. package/extension/substrate/providers.ts +62 -8
  44. package/extension/substrate/sessionData.ts +1 -1
  45. package/extension/substrate/sessionPointers.ts +184 -0
  46. package/extension/substrate/structuredOutput.ts +3 -1
  47. package/extension/substrate/terminalLaunch.ts +178 -0
  48. package/extension/substrate/toolGating.ts +332 -73
  49. package/extension/substrate/toolParams.ts +7 -0
  50. package/extension/substrate/workflowState.ts +54 -2
  51. package/extension/surfaces/footerProvider.ts +8 -4
  52. package/extension/surfaces/surfaces.ts +338 -13
  53. package/extension/vendor/btw/btw.ts +10 -0
  54. package/extension/worker/readOnlySession.ts +19 -6
  55. package/extension/worker/worker.ts +187 -31
  56. package/extension/workerMain.ts +14 -13
  57. package/package.json +3 -7
  58. package/prompts/README.md +56 -5
  59. package/prompts/_fixtures/cases.yaml +52 -131
  60. package/prompts/_fixtures/golden/cond_elif-a.txt +3 -0
  61. package/prompts/_fixtures/golden/cond_elif-b.txt +3 -0
  62. package/prompts/_fixtures/golden/cond_elif-c.txt +3 -0
  63. package/prompts/_fixtures/golden/cond_if-false.txt +3 -0
  64. package/prompts/_fixtures/golden/cond_if-true.txt +3 -0
  65. package/prompts/_fixtures/golden/cond_ops-1.txt +3 -0
  66. package/prompts/_fixtures/golden/cond_ops-2.txt +3 -0
  67. package/prompts/_fixtures/golden/no_trailing_nl.txt +2 -0
  68. package/prompts/_fixtures/golden/trailing_nl.txt +2 -0
  69. package/prompts/_fixtures/golden/trim_block.txt +3 -0
  70. package/prompts/_fixtures/golden/trim_inline.txt +1 -0
  71. package/prompts/_fixtures/live.yaml +396 -0
  72. package/prompts/_fixtures/templates/cond_elif.md +9 -0
  73. package/prompts/_fixtures/templates/cond_if.md +7 -0
  74. package/prompts/_fixtures/templates/cond_ops.md +3 -0
  75. package/prompts/_fixtures/templates/no_trailing_nl.md +2 -0
  76. package/prompts/_fixtures/templates/trailing_nl.md +2 -0
  77. package/prompts/_fixtures/templates/trim_block.md +5 -0
  78. package/prompts/_fixtures/templates/trim_inline.md +1 -0
  79. package/prompts/contexts/adapters/juicesharp-todo.md +7 -0
  80. package/prompts/contexts/adapters/plannotator-objective.md +7 -0
  81. package/prompts/contexts/adapters/plannotator-plan.md +6 -0
  82. package/prompts/contexts/adapters/tombell-plan.md +17 -0
  83. package/prompts/contexts/objective-authoring.md +20 -0
  84. package/prompts/contexts/plan-authoring.md +24 -0
  85. package/prompts/contexts/read-only.md +10 -0
  86. package/prompts/stages/conflict-resolution.md +4 -0
  87. package/prompts/stages/learn-code.md +8 -0
  88. package/prompts/stages/learn-docs.md +7 -6
  89. package/prompts/stages/learn-orchestrate.md +6 -0
  90. package/prompts/stages/learn.md +1 -1
  91. package/prompts/stages/objective-author/adopt.md +12 -0
  92. package/prompts/stages/objective-author/file.md +9 -0
  93. package/prompts/stages/objective-author/seed.md +9 -0
  94. package/prompts/stages/objective-plan/guidance.md +1 -1
  95. package/prompts/stages/objective-plan/seed.md +3 -2
  96. package/prompts/stages/objective-reconcile.md +7 -0
  97. package/prompts/stages/objective-replan.md +14 -0
  98. package/prompts/stages/objective-save.md +9 -0
  99. package/prompts/stages/plan-from/adopt.md +10 -0
  100. package/prompts/stages/plan-from/file.md +9 -0
  101. package/prompts/stages/pr-review-browser/active.md +11 -0
  102. package/prompts/stages/pr-review-browser/foreign.md +11 -0
  103. package/prompts/stages/pr-review-terminal/active.md +12 -0
  104. package/prompts/stages/pr-review-terminal/foreign.md +13 -0
  105. package/prompts/stages/pr-review-terminal/local.md +4 -0
  106. package/prompts/stages/pr-review.md +6 -0
  107. package/prompts/stages/replan.md +13 -0
  108. package/prompts/stages/skills/create-from.md +15 -0
  109. package/prompts/stages/skills/create.md +9 -0
  110. package/prompts/stages/skills/refine.md +9 -0
  111. package/shared/README.md +23 -13
  112. package/shared/bindings.yaml +22 -2
  113. package/shared/contracts-history.md +191 -0
  114. package/shared/contracts.md +2258 -1638
  115. package/shared/providers.yaml +8 -1
  116. package/shared/registry.yaml +10 -11
  117. package/shared/schemas/contracts/bindings.schema.json +38 -0
  118. package/shared/schemas/contracts/providers.schema.json +89 -0
  119. package/shared/schemas/contracts/registry.schema.json +98 -0
  120. package/shared/schemas/inputs/handoff-arg.schema.json +6 -0
  121. package/shared/schemas/inputs/resolve-threads-batch.schema.json +37 -0
  122. package/shared/schemas/inputs/review-post-batch.schema.json +84 -0
  123. package/shared/schemas/inputs/review-submit-batch.schema.json +66 -0
  124. package/shared/schemas/inputs/structured-roadmap-node.schema.json +102 -0
  125. package/shared/schemas/outputs/doctor-report.schema.json +236 -0
  126. package/shared/schemas/outputs/init-report.schema.json +419 -0
  127. package/shared/schemas/outputs/learn-capture.schema.json +90 -0
  128. package/shared/schemas/outputs/learn-skip.schema.json +59 -0
  129. package/shared/schemas/outputs/plan-save.schema.json +209 -0
  130. package/shared/schemas/outputs/pr-feedback.schema.json +334 -0
  131. package/shared/schemas/outputs/pr-land.schema.json +187 -0
  132. package/shared/schemas/outputs/pr-ready.schema.json +75 -0
  133. package/shared/schemas/outputs/pr-review-checkout.schema.json +69 -0
  134. package/shared/schemas/outputs/pr-review-cleanup.schema.json +54 -0
  135. package/shared/schemas/outputs/pr-review-context.schema.json +86 -0
  136. package/shared/schemas/outputs/pr-review-submit.schema.json +64 -0
  137. package/shared/schemas/outputs/pr-submit.schema.json +147 -0
  138. package/extension/doors/learnDocs.ts +0 -99
  139. package/prompts/_fixtures/golden/address-action-model.txt +0 -10
  140. package/prompts/_fixtures/golden/address-action.txt +0 -10
  141. package/prompts/_fixtures/golden/address-preview-model.txt +0 -6
  142. package/prompts/_fixtures/golden/address-preview.txt +0 -6
  143. package/prompts/_fixtures/golden/implement-github.txt +0 -8
  144. package/prompts/_fixtures/golden/learn-docs.txt +0 -8
  145. package/prompts/_fixtures/golden/learn-github.txt +0 -11
  146. package/prompts/_fixtures/golden/learn-linear.txt +0 -11
  147. package/prompts/_fixtures/golden/learn-no-ref.txt +0 -8
  148. package/prompts/_fixtures/golden/learn-other.txt +0 -8
  149. package/prompts/_fixtures/golden/objective-plan-guidance-linear.txt +0 -8
  150. package/prompts/_fixtures/golden/objective-plan-guidance.txt +0 -8
  151. package/prompts/_fixtures/golden/objective-plan-seed-linear.txt +0 -20
  152. package/prompts/_fixtures/golden/objective-plan-seed.txt +0 -15
  153. package/prompts/_fixtures/golden/objective-read-linear-nourl.txt +0 -1
  154. package/prompts/_fixtures/golden/objective-read-linear.txt +0 -1
  155. package/prompts/_fixtures/golden/plan-read-github.txt +0 -1
  156. package/prompts/_fixtures/golden/plan-read-linear.txt +0 -1
  157. package/prompts/_fixtures/golden/plan-read-other.txt +0 -1
@@ -1,7 +1,11 @@
1
- # Golden parity cases for the cross-plane prompt render seam.
2
- # Each case names a template (root-relative under prompts/), the string-only vars to
3
- # render it with, and the committed golden-output file (root-relative under prompts/)
4
- # that BOTH jinja2 and nunjucks must reproduce byte-for-byte.
1
+ # Tier-A contract snapshot cases for the cross-plane prompt render seam.
2
+ # Each case names a purpose-built FIXTURE template (root-relative under prompts/) that isolates
3
+ # one feature of the frozen render contract, the string-only vars to render it with, and the
4
+ # committed golden-output file (root-relative under prompts/) that BOTH jinja2 and the vendored
5
+ # mini-jinja must reproduce byte-for-byte. These goldens are stable: they change only when the
6
+ # render CONTRACT changes, never when a real prompt's prose changes. Real-template byte-parity is
7
+ # proven separately, with no goldens, by the live cross-engine equality tier (_fixtures/live.yaml +
8
+ # tests/test_prompt_parity.py).
5
9
  - template: "_fixtures/templates/hello.md"
6
10
  vars:
7
11
  name: "world"
@@ -11,130 +15,47 @@
11
15
  name: "Ada"
12
16
  place: "the fixture"
13
17
  golden: "_fixtures/golden/with_include.txt"
14
- - template: "common/plan-read/github.md"
15
- vars:
16
- pr_id: "42"
17
- url: "https://x/9"
18
- golden: "_fixtures/golden/plan-read-github.txt"
19
- - template: "common/plan-read/linear.md"
20
- vars:
21
- pr_id: "uuid-1"
22
- url: "https://linear.app/x/ENG-1"
23
- golden: "_fixtures/golden/plan-read-linear.txt"
24
- - template: "common/plan-read/other.md"
25
- vars:
26
- pr_id: "42"
27
- url: "https://x/9"
28
- golden: "_fixtures/golden/plan-read-other.txt"
29
- - template: "stages/address/action.md"
30
- vars:
31
- provider: "github"
32
- pr_id: "148"
33
- url: "https://github.com/mattgiles/perk/issues/148"
34
- model_clause: ""
35
- golden: "_fixtures/golden/address-action.txt"
36
- - template: "stages/address/action.md"
37
- vars:
38
- provider: "github"
39
- pr_id: "148"
40
- url: "https://github.com/mattgiles/perk/issues/148"
41
- model_clause: ", passing `model: \"test/model\"` on that call (the configured [subagents] review-classifier model)"
42
- golden: "_fixtures/golden/address-action-model.txt"
43
- - template: "stages/address/preview.md"
44
- vars:
45
- provider: "github"
46
- pr_id: "148"
47
- url: "https://github.com/mattgiles/perk/issues/148"
48
- model_clause: ""
49
- golden: "_fixtures/golden/address-preview.txt"
50
- - template: "stages/address/preview.md"
51
- vars:
52
- provider: "github"
53
- pr_id: "148"
54
- url: "https://github.com/mattgiles/perk/issues/148"
55
- model_clause: ", passing `model: \"test/model\"` on that call (the configured [subagents] review-classifier model)"
56
- golden: "_fixtures/golden/address-preview-model.txt"
57
- - template: "stages/implement.md"
58
- vars:
59
- provider: "github"
60
- pr_id: "42"
61
- url: "https://x/9"
62
- read_cmd: "gh issue view 42 --comments"
63
- golden: "_fixtures/golden/implement-github.txt"
64
- - template: "stages/learn.md"
65
- vars:
66
- provider: "github"
67
- pr_id: "42"
68
- url: "https://x/9"
69
- read_cmd: "gh issue view 42 --comments"
70
- golden: "_fixtures/golden/learn-github.txt"
71
- - template: "stages/learn.md"
72
- vars:
73
- provider: "linear"
74
- pr_id: "uuid-1"
75
- url: "https://linear.app/x/ENG-1"
76
- read_cmd: "use the `linear_get_issue` tool (id `uuid-1`), then `linear_list_comments` — the plan body is the first comment; if the linear tools are unavailable, open https://linear.app/x/ENG-1"
77
- golden: "_fixtures/golden/learn-linear.txt"
78
- - template: "stages/learn.md"
79
- vars:
80
- provider: "gitlab"
81
- pr_id: "9"
82
- url: "https://gl/x"
83
- read_cmd: "open https://gl/x"
84
- golden: "_fixtures/golden/learn-other.txt"
85
- - template: "stages/learn.md"
86
- vars:
87
- provider: ""
88
- pr_id: ""
89
- url: ""
90
- read_cmd: ""
91
- golden: "_fixtures/golden/learn-no-ref.txt"
92
- - template: "common/objective-read/linear.md"
93
- vars:
94
- where: "(https://linear.app/x/ENG-1)"
95
- fallback: "; if the linear tools are unavailable, open https://linear.app/x/ENG-1"
96
- golden: "_fixtures/golden/objective-read-linear.txt"
97
- - template: "common/objective-read/linear.md"
98
- vars:
99
- where: "(run `perk objective show 7` for its URL)"
100
- fallback: ""
101
- golden: "_fixtures/golden/objective-read-linear-nourl.txt"
102
- - template: "stages/objective-plan/seed.md"
103
- vars:
104
- number: "7"
105
- title: "Ship it"
106
- node_id: "1.2"
107
- node_description: "Do the thing"
108
- node_engagement: ""
109
- read_clause: ""
110
- model: ""
111
- golden: "_fixtures/golden/objective-plan-seed.txt"
112
- - template: "stages/objective-plan/seed.md"
113
- vars:
114
- number: "7"
115
- title: "Ship it"
116
- node_id: "1.2"
117
- node_description: "Do the thing"
118
- node_engagement: "<untrusted_node_engagement>\n[c-1 by Ada] please scope this down\n</untrusted_node_engagement>"
119
- read_clause: "This objective is a Linear Project (https://linear.app/x/ENG-1). Its roadmap nodes are Linear issues in that Project — inspect a node-issue's detail or discussion with the `linear_get_issue` and `linear_list_comments` tools; if the linear tools are unavailable, open https://linear.app/x/ENG-1."
120
- model: "google/gemini-3.5-flash"
121
- golden: "_fixtures/golden/objective-plan-seed-linear.txt"
122
- - template: "stages/objective-plan/guidance.md"
123
- vars:
124
- objective: "7"
125
- node: "1.2"
126
- read_clause: ""
127
- model: ""
128
- golden: "_fixtures/golden/objective-plan-guidance.txt"
129
- - template: "stages/objective-plan/guidance.md"
130
- vars:
131
- objective: "7"
132
- node: ""
133
- read_clause: "This objective is a Linear Project (https://linear.app/x/ENG-1). Its roadmap nodes are Linear issues in that Project — inspect a node-issue's detail or discussion with the `linear_get_issue` and `linear_list_comments` tools; if the linear tools are unavailable, open https://linear.app/x/ENG-1."
134
- model: "google/gemini-3.5-flash"
135
- golden: "_fixtures/golden/objective-plan-guidance-linear.txt"
136
- - template: "stages/learn-docs.md"
137
- vars:
138
- inbox_path: ".pi/workflow/scratch/learn-docs-inbox.md"
139
- num_list: "45, 50"
140
- golden: "_fixtures/golden/learn-docs.txt"
18
+ - template: "_fixtures/templates/cond_if.md"
19
+ vars:
20
+ flag: "x"
21
+ golden: "_fixtures/golden/cond_if-true.txt"
22
+ - template: "_fixtures/templates/cond_if.md"
23
+ vars:
24
+ flag: ""
25
+ golden: "_fixtures/golden/cond_if-false.txt"
26
+ - template: "_fixtures/templates/cond_elif.md"
27
+ vars:
28
+ kind: "a"
29
+ golden: "_fixtures/golden/cond_elif-a.txt"
30
+ - template: "_fixtures/templates/cond_elif.md"
31
+ vars:
32
+ kind: "b"
33
+ golden: "_fixtures/golden/cond_elif-b.txt"
34
+ - template: "_fixtures/templates/cond_elif.md"
35
+ vars:
36
+ kind: "c"
37
+ golden: "_fixtures/golden/cond_elif-c.txt"
38
+ - template: "_fixtures/templates/cond_ops.md"
39
+ vars:
40
+ a: "x"
41
+ b: ""
42
+ golden: "_fixtures/golden/cond_ops-1.txt"
43
+ - template: "_fixtures/templates/cond_ops.md"
44
+ vars:
45
+ a: ""
46
+ b: "x"
47
+ golden: "_fixtures/golden/cond_ops-2.txt"
48
+ - template: "_fixtures/templates/trim_block.md"
49
+ vars:
50
+ flag: "x"
51
+ golden: "_fixtures/golden/trim_block.txt"
52
+ - template: "_fixtures/templates/trim_inline.md"
53
+ vars:
54
+ flag: "x"
55
+ golden: "_fixtures/golden/trim_inline.txt"
56
+ - template: "_fixtures/templates/trailing_nl.md"
57
+ vars: {}
58
+ golden: "_fixtures/golden/trailing_nl.txt"
59
+ - template: "_fixtures/templates/no_trailing_nl.md"
60
+ vars: {}
61
+ golden: "_fixtures/golden/no_trailing_nl.txt"
@@ -0,0 +1,3 @@
1
+ Kind:
2
+ Alpha.
3
+ Done.
@@ -0,0 +1,3 @@
1
+ Kind:
2
+ Beta.
3
+ Done.
@@ -0,0 +1,3 @@
1
+ Kind:
2
+ Gamma.
3
+ Done.
@@ -0,0 +1,3 @@
1
+ Start.
2
+ Flag is empty.
3
+ End.
@@ -0,0 +1,3 @@
1
+ Start.
2
+ Flag is set.
3
+ End.
@@ -0,0 +1,3 @@
1
+ both: no .
2
+ either: yes .
3
+ missingA: no .
@@ -0,0 +1,3 @@
1
+ both: no .
2
+ either: yes .
3
+ missingA: yes .
@@ -0,0 +1,2 @@
1
+ Fragment line one.
2
+ Fragment line two (no trailing newline).
@@ -0,0 +1,2 @@
1
+ Line one.
2
+ Line two.
@@ -0,0 +1,3 @@
1
+ List:
2
+ - item
3
+ End.
@@ -0,0 +1 @@
1
+ Prefix word suffix.
@@ -0,0 +1,396 @@
1
+ # Live cross-engine parity manifest — real templates rendered by BOTH engines and asserted equal;
2
+ # NO golden (decoupled from prose). Editing a real prompt's prose touches no fixture here; only the
3
+ # var set (and whether a new template must be listed) is curated. Each entry names a real template
4
+ # (root-relative under prompts/) and the string-only vars to render it with — multi-arm entries
5
+ # repeat a template to pin every conditional branch. Vars string-only, miniYaml subset (block
6
+ # maps/seqs, double-quoted strings, the backtick-quoting rule, no |/> block scalars) so the file is
7
+ # dual-parseable (pyyaml on the Python side, miniYaml on the node side).
8
+ - template: "common/plan-read/github.md"
9
+ vars:
10
+ pr_id: "42"
11
+ url: "https://x/9"
12
+ - template: "common/plan-read/linear.md"
13
+ vars:
14
+ pr_id: "uuid-1"
15
+ url: "https://linear.app/x/ENG-1"
16
+ - template: "common/plan-read/other.md"
17
+ vars:
18
+ pr_id: "42"
19
+ url: "https://x/9"
20
+ - template: "stages/address/action.md"
21
+ vars:
22
+ provider: "github"
23
+ pr_id: "148"
24
+ url: "https://github.com/mattgiles/perk/issues/148"
25
+ model_clause: ""
26
+ - template: "stages/address/action.md"
27
+ vars:
28
+ provider: "github"
29
+ pr_id: "148"
30
+ url: "https://github.com/mattgiles/perk/issues/148"
31
+ model_clause: ", passing `model: \"test/model\"` on that call (the configured [models.subagents] review-classifier model)"
32
+ - template: "stages/address/preview.md"
33
+ vars:
34
+ provider: "github"
35
+ pr_id: "148"
36
+ url: "https://github.com/mattgiles/perk/issues/148"
37
+ model_clause: ""
38
+ - template: "stages/address/preview.md"
39
+ vars:
40
+ provider: "github"
41
+ pr_id: "148"
42
+ url: "https://github.com/mattgiles/perk/issues/148"
43
+ model_clause: ", passing `model: \"test/model\"` on that call (the configured [models.subagents] review-classifier model)"
44
+ - template: "stages/implement.md"
45
+ vars:
46
+ provider: "github"
47
+ pr_id: "42"
48
+ url: "https://x/9"
49
+ read_cmd: "gh issue view 42 --comments"
50
+ - template: "stages/learn.md"
51
+ vars:
52
+ provider: "github"
53
+ pr_id: "42"
54
+ url: "https://x/9"
55
+ read_cmd: "gh issue view 42 --comments"
56
+ - template: "stages/learn.md"
57
+ vars:
58
+ provider: "linear"
59
+ pr_id: "uuid-1"
60
+ url: "https://linear.app/x/ENG-1"
61
+ read_cmd: "use the `linear_get_issue` tool (id `uuid-1`), then `linear_list_comments` — the plan body is the first comment; if the linear tools are unavailable, open https://linear.app/x/ENG-1"
62
+ - template: "stages/learn.md"
63
+ vars:
64
+ provider: "gitlab"
65
+ pr_id: "9"
66
+ url: "https://gl/x"
67
+ read_cmd: "open https://gl/x"
68
+ - template: "stages/learn.md"
69
+ vars:
70
+ provider: ""
71
+ pr_id: ""
72
+ url: ""
73
+ read_cmd: ""
74
+ - template: "common/objective-read/linear.md"
75
+ vars:
76
+ where: "(https://linear.app/x/ENG-1)"
77
+ fallback: "; if the linear tools are unavailable, open https://linear.app/x/ENG-1"
78
+ - template: "common/objective-read/linear.md"
79
+ vars:
80
+ where: "(run `perk objective show 7` for its URL)"
81
+ fallback: ""
82
+ - template: "stages/objective-plan/seed.md"
83
+ vars:
84
+ number: "7"
85
+ title: "Ship it"
86
+ node_id: "1.2"
87
+ node_description: "Do the thing"
88
+ node_engagement: ""
89
+ read_clause: ""
90
+ model: ""
91
+ - template: "stages/objective-plan/seed.md"
92
+ vars:
93
+ number: "7"
94
+ title: "Ship it"
95
+ node_id: "1.2"
96
+ node_description: "Do the thing"
97
+ node_engagement: "<untrusted_node_engagement>\n[c-1 by Ada] please scope this down\n</untrusted_node_engagement>"
98
+ read_clause: "This objective is a Linear Project (https://linear.app/x/ENG-1). Its roadmap nodes are Linear issues in that Project — inspect a node-issue's detail or discussion with the `linear_get_issue` and `linear_list_comments` tools; if the linear tools are unavailable, open https://linear.app/x/ENG-1."
99
+ model: "google/gemini-3.5-flash"
100
+ - template: "stages/objective-plan/guidance.md"
101
+ vars:
102
+ objective: "7"
103
+ node: "1.2"
104
+ read_clause: ""
105
+ model: ""
106
+ - template: "stages/objective-plan/guidance.md"
107
+ vars:
108
+ objective: "7"
109
+ node: ""
110
+ read_clause: "This objective is a Linear Project (https://linear.app/x/ENG-1). Its roadmap nodes are Linear issues in that Project — inspect a node-issue's detail or discussion with the `linear_get_issue` and `linear_list_comments` tools; if the linear tools are unavailable, open https://linear.app/x/ENG-1."
111
+ model: "google/gemini-3.5-flash"
112
+ - template: "stages/learn-docs.md"
113
+ vars:
114
+ inbox_path: ".perk/workflow/scratch/learn-docs-inbox.md"
115
+ num_list: "45, 50"
116
+ - template: "stages/learn-code.md"
117
+ vars:
118
+ inbox_path: ".perk/workflow/scratch/learn-code-inbox.md"
119
+ num_list: "45, 50"
120
+ - template: "stages/skills/create.md"
121
+ vars:
122
+ repo_skills_rel: ".pi/skills"
123
+ skill_name: "foo"
124
+ skill_path: ".pi/skills/foo/SKILL.md"
125
+ - template: "stages/skills/create-from.md"
126
+ vars:
127
+ repo_skills_rel: ".pi/skills"
128
+ skill_name: "foo"
129
+ skill_path: ".pi/skills/foo/SKILL.md"
130
+ seed_path: "/tmp/seed-file-foo-deadbeef.md"
131
+ seed_url: ""
132
+ - template: "stages/skills/create-from.md"
133
+ vars:
134
+ repo_skills_rel: ".pi/skills"
135
+ skill_name: "foo"
136
+ skill_path: ".pi/skills/foo/SKILL.md"
137
+ seed_path: ""
138
+ seed_url: "https://github.com/x/skills/blob/main/skills/foo/SKILL.md"
139
+ - template: "stages/skills/refine.md"
140
+ vars:
141
+ repo_skills_rel: ".pi/skills"
142
+ skill_name: "foo"
143
+ skill_path: ".pi/skills/foo/SKILL.md"
144
+ - template: "stages/pr-review.md"
145
+ vars:
146
+ model: ""
147
+ directive: ""
148
+ - template: "stages/pr-review.md"
149
+ vars:
150
+ model: "google/gemini-3.5-flash"
151
+ directive: ""
152
+ - template: "stages/pr-review.md"
153
+ vars:
154
+ model: ""
155
+ directive: "have one reviewer focus on the dignified-python skill"
156
+ - template: "stages/pr-review-terminal/foreign.md"
157
+ vars:
158
+ pr: "148"
159
+ worktree: "/repo/.worktrees/review-148"
160
+ base_sha: "0f8a1b2c3d4e"
161
+ model: ""
162
+ directive: ""
163
+ - template: "stages/pr-review-terminal/foreign.md"
164
+ vars:
165
+ pr: "148"
166
+ worktree: "/repo/.worktrees/review-148"
167
+ base_sha: "0f8a1b2c3d4e"
168
+ model: "google/gemini-3.5-flash"
169
+ directive: ""
170
+ - template: "stages/pr-review-terminal/foreign.md"
171
+ vars:
172
+ pr: "148"
173
+ worktree: "/repo/.worktrees/review-148"
174
+ base_sha: "0f8a1b2c3d4e"
175
+ model: ""
176
+ directive: "have one reviewer dig into the CI changes"
177
+ - template: "stages/pr-review-terminal/active.md"
178
+ vars:
179
+ pr: "148"
180
+ worktree: "/repo/.worktrees/plan-148"
181
+ base_sha: "0f8a1b2c3d4e"
182
+ model: ""
183
+ directive: ""
184
+ - template: "stages/pr-review-terminal/active.md"
185
+ vars:
186
+ pr: "148"
187
+ worktree: "/repo/.worktrees/plan-148"
188
+ base_sha: "0f8a1b2c3d4e"
189
+ model: "google/gemini-3.5-flash"
190
+ directive: ""
191
+ - template: "stages/pr-review-terminal/active.md"
192
+ vars:
193
+ pr: "148"
194
+ worktree: "/repo/.worktrees/plan-148"
195
+ base_sha: "0f8a1b2c3d4e"
196
+ model: ""
197
+ directive: "have one reviewer dig into the CI changes"
198
+ - template: "stages/pr-review-terminal/local.md"
199
+ vars:
200
+ worktree: "/repo/.worktrees/plan-148"
201
+ base_sha: "0f8a1b2c3d4e"
202
+ - template: "stages/pr-review-browser/foreign.md"
203
+ vars:
204
+ pr: "148"
205
+ pr_url: "https://github.com/o/r/pull/148"
206
+ worktree: "/repo/.worktrees/review-148"
207
+ url: "http://127.0.0.1:45001"
208
+ model: ""
209
+ directive: ""
210
+ - template: "stages/pr-review-browser/foreign.md"
211
+ vars:
212
+ pr: "148"
213
+ pr_url: "https://github.com/o/r/pull/148"
214
+ worktree: "/repo/.worktrees/review-148"
215
+ url: "http://127.0.0.1:45001"
216
+ model: "google/gemini-3.5-flash"
217
+ directive: ""
218
+ - template: "stages/pr-review-browser/foreign.md"
219
+ vars:
220
+ pr: "148"
221
+ pr_url: "https://github.com/o/r/pull/148"
222
+ worktree: "/repo/.worktrees/review-148"
223
+ url: "http://127.0.0.1:45001"
224
+ model: ""
225
+ directive: "have one reviewer dig into the CI changes"
226
+ - template: "stages/pr-review-browser/active.md"
227
+ vars:
228
+ pr: "148"
229
+ pr_url: "https://github.com/o/r/pull/148"
230
+ worktree: "/repo/.worktrees/plan-148"
231
+ url: "http://127.0.0.1:45001"
232
+ model: ""
233
+ directive: ""
234
+ - template: "stages/pr-review-browser/active.md"
235
+ vars:
236
+ pr: "148"
237
+ pr_url: "https://github.com/o/r/pull/148"
238
+ worktree: "/repo/.worktrees/plan-148"
239
+ url: "http://127.0.0.1:45001"
240
+ model: "google/gemini-3.5-flash"
241
+ directive: ""
242
+ - template: "stages/pr-review-browser/active.md"
243
+ vars:
244
+ pr: "148"
245
+ pr_url: "https://github.com/o/r/pull/148"
246
+ worktree: "/repo/.worktrees/plan-148"
247
+ url: "http://127.0.0.1:45001"
248
+ model: ""
249
+ directive: "have one reviewer dig into the CI changes"
250
+ - template: "stages/learn-orchestrate.md"
251
+ vars:
252
+ model: ""
253
+ manifest_path: "/repo/.perk/workflow/scratch/runs/01RID/learn-evidence/manifest.json"
254
+ bundle_dir: ".perk/workflow/scratch/runs/01RID/learn-evidence"
255
+ - template: "stages/learn-orchestrate.md"
256
+ vars:
257
+ model: "google/gemini-3.5-flash"
258
+ manifest_path: "/repo/.perk/workflow/scratch/runs/01RID/learn-evidence/manifest.json"
259
+ bundle_dir: ".perk/workflow/scratch/runs/01RID/learn-evidence"
260
+ - template: "stages/conflict-resolution.md"
261
+ vars:
262
+ base: "main"
263
+ attempt: "2"
264
+ cap: "3"
265
+ model: ""
266
+ - template: "stages/conflict-resolution.md"
267
+ vars:
268
+ base: "main"
269
+ attempt: "2"
270
+ cap: "3"
271
+ model: "google/gemini-3.5-flash"
272
+ - template: "stages/objective-reconcile.md"
273
+ vars:
274
+ objective: "7"
275
+ read_clause: ""
276
+ - template: "stages/objective-reconcile.md"
277
+ vars:
278
+ objective: "7"
279
+ read_clause: "This objective is a Linear Project (https://linear.app/x/ENG-1). Its roadmap nodes are Linear issues in that Project — inspect a node-issue's detail or discussion with the `linear_get_issue` and `linear_list_comments` tools; if the linear tools are unavailable, open https://linear.app/x/ENG-1."
280
+ - template: "stages/objective-save.md"
281
+ vars:
282
+ title: ""
283
+ - template: "stages/objective-save.md"
284
+ vars:
285
+ title: "Ship it"
286
+ - template: "stages/objective-author/seed.md"
287
+ vars: {}
288
+ - template: "stages/objective-author/adopt.md"
289
+ vars:
290
+ scratch_path: "/tmp/objective-adopt-proj-1.md"
291
+ src_id: "proj-1"
292
+ url: "https://linear.app/x/proj-1"
293
+ has_issues: ""
294
+ has_engagement: ""
295
+ - template: "stages/objective-author/adopt.md"
296
+ vars:
297
+ scratch_path: "/tmp/objective-adopt-proj-1.md"
298
+ src_id: "proj-1"
299
+ url: "https://linear.app/x/proj-1"
300
+ has_issues: "x"
301
+ has_engagement: ""
302
+ - template: "stages/objective-author/adopt.md"
303
+ vars:
304
+ scratch_path: "/tmp/objective-adopt-proj-1.md"
305
+ src_id: "proj-1"
306
+ url: "https://linear.app/x/proj-1"
307
+ has_issues: ""
308
+ has_engagement: "x"
309
+ - template: "stages/objective-author/adopt.md"
310
+ vars:
311
+ scratch_path: "/tmp/objective-adopt-proj-1.md"
312
+ src_id: "proj-1"
313
+ url: "https://linear.app/x/proj-1"
314
+ has_issues: "x"
315
+ has_engagement: "x"
316
+ - template: "stages/objective-author/file.md"
317
+ vars:
318
+ scratch_path: "/tmp/objective-seed-goal.md"
319
+ path: "notes/goal.md"
320
+ - template: "stages/plan-from/adopt.md"
321
+ vars:
322
+ scratch_path: "/tmp/plan-adopt-148.md"
323
+ issue_id: "148"
324
+ url: "https://github.com/mattgiles/perk/issues/148"
325
+ has_engagement: ""
326
+ - template: "stages/plan-from/adopt.md"
327
+ vars:
328
+ scratch_path: "/tmp/plan-adopt-148.md"
329
+ issue_id: "148"
330
+ url: "https://github.com/mattgiles/perk/issues/148"
331
+ has_engagement: "x"
332
+ - template: "stages/plan-from/file.md"
333
+ vars:
334
+ scratch_path: "/tmp/plan-seed-goal.md"
335
+ path: "notes/goal.md"
336
+ - template: "stages/replan.md"
337
+ vars:
338
+ scratch_path: "/tmp/plan-replan-42.md"
339
+ plan_id: "42"
340
+ url: "https://github.com/mattgiles/perk/issues/42"
341
+ has_engagement: ""
342
+ - template: "stages/replan.md"
343
+ vars:
344
+ scratch_path: "/tmp/plan-replan-42.md"
345
+ plan_id: "42"
346
+ url: "https://github.com/mattgiles/perk/issues/42"
347
+ has_engagement: "x"
348
+ - template: "stages/objective-replan.md"
349
+ vars:
350
+ scratch_path: "/tmp/objective-replan-7.md"
351
+ objective_id: "7"
352
+ url: "https://linear.app/x/ENG-7"
353
+ is_linear: ""
354
+ has_engagement: ""
355
+ - template: "stages/objective-replan.md"
356
+ vars:
357
+ scratch_path: "/tmp/objective-replan-7.md"
358
+ objective_id: "7"
359
+ url: "https://linear.app/x/ENG-7"
360
+ is_linear: "x"
361
+ has_engagement: ""
362
+ - template: "stages/objective-replan.md"
363
+ vars:
364
+ scratch_path: "/tmp/objective-replan-7.md"
365
+ objective_id: "7"
366
+ url: "https://linear.app/x/ENG-7"
367
+ is_linear: ""
368
+ has_engagement: "x"
369
+ - template: "stages/objective-replan.md"
370
+ vars:
371
+ scratch_path: "/tmp/objective-replan-7.md"
372
+ objective_id: "7"
373
+ url: "https://linear.app/x/ENG-7"
374
+ is_linear: "x"
375
+ has_engagement: "x"
376
+ - template: "contexts/read-only.md"
377
+ vars:
378
+ marker: "[READ-ONLY MODE]"
379
+ - template: "contexts/plan-authoring.md"
380
+ vars:
381
+ marker: "[PLAN AUTHORING]"
382
+ - template: "contexts/objective-authoring.md"
383
+ vars:
384
+ marker: "[OBJECTIVE AUTHORING]"
385
+ - template: "contexts/adapters/tombell-plan.md"
386
+ vars:
387
+ marker: "[PLAN ADAPTER: TOMBELL]"
388
+ - template: "contexts/adapters/plannotator-plan.md"
389
+ vars:
390
+ marker: "[PLAN ADAPTER: PLANNOTATOR]"
391
+ - template: "contexts/adapters/plannotator-objective.md"
392
+ vars:
393
+ marker: "[OBJECTIVE ADAPTER: PLANNOTATOR]"
394
+ - template: "contexts/adapters/juicesharp-todo.md"
395
+ vars:
396
+ marker: "[TODO ADAPTER: JUICESHARP]"
@@ -0,0 +1,9 @@
1
+ Kind:
2
+ {% if kind == "a" %}
3
+ Alpha.
4
+ {% elif kind == "b" %}
5
+ Beta.
6
+ {% else %}
7
+ Gamma.
8
+ {% endif %}
9
+ Done.
@@ -0,0 +1,7 @@
1
+ Start.
2
+ {% if flag %}
3
+ Flag is set.
4
+ {% else %}
5
+ Flag is empty.
6
+ {% endif %}
7
+ End.
@@ -0,0 +1,3 @@
1
+ both: {% if a and b %}yes{% else %}no{% endif %} .
2
+ either: {% if a or b %}yes{% else %}no{% endif %} .
3
+ missingA: {% if not a %}yes{% else %}no{% endif %} .
@@ -0,0 +1,2 @@
1
+ Fragment line one.
2
+ Fragment line two (no trailing newline).