@gobing-ai/spur 0.3.80 → 0.3.82
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-plugin/marketplace.json +1 -1
- package/config/config.example.yaml +31 -18
- package/config/config.global.yaml +13 -11
- package/config/pipeline-budgets.json +34 -2
- package/config/plugin-scripts.json +25 -0
- package/config/rules/boundary/config-loading-ownership.yaml +0 -3
- package/config/rules/boundary/dao-boundary.yaml +4 -17
- package/config/rules/boundary/planning-folder-hardcode.yaml +0 -1
- package/config/rules/boundary/sp-no-vendor-refs.yaml +3 -2
- package/config/rules/boundary/sp-runtime-path.yaml +3 -14
- package/config/rules/quality/coverage-gate.yaml +3 -14
- package/config/rules/quality/tsdoc-exports.yaml +4 -7
- package/config/rules/strict/http-boundaries.yaml +5 -8
- package/config/rules/strict/runtime-boundaries.yaml +1 -5
- package/config/rules/structure/protected-files.yaml +9 -3
- package/config/rules/structure/test-focus-skip.yaml +0 -2
- package/config/rules/structure/test-location.yaml +0 -5
- package/config/rules/surface/check-cli-surface.yaml +3 -2
- package/config/rules/typescript/bun-tooling.yaml +5 -7
- package/config/rules/typescript/guarded-happy-dom-register.yaml +0 -2
- package/config/rules/typescript/happy-dom-teardown.yaml +0 -2
- package/config/rules/typescript/no-biome-suppressions.yaml +0 -2
- package/config/rules/typescript/no-debugger.yaml +0 -2
- package/config/rules/typescript/no-eslint-suppressions.yaml +0 -4
- package/config/rules/typescript/no-leaky-module-mocks.yaml +6 -13
- package/config/rules/typescript/no-module-scope-import-calls.yaml +0 -2
- package/config/rules/typescript/no-syscall-emulation-in-boundary-mock.yaml +0 -3
- package/config/rules/typescript/no-unmocked-module-eval-side-effects.yaml +0 -3
- package/config/rules/typescript/output-boundaries.yaml +0 -3
- package/config/rules/typescript/prefer-accessible-role-for-button-queries.yaml +0 -3
- package/config/rules/ui/ui-import-boundary.yaml +1 -5
- package/config/templates/docs/99_PROJECT_CONSTITUTION.md +75 -13
- package/config/transition-shims.json +0 -7
- package/config/workflows/basic.yaml +4 -0
- package/config/workflows/docs-pipeline.yaml +13 -14
- package/config/workflows/feature-dev.yaml +20 -65
- package/config/workflows/history-anatomy.yaml +22 -1
- package/config/workflows/idea-pipeline.yaml +53 -97
- package/config/workflows/pr-review.yaml +21 -33
- package/config/workflows/task-pipeline.yaml +87 -330
- package/config/workflows/wayfinder-resolution.yaml +12 -26
- package/config/workflows/wrapup-pipeline.yaml +48 -189
- package/package.json +9 -9
- package/plugins/sp/README.md +12 -3
- package/plugins/sp/agents/expert-spur.md +41 -19
- package/plugins/sp/lib/idea-handoff.generated.d.mts +17 -0
- package/plugins/sp/lib/idea-handoff.generated.mjs +1301 -0
- package/plugins/sp/plugin.json +1 -1
- package/plugins/sp/scripts/feature-dev-precheck.mjs +146 -0
- package/plugins/sp/scripts/feature-dev-precheck.ts +238 -0
- package/plugins/sp/scripts/idea-handoff.mjs +27 -0
- package/plugins/sp/scripts/idea-handoff.ts +44 -0
- package/plugins/sp/scripts/inline-run-setup.ts +69 -1
- package/plugins/sp/scripts/quality-gate.mjs +216 -0
- package/plugins/sp/scripts/quality-gate.ts +287 -0
- package/plugins/sp/scripts/surface-drift-inventory.ts +0 -2
- package/plugins/sp/scripts/task-size-precheck.ts +44 -16
- package/plugins/sp/scripts/verify-answer-lint.ts +17 -1
- package/plugins/sp/scripts/workflow-step-profile.mjs +319 -0
- package/plugins/sp/scripts/workflow-step-profile.ts +456 -0
- package/plugins/sp/scripts/wrapup-steps.mjs +350 -0
- package/plugins/sp/scripts/wrapup-steps.ts +466 -0
- package/plugins/sp/skills/code-review/references/review-lenses.md +3 -0
- package/plugins/sp/skills/parallel-execution/references/dispatch-surface.md +1 -1
- package/plugins/sp/skills/spec-decomposition/references/decomposition.md +29 -0
- package/plugins/sp/skills/spur-cli/SKILL.md +4 -8
- package/plugins/sp/skills/spur-cli/references/agent.md +44 -69
- package/plugins/sp/skills/spur-cli/references/message.md +30 -3
- package/plugins/sp/skills/spur-cli/references/projects.md +25 -1
- package/plugins/sp/skills/spur-cli/references/self.md +6 -5
- package/plugins/sp/skills/spur-cli/references/serve.md +8 -7
- package/plugins/sp/skills/spur-cli/references/tasks.md +1 -1
- package/plugins/sp/skills/spur-cli/references/workflows/operations.md +6 -3
- package/plugins/sp/skills/spur-cli/references/workflows/workflow-fit-and-tuning.md +57 -18
- package/plugins/sp/skills/spur-composer/SKILL.md +145 -0
- package/plugins/sp/skills/spur-dev/references/ac-style-guide.md +10 -0
- package/plugins/sp/skills/spur-dev/references/execution-batch.md +1 -1
- package/plugins/sp/skills/spur-dev/references/execution-workflow.md +4 -6
- package/plugins/sp/skills/spur-dev/references/glossary.md +1 -1
- package/plugins/sp/skills/spur-dev/references/inline-pipeline-driver.md +11 -1
- package/plugins/sp/skills/spur-dev/references/planning-workflow.md +24 -0
- package/plugins/sp/skills/spur-doctor/SKILL.md +138 -0
- package/plugins/sp/skills/taste-refactoring-api/README.md +43 -0
- package/plugins/sp/skills/taste-refactoring-api/SKILL.md +334 -0
- package/plugins/sp/skills/taste-refactoring-api/checklists/daily-api-review.md +71 -0
- package/plugins/sp/skills/taste-refactoring-api/examples/refactor-example.md +72 -0
- package/plugins/sp/skills/taste-refactoring-api/examples/review-template.md +93 -0
- package/plugins/sp/skills/taste-refactoring-api/references/api-refactoring-playbook.md +253 -0
- package/plugins/sp/skills/taste-refactoring-api/references/protocol-modes.md +79 -0
- package/plugins/sp/skills/taste-refactoring-api/references/research-basis.md +58 -0
- package/plugins/sp/skills/taste-refactoring-architect/README.md +26 -0
- package/plugins/sp/skills/taste-refactoring-architect/SKILL.md +471 -0
- package/plugins/sp/skills/taste-refactoring-architect/checklists/daily-architecture-review.md +48 -0
- package/plugins/sp/skills/taste-refactoring-architect/examples/refactor-example.md +55 -0
- package/plugins/sp/skills/taste-refactoring-architect/examples/review-template.md +51 -0
- package/plugins/sp/skills/taste-refactoring-architect/references/architecture-refactoring-playbook.md +173 -0
- package/plugins/sp/skills/taste-refactoring-architect/references/research-basis.md +28 -0
- package/plugins/sp/skills/taste-refactoring-tests/README.md +28 -0
- package/plugins/sp/skills/taste-refactoring-tests/SKILL.md +482 -0
- package/plugins/sp/skills/taste-refactoring-tests/checklists/daily-test-review.md +39 -0
- package/plugins/sp/skills/taste-refactoring-tests/examples/refactor-example.md +85 -0
- package/plugins/sp/skills/taste-refactoring-tests/examples/review-template.md +59 -0
- package/plugins/sp/skills/taste-refactoring-tests/references/research-basis.md +47 -0
- package/plugins/sp/skills/taste-refactoring-tests/references/test-refactoring-playbook.md +222 -0
- package/plugins/sp/skills/taste-refactoring-ui/README.md +12 -0
- package/plugins/sp/skills/taste-refactoring-ui/SKILL.md +290 -0
- package/plugins/sp/skills/taste-refactoring-ui/checklists/daily-ui-review.md +72 -0
- package/plugins/sp/skills/taste-refactoring-ui/examples/review-template.md +51 -0
- package/plugins/sp/skills/taste-refactoring-ui/references/refactoring-ui-playbook.md +170 -0
- package/plugins/sp/skills/wayfinder/SKILL.md +2 -2
- package/plugins/sp/skills/wayfinder/references/pipeline-resolution.md +30 -0
- package/schemas/spur-config.schema.json +105 -85
- package/spur.js +44616 -43320
- package/web/_astro/BoardApp.D-WlxiN2.js +1 -0
- package/web/_astro/{BoardApp.CHQ1lycZ.js → BoardApp.D8bM9pKL.js} +97 -95
- package/web/_astro/{TaskDetail.GKfQJ60c.js → TaskDetail.BPRqgVUE.js} +1 -1
- package/web/_astro/{arc.DWEtA3Tx.js → arc.BPrPES3z.js} +1 -1
- package/web/_astro/{architectureDiagram-3BPJPVTR.DB42oWmP.js → architectureDiagram-3BPJPVTR.qX_7q02P.js} +1 -1
- package/web/_astro/{blockDiagram-GPEHLZMM.rhv-zNQV.js → blockDiagram-GPEHLZMM.CUZfj5V7.js} +1 -1
- package/web/_astro/{c4Diagram-AAUBKEIU.Ci4-4VvY.js → c4Diagram-AAUBKEIU.CTaOr8hH.js} +1 -1
- package/web/_astro/channel.DGZaFHZx.js +1 -0
- package/web/_astro/{chunk-2J33WTMH.Cc9veUgf.js → chunk-2J33WTMH.Dt-9wf3h.js} +1 -1
- package/web/_astro/{chunk-4BX2VUAB.Bec9c4eI.js → chunk-4BX2VUAB.CTC2sdoN.js} +1 -1
- package/web/_astro/{chunk-55IACEB6.DoV8S1iB.js → chunk-55IACEB6.DQcxt2_g.js} +1 -1
- package/web/_astro/{chunk-727SXJPM.DwR-Qlyj.js → chunk-727SXJPM.DXFPSn-a.js} +1 -1
- package/web/_astro/{chunk-AQP2D5EJ.ND_a81WY.js → chunk-AQP2D5EJ.BCx3U4bT.js} +1 -1
- package/web/_astro/{chunk-FMBD7UC4.Wv_jwG48.js → chunk-FMBD7UC4.DL2tJkdO.js} +1 -1
- package/web/_astro/{chunk-ND2GUHAM.CXKXCMmp.js → chunk-ND2GUHAM.DZyflMro.js} +1 -1
- package/web/_astro/{chunk-QZHKN3VN.nkaoNYQq.js → chunk-QZHKN3VN.CUI2mT09.js} +1 -1
- package/web/_astro/{classDiagram-4FO5ZUOK.cMQcVlQu.js → classDiagram-4FO5ZUOK.g4rX4Fr1.js} +1 -1
- package/web/_astro/{classDiagram-v2-Q7XG4LA2.cMQcVlQu.js → classDiagram-v2-Q7XG4LA2.g4rX4Fr1.js} +1 -1
- package/web/_astro/{cose-bilkent-S5V4N54A.OaDJ7Mr2.js → cose-bilkent-S5V4N54A.CzWJLqp0.js} +1 -1
- package/web/_astro/{cynefin-OW5HDTMX.Chi8IphF.js → cynefin-OW5HDTMX.WgsvQeCR.js} +1 -1
- package/web/_astro/{cytoscape.esm.DzSz-X2X.js → cytoscape.esm.BB4DxJjf.js} +1 -1
- package/web/_astro/{dagre-BM42HDAG.CzK2t_Fp.js → dagre-BM42HDAG.Dzv6ngql.js} +1 -1
- package/web/_astro/{diagram-2AECGRRQ.DRvxlVS7.js → diagram-2AECGRRQ.CpJ4a9rU.js} +1 -1
- package/web/_astro/{diagram-5GNKFQAL.CnYvNdwA.js → diagram-5GNKFQAL.CzPlF_dq.js} +1 -1
- package/web/_astro/{diagram-KO2AKTUF.CpLpMw5R.js → diagram-KO2AKTUF.TAkZNTcQ.js} +1 -1
- package/web/_astro/{diagram-LMA3HP47.JTb78qUA.js → diagram-LMA3HP47.uCjoKSag.js} +1 -1
- package/web/_astro/{diagram-OG6HWLK6.Bk-1jDIb.js → diagram-OG6HWLK6.eMplIjoK.js} +1 -1
- package/web/_astro/{erDiagram-TEJ5UH35.D8hN9GZq.js → erDiagram-TEJ5UH35.Bf7zoXGz.js} +1 -1
- package/web/_astro/{flowDiagram-I6XJVG4X.-6zQr6m5.js → flowDiagram-I6XJVG4X.B_bHj3gN.js} +1 -1
- package/web/_astro/{ganttDiagram-6RSMTGT7.DboLQ9ca.js → ganttDiagram-6RSMTGT7.BasrHRMj.js} +1 -1
- package/web/_astro/{gitGraphDiagram-PVQCEYII.4tYvJKGR.js → gitGraphDiagram-PVQCEYII.C6iphq1x.js} +1 -1
- package/web/_astro/index.DayyIngm.css +1 -0
- package/web/_astro/{infoDiagram-5YYISTIA.Bd9rXpsB.js → infoDiagram-5YYISTIA.HXmDMhW4.js} +1 -1
- package/web/_astro/{ishikawaDiagram-YF4QCWOH.CvMoaf67.js → ishikawaDiagram-YF4QCWOH.BSmW8NiU.js} +1 -1
- package/web/_astro/{journeyDiagram-JHISSGLW.Ccy1CA7y.js → journeyDiagram-JHISSGLW.DEQow5fo.js} +1 -1
- package/web/_astro/{kanban-definition-UN3LZRKU.0MaMqHNS.js → kanban-definition-UN3LZRKU.IVm9cTdc.js} +1 -1
- package/web/_astro/{linear.CHXgcIbN.js → linear.CrsM73_9.js} +1 -1
- package/web/_astro/{mermaid.core.Ca-kcelG.js → mermaid.core.CfBeDJls.js} +6 -6
- package/web/_astro/{mindmap-definition-RKZ34NQL.BUIDlHa0.js → mindmap-definition-RKZ34NQL.C3j60Y-0.js} +1 -1
- package/web/_astro/ordinal.BYWQX77i.js +1 -0
- package/web/_astro/{pieDiagram-4H26LBE5.2dX3CU1s.js → pieDiagram-4H26LBE5.B-aCMeEA.js} +1 -1
- package/web/_astro/{quadrantDiagram-W4KKPZXB.B3LBlRiv.js → quadrantDiagram-W4KKPZXB.Cib965yq.js} +1 -1
- package/web/_astro/{requirementDiagram-4Y6WPE33.X12I2uNx.js → requirementDiagram-4Y6WPE33.D61cS4O-.js} +1 -1
- package/web/_astro/{sankeyDiagram-5OEKKPKP.BXohIHqx.js → sankeyDiagram-5OEKKPKP.GKF2qVPy.js} +1 -1
- package/web/_astro/{sequenceDiagram-3UESZ5HK.C37ZIUzg.js → sequenceDiagram-3UESZ5HK.DZnq8F2h.js} +1 -1
- package/web/_astro/{stateDiagram-AJRCARHV.BRgz317z.js → stateDiagram-AJRCARHV.DXUFmdgM.js} +1 -1
- package/web/_astro/{stateDiagram-v2-BHNVJYJU.7VYSXN9-.js → stateDiagram-v2-BHNVJYJU.BtHmhLEz.js} +1 -1
- package/web/_astro/{timeline-definition-PNZ67QCA.BVNz_HiN.js → timeline-definition-PNZ67QCA.Cy-WW2ln.js} +1 -1
- package/web/_astro/{vennDiagram-CIIHVFJN.CHVDkPX4.js → vennDiagram-CIIHVFJN.SLp5b9KI.js} +1 -1
- package/web/_astro/{wardleyDiagram-YWT4CUSO.EQQ_qT9v.js → wardleyDiagram-YWT4CUSO.Bww45mWV.js} +1 -1
- package/web/_astro/{xychartDiagram-2RQKCTM6.DrAT9WoP.js → xychartDiagram-2RQKCTM6.DR4swI6a.js} +1 -1
- package/web/apple-touch-icon.png +0 -0
- package/web/favicon.ico +0 -0
- package/web/favicon.svg +17 -4
- package/web/icon-192.png +0 -0
- package/web/icon-512.png +0 -0
- package/web/index.html +2 -2
- package/web/site.webmanifest +31 -0
- package/web/spur_logo.svg +1 -0
- package/plugins/sp/skills/spur-cli/references/team.md +0 -145
- package/web/_astro/BoardApp.DV9kx0wo.js +0 -1
- package/web/_astro/channel.BAI6xLeV.js +0 -1
- package/web/_astro/index.Dcr_8fiK.css +0 -1
- package/web/_astro/ordinal.DBvzRdQf.js +0 -1
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# Reusable UI Review Template
|
|
2
|
+
|
|
3
|
+
## Diagnosis
|
|
4
|
+
The screen’s main problem is **[hierarchy / density / unclear grouping / inconsistent system / weak typography / noisy color / over-decoration]**. The target direction is **[clear, calm, focused, premium, playful, dense-but-scannable, etc.]**.
|
|
5
|
+
|
|
6
|
+
## Highest-impact changes
|
|
7
|
+
|
|
8
|
+
### 1. [Issue]
|
|
9
|
+
**Observation:** …
|
|
10
|
+
**Why it matters:** …
|
|
11
|
+
**Refactor:** …
|
|
12
|
+
**System rule:** …
|
|
13
|
+
|
|
14
|
+
### 2. [Issue]
|
|
15
|
+
**Observation:** …
|
|
16
|
+
**Why it matters:** …
|
|
17
|
+
**Refactor:** …
|
|
18
|
+
**System rule:** …
|
|
19
|
+
|
|
20
|
+
### 3. [Issue]
|
|
21
|
+
**Observation:** …
|
|
22
|
+
**Why it matters:** …
|
|
23
|
+
**Refactor:** …
|
|
24
|
+
**System rule:** …
|
|
25
|
+
|
|
26
|
+
## System decisions
|
|
27
|
+
- Type scale: …
|
|
28
|
+
- Font weights: …
|
|
29
|
+
- Spacing scale: …
|
|
30
|
+
- Content widths: …
|
|
31
|
+
- Radius scale: …
|
|
32
|
+
- Shadow/elevation scale: …
|
|
33
|
+
- Primary/neutral/semantic color ramps: …
|
|
34
|
+
- Icon sizes: …
|
|
35
|
+
|
|
36
|
+
## Implementation notes
|
|
37
|
+
- Component changes: …
|
|
38
|
+
- Responsive behavior: …
|
|
39
|
+
- Interaction states: …
|
|
40
|
+
- Empty/loading/error handling: …
|
|
41
|
+
- Media constraints: …
|
|
42
|
+
|
|
43
|
+
## Final quality gate
|
|
44
|
+
- [ ] Primary task obvious
|
|
45
|
+
- [ ] Hierarchy works in grayscale
|
|
46
|
+
- [ ] Grouping is unambiguous
|
|
47
|
+
- [ ] Typography is readable
|
|
48
|
+
- [ ] Colors are systematic and accessible
|
|
49
|
+
- [ ] Borders/shadows are purposeful
|
|
50
|
+
- [ ] States are covered
|
|
51
|
+
- [ ] No decorative fix is hiding a structural issue
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
# Refactoring UI — Operational Playbook
|
|
2
|
+
|
|
3
|
+
This is a concise operational distillation of the source material, organized by the book’s major sections.
|
|
4
|
+
|
|
5
|
+
## 1. Starting from scratch
|
|
6
|
+
|
|
7
|
+
### Start with a feature, not a layout
|
|
8
|
+
Design actual functionality before global shell decisions. The shell should emerge from the needs of the features, not the reverse.
|
|
9
|
+
|
|
10
|
+
### Detail comes later
|
|
11
|
+
Explore structure in low fidelity. Grayscale is useful because it forces hierarchy to be carried by spacing, size, and contrast. Treat early wireframes as disposable.
|
|
12
|
+
|
|
13
|
+
### Don’t design too much
|
|
14
|
+
Work in short design → implementation cycles. Build the smallest useful version first. Do not imply functionality that is not ready to ship.
|
|
15
|
+
|
|
16
|
+
### Choose a personality
|
|
17
|
+
Personality is built from concrete choices: typeface, color, border radius, imagery, and language. Keep these choices coherent.
|
|
18
|
+
|
|
19
|
+
### Limit your choices
|
|
20
|
+
Predefine scales and tokens. Use process-of-elimination between neighboring values instead of endless micro-adjustment. Systematize recurring low-level choices.
|
|
21
|
+
|
|
22
|
+
## 2. Hierarchy is everything
|
|
23
|
+
|
|
24
|
+
### Not all elements are equal
|
|
25
|
+
A polished interface makes relative importance obvious. Primary, secondary, and tertiary elements should not compete equally.
|
|
26
|
+
|
|
27
|
+
### Size isn’t everything
|
|
28
|
+
Use weight and contrast to create hierarchy so headings do not become oversized and support text does not become unreadably small.
|
|
29
|
+
|
|
30
|
+
### Don’t use grey text on colored backgrounds
|
|
31
|
+
The real goal is lower contrast, not “grey.” Choose text colors that harmonize with the surface instead of simply applying grey or low opacity.
|
|
32
|
+
|
|
33
|
+
### Emphasize by de-emphasizing
|
|
34
|
+
If an important item still does not stand out, quiet its competitors before adding more emphasis.
|
|
35
|
+
|
|
36
|
+
### Labels are a last resort
|
|
37
|
+
Remove labels where format/context already explains the value. Combine label + value into natural language when possible. When labels are necessary, style them according to the user’s scan target.
|
|
38
|
+
|
|
39
|
+
### Separate visual hierarchy from document hierarchy
|
|
40
|
+
Semantic markup and visual appearance are different concerns. Keep accessible/semantic structure while styling visual importance appropriately.
|
|
41
|
+
|
|
42
|
+
### Balance weight and contrast
|
|
43
|
+
Heavy visual elements may need lower contrast; low-contrast elements may need more weight. Use these as counterbalances.
|
|
44
|
+
|
|
45
|
+
### Semantics are secondary
|
|
46
|
+
Buttons, links, and actions do not all need the same visual treatment. Style according to action priority, while preserving correct semantics and interaction behavior.
|
|
47
|
+
|
|
48
|
+
## 3. Layout and spacing
|
|
49
|
+
|
|
50
|
+
### Start with too much white space
|
|
51
|
+
It is easier to tighten a spacious design than to rescue a cramped one. Density can be valid, but make it intentional.
|
|
52
|
+
|
|
53
|
+
### Establish a spacing and sizing system
|
|
54
|
+
Use a scale with perceptible, non-linear jumps. Fine differences matter more at small sizes than large sizes.
|
|
55
|
+
|
|
56
|
+
### You don’t have to fill the whole screen
|
|
57
|
+
Use max widths and intrinsic content dimensions. Empty space is not wasted space when it improves comprehension.
|
|
58
|
+
|
|
59
|
+
### Grids are overrated
|
|
60
|
+
Do not force unrelated sections to line up to one universal grid. Use the local structure the content needs.
|
|
61
|
+
|
|
62
|
+
### Relative sizing doesn’t scale
|
|
63
|
+
Avoid overusing relative percentages for things that need stable emphasis or readable dimensions. Use intentional widths and breakpoints.
|
|
64
|
+
|
|
65
|
+
### Avoid ambiguous spacing
|
|
66
|
+
Spacing must make relationships obvious. A gap should clearly say whether two things belong together or apart.
|
|
67
|
+
|
|
68
|
+
## 4. Designing text
|
|
69
|
+
|
|
70
|
+
### Establish a type scale
|
|
71
|
+
Use a small, predefined scale instead of pixel-by-pixel typography.
|
|
72
|
+
|
|
73
|
+
### Use good fonts
|
|
74
|
+
For UI, prioritize families designed for legibility at small sizes. Popular, well-tested neutral sans-serifs are safe defaults; use personality faces intentionally.
|
|
75
|
+
|
|
76
|
+
### Keep your line length in check
|
|
77
|
+
Long lines are hard to read. Limit prose width even on wide screens.
|
|
78
|
+
|
|
79
|
+
### Baseline, not center
|
|
80
|
+
Text and icons often look more natural when aligned optically/baseline rather than mechanically center-aligned.
|
|
81
|
+
|
|
82
|
+
### Line-height is proportional
|
|
83
|
+
Small text generally needs more line-height; large headlines can use tighter line-height.
|
|
84
|
+
|
|
85
|
+
### Not every link needs a color
|
|
86
|
+
Context and interaction styling may be enough. Too many colored links create noise.
|
|
87
|
+
|
|
88
|
+
### Align with readability in mind
|
|
89
|
+
Left-align most multi-line text. Center alignment is better suited to short isolated blocks.
|
|
90
|
+
|
|
91
|
+
### Use letter-spacing effectively
|
|
92
|
+
Uppercase text can benefit from added tracking. Large headlines in wide-spaced UI fonts may benefit from tighter tracking. Do not try to turn display faces into body faces by spacing alone.
|
|
93
|
+
|
|
94
|
+
## 5. Working with color
|
|
95
|
+
|
|
96
|
+
### Ditch hex for HSL
|
|
97
|
+
Thinking in hue, saturation, and lightness makes relationships between colors easier to reason about.
|
|
98
|
+
|
|
99
|
+
### You need more colors than you think
|
|
100
|
+
A useful palette needs multiple shades for text, surfaces, borders, hover states, fills, and semantic feedback.
|
|
101
|
+
|
|
102
|
+
### Define your shades up front
|
|
103
|
+
Create ramps for key colors and neutrals before styling individual elements.
|
|
104
|
+
|
|
105
|
+
### Don’t let lightness kill your saturation
|
|
106
|
+
Lighter/darker colors often need saturation and sometimes hue adjustments to stay rich and natural.
|
|
107
|
+
|
|
108
|
+
### Greys don’t have to be grey
|
|
109
|
+
Slightly tinted neutrals can give the interface more character and cohesion.
|
|
110
|
+
|
|
111
|
+
### Accessible doesn’t have to mean ugly
|
|
112
|
+
Use contrast deliberately and employ multiple tones/weights rather than making everything equally dark.
|
|
113
|
+
|
|
114
|
+
### Don’t rely on color alone
|
|
115
|
+
Pair color with copy, icons, shapes, borders, or placement so status remains understandable without color perception.
|
|
116
|
+
|
|
117
|
+
## 6. Creating depth
|
|
118
|
+
|
|
119
|
+
### Emulate a light source
|
|
120
|
+
Use consistent highlights and shadows so surfaces feel physically coherent.
|
|
121
|
+
|
|
122
|
+
### Use shadows to convey elevation
|
|
123
|
+
Shadow size and softness should map to distance from the base surface and can help direct focus.
|
|
124
|
+
|
|
125
|
+
### Shadows can have two parts
|
|
126
|
+
A realistic UI shadow can combine a tight contact shadow with a broader ambient shadow.
|
|
127
|
+
|
|
128
|
+
### Even flat designs can have depth
|
|
129
|
+
Borders, background shifts, highlights, and overlap can create separation without large shadows.
|
|
130
|
+
|
|
131
|
+
### Overlap elements to create layers
|
|
132
|
+
Controlled overlap can communicate relationships and produce stronger composition.
|
|
133
|
+
|
|
134
|
+
## 7. Working with images
|
|
135
|
+
|
|
136
|
+
### Use good photos
|
|
137
|
+
Source quality matters more than effects.
|
|
138
|
+
|
|
139
|
+
### Text needs consistent contrast
|
|
140
|
+
Text over images must remain readable regardless of image variation. Use overlays, contrast reduction, colorization, or subtle text glow/shadow as tools.
|
|
141
|
+
|
|
142
|
+
### Everything has an intended size
|
|
143
|
+
Do not enlarge small-detail icons until they look chunky. Do not shrink dense screenshots until content becomes unreadable. Crop or redesign the presentation.
|
|
144
|
+
|
|
145
|
+
### Beware user-uploaded content
|
|
146
|
+
Expect arbitrary aspect ratios, colors, and quality. Use fixed frames, cropping, safe contrast regions, and fallbacks.
|
|
147
|
+
|
|
148
|
+
## 8. Finishing touches
|
|
149
|
+
|
|
150
|
+
### Supercharge the defaults
|
|
151
|
+
Default controls can often be improved with coherent radius, typography, iconography, spacing, and state styling.
|
|
152
|
+
|
|
153
|
+
### Add color with accent borders
|
|
154
|
+
Thin, intentional accents can introduce brand color without turning large surfaces into saturated blocks.
|
|
155
|
+
|
|
156
|
+
### Decorate your backgrounds
|
|
157
|
+
Subtle shapes, patterns, gradients, or illustrations can add personality, but they should remain subordinate to content.
|
|
158
|
+
|
|
159
|
+
### Don’t overlook empty states
|
|
160
|
+
Use empty states to teach the next action, set expectations, or explain what will appear there.
|
|
161
|
+
|
|
162
|
+
### Use fewer borders
|
|
163
|
+
When possible, create separation with spacing, surface color, or depth instead of boxing everything in.
|
|
164
|
+
|
|
165
|
+
### Think outside the box
|
|
166
|
+
Do not default every section to a rectangular card. Allow imagery, backgrounds, overlap, or asymmetrical composition when they better serve the content.
|
|
167
|
+
|
|
168
|
+
## 9. Leveling up
|
|
169
|
+
|
|
170
|
+
The larger lesson is to build visual judgment through deliberate observation, comparison, and repetition. Collect good patterns, notice why they work, and turn recurring insights into reusable systems rather than isolated tricks.
|
|
@@ -128,7 +128,7 @@ Invoked when the operator has a loose idea and the destination itself is foggy.
|
|
|
128
128
|
|
|
129
129
|
### Work Through the Map
|
|
130
130
|
|
|
131
|
-
Invoked when a map already exists (operator provides the feature ID). A ticket is **optional** — without one, pick the next frontier ticket, not the operator's preference.
|
|
131
|
+
Invoked when a map already exists (operator provides the feature ID). A ticket is **optional** — without one, pick the next frontier ticket, not the operator's preference. Pipeline runs: `references/pipeline-resolution.md`.
|
|
132
132
|
|
|
133
133
|
0. **Branch first.** `git checkout -b wayfind/<wbs>-<slug>`, for the same reason as charting: steps 6 and 7 below remove fog from the map, and the gate that checks the removal was paid for measures the branch, not the commit. On the default branch the check silently passes no matter what you delete.
|
|
134
134
|
1. **Load the map** — the feature description (the low-res view), not every task body. Read the destination and Decisions-so-far to orient.
|
|
@@ -266,7 +266,7 @@ The operator invokes this skill directly: `Skill(skill="sp:wayfinder", args="<lo
|
|
|
266
266
|
|
|
267
267
|
## Reference Files
|
|
268
268
|
|
|
269
|
-
- **`../spur-dev/references/decision-brief.md`** — Decision-brief format for HITL choices during charting
|
|
269
|
+
- **`../spur-dev/references/decision-brief.md`** — Decision-brief format for HITL choices during charting.
|
|
270
270
|
- **`../spur-dev/references/cross-cutting.md`** — Verification-before-completion rule (one-ticket-per-session discipline)
|
|
271
271
|
- **`../spur-dev/references/execution-batch.md`** — Batch execution model (pairs with one-ticket-per-session loop)
|
|
272
272
|
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Wayfinder resolution-pipeline authoring contract
|
|
2
|
+
|
|
3
|
+
Reference for the `wayfinder-resolution` workflow's `investigate` hop. The pipeline passes a
|
|
4
|
+
bounded pointer prompt; this page carries the full authoring contract the hop must follow.
|
|
5
|
+
Context variables (`${vars.wbs}`, `${vars.resolutionMode}`, `${vars.evidencePolicy}`) are
|
|
6
|
+
resolved by the engine before the hop runs.
|
|
7
|
+
|
|
8
|
+
## Research boundary (preserve the research boundary)
|
|
9
|
+
|
|
10
|
+
- Work only from the prepared local bundle `.spur/run/<runId>-wayfinder-input.json`, local
|
|
11
|
+
shell/file reads, and the `spur` CLI. Do not use network search or MCP tools.
|
|
12
|
+
- Do not invoke `task-pipeline.yaml`, `/sp:dev-run`, `/sp:dev-runall`, or any code
|
|
13
|
+
implementation pipeline. This hop authors research/specification sections — it never
|
|
14
|
+
implements.
|
|
15
|
+
|
|
16
|
+
## Procedure
|
|
17
|
+
|
|
18
|
+
1. Read the task file for `<wbs>` and map its existing Requirements and Acceptance Criteria
|
|
19
|
+
onto the existing Design/Plan/References sections.
|
|
20
|
+
2. Author concise Solution, Testing, and Review sections through
|
|
21
|
+
`spur task update --section --from-file` (write each section to a file, then pass it).
|
|
22
|
+
3. Finish with a short summary and stop.
|
|
23
|
+
|
|
24
|
+
## Evidence-anchor contract (mandatory — 0299 R1 line-anchor rule)
|
|
25
|
+
|
|
26
|
+
When the task's evidence lives in a shared evidence file, anchor every Solution/Testing
|
|
27
|
+
`file:line` citation truthfully — resolve the section's real start line with
|
|
28
|
+
`grep -n "^## <wbs> " <evidence-file>` and cite that exact line. NEVER copy a line number
|
|
29
|
+
from another ticket's example; each WBS anchors to its own section. Before finishing, re-read
|
|
30
|
+
each cited line and confirm it names the requirement's subject.
|
|
@@ -173,6 +173,62 @@
|
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
},
|
|
176
|
+
"fleet": {
|
|
177
|
+
"type": "object",
|
|
178
|
+
"description": "The project's agent fleet (G65 / 0858): the single declaration of composition, the on/off switch, and the dispatch strategy. PROJECT LAYER ONLY — a global-layer agent.fleet fails the load. Replaces the retired .spur/fleet.json (0835) and agent.team (0857). Mirrors @gobing-ai/spur-config AgentFleetSchema (Zod is SSOT).",
|
|
179
|
+
"properties": {
|
|
180
|
+
"enabled": {
|
|
181
|
+
"type": "boolean",
|
|
182
|
+
"default": false,
|
|
183
|
+
"description": "The single fleet switch. `spur serve` materializes and autostarts the roster only when true; an absent or disabled fleet starts nothing."
|
|
184
|
+
},
|
|
185
|
+
"strategy": {
|
|
186
|
+
"type": "string",
|
|
187
|
+
"enum": ["rest", "gtd"],
|
|
188
|
+
"default": "rest",
|
|
189
|
+
"description": "Dispatch strategy, reconciled into project_strategy at serve start (0859). One name is added by a typed code change, not by config."
|
|
190
|
+
},
|
|
191
|
+
"orchestrator": {
|
|
192
|
+
"type": "string",
|
|
193
|
+
"minLength": 1,
|
|
194
|
+
"description": "memberLocalId of the one planner-role member carrying purpose: orchestrator. Absent = no orchestrator declared (never inferred)."
|
|
195
|
+
},
|
|
196
|
+
"members": {
|
|
197
|
+
"type": "array",
|
|
198
|
+
"default": [],
|
|
199
|
+
"description": "The roster. Each member declares a role or an executor. `enabled: false` keeps the member's derived <role>-<n> id index but does not materialize it.",
|
|
200
|
+
"items": {
|
|
201
|
+
"type": "object",
|
|
202
|
+
"properties": {
|
|
203
|
+
"id": {
|
|
204
|
+
"type": "string",
|
|
205
|
+
"minLength": 1,
|
|
206
|
+
"description": "Explicit stable id; wins over the derived <role>-<n> form."
|
|
207
|
+
},
|
|
208
|
+
"role": {
|
|
209
|
+
"type": "string",
|
|
210
|
+
"enum": ["scribe", "coder", "reviewer", "planner"],
|
|
211
|
+
"description": "Layer-1 role id (closed vocabulary)."
|
|
212
|
+
},
|
|
213
|
+
"executor": {
|
|
214
|
+
"type": "string",
|
|
215
|
+
"minLength": 1,
|
|
216
|
+
"description": "Executor profile name or a raw canonical agent type."
|
|
217
|
+
},
|
|
218
|
+
"purpose": {
|
|
219
|
+
"type": "string",
|
|
220
|
+
"description": "Free-form member purpose; `orchestrator` is the value the orchestrator pointer binds to."
|
|
221
|
+
},
|
|
222
|
+
"enabled": {
|
|
223
|
+
"type": "boolean",
|
|
224
|
+
"description": "Default true. False preserves the member's derived id index without materializing it."
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
"anyOf": [{ "required": ["role"] }, { "required": ["executor"] }]
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
},
|
|
176
232
|
"roles": {
|
|
177
233
|
"type": "object",
|
|
178
234
|
"description": "Per-role tier/stage overrides over DEFAULT_AGENT_ROLES (0572 / ADR-061). Keys are the closed role vocabulary (scribe, coder, reviewer, planner); a present field replaces the default for that role, an omitted field keeps it. Mirrors @gobing-ai/spur-config AgentRoleConfigSchema (Zod is SSOT).",
|
|
@@ -192,91 +248,6 @@
|
|
|
192
248
|
}
|
|
193
249
|
}
|
|
194
250
|
}
|
|
195
|
-
},
|
|
196
|
-
"team": {
|
|
197
|
-
"type": "object",
|
|
198
|
-
"description": "Declarative agent teams keyed by team id (the map key is the teamId). Each team materializes a roster of agent specs (feature M). Mirrors @gobing-ai/spur-config TeamConfigSchema (Zod is SSOT).",
|
|
199
|
-
"additionalProperties": {
|
|
200
|
-
"type": "object",
|
|
201
|
-
"required": ["name", "work_dir", "members"],
|
|
202
|
-
"properties": {
|
|
203
|
-
"name": {
|
|
204
|
-
"type": "string",
|
|
205
|
-
"minLength": 1,
|
|
206
|
-
"description": "Human-readable team label."
|
|
207
|
-
},
|
|
208
|
-
"work_dir": {
|
|
209
|
-
"type": "string",
|
|
210
|
-
"minLength": 1,
|
|
211
|
-
"description": "Default member workspace. A leading `~` is tilde-expanded at load."
|
|
212
|
-
},
|
|
213
|
-
"autostart": {
|
|
214
|
-
"type": "boolean",
|
|
215
|
-
"description": "Team-wide autostart default; per-member autostart overrides (effective = member.autostart ?? team.autostart ?? false)."
|
|
216
|
-
},
|
|
217
|
-
"members": {
|
|
218
|
-
"type": "array",
|
|
219
|
-
"minItems": 1,
|
|
220
|
-
"description": "Roster of member references (>= 1). A bare string is shorthand for { executor: <string> }; the composed agent id is <teamId>-<id ?? executor>.",
|
|
221
|
-
"items": {
|
|
222
|
-
"oneOf": [
|
|
223
|
-
{
|
|
224
|
-
"type": "string",
|
|
225
|
-
"minLength": 1
|
|
226
|
-
},
|
|
227
|
-
{
|
|
228
|
-
"type": "object",
|
|
229
|
-
"properties": {
|
|
230
|
-
"executor": {
|
|
231
|
-
"type": "string",
|
|
232
|
-
"minLength": 1,
|
|
233
|
-
"description": "Executor name \u2014 resolved against agent.executors first, else a raw canonical agent type. Optional since 0543: a role-only member (no executor) resolves one through the tier ladder at materialization; at least one of role or executor is required."
|
|
234
|
-
},
|
|
235
|
-
"id": {
|
|
236
|
-
"type": "string",
|
|
237
|
-
"minLength": 1,
|
|
238
|
-
"description": "Local member id; composed id is <teamId>-<id ?? executor> (must match ^[a-z][a-z0-9_-]{1,63}$)."
|
|
239
|
-
},
|
|
240
|
-
"purpose": {
|
|
241
|
-
"type": "string"
|
|
242
|
-
},
|
|
243
|
-
"role": {
|
|
244
|
-
"type": "string",
|
|
245
|
-
"enum": ["scribe", "coder", "reviewer", "planner"],
|
|
246
|
-
"description": "Layer-1 role id (0538 R3): typed routing field carried onto the materialized spec; purpose stays prose."
|
|
247
|
-
},
|
|
248
|
-
"workspace": {
|
|
249
|
-
"type": "string",
|
|
250
|
-
"minLength": 1,
|
|
251
|
-
"description": "Per-member workspace override. A leading `~` is tilde-expanded at load."
|
|
252
|
-
},
|
|
253
|
-
"model": {
|
|
254
|
-
"type": "string",
|
|
255
|
-
"minLength": 1
|
|
256
|
-
},
|
|
257
|
-
"autonomy": {
|
|
258
|
-
"type": "string"
|
|
259
|
-
},
|
|
260
|
-
"systemPrompt": {
|
|
261
|
-
"type": "string"
|
|
262
|
-
},
|
|
263
|
-
"command": {
|
|
264
|
-
"type": "array",
|
|
265
|
-
"items": {
|
|
266
|
-
"type": "string",
|
|
267
|
-
"minLength": 1
|
|
268
|
-
}
|
|
269
|
-
},
|
|
270
|
-
"autostart": {
|
|
271
|
-
"type": "boolean"
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
}
|
|
275
|
-
]
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
}
|
|
279
|
-
}
|
|
280
251
|
}
|
|
281
252
|
}
|
|
282
253
|
},
|
|
@@ -333,6 +304,55 @@
|
|
|
333
304
|
}
|
|
334
305
|
}
|
|
335
306
|
},
|
|
307
|
+
"builder": {
|
|
308
|
+
"type": "object",
|
|
309
|
+
"description": "Builder noun configuration. Currently hosts the release plumbing knobs for `spur builder bump-ver` / `drop-tags`; every field defaults to the built-in release convention, so an absent builder section keeps default behavior.",
|
|
310
|
+
"properties": {
|
|
311
|
+
"bump-ver": {
|
|
312
|
+
"type": "object",
|
|
313
|
+
"description": "Release knobs for bump-ver/drop-tags. Defaults: -v separator, publish.yml workflow, chore(release) commit, gh run list limit 5.",
|
|
314
|
+
"properties": {
|
|
315
|
+
"tagVersionSeparator": {
|
|
316
|
+
"type": "string",
|
|
317
|
+
"minLength": 1,
|
|
318
|
+
"description": "Release tag format: <package><separator><version>. Default \"-v\"."
|
|
319
|
+
},
|
|
320
|
+
"publishWorkflow": {
|
|
321
|
+
"type": "string",
|
|
322
|
+
"minLength": 1,
|
|
323
|
+
"description": "GitHub Actions workflow file the pushed release tag triggers. Default \"publish.yml\"."
|
|
324
|
+
},
|
|
325
|
+
"releaseCommitType": {
|
|
326
|
+
"type": "string",
|
|
327
|
+
"minLength": 1,
|
|
328
|
+
"description": "Conventional commit type for the release commit. Default \"chore\"."
|
|
329
|
+
},
|
|
330
|
+
"releaseCommitScope": {
|
|
331
|
+
"type": "string",
|
|
332
|
+
"minLength": 1,
|
|
333
|
+
"description": "Conventional commit scope for the release commit. Default \"release\"."
|
|
334
|
+
},
|
|
335
|
+
"ghRunListLimit": {
|
|
336
|
+
"type": "integer",
|
|
337
|
+
"minimum": 1,
|
|
338
|
+
"description": "gh run list --limit used to point at the triggered publish run. Default 5."
|
|
339
|
+
},
|
|
340
|
+
"versionCarriers": {
|
|
341
|
+
"type": "array",
|
|
342
|
+
"description": "Extra version carriers beyond workspace package.json files. Default: none. Types are registered in apps/cli/src/version-carriers.ts (registerCarrierType), which validates instances at release time; registering a new type extends this description in the same commit.",
|
|
343
|
+
"items": {
|
|
344
|
+
"type": "object",
|
|
345
|
+
"description": "One carrier instance. Required field: type (string). Built-ins: plugin-manifest { paths: [..] } — repo-wide manifests synced to the release version (e.g. per-platform plugin.json mirrors); ts-literal { file?, identifier? } — version constant in a package source file (defaults src/config.ts / binaryVersion).",
|
|
346
|
+
"properties": {
|
|
347
|
+
"type": { "type": "string", "minLength": 1 }
|
|
348
|
+
},
|
|
349
|
+
"required": ["type"]
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
},
|
|
336
356
|
"tasks": {
|
|
337
357
|
"type": "object",
|
|
338
358
|
"description": "Task-folder registration (design \u00a79). Absorbs the legacy docs/.tasks/config.json folders + baseCounter concepts. Mirrors @gobing-ai/spur-config tasksConfigSchema (Zod is SSOT).",
|