wizz-method 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/marketplace.json +9 -9
- package/README.md +4 -4
- package/build/artifacts/llms-full.txt +218 -218
- package/build/artifacts/llms.txt +4 -4
- package/build/site/explanation/advanced-elicitation/index.html +2 -2
- package/build/site/explanation/adversarial-review/index.html +2 -2
- package/build/site/explanation/analysis-phase/index.html +2 -2
- package/build/site/explanation/brainstorming/index.html +2 -2
- package/build/site/explanation/checkpoint-preview/index.html +2 -2
- package/build/site/explanation/established-projects-faq/index.html +2 -2
- package/build/site/explanation/forensic-investigation/index.html +2 -2
- package/build/site/explanation/named-agents/index.html +6 -6
- package/build/site/explanation/party-mode/index.html +3 -3
- package/build/site/explanation/preventing-agent-conflicts/index.html +2 -2
- package/build/site/explanation/project-context/index.html +2 -2
- package/build/site/explanation/quick-dev/index.html +2 -2
- package/build/site/explanation/web-bundles/index.html +2 -2
- package/build/site/explanation/why-solutioning-matters/index.html +2 -2
- package/build/site/how-to/{customize-bmad → customize-wizz}/index.html +6 -6
- package/build/site/how-to/established-projects/index.html +2 -2
- package/build/site/how-to/{expand-bmad-for-your-org → expand-wizz-for-your-org}/index.html +7 -7
- package/build/site/how-to/{get-answers-about-bmad → get-answers-about-wizz}/index.html +3 -3
- package/build/site/how-to/install-custom-modules/index.html +3 -3
- package/build/site/how-to/{install-bmad → install-wizz}/index.html +6 -6
- package/build/site/how-to/non-interactive-installation/index.html +3 -3
- package/build/site/how-to/project-context/index.html +2 -2
- package/build/site/how-to/quick-fixes/index.html +2 -2
- package/build/site/how-to/shard-large-documents/index.html +2 -2
- package/build/site/how-to/upgrade-to-v6/index.html +8 -8
- package/build/site/how-to/use-web-bundles/index.html +2 -2
- package/build/site/index.html +3 -3
- package/build/site/llms-full.txt +218 -218
- package/build/site/llms.txt +4 -4
- package/build/site/pagefind/fragment/en_296ddb9.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_583316f.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_67825a4.pf_fragment +0 -0
- package/build/site/pagefind/fragment/{en_41cab15.pf_fragment → en_887ce56.pf_fragment} +0 -0
- package/build/site/pagefind/fragment/en_92d7cc7.pf_fragment +0 -0
- package/build/site/pagefind/fragment/{en_56b1635.pf_fragment → en_9b57d7d.pf_fragment} +0 -0
- package/build/site/pagefind/fragment/en_ba9fb37.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_bfc56b6.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_c6d9e48.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_cdd885c.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_d890205.pf_fragment +0 -0
- package/build/site/pagefind/index/en_5b9d8c6.pf_index +0 -0
- package/build/site/pagefind/index/en_868614c.pf_index +0 -0
- package/build/site/pagefind/index/en_e4f9bff.pf_index +0 -0
- package/build/site/pagefind/pagefind-entry.json +1 -1
- package/build/site/pagefind/pagefind.en_4e69d7f053.pf_meta +0 -0
- package/build/site/reference/agents/index.html +2 -2
- package/build/site/reference/commands/index.html +3 -3
- package/build/site/reference/core-tools/index.html +3 -3
- package/build/site/reference/modules/index.html +4 -4
- package/build/site/reference/testing/index.html +2 -2
- package/build/site/reference/workflow-map/index.html +2 -2
- package/build/site/roadmap/index.html +2 -2
- package/build/site/sitemap-0.xml +1 -1
- package/build/site/tutorials/getting-started/index.html +4 -4
- package/build/site/workflow-map-diagram-fr.html +2 -2
- package/package.json +8 -8
- package/removals.txt +46 -46
- package/src/bmm-skills/1-analysis/research/wizz-domain-research/customize.toml +1 -1
- package/src/bmm-skills/1-analysis/research/wizz-market-research/customize.toml +1 -1
- package/src/bmm-skills/1-analysis/research/wizz-technical-research/customize.toml +2 -1
- package/src/bmm-skills/1-analysis/wizz-agent-analyst/customize.toml +2 -2
- package/src/bmm-skills/1-analysis/wizz-agent-tech-writer/customize.toml +2 -2
- package/src/bmm-skills/1-analysis/wizz-document-project/customize.toml +1 -1
- package/src/bmm-skills/1-analysis/wizz-document-project/templates/index-template.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-document-project/templates/project-overview-template.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-document-project/templates/source-tree-template.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-prfaq/customize.toml +1 -1
- package/src/bmm-skills/1-analysis/wizz-product-brief/SKILL.md +1 -1
- package/src/bmm-skills/1-analysis/wizz-product-brief/customize.toml +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-agent-pm/customize.toml +2 -2
- package/src/bmm-skills/2-plan-workflows/wizz-agent-ux-designer/customize.toml +2 -2
- package/src/bmm-skills/2-plan-workflows/wizz-create-prd/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-create-prd/customize.toml +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-edit-prd/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-edit-prd/customize.toml +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-prd/SKILL.md +3 -3
- package/src/bmm-skills/2-plan-workflows/wizz-prd/customize.toml +2 -2
- package/src/bmm-skills/2-plan-workflows/wizz-ux/SKILL.md +2 -2
- package/src/bmm-skills/2-plan-workflows/wizz-validate-prd/SKILL.md +1 -1
- package/src/bmm-skills/2-plan-workflows/wizz-validate-prd/customize.toml +1 -1
- package/src/bmm-skills/3-solutioning/wizz-agent-architect/customize.toml +2 -2
- package/src/bmm-skills/3-solutioning/wizz-architecture/SKILL.md +2 -2
- package/src/bmm-skills/3-solutioning/wizz-architecture/customize.toml +4 -2
- package/src/bmm-skills/3-solutioning/wizz-check-implementation-readiness/customize.toml +1 -1
- package/src/bmm-skills/3-solutioning/wizz-create-architecture/SKILL.md +1 -1
- package/src/bmm-skills/3-solutioning/wizz-create-architecture/customize.toml +1 -1
- package/src/bmm-skills/3-solutioning/wizz-create-epics-and-stories/customize.toml +1 -1
- package/src/bmm-skills/3-solutioning/wizz-generate-project-context/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-agent-dev/customize.toml +3 -2
- package/src/bmm-skills/4-implementation/wizz-checkpoint-preview/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-code-review/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-correct-course/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-create-story/SKILL.md +2 -2
- package/src/bmm-skills/4-implementation/wizz-create-story/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-dev-story/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-investigate/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-quick-dev/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-quick-dev/step-01-clarify-and-route.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-retrospective/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-sprint-planning/customize.toml +1 -1
- package/src/bmm-skills/4-implementation/wizz-sprint-status/SKILL.md +5 -5
- package/src/bmm-skills/4-implementation/wizz-sprint-status/customize.toml +1 -1
- package/src/bmm-skills/module-help.csv +32 -32
- package/src/bmm-skills/module.yaml +1 -1
- package/src/core-skills/module-help.csv +3 -3
- package/src/core-skills/module.yaml +4 -4
- package/src/core-skills/wizz-brainstorming/SKILL.md +1 -1
- package/src/core-skills/wizz-brainstorming/analysis/catalog-analysis.md +4 -4
- package/src/core-skills/wizz-brainstorming/assets/brain-selector.html +5 -5
- package/src/core-skills/wizz-brainstorming/customize.toml +1 -1
- package/src/core-skills/wizz-brainstorming/references/finalize.md +1 -1
- package/src/core-skills/wizz-brainstorming/scripts/brain.py +5 -5
- package/src/core-skills/wizz-brainstorming/scripts/tests/test_brain.py +1 -1
- package/src/core-skills/wizz-brainstorming/scripts/tests/test_memlog.py +3 -3
- package/src/core-skills/wizz-customize/SKILL.md +6 -6
- package/src/core-skills/wizz-customize/scripts/list_customizable_skills.py +3 -3
- package/src/core-skills/wizz-customize/scripts/tests/test_list_customizable_skills.py +13 -13
- package/src/core-skills/wizz-editorial-review-structure/SKILL.md +1 -1
- package/src/core-skills/wizz-help/SKILL.md +3 -3
- package/src/core-skills/wizz-party-mode/SKILL.md +5 -3
- package/src/core-skills/wizz-party-mode/customize.toml +2 -2
- package/src/core-skills/wizz-party-mode/scripts/resolve_party.py +2 -2
- package/src/core-skills/wizz-party-mode/scripts/tests/test-resolve_party.py +1 -1
- package/src/core-skills/wizz-spec/SKILL.md +3 -3
- package/src/core-skills/wizz-spec/customize.toml +2 -2
- package/src/modules/wizz/README.md +5 -5
- package/src/modules/wizz/agents/wizz-ads/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-copy/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-designer/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-growth/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-maestro/SKILL.md +2 -2
- package/src/modules/wizz/agents/wizz-memoria/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-qa/SKILL.md +1 -1
- package/src/modules/wizz/agents/wizz-seo/SKILL.md +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-analyst.toml → wizz-agent-analyst.toml} +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-architect.toml → wizz-agent-architect.toml} +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-dev.toml → wizz-agent-dev.toml} +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-pm.toml → wizz-agent-pm.toml} +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-tech-writer.toml → wizz-agent-tech-writer.toml} +1 -1
- package/src/modules/wizz/overrides/{bmad-agent-ux-designer.toml → wizz-agent-ux-designer.toml} +1 -1
- package/src/modules/wizz/scripts/wizz-init.mjs +7 -7
- package/src/scripts/resolve_config.py +7 -7
- package/src/scripts/resolve_customization.py +2 -2
- package/src/scripts/tests/test_memlog.py +1 -1
- package/tools/bundle-web-bundles.js +1 -1
- package/tools/format-workflow-md.js +2 -2
- package/tools/installer/commands/install.js +1 -1
- package/tools/installer/commands/status.js +9 -9
- package/tools/installer/commands/uninstall.js +5 -5
- package/tools/installer/core/existing-install.js +8 -8
- package/tools/installer/core/install-paths.js +13 -13
- package/tools/installer/core/installer.js +102 -102
- package/tools/installer/core/legacy-warnings.js +16 -16
- package/tools/installer/core/manifest-generator.js +30 -30
- package/tools/installer/core/manifest.js +30 -30
- package/tools/installer/core/python-check.js +7 -7
- package/tools/installer/ide/_config-driven.js +97 -97
- package/tools/installer/ide/manager.js +17 -17
- package/tools/installer/ide/platform-codes.yaml +5 -5
- package/tools/installer/ide/shared/installed-skills.js +13 -13
- package/tools/installer/ide/shared/path-utils.js +46 -46
- package/tools/installer/ide/shared/skill-manifest.js +4 -4
- package/tools/installer/install-messages.yaml +1 -1
- package/tools/installer/list-options.js +3 -3
- package/tools/installer/modules/channel-plan.js +1 -1
- package/tools/installer/modules/channel-resolver.js +1 -1
- package/tools/installer/modules/custom-module-manager.js +16 -16
- package/tools/installer/modules/external-manager.js +6 -6
- package/tools/installer/modules/official-modules.js +42 -42
- package/tools/installer/modules/plugin-resolver.js +3 -3
- package/tools/installer/project-root.js +13 -13
- package/tools/installer/prompts.js +1 -1
- package/tools/installer/set-overrides.js +6 -6
- package/tools/installer/ui.js +29 -29
- package/tools/installer/yaml-format.js +1 -1
- package/tools/migrate-custom-module-paths.js +11 -11
- package/tools/skill-validator.md +6 -6
- package/tools/validate-skills.js +10 -5
- package/web-bundles/README.md +4 -4
- package/web-bundles/brainstorming-coach/INSTRUCTIONS.md +1 -1
- package/web-bundles/bundles.json +6 -6
- package/web-bundles/market-and-industry-research/INSTRUCTIONS.md +1 -1
- package/web-bundles/prd-coach/INSTRUCTIONS.md +3 -3
- package/web-bundles/prfaq-coach/INSTRUCTIONS.md +3 -3
- package/web-bundles/product-brief-coach/INSTRUCTIONS.md +3 -3
- package/web-bundles/ux-coach/INSTRUCTIONS.md +1 -1
- package/{bmad-modules.yaml → wizz-modules.yaml} +15 -15
- package/build/site/pagefind/fragment/en_5ad92a9.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_7aea5bc.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_81bcd7f.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_938e9c4.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_b51d75b.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_c9fea21.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_e07e982.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_f4389af.pf_fragment +0 -0
- package/build/site/pagefind/fragment/en_f52c9f9.pf_fragment +0 -0
- package/build/site/pagefind/index/en_82c64dc.pf_index +0 -0
- package/build/site/pagefind/index/en_d0dd3c7.pf_index +0 -0
- package/build/site/pagefind/index/en_e890f88.pf_index +0 -0
- package/build/site/pagefind/pagefind.en_ee1b8a17c8.pf_meta +0 -0
- /package/build/site/img/{bmad-dark.png → wizz-dark.png} +0 -0
- /package/build/site/img/{bmad-light.png → wizz-light.png} +0 -0
- /package/src/bmm-skills/1-analysis/wizz-prfaq/{bmad-manifest.json → wizz-manifest.json} +0 -0
- /package/tools/installer/{bmad-cli.js → wizz-cli.js} +0 -0
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wizz-party-mode
|
|
3
|
-
description: 'Orchestrates lively group discussions between installed
|
|
3
|
+
description: 'Orchestrates lively group discussions between installed WIZZ agents or custom personas, and helps author custom parties. Use when the user requests party mode, a roundtable, or multiple agent perspectives — or wants to create/configure a party, define personas, or build an AI focus-group panel.'
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Party Mode
|
|
7
7
|
|
|
8
|
-
Run a round-table where
|
|
8
|
+
Run a round-table where WIZZ agents talk to each other, and to the user, like a real group of distinct people in conversation. Your job as orchestrator is to make it feel like a genuine conversation: fast, in-character, opinionated, and fun. Everything below is an objective, not a script. Use whatever mechanism your model and harness make available to hit it.
|
|
9
9
|
|
|
10
10
|
**Two intents.** Usually the user wants to *run* a party — that's everything below. If instead they want to *create or configure* one — invent a cast, add a persona, distill customer data into a focus-group panel, set a default, or **edit an existing custom party** (retune a member, add someone to a group) — load `references/create-party.md` and follow it. Detect which from how they invoke the skill; when it's unclear, ask. Neither intent has a headless contract: running a party is the live conversation itself, and the authoring path's only write goes through `wizz-customize`, which gates it.
|
|
11
11
|
|
|
@@ -49,6 +49,8 @@ Use `{workflow.party_mode}` for the session unless the user passed `--mode <sess
|
|
|
49
49
|
|
|
50
50
|
**Voicing the room** (every mode presents this way). Pick 2–3 personas whose perspective fits the moment and let them talk directly, in character; vary who shows up round to round so it isn't the same voices every time. Each turn opens with `{icon} **{name}:**`, and turns run back to back so it reads as one exchange. Don't summarize, blend, or narrate what a persona "would" say — let them say it.
|
|
51
51
|
|
|
52
|
+
**Concise output (this user's default).** The analysis behind the scenes stays as deep as ever — agents think, clash, and reason in full internally. But what you *surface* to the user is tight: short turns, no walls of text, no replaying the whole internal debate. Show the conclusions and the points of disagreement in a compact form (bullets or a quick comparison when there's a trade-off), not every back-and-forth that produced them. If a round generated a long internal exchange, surface a brief read — who landed where, where they clashed — and offer "want the full back-and-forth?" rather than dumping it. When the conversation reaches a point that needs the user's decision or action, present it as a compact, comparative, bulleted block (the options, the trade-off, the recommendation) — never bury the ask inside prose.
|
|
53
|
+
|
|
52
54
|
## Make It Feel Like One Conversation
|
|
53
55
|
|
|
54
56
|
Present one exchange, not a row of answers aimed at the user. The hard rule: never change what an agent argued — add staging and connective tissue, but don't invent positions, soften a stance, or put words in a persona's mouth. Weave delivery, preserve substance; it still reads like that specific character, quirks and speech patterns and all.
|
|
@@ -74,4 +76,4 @@ It is your goal to keep party mode feeling like a party, a good party. fun, enga
|
|
|
74
76
|
|
|
75
77
|
## Wrapping Up
|
|
76
78
|
|
|
77
|
-
When the user signals they're done, give a quick read-back of the best takeaways and offer them a keepsake: a single self-contained HTML document of the session to keep. If they want it, make it genuinely nice rather than a transcript dump — lay the conversation out by persona (their icons, names, voice), and reach for inline SVG and light animation where it lifts the piece. Write it as a standalone `.html` into `{workflow.output_dir}/` (a `{date}`-stamped, topic-named file), or wherever they ask. Then run `{workflow.on_complete}` if non-empty (a string scalar is one instruction, an array is a sequence run in order) and drop back to normal mode. Read the room; don't wait for a magic word.
|
|
79
|
+
When the user signals they're done, give a quick read-back of the best takeaways — compact and in bullets, comparative where it helps, easy to skim — and offer them a keepsake: a single self-contained HTML document of the session to keep. If they want it, make it genuinely nice rather than a transcript dump — lay the conversation out by persona (their icons, names, voice), and reach for inline SVG and light animation where it lifts the piece. Write it as a standalone `.html` into `{workflow.output_dir}/` (a `{date}`-stamped, topic-named file), or wherever they ask. Then run `{workflow.on_complete}` if non-empty (a string scalar is one instruction, an array is a sequence run in order) and drop back to normal mode. Read the room; don't wait for a magic word.
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
[workflow]
|
|
10
10
|
|
|
11
|
-
# --- Configurable below. Overrides merge per
|
|
11
|
+
# --- Configurable below. Overrides merge per Wizz structural rules: ---
|
|
12
12
|
# scalars: override wins • plain arrays: append
|
|
13
13
|
# arrays of tables keyed by `code`/`id`: matching key replaces, new keys append
|
|
14
14
|
|
|
@@ -28,7 +28,7 @@ persistent_facts = [
|
|
|
28
28
|
]
|
|
29
29
|
|
|
30
30
|
# Which party loads when the user just says "party mode" with no override.
|
|
31
|
-
# Empty = the installed
|
|
31
|
+
# Empty = the installed WIZZ agents — exactly the default behavior of a plain
|
|
32
32
|
# install. Custom members defined below join the POOL (usable in groups, and
|
|
33
33
|
# summonable by name) but do NOT crowd this default room. Set this to a
|
|
34
34
|
# `party_groups` id to pin a curated room as the default instead. A runtime
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
# ///
|
|
5
5
|
"""Resolve the party-mode roster, lazily.
|
|
6
6
|
|
|
7
|
-
Merges the installed
|
|
7
|
+
Merges the installed WIZZ agents with the user's custom `party_members`
|
|
8
8
|
into one collective, then projects only what the moment needs:
|
|
9
9
|
|
|
10
10
|
* default (no flag) — the active roster to load on entry: the
|
|
@@ -85,7 +85,7 @@ def load_workflow(project_root: Path, skill_root: Path):
|
|
|
85
85
|
|
|
86
86
|
def _alias(code: str) -> str:
|
|
87
87
|
"""Short alias for an installed agent code: wizz-agent-analyst -> analyst."""
|
|
88
|
-
for prefix in ("
|
|
88
|
+
for prefix in ("wizz-agent-", "wizz-"):
|
|
89
89
|
if code.startswith(prefix):
|
|
90
90
|
return code[len(prefix):]
|
|
91
91
|
return code
|
|
@@ -20,7 +20,7 @@ AGENTS = {
|
|
|
20
20
|
class TestAlias(unittest.TestCase):
|
|
21
21
|
def test_strips_known_prefixes(self):
|
|
22
22
|
self.assertEqual(rp._alias("wizz-agent-analyst"), "analyst")
|
|
23
|
-
self.assertEqual(rp._alias("
|
|
23
|
+
self.assertEqual(rp._alias("wizz-foo"), "foo")
|
|
24
24
|
|
|
25
25
|
def test_passes_through_unprefixed(self):
|
|
26
26
|
self.assertEqual(rp._alias("morpheus"), "morpheus")
|
|
@@ -3,10 +3,10 @@ name: wizz-spec
|
|
|
3
3
|
description: Distill any intent input into the SPEC kernel + companions — the canonical, preservation-validated machine contract for downstream work. Use when the user says "create a spec", "distill this into a spec", "validate this spec", or "update the spec".
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# Wizz Spec
|
|
7
7
|
## Overview
|
|
8
8
|
|
|
9
|
-
Canonical transformer for the
|
|
9
|
+
Canonical transformer for the Wizz spec-kernel ecosystem. Takes any intent input — vague idea, brain dump, PRD, GDD, RFC, brief, Slack thread, customer email, meeting transcript, mockups, mixed multi-source — and produces **SPEC.md** carrying the five-field kernel (Why, Capabilities, Constraints, Non-goals, Success signal) plus companion files for load-bearing content that does not fit or would bloat the kernel with expansive line-item detail. Together they are the machine contract every downstream Wizz skill consumes.
|
|
10
10
|
|
|
11
11
|
Multiple skills may call to update the same spec over time.
|
|
12
12
|
|
|
@@ -65,7 +65,7 @@ Writes go through the shared script — `{project-root}/_wizz/scripts/memlog.py`
|
|
|
65
65
|
|
|
66
66
|
Read the input and its ancillary linked materials. If there is no input, follow the no-input branch in **Workspace** (ask or block). If a prior `.memlog.md` exists at the target folder, read it — the operation becomes an update, and the memlog (not the rendered `SPEC.md`) is the authority on what was decided and on capability IDs. Preserve those IDs; new capabilities get the next unused `CAP-N`; never reuse retired IDs. Otherwise this is a create, and the first move is `memlog.py init`.
|
|
67
67
|
|
|
68
|
-
When the input is structured and pre-sorted (a PRD with an addendum, a GDD, a brief produced by an upstream
|
|
68
|
+
When the input is structured and pre-sorted (a PRD with an addendum, a GDD, a brief produced by an upstream Wizz skill), trust the authored separation: lift kernel-fitting content into SPEC.md, lift overflow into appropriately-named companions. When the input is mixed (a brain dump, a transcript, an RFC, a customer email), do the sorting yourself: walk each claim, apply the three-lens load-bearing test (Spec Law rule 7), and route to the kernel field or a companion.
|
|
69
69
|
|
|
70
70
|
Distill the input into the five-field kernel using `{workflow.spec_template}` as the skeleton. When input is rich, extract directly — no elicitation. When input is sparse, choose: **express** (best-effort distill, every gap becomes an `open_questions[]` entry) or **guided** (walk the five fields with the user one at a time). Headless defaults to express and logs the choice. Interactive asks.
|
|
71
71
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
|
|
9
9
|
[workflow]
|
|
10
10
|
|
|
11
|
-
# --- Configurable below. Overrides merge per
|
|
11
|
+
# --- Configurable below. Overrides merge per Wizz structural rules: ---
|
|
12
12
|
# scalars: override wins • arrays: append
|
|
13
13
|
|
|
14
14
|
# Steps to run before the standard activation (config load, greet).
|
|
@@ -40,7 +40,7 @@ spec_filename = "SPEC.md"
|
|
|
40
40
|
|
|
41
41
|
# Output path for spec folders. Lands directly under {output_folder}
|
|
42
42
|
# so wizz-spec works in core-only installs and matches the
|
|
43
|
-
# long-term
|
|
43
|
+
# long-term Wizz direction of grouping artifacts as siblings under
|
|
44
44
|
# {output_folder}/<type>/ rather than nested inside planning vs
|
|
45
45
|
# implementation folders.
|
|
46
46
|
spec_output_path = "{output_folder}/specs"
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Módulo Wizz — método de agência em PT-BR
|
|
2
2
|
|
|
3
|
-
Personalização do
|
|
3
|
+
Personalização do WIZZ para a Wizz: linguagem fácil e resumida, cada agente termina com **✅ o que fiz / ➡️ próximo passo / 🎯 comando**, e o roteamento (`/wizz-router`) está dissolvido nos menus dos agentes, ligando-os às ~80 skills globais.
|
|
4
4
|
|
|
5
5
|
## Agentes
|
|
6
6
|
|
|
7
7
|
| Agente | Ícone | Faz | Rota para (skills globais) |
|
|
8
8
|
|---|---|---|---|
|
|
9
|
-
| `wizz-maestro` | 🧭 | Lê o pedido e despacha o agente certo (router dissolvido) | todos os agentes wizz/
|
|
9
|
+
| `wizz-maestro` | 🧭 | Lê o pedido e despacha o agente certo (router dissolvido) | todos os agentes wizz/wizz |
|
|
10
10
|
| `wizz-designer` | 🎨 | Design visual, landing, motion, 3D | premium-landing-ui-researcher, ui-ux-pro-max, motion-3d-director, taste-skill, ui-component-curator |
|
|
11
11
|
| `wizz-copy` | ✍️ | Copy, e-mail, headlines | copywriting, email-sequence, humanizer, copy-editing |
|
|
12
12
|
| `wizz-seo` | 🔍 | SEO tradicional e de IA | seo-audit, ai-seo, schema-markup, programmatic-seo, site-architecture |
|
|
@@ -14,7 +14,7 @@ Personalização do BMAD para a Wizz: linguagem fácil e resumida, cada agente t
|
|
|
14
14
|
| `wizz-ads` | 📢 | Mídia paga | paid-ads, ad-creative, analytics-tracking, MCP meta-ads |
|
|
15
15
|
| `wizz-memoria` | 🧠 | Memória do projeto | cerebro |
|
|
16
16
|
|
|
17
|
-
Os papéis de dev/produto reusam os agentes
|
|
17
|
+
Os papéis de dev/produto reusam os agentes WIZZ (Mary, John, Winston, Amelia, Sally, Paige), personalizados em PT-BR pelos overrides em `overrides/`.
|
|
18
18
|
|
|
19
19
|
## Camada Wizz (em todos os agentes)
|
|
20
20
|
|
|
@@ -26,8 +26,8 @@ Os papéis de dev/produto reusam os agentes BMAD (Mary, John, Winston, Amelia, S
|
|
|
26
26
|
|
|
27
27
|
## Instalação
|
|
28
28
|
|
|
29
|
-
1. Instale o
|
|
30
|
-
2. Rode a personalização Wizz (escolha do idioma + overrides dos agentes
|
|
29
|
+
1. Instale o WIZZ no projeto (o módulo `wizz` aparece como bundled em `src/modules/wizz`).
|
|
30
|
+
2. Rode a personalização Wizz (escolha do idioma + overrides dos agentes WIZZ):
|
|
31
31
|
```bash
|
|
32
32
|
node <caminho-do-wizz-method>/src/modules/wizz/scripts/wizz-init.mjs .
|
|
33
33
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wizz-ads
|
|
3
|
-
description:
|
|
3
|
+
description: Wizz Method Paid Media Agent. Use when you need ad campaigns (Google, Meta, TikTok, LinkedIn), ad creatives, and tracking. Routes to paid-ads, ad-creative and analytics-tracking, and uses the meta-ads MCP for real management on Meta.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Ads — Mídia Paga
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wizz-copy
|
|
3
|
-
description:
|
|
3
|
+
description: Wizz Method Copywriter. Use when you need sales copy, headlines, page copy, emails, and sequences. Routes to global skills copywriting, email-sequence, humanizer, and copy-editing.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Copy — Copywriter
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wizz-designer
|
|
3
|
-
description:
|
|
3
|
+
description: Wizz Method Product and UI Designer. Use when you need to create interfaces, landing pages, design systems, motion, and 3D. Routes to global design skills (premium-landing-ui-researcher, ui-ux-pro-max, motion-3d-director, taste-skill).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Designer — Design de Produto e UI
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wizz-growth
|
|
3
|
-
description:
|
|
3
|
+
description: Wizz Method Growth and Conversion Agent. Use when you need marketing ideas, CRO, page optimization, product launching, pricing, and retention/churn prevention. Routes to marketing-ideas, page-cro, launch-strategy, pricing-strategy, and churn-prevention.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Growth — Growth e Conversão
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wizz-maestro
|
|
3
|
-
description:
|
|
3
|
+
description: Wizz Method Orchestrator. Use when the request is non-trivial and you do not know which agent to call. It reads the request, discovers the area, and dispatches the right agent. It is the dissolved router — replacing /wizz-router inside the method.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Maestro — Orquestrador do Wizz Method
|
|
@@ -51,7 +51,7 @@ Se o usuário já disse a intenção, **classifique e despache direto** o agente
|
|
|
51
51
|
|
|
52
52
|
Classifique o pedido e chame o agente correspondente. Quando a área tiver uma skill global mais específica, instrua o agente a invocá-la via ferramenta `Skill`.
|
|
53
53
|
|
|
54
|
-
A coluna "Skill do agente" é o nome real a invocar via a ferramenta `Skill`. Os papéis de dev/produto reusam os agentes
|
|
54
|
+
A coluna "Skill do agente" é o nome real a invocar via a ferramenta `Skill`. Os papéis de dev/produto reusam os agentes WIZZ (personalizados pelos overrides Wizz); os de agência são os novos `wizz-*`.
|
|
55
55
|
|
|
56
56
|
| Pedido fala sobre… | Apelido | Skill do agente | Skills globais que ele usa |
|
|
57
57
|
|---|---|---|---|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wizz-memoria
|
|
3
|
-
description:
|
|
3
|
+
description: Wizz Method Project Brain. Use when you need to retrieve what has already been decided, save decisions/learnings, and view the project state. Routes to the global skill cerebro (/view, /save, /decision, /dump).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Memória — Cérebro do Projeto
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wizz-qa
|
|
3
|
-
description:
|
|
3
|
+
description: Wizz Method QA. Use when the code is ready, to verify it from the outside (run tests, generate E2E tests, adversarial review hunting bugs, and check if it meets what was requested). Routes to e2e-runner, adversarial-reviewer, wizz-qa-generate-e2e-tests, and code-reviewer.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# QA — Garantia de Qualidade
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: wizz-seo
|
|
3
|
-
description:
|
|
3
|
+
description: Wizz Method SEO Specialist. Use when you need SEO auditing, search optimization, AI search optimization, schema markup, and programmatic SEO. Routes to seo-audit, ai-seo, schema-markup, programmatic-seo, and site-architecture.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# SEO — Especialista de SEO
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Override Wizz (escopo time) para o agente
|
|
1
|
+
# Override Wizz (escopo time) para o agente WIZZ Mary (Business Analyst).
|
|
2
2
|
# Mescla por cima da base: principles e activation_steps fazem APPEND.
|
|
3
3
|
# Instalado em {project-root}/_wizz/custom/wizz-agent-analyst.toml
|
|
4
4
|
# Seu .user.toml pessoal ainda vence por cima deste.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Override Wizz (escopo time) para o agente
|
|
1
|
+
# Override Wizz (escopo time) para o agente WIZZ Winston (System Architect).
|
|
2
2
|
# Mescla por cima da base: principles e activation_steps fazem APPEND.
|
|
3
3
|
# Instalado em {project-root}/_wizz/custom/wizz-agent-architect.toml
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Override Wizz (escopo time) para o agente
|
|
1
|
+
# Override Wizz (escopo time) para o agente WIZZ Amelia (Senior Software Engineer).
|
|
2
2
|
# Mescla por cima da base: principles e activation_steps fazem APPEND.
|
|
3
3
|
# Instalado em {project-root}/_wizz/custom/wizz-agent-dev.toml
|
|
4
4
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Override Wizz (escopo time) para o agente
|
|
1
|
+
# Override Wizz (escopo time) para o agente WIZZ John (Product Manager).
|
|
2
2
|
# Mescla por cima da base: principles e activation_steps fazem APPEND.
|
|
3
3
|
# Instalado em {project-root}/_wizz/custom/wizz-agent-pm.toml
|
|
4
4
|
|
package/src/modules/wizz/overrides/{bmad-agent-tech-writer.toml → wizz-agent-tech-writer.toml}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Override Wizz (escopo time) para o agente
|
|
1
|
+
# Override Wizz (escopo time) para o agente WIZZ Paige (Technical Writer).
|
|
2
2
|
# Mescla por cima da base: principles e activation_steps fazem APPEND.
|
|
3
3
|
# Instalado em {project-root}/_wizz/custom/wizz-agent-tech-writer.toml
|
|
4
4
|
|
package/src/modules/wizz/overrides/{bmad-agent-ux-designer.toml → wizz-agent-ux-designer.toml}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Override Wizz (escopo time) para o agente
|
|
1
|
+
# Override Wizz (escopo time) para o agente WIZZ Sally (UX Designer).
|
|
2
2
|
# Mescla por cima da base: principles e activation_steps fazem APPEND.
|
|
3
3
|
# Instalado em {project-root}/_wizz/custom/wizz-agent-ux-designer.toml
|
|
4
4
|
# Obs: Sally cuida do UX dentro do fluxo de PRD (wireframe, fluxo). Para
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
// wizz-init — aplica a personalização Wizz num projeto que já tem o
|
|
1
|
+
// wizz-init — aplica a personalização Wizz num projeto que já tem o WIZZ instalado.
|
|
2
2
|
//
|
|
3
3
|
// O que faz (idempotente, seguro de rodar de novo):
|
|
4
4
|
// 1. Pergunta o idioma e o seta em _wizz/bmm/config.yaml (communication_language
|
|
5
5
|
// e document_output_language).
|
|
6
6
|
// 2. Copia os overrides Wizz (overrides/*.toml) para _wizz/custom/, dando aos
|
|
7
|
-
// agentes
|
|
7
|
+
// agentes WIZZ o tom fácil + protocolo de encerramento.
|
|
8
8
|
//
|
|
9
9
|
// Uso:
|
|
10
10
|
// node src/modules/wizz/scripts/wizz-init.mjs [caminho-do-projeto] [--lang "<idioma>"]
|
|
@@ -116,17 +116,17 @@ function projectArg(argv) {
|
|
|
116
116
|
|
|
117
117
|
async function main() {
|
|
118
118
|
const projectRoot = path.resolve(projectArg(process.argv.slice(2)) || process.cwd());
|
|
119
|
-
const
|
|
119
|
+
const wizzDir = path.join(projectRoot, '_wizz');
|
|
120
120
|
|
|
121
|
-
if (!(await exists(
|
|
122
|
-
throw new Error(`Não achei _wizz/ em ${projectRoot}. Rode o instalador do
|
|
121
|
+
if (!(await exists(wizzDir))) {
|
|
122
|
+
throw new Error(`Não achei _wizz/ em ${projectRoot}. Rode o instalador do WIZZ primeiro.`);
|
|
123
123
|
}
|
|
124
124
|
|
|
125
125
|
const done = [];
|
|
126
126
|
|
|
127
127
|
// 1) Idioma escolhido no config do bmm.
|
|
128
128
|
const { lang, source } = await pickLanguage(process.argv.slice(2));
|
|
129
|
-
const bmmConfig = path.join(
|
|
129
|
+
const bmmConfig = path.join(wizzDir, 'bmm', 'config.yaml');
|
|
130
130
|
if (await exists(bmmConfig)) {
|
|
131
131
|
let content = await readFile(bmmConfig, 'utf8');
|
|
132
132
|
content = upsertYamlKey(content, 'communication_language', lang);
|
|
@@ -138,7 +138,7 @@ async function main() {
|
|
|
138
138
|
}
|
|
139
139
|
|
|
140
140
|
// 2) Copia overrides Wizz para _wizz/custom/.
|
|
141
|
-
const customDir = path.join(
|
|
141
|
+
const customDir = path.join(wizzDir, 'custom');
|
|
142
142
|
await mkdir(customDir, { recursive: true });
|
|
143
143
|
if (await exists(overridesDir)) {
|
|
144
144
|
const entries = await readdir(overridesDir);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
Resolve
|
|
3
|
+
Resolve Wizz's central config using four-layer TOML merge.
|
|
4
4
|
|
|
5
5
|
Reads from four layers (highest priority last):
|
|
6
6
|
1. {project-root}/_wizz/config.toml (installer-owned team)
|
|
@@ -136,7 +136,7 @@ def extract_key(data, dotted_key: str):
|
|
|
136
136
|
|
|
137
137
|
def main():
|
|
138
138
|
parser = argparse.ArgumentParser(
|
|
139
|
-
description="Resolve
|
|
139
|
+
description="Resolve Wizz central config using four-layer TOML merge.",
|
|
140
140
|
)
|
|
141
141
|
parser.add_argument(
|
|
142
142
|
"--project-root", "-p", required=True,
|
|
@@ -149,12 +149,12 @@ def main():
|
|
|
149
149
|
args = parser.parse_args()
|
|
150
150
|
|
|
151
151
|
project_root = Path(args.project_root).resolve()
|
|
152
|
-
|
|
152
|
+
wizz_dir = project_root / "_wizz"
|
|
153
153
|
|
|
154
|
-
base_team = load_toml(
|
|
155
|
-
base_user = load_toml(
|
|
156
|
-
custom_team = load_toml(
|
|
157
|
-
custom_user = load_toml(
|
|
154
|
+
base_team = load_toml(wizz_dir / "config.toml", required=True)
|
|
155
|
+
base_user = load_toml(wizz_dir / "config.user.toml")
|
|
156
|
+
custom_team = load_toml(wizz_dir / "custom" / "config.toml")
|
|
157
|
+
custom_user = load_toml(wizz_dir / "custom" / "config.user.toml")
|
|
158
158
|
|
|
159
159
|
merged = deep_merge(base_team, base_user)
|
|
160
160
|
merged = deep_merge(merged, custom_team)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env python3
|
|
2
2
|
"""
|
|
3
|
-
Resolve customization for a
|
|
3
|
+
Resolve customization for a Wizz skill using three-layer TOML merge.
|
|
4
4
|
|
|
5
5
|
Reads customization from three layers (highest priority first):
|
|
6
6
|
1. {project-root}/_wizz/custom/{name}.user.toml (personal, gitignored)
|
|
@@ -187,7 +187,7 @@ def write_json_stdout(output):
|
|
|
187
187
|
|
|
188
188
|
def main():
|
|
189
189
|
parser = argparse.ArgumentParser(
|
|
190
|
-
description="Resolve customization for a
|
|
190
|
+
description="Resolve customization for a Wizz skill using three-layer TOML merge.",
|
|
191
191
|
add_help=True,
|
|
192
192
|
)
|
|
193
193
|
parser.add_argument(
|
|
@@ -246,7 +246,7 @@ def test_set_preserves_body(ws):
|
|
|
246
246
|
|
|
247
247
|
def test_updated_stays_last(ws):
|
|
248
248
|
init(ws)
|
|
249
|
-
memlog.main(["set", "--workspace", ws, "--key", "owner", "--value", "
|
|
249
|
+
memlog.main(["set", "--workspace", ws, "--key", "owner", "--value", "Wizz"])
|
|
250
250
|
meta = memlog.split(read(ws))[0]
|
|
251
251
|
assert list(meta)[-1] == "updated"
|
|
252
252
|
|
|
@@ -109,7 +109,7 @@ function main() {
|
|
|
109
109
|
console.log('\nNext step — create or update the GitHub Release:\n');
|
|
110
110
|
console.log(` gh release create ${releaseTag} dist/web-bundles/*.zip \\`);
|
|
111
111
|
console.log(` --title "${releaseTag}" \\`);
|
|
112
|
-
console.log(` --notes "
|
|
112
|
+
console.log(` --notes "Wizz web bundles for Gemini Gems and ChatGPT Custom GPTs. See https://bmadcode.com/web-bundles/"\n`);
|
|
113
113
|
console.log('Or, to refresh an existing release:\n');
|
|
114
114
|
console.log(` gh release upload ${releaseTag} dist/web-bundles/*.zip --clobber\n`);
|
|
115
115
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
2
|
+
* WIZZ Workflow Markdown Formatter
|
|
3
3
|
*
|
|
4
4
|
* Formats mixed markdown + XML workflow instruction files with:
|
|
5
5
|
* - 2-space XML indentation
|
|
@@ -195,7 +195,7 @@ function main() {
|
|
|
195
195
|
|
|
196
196
|
if (args.length === 0 || args.includes('--help') || args.includes('-h')) {
|
|
197
197
|
console.log(`
|
|
198
|
-
|
|
198
|
+
WIZZ Workflow Markdown Formatter
|
|
199
199
|
|
|
200
200
|
Usage:
|
|
201
201
|
node format-workflow-md.js <file-pattern> [options]
|
|
@@ -14,22 +14,22 @@ module.exports = {
|
|
|
14
14
|
options: [],
|
|
15
15
|
action: async (options) => {
|
|
16
16
|
try {
|
|
17
|
-
// Find the
|
|
17
|
+
// Find the wizz directory
|
|
18
18
|
const projectDir = process.cwd();
|
|
19
|
-
const {
|
|
19
|
+
const { wizzDir } = await installer.findWizzDir(projectDir);
|
|
20
20
|
|
|
21
|
-
// Check if
|
|
21
|
+
// Check if wizz directory exists
|
|
22
22
|
const fs = require('../fs-native');
|
|
23
|
-
if (!(await fs.pathExists(
|
|
23
|
+
if (!(await fs.pathExists(wizzDir))) {
|
|
24
24
|
await prompts.log.warn('No Wizz installation found in the current directory.');
|
|
25
|
-
await prompts.log.message(`Expected location: ${
|
|
25
|
+
await prompts.log.message(`Expected location: ${wizzDir}`);
|
|
26
26
|
await prompts.log.message('Run "wizz install" to set up a new installation.');
|
|
27
27
|
process.exit(0);
|
|
28
28
|
return;
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
// Read manifest
|
|
32
|
-
const manifestData = await manifest._readRaw(
|
|
32
|
+
const manifestData = await manifest._readRaw(wizzDir);
|
|
33
33
|
|
|
34
34
|
if (!manifestData) {
|
|
35
35
|
await prompts.log.warn('No Wizz installation manifest found.');
|
|
@@ -43,20 +43,20 @@ module.exports = {
|
|
|
43
43
|
const modules = manifestData.modules || [];
|
|
44
44
|
|
|
45
45
|
// Check for available updates (only for external modules)
|
|
46
|
-
const availableUpdates = await manifest.checkForUpdates(
|
|
46
|
+
const availableUpdates = await manifest.checkForUpdates(wizzDir);
|
|
47
47
|
|
|
48
48
|
// Display status
|
|
49
49
|
await ui.displayStatus({
|
|
50
50
|
installation,
|
|
51
51
|
modules,
|
|
52
52
|
availableUpdates,
|
|
53
|
-
|
|
53
|
+
wizzDir,
|
|
54
54
|
});
|
|
55
55
|
|
|
56
56
|
process.exit(0);
|
|
57
57
|
} catch (error) {
|
|
58
58
|
await prompts.log.error(`Status check failed: ${error.message}`);
|
|
59
|
-
if (process.env.
|
|
59
|
+
if (process.env.WIZZ_DEBUG) {
|
|
60
60
|
await prompts.log.message(error.stack);
|
|
61
61
|
}
|
|
62
62
|
process.exit(1);
|
|
@@ -54,9 +54,9 @@ module.exports = {
|
|
|
54
54
|
process.exit(1);
|
|
55
55
|
}
|
|
56
56
|
|
|
57
|
-
const {
|
|
57
|
+
const { wizzDir } = await installer.findWizzDir(projectDir);
|
|
58
58
|
|
|
59
|
-
if (!(await fs.pathExists(
|
|
59
|
+
if (!(await fs.pathExists(wizzDir))) {
|
|
60
60
|
await prompts.log.warn('No Wizz installation found.');
|
|
61
61
|
process.exit(0);
|
|
62
62
|
}
|
|
@@ -82,7 +82,7 @@ module.exports = {
|
|
|
82
82
|
options: [
|
|
83
83
|
{
|
|
84
84
|
value: 'modules',
|
|
85
|
-
label: `Wizz Modules & data (${installer.
|
|
85
|
+
label: `Wizz Modules & data (${installer.wizzFolderName}/)`,
|
|
86
86
|
hint: 'Core installation, agents, workflows, config',
|
|
87
87
|
},
|
|
88
88
|
{ value: 'ide', label: 'IDE integrations', hint: ides || 'No IDEs configured' },
|
|
@@ -133,10 +133,10 @@ module.exports = {
|
|
|
133
133
|
s.stop('User artifacts removed');
|
|
134
134
|
}
|
|
135
135
|
|
|
136
|
-
// Phase 3:
|
|
136
|
+
// Phase 3: WIZZ modules & data (last — other phases may need _wizz/)
|
|
137
137
|
if (removeModules) {
|
|
138
138
|
const s = await prompts.spinner();
|
|
139
|
-
s.start(`Removing Wizz modules & data (${installer.
|
|
139
|
+
s.start(`Removing Wizz modules & data (${installer.wizzFolderName}/)...`);
|
|
140
140
|
await installer.uninstallModules(projectDir);
|
|
141
141
|
s.stop('Modules & data removed');
|
|
142
142
|
}
|
|
@@ -4,7 +4,7 @@ const yaml = require('yaml');
|
|
|
4
4
|
const { Manifest } = require('./manifest');
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
|
-
* Immutable snapshot of an existing
|
|
7
|
+
* Immutable snapshot of an existing WIZZ installation.
|
|
8
8
|
* Pure query object — no filesystem operations after construction.
|
|
9
9
|
*/
|
|
10
10
|
class ExistingInstall {
|
|
@@ -38,12 +38,12 @@ class ExistingInstall {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
/**
|
|
41
|
-
* Scan a
|
|
42
|
-
* @param {string}
|
|
41
|
+
* Scan a wizz directory and return an immutable snapshot of what's installed.
|
|
42
|
+
* @param {string} wizzDir - Path to wizz directory
|
|
43
43
|
* @returns {Promise<ExistingInstall>}
|
|
44
44
|
*/
|
|
45
|
-
static async detect(
|
|
46
|
-
if (!(await fs.pathExists(
|
|
45
|
+
static async detect(wizzDir) {
|
|
46
|
+
if (!(await fs.pathExists(wizzDir))) {
|
|
47
47
|
return ExistingInstall.empty();
|
|
48
48
|
}
|
|
49
49
|
|
|
@@ -53,7 +53,7 @@ class ExistingInstall {
|
|
|
53
53
|
let ides = [];
|
|
54
54
|
|
|
55
55
|
const manifest = new Manifest();
|
|
56
|
-
const manifestData = await manifest.read(
|
|
56
|
+
const manifestData = await manifest.read(wizzDir);
|
|
57
57
|
if (manifestData) {
|
|
58
58
|
version = manifestData.version;
|
|
59
59
|
if (manifestData.ides) {
|
|
@@ -61,7 +61,7 @@ class ExistingInstall {
|
|
|
61
61
|
}
|
|
62
62
|
}
|
|
63
63
|
|
|
64
|
-
const corePath = path.join(
|
|
64
|
+
const corePath = path.join(wizzDir, 'core');
|
|
65
65
|
if (await fs.pathExists(corePath)) {
|
|
66
66
|
hasCore = true;
|
|
67
67
|
|
|
@@ -83,7 +83,7 @@ class ExistingInstall {
|
|
|
83
83
|
|
|
84
84
|
if (manifestData && manifestData.modules && manifestData.modules.length > 0) {
|
|
85
85
|
for (const moduleId of manifestData.modules) {
|
|
86
|
-
const modulePath = path.join(
|
|
86
|
+
const modulePath = path.join(wizzDir, moduleId);
|
|
87
87
|
const moduleConfigPath = path.join(modulePath, 'config.yaml');
|
|
88
88
|
|
|
89
89
|
const moduleInfo = {
|