@event4u/agent-config 1.12.0 → 1.14.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 (260) hide show
  1. package/.agent-src/commands/agent-handoff.md +3 -0
  2. package/.agent-src/commands/agent-status.md +3 -0
  3. package/.agent-src/commands/agents-audit.md +4 -0
  4. package/.agent-src/commands/agents-cleanup.md +6 -1
  5. package/.agent-src/commands/agents-prepare.md +3 -0
  6. package/.agent-src/commands/analyze-reference-repo.md +4 -0
  7. package/.agent-src/commands/bug-fix.md +5 -1
  8. package/.agent-src/commands/bug-investigate.md +4 -0
  9. package/.agent-src/commands/chat-history-checkpoint.md +126 -0
  10. package/.agent-src/commands/chat-history-clear.md +5 -0
  11. package/.agent-src/commands/chat-history-resume.md +5 -0
  12. package/.agent-src/commands/chat-history.md +5 -0
  13. package/.agent-src/commands/check-current-md.md +126 -0
  14. package/.agent-src/commands/commit-in-chunks.md +98 -0
  15. package/.agent-src/commands/commit.md +4 -0
  16. package/.agent-src/commands/compress.md +3 -0
  17. package/.agent-src/commands/context-create.md +4 -0
  18. package/.agent-src/commands/context-refactor.md +4 -0
  19. package/.agent-src/commands/copilot-agents-init.md +3 -0
  20. package/.agent-src/commands/copilot-agents-optimize.md +3 -0
  21. package/.agent-src/commands/create-pr-description.md +4 -0
  22. package/.agent-src/commands/create-pr.md +4 -0
  23. package/.agent-src/commands/do-and-judge.md +4 -1
  24. package/.agent-src/commands/do-in-steps.md +3 -0
  25. package/.agent-src/commands/e2e-heal.md +4 -0
  26. package/.agent-src/commands/e2e-plan.md +4 -0
  27. package/.agent-src/commands/estimate-ticket.md +4 -1
  28. package/.agent-src/commands/feature-dev.md +4 -0
  29. package/.agent-src/commands/feature-explore.md +4 -0
  30. package/.agent-src/commands/feature-plan.md +4 -0
  31. package/.agent-src/commands/feature-refactor.md +4 -0
  32. package/.agent-src/commands/feature-roadmap.md +6 -0
  33. package/.agent-src/commands/fix-ci.md +4 -0
  34. package/.agent-src/commands/fix-portability.md +3 -0
  35. package/.agent-src/commands/fix-pr-bot-comments.md +4 -0
  36. package/.agent-src/commands/fix-pr-comments.md +4 -0
  37. package/.agent-src/commands/fix-pr-developer-comments.md +4 -0
  38. package/.agent-src/commands/fix-references.md +3 -0
  39. package/.agent-src/commands/fix-seeder.md +4 -0
  40. package/.agent-src/commands/implement-ticket.md +39 -13
  41. package/.agent-src/commands/jira-ticket.md +4 -0
  42. package/.agent-src/commands/judge.md +3 -0
  43. package/.agent-src/commands/memory-add.md +5 -3
  44. package/.agent-src/commands/memory-full.md +5 -2
  45. package/.agent-src/commands/memory-promote.md +7 -6
  46. package/.agent-src/commands/mode.md +3 -0
  47. package/.agent-src/commands/module-create.md +4 -0
  48. package/.agent-src/commands/module-explore.md +4 -0
  49. package/.agent-src/commands/onboard.md +24 -0
  50. package/.agent-src/commands/optimize-agents.md +4 -0
  51. package/.agent-src/commands/optimize-augmentignore.md +3 -0
  52. package/.agent-src/commands/optimize-rtk-filters.md +3 -0
  53. package/.agent-src/commands/optimize-skills.md +4 -0
  54. package/.agent-src/commands/override-create.md +4 -0
  55. package/.agent-src/commands/override-manage.md +4 -0
  56. package/.agent-src/commands/package-reset.md +3 -0
  57. package/.agent-src/commands/package-test.md +3 -0
  58. package/.agent-src/commands/prepare-for-review.md +4 -0
  59. package/.agent-src/commands/project-analyze.md +4 -0
  60. package/.agent-src/commands/project-health.md +4 -0
  61. package/.agent-src/commands/propose-memory.md +6 -8
  62. package/.agent-src/commands/quality-fix.md +4 -0
  63. package/.agent-src/commands/refine-ticket.md +4 -1
  64. package/.agent-src/commands/review-changes.md +4 -0
  65. package/.agent-src/commands/review-routing.md +4 -0
  66. package/.agent-src/commands/roadmap-create.md +7 -0
  67. package/.agent-src/commands/roadmap-execute.md +12 -1
  68. package/.agent-src/commands/rule-compliance-audit.md +4 -0
  69. package/.agent-src/commands/set-cost-profile.md +3 -0
  70. package/.agent-src/commands/sync-agent-settings.md +3 -0
  71. package/.agent-src/commands/sync-gitignore.md +3 -0
  72. package/.agent-src/commands/tests-create.md +4 -0
  73. package/.agent-src/commands/tests-execute.md +4 -0
  74. package/.agent-src/commands/threat-model.md +4 -0
  75. package/.agent-src/commands/update-form-request-messages.md +4 -0
  76. package/.agent-src/commands/upstream-contribute.md +4 -0
  77. package/.agent-src/commands/work.md +161 -0
  78. package/.agent-src/guidelines/agent-infra/engineering-memory-data-format.md +2 -6
  79. package/.agent-src/guidelines/agent-infra/layered-settings.md +0 -1
  80. package/.agent-src/guidelines/agent-infra/memory-access.md +0 -7
  81. package/.agent-src/guidelines/agent-infra/role-contracts.md +2 -4
  82. package/.agent-src/guidelines/agent-infra/self-improvement-pipeline.md +0 -1
  83. package/.agent-src/guidelines/php/patterns/strategy.md +180 -2
  84. package/.agent-src/personas/README.md +0 -1
  85. package/.agent-src/rules/artifact-drafting-protocol.md +7 -2
  86. package/.agent-src/rules/artifact-engagement-recording.md +133 -0
  87. package/.agent-src/rules/ask-when-uncertain.md +18 -13
  88. package/.agent-src/rules/augment-portability.md +8 -0
  89. package/.agent-src/rules/autonomous-execution.md +158 -0
  90. package/.agent-src/rules/chat-history.md +147 -118
  91. package/.agent-src/rules/cli-output-handling.md +26 -3
  92. package/.agent-src/rules/command-suggestion.md +133 -0
  93. package/.agent-src/rules/commit-policy.md +99 -0
  94. package/.agent-src/rules/direct-answers.md +114 -0
  95. package/.agent-src/rules/docs-sync.md +36 -0
  96. package/.agent-src/rules/downstream-changes.md +10 -9
  97. package/.agent-src/rules/improve-before-implement.md +9 -6
  98. package/.agent-src/rules/language-and-tone.md +81 -6
  99. package/.agent-src/rules/non-destructive-by-default.md +117 -0
  100. package/.agent-src/rules/package-ci-checks.md +4 -0
  101. package/.agent-src/rules/preservation-guard.md +20 -0
  102. package/.agent-src/rules/roadmap-progress-sync.md +103 -30
  103. package/.agent-src/rules/scope-control.md +42 -1
  104. package/.agent-src/rules/size-enforcement.md +1 -3
  105. package/.agent-src/rules/skill-quality.md +3 -8
  106. package/.agent-src/rules/ui-audit-before-build.md +106 -0
  107. package/.agent-src/rules/user-interaction.md +81 -3
  108. package/.agent-src/scripts/update_roadmap_progress.py +48 -6
  109. package/.agent-src/skills/blade-ui/SKILL.md +30 -5
  110. package/.agent-src/skills/command-routing/SKILL.md +32 -0
  111. package/.agent-src/skills/command-writing/SKILL.md +41 -2
  112. package/.agent-src/skills/description-assist/SKILL.md +21 -0
  113. package/.agent-src/skills/estimate-ticket/SKILL.md +0 -1
  114. package/.agent-src/skills/existing-ui-audit/SKILL.md +187 -0
  115. package/.agent-src/skills/fe-design/SKILL.md +72 -60
  116. package/.agent-src/skills/finishing-a-development-branch/SKILL.md +4 -0
  117. package/.agent-src/skills/flux/SKILL.md +31 -4
  118. package/.agent-src/skills/guideline-writing/SKILL.md +24 -2
  119. package/.agent-src/skills/learning-to-rule-or-skill/SKILL.md +51 -9
  120. package/.agent-src/skills/livewire/SKILL.md +30 -4
  121. package/.agent-src/skills/md-language-check/SKILL.md +103 -0
  122. package/.agent-src/skills/php-coder/SKILL.md +24 -0
  123. package/.agent-src/skills/react-shadcn-ui/SKILL.md +121 -0
  124. package/.agent-src/skills/refine-prompt/SKILL.md +220 -0
  125. package/.agent-src/skills/refine-ticket/SKILL.md +2 -4
  126. package/.agent-src/skills/roadmap-management/SKILL.md +10 -3
  127. package/.agent-src/skills/rule-writing/SKILL.md +23 -1
  128. package/.agent-src/skills/skill-writing/SKILL.md +1 -3
  129. package/.agent-src/skills/upstream-contribute/SKILL.md +1 -1
  130. package/.agent-src/skills/using-git-worktrees/SKILL.md +3 -1
  131. package/.agent-src/templates/AGENTS.md +24 -6
  132. package/.agent-src/templates/agent-settings.md +149 -0
  133. package/.agent-src/templates/github-workflows/roadmap-progress-check.yml +63 -0
  134. package/.agent-src/templates/hooks/pre-commit-roadmap-progress +60 -0
  135. package/.agent-src/templates/roadmaps.md +8 -2
  136. package/.agent-src/templates/scripts/implement_ticket/__init__.py +63 -26
  137. package/.agent-src/templates/scripts/implement_ticket/__main__.py +8 -2
  138. package/.agent-src/templates/scripts/memory_lookup.py +382 -21
  139. package/.agent-src/templates/scripts/memory_status.py +110 -9
  140. package/.agent-src/templates/scripts/telemetry/__init__.py +42 -0
  141. package/.agent-src/templates/scripts/telemetry/aggregator.py +154 -0
  142. package/.agent-src/templates/scripts/telemetry/boundary.py +171 -0
  143. package/.agent-src/templates/scripts/telemetry/engagement.py +238 -0
  144. package/.agent-src/templates/scripts/telemetry/report_renderer.py +170 -0
  145. package/.agent-src/templates/scripts/telemetry/settings.py +112 -0
  146. package/.agent-src/templates/scripts/telemetry_record.py +166 -0
  147. package/.agent-src/templates/scripts/telemetry_report.py +161 -0
  148. package/.agent-src/templates/scripts/telemetry_status.py +142 -0
  149. package/.agent-src/templates/scripts/work_engine/__init__.py +58 -0
  150. package/.agent-src/templates/scripts/work_engine/__main__.py +9 -0
  151. package/.agent-src/templates/scripts/work_engine/cli.py +592 -0
  152. package/.agent-src/templates/scripts/{implement_ticket → work_engine}/delivery_state.py +7 -0
  153. package/.agent-src/templates/scripts/work_engine/directives/__init__.py +33 -0
  154. package/.agent-src/templates/scripts/work_engine/directives/backend/__init__.py +98 -0
  155. package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/analyze.py +1 -1
  156. package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/implement.py +2 -2
  157. package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/memory.py +1 -1
  158. package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/plan.py +1 -1
  159. package/.agent-src/templates/scripts/work_engine/directives/backend/refine.py +396 -0
  160. package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/report.py +36 -4
  161. package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/test.py +2 -2
  162. package/.agent-src/templates/scripts/{implement_ticket/steps → work_engine/directives/backend}/verify.py +2 -2
  163. package/.agent-src/templates/scripts/work_engine/directives/mixed/__init__.py +116 -0
  164. package/.agent-src/templates/scripts/work_engine/directives/mixed/contract.py +254 -0
  165. package/.agent-src/templates/scripts/work_engine/directives/mixed/stitch.py +229 -0
  166. package/.agent-src/templates/scripts/work_engine/directives/mixed/ui.py +231 -0
  167. package/.agent-src/templates/scripts/work_engine/directives/ui/__init__.py +113 -0
  168. package/.agent-src/templates/scripts/work_engine/directives/ui/_passthrough.py +44 -0
  169. package/.agent-src/templates/scripts/work_engine/directives/ui/apply.py +241 -0
  170. package/.agent-src/templates/scripts/work_engine/directives/ui/audit.py +414 -0
  171. package/.agent-src/templates/scripts/work_engine/directives/ui/design.py +335 -0
  172. package/.agent-src/templates/scripts/work_engine/directives/ui/polish.py +510 -0
  173. package/.agent-src/templates/scripts/work_engine/directives/ui/review.py +468 -0
  174. package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/__init__.py +119 -0
  175. package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/_skipped.py +37 -0
  176. package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/apply.py +165 -0
  177. package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/refine.py +66 -0
  178. package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/report.py +62 -0
  179. package/.agent-src/templates/scripts/work_engine/directives/ui_trivial/test.py +115 -0
  180. package/.agent-src/templates/scripts/work_engine/dispatcher.py +331 -0
  181. package/.agent-src/templates/scripts/work_engine/hooks/__init__.py +54 -0
  182. package/.agent-src/templates/scripts/work_engine/hooks/builtin/__init__.py +32 -0
  183. package/.agent-src/templates/scripts/work_engine/hooks/builtin/_chat_history_base.py +103 -0
  184. package/.agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_append.py +44 -0
  185. package/.agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_halt_append.py +42 -0
  186. package/.agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_heartbeat.py +50 -0
  187. package/.agent-src/templates/scripts/work_engine/hooks/builtin/chat_history_turn_check.py +49 -0
  188. package/.agent-src/templates/scripts/work_engine/hooks/builtin/directive_set_guard.py +53 -0
  189. package/.agent-src/templates/scripts/work_engine/hooks/builtin/halt_surface_audit.py +50 -0
  190. package/.agent-src/templates/scripts/work_engine/hooks/builtin/state_shape_validation.py +52 -0
  191. package/.agent-src/templates/scripts/work_engine/hooks/builtin/trace.py +84 -0
  192. package/.agent-src/templates/scripts/work_engine/hooks/context.py +66 -0
  193. package/.agent-src/templates/scripts/work_engine/hooks/events.py +44 -0
  194. package/.agent-src/templates/scripts/work_engine/hooks/exceptions.py +79 -0
  195. package/.agent-src/templates/scripts/work_engine/hooks/registry.py +60 -0
  196. package/.agent-src/templates/scripts/work_engine/hooks/runner.py +73 -0
  197. package/.agent-src/templates/scripts/work_engine/hooks/settings.py +141 -0
  198. package/.agent-src/templates/scripts/work_engine/intent/__init__.py +47 -0
  199. package/.agent-src/templates/scripts/work_engine/intent/classify.py +280 -0
  200. package/.agent-src/templates/scripts/work_engine/migration/__init__.py +8 -0
  201. package/.agent-src/templates/scripts/work_engine/migration/v0_to_v1.py +199 -0
  202. package/.agent-src/templates/scripts/work_engine/resolvers/__init__.py +22 -0
  203. package/.agent-src/templates/scripts/work_engine/resolvers/diff.py +106 -0
  204. package/.agent-src/templates/scripts/work_engine/resolvers/file.py +113 -0
  205. package/.agent-src/templates/scripts/work_engine/resolvers/prompt.py +90 -0
  206. package/.agent-src/templates/scripts/work_engine/scoring/__init__.py +14 -0
  207. package/.agent-src/templates/scripts/work_engine/scoring/confidence.py +300 -0
  208. package/.agent-src/templates/scripts/work_engine/stack/__init__.py +31 -0
  209. package/.agent-src/templates/scripts/work_engine/stack/detect.py +187 -0
  210. package/.agent-src/templates/scripts/work_engine/state.py +641 -0
  211. package/.claude-plugin/marketplace.json +105 -2
  212. package/AGENTS.md +36 -8
  213. package/CHANGELOG.md +558 -0
  214. package/README.md +146 -4
  215. package/composer.json +3 -0
  216. package/config/agent-settings.template.yml +45 -0
  217. package/config/gitignore-block.txt +4 -0
  218. package/docs/architecture.md +28 -1
  219. package/docs/development.md +1 -1
  220. package/docs/getting-started.md +3 -2
  221. package/docs/installation.md +86 -0
  222. package/docs/showcase.md +204 -0
  223. package/package.json +9 -1
  224. package/scripts/agent-config +274 -0
  225. package/scripts/audit_cloud_compatibility.py +288 -0
  226. package/scripts/build_cloud_bundle.py +458 -0
  227. package/scripts/build_linear_digest.py +263 -0
  228. package/scripts/chat_history.py +796 -7
  229. package/scripts/check_compression.py +139 -0
  230. package/scripts/check_iron_law_prominence.py +143 -0
  231. package/scripts/check_md_language.py +159 -0
  232. package/scripts/check_portability.py +36 -0
  233. package/scripts/check_reply_consistency.py +140 -0
  234. package/scripts/command_suggester/__init__.py +51 -0
  235. package/scripts/command_suggester/cooldown.py +132 -0
  236. package/scripts/command_suggester/loader.py +70 -0
  237. package/scripts/command_suggester/match.py +180 -0
  238. package/scripts/command_suggester/rank.py +120 -0
  239. package/scripts/command_suggester/render.py +86 -0
  240. package/scripts/command_suggester/sanitize.py +113 -0
  241. package/scripts/command_suggester/settings.py +125 -0
  242. package/scripts/command_suggester/types.py +78 -0
  243. package/scripts/hooks/augment-chat-history.sh +56 -0
  244. package/scripts/install-hooks.sh +67 -0
  245. package/scripts/install.py +150 -33
  246. package/scripts/lint_marketplace.py +27 -0
  247. package/scripts/memory_lookup.py +143 -7
  248. package/scripts/memory_status.py +76 -14
  249. package/scripts/migrate_command_suggestions.py +151 -0
  250. package/scripts/postinstall.sh +16 -0
  251. package/scripts/schemas/command.schema.json +41 -0
  252. package/scripts/skill_linter.py +67 -0
  253. package/scripts/sync_agent_settings.py +42 -12
  254. package/templates/consumer-settings/augment-cli-hooks.json +54 -0
  255. package/templates/consumer-settings/claude-settings.json +55 -1
  256. package/.agent-src/templates/scripts/implement_ticket/cli.py +0 -171
  257. package/.agent-src/templates/scripts/implement_ticket/dispatcher.py +0 -134
  258. package/.agent-src/templates/scripts/implement_ticket/steps/__init__.py +0 -49
  259. package/.agent-src/templates/scripts/implement_ticket/steps/refine.py +0 -140
  260. /package/.agent-src/templates/scripts/{implement_ticket → work_engine}/persona_policy.py +0 -0
