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
|
@@ -3,13 +3,13 @@ const path = require('node:path');
|
|
|
3
3
|
const semver = require('semver');
|
|
4
4
|
const fs = require('../fs-native');
|
|
5
5
|
const prompts = require('../prompts');
|
|
6
|
-
const {
|
|
7
|
-
const { getInstalledCanonicalIds,
|
|
6
|
+
const { WIZZ_FOLDER_NAME } = require('../ide/shared/path-utils');
|
|
7
|
+
const { getInstalledCanonicalIds, isWizzOwnedEntry } = require('../ide/shared/installed-skills');
|
|
8
8
|
|
|
9
9
|
const MIN_NATIVE_SKILLS_VERSION = '6.1.0';
|
|
10
10
|
|
|
11
|
-
// Pre-v6.1.0 paths:
|
|
12
|
-
// In v6.1.0
|
|
11
|
+
// Pre-v6.1.0 paths: WIZZ used to install commands/workflows/etc in tool-specific dirs.
|
|
12
|
+
// In v6.1.0 WIZZ switched to native SKILL.md format.
|
|
13
13
|
const LEGACY_COMMAND_PATHS = [
|
|
14
14
|
'.agent/workflows',
|
|
15
15
|
'.augment/commands',
|
|
@@ -38,7 +38,7 @@ const LEGACY_COMMAND_PATHS = [
|
|
|
38
38
|
];
|
|
39
39
|
|
|
40
40
|
// Skill paths that moved to the cross-tool .agents/skills/ standard.
|
|
41
|
-
// Users upgrading from a prior install may have stale
|
|
41
|
+
// Users upgrading from a prior install may have stale WIZZ skills here that
|
|
42
42
|
// the AI tool will load alongside the new ones, causing duplicates.
|
|
43
43
|
const LEGACY_SKILL_PATHS = [
|
|
44
44
|
'.augment/skills',
|
|
@@ -81,8 +81,8 @@ function resolveLegacyPath(projectRoot, p) {
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
async function findStaleLegacyDirs(projectRoot) {
|
|
84
|
-
const
|
|
85
|
-
const canonicalIds = await getInstalledCanonicalIds(
|
|
84
|
+
const wizzDir = path.join(projectRoot, WIZZ_FOLDER_NAME);
|
|
85
|
+
const canonicalIds = await getInstalledCanonicalIds(wizzDir);
|
|
86
86
|
|
|
87
87
|
const findings = [];
|
|
88
88
|
for (const legacyPath of LEGACY_PATHS) {
|
|
@@ -90,9 +90,9 @@ async function findStaleLegacyDirs(projectRoot) {
|
|
|
90
90
|
if (!(await fs.pathExists(resolved))) continue;
|
|
91
91
|
try {
|
|
92
92
|
const entries = await fs.readdir(resolved);
|
|
93
|
-
const
|
|
94
|
-
if (
|
|
95
|
-
findings.push({ path: resolved, displayPath: legacyPath, count:
|
|
93
|
+
const wizzEntries = entries.filter((e) => isWizzOwnedEntry(e, canonicalIds));
|
|
94
|
+
if (wizzEntries.length > 0) {
|
|
95
|
+
findings.push({ path: resolved, displayPath: legacyPath, count: wizzEntries.length, entries: wizzEntries });
|
|
96
96
|
}
|
|
97
97
|
} catch {
|
|
98
98
|
// Unreadable dir — skip
|
|
@@ -116,20 +116,20 @@ async function warnPreNativeSkillsLegacy({ projectRoot, existingVersion } = {})
|
|
|
116
116
|
|
|
117
117
|
if (versionTriggered) {
|
|
118
118
|
await prompts.log.warn(
|
|
119
|
-
`Detected previous
|
|
120
|
-
`
|
|
119
|
+
`Detected previous WIZZ install v${existingVersion} (pre-${MIN_NATIVE_SKILLS_VERSION}). ` +
|
|
120
|
+
`WIZZ switched to native skills format in v${MIN_NATIVE_SKILLS_VERSION}; old command/workflow directories from your prior install may still be present.`,
|
|
121
121
|
);
|
|
122
122
|
}
|
|
123
123
|
|
|
124
124
|
if (staleDirs.length > 0) {
|
|
125
125
|
await prompts.log.warn(
|
|
126
|
-
`Found stale
|
|
126
|
+
`Found stale WIZZ entries in ${staleDirs.length} legacy location(s) that the new installer no longer manages. ` +
|
|
127
127
|
`Your AI tool may load these alongside the new skills, causing duplicates. Remove them manually:`,
|
|
128
128
|
);
|
|
129
129
|
for (const finding of staleDirs) {
|
|
130
|
-
// Print each entry by exact name. A `
|
|
130
|
+
// Print each entry by exact name. A `wizz*` glob would (a) miss
|
|
131
131
|
// custom-module skills the canonicalId scan now picks up, and
|
|
132
|
-
// (b) match
|
|
132
|
+
// (b) match wizz-os-* utility skills the user should keep.
|
|
133
133
|
const entries = finding.entries || [];
|
|
134
134
|
for (const entry of entries) {
|
|
135
135
|
await prompts.log.message(` rm -rf "${path.join(finding.path, entry)}"`);
|
|
@@ -137,7 +137,7 @@ async function warnPreNativeSkillsLegacy({ projectRoot, existingVersion } = {})
|
|
|
137
137
|
}
|
|
138
138
|
} else if (versionTriggered) {
|
|
139
139
|
await prompts.log.message(
|
|
140
|
-
' No stale legacy directories detected, but if your AI tool shows duplicate
|
|
140
|
+
' No stale legacy directories detected, but if your AI tool shows duplicate WIZZ commands after install, check for old `wizz-*` entries in tool-specific dirs (e.g. .claude/commands, .cursor/commands).',
|
|
141
141
|
);
|
|
142
142
|
}
|
|
143
143
|
}
|
|
@@ -33,20 +33,20 @@ class ManifestGenerator {
|
|
|
33
33
|
|
|
34
34
|
/**
|
|
35
35
|
* Generate all manifests for the installation
|
|
36
|
-
* @param {string}
|
|
36
|
+
* @param {string} wizzDir - _wizz
|
|
37
37
|
* @param {Array} selectedModules - Selected modules for installation
|
|
38
38
|
* @param {Array} installedFiles - All installed files (optional, for hash tracking)
|
|
39
39
|
*/
|
|
40
|
-
async generateManifests(
|
|
40
|
+
async generateManifests(wizzDir, selectedModules, installedFiles = [], options = {}) {
|
|
41
41
|
// Create _config directory if it doesn't exist
|
|
42
|
-
const cfgDir = path.join(
|
|
42
|
+
const cfgDir = path.join(wizzDir, '_config');
|
|
43
43
|
await fs.ensureDir(cfgDir);
|
|
44
44
|
|
|
45
45
|
// Store modules list (all modules including preserved ones)
|
|
46
46
|
const preservedModules = options.preservedModules || [];
|
|
47
47
|
|
|
48
|
-
// Scan the
|
|
49
|
-
const installedModules = await this.scanInstalledModules(
|
|
48
|
+
// Scan the wizz directory to find all actually installed modules
|
|
49
|
+
const installedModules = await this.scanInstalledModules(wizzDir);
|
|
50
50
|
|
|
51
51
|
// Since custom modules are now installed the same way as regular modules,
|
|
52
52
|
// we don't need to exclude them from manifest generation
|
|
@@ -55,8 +55,8 @@ class ManifestGenerator {
|
|
|
55
55
|
this.modules = allModules;
|
|
56
56
|
this.updatedModules = allModules; // Include ALL modules (including custom) for scanning
|
|
57
57
|
|
|
58
|
-
this.
|
|
59
|
-
this.
|
|
58
|
+
this.wizzDir = wizzDir;
|
|
59
|
+
this.wizzFolderName = path.basename(wizzDir); // Get the actual folder name (e.g., '_wizz' or 'wizz')
|
|
60
60
|
this.allInstalledFiles = installedFiles;
|
|
61
61
|
|
|
62
62
|
if (!Object.prototype.hasOwnProperty.call(options, 'ides')) {
|
|
@@ -81,7 +81,7 @@ class ManifestGenerator {
|
|
|
81
81
|
await this.collectAgentsFromModuleYaml();
|
|
82
82
|
|
|
83
83
|
// Write manifest files and collect their paths
|
|
84
|
-
const [teamConfigPath, userConfigPath] = await this.writeCentralConfig(
|
|
84
|
+
const [teamConfigPath, userConfigPath] = await this.writeCentralConfig(wizzDir, options.moduleConfigs || {});
|
|
85
85
|
const manifestFiles = [
|
|
86
86
|
await this.writeMainManifest(cfgDir),
|
|
87
87
|
await this.writeSkillManifest(cfgDir),
|
|
@@ -90,7 +90,7 @@ class ManifestGenerator {
|
|
|
90
90
|
await this.writeFilesManifest(cfgDir),
|
|
91
91
|
];
|
|
92
92
|
|
|
93
|
-
await this.ensureCustomConfigStubs(
|
|
93
|
+
await this.ensureCustomConfigStubs(wizzDir);
|
|
94
94
|
|
|
95
95
|
return {
|
|
96
96
|
skills: this.skills.length,
|
|
@@ -110,10 +110,10 @@ class ManifestGenerator {
|
|
|
110
110
|
async collectSkills() {
|
|
111
111
|
this.skills = [];
|
|
112
112
|
this.skillClaimedDirs = new Set();
|
|
113
|
-
const debug = process.env.
|
|
113
|
+
const debug = process.env.WIZZ_DEBUG_MANIFEST === 'true';
|
|
114
114
|
|
|
115
115
|
for (const moduleName of this.updatedModules) {
|
|
116
|
-
const modulePath = path.join(this.
|
|
116
|
+
const modulePath = path.join(this.wizzDir, moduleName);
|
|
117
117
|
if (!(await fs.pathExists(modulePath))) continue;
|
|
118
118
|
|
|
119
119
|
// Recursive walk skipping . and _ prefixed dirs
|
|
@@ -136,8 +136,8 @@ class ManifestGenerator {
|
|
|
136
136
|
// Build path relative from module root (points to SKILL.md — the permanent entrypoint)
|
|
137
137
|
const relativePath = path.relative(modulePath, dir).split(path.sep).join('/');
|
|
138
138
|
const installPath = relativePath
|
|
139
|
-
? `${this.
|
|
140
|
-
: `${this.
|
|
139
|
+
? `${this.wizzFolderName}/${moduleName}/${relativePath}/${skillFile}`
|
|
140
|
+
: `${this.wizzFolderName}/${moduleName}/${skillFile}`;
|
|
141
141
|
|
|
142
142
|
// Native SKILL.md entrypoints always derive canonicalId from directory name.
|
|
143
143
|
const canonicalId = dirName;
|
|
@@ -241,12 +241,12 @@ class ManifestGenerator {
|
|
|
241
241
|
*/
|
|
242
242
|
async collectAgentsFromModuleYaml() {
|
|
243
243
|
this.agents = [];
|
|
244
|
-
const debug = process.env.
|
|
244
|
+
const debug = process.env.WIZZ_DEBUG_MANIFEST === 'true';
|
|
245
245
|
|
|
246
246
|
for (const moduleName of this.updatedModules) {
|
|
247
247
|
const moduleYamlPath = await resolveInstalledModuleYaml(moduleName);
|
|
248
248
|
if (!moduleYamlPath) {
|
|
249
|
-
// External modules live in ~/.
|
|
249
|
+
// External modules live in ~/.wizz/cache/external-modules, not src/modules.
|
|
250
250
|
// Warn rather than silently skip so missing agent rosters don't vanish
|
|
251
251
|
// from config.toml without notice.
|
|
252
252
|
console.warn(
|
|
@@ -335,7 +335,7 @@ class ManifestGenerator {
|
|
|
335
335
|
|
|
336
336
|
for (const moduleName of this.modules) {
|
|
337
337
|
// Get fresh version info from source
|
|
338
|
-
const versionInfo = await manifestObj.getModuleVersionInfo(moduleName, this.
|
|
338
|
+
const versionInfo = await manifestObj.getModuleVersionInfo(moduleName, this.wizzDir);
|
|
339
339
|
|
|
340
340
|
// Get existing install date if available
|
|
341
341
|
const existing = existingModulesMap.get(moduleName);
|
|
@@ -425,9 +425,9 @@ class ManifestGenerator {
|
|
|
425
425
|
* _wizz/custom/config.toml and _wizz/custom/config.user.toml (never touched by installer).
|
|
426
426
|
* @returns {string[]} Paths to the written config files
|
|
427
427
|
*/
|
|
428
|
-
async writeCentralConfig(
|
|
429
|
-
const teamPath = path.join(
|
|
430
|
-
const userPath = path.join(
|
|
428
|
+
async writeCentralConfig(wizzDir, moduleConfigs) {
|
|
429
|
+
const teamPath = path.join(wizzDir, 'config.toml');
|
|
430
|
+
const userPath = path.join(wizzDir, 'config.user.toml');
|
|
431
431
|
|
|
432
432
|
// Load each module's source module.yaml to determine scope per prompt key.
|
|
433
433
|
// Default scope is 'team' when the prompt doesn't declare one.
|
|
@@ -623,8 +623,8 @@ class ManifestGenerator {
|
|
|
623
623
|
* Create empty _wizz/custom/config.toml and _wizz/custom/config.user.toml stubs
|
|
624
624
|
* on first install only. Installer never touches these files again after creation.
|
|
625
625
|
*/
|
|
626
|
-
async ensureCustomConfigStubs(
|
|
627
|
-
const customDir = path.join(
|
|
626
|
+
async ensureCustomConfigStubs(wizzDir) {
|
|
627
|
+
const customDir = path.join(wizzDir, 'custom');
|
|
628
628
|
await fs.ensureDir(customDir);
|
|
629
629
|
|
|
630
630
|
const stubs = [
|
|
@@ -689,8 +689,8 @@ class ManifestGenerator {
|
|
|
689
689
|
if (this.allInstalledFiles && this.allInstalledFiles.length > 0) {
|
|
690
690
|
// Process all installed files
|
|
691
691
|
for (const filePath of this.allInstalledFiles) {
|
|
692
|
-
// Store paths relative to
|
|
693
|
-
const relativePath = filePath.replace(this.
|
|
692
|
+
// Store paths relative to wizzDir (no folder prefix)
|
|
693
|
+
const relativePath = filePath.replace(this.wizzDir, '').replaceAll('\\', '/').replace(/^\//, '');
|
|
694
694
|
const ext = path.extname(filePath).toLowerCase();
|
|
695
695
|
const fileName = path.basename(filePath, ext);
|
|
696
696
|
|
|
@@ -713,8 +713,8 @@ class ManifestGenerator {
|
|
|
713
713
|
// Fallback: use the collected workflows/agents/tasks
|
|
714
714
|
for (const file of this.files) {
|
|
715
715
|
// Strip the folder prefix if present (for consistency)
|
|
716
|
-
const relPath = file.path.replace(this.
|
|
717
|
-
const filePath = path.join(this.
|
|
716
|
+
const relPath = file.path.replace(this.wizzFolderName + '/', '');
|
|
717
|
+
const filePath = path.join(this.wizzDir, relPath);
|
|
718
718
|
const hash = await this.calculateFileHash(filePath);
|
|
719
719
|
allFiles.push({
|
|
720
720
|
...file,
|
|
@@ -741,15 +741,15 @@ class ManifestGenerator {
|
|
|
741
741
|
}
|
|
742
742
|
|
|
743
743
|
/**
|
|
744
|
-
* Scan the
|
|
745
|
-
* @param {string}
|
|
744
|
+
* Scan the wizz directory to find all installed modules
|
|
745
|
+
* @param {string} wizzDir - Path to wizz directory
|
|
746
746
|
* @returns {Array} List of module names
|
|
747
747
|
*/
|
|
748
|
-
async scanInstalledModules(
|
|
748
|
+
async scanInstalledModules(wizzDir) {
|
|
749
749
|
const modules = [];
|
|
750
750
|
|
|
751
751
|
try {
|
|
752
|
-
const entries = await fs.readdir(
|
|
752
|
+
const entries = await fs.readdir(wizzDir, { withFileTypes: true });
|
|
753
753
|
|
|
754
754
|
for (const entry of entries) {
|
|
755
755
|
// Skip if not a directory or is a special directory
|
|
@@ -758,7 +758,7 @@ class ManifestGenerator {
|
|
|
758
758
|
}
|
|
759
759
|
|
|
760
760
|
// Check if this looks like a module (has agents directory or skill manifests)
|
|
761
|
-
const modulePath = path.join(
|
|
761
|
+
const modulePath = path.join(wizzDir, entry.name);
|
|
762
762
|
const hasAgents = await fs.pathExists(path.join(modulePath, 'agents'));
|
|
763
763
|
const hasSkills = await this._hasSkillMdRecursive(modulePath);
|
|
764
764
|
|
|
@@ -18,26 +18,26 @@ function isValidNpmPackageName(packageName) {
|
|
|
18
18
|
class Manifest {
|
|
19
19
|
/**
|
|
20
20
|
* Create a new manifest
|
|
21
|
-
* @param {string}
|
|
21
|
+
* @param {string} wizzDir - Path to wizz directory
|
|
22
22
|
* @param {Object} data - Manifest data
|
|
23
23
|
* @param {Array} installedFiles - List of installed files (no longer used, files tracked in files-manifest.csv)
|
|
24
24
|
*/
|
|
25
|
-
async create(
|
|
26
|
-
const manifestPath = path.join(
|
|
25
|
+
async create(wizzDir, data, installedFiles = []) {
|
|
26
|
+
const manifestPath = path.join(wizzDir, '_config', 'manifest.yaml');
|
|
27
27
|
const yaml = require('yaml');
|
|
28
28
|
|
|
29
29
|
// Ensure _config directory exists
|
|
30
30
|
await fs.ensureDir(path.dirname(manifestPath));
|
|
31
31
|
|
|
32
|
-
// Get the
|
|
33
|
-
const
|
|
32
|
+
// Get the Wizz version from package.json
|
|
33
|
+
const wizzVersion = data.version || require(path.join(process.cwd(), 'package.json')).version;
|
|
34
34
|
|
|
35
35
|
// Convert module list to new detailed format
|
|
36
36
|
const moduleDetails = [];
|
|
37
37
|
if (data.modules && Array.isArray(data.modules)) {
|
|
38
38
|
for (const moduleName of data.modules) {
|
|
39
|
-
// Core and BMM modules use the
|
|
40
|
-
const moduleVersion = moduleName === 'core' || moduleName === 'bmm' ?
|
|
39
|
+
// Core and BMM modules use the Wizz version
|
|
40
|
+
const moduleVersion = moduleName === 'core' || moduleName === 'bmm' ? wizzVersion : null;
|
|
41
41
|
const now = data.installDate || new Date().toISOString();
|
|
42
42
|
|
|
43
43
|
moduleDetails.push({
|
|
@@ -53,7 +53,7 @@ class Manifest {
|
|
|
53
53
|
// Structure the manifest data
|
|
54
54
|
const manifestData = {
|
|
55
55
|
installation: {
|
|
56
|
-
version:
|
|
56
|
+
version: wizzVersion,
|
|
57
57
|
installDate: data.installDate || new Date().toISOString(),
|
|
58
58
|
lastUpdated: data.lastUpdated || new Date().toISOString(),
|
|
59
59
|
},
|
|
@@ -79,11 +79,11 @@ class Manifest {
|
|
|
79
79
|
|
|
80
80
|
/**
|
|
81
81
|
* Read existing manifest
|
|
82
|
-
* @param {string}
|
|
82
|
+
* @param {string} wizzDir - Path to wizz directory
|
|
83
83
|
* @returns {Object|null} Manifest data or null if not found
|
|
84
84
|
*/
|
|
85
|
-
async read(
|
|
86
|
-
const yamlPath = path.join(
|
|
85
|
+
async read(wizzDir) {
|
|
86
|
+
const yamlPath = path.join(wizzDir, '_config', 'manifest.yaml');
|
|
87
87
|
const yaml = require('yaml');
|
|
88
88
|
|
|
89
89
|
if (await fs.pathExists(yamlPath)) {
|
|
@@ -120,11 +120,11 @@ class Manifest {
|
|
|
120
120
|
|
|
121
121
|
/**
|
|
122
122
|
* Read raw manifest data without flattening
|
|
123
|
-
* @param {string}
|
|
123
|
+
* @param {string} wizzDir - Path to wizz directory
|
|
124
124
|
* @returns {Object|null} Raw manifest data or null if not found
|
|
125
125
|
*/
|
|
126
|
-
async _readRaw(
|
|
127
|
-
const yamlPath = path.join(
|
|
126
|
+
async _readRaw(wizzDir) {
|
|
127
|
+
const yamlPath = path.join(wizzDir, '_config', 'manifest.yaml');
|
|
128
128
|
const yaml = require('yaml');
|
|
129
129
|
|
|
130
130
|
if (await fs.pathExists(yamlPath)) {
|
|
@@ -162,12 +162,12 @@ class Manifest {
|
|
|
162
162
|
/**
|
|
163
163
|
* Add a module to the manifest with optional version info
|
|
164
164
|
* If module already exists, update its version info
|
|
165
|
-
* @param {string}
|
|
165
|
+
* @param {string} wizzDir - Path to wizz directory
|
|
166
166
|
* @param {string} moduleName - Module name to add
|
|
167
167
|
* @param {Object} options - Optional version info
|
|
168
168
|
*/
|
|
169
|
-
async addModule(
|
|
170
|
-
let manifest = await this._readRaw(
|
|
169
|
+
async addModule(wizzDir, moduleName, options = {}) {
|
|
170
|
+
let manifest = await this._readRaw(wizzDir);
|
|
171
171
|
if (!manifest) {
|
|
172
172
|
// Bootstrap a minimal manifest if it doesn't exist yet
|
|
173
173
|
// (e.g., skill-only modules with no agents to compile)
|
|
@@ -217,16 +217,16 @@ class Manifest {
|
|
|
217
217
|
};
|
|
218
218
|
}
|
|
219
219
|
|
|
220
|
-
await this._writeRaw(
|
|
220
|
+
await this._writeRaw(wizzDir, manifest);
|
|
221
221
|
}
|
|
222
222
|
|
|
223
223
|
/**
|
|
224
224
|
* Get all modules with their version info
|
|
225
|
-
* @param {string}
|
|
225
|
+
* @param {string} wizzDir - Path to wizz directory
|
|
226
226
|
* @returns {Array} Array of module info objects
|
|
227
227
|
*/
|
|
228
|
-
async getAllModuleVersions(
|
|
229
|
-
const manifest = await this._readRaw(
|
|
228
|
+
async getAllModuleVersions(wizzDir) {
|
|
229
|
+
const manifest = await this._readRaw(wizzDir);
|
|
230
230
|
if (!manifest || !manifest.modules) {
|
|
231
231
|
return [];
|
|
232
232
|
}
|
|
@@ -236,12 +236,12 @@ class Manifest {
|
|
|
236
236
|
|
|
237
237
|
/**
|
|
238
238
|
* Write raw manifest data to file
|
|
239
|
-
* @param {string}
|
|
239
|
+
* @param {string} wizzDir - Path to wizz directory
|
|
240
240
|
* @param {Object} manifestData - Raw manifest data to write
|
|
241
241
|
*/
|
|
242
|
-
async _writeRaw(
|
|
242
|
+
async _writeRaw(wizzDir, manifestData) {
|
|
243
243
|
const yaml = require('yaml');
|
|
244
|
-
const manifestPath = path.join(
|
|
244
|
+
const manifestPath = path.join(wizzDir, '_config', 'manifest.yaml');
|
|
245
245
|
|
|
246
246
|
await fs.ensureDir(path.dirname(manifestPath));
|
|
247
247
|
|
|
@@ -274,11 +274,11 @@ class Manifest {
|
|
|
274
274
|
/**
|
|
275
275
|
* Get module version info from source
|
|
276
276
|
* @param {string} moduleName - Module name/code
|
|
277
|
-
* @param {string}
|
|
277
|
+
* @param {string} wizzDir - Path to wizz directory
|
|
278
278
|
* @param {string} moduleSourcePath - Optional source path for custom modules
|
|
279
279
|
* @returns {Object} Version info object with version, source, npmPackage, repoUrl
|
|
280
280
|
*/
|
|
281
|
-
async getModuleVersionInfo(moduleName,
|
|
281
|
+
async getModuleVersionInfo(moduleName, wizzDir, moduleSourcePath = null) {
|
|
282
282
|
// Resolve source type first, then read version with the correct path context
|
|
283
283
|
if (['core', 'bmm'].includes(moduleName)) {
|
|
284
284
|
const versionInfo = await resolveModuleVersion(moduleName, { moduleSourcePath });
|
|
@@ -314,7 +314,7 @@ class Manifest {
|
|
|
314
314
|
const { CustomModuleManager } = require('../modules/custom-module-manager');
|
|
315
315
|
const customMgr = new CustomModuleManager();
|
|
316
316
|
const resolved = customMgr.getResolution(moduleName);
|
|
317
|
-
const customSource = await customMgr.findModuleSourceByCode(moduleName, {
|
|
317
|
+
const customSource = await customMgr.findModuleSourceByCode(moduleName, { wizzDir });
|
|
318
318
|
if (customSource || resolved) {
|
|
319
319
|
const versionInfo = await resolveModuleVersion(moduleName, {
|
|
320
320
|
moduleSourcePath: moduleSourcePath || customSource,
|
|
@@ -394,12 +394,12 @@ class Manifest {
|
|
|
394
394
|
|
|
395
395
|
/**
|
|
396
396
|
* Check for available updates for installed modules
|
|
397
|
-
* @param {string}
|
|
397
|
+
* @param {string} wizzDir - Path to wizz directory
|
|
398
398
|
* @returns {Array} Array of update info objects
|
|
399
399
|
*/
|
|
400
|
-
async checkForUpdates(
|
|
400
|
+
async checkForUpdates(wizzDir) {
|
|
401
401
|
const semver = require('semver');
|
|
402
|
-
const modules = await this.getAllModuleVersions(
|
|
402
|
+
const modules = await this.getAllModuleVersions(wizzDir);
|
|
403
403
|
const updates = [];
|
|
404
404
|
|
|
405
405
|
for (const module of modules) {
|
|
@@ -3,14 +3,14 @@ const prompts = require('../prompts');
|
|
|
3
3
|
|
|
4
4
|
// Python 3.11 added stdlib `tomllib` (PEP 680), which the shared scripts in
|
|
5
5
|
// src/scripts/ (resolve_config.py, resolve_customization.py) require to read
|
|
6
|
-
//
|
|
6
|
+
// WIZZ's TOML config files. memlog.py is more lenient and runs on 3.8+.
|
|
7
7
|
const PYTHON_FULL_SUPPORT = { major: 3, minor: 11 };
|
|
8
8
|
const PYTHON_PARTIAL_SUPPORT = { major: 3, minor: 8 };
|
|
9
9
|
|
|
10
10
|
// Every runtime call site (skill steps, on_complete hooks) invokes a literal
|
|
11
|
-
// `python3`, so only that command's version vouches for
|
|
11
|
+
// `python3`, so only that command's version vouches for WIZZ features. The
|
|
12
12
|
// fallback probes exist to tell the user "Python is installed, but not under
|
|
13
|
-
// the name
|
|
13
|
+
// the name WIZZ uses" instead of a misleading "No Python found".
|
|
14
14
|
const RUNTIME_COMMAND = 'python3';
|
|
15
15
|
const PROBE_CANDIDATES =
|
|
16
16
|
process.platform === 'win32'
|
|
@@ -43,7 +43,7 @@ function parsePythonVersion(output) {
|
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
/**
|
|
46
|
-
* Classify a detected Python version against
|
|
46
|
+
* Classify a detected Python version against WIZZ's feature requirements.
|
|
47
47
|
* @param {{major: number, minor: number}|null} version
|
|
48
48
|
* @returns {'full'|'partial'|'unsupported'|'none'}
|
|
49
49
|
*/
|
|
@@ -88,7 +88,7 @@ function probeVersion(candidate) {
|
|
|
88
88
|
* Probe the local environment for a Python interpreter.
|
|
89
89
|
* Tries each candidate command and returns the first that reports a version.
|
|
90
90
|
* `isRuntimeCommand` is true only when the match is `python3` — the command
|
|
91
|
-
*
|
|
91
|
+
* WIZZ scripts actually invoke.
|
|
92
92
|
* @returns {{command: string, version: {major: number, minor: number, patch: number, raw: string}, isRuntimeCommand: boolean}|null}
|
|
93
93
|
*/
|
|
94
94
|
function detectPython() {
|
|
@@ -117,9 +117,9 @@ function upgradeHints() {
|
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
/**
|
|
120
|
-
* Check the local Python environment and warn about degraded
|
|
120
|
+
* Check the local Python environment and warn about degraded WIZZ features.
|
|
121
121
|
*
|
|
122
|
-
* Warn-don't-block: most of
|
|
122
|
+
* Warn-don't-block: most of WIZZ works without Python, so the install always
|
|
123
123
|
* may proceed — but the user must explicitly acknowledge the warning so it
|
|
124
124
|
* can't scroll past unseen. In non-interactive runs (--yes, or stdin is not
|
|
125
125
|
* a TTY) the warning is logged and the install continues without a prompt.
|