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.
- package/package.json +3 -2
- package/skills-registry.yaml +4 -0
- package/src/bmm-skills/3-solutioning/wizz-architecture/scripts/__pycache__/lint_spine.cpython-313.pyc +0 -0
- package/src/bmm-skills/3-solutioning/wizz-architecture/scripts/tests/__pycache__/test_lint_spine.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/4-implementation/wizz-code-review/SKILL.md +3 -5
- package/src/bmm-skills/4-implementation/wizz-code-review/customize.toml +71 -0
- package/src/bmm-skills/4-implementation/wizz-code-review/references/claims-check.md +14 -0
- package/src/bmm-skills/4-implementation/wizz-code-review/references/deletion-check.md +14 -0
- package/src/bmm-skills/4-implementation/wizz-code-review/review-prompts/edge-case-hunter.md +110 -0
- package/src/bmm-skills/4-implementation/wizz-code-review/review-prompts/verification-gap.md +113 -0
- package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-01-gather-context.md +32 -23
- package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-02-review.md +10 -13
- package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-03-triage.md +16 -22
- package/src/bmm-skills/4-implementation/wizz-code-review/steps/step-04-present.md +4 -2
- package/src/bmm-skills/4-implementation/wizz-quick-dev/customize.toml +76 -0
- package/src/bmm-skills/4-implementation/wizz-quick-dev/references/claims-check.md +14 -0
- package/src/bmm-skills/4-implementation/wizz-quick-dev/references/deletion-check.md +14 -0
- package/src/bmm-skills/4-implementation/wizz-quick-dev/review-prompts/edge-case-hunter.md +110 -0
- package/src/bmm-skills/4-implementation/wizz-quick-dev/review-prompts/verification-gap.md +113 -0
- package/src/bmm-skills/4-implementation/wizz-quick-dev/step-04-review.md +38 -16
- package/src/bmm-skills/4-implementation/wizz-retrospective/SKILL.md +56 -1488
- package/src/bmm-skills/4-implementation/wizz-retrospective/customize.toml +3 -5
- package/src/bmm-skills/4-implementation/wizz-retrospective/references/acceptance-verdict.md +55 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/references/aggregate-views.md +17 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/references/evidence-gathering.md +30 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/references/retro-document.md +84 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/references/team-discussion.md +22 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/__pycache__/sprint_status.cpython-313.pyc +0 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/git_evidence.py +304 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/sprint_status.py +746 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/tests/__pycache__/test_git_evidence.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/tests/__pycache__/test_sprint_status.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/tests/fixtures/sprint-status-template.yaml +71 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/tests/test_git_evidence.py +750 -0
- package/src/bmm-skills/4-implementation/wizz-retrospective/scripts/tests/test_sprint_status.py +1579 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/SKILL.md +39 -296
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/customize.toml +1 -3
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/references/fix-sprint-status.md +30 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/references/generate-tracking.md +25 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/references/readiness-gate.md +20 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/references/status-view.md +14 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/references/validate.md +10 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/scripts/__pycache__/sprint_plan.cpython-313.pyc +0 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/scripts/sprint_plan.py +697 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/scripts/tests/__pycache__/test_sprint_plan.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/scripts/tests/test_sprint_plan.py +524 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/sprint-status-template.yaml +9 -7
- package/src/bmm-skills/module-help.csv +3 -3
- package/src/core-skills/_shared/handoff-protocol.md +7 -8
- package/src/core-skills/module-help.csv +1 -0
- package/src/core-skills/wizz-advanced-elicitation/SKILL.md +36 -114
- package/src/core-skills/wizz-advanced-elicitation/{methods.csv → assets/methods.csv} +29 -27
- package/src/core-skills/wizz-advanced-elicitation/customize.toml +54 -0
- package/src/core-skills/wizz-advanced-elicitation/scripts/__pycache__/pick_methods.cpython-313.pyc +0 -0
- package/src/core-skills/wizz-advanced-elicitation/scripts/pick_methods.py +233 -0
- package/src/core-skills/wizz-advanced-elicitation/scripts/tests/__pycache__/test_pick_methods.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/core-skills/wizz-advanced-elicitation/scripts/tests/test_pick_methods.py +228 -0
- package/src/core-skills/wizz-brainstorming/SKILL.md +2 -2
- package/src/core-skills/wizz-brainstorming/assets/brain-selector.html +2 -0
- package/src/core-skills/wizz-brainstorming/references/converge.md +1 -1
- package/src/core-skills/wizz-brainstorming/references/finalize.md +1 -1
- package/src/core-skills/wizz-brainstorming/references/headless.md +1 -1
- package/src/core-skills/wizz-brainstorming/references/mode-autonomous.md +1 -1
- package/src/core-skills/wizz-brainstorming/scripts/__pycache__/brain.cpython-313.pyc +0 -0
- package/src/core-skills/wizz-brainstorming/scripts/brain.py +36 -6
- package/src/core-skills/wizz-brainstorming/scripts/tests/__pycache__/test_brain.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/core-skills/wizz-brainstorming/scripts/tests/__pycache__/test_brain.cpython-314.pyc +0 -0
- package/src/core-skills/wizz-brainstorming/scripts/tests/test_brain.py +24 -2
- package/src/core-skills/wizz-customize/scripts/__pycache__/list_customizable_skills.cpython-313.pyc +0 -0
- package/src/core-skills/wizz-customize/scripts/tests/__pycache__/test_list_customizable_skills.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/core-skills/wizz-forge-idea/SKILL.md +107 -0
- package/src/core-skills/wizz-forge-idea/customize.toml +41 -0
- package/src/core-skills/wizz-forge-idea/scripts/__pycache__/resolve_personas.cpython-313.pyc +0 -0
- package/src/core-skills/wizz-forge-idea/scripts/__pycache__/resolve_personas.cpython-314.pyc +0 -0
- package/src/core-skills/wizz-forge-idea/scripts/resolve_personas.py +275 -0
- package/src/core-skills/wizz-forge-idea/scripts/tests/__pycache__/test_resolve_personas.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/core-skills/wizz-forge-idea/scripts/tests/__pycache__/test_resolve_personas.cpython-314.pyc +0 -0
- package/src/core-skills/wizz-forge-idea/scripts/tests/test_resolve_personas.py +138 -0
- package/src/core-skills/wizz-party-mode/SKILL.md +37 -54
- package/src/core-skills/wizz-party-mode/customize.toml +61 -2
- package/src/core-skills/wizz-party-mode/references/create-party.md +8 -3
- package/src/core-skills/wizz-party-mode/references/mode-agent-team.md +3 -1
- package/src/core-skills/wizz-party-mode/references/mode-subagent.md +16 -4
- package/src/core-skills/wizz-party-mode/references/party-memory.md +51 -0
- package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-313.pyc +0 -0
- package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-314.pyc +0 -0
- package/src/core-skills/wizz-party-mode/scripts/resolve_party.py +22 -7
- package/src/core-skills/wizz-party-mode/scripts/tests/__pycache__/test_resolve_party.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/core-skills/wizz-party-mode/scripts/tests/__pycache__/test_resolve_party.cpython-314.pyc +0 -0
- package/src/core-skills/wizz-party-mode/scripts/tests/{test-resolve_party.py → test_resolve_party.py} +8 -0
- package/src/core-skills/wizz-review-edge-case-hunter/SKILL.md +17 -3
- package/src/modules/wizz/README.md +1 -1
- package/src/modules/wizz/_shared/model-ladder.md +22 -0
- package/src/modules/wizz/_shared/token-economy.md +6 -2
- package/src/modules/wizz/agents/wizz-ads/customize.toml +1 -1
- package/src/modules/wizz/agents/wizz-copy/customize.toml +1 -1
- package/src/modules/wizz/agents/wizz-designer/customize.toml +1 -1
- package/src/modules/wizz/agents/wizz-growth/customize.toml +11 -1
- package/src/modules/wizz/agents/wizz-maestro/customize.toml +1 -1
- package/src/modules/wizz/agents/wizz-memoria/customize.toml +1 -1
- package/src/modules/wizz/agents/wizz-qa/customize.toml +1 -1
- package/src/modules/wizz/agents/wizz-seo/customize.toml +1 -1
- package/src/modules/wizz/agents/wizz-social/customize.toml +1 -1
- package/src/modules/wizz/overrides/wizz-agent-analyst.toml +1 -1
- package/src/modules/wizz/overrides/wizz-agent-architect.toml +1 -1
- package/src/modules/wizz/overrides/wizz-agent-dev.toml +1 -1
- package/src/modules/wizz/overrides/wizz-agent-pm.toml +1 -1
- package/src/modules/wizz/overrides/wizz-agent-tech-writer.toml +1 -1
- package/src/modules/wizz/overrides/wizz-agent-ux-designer.toml +1 -1
- package/src/modules/wizz/subagents/codex/wizz-exec-haiku.toml +16 -0
- package/src/modules/wizz/subagents/codex/wizz-exec-opus.toml +18 -0
- package/src/modules/wizz/subagents/codex/wizz-exec-review.toml +17 -0
- package/src/modules/wizz/subagents/codex/wizz-exec-sonnet.toml +17 -0
- package/src/modules/wizz/subagents/gemini/wizz-exec-haiku.md +15 -0
- package/src/modules/wizz/subagents/gemini/wizz-exec-opus.md +17 -0
- package/src/modules/wizz/subagents/gemini/wizz-exec-review.md +15 -0
- package/src/modules/wizz/subagents/gemini/wizz-exec-sonnet.md +16 -0
- package/src/modules/wizz/subagents/opencode/wizz-exec-haiku.md +14 -0
- package/src/modules/wizz/subagents/opencode/wizz-exec-opus.md +16 -0
- package/src/modules/wizz/subagents/opencode/wizz-exec-review.md +16 -0
- package/src/modules/wizz/subagents/opencode/wizz-exec-sonnet.md +15 -0
- package/src/modules/wizz/subagents/wizz-exec-opus.md +16 -0
- package/src/modules/wizz/subagents/wizz-exec-review.md +15 -0
- package/src/scripts/__pycache__/memlog.cpython-313.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_memlog.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/scripts/tests/__pycache__/test_resolve_customization.cpython-313-pytest-9.1.1.pyc +0 -0
- package/src/skills-lib/pesquisa-de-publico-do-piva/README.md +83 -0
- package/src/skills-lib/pesquisa-de-publico-do-piva/SKILL.md +65 -0
- package/src/skills-lib/pesquisa-de-publico-do-piva/assets/template.html +414 -0
- package/src/skills-lib/pesquisa-de-publico-do-piva/prompts.md +131 -0
- package/src/skills-lib/wizz-offer-forge/README.md +13 -0
- package/src/skills-lib/wizz-offer-forge/SKILL.md +74 -0
- package/src/skills-lib/wizz-offer-forge/references/empilhamento-valor.md +25 -0
- package/src/skills-lib/wizz-offer-forge/references/garantia-reversa.md +22 -0
- package/src/skills-lib/wizz-offer-forge/references/mecanismo-unico.md +28 -0
- package/src/skills-lib/wizz-offer-forge/references/ponte-trafego.md +21 -0
- package/src/skills-lib/wizz-router/references/routing-table-flat.md +2 -0
- package/tools/installer/core/installer.js +57 -0
- package/tools/installer/ide/_config-driven.js +44 -30
- package/tools/installer/ide/platform-codes.yaml +42 -3
- package/tools/installer/modules/external-manager.js +140 -2
- package/tools/installer/modules/official-modules.js +68 -21
- package/tools/installer/prompts.js +45 -103
- package/tools/installer/ui.js +64 -7
- package/wizz-modules.yaml +65 -11
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/checklist.md +0 -34
- package/src/core-skills/wizz-brainstorming/scripts/memlog.py +0 -202
- 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
|
-
|
|
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
|
-
-
|
|
15
|
-
-
|
|
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
|
-
##
|
|
15
|
+
## On Activation
|
|
24
16
|
|
|
25
|
-
|
|
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
|
-
##
|
|
20
|
+
## Serving the Catalog
|
|
35
21
|
|
|
36
|
-
|
|
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 {
|
|
25
|
+
python3 {skill-root}/scripts/pick_methods.py --file {workflow.methods_file} <command>
|
|
42
26
|
```
|
|
43
27
|
|
|
44
|
-
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
-
|
|
37
|
+
## The Menu
|
|
59
38
|
|
|
60
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
**
|
|
58
|
+
- **Apply** — accept the proposed changes.
|
|
59
|
+
- **Reject** — drop the proposal entirely.
|
|
60
|
+
- Or give different direction.
|
|
89
61
|
|
|
90
|
-
|
|
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
|
-
|
|
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,
|
|
45
|
-
44,framing,
|
|
46
|
-
45,framing,
|
|
47
|
-
46,
|
|
48
|
-
47,
|
|
49
|
-
48,learning,
|
|
50
|
-
49,
|
|
51
|
-
50,
|
|
52
|
-
51,
|
|
53
|
-
52,
|
|
54
|
-
53,research,
|
|
55
|
-
54,research,
|
|
56
|
-
55,
|
|
57
|
-
56,
|
|
58
|
-
57,
|
|
59
|
-
58,
|
|
60
|
-
59,risk,
|
|
61
|
-
60,risk,
|
|
62
|
-
61,risk,
|
|
63
|
-
62,risk,
|
|
64
|
-
63,risk,
|
|
65
|
-
64,
|
|
66
|
-
65,
|
|
67
|
-
66,technical,
|
|
68
|
-
67,technical,
|
|
69
|
-
68,technical,
|
|
70
|
-
69,technical,
|
|
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 ↔ abstract → right 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 problem → reframe → true 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 → B → C → gaps 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,model → reality 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,complex → simple → gaps → mastery
|
|
50
|
+
49,learning,Active Recall Testing,Test understanding without references to verify true knowledge - essential for identifying gaps,test → gaps → reinforcement
|
|
51
|
+
50,learning,Deliberate Practice Loop,Identify a specific sub-skill - drill it with immediate feedback - adjust - repeat — targeted improvement beats general repetition,isolate → drill → feedback → adjust → repeat
|
|
52
|
+
51,philosophical,Occam's Razor Application,Find the simplest sufficient explanation by eliminating unnecessary complexity - essential for debugging,options → simplification → selection
|
|
53
|
+
52,philosophical,Trolley Problem Variations,Explore ethical trade-offs through moral dilemmas - valuable for understanding values and difficult decisions,dilemma → analysis → decision
|
|
54
|
+
53,research,Literature Review Personas,Optimist researcher + skeptic researcher + synthesizer review sources - balanced assessment of evidence quality,sources → critiques → synthesis
|
|
55
|
+
54,research,Thesis Defense Simulation,Student defends hypothesis against committee with different concerns - stress-tests research methodology and conclusions,thesis → challenges → defense → refinements
|
|
56
|
+
55,research,Comparative Analysis Matrix,Multiple analysts evaluate options against weighted criteria - structured decision-making with explicit scoring,options → criteria → scores → recommendation
|
|
57
|
+
56,research,Source Triangulation,Require at least three independent source types (quantitative - qualitative - expert) before accepting a claim — guards against single-source bias,claim → source 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 view → insights → application
|
|
59
|
+
58,retrospective,Lessons Learned Extraction,Systematically identify key takeaways and actionable improvements - essential for continuous improvement,experience → lessons → actions
|
|
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 → causes → prevention
|
|
61
|
+
60,risk,Failure Mode Analysis,Systematically explore how each component could fail - critical for reliability engineering and safety-critical systems,components → failures → prevention
|
|
62
|
+
61,risk,Challenge from Critical Perspective,Play devil's advocate to stress-test ideas and find weaknesses - essential for overcoming groupthink,assumptions → challenges → strengthening
|
|
63
|
+
62,risk,Identify Potential Risks,Brainstorm what could go wrong across all categories - fundamental for project planning and deployment preparation,categories → risks → mitigations
|
|
64
|
+
63,risk,Chaos Monkey Scenarios,Deliberately break things to test resilience and recovery - ensures systems handle failures gracefully,break → observe → harden
|
|
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,list → rate → stress-test → shore 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 amplifiers → decouple
|
|
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,options → trade-offs → decision → 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,simple → detailed → technical → aha
|
|
69
|
+
68,technical,Algorithm Olympics,Multiple approaches compete on the same problem with benchmarks - finds optimal solution through direct comparison,implementations → benchmarks → winner
|
|
70
|
+
69,technical,Security Audit Personas,Hacker + defender + auditor examine system from different threat models - comprehensive security review from multiple angles,vulnerabilities → defenses → compliance
|
|
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 = []
|
package/src/core-skills/wizz-advanced-elicitation/scripts/__pycache__/pick_methods.cpython-313.pyc
ADDED
|
Binary file
|
|
@@ -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())
|