@@ -1,19 +1,35 @@
1
1
  ---
2
2
  name: blade-ui
3
- description: "Use when creating or editing Blade views, components, partials, layouts, or view logic even when the user says 'add a new page' or 'render this data' without naming Blade."
3
+ description: "Stack-implementation skill for Laravel Blade dispatched by `directives/ui/apply.py` (and `review.py` / `polish.py`) when the project's frontend stack is Blade. Covers views, components, partials, layouts, and view logic."
4
4
  source: package
5
5
  ---
6
6
 
7
7
  # blade-ui
8
8
 
9
+ ## Positioning — dispatched, not standalone
10
+
11
+ `blade-ui` is the **apply-step executor** for the Blade stack. Invoked by [`directives/ui/apply.py`](../../templates/scripts/work_engine/directives/ui/apply.py) once the design brief is locked, and revisited by `review.py` / `polish.py` during the design-review loop. Does **not** own the flow, drive the audit, or lock the design.
12
+
13
+ | Concern | Owner |
14
+ |---|---|
15
+ | Audit + token inventory (mandatory pre-step) | [`existing-ui-audit`](../existing-ui-audit/SKILL.md) |
16
+ | Design brief (layout / states / microcopy) | [`directives/ui/design.py`](../../templates/scripts/work_engine/directives/ui/design.py) |
17
+ | Universal design heuristics | [`fe-design`](../fe-design/SKILL.md) |
18
+ | Review + polish loop | [`directives/ui/review.py`](../../templates/scripts/work_engine/directives/ui/review.py) + [`polish.py`](../../templates/scripts/work_engine/directives/ui/polish.py) |
19
+
9
20
  ## When to use
