wizz-method 1.14.0 → 1.16.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 (148) hide show
  1. package/package.json +3 -2
  2. package/skills-registry.yaml +4 -0
  3. package/src/bmm-skills/3-solutioning/wizz-architecture/scripts/__pycache__/lint_spine.cpython-313.pyc +0 -0
  4. package/src/bmm-skills/3-solutioning/wizz-architecture/scripts/tests/__pycache__/test_lint_spine.cpython-313-pytest-9.1.1.pyc +0 -0
  5. package/src/bmm-skills/4-implementation/wizz-code-review/SKILL.md +3 -5
  6. package/src/bmm-skills/4-implementation/wizz-code-review/customize.toml +71 -0
  7. package/src/bmm-skills/4-implementation/wizz-code-review/references/claims-check.md +14 -0
  8. package/src/bmm-skills/4-implementation/wizz-code-review/references/deletion-check.md +14 -0
  9. package/src/bmm-skills/4-implementation/wizz-code-review/review-prompts/edge-case-hunter.md +110 -0
  10. package/src/bmm-skills/4-implementation/wizz-code-review/review-prompts/verification-gap.md +113 -0
  11. package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-01-gather-context.md +32 -23
  12. package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-02-review.md +10 -13
  13. package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-03-triage.md +16 -22
  14. package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-04-present.md +4 -2
  15. package/src/bmm-skills/4-implementation/wizz-quick-dev/customize.toml +76 -0
  16. package/src/bmm-skills/4-implementation/wizz-quick-dev/references/claims-check.md +14 -0
  17. package/src/bmm-skills/4-implementation/wizz-quick-dev/references/deletion-check.md +14 -0
  18. package/src/bmm-skills/4-implementation/wizz-quick-dev/review-prompts/edge-case-hunter.md +110 -0
  19. package/src/bmm-skills/4-implementation/wizz-quick-dev/review-prompts/verification-gap.md +113 -0
  20. package/src/bmm-skills/4-implementation/wizz-quick-dev/step-04-review.md +38 -16
  21. package/src/bmm-skills/4-implementation/wizz-retrospective/SKILL.md +56 -1488
  22. package/src/bmm-skills/4-implementation/wizz-retrospective/customize.toml +3 -5
  23. package/src/bmm-skills/4-implementation/wizz-retrospective/references/acceptance-verdict.md +55 -0
  24. package/src/bmm-skills/4-implementation/wizz-retrospective/references/aggregate-views.md +17 -0
  25. package/src/bmm-skills/4-implementation/wizz-retrospective/references/evidence-gathering.md +30 -0
  26. package/src/bmm-skills/4-implementation/wizz-retrospective/references/retro-document.md +84 -0
  27. package/src/bmm-skills/4-implementation/wizz-retrospective/references/team-discussion.md +22 -0
  28. package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/__pycache__/sprint_status.cpython-313.pyc +0 -0
  29. package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/git_evidence.py +304 -0
  30. package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/sprint_status.py +746 -0
  31. package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-313-pytest-9.1.1.pyc +0 -0
  32. package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-313-pytest-9.1.1.pyc +0 -0
  33. package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/tests/fixtures/sprint-status-template.yaml +71 -0
  34. package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/tests/test_git_evidence.py +750 -0
  35. package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/tests/test_sprint_status.py +1579 -0
  36. package/src/bmm-skills/4-implementation/wizz-sprint-planning/SKILL.md +39 -296
  37. package/src/bmm-skills/4-implementation/wizz-sprint-planning/customize.toml +1 -3
  38. package/src/bmm-skills/4-implementation/wizz-sprint-planning/references/fix-sprint-status.md +30 -0
  39. package/src/bmm-skills/4-implementation/wizz-sprint-planning/references/generate-tracking.md +25 -0
  40. package/src/bmm-skills/4-implementation/wizz-sprint-planning/references/readiness-gate.md +20 -0
  41. package/src/bmm-skills/4-implementation/wizz-sprint-planning/references/status-view.md +14 -0
  42. package/src/bmm-skills/4-implementation/wizz-sprint-planning/references/validate.md +10 -0
  43. package/src/bmm-skills/4-implementation/wizz-sprint-planning/scripts/__pycache__/sprint_plan.cpython-313.pyc +0 -0
  44. package/src/bmm-skills/4-implementation/wizz-sprint-planning/scripts/sprint_plan.py +697 -0
  45. package/src/bmm-skills/4-implementation/wizz-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-313-pytest-9.1.1.pyc +0 -0
  46. package/src/bmm-skills/4-implementation/wizz-sprint-planning/scripts/tests/test_sprint_plan.py +524 -0
  47. package/src/bmm-skills/4-implementation/wizz-sprint-planning/sprint-status-template.yaml +9 -7
  48. package/src/bmm-skills/module-help.csv +3 -3
  49. package/src/core-skills/_shared/handoff-protocol.md +7 -8
  50. package/src/core-skills/module-help.csv +1 -0
  51. package/src/core-skills/wizz-advanced-elicitation/SKILL.md +36 -114
  52. package/src/core-skills/wizz-advanced-elicitation/{methods.csv → assets/methods.csv} +29 -27
  53. package/src/core-skills/wizz-advanced-elicitation/customize.toml +54 -0
  54. package/src/core-skills/wizz-advanced-elicitation/scripts/__pycache__/pick_methods.cpython-313.pyc +0 -0
  55. package/src/core-skills/wizz-advanced-elicitation/scripts/pick_methods.py +233 -0
  56. package/src/core-skills/wizz-advanced-elicitation/scripts/tests/__pycache__/test_pick_methods.cpython-313-pytest-9.1.1.pyc +0 -0
  57. package/src/core-skills/wizz-advanced-elicitation/scripts/tests/test_pick_methods.py +228 -0
  58. package/src/core-skills/wizz-brainstorming/SKILL.md +2 -2
  59. package/src/core-skills/wizz-brainstorming/assets/brain-selector.html +2 -0
  60. package/src/core-skills/wizz-brainstorming/references/converge.md +1 -1
  61. package/src/core-skills/wizz-brainstorming/references/finalize.md +1 -1
  62. package/src/core-skills/wizz-brainstorming/references/headless.md +1 -1
  63. package/src/core-skills/wizz-brainstorming/references/mode-autonomous.md +1 -1
  64. package/src/core-skills/wizz-brainstorming/scripts/__pycache__/brain.cpython-313.pyc +0 -0
  65. package/src/core-skills/wizz-brainstorming/scripts/brain.py +36 -6
  66. package/src/core-skills/wizz-brainstorming/scripts/tests/__pycache__/test_brain.cpython-313-pytest-9.1.1.pyc +0 -0
  67. package/src/core-skills/wizz-brainstorming/scripts/tests/__pycache__/test_brain.cpython-314.pyc +0 -0
  68. package/src/core-skills/wizz-brainstorming/scripts/tests/test_brain.py +24 -2
  69. package/src/core-skills/wizz-customize/scripts/__pycache__/list_customizable_skills.cpython-313.pyc +0 -0
  70. package/src/core-skills/wizz-customize/scripts/tests/__pycache__/test_list_customizable_skills.cpython-313-pytest-9.1.1.pyc +0 -0
  71. package/src/core-skills/wizz-forge-idea/SKILL.md +107 -0
  72. package/src/core-skills/wizz-forge-idea/customize.toml +41 -0
  73. package/src/core-skills/wizz-forge-idea/scripts/__pycache__/resolve_personas.cpython-313.pyc +0 -0
  74. package/src/core-skills/wizz-forge-idea/scripts/__pycache__/resolve_personas.cpython-314.pyc +0 -0
  75. package/src/core-skills/wizz-forge-idea/scripts/resolve_personas.py +275 -0
  76. package/src/core-skills/wizz-forge-idea/scripts/tests/__pycache__/test_resolve_personas.cpython-313-pytest-9.1.1.pyc +0 -0
  77. package/src/core-skills/wizz-forge-idea/scripts/tests/__pycache__/test_resolve_personas.cpython-314.pyc +0 -0
  78. package/src/core-skills/wizz-forge-idea/scripts/tests/test_resolve_personas.py +138 -0
  79. package/src/core-skills/wizz-party-mode/SKILL.md +37 -54
  80. package/src/core-skills/wizz-party-mode/customize.toml +61 -2
  81. package/src/core-skills/wizz-party-mode/references/create-party.md +8 -3
  82. package/src/core-skills/wizz-party-mode/references/mode-agent-team.md +3 -1
  83. package/src/core-skills/wizz-party-mode/references/mode-subagent.md +16 -4
  84. package/src/core-skills/wizz-party-mode/references/party-memory.md +51 -0
  85. package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-313.pyc +0 -0
  86. package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-314.pyc +0 -0
  87. package/src/core-skills/wizz-party-mode/scripts/resolve_party.py +22 -7
  88. package/src/core-skills/wizz-party-mode/scripts/tests/__pycache__/test_resolve_party.cpython-313-pytest-9.1.1.pyc +0 -0
  89. package/src/core-skills/wizz-party-mode/scripts/tests/__pycache__/test_resolve_party.cpython-314.pyc +0 -0
  90. package/src/core-skills/wizz-party-mode/scripts/tests/{test-resolve_party.py → test_resolve_party.py} +8 -0
  91. package/src/core-skills/wizz-review-edge-case-hunter/SKILL.md +17 -3
  92. package/src/modules/wizz/README.md +1 -1
  93. package/src/modules/wizz/_shared/model-ladder.md +22 -0
  94. package/src/modules/wizz/_shared/token-economy.md +6 -2
  95. package/src/modules/wizz/agents/wizz-ads/customize.toml +1 -1
  96. package/src/modules/wizz/agents/wizz-copy/customize.toml +1 -1
  97. package/src/modules/wizz/agents/wizz-designer/customize.toml +1 -1
  98. package/src/modules/wizz/agents/wizz-growth/customize.toml +11 -1
  99. package/src/modules/wizz/agents/wizz-maestro/customize.toml +1 -1
  100. package/src/modules/wizz/agents/wizz-memoria/customize.toml +1 -1
  101. package/src/modules/wizz/agents/wizz-qa/customize.toml +1 -1
  102. package/src/modules/wizz/agents/wizz-seo/customize.toml +1 -1
  103. package/src/modules/wizz/agents/wizz-social/customize.toml +1 -1
  104. package/src/modules/wizz/overrides/wizz-agent-analyst.toml +1 -1
  105. package/src/modules/wizz/overrides/wizz-agent-architect.toml +1 -1
  106. package/src/modules/wizz/overrides/wizz-agent-dev.toml +1 -1
  107. package/src/modules/wizz/overrides/wizz-agent-pm.toml +1 -1
  108. package/src/modules/wizz/overrides/wizz-agent-tech-writer.toml +1 -1
  109. package/src/modules/wizz/overrides/wizz-agent-ux-designer.toml +1 -1
  110. package/src/modules/wizz/subagents/codex/wizz-exec-haiku.toml +16 -0
  111. package/src/modules/wizz/subagents/codex/wizz-exec-opus.toml +18 -0
  112. package/src/modules/wizz/subagents/codex/wizz-exec-review.toml +17 -0
  113. package/src/modules/wizz/subagents/codex/wizz-exec-sonnet.toml +17 -0
  114. package/src/modules/wizz/subagents/gemini/wizz-exec-haiku.md +15 -0
  115. package/src/modules/wizz/subagents/gemini/wizz-exec-opus.md +17 -0
  116. package/src/modules/wizz/subagents/gemini/wizz-exec-review.md +15 -0
  117. package/src/modules/wizz/subagents/gemini/wizz-exec-sonnet.md +16 -0
  118. package/src/modules/wizz/subagents/opencode/wizz-exec-haiku.md +14 -0
  119. package/src/modules/wizz/subagents/opencode/wizz-exec-opus.md +16 -0
  120. package/src/modules/wizz/subagents/opencode/wizz-exec-review.md +16 -0
  121. package/src/modules/wizz/subagents/opencode/wizz-exec-sonnet.md +15 -0
  122. package/src/modules/wizz/subagents/wizz-exec-opus.md +16 -0
  123. package/src/modules/wizz/subagents/wizz-exec-review.md +15 -0
  124. package/src/scripts/__pycache__/memlog.cpython-313.pyc +0 -0
  125. package/src/scripts/tests/__pycache__/test_memlog.cpython-313-pytest-9.1.1.pyc +0 -0
  126. package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-313-pytest-9.1.1.pyc +0 -0
  127. package/src/skills-lib/pesquisa-de-publico-do-piva/README.md +83 -0
  128. package/src/skills-lib/pesquisa-de-publico-do-piva/SKILL.md +65 -0
  129. package/src/skills-lib/pesquisa-de-publico-do-piva/assets/template.html +414 -0
  130. package/src/skills-lib/pesquisa-de-publico-do-piva/prompts.md +131 -0
  131. package/src/skills-lib/wizz-offer-forge/README.md +13 -0
  132. package/src/skills-lib/wizz-offer-forge/SKILL.md +74 -0
  133. package/src/skills-lib/wizz-offer-forge/references/empilhamento-valor.md +25 -0
  134. package/src/skills-lib/wizz-offer-forge/references/garantia-reversa.md +22 -0
  135. package/src/skills-lib/wizz-offer-forge/references/mecanismo-unico.md +28 -0
  136. package/src/skills-lib/wizz-offer-forge/references/ponte-trafego.md +21 -0
  137. package/src/skills-lib/wizz-router/references/routing-table-flat.md +2 -0
  138. package/tools/installer/core/installer.js +57 -0
  139. package/tools/installer/ide/_config-driven.js +44 -30
  140. package/tools/installer/ide/platform-codes.yaml +42 -3
  141. package/tools/installer/modules/external-manager.js +140 -2
  142. package/tools/installer/modules/official-modules.js +68 -21
  143. package/tools/installer/prompts.js +45 -103
  144. package/tools/installer/ui.js +64 -7
  145. package/wizz-modules.yaml +65 -11
  146. package/src/bmm-skills/4-implementation/wizz-sprint-planning/checklist.md +0 -34
  147. package/src/core-skills/wizz-brainstorming/scripts/memlog.py +0 -202
  148. package/src/core-skills/wizz-brainstorming/scripts/tests/test_memlog.py +0 -265