10
21
 
11
- Use when creating or editing Blade views, components, partials, layouts, or forms.
22
+ Cite this skill when:
23
+
24
+ - `state.stack.frontend == "blade"` (or the project is clearly Blade-only without Livewire / Flux) and `directives/ui/apply.py` dispatches to this skill
25
+ - Editing or creating Blade views, components, partials, layouts, or forms
12
26
 
13
27
  Do NOT use when:
28
+
14
29
  - API-only endpoints (use `api-endpoint` skill)
15
- - Livewire components (use `livewire` skill)
30
+ - Livewire components (use `livewire` skill — composes Blade views internally)
16
31
  - Flux UI components (use `flux` skill)
32
+ - Driving the full UI flow yourself — that is the `directives/ui/` orchestrator
17
33
 
18
34
  ## Procedure: Create Blade view or component
19
35
 
@@ -23,11 +39,11 @@ Do NOT use when:
23
39
  2. Inspect existing UI patterns — layouts, partials, component naming, CSS conventions.
24
40
  3. Check form handling style — old input, validation errors, session flashes, reusable field partials.
25
41
  4. Inspect neighboring templates — match indentation, directives, slot usage, classes.
26
- 5. Determine data flow — what belongs in controller/view model vs. template.
42
+ 5. Determine data flow — controller/view model vs. template.
27
43
 
28
44
  ### Step 1: Create the template
29
45
 
30
- 1. Use the project's existing layout system.
46
+ 1. Use project's existing layout system.
31
47
  2. Keep template presentation-focused — no business logic, no DB queries.
32
48
  3. Extract repeated sections into partials or components.
33
49
 
@@ -54,6 +70,15 @@ Do NOT use when:
54
70
  1. Blade view or component file(s) following project conventions
55
71
  2. Component class (if applicable) with typed props
56
72
 
73
+ ### Review pass — a11y findings + preview envelope
74
+
75
+ When dispatched by `directives/ui/review.py` (test slot) or `directives/ui/polish.py` (verify slot) — review/polish run, not initial apply — also emits:
76
+
77
+ - `state.ui_review.a11y` — `{violations: [{rule, selector, severity}, ...], severity_floor?, accepted_violations?}`. Use same `(rule, selector)` shape as `state.ui_audit.a11y_baseline` so engine's de-dup matches pre-existing entries on replay. Omit envelope on apply passes; engine's `_apply_a11y_gate` only fires when baseline present.
78
+ - `state.ui_review.preview` — `{render_ok: bool, screenshot_path?, dom_dump_path?, error?, skipped?}`. `render_ok: false` with `error` populated triggers `preview_render_failed` halt; `render_ok: true` with `screenshot_path` threads screenshot into delivery report's `artifacts` list. Browser tooling (Playwright/Cypress/…) is consumer-project dependency — package does not ship one.
79
+
80
+ Polish dispatch: when dispatcher skips `review` because previous review pass returned `SUCCESS`, this skill MUST itself synthesise updated `state.ui_review.findings` (including remaining `a11y_violation` entries) so engine's gate sees current state on next polish round.
81
+
57
82
  ## Gotcha
58
83
 
59
84
  - `@include` shares parent scope — components don't. Know the difference.
@@ -40,6 +40,38 @@ Only ask the user if inference fails and the command cannot proceed without the
40
40
  | `.augment/commands/` | Shared commands (work across projects) |
41
41
  | `agents/overrides/commands/` | Project-specific overrides (used instead of original) |
42
42
 
43
+ ## Commands that dispatch to a Python engine
44
+
45
+ Most commands are pure markdown procedures — the agent reads the steps
46
+ and executes them. Two commands delegate to the `work_engine` Python
47
+ module via the `./agent-config` dispatcher; both share the same
48
+ Option-A loop (read state → run engine → handle exit code → repeat),
49
+ they only differ in the input envelope they build:
50
+
51
+ | Command | Subcommand | Envelope | Use when |
52
+ |---|---|---|---|
53
+ | `/implement-ticket` | `./agent-config implement-ticket` | `input.kind="ticket"` | User points at a Jira/Linear ticket or supplies a structured ticket payload |
54
+ | `/work` | `./agent-config work` | `input.kind="prompt"` | User supplies a free-form prompt — no ticket id, no acceptance criteria yet |
55
+
56
+ Route prompt-shaped intents (`"add a CSV export endpoint…"`,
57
+ `"fix the failing login test"`, `"refactor the audit-log controller"`)
58
+ to `/work`. Route ticket-shaped intents
59
+ (`"work on PROJ-123"`, `"start on the ticket on this branch"`) to
60
+ `/implement-ticket`. If the user pastes both a ticket id **and** a
61
+ free-form goal, prefer `/implement-ticket` and let it pull the AC from
62
+ the ticket — `/work` is the fallback when no ticket exists.
63
+
64
+ The actual step logic, halt formats, scoring breakdowns, and delivery
65
+ report are emitted by the engine. Do not paraphrase or reorder engine
66
+ output — surface it as-is. The two flows are mutually exclusive at the
67
+ state-file level: one `.work-state.json` carries one envelope at a
68
+ time, and the engine refuses to switch mid-flight.
69
+
70
+ A sibling subcommand `./agent-config migrate-state` upgrades a legacy
71
+ `.implement-ticket-state.json` file to the v1 `.work-state.json`
72
+ schema. The wrapper invokes it automatically when the legacy file is
73
+ detected; agents should not bypass the dispatcher.
74
+
43
75
  ## GitHub API: Replying to PR review comments
44
76
 
45
77
  When commands reply to PR review comments (e.g. `/fix-pr-bot-comments`):
@@ -4,6 +4,8 @@ description: "Use when creating or editing a slash command in .agent-src.uncompr
4
4
  source: package
5
5
  ---
6
6
 
7
+ <!-- cloud_safe: degrade -->
8
+
7
9
  # command-writing
8
10
 
9
11
  ## When to use
@@ -58,9 +60,26 @@ name: {command-name} # must match filename without .md
58
60
  description: "Short human-readable summary of what /{name} does"
59
61
  disable-model-invocation: true
60
62
  skills: [optional-skill-1] # optional — skills this command delegates to
63
+ suggestion: # required (road-to-context-aware-command-suggestion Phase 2)
64
+ eligible: true # default; set false to opt out of auto-surfacing
65
+ trigger_description: "natural-language pattern, comma-separated examples"
66
+ trigger_context: "concrete signal — branch name, file pattern, recent tool output"
61
67
  ---