@@ -1,142 +1,64 @@
1
1
  ---
2
2
  name: wizz-advanced-elicitation
3
- description: 'Push the LLM to reconsider, refine, and improve its recent output. Use when user asks for deeper critique or mentions a known deeper critique method, e.g. socratic, first principles, pre-mortem, red team.'
3
+ description: 'Push the LLM to reconsider, refine, and improve its recent output. Use when user asks for deeper critique or mentions a known deeper critique method, e.g. socratic, first principles, pre-mortem, red team'
4
4
  ---
5
5
 
6
6
  # Advanced Elicitation
7
7
 
8
- **Goal:** Push the LLM to reconsider, refine, and improve its recent output.
8
+ You are Wizz's shared refinement checkpoint: other skills invoke you at natural pauses to pressure the piece of work they just produced, and users call you directly on anything recent. The target is the most recent output in the conversation — a section, plan, draft, or decision — unless the caller or user points at something else. You offer a short menu of elicitation methods, run the chosen ones against the target, and hand back the improved version so the invoking flow resumes exactly where it paused. Work in the surrounding session's communication language.
9
9
 
10
- ---
11
-
12
- ## CRITICAL LLM INSTRUCTIONS
10
+ ## Conventions
13
11
 
14
- - **MANDATORY:** Execute ALL steps in the flow section IN EXACT ORDER
15
- - DO NOT skip steps or change the sequence
16
- - HALT immediately when halt-conditions are met
17
- - Each action within a step is a REQUIRED action to complete that step
18
- - Sections outside flow (validation, output, critical-context) provide essential context - review and apply throughout execution
19
- - **YOU MUST ALWAYS SPEAK OUTPUT in your Agent communication style with the `communication_language`**
20
-
21
- ---
12
+ - Bare paths (e.g. `assets/methods.csv`) resolve from `{skill-root}` (where `customize.toml` lives); `{project-root}`-prefixed paths from the project working directory.
13
+ - `{workflow.<name>}` resolves to fields in the merged `customize.toml` `[workflow]` table.
22
14
 
23
- ## INTEGRATION (When Invoked Indirectly)
15
+ ## On Activation
24
16
 
25
- When invoked from another prompt or process:
26
-
27
- 1. Receive or review the current section content that was just generated
28
- 2. Apply elicitation methods iteratively to enhance that specific content
29
- 3. Return the enhanced version back when user selects 'x' to proceed and return back
30
- 4. The enhanced content replaces the original section content in the output document
31
-
32
- ---
17
+ 1. Resolve customization: `python3 {project-root}/_wizz/scripts/resolve_customization.py --skill {skill-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and use defaults.
18
+ 2. Hold every `{workflow.preferences}` entry for the whole session, fix the target, and serve the first menu.
33
19
 
34
- ## FLOW
20
+ ## Serving the Catalog
35
21
 
36
- ### Step 1: Method Registry Loading
37
-
38
- **Action:** Load `./methods.csv` for elicitation methods. If party-mode may participate, resolve the agent roster via:
22
+ `scripts/pick_methods.py` serves the method catalog (num, category, method_name, description, output_pattern) so it never enters context whole — the one exception is listing the full catalog, when the user asked for all of it. Invoke as:
39
23
 
40
24
  ```bash
41
- python3 {project-root}/_wizz/scripts/resolve_config.py --project-root {project-root} --key agents
25
+ python3 {skill-root}/scripts/pick_methods.py --file {workflow.methods_file} <command>
42
26
  ```
43
27
 
44
- The resolver merges four layers in order: `_wizz/config.toml` (installer base, team-scoped), `_wizz/config.user.toml` (installer base, user-scoped), `_wizz/custom/config.toml` (team overrides), and `_wizz/custom/config.user.toml` (personal overrides). Each entry under `agents` is keyed by the agent's `code` and carries `name`, `title`, `icon`, `description`, `module`, and `team`.
45
-
46
- #### CSV Structure
47
-
48
- - **category:** Method grouping (core, structural, risk, etc.)
49
- - **method_name:** Display name for the method
50
- - **description:** Rich explanation of what the method does, when to use it, and why it's valuable
51
- - **output_pattern:** Flexible flow guide using arrows (e.g., "analysis -> insights -> action")
28
+ If `{workflow.additional_methods}` is non-empty, add `--extra '<its entries as a JSON array>'` (or a path to a JSON file holding them) on every call, so custom methods are first-class in menus, reshuffles, and listings.
52
29
 
53
- #### Context Analysis
30
+ - `categories` — category names + counts, the cheap map.
31
+ - `list --category <cat> [--category <cat>]` — the index for chosen categories; `--all` dumps the whole catalog, only when listing all.
32
+ - `show <name-or-num> [...]` — full rows by name or num.
33
+ - `random -n 5 --spread [--exclude <name>]...` — a category-diverse random draw.
54
34
 
55
- - Use conversation history
56
- - Analyze: content type, complexity, stakeholder needs, risk level, and creative potential
35
+ **First menu:** run `categories`, pick the 2–4 categories that fit the target (risk before a launch, technical for code, collaboration when stakeholders compete, creative when the content is flat), `list` them, and hand-pick five methods that attack the target from different angles — honoring `{workflow.preferences}`. **Reshuffle:** `random -n 5 --spread`, excluding everything already offered.
57
36
 
58
- #### Smart Selection
37
+ ## The Menu
59
38
 
60
- 1. Analyze context: Content type, complexity, stakeholder needs, risk level, creative potential
61
- 2. Parse descriptions: Understand each method's purpose from the rich descriptions in CSV
62
- 3. Select 5 methods: Choose methods that best match the context based on their descriptions
63
- 4. Balance approach: Include mix of foundational and specialized techniques as appropriate
39
+ HALT and give the user a choice:
64
40
 
65
- ---
41
+ - The five offered methods, listed by name. The user may pick one or several.
42
+ - **Reshuffle** — replace the list with five new options.
43
+ - **List all** — show the full catalog with descriptions.
44
+ - **Proceed** — no further elicitation.
66
45
 
67
- ### Step 2: Present Options and Handle Responses
46
+ This menu is the interface other skills and their users rely on — keep its options and behavior stable. When party mode is active in the session, add `_Party mode is active — agents will join in._` under the heading.
68
47
 
69
- #### Display Format
48
+ - If the user picks methods: run them (several: in sequence), then offer the menu again.
49
+ - If the user chooses **Reshuffle**: reshuffle as above and offer the menu again.
50
+ - If the user chooses **List all**: show the full catalog (`list --all`) as a compact table; a pick by name or number runs like a method choice.
51
+ - If the user chooses **Proceed**: done. The current enhanced version is final for this content: hand it back to the invoking skill as the replacement for what it had, and signal completion so it continues. If anything shown was never accepted, confirm what should carry over before returning.
52
+ - Any other reply is direction: apply it to the target and offer the menu again.
70
53
 
71
- ```
72
- **Advanced Elicitation Options**
73
- _If party mode is active, agents will join in._
74
- Choose a number (1-5), [r] to Reshuffle, [a] List All, or [x] to Proceed:
75
-
76
- 1. [Method Name]
77
- 2. [Method Name]
78
- 3. [Method Name]
79
- 4. [Method Name]
80
- 5. [Method Name]
81
- r. Reshuffle the list with 5 new options
82
- a. List all methods with descriptions
83
- x. Proceed / No Further Actions
84
- ```
54
+ ## Running a Method
85
55
 
86
- #### Response Handling
56
+ Use the method's description as its intent and its output_pattern as a flexible flow guide; scale depth to the target — a paragraph gets a light pass, an architecture decision gets the full treatment. Each application works on the current enhanced version, so refinements compound. Show what the method revealed and the changes it proposes, then HALT and give the user a choice:
87
57
 
88
- **Case 1-5 (User selects a numbered method):**
58
+ - **Apply** accept the proposed changes.
59
+ - **Reject** — drop the proposal entirely.
60
+ - Or give different direction.
89
61
 
90
- - Execute the selected method using its description from the CSV
91
- - Adapt the method's complexity and output format based on the current context
92
- - Apply the method creatively to the current section content being enhanced
93
- - Display the enhanced version showing what the method revealed or improved
94
- - **CRITICAL:** Ask the user if they would like to apply the changes to the doc (y/n/other) and HALT to await response.
95
- - **CRITICAL:** ONLY if Yes, apply the changes. IF No, discard your memory of the proposed changes. If any other reply, try best to follow the instructions given by the user.
96
- - **CRITICAL:** Re-present the same 1-5,r,x prompt to allow additional elicitations
97
-
98
- **Case r (Reshuffle):**
99
-
100
- - Select 5 random methods from methods.csv, present new list with same prompt format
101
- - When selecting, try to think and pick a diverse set of methods covering different categories and approaches, with 1 and 2 being potentially the most useful for the document or section being discovered
102
-
103
- **Case x (Proceed):**
104
-
105
- - Complete elicitation and proceed
106
- - Return the fully enhanced content back to the invoking skill
107
- - The enhanced content becomes the final version for that section
108
- - Signal completion back to the invoking skill to continue with next section
109
-
110
- **Case a (List All):**
111
-
112
- - List all methods with their descriptions from the CSV in a compact table
113
- - Allow user to select any method by name or number from the full list
114
- - After selection, execute the method as described in the Case 1-5 above
115
-
116
- **Case: Direct Feedback:**
117
-
118
- - Apply changes to current section content and re-present choices
119
-
120
- **Case: Multiple Numbers:**
121
-
122
- - Execute methods in sequence on the content, then re-offer choices
123
-
124
- ---
62
+ Never change the work unless the user accepts the proposal. If they reject it, drop the proposal entirely. Any other reply is instruction to follow.
125
63
 
126
- ### Step 3: Execution Guidelines
127
-
128
- - **Method execution:** Use the description from CSV to understand and apply each method
129
- - **Output pattern:** Use the pattern as a flexible guide (e.g., "paths -> evaluation -> selection")
130
- - **Dynamic adaptation:** Adjust complexity based on content needs (simple to sophisticated)
131
- - **Creative application:** Interpret methods flexibly based on context while maintaining pattern consistency
132
- - Focus on actionable insights
133
- - **Stay relevant:** Tie elicitation to specific content being analyzed (the current section from the document being created unless user indicates otherwise)
134
- - **Identify personas:** For single or multi-persona methods, clearly identify viewpoints, and use party members if available in memory already
135
- - **Critical loop behavior:** Always re-offer the 1-5,r,a,x choices after each method execution
136
- - Continue until user selects 'x' to proceed with enhanced content, confirm or ask the user what should be accepted from the session
137
- - Each method application builds upon previous enhancements
138
- - **Content preservation:** Track all enhancements made during elicitation
139
- - **Iterative enhancement:** Each selected method (1-5) should:
140
- 1. Apply to the current enhanced version of the content
141
- 2. Show the improvements made
142
- 3. Return to the prompt for additional elicitations or completion
64
+ When a method casts personas (round tables, panels, debates), reuse party members already in the session if party mode is active; otherwise resolve installed agents on demand via `python3 {project-root}/_wizz/scripts/resolve_config.py --project-root {project-root} --key agents` (a four-layer merge of `_wizz/config.toml`, `config.user.toml`, and the two `_wizz/custom/` overrides; each entry keyed by agent code carries name, title, icon, description). If neither yields a fit, invent named viewpoints suited to the content.
@@ -41,30 +41,32 @@ num,category,method_name,description,output_pattern
41
41
  40,creative,Genre Mashup,Combine two unrelated domains to find fresh approaches - innovation through unexpected cross-pollination,domain A + domain B → hybrid insights
42
42
  41,creative,Constraint Injection,Deliberately add an artificial limitation (budget - time - technology) to force novel solutions — creativity thrives under pressure,add constraint → forced creativity → remove constraint → evaluate
43
43
  42,creative,Morphological Analysis,List independent parameters of a problem - enumerate options for each - then systematically combine — ensures you don't miss non-obvious configurations,parameters → options grid → combinations → evaluation
44
- 43,framing,Abstraction Laddering,"Move up (""why?"") for strategic clarity or down (""how?"") for tactical detail ensures you're solving at the right altitude",concrete abstractright level
45
- 44,framing,Reframe the Question,Challenge whether the stated problem is the real problem often the question itself is wrong and a better framing unlocks an easy answer,stated problem reframe true problem → solution
46
- 45,framing,Stakeholder Lens Rotation,Serially adopt each stakeholder's world-view to see the same situation differently reveals whose needs are being overlooked,perspective ABCgaps found
47
- 46,learning,Feynman Technique,Explain complex concepts simply as if teaching a child - the ultimate test of true understanding,complexsimplegapsmastery
48
- 47,learning,Active Recall Testing,Test understanding without references to verify true knowledge - essential for identifying gaps,testgapsreinforcement
49
- 48,learning,Deliberate Practice Loop,Identify a specific sub-skill - drill it with immediate feedback - adjust - repeat targeted improvement beats general repetition,isolatedrillfeedbackadjust → repeat
50
- 49,philosophical,Occam's Razor Application,Find the simplest sufficient explanation by eliminating unnecessary complexity - essential for debugging,optionssimplificationselection
51
- 50,philosophical,Trolley Problem Variations,Explore ethical trade-offs through moral dilemmas - valuable for understanding values and difficult decisions,dilemmaanalysisdecision
52
- 51,research,Literature Review Personas,Optimist researcher + skeptic researcher + synthesizer review sources - balanced assessment of evidence quality,sourcescritiquessynthesis
53
- 52,research,Thesis Defense Simulation,Student defends hypothesis against committee with different concerns - stress-tests research methodology and conclusions,thesischallengesdefense → refinements
54
- 53,research,Comparative Analysis Matrix,Multiple analysts evaluate options against weighted criteria - structured decision-making with explicit scoring,options criteriascoresrecommendation
55
- 54,research,Source Triangulation,Require at least three independent source types (quantitative - qualitative - expert) before accepting a claim — guards against single-source bias,claimsource A source B source C → confidence rating
56
- 55,retrospective,Hindsight Reflection,Imagine looking back from the future to gain perspective - powerful for project reviews,future viewinsightsapplication
57
- 56,retrospective,Lessons Learned Extraction,Systematically identify key takeaways and actionable improvements - essential for continuous improvement,experiencelessonsactions
58
- 57,risk,Pre-mortem Analysis,Imagine future failure then work backwards to prevent it - powerful technique for risk mitigation before major launches,failure scenariocausesprevention
59
- 58,risk,Failure Mode Analysis,Systematically explore how each component could fail - critical for reliability engineering and safety-critical systems,componentsfailuresprevention
60
- 59,risk,Challenge from Critical Perspective,Play devil's advocate to stress-test ideas and find weaknesses - essential for overcoming groupthink,assumptionschallengesstrengthening
61
- 60,risk,Identify Potential Risks,Brainstorm what could go wrong across all categories - fundamental for project planning and deployment preparation,categoriesrisksmitigations
62
- 61,risk,Chaos Monkey Scenarios,Deliberately break things to test resilience and recovery - ensures systems handle failures gracefully,breakobserveharden
63
- 62,risk,Assumption Audit,Explicitly list every assumption underlying a plan - rate each by confidence and impact - then stress-test the weakest — prevents building on shaky foundations,listratestress-test → shore up
64
- 63,risk,Cascading Failure Simulation,Trace how one component's failure propagates through dependencies reveals hidden coupling and single points of failure,trigger failure trace propagation find amplifiers → decouple
65
- 64,technical,Architecture Decision Records,Multiple architect personas propose and debate architectural choices with explicit trade-offs - ensures decisions are well-reasoned and documented,optionstrade-offsdecisionrationale
66
- 65,technical,Rubber Duck Debugging Evolved,Explain your code to progressively more technical ducks until you find the bug - forces clarity at multiple abstraction levels,simpledetailed technical aha
67
- 66,technical,Algorithm Olympics,Multiple approaches compete on the same problem with benchmarks - finds optimal solution through direct comparison,implementationsbenchmarkswinner
68
- 67,technical,Security Audit Personas,Hacker + defender + auditor examine system from different threat models - comprehensive security review from multiple angles,vulnerabilitiesdefensescompliance
69
- 68,technical,Performance Profiler Panel,Database expert + frontend specialist + DevOps engineer diagnose slowness - finds bottlenecks across the full stack,symptomsanalysisoptimizations
70
- 69,technical,Boundary & Edge Case Sweep,Systematically test extremes - zeros - nulls - maximums - and type mismatches catches the failures that happy-path thinking always misses,inputsboundariesedge cases → failures found
44
+ 43,creative,Subtraction,Improve by deliberately removing elements instead of adding them - counters the well-documented additive bias where people overlook subtractive changes that would simplify and strengthen the work,current state what to remove simplified result
45
+ 44,framing,Abstraction Laddering,"Move up (""why?"") for strategic clarity or down (""how?"") for tactical detail ensures you're solving at the right altitude",concrete abstractright level
46
+ 45,framing,Reframe the Question,Challenge whether the stated problem is the real problem — often the question itself is wrong and a better framing unlocks an easy answer,stated problemreframetrue problem solution
47
+ 46,framing,Stakeholder Lens Rotation,Serially adopt each stakeholder's world-view to see the same situation differently reveals whose needs are being overlooked,perspective A BCgaps found
48
+ 47,framing,Map Is Not the Territory,Treat any model or diagram as a lossy abstraction of reality - check where the representation diverges from the real system before trusting it,modelreality check divergences found → corrected understanding
49
+ 48,learning,Feynman Technique,Explain complex concepts simply as if teaching a child - the ultimate test of true understanding,complexsimplegapsmastery
50
+ 49,learning,Active Recall Testing,Test understanding without references to verify true knowledge - essential for identifying gaps,testgapsreinforcement
51
+ 50,learning,Deliberate Practice Loop,Identify a specific sub-skill - drill it with immediate feedback - adjust - repeat targeted improvement beats general repetition,isolatedrillfeedback → adjust → repeat
52
+ 51,philosophical,Occam's Razor Application,Find the simplest sufficient explanation by eliminating unnecessary complexity - essential for debugging,optionssimplificationselection
53
+ 52,philosophical,Trolley Problem Variations,Explore ethical trade-offs through moral dilemmas - valuable for understanding values and difficult decisions,dilemmaanalysisdecision
54
+ 53,research,Literature Review Personas,Optimist researcher + skeptic researcher + synthesizer review sources - balanced assessment of evidence quality,sourcescritiquessynthesis
55
+ 54,research,Thesis Defense Simulation,Student defends hypothesis against committee with different concerns - stress-tests research methodology and conclusions,thesischallengesdefenserefinements
56
+ 55,research,Comparative Analysis Matrix,Multiple analysts evaluate options against weighted criteria - structured decision-making with explicit scoring,options criteria scoresrecommendation
57
+ 56,research,Source Triangulation,Require at least three independent source types (quantitative - qualitative - expert) before accepting a claim — guards against single-source bias,claimsource A source B → source C → confidence rating
58
+ 57,retrospective,Hindsight Reflection,Imagine looking back from the future to gain perspective - powerful for project reviews,future viewinsightsapplication
59
+ 58,retrospective,Lessons Learned Extraction,Systematically identify key takeaways and actionable improvements - essential for continuous improvement,experiencelessonsactions
60
+ 59,risk,Pre-mortem Analysis,Imagine future failure then work backwards to prevent it - powerful technique for risk mitigation before major launches,failure scenario causesprevention
61
+ 60,risk,Failure Mode Analysis,Systematically explore how each component could fail - critical for reliability engineering and safety-critical systems,componentsfailuresprevention
62
+ 61,risk,Challenge from Critical Perspective,Play devil's advocate to stress-test ideas and find weaknesses - essential for overcoming groupthink,assumptionschallengesstrengthening
63
+ 62,risk,Identify Potential Risks,Brainstorm what could go wrong across all categories - fundamental for project planning and deployment preparation,categoriesrisksmitigations
64
+ 63,risk,Chaos Monkey Scenarios,Deliberately break things to test resilience and recovery - ensures systems handle failures gracefully,breakobserveharden
65
+ 64,risk,Assumption Audit,Explicitly list every assumption underlying a plan - rate each by confidence and impact - then stress-test the weakest prevents building on shaky foundations,listratestress-testshore up
66
+ 65,risk,Cascading Failure Simulation,Trace how one component's failure propagates through dependencies reveals hidden coupling and single points of failure,trigger failure trace propagation find amplifiersdecouple
67
+ 66,technical,Architecture Decision Records,Multiple architect personas propose and debate architectural choices with explicit trade-offs - ensures decisions are well-reasoned and documented,optionstrade-offsdecision → rationale
68
+ 67,technical,Rubber Duck Debugging Evolved,Explain your code to progressively more technical ducks until you find the bug - forces clarity at multiple abstraction levels,simpledetailedtechnical → aha
69
+ 68,technical,Algorithm Olympics,Multiple approaches compete on the same problem with benchmarks - finds optimal solution through direct comparison,implementationsbenchmarkswinner
70
+ 69,technical,Security Audit Personas,Hacker + defender + auditor examine system from different threat models - comprehensive security review from multiple angles,vulnerabilitiesdefensescompliance
71
+ 70,technical,Performance Profiler Panel,Database expert + frontend specialist + DevOps engineer diagnose slowness - finds bottlenecks across the full stack,symptoms → analysis → optimizations
72
+ 71,technical,Boundary & Edge Case Sweep,Systematically test extremes - zeros - nulls - maximums - and type mismatches — catches the failures that happy-path thinking always misses,inputs → boundaries → edge cases → failures found
@@ -0,0 +1,54 @@
1
+ # DO NOT EDIT -- overwritten on every update.
2
+ #
3
+ # Workflow customization surface for wizz-advanced-elicitation.
4
+ #
5
+ # Override files (not edited here):
6
+ # {project-root}/_wizz/custom/wizz-advanced-elicitation.toml (team)
7
+ # {project-root}/_wizz/custom/wizz-advanced-elicitation.user.toml (personal)
8
+
9
+ [workflow]
10
+
11
+ # --- Configurable below. Overrides merge per Wizz structural rules: ---
12
+ # scalars: override wins • plain arrays: append
13
+ # arrays of tables keyed by `code`: matching key replaces, new keys append
14
+
15
+ # The elicitation method catalog served by scripts/pick_methods.py
16
+ # (columns: num,category,method_name,description,output_pattern). Swap the path
17
+ # in team/user TOML to ship a different catalog. Kept `{skill-root}`-anchored so
18
+ # it resolves regardless of the working directory (pick_methods.py is always
19
+ # invoked with `--file {workflow.methods_file}`).
20
+ methods_file = "{skill-root}/assets/methods.csv"
21
+
22
+ # Persistent preferences the refiner honors for every session — methods to
23
+ # favor or avoid, how pushback should land, house rules for applying changes.
24
+ # Literal sentences; append-merges, so team and personal preferences both apply.
25
+ #
26
+ # Examples (set in team/user override TOML):
27
+ # preferences = [
28
+ # "Lead with a risk-category method for anything touching production systems.",
29
+ # "Never offer roleplay or persona methods.",
30
+ # ]
31
+ preferences = []
32
+
33
+ # Extra methods — and whole new categories — merged into the catalog without
34
+ # editing the shipped CSV. Passed to pick_methods.py via --extra, so custom
35
+ # methods are first-class in every menu, reshuffle, and listing.
36
+ #
37
+ # Two keys, two jobs — keep them aligned:
38
+ # `code` is only the TOML merge key across override layers: a personal entry
39
+ # with the same code replaces the team one; new codes append.
40
+ # `method_name` is the catalog identity: an entry whose method_name matches a
41
+ # shipped method replaces it (retune its description or pattern; it keeps
42
+ # the shipped num), others append with new nums.
43
+ # To override another layer's entry, reuse its `code`. Two entries with
44
+ # different codes but the same method_name both survive the TOML merge, and
45
+ # only the later one reaches the catalog.
46
+ #
47
+ # Example (set in team/user override TOML):
48
+ # [[workflow.additional_methods]]
49
+ # code = "regulatory-inversion"
50
+ # category = "domain-specific"
51
+ # method_name = "Regulatory Inversion"
52
+ # description = "Start from the compliance constraint and ask what becomes possible only because of it - turns the rule into a generative frame"
53
+ # output_pattern = "constraint → possibilities → design"
54
+ additional_methods = []
@@ -0,0 +1,233 @@
1
+ #!/usr/bin/env python3
2
+ # /// script
3
+ # requires-python = ">=3.10"
4
+ # ///
5
+ """Serve the elicitation method catalog without loading it all into context.
6
+
7
+ The catalog is a CSV (num, category, method_name, description, output_pattern).
8
+ `description` is a one-line gist — enough to run the method; `output_pattern` is
9
+ a flexible flow guide (e.g. "assumptions → truths → new approach").
10
+
11
+ Commands:
12
+ categories list category names + counts (the cheap entry point)
13
+ list --category C [...] the index (num/category/name/gist) for those categories
14
+ list --all the whole catalog at once — deliberate; large, avoid interactively
15
+ show NAME_OR_NUM [...] full row for each method, matched by name or num
16
+ random [-n N] [--category C ...] [--exclude NAME ...] [--spread]
17
+ draw N at random; --spread forces category diversity
18
+ (at most one per category until categories run out) —
19
+ the reshuffle draw; --exclude skips already-shown methods
20
+
21
+ `list` refuses to run with neither --category nor --all: dumping the full catalog
22
+ into context must always be an explicit, deliberate choice.
23
+
24
+ `--extra SPEC` merges additional methods (customize.toml's `additional_methods`)
25
+ into every command. SPEC is either a JSON array literal (starts with `[`) or a
26
+ path to a JSON file; each item is {code, category, method_name, description,
27
+ output_pattern}. An extra whose method_name matches a catalog row
28
+ (case-insensitive) REPLACES it and keeps that row's num — retune a shipped
29
+ method; others append and get the next free nums, so new methods and whole new
30
+ categories are first-class and number-addressable everywhere.
31
+
32
+ Default output is lean tab-separated text for an LLM to read; --json for structured.
33
+ """
34
+ import argparse
35
+ import csv
36
+ import json
37
+ import random
38
+ import sys
39
+ from pathlib import Path
40
+
41
+ DEFAULT_FILE = Path(__file__).resolve().parent.parent / "assets" / "methods.csv"
42
+ FIELDS = ("num", "category", "method_name", "description", "output_pattern")
43
+
44
+
45
+ def load(file: Path) -> list[dict]:
46
+ # utf-8-sig: tolerate BOM-prefixed catalogs (Excel "CSV UTF-8", Notepad)
47
+ with open(file, newline="", encoding="utf-8-sig") as f:
48
+ rows = list(csv.DictReader(f))
49
+ for r in rows:
50
+ for k in FIELDS:
51
+ r.setdefault(k, "")
52
+ r[k] = (r.get(k) or "").strip()
53
+ return rows
54
+
55
+
56
+ def load_extra(spec: str) -> list[dict]:
57
+ """Parse the --extra overlay: a JSON array literal or a path to a JSON file."""
58
+ text = spec if spec.lstrip().startswith("[") else Path(spec).read_text(encoding="utf-8-sig")
59
+ data = json.loads(text)
60
+ if not isinstance(data, list):
61
+ raise ValueError("--extra must be a JSON array of objects")
62
+ rows = []
63
+ for item in data:
64
+ if not isinstance(item, dict):
65
+ raise ValueError(f"each --extra entry must be a JSON object, got: {item!r}")
66
+ row = {k: str(item.get(k) or "").strip() for k in FIELDS}
67
+ row["code"] = str(item.get("code") or "").strip() # kept for traceability
68
+ rows.append(row)
69
+ return rows
70
+
71
+
72
+ def merge_extra(rows: list[dict], extras: list[dict]) -> list[dict]:
73
+ """Extras replace a catalog row with the same method_name (case-insensitive),
74
+ otherwise append — so overrides can retune shipped methods or grow the catalog.
75
+ A replacement inherits the shipped row's num; appended extras get the next
76
+ free nums, so every merged method stays addressable by number."""
77
+ merged = list(rows)
78
+ index = {r["method_name"].lower(): i for i, r in enumerate(merged)}
79
+ for e in extras:
80
+ key = e["method_name"].lower()
81
+ if key in index:
82
+ e = dict(e)
83
+ e["num"] = e["num"] or merged[index[key]]["num"]
84
+ merged[index[key]] = e
85
+ else:
86
+ index[key] = len(merged)
87
+ merged.append(dict(e))
88
+ next_num = max((int(r["num"]) for r in merged if r["num"].isdigit()), default=0) + 1
89
+ for r in merged:
90
+ if not r["num"]:
91
+ r["num"] = str(next_num)
92
+ next_num += 1
93
+ return merged
94
+
95
+
96
+ def categories(rows: list[dict]) -> list[tuple[str, int]]:
97
+ counts: dict[str, int] = {}
98
+ for r in rows:
99
+ counts[r["category"]] = counts.get(r["category"], 0) + 1
100
+ return sorted(counts.items())
101
+
102
+
103
+ def filter_cats(rows: list[dict], cats: list[str] | None) -> list[dict]:
104
+ if not cats:
105
+ return rows
106
+ wanted = {c.lower() for c in cats}
107
+ return [r for r in rows if r["category"].lower() in wanted]
108
+
109
+
110
+ def find(rows: list[dict], names: list[str]) -> tuple[list[dict], list[str]]:
111
+ """Match each query by method_name or by num, case-insensitively."""
112
+ by_key: dict[str, dict] = {}
113
+ for r in rows:
114
+ by_key[r["method_name"].lower()] = r
115
+ if r["num"]:
116
+ by_key.setdefault(r["num"], r)
117
+ found, missing = [], []
118
+ for n in names:
119
+ r = by_key.get(n.strip().lower())
120
+ (found if r else missing).append(r if r else n)
121
+ return found, missing
122
+
123
+
124
+ def exclude(rows: list[dict], names: list[str] | None) -> list[dict]:
125
+ if not names:
126
+ return rows
127
+ skip = {n.strip().lower() for n in names}
128
+ return [r for r in rows if r["method_name"].lower() not in skip]
129
+
130
+
131
+ def spread_sample(rows: list[dict], n: int, rng: random.Random | None = None) -> list[dict]:
132
+ """Draw n methods with maximum category diversity: shuffle the categories,
133
+ take one random method per category round-robin, wrapping only when there
134
+ are fewer categories than picks."""
135
+ rng = rng or random
136
+ by_cat: dict[str, list[dict]] = {}
137
+ for r in rows:
138
+ by_cat.setdefault(r["category"], []).append(r)
139
+ buckets = list(by_cat.values())
140
+ rng.shuffle(buckets)
141
+ for b in buckets:
142
+ rng.shuffle(b)
143
+ out: list[dict] = []
144
+ while buckets and len(out) < n:
145
+ exhausted = []
146
+ for b in buckets:
147
+ if len(out) >= n:
148
+ break
149
+ out.append(b.pop())
150
+ if not b:
151
+ exhausted.append(b)
152
+ buckets = [b for b in buckets if b not in exhausted]
153
+ return out
154
+
155
+
156
+ def fmt_categories(cats: list[tuple[str, int]], as_json: bool) -> str:
157
+ if as_json:
158
+ return json.dumps([{"category": c, "count": n} for c, n in cats])
159
+ return "\n".join(f"{c}\t{n}" for c, n in cats)
160
+
161
+
162
+ def fmt_rows(rows: list[dict], as_json: bool) -> str:
163
+ if as_json:
164
+ return json.dumps([{k: r[k] for k in FIELDS} for r in rows])
165
+ return "\n".join(
166
+ f"{r['num']}\t{r['category']}\t{r['method_name']}\t{r['description']}\t{r['output_pattern']}"
167
+ for r in rows
168
+ )
169
+
170
+
171
+ def main(argv: list[str] | None = None) -> int:
172
+ if hasattr(sys.stdout, "reconfigure"):
173
+ sys.stdout.reconfigure(encoding="utf-8") # catalog rows contain →; don't die on locale code pages
174
+ p = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
175
+ p.add_argument("--file", type=Path, default=DEFAULT_FILE, help="method CSV (default: sibling assets/methods.csv)")
176
+ p.add_argument("--extra", help="additional methods: a JSON array literal or a path to a JSON file")
177
+ p.add_argument("--json", action="store_true", help="emit structured JSON instead of lean text")
178
+ sub = p.add_subparsers(dest="cmd", required=True)
179
+ sub.add_parser("categories", help="list category names + counts")
180
+ pl = sub.add_parser("list", help="the index for chosen categories (needs --category or --all)")
181
+ pl.add_argument("--category", action="append", help="filter to a category (repeatable)")
182
+ pl.add_argument("--all", action="store_true", help="dump the entire catalog (deliberate; large)")
183
+ ps = sub.add_parser("show", help="full row for each named method")
184
+ ps.add_argument("names", nargs="+", help="method names or nums")
185
+ pr = sub.add_parser("random", help="draw methods at random")
186
+ pr.add_argument("-n", type=int, default=1, help="how many (default 1)")
187
+ pr.add_argument("--category", action="append", help="restrict to a category (repeatable)")
188
+ pr.add_argument("--exclude", action="append", help="method name to skip (repeatable) — e.g. already shown")
189
+ pr.add_argument("--spread", action="store_true", help="force category diversity across the draw")
190
+ args = p.parse_args(argv)
191
+
192
+ if not args.file.is_file():
193
+ print(f"error: method file not found: {args.file}", file=sys.stderr)
194
+ return 2
195
+ rows = load(args.file)
196
+ if args.extra:
197
+ try:
198
+ rows = merge_extra(rows, load_extra(args.extra))
199
+ except (OSError, ValueError) as e:
200
+ print(f"error: could not read --extra: {e}", file=sys.stderr)
201
+ return 2
202
+
203
+ if args.cmd == "categories":
204
+ print(fmt_categories(categories(rows), args.json))
205
+ elif args.cmd == "list":
206
+ if not args.category and not args.all:
207
+ print(
208
+ "error: `list` needs --category (one or more) — or --all to dump the whole "
209
+ "catalog on purpose. Use `categories` for the cheap map, or `random` to draw blind.",
210
+ file=sys.stderr,
211
+ )
212
+ return 2
213
+ print(fmt_rows(filter_cats(rows, args.category), args.json))
214
+ elif args.cmd == "show":
215
+ found, missing = find(rows, args.names)
216
+ for m in missing:
217
+ print(f"# not found: {m}", file=sys.stderr)
218
+ if not found:
219
+ return 1
220
+ print(fmt_rows(found, args.json))
221
+ elif args.cmd == "random":
222
+ pool = exclude(filter_cats(rows, args.category), args.exclude)
223
+ if not pool:
224
+ print("# no methods match", file=sys.stderr)
225
+ return 1
226
+ n = max(0, min(args.n, len(pool))) # clamp: never crash on a negative or oversized -n
227
+ picks = spread_sample(pool, n) if args.spread else random.sample(pool, n)
228
+ print(fmt_rows(picks, args.json))
229
+ return 0
230
+
231
+
232
+ if __name__ == "__main__":
233
+ sys.exit(main())