62
68
  ```
63
69
 
70
+ Opt-out shape:
71
+
72
+ ```yaml
73
+ suggestion:
74
+ eligible: false
75
+ rationale: "one-line reason this command must be invoked deliberately"
76
+ ```
77
+
78
+ Linter enforces ≥10-char triggers when eligible; rationale required when
79
+ ineligible. Optional `confidence_floor` (0.0–1.0) and `cooldown` (e.g. `10m`)
80
+ override the global settings per command. Eligibility decisions live in
81
+ [`agents/contexts/command-suggestion-eligibility.md`](../../../agents/contexts/command-suggestion-eligibility.md).
82
+
64
83
  When iterating on the description, delegate to the
65
84
  [`description-assist`](../description-assist/SKILL.md) skill — approval-gated,
66
85
  no silent edits, max two rounds.
@@ -105,8 +124,8 @@ multi-paragraph explanation, extract it into a skill and call it.
105
124
  * Run `bash scripts/compress.sh --sync` → regenerates `.agent-src/commands/{name}.md`.
106
125
  * Run `python3 scripts/compress.py --generate-tools` → creates the Claude symlink at
107
126
  `.claude/skills/{name}/SKILL.md`.
108
- * Run the full CI pipeline locally each script directly must exit 0
109
- except for tolerated warnings.
127
+ * Run the full CI pipeline locally (see `Taskfile.yml` in this repo for
128
+ the script list) — must exit 0 except for tolerated warnings.
110
129
 
111
130
  ## Output format
112
131
 
@@ -133,6 +152,26 @@ multi-paragraph explanation, extract it into a skill and call it.
133
152
  * Do NOT edit `.agent-src/`, `.augment/`, or `.claude/` projections
134
153
  * Do NOT exceed the hard size limit without a waiver
135
154
 
155
+ ## Cloud Behavior
156
+
157
+ On cloud surfaces (Claude.ai Web, Skills API) the package's
158
+ `scripts/skill_linter.py`, `scripts/compress.py`, and the `task`
159
+ runner are not available. This skill still applies — but with
160
+ prose-only validation:
161
+
162
+ * Emit the full command file as a copyable Markdown block. Do not
163
+ attempt to write it to disk.
164
+ * Self-check the frontmatter against the rules below — `name`,
165
+ `description`, `disable-model-invocation: true` MUST all be
166
+ present.
167
+ * Self-check the body shape: numbered steps, explicit safety gates,
168
+ no inline skill-level detail.
169
+ * Tell the user to save the file under
170
+ `.agent-src.uncompressed/commands/{name}.md` and run
171
+ `task sync && task lint-skills` locally before committing.
172
+ * Skip every reference to running the linter, compressor, or
173
+ generators yourself — they only run on the user's machine.
174
+
136
175
  ## Examples
137
176
 
138
177
  Good description (trigger-shaped, outcome-focused):
@@ -4,6 +4,8 @@ description: "Use when polishing a skill/rule/command/guideline frontmatter desc
4
4
  source: package
5
5
  ---
6
6
 
7
+ <!-- cloud_safe: degrade -->
8
+
7
9
  # description-assist
8
10
 
9
11
  ## When to use
@@ -155,6 +157,25 @@ and stop. Do not loop further.
155
157
  * Do NOT run `scripts/skill_trigger_eval.py` from inside this skill — eval
156
158
  execution spends API tokens and is a separate user action
157
159
 
160
+ ## Cloud Behavior
161
+
162
+ On cloud surfaces (Claude.ai Web, Skills API) the package's
163
+ `scripts/audit_skill_descriptions.py`, `scripts/skill_linter.py`,
164
+ and `scripts/skill_trigger_eval.py` are not reachable. The skill
165
+ still applies — with prose-only inspection:
166
+
167
+ * Reason from the description text in the conversation. The agent
168
+ acts as the inspector; no separate audit pass runs.
169
+ * Apply the same checklist used by the local audit: length budget,
170
+ trigger prefix ("Use when …"), domain class, symptom class,
171
+ undertrigger tail.
172
+ * Emit verdict + up to 3 numbered variants. The user picks; the
173
+ agent emits the new frontmatter as a copyable block.
174
+ * Skip every reference to running the audit or trigger-eval scripts.
175
+ Recommend the user run the package's local linter after applying.
176
+ * Never claim a description has been "graded" or "scored" by an
177
+ external pass — there isn't one.
178
+
158
179
  ## Examples
159
180
 
160
181
  Inspection verdict (good — compact):
@@ -182,5 +182,4 @@ copy-paste instructions if missing.
182
182
  - [`refine-ticket`](../refine-ticket/SKILL.md) — sibling; refine first if the ticket is vague
183
183
  - [`jira-ticket`](../../commands/jira-ticket.md) — ticket loader
184
184
  - [`feature-plan`](../../commands/feature-plan.md) — downstream planning
185
- - [`road-to-ticket-refinement.md`](../../../agents/roadmaps/road-to-ticket-refinement.md) — governing roadmap
186
185
  - [`artifact-drafting-protocol`](../../rules/artifact-drafting-protocol.md) — drafting protocol
@@ -0,0 +1,187 @@
1
+ ---
2
+ name: existing-ui-audit
3
+ description: "Use BEFORE writing or editing any non-trivial UI — inventories components, design tokens, shadcn primitives, and reusable patterns into state.ui_audit. Hard gate for the ui directive set."
4
+ source: package
5
+ ---
6
+
7
+ # existing-ui-audit
8
+
9
+ ## When to use
10
+
11
+ Use this skill when:
12
+ - The dispatcher has routed work to `directive_set="ui"` (intent `ui-build` or `ui-improve`)
13
+ - A `mixed` flow is about to enter its UI phase
14
+ - The user asks "what UI do we already have for X?"
15
+
16
+ Do NOT use when:
17
+ - `directive_set="ui-trivial"` — the trivial path bypasses audit by precondition (≤1 file, ≤5 lines, no new component, no new state, no new dep)
18
+ - `directive_set="backend"` — no UI surface to inventory
19
+ - The audit findings already exist in `state.ui_audit` for this state-file (cached) — re-run only if `package.json` or `composer.json` mtime changed
20
+
21
+ ## Procedure: Audit the existing UI surface
22
+
23
+ ### 0. Inspect stack and input
24
+
25
+ 1. Read `state.stack.frontend` — set by `scripts/work_engine/stack/detect.py` (one of `blade-livewire-flux`, `react-shadcn`, `vue`, `plain`).
26
+ 2. Read `state.input` — the request being processed. The audit must answer: "what already exists that is similar to this request?"
27
+
28
+ ### 1. Enumerate components and templates
29
+
30
+ | Stack | Where to look |
31
+ |---|---|
32
+ | `blade-livewire-flux` | `resources/views/components/`, `resources/views/livewire/`, `resources/views/partials/`, `resources/views/layouts/`, `app/View/Components/`, `app/Livewire/` |
33
+ | `react-shadcn` | `components/`, `app/components/`, `src/components/`, `src/app/(routes)/`, plus any `app/**/page.tsx` for Next.js |
34
+ | `vue` | `resources/js/components/`, `src/components/`, `pages/` |
35
+ | `plain` | `resources/views/`, plus any `*.html` under `public/` |
36
+
37
+ Capture each component/template as: `{path, name, kind: page|partial|component|layout, exports?: [props]}`.
38
+
39
+ ### 2. Identify the design system
40
+
41
+ Detect markers, in order. **Stop at the first match** — projects rarely run more than one design system.
42
+
43
+ | Marker | Signal | Where |
44
+ |---|---|---|
45
+ | Flux | `livewire/flux` in `composer.json`, `<flux:*>` tags in views | `composer.json`, grep `resources/views` |
46
+ | shadcn/ui | `components.json` exists at repo root | `components.json` |
47
+ | Headless UI | `@headlessui/react` or `@headlessui/vue` in `package.json` | `package.json` |
48
+ | Radix | `@radix-ui/*` in `package.json` (without shadcn marker) | `package.json` |
49
+ | Material/Chakra/Mantine/Ant | their package names in `package.json` | `package.json` |
50
+ | Custom / none | none of the above match | — |
51
+
52
+ ### 3. Detect design tokens
53
+
54
+ Write into `state.ui_audit.design_tokens` (object, never null — empty object is fine):
55
+
56
+ | Source | What to extract |
57
+ |---|---|
58
+ | `tailwind.config.{js,ts,cjs,mjs}` | `theme.colors`, `theme.spacing`, `theme.fontFamily`, `theme.extend.*` |
59
+ | `:root { --... }` blocks in `resources/css/`, `app/globals.css`, `src/app/globals.css` | every `--token-name: value` pair |
60
+ | `theme.json` / `tokens.json` (any depth) | flat or nested token tree |
61
+ | `app/css/variables.css`, `assets/scss/_tokens.scss` | SCSS `$var: value` and CSS custom properties |
62
+
63
+ Group output by category: `colors`, `spacing`, `radius`, `font`, `shadow`, `breakpoint`, `other`.
64
+
65
+ ### 4. Detect shadcn inventory (only when `state.stack.frontend == "react-shadcn"`)
66
+
67
+ Read `components.json` for the registered style + base color, then read `package.json` for `@radix-ui/*` and any locally vendored `components/ui/*.tsx` files. Write into `state.ui_audit.shadcn_inventory`:
68
+
69
+ ```
70
+ {
71
+ version: <from package.json shadcn registry CLI version, or null>,
72
+ style: "default" | "new-york" | <other>,
73
+ base_color: "slate" | "zinc" | ...,
74
+ primitives: ["Button", "Dialog", "Form", "Table", ...], // names of files in components/ui/
75
+ installed_radix: ["@radix-ui/react-dialog", ...] // raw radix list
76
+ }
77
+ ```
78
+
79
+ ### 5. List reusable patterns
80
+
81
+ Categorize what already exists. Empty arrays are valid, never omit the keys.
82
+
83
+ ```
84
+ state.ui_audit.patterns = {
85
+ forms: [<component path:str>, ...], // any component with <form>, useForm, <flux:input>, <Input> + <Button type=submit>
86
+ tables: [...], // <table>, <flux:table>, DataTable, headless table primitives
87
+ modals: [...], // <flux:modal>, <Dialog>, AlertDialog, Sheet
88
+ empty_states: [...], // components matching grep "no results"|"empty"|"keine"|"nothing yet"
89
+ navigation: [...], // sidebar, breadcrumb, tabs
90
+ data_display: [...] // cards, lists, stat tiles
91
+ }
92
+ ```
93
+
94
+ ### 6. Match candidates for the current input
95
+
96
+ For each item in `state.ui_audit.components`, score similarity to `state.input.data` (fuzzy on filename + props/slots + co-occurring terms). Keep top 5 with `score >= 0.3`. Write into `state.ui_audit.candidates`:
97
+
98
+ ```
99
+ [{path, name, score, reason: "matches 'settings' + 'toggle' in props"}, ...]
100
+ ```
101
+
102
+ If `candidates` is empty, the user is building net-new. That is normal — record the empty list, do not halt.
103
+
104
+ ### 7. Greenfield branch
105
+
106
+ If **all** are true:
107
+ - `state.ui_audit.components` is empty
108
+ - `state.ui_audit.design_system == "custom-or-none"`
109
+ - `state.ui_audit.design_tokens` is empty (no Tailwind config customizations, no `:root`)
110
+
111
+ then set `state.ui_audit.greenfield = true` and emit a halt:
112
+
113
+ ```
114
+ > No existing UI surface detected — this looks like greenfield.
115
+ >
116
+ > 1. Scaffold a minimal token set + a base component primitive folder
117
+ > before building (recommended for projects with >1 planned screen)
118
+ > 2. Proceed bare with Tailwind defaults (recommended for one-off prototypes)
119
+ > 3. Point me at an external design-system reference (URL or file)
120
+
121
+ **Recommendation: 1 — Scaffold tokens + primitives** — even one extra screen
122
+ benefits from a shared base; the scaffold cost is ~10 min and saves
123
+ re-doing every primitive on screen 2. Caveat: flip to 2 if this is a
124
+ demo or single-page prototype that will not grow.
125
+ ```
126
+
127
+ Record the user's pick in `state.ui_audit.greenfield_decision` (`scaffold` | `bare` | `external_reference`). Re-running the skill on the same state-file with `greenfield_decision` set is a no-op for the halt (audit findings stay).
128
+
129
+ ### 8. (Optional) Capture an a11y baseline
130
+
131
+ R4 visual-review-loop contract reads `state.ui_audit.a11y_baseline` when present; review gate filters incoming `state.ui_review.a11y.violations` against it so pre-existing violations stay informational and only NEW or CHANGED entries block polish loop. Without baseline gate sees every violation as actionable — fine for greenfield, noisy for legacy surfaces.
132
+
133
+ Capture baseline when:
134
+
135
+ - Audit covers components with known a11y debt project does not intend to fix this run (legacy templates, third-party embeds, vendor widgets).
136
+ - User says "don't block on existing a11y issues" or similar.
137
+
138
+ Skip baseline (omit key, leave `state.ui_audit.a11y_baseline` unset) when:
139
+
140
+ - Surface is greenfield — review gate should treat every violation as new.
141
+ - Project's a11y posture is "zero known violations" and any finding is by definition actionable.
142
+
143
+ Shape (each entry MUST carry at least `rule` + `selector`; severity optional but recommended so review gate's severity-floor filter behaves same on replay):
144
+
145
+ ```
146
+ state.ui_audit.a11y_baseline = [
147
+ {rule: "color-contrast", selector: ".legacy-tab", severity: "moderate"},
148
+ {rule: "label", selector: "form#search input[type=search]"},
149
+ ...
150
+ ]
151
+ ```
152
+
153
+ Producer parity: review skill that writes `state.ui_review.a11y.violations` MUST use same `(rule, selector)` shape, otherwise engine's de-dup will miss matches and pre-existing violations will surface as new findings on every run.
154
+
155
+ ### 9. Validate and write findings
156
+
157
+ 1. Verify every key in the **Output format** below is present in `state.ui_audit` (empty arrays/objects allowed; `null` only for `shadcn_inventory` outside the react-shadcn stack).
158
+ 2. Verify `state.ui_audit.greenfield == true` implies `state.ui_audit.greenfield_decision` is set.
159
+ 3. Write the full object back into the state-file. Audit completes with outcome `done` — the dispatcher's audit gate now passes.
160
+
161
+ ## Output format
162
+
163
+ 1. **`state.ui_audit.components`** — array of component/template descriptors (path, name, kind, exports)
164
+ 2. **`state.ui_audit.design_system`** — single string identifying the dominant system or `custom-or-none`
165
+ 3. **`state.ui_audit.design_tokens`** — object grouped by category (colors, spacing, radius, font, shadow, breakpoint, other)
166
+ 4. **`state.ui_audit.shadcn_inventory`** — object with version, style, base_color, primitives (only when stack is `react-shadcn`; `null` otherwise)
167
+ 5. **`state.ui_audit.patterns`** — object with forms, tables, modals, empty_states, navigation, data_display arrays
168
+ 6. **`state.ui_audit.candidates`** — top-5 similarity matches for the current input (may be empty)
169
+ 7. **`state.ui_audit.greenfield`** — boolean; when true, `greenfield_decision` MUST also be set before the dispatcher advances
170
+ 8. **`state.ui_audit.a11y_baseline`** *(optional)* — array of `{rule, selector, severity?}` entries documenting pre-existing a11y violations the review gate should treat as informational. Omit the key entirely when no baseline applies; do not write `[]` for "I checked and there are none" — that disables the gate's filter for every future run.
171
+
172
+ ## Gotcha
173
+
174
+ - The model tends to skip the audit and start designing straight from the request — the dispatcher gate at `directives/ui/audit.py` enforces "no design without audit findings". Never treat this skill as optional for non-trivial UI.
175
+ - The model tends to misidentify a single Tailwind utility as a "design token" — tokens come from the config or `:root`, not from class strings in templates.
176
+ - Don't assume a Radix-only `package.json` means shadcn — shadcn requires `components.json` at repo root.
177
+ - `state.ui_audit.shadcn_inventory.version` is often missing; the shadcn CLI does not always pin itself in `package.json`. Record `null` rather than guessing.
178
+ - Greenfield is detected, not assumed — a project with one Blade layout and no components is still greenfield only if tokens AND design system markers AND components are all empty.
179
+ - Re-running the skill on a stale state-file: cache by `(composer.json mtime, package.json mtime)`; if either changed, re-audit and overwrite.
180
+
181
+ ## Do NOT
182
+
183
+ - Do NOT advance to `directives/ui/design.py` or `apply.py` if `state.ui_audit` is empty.
184
+ - Do NOT advance to design or apply if `state.ui_audit.greenfield == true` and `state.ui_audit.greenfield_decision` is unset.
185
+ - Do NOT silently skip the greenfield halt because "Tailwind has defaults" — the user picks the path explicitly.
186
+ - Do NOT write paths outside the project root into the inventory.
187
+ - Do NOT rewrite `state.ui_audit` once it is populated unless re-detection is triggered by mtime change — design and apply read from it.
@@ -1,73 +1,76 @@
1
1
  ---
2
2
  name: fe-design
3
- description: "Use when designing frontend interfaces — component architecture, layout patterns, form design, table patterns, responsive strategies, and UX principles for Blade/Livewire/Flux/Tailwind."
3
+ description: "Reference for frontend-design heuristics — component architecture, layout patterns, form/table design, responsive strategy, a11y, UX principles. Stack-agnostic; cited by directives/ui/design.py."
4
4
  source: package
5
5
  ---
6
6
 
7
- # Frontend Design Skill
7
+ # Frontend Design Skill (Reference)
8
+
9
+ ## Positioning — reference, not executor
10
+
11
+ `fe-design` is a **universal reference skill**, not an executor. Stack-agnostic heuristics that the UI directive set cites; does **not** own the flow.
12
+
13
+ | Concern | Owner |
14
+ |---|---|
15
+ | Layout / states / microcopy lock | [`directives/ui/design.py`](../../templates/scripts/work_engine/directives/ui/design.py) |
16
+ | Stack-dispatched implementation | [`directives/ui/apply.py`](../../templates/scripts/work_engine/directives/ui/apply.py) → `blade-ui` / `livewire` / `flux` / `react-shadcn-ui` |
17
+ | Existing-component inventory + tokens | [`existing-ui-audit`](../existing-ui-audit/SKILL.md) (mandatory pre-step) |
18
+ | Design-review polish loop | [`directives/ui/review.py`](../../templates/scripts/work_engine/directives/ui/review.py) + [`directives/ui/polish.py`](../../templates/scripts/work_engine/directives/ui/polish.py) |
8
19
 
9
20
  ## When to use
10
21
 
11
- Use this skill when:
22
+ Cite this skill when:
23
+
12
24
  - Planning a new page or feature UI before implementing
13
25
  - Choosing between component patterns (modal vs. inline, table vs. cards)
14
26
  - Designing forms with complex validation or multi-step flows
15
27
  - Making responsive design decisions
16
28
  - Reviewing UI for accessibility and usability
17
- - Deciding how to structure Livewire components
18
-
19
- ## Procedure: Design a frontend interface
20
29
 
21
- 1. **Understand requirements** What data is shown? What actions are available? Who is the user?
22
- 2. **Choose technology** — Pick from the project stack (see table below).
23
- 3. **Design layout** — Mobile-first, component-based, consistent spacing.
24
- 4. **Implement** — Build with Blade components, Livewire for interactivity, Flux for UI primitives.
25
- 5. **Verify** — Check accessibility (labels, focus, contrast), responsive behavior, loading states.
30
+ Do NOT use this skill to:
26
31
 
27
- This project uses a server-rendered stack:
32
+ - Implement components that is the apply-step's stack-dispatched skill
33
+ - Audit an existing UI — that is `existing-ui-audit`
34
+ - Drive the full UI flow — that is the `directives/ui/` orchestrator
28
35
 
29
- | Layer | Technology | Skill |
30
- |---|---|---|
31
- | Templates | Laravel Blade | `blade-ui` |
32
- | Interactivity | Livewire 3 | `livewire` |
33
- | Component library | Flux (by Laravel) | `flux` |
34
- | Styling | Tailwind CSS | `tailwind` |
35
- | Icons | Heroicons / custom | — |
36
+ ## How the directive set cites this skill
36
37
 
37
- **Key principle:** Server-first. Use Livewire for interactivity. Avoid JavaScript unless Livewire can't handle it (e.g., drag-and-drop, complex animations).
38
+ `directives/ui/design.py` produces the design brief (layout, components, states, microcopy, a11y). Brief picks heuristics from this reference when audit doesn't already pin a project pattern. Stack-specific choices come from the dispatched implementation skill.
38
39
 
39
40
  ## Component Architecture
40
41
 
41
- ### Page structure
42
+ ### Page structure (universal shape)
42
43
 
43
44
  ```
44
- Page (Blade layout)
45
- ├── Header (Blade partial)
46
- ├── Navigation (Livewire — active state)
45
+ Page layout
46
+ ├── Header (static)
47
+ ├── Navigation (interactive — active state)
47
48
  ├── Content area
48
- │ ├── Page heading + actions (Blade)
49
- │ ├── Filters (Livewire — reactive)
50
- │ ├── Data display (Livewire — table/cards)
51
- │ └── Pagination (Livewire)
52
- └── Footer (Blade partial)
49
+ │ ├── Page heading + actions (static)
50
+ │ ├── Filters (interactive — reactive)
51
+ │ ├── Data display (interactive — table / cards)
52
+ │ └── Pagination (interactive)
53
+ └── Footer (static)
53
54
  ```
54
55
 
55
- ### When to use what
56
+ Stack-specific mapping (Blade partial vs. Livewire component vs. React island vs. Vue SFC) is the apply-step's concern.
56
57
 
57
- | Pattern | When | Example |
58
+ ### When to use what (kind, not framework)
59
+
60
+ | Kind | When | Example |
58
61
  |---|---|---|
59
- | **Blade partial** | Static content, no interactivity | Header, footer, static info |
60
- | **Blade component** | Reusable UI element, props only | Button, badge, card shell |
61
- | **Livewire component** | Needs server interaction or state | Forms, tables, filters |
62
- | **Flux component** | Standard UI element from library | Modal, dropdown, input, toast |
63
- | **Alpine.js** | Client-only micro-interaction | Toggle, accordion, clipboard |
62
+ | **Static partial** | No interactivity, server-rendered only | Header, footer, static info |
63
+ | **Reusable UI component** | Props-only, no state | Button, badge, card shell |
64
+ | **Stateful component** | Needs server interaction or local state | Forms, tables, filters |
65
+ | **Library primitive** | Standard UI from a design system | Modal, dropdown, input, toast |
66
+ | **Client-only micro-interaction** | No server roundtrip needed | Toggle, accordion, clipboard |
64
67
 
65
68
  ### Component granularity
66
69
 
67
- - **One Livewire component per concern** — don't build mega-components
68
- - **Compose with Blade components** inside Livewire for reusable UI pieces
69
- - **Use Flux for standard elements** — don't rebuild what Flux provides
70
- - **Extract when used 3+ times** — DRY applies to UI too
70
+ - **One stateful component per concern** — don't build mega-components.
71
+ - **Compose with reusable UI components** for shared shells, headers, fields.
72
+ - **Use the project's library primitives first** — never rebuild what the design system provides (audit findings tell you which).
73
+ - **Extract when used 3+ times** — DRY applies to UI too.
71
74
 
72
75
  ## Form Design
73
76
 
@@ -127,11 +130,11 @@ Step indicator (1 — 2 — 3)
127
130
  - Default: 25 rows per page
128
131
  - Show total count: "Showing 1–25 of 142"
129
132
  - Allow page size change (10, 25, 50, 100)
130
- - Use Livewire pagination (server-side)
133
+ - Prefer server-side pagination — avoid loading the full set client-side
131
134
 
132
135
  ## Responsive Strategy
133
136
 
134
- ### Breakpoints (Tailwind)
137
+ ### Breakpoints (Tailwind reference scale)
135
138
 
136
139
  | Prefix | Min width | Target |
137
140
  |---|---|---|
@@ -187,25 +190,40 @@ Step indicator (1 — 2 — 3)
187
190
  5. **Loading states** — Skeleton screens or spinners, never blank screens
188
191
  6. **Error recovery** — Clear error messages with suggested actions
189
192
 
190
- ## Related
193
+ ## Procedure
191
194
 
192
- - **Skill:** `blade-ui` Blade template implementation
193
- - **Skill:** `livewire` — Livewire component implementation
194
- - **Skill:** `flux` — Flux component library usage
195
- - **Skill:** `tailwind` — Tailwind CSS utility patterns
196
- - **Skill:** `dashboard-design` — Monitoring dashboard design (different domain)
195
+ When `directives/ui/design.py` (or any caller) cites this skill:
197
196
 
197
+ 1. **Confirm audit ran first** — `state.ui_audit` from [`existing-ui-audit`](../existing-ui-audit/SKILL.md) is mandatory. Stop and request audit if missing.
198
+ 2. **Pick smallest matching section** — Component Architecture, Form Design, Table Design, Responsive Strategy, Accessibility, or UX Principles. Cite by H2/H3 heading, never paste whole skill.
199
+ 3. **Defer to audit findings** — when audit pins a project pattern (token, primitive, layout convention), use it. Heuristics here are fallbacks for gaps, not overrides.
200
+ 4. **Defer to stack apply skill** — Blade vs. Livewire vs. Flux vs. React-shadcn choices come from dispatched implementation skill, never from this reference.
201
+ 5. **Surface conflicts** — if heuristic here contradicts an audit finding or stack convention, name both and let caller decide; do not silently pick.
198
202
 
199
203
  ## Output format
200
204
 
201
- 1. Component structure with layout, data flow, and interaction patterns
202
- 2. Responsive behavior for mobile/tablet/desktop breakpoints
203
- 3. Accessibility annotations (ARIA, keyboard navigation)
205
+ When this skill's content is folded into a design brief or review:
206
+
207
+ 1. Quote cited heuristic verbatim, with H2/H3 heading and one-line "why this applies" tie-back to request.
208
+ 2. Map each heuristic to a concrete artifact in brief (component, form section, table column, breakpoint rule, a11y check, UX state).
209
+ 3. Keep stack-agnostic — never name Blade/Livewire/Flux/React primitives in cited prose; apply step adds those.
210
+ 4. Mark anything overridden by audit findings as `[audit override]` and link to audit entry.
211
+
212
+ ## Related
213
+
214
+ - **Orchestrator:** [`directives/ui/`](../../templates/scripts/work_engine/directives/ui/) — owns the UI flow
215
+ - **Pre-step (mandatory):** [`existing-ui-audit`](../existing-ui-audit/SKILL.md) — inventory before design
216
+ - **Stack apply skills (dispatched, not standalone):**
217
+ - [`blade-ui`](../blade-ui/SKILL.md) — Blade template implementation
218
+ - [`livewire`](../livewire/SKILL.md) — Livewire component implementation
219
+ - [`flux`](../flux/SKILL.md) — Flux component library usage
220
+ - [`react-shadcn-ui`](../react-shadcn-ui/SKILL.md) — React + shadcn primitives
221
+ - **Adjacent reference:** [`dashboard-design`](../dashboard-design/SKILL.md) — monitoring dashboard design (different domain)
204
222
 
205
223
  ## Gotcha
206
224
 
207
- - Don't design components without checking existing Flux/Livewire components first avoid reinventing.
208
- - The model tends to use raw HTML instead of project component library always prefer existing components.
225
+ - Don't design components without running `existing-ui-audit` first — audit's component/token inventory is canonical for "what already exists in this project". Reinventing is the #1 failure mode.
226
+ - Heuristics in this reference apply across stacks; do not promote them to project rules without checking the audit.
209
227
  - Mobile-first is not optional — every layout must work on 320px width.
210
228
 
211
229
  ## Do NOT
@@ -213,11 +231,5 @@ Step indicator (1 — 2 — 3)
213
231
  - Do NOT skip mobile viewport testing.
214
232
  - Do NOT use fixed pixel widths for responsive layouts.
215
233
  - Do NOT ignore accessibility requirements.
234
+ - Do NOT use this skill as an executor — it is a reference cited by `directives/ui/design.py`.
216
235
 
217
- ## Auto-trigger keywords
218
-
219
- - frontend design
220
- - component architecture
221
- - layout
222
- - form design
223
- - responsive
@@ -31,6 +31,10 @@ become a PR. Never destroy work without explicit confirmation.
31
31
  NO MERGE, NO PR, NO DISCARD WITHOUT VERIFIED TESTS + EXPLICIT CHOICE.
32
32
  ```
33
33
 
34
+ Skipping verification because "it worked a minute ago" is how broken
35
+ `main` happens. Discarding because "I assumed the user meant it" is
36
+ how work gets lost.
37
+
34
38
  ## Procedure
35
39
 
36
40
  ### 1. Inspect branch state