wizz-method 1.0.1 → 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/settings.local.json +2 -1
- 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 +58 -46
- 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
|
@@ -8,7 +8,7 @@ const { Config } = require('./config');
|
|
|
8
8
|
const { getProjectRoot, getSourcePath } = require('../project-root');
|
|
9
9
|
const { ManifestGenerator } = require('./manifest-generator');
|
|
10
10
|
const prompts = require('../prompts');
|
|
11
|
-
const {
|
|
11
|
+
const { WIZZ_FOLDER_NAME } = require('../ide/shared/path-utils');
|
|
12
12
|
const { InstallPaths } = require('./install-paths');
|
|
13
13
|
const { ExternalModuleManager } = require('../modules/external-manager');
|
|
14
14
|
const { resolveModuleVersion } = require('../modules/version-resolver');
|
|
@@ -24,7 +24,7 @@ class Installer {
|
|
|
24
24
|
this.ideManager = new IdeManager();
|
|
25
25
|
this.fileOps = new FileOps();
|
|
26
26
|
this.installedFiles = new Set(); // Track all installed files
|
|
27
|
-
this.
|
|
27
|
+
this.wizzFolderName = WIZZ_FOLDER_NAME;
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
/**
|
|
@@ -41,7 +41,7 @@ class Installer {
|
|
|
41
41
|
const config = Config.build(originalConfig);
|
|
42
42
|
const paths = await InstallPaths.create(config);
|
|
43
43
|
const officialModules = await OfficialModules.build(config, paths);
|
|
44
|
-
const existingInstall = await ExistingInstall.detect(paths.
|
|
44
|
+
const existingInstall = await ExistingInstall.detect(paths.wizzDir);
|
|
45
45
|
|
|
46
46
|
try {
|
|
47
47
|
await warnPreNativeSkillsLegacy({
|
|
@@ -50,7 +50,7 @@ class Installer {
|
|
|
50
50
|
});
|
|
51
51
|
} catch (error) {
|
|
52
52
|
// Legacy-dir scan is informational; never let it abort install.
|
|
53
|
-
await prompts.log.warn(`Warning: Could not check for legacy
|
|
53
|
+
await prompts.log.warn(`Warning: Could not check for legacy WIZZ entries: ${error.message}`);
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
if (existingInstall.installed) {
|
|
@@ -64,7 +64,7 @@ class Installer {
|
|
|
64
64
|
// Capture pre-install module versions for from→to display
|
|
65
65
|
const preInstallVersions = new Map();
|
|
66
66
|
if (existingInstall.installed) {
|
|
67
|
-
const existingModules = await this.manifest.getAllModuleVersions(paths.
|
|
67
|
+
const existingModules = await this.manifest.getAllModuleVersions(paths.wizzDir);
|
|
68
68
|
for (const mod of existingModules) {
|
|
69
69
|
if (mod.name && mod.version) {
|
|
70
70
|
preInstallVersions.set(mod.name, mod.version);
|
|
@@ -78,7 +78,7 @@ class Installer {
|
|
|
78
78
|
|
|
79
79
|
// Capture previously installed skill rows before they get overwritten
|
|
80
80
|
const preservedModules = originalConfig._preserveModules || [];
|
|
81
|
-
const previousSkillManifestRows = await this._readSkillManifestRows(paths.
|
|
81
|
+
const previousSkillManifestRows = await this._readSkillManifestRows(paths.wizzDir);
|
|
82
82
|
const previousSkillIds = this._getPreviousSkillIdsForCleanup(previousSkillManifestRows, preservedModules);
|
|
83
83
|
|
|
84
84
|
const allModules = config.modules || [];
|
|
@@ -98,13 +98,13 @@ class Installer {
|
|
|
98
98
|
|
|
99
99
|
// Skills are now in IDE directories — remove redundant copies from _wizz/.
|
|
100
100
|
// Also cleans up skill dirs left by older installer versions.
|
|
101
|
-
await this._cleanupSkillDirs(paths.
|
|
101
|
+
await this._cleanupSkillDirs(paths.wizzDir);
|
|
102
102
|
|
|
103
103
|
const restoreResult = await this._restoreUserFiles(paths, updateState);
|
|
104
104
|
|
|
105
105
|
// Render consolidated summary
|
|
106
106
|
await this.renderInstallSummary(results, {
|
|
107
|
-
|
|
107
|
+
wizzDir: paths.wizzDir,
|
|
108
108
|
modules: config.modules,
|
|
109
109
|
ides: config.ides,
|
|
110
110
|
customFiles: restoreResult.customFiles.length > 0 ? restoreResult.customFiles : undefined,
|
|
@@ -114,7 +114,7 @@ class Installer {
|
|
|
114
114
|
|
|
115
115
|
return {
|
|
116
116
|
success: true,
|
|
117
|
-
path: paths.
|
|
117
|
+
path: paths.wizzDir,
|
|
118
118
|
modules: config.modules,
|
|
119
119
|
ides: config.ides,
|
|
120
120
|
projectDir: paths.projectRoot,
|
|
@@ -256,7 +256,7 @@ class Installer {
|
|
|
256
256
|
installTasks.push({
|
|
257
257
|
title: 'Creating module directories',
|
|
258
258
|
task: async (message) => {
|
|
259
|
-
const verboseMode = process.env.
|
|
259
|
+
const verboseMode = process.env.WIZZ_VERBOSE_INSTALL === 'true' || config.verbose;
|
|
260
260
|
const moduleLogger = {
|
|
261
261
|
log: async (msg) => (verboseMode ? await prompts.log.message(msg) : undefined),
|
|
262
262
|
error: async (msg) => await prompts.log.error(msg),
|
|
@@ -266,7 +266,7 @@ class Installer {
|
|
|
266
266
|
if (config.modules && config.modules.length > 0) {
|
|
267
267
|
for (const moduleName of config.modules) {
|
|
268
268
|
message(`Setting up ${moduleName}...`);
|
|
269
|
-
const result = await officialModules.createModuleDirectories(moduleName, paths.
|
|
269
|
+
const result = await officialModules.createModuleDirectories(moduleName, paths.wizzDir, {
|
|
270
270
|
installedIDEs: config.ides || [],
|
|
271
271
|
moduleConfig: moduleConfigs[moduleName] || {},
|
|
272
272
|
existingModuleConfig: officialModules.existingConfig?.[moduleName] || {},
|
|
@@ -290,7 +290,7 @@ class Installer {
|
|
|
290
290
|
const configTask = {
|
|
291
291
|
title: 'Generating configurations',
|
|
292
292
|
task: async (message) => {
|
|
293
|
-
await this.generateModuleConfigs(paths.
|
|
293
|
+
await this.generateModuleConfigs(paths.wizzDir, moduleConfigs);
|
|
294
294
|
addResult('Configurations', 'ok', 'generated');
|
|
295
295
|
|
|
296
296
|
this.installedFiles.add(paths.manifestFile());
|
|
@@ -314,14 +314,14 @@ class Installer {
|
|
|
314
314
|
modulesForCsvPreserve = preservedModules.length > 0 ? [...allModules, ...preservedModules] : allModules;
|
|
315
315
|
}
|
|
316
316
|
|
|
317
|
-
await this._trackPreservedModuleFiles(paths.
|
|
317
|
+
await this._trackPreservedModuleFiles(paths.wizzDir, preservedModules);
|
|
318
318
|
|
|
319
|
-
await manifestGen.generateManifests(paths.
|
|
319
|
+
await manifestGen.generateManifests(paths.wizzDir, allModulesForManifest, [...this.installedFiles], {
|
|
320
320
|
ides: config.ides || [],
|
|
321
321
|
preservedModules: modulesForCsvPreserve,
|
|
322
322
|
moduleConfigs,
|
|
323
323
|
});
|
|
324
|
-
await this._appendPreservedSkillManifestRows(paths.
|
|
324
|
+
await this._appendPreservedSkillManifestRows(paths.wizzDir, previousSkillManifestRows, preservedModules);
|
|
325
325
|
|
|
326
326
|
// Apply post-install --set TOML patches. Runs after writeCentralConfig
|
|
327
327
|
// (inside generateManifests above) so the patch operates on the
|
|
@@ -329,7 +329,7 @@ class Installer {
|
|
|
329
329
|
// See `tools/installer/set-overrides.js` for routing rules.
|
|
330
330
|
if (config.setOverrides && Object.keys(config.setOverrides).length > 0) {
|
|
331
331
|
const { applySetOverrides } = require('../set-overrides');
|
|
332
|
-
const applied = await applySetOverrides(config.setOverrides, paths.
|
|
332
|
+
const applied = await applySetOverrides(config.setOverrides, paths.wizzDir);
|
|
333
333
|
if (applied.length > 0) {
|
|
334
334
|
const summary = applied.map((a) => `${a.module}.${a.key} → ${a.file}`).join(', ');
|
|
335
335
|
await prompts.log.info(`Applied --set overrides: ${summary}`);
|
|
@@ -337,7 +337,7 @@ class Installer {
|
|
|
337
337
|
}
|
|
338
338
|
|
|
339
339
|
message('Generating help catalog...');
|
|
340
|
-
await this.mergeModuleHelpCatalogs(paths.
|
|
340
|
+
await this.mergeModuleHelpCatalogs(paths.wizzDir, manifestGen.agents);
|
|
341
341
|
addResult('Help catalog', 'ok');
|
|
342
342
|
|
|
343
343
|
return 'Configurations generated';
|
|
@@ -380,7 +380,7 @@ class Installer {
|
|
|
380
380
|
return;
|
|
381
381
|
}
|
|
382
382
|
|
|
383
|
-
const setupResults = await this.ideManager.setupBatch(validIdes, paths.projectRoot, paths.
|
|
383
|
+
const setupResults = await this.ideManager.setupBatch(validIdes, paths.projectRoot, paths.wizzDir, {
|
|
384
384
|
selectedModules: allModules || [],
|
|
385
385
|
verbose: config.verbose,
|
|
386
386
|
previousSkillIds,
|
|
@@ -401,41 +401,41 @@ class Installer {
|
|
|
401
401
|
* Skills are self-contained in IDE directories, so _wizz/ only needs
|
|
402
402
|
* module-level files (config.yaml, _config/, etc.).
|
|
403
403
|
* Also cleans up skill dirs left by older installer versions.
|
|
404
|
-
* @param {string}
|
|
404
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
405
405
|
*/
|
|
406
|
-
async _cleanupSkillDirs(
|
|
406
|
+
async _cleanupSkillDirs(wizzDir) {
|
|
407
407
|
const csv = require('csv-parse/sync');
|
|
408
|
-
const csvPath = path.join(
|
|
408
|
+
const csvPath = path.join(wizzDir, '_config', 'skill-manifest.csv');
|
|
409
409
|
if (!(await fs.pathExists(csvPath))) return;
|
|
410
410
|
|
|
411
411
|
const csvContent = await fs.readFile(csvPath, 'utf8');
|
|
412
412
|
const records = csv.parse(csvContent, { columns: true, skip_empty_lines: true });
|
|
413
|
-
const
|
|
414
|
-
const
|
|
413
|
+
const wizzFolderName = path.basename(wizzDir);
|
|
414
|
+
const wizzPrefix = wizzFolderName + '/';
|
|
415
415
|
|
|
416
416
|
for (const record of records) {
|
|
417
417
|
if (!record.path) continue;
|
|
418
|
-
const relativePath = record.path.startsWith(
|
|
419
|
-
const sourceDir = path.dirname(path.join(
|
|
418
|
+
const relativePath = record.path.startsWith(wizzPrefix) ? record.path.slice(wizzPrefix.length) : record.path;
|
|
419
|
+
const sourceDir = path.dirname(path.join(wizzDir, relativePath));
|
|
420
420
|
if (await fs.pathExists(sourceDir)) {
|
|
421
421
|
await fs.remove(sourceDir);
|
|
422
|
-
await this._removeEmptyParents(path.dirname(sourceDir),
|
|
422
|
+
await this._removeEmptyParents(path.dirname(sourceDir), wizzDir);
|
|
423
423
|
}
|
|
424
424
|
}
|
|
425
425
|
}
|
|
426
426
|
|
|
427
427
|
/**
|
|
428
428
|
* Remove now-empty parent directories left behind after skill dir cleanup.
|
|
429
|
-
* Walks up from dir, stopping at (and never removing)
|
|
429
|
+
* Walks up from dir, stopping at (and never removing) wizzDir. Best-effort:
|
|
430
430
|
* a directory that vanishes or fills in mid-walk just ends the walk.
|
|
431
431
|
* @param {string} dir - Directory to start walking up from
|
|
432
|
-
* @param {string}
|
|
432
|
+
* @param {string} wizzDir - WIZZ installation directory (boundary)
|
|
433
433
|
*/
|
|
434
|
-
async _removeEmptyParents(dir,
|
|
434
|
+
async _removeEmptyParents(dir, wizzDir) {
|
|
435
435
|
let current = dir;
|
|
436
436
|
while (true) {
|
|
437
437
|
// Path-boundary check (not a string prefix, so siblings like _wizz2 don't match).
|
|
438
|
-
const rel = path.relative(
|
|
438
|
+
const rel = path.relative(wizzDir, current);
|
|
439
439
|
if (rel === '' || rel.startsWith('..') || path.isAbsolute(rel)) break;
|
|
440
440
|
try {
|
|
441
441
|
const entries = await fs.readdir(current);
|
|
@@ -448,8 +448,8 @@ class Installer {
|
|
|
448
448
|
}
|
|
449
449
|
}
|
|
450
450
|
|
|
451
|
-
async _readSkillManifestRows(
|
|
452
|
-
const csvPath = path.join(
|
|
451
|
+
async _readSkillManifestRows(wizzDir) {
|
|
452
|
+
const csvPath = path.join(wizzDir, '_config', 'skill-manifest.csv');
|
|
453
453
|
if (!(await fs.pathExists(csvPath))) return [];
|
|
454
454
|
|
|
455
455
|
try {
|
|
@@ -473,17 +473,17 @@ class Installer {
|
|
|
473
473
|
return ids;
|
|
474
474
|
}
|
|
475
475
|
|
|
476
|
-
async _appendPreservedSkillManifestRows(
|
|
476
|
+
async _appendPreservedSkillManifestRows(wizzDir, previousRows, preservedModules = []) {
|
|
477
477
|
if (!previousRows || previousRows.length === 0 || preservedModules.length === 0) return;
|
|
478
478
|
|
|
479
479
|
const preservedModuleSet = new Set(preservedModules);
|
|
480
480
|
const rowsToPreserve = previousRows.filter((row) => row.canonicalId && row.module && preservedModuleSet.has(row.module));
|
|
481
481
|
if (rowsToPreserve.length === 0) return;
|
|
482
482
|
|
|
483
|
-
const csvPath = path.join(
|
|
483
|
+
const csvPath = path.join(wizzDir, '_config', 'skill-manifest.csv');
|
|
484
484
|
if (!(await fs.pathExists(csvPath))) return;
|
|
485
485
|
|
|
486
|
-
const currentRows = await this._readSkillManifestRows(
|
|
486
|
+
const currentRows = await this._readSkillManifestRows(wizzDir);
|
|
487
487
|
const activeIds = new Set(currentRows.map((row) => row.canonicalId).filter(Boolean));
|
|
488
488
|
const appendedRows = [];
|
|
489
489
|
|
|
@@ -529,7 +529,7 @@ class Installer {
|
|
|
529
529
|
message(`Restoring ${updateState.customFiles.length} custom files...`);
|
|
530
530
|
|
|
531
531
|
for (const originalPath of updateState.customFiles) {
|
|
532
|
-
const relativePath = path.relative(paths.
|
|
532
|
+
const relativePath = path.relative(paths.wizzDir, originalPath);
|
|
533
533
|
const backupPath = path.join(updateState.tempBackupDir, relativePath);
|
|
534
534
|
|
|
535
535
|
if (await fs.pathExists(backupPath)) {
|
|
@@ -552,7 +552,7 @@ class Installer {
|
|
|
552
552
|
message(`Restoring ${restoredModifiedFiles.length} modified files as .bak...`);
|
|
553
553
|
|
|
554
554
|
for (const modifiedFile of restoredModifiedFiles) {
|
|
555
|
-
const relativePath = path.relative(paths.
|
|
555
|
+
const relativePath = path.relative(paths.wizzDir, modifiedFile.path);
|
|
556
556
|
const tempBackupPath = path.join(updateState.tempModifiedBackupDir, relativePath);
|
|
557
557
|
const bakPath = modifiedFile.path + '.bak';
|
|
558
558
|
|
|
@@ -584,8 +584,8 @@ class Installer {
|
|
|
584
584
|
*/
|
|
585
585
|
async _prepareUpdateState(paths, config, existingInstall, officialModules) {
|
|
586
586
|
// Detect custom and modified files BEFORE updating (compare current files vs files-manifest.csv)
|
|
587
|
-
const existingFilesManifest = await this.readFilesManifest(paths.
|
|
588
|
-
const { customFiles, modifiedFiles } = await this.detectCustomFiles(paths.
|
|
587
|
+
const existingFilesManifest = await this.readFilesManifest(paths.wizzDir);
|
|
588
|
+
const { customFiles, modifiedFiles } = await this.detectCustomFiles(paths.wizzDir, existingFilesManifest);
|
|
589
589
|
|
|
590
590
|
// Preserve existing core configuration during updates
|
|
591
591
|
// (no-op for quick-update which already has core config from collectModuleConfigQuick)
|
|
@@ -630,7 +630,7 @@ class Installer {
|
|
|
630
630
|
await fs.ensureDir(tempBackupDir);
|
|
631
631
|
|
|
632
632
|
for (const customFile of customFiles) {
|
|
633
|
-
const relativePath = path.relative(paths.
|
|
633
|
+
const relativePath = path.relative(paths.wizzDir, customFile);
|
|
634
634
|
const backupPath = path.join(tempBackupDir, relativePath);
|
|
635
635
|
await fs.ensureDir(path.dirname(backupPath));
|
|
636
636
|
await fs.copy(customFile, backupPath);
|
|
@@ -642,7 +642,7 @@ class Installer {
|
|
|
642
642
|
await fs.ensureDir(tempModifiedBackupDir);
|
|
643
643
|
|
|
644
644
|
for (const modifiedFile of modifiedFiles) {
|
|
645
|
-
const relativePath = path.relative(paths.
|
|
645
|
+
const relativePath = path.relative(paths.wizzDir, modifiedFile.path);
|
|
646
646
|
const tempBackupPath = path.join(tempModifiedBackupDir, relativePath);
|
|
647
647
|
await fs.ensureDir(path.dirname(tempBackupPath));
|
|
648
648
|
await fs.copy(modifiedFile.path, tempBackupPath, { overwrite: true });
|
|
@@ -696,9 +696,9 @@ class Installer {
|
|
|
696
696
|
}
|
|
697
697
|
}
|
|
698
698
|
|
|
699
|
-
async _trackPreservedModuleFiles(
|
|
699
|
+
async _trackPreservedModuleFiles(wizzDir, preservedModules = []) {
|
|
700
700
|
for (const moduleName of preservedModules) {
|
|
701
|
-
const modulePath = path.join(
|
|
701
|
+
const modulePath = path.join(wizzDir, moduleName);
|
|
702
702
|
if (await fs.pathExists(modulePath)) {
|
|
703
703
|
await this._trackFilesRecursive(modulePath);
|
|
704
704
|
}
|
|
@@ -727,7 +727,7 @@ class Installer {
|
|
|
727
727
|
const moduleConfig = officialModules.moduleConfigs[moduleName] || {};
|
|
728
728
|
const installResult = await officialModules.install(
|
|
729
729
|
moduleName,
|
|
730
|
-
paths.
|
|
730
|
+
paths.wizzDir,
|
|
731
731
|
(filePath) => {
|
|
732
732
|
this.installedFiles.add(filePath);
|
|
733
733
|
},
|
|
@@ -769,11 +769,11 @@ class Installer {
|
|
|
769
769
|
|
|
770
770
|
/**
|
|
771
771
|
* Read files-manifest.csv
|
|
772
|
-
* @param {string}
|
|
772
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
773
773
|
* @returns {Array} Array of file entries from files-manifest.csv
|
|
774
774
|
*/
|
|
775
|
-
async readFilesManifest(
|
|
776
|
-
const filesManifestPath = path.join(
|
|
775
|
+
async readFilesManifest(wizzDir) {
|
|
776
|
+
const filesManifestPath = path.join(wizzDir, '_config', 'files-manifest.csv');
|
|
777
777
|
if (!(await fs.pathExists(filesManifestPath))) {
|
|
778
778
|
return [];
|
|
779
779
|
}
|
|
@@ -825,11 +825,11 @@ class Installer {
|
|
|
825
825
|
|
|
826
826
|
/**
|
|
827
827
|
* Detect custom and modified files
|
|
828
|
-
* @param {string}
|
|
828
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
829
829
|
* @param {Array} existingFilesManifest - Previous files from files-manifest.csv
|
|
830
830
|
* @returns {Object} Object with customFiles and modifiedFiles arrays
|
|
831
831
|
*/
|
|
832
|
-
async detectCustomFiles(
|
|
832
|
+
async detectCustomFiles(wizzDir, existingFilesManifest) {
|
|
833
833
|
const customFiles = [];
|
|
834
834
|
const modifiedFiles = [];
|
|
835
835
|
|
|
@@ -837,7 +837,7 @@ class Installer {
|
|
|
837
837
|
// per-user runtime data generated by agents with sidecars. These files
|
|
838
838
|
// aren't installer-managed and must never be reported as "custom" or
|
|
839
839
|
// "modified" — they're user state, not user overrides.
|
|
840
|
-
const
|
|
840
|
+
const wizzMemoryPaths = ['_memory', 'memory'];
|
|
841
841
|
|
|
842
842
|
// Check if the manifest has hashes - if not, we can't detect modifications
|
|
843
843
|
let manifestHasHashes = false;
|
|
@@ -849,7 +849,7 @@ class Installer {
|
|
|
849
849
|
const installedFilesMap = new Map();
|
|
850
850
|
for (const fileEntry of existingFilesManifest) {
|
|
851
851
|
if (fileEntry.path) {
|
|
852
|
-
const absolutePath = path.join(
|
|
852
|
+
const absolutePath = path.join(wizzDir, fileEntry.path);
|
|
853
853
|
installedFilesMap.set(path.normalize(absolutePath), {
|
|
854
854
|
hash: fileEntry.hash,
|
|
855
855
|
relativePath: fileEntry.path,
|
|
@@ -857,7 +857,7 @@ class Installer {
|
|
|
857
857
|
}
|
|
858
858
|
}
|
|
859
859
|
|
|
860
|
-
// Recursively scan
|
|
860
|
+
// Recursively scan wizzDir for all files
|
|
861
861
|
const scanDirectory = async (dir) => {
|
|
862
862
|
try {
|
|
863
863
|
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
@@ -875,7 +875,7 @@ class Installer {
|
|
|
875
875
|
const fileInfo = installedFilesMap.get(normalizedPath);
|
|
876
876
|
|
|
877
877
|
// Skip certain system files that are auto-generated
|
|
878
|
-
const relativePath = path.relative(
|
|
878
|
+
const relativePath = path.relative(wizzDir, fullPath);
|
|
879
879
|
const fileName = path.basename(fullPath);
|
|
880
880
|
|
|
881
881
|
// Skip _config directory EXCEPT for modified agent customizations
|
|
@@ -883,7 +883,7 @@ class Installer {
|
|
|
883
883
|
// Special handling for .customize.yaml files - only preserve if modified
|
|
884
884
|
if (relativePath.includes('/agents/') && fileName.endsWith('.customize.yaml')) {
|
|
885
885
|
// Check if the customization file has been modified from manifest
|
|
886
|
-
const manifestPath = path.join(
|
|
886
|
+
const manifestPath = path.join(wizzDir, '_config', 'manifest.yaml');
|
|
887
887
|
if (await fs.pathExists(manifestPath)) {
|
|
888
888
|
const crypto = require('node:crypto');
|
|
889
889
|
const currentContent = await fs.readFile(fullPath, 'utf8');
|
|
@@ -903,7 +903,7 @@ class Installer {
|
|
|
903
903
|
continue;
|
|
904
904
|
}
|
|
905
905
|
|
|
906
|
-
if (
|
|
906
|
+
if (wizzMemoryPaths.some((mp) => relativePath === mp || relativePath.startsWith(mp + '/'))) {
|
|
907
907
|
continue;
|
|
908
908
|
}
|
|
909
909
|
|
|
@@ -937,29 +937,29 @@ class Installer {
|
|
|
937
937
|
}
|
|
938
938
|
};
|
|
939
939
|
|
|
940
|
-
await scanDirectory(
|
|
940
|
+
await scanDirectory(wizzDir);
|
|
941
941
|
return { customFiles, modifiedFiles };
|
|
942
942
|
}
|
|
943
943
|
|
|
944
944
|
/**
|
|
945
945
|
* Generate clean config.yaml files for each installed module
|
|
946
|
-
* @param {string}
|
|
946
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
947
947
|
* @param {Object} moduleConfigs - Collected configuration values
|
|
948
948
|
*/
|
|
949
|
-
async generateModuleConfigs(
|
|
949
|
+
async generateModuleConfigs(wizzDir, moduleConfigs) {
|
|
950
950
|
const yaml = require('yaml');
|
|
951
951
|
|
|
952
952
|
// Extract core config values to share with other modules
|
|
953
953
|
const coreConfig = moduleConfigs.core || {};
|
|
954
954
|
|
|
955
955
|
// Get all installed module directories
|
|
956
|
-
const entries = await fs.readdir(
|
|
956
|
+
const entries = await fs.readdir(wizzDir, { withFileTypes: true });
|
|
957
957
|
const nonModuleDirs = new Set(['_config', '_memory', 'memory', 'docs', 'scripts', 'custom']);
|
|
958
958
|
const installedModules = entries.filter((entry) => entry.isDirectory() && !nonModuleDirs.has(entry.name)).map((entry) => entry.name);
|
|
959
959
|
|
|
960
960
|
// Generate config.yaml for each installed module
|
|
961
961
|
for (const moduleName of installedModules) {
|
|
962
|
-
const modulePath = path.join(
|
|
962
|
+
const modulePath = path.join(wizzDir, moduleName);
|
|
963
963
|
|
|
964
964
|
// Get module-specific config or use empty object if none
|
|
965
965
|
const config = moduleConfigs[moduleName] || {};
|
|
@@ -1040,17 +1040,17 @@ class Installer {
|
|
|
1040
1040
|
* Merge all module-help.csv files into a single wizz-help.csv.
|
|
1041
1041
|
* Scans all installed modules for module-help.csv and merges them.
|
|
1042
1042
|
* Output preserves the source schema verbatim — see schema below.
|
|
1043
|
-
* @param {string}
|
|
1043
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
1044
1044
|
* @param {Array<Object>} _agentEntries - Unused; retained for call-site compatibility
|
|
1045
1045
|
*/
|
|
1046
|
-
async mergeModuleHelpCatalogs(
|
|
1046
|
+
async mergeModuleHelpCatalogs(wizzDir, _agentEntries = []) {
|
|
1047
1047
|
const allRows = [];
|
|
1048
1048
|
const headerRow = MODULE_HELP_CSV_HEADER;
|
|
1049
1049
|
const COLUMN_COUNT = 13;
|
|
1050
1050
|
const PHASE_INDEX = 7;
|
|
1051
1051
|
|
|
1052
1052
|
// Get all installed module directories
|
|
1053
|
-
const entries = await fs.readdir(
|
|
1053
|
+
const entries = await fs.readdir(wizzDir, { withFileTypes: true });
|
|
1054
1054
|
const nonModuleDirs = new Set(['_config', '_memory', 'memory', 'docs', 'scripts', 'custom']);
|
|
1055
1055
|
const installedModules = entries.filter((entry) => entry.isDirectory() && !nonModuleDirs.has(entry.name)).map((entry) => entry.name);
|
|
1056
1056
|
|
|
@@ -1065,7 +1065,7 @@ class Installer {
|
|
|
1065
1065
|
|
|
1066
1066
|
// Map installed module paths
|
|
1067
1067
|
for (const moduleName of installedModules) {
|
|
1068
|
-
const modulePath = path.join(
|
|
1068
|
+
const modulePath = path.join(wizzDir, moduleName);
|
|
1069
1069
|
modulePaths.set(moduleName, modulePath);
|
|
1070
1070
|
}
|
|
1071
1071
|
|
|
@@ -1111,7 +1111,7 @@ class Installer {
|
|
|
1111
1111
|
allRows.push(padded.map((c) => this.escapeCSVField(c)).join(','));
|
|
1112
1112
|
}
|
|
1113
1113
|
|
|
1114
|
-
if (process.env.
|
|
1114
|
+
if (process.env.WIZZ_VERBOSE_INSTALL === 'true') {
|
|
1115
1115
|
await prompts.log.message(` Merged module-help from: ${moduleName}`);
|
|
1116
1116
|
}
|
|
1117
1117
|
} catch (error) {
|
|
@@ -1136,7 +1136,7 @@ class Installer {
|
|
|
1136
1136
|
const sortedRows = decorated.map((d) => d.row);
|
|
1137
1137
|
|
|
1138
1138
|
// Write merged catalog
|
|
1139
|
-
const outputDir = path.join(
|
|
1139
|
+
const outputDir = path.join(wizzDir, '_config');
|
|
1140
1140
|
await fs.ensureDir(outputDir);
|
|
1141
1141
|
const outputPath = path.join(outputDir, 'wizz-help.csv');
|
|
1142
1142
|
|
|
@@ -1146,7 +1146,7 @@ class Installer {
|
|
|
1146
1146
|
// Track the installed file
|
|
1147
1147
|
this.installedFiles.add(outputPath);
|
|
1148
1148
|
|
|
1149
|
-
if (process.env.
|
|
1149
|
+
if (process.env.WIZZ_VERBOSE_INSTALL === 'true') {
|
|
1150
1150
|
await prompts.log.message(` Generated wizz-help.csv: ${sortedRows.length} workflows`);
|
|
1151
1151
|
}
|
|
1152
1152
|
}
|
|
@@ -1154,7 +1154,7 @@ class Installer {
|
|
|
1154
1154
|
/**
|
|
1155
1155
|
* Render a consolidated install summary using prompts.note()
|
|
1156
1156
|
* @param {Array} results - Array of {step, status: 'ok'|'error'|'warn', detail}
|
|
1157
|
-
* @param {Object} context - {
|
|
1157
|
+
* @param {Object} context - {wizzDir, modules, ides, customFiles, modifiedFiles}
|
|
1158
1158
|
*/
|
|
1159
1159
|
async renderInstallSummary(results, context = {}) {
|
|
1160
1160
|
const color = await prompts.getColor();
|
|
@@ -1216,8 +1216,8 @@ class Installer {
|
|
|
1216
1216
|
|
|
1217
1217
|
// Context and warnings
|
|
1218
1218
|
lines.push('');
|
|
1219
|
-
if (context.
|
|
1220
|
-
lines.push(` Installed to: ${context.
|
|
1219
|
+
if (context.wizzDir) {
|
|
1220
|
+
lines.push(` Installed to: ${context.wizzDir}`);
|
|
1221
1221
|
}
|
|
1222
1222
|
if (context.customFiles && context.customFiles.length > 0) {
|
|
1223
1223
|
lines.push(` ${color.cyan(`Custom files preserved: ${context.customFiles.length}`)}`);
|
|
@@ -1250,18 +1250,18 @@ class Installer {
|
|
|
1250
1250
|
*/
|
|
1251
1251
|
async quickUpdate(config) {
|
|
1252
1252
|
const projectDir = path.resolve(config.directory);
|
|
1253
|
-
const {
|
|
1253
|
+
const { wizzDir } = await this.findWizzDir(projectDir);
|
|
1254
1254
|
|
|
1255
|
-
// Check if
|
|
1256
|
-
if (!(await fs.pathExists(
|
|
1257
|
-
throw new Error(`Wizz not installed at ${
|
|
1255
|
+
// Check if wizz directory exists
|
|
1256
|
+
if (!(await fs.pathExists(wizzDir))) {
|
|
1257
|
+
throw new Error(`Wizz not installed at ${wizzDir}. Use regular install for first-time setup.`);
|
|
1258
1258
|
}
|
|
1259
1259
|
|
|
1260
1260
|
// Detect existing installation
|
|
1261
|
-
const existingInstall = await ExistingInstall.detect(
|
|
1261
|
+
const existingInstall = await ExistingInstall.detect(wizzDir);
|
|
1262
1262
|
const installedModules = existingInstall.moduleIds;
|
|
1263
1263
|
const configuredIdes = existingInstall.ides;
|
|
1264
|
-
const projectRoot = path.dirname(
|
|
1264
|
+
const projectRoot = path.dirname(wizzDir);
|
|
1265
1265
|
|
|
1266
1266
|
// Get available modules (what we have source for)
|
|
1267
1267
|
const availableModulesData = await new OfficialModules().listAvailable();
|
|
@@ -1285,7 +1285,7 @@ class Installer {
|
|
|
1285
1285
|
const customMgr = new CustomModuleManager();
|
|
1286
1286
|
for (const moduleId of installedModules) {
|
|
1287
1287
|
if (!availableModules.some((m) => m.id === moduleId)) {
|
|
1288
|
-
const customSource = await customMgr.findModuleSourceByCode(moduleId, {
|
|
1288
|
+
const customSource = await customMgr.findModuleSourceByCode(moduleId, { wizzDir });
|
|
1289
1289
|
if (customSource) {
|
|
1290
1290
|
availableModules.push({
|
|
1291
1291
|
id: moduleId,
|
|
@@ -1313,7 +1313,7 @@ class Installer {
|
|
|
1313
1313
|
// silently redecide it. Without this, modules previously on 'next' or
|
|
1314
1314
|
// 'pinned' would trigger a stable-channel tag lookup at config-collection
|
|
1315
1315
|
// time, burning GitHub API quota and potentially failing.
|
|
1316
|
-
const manifestData = await this.manifest.read(
|
|
1316
|
+
const manifestData = await this.manifest.read(wizzDir);
|
|
1317
1317
|
const channelOptions = { global: null, nextSet: new Set(), pins: new Map(), warnings: [] };
|
|
1318
1318
|
if (manifestData?.modulesDetailed) {
|
|
1319
1319
|
const { fetchStableTags, classifyUpgrade, parseGitHubRepo } = require('../modules/channel-resolver');
|
|
@@ -1418,7 +1418,7 @@ class Installer {
|
|
|
1418
1418
|
}
|
|
1419
1419
|
|
|
1420
1420
|
/**
|
|
1421
|
-
* Uninstall
|
|
1421
|
+
* Uninstall WIZZ with selective removal options
|
|
1422
1422
|
* @param {string} directory - Project directory
|
|
1423
1423
|
* @param {Object} options - Uninstall options
|
|
1424
1424
|
* @param {boolean} [options.removeModules=true] - Remove _wizz/ directory
|
|
@@ -1428,15 +1428,15 @@ class Installer {
|
|
|
1428
1428
|
*/
|
|
1429
1429
|
async uninstall(directory, options = {}) {
|
|
1430
1430
|
const projectDir = path.resolve(directory);
|
|
1431
|
-
const {
|
|
1431
|
+
const { wizzDir } = await this.findWizzDir(projectDir);
|
|
1432
1432
|
|
|
1433
|
-
if (!(await fs.pathExists(
|
|
1433
|
+
if (!(await fs.pathExists(wizzDir))) {
|
|
1434
1434
|
return { success: false, reason: 'not-installed' };
|
|
1435
1435
|
}
|
|
1436
1436
|
|
|
1437
1437
|
// 1. DETECT: Read state BEFORE deleting anything
|
|
1438
|
-
const existingInstall = await ExistingInstall.detect(
|
|
1439
|
-
const outputFolder = await this._readOutputFolder(
|
|
1438
|
+
const existingInstall = await ExistingInstall.detect(wizzDir);
|
|
1439
|
+
const outputFolder = await this._readOutputFolder(wizzDir);
|
|
1440
1440
|
|
|
1441
1441
|
const removed = { modules: false, ideConfigs: false, outputFolder: false };
|
|
1442
1442
|
|
|
@@ -1451,7 +1451,7 @@ class Installer {
|
|
|
1451
1451
|
removed.outputFolder = await this.uninstallOutputFolder(projectDir, outputFolder);
|
|
1452
1452
|
}
|
|
1453
1453
|
|
|
1454
|
-
// 4.
|
|
1454
|
+
// 4. WIZZ DIRECTORY (last, after everything that needs it)
|
|
1455
1455
|
if (options.removeModules !== false) {
|
|
1456
1456
|
removed.modules = await this.uninstallModules(projectDir);
|
|
1457
1457
|
}
|
|
@@ -1502,9 +1502,9 @@ class Installer {
|
|
|
1502
1502
|
* @returns {Promise<boolean>} Whether the directory was removed
|
|
1503
1503
|
*/
|
|
1504
1504
|
async uninstallModules(projectDir) {
|
|
1505
|
-
const {
|
|
1506
|
-
if (await fs.pathExists(
|
|
1507
|
-
await fs.remove(
|
|
1505
|
+
const { wizzDir } = await this.findWizzDir(projectDir);
|
|
1506
|
+
if (await fs.pathExists(wizzDir)) {
|
|
1507
|
+
await fs.remove(wizzDir);
|
|
1508
1508
|
return true;
|
|
1509
1509
|
}
|
|
1510
1510
|
return false;
|
|
@@ -1515,8 +1515,8 @@ class Installer {
|
|
|
1515
1515
|
*/
|
|
1516
1516
|
async getStatus(directory) {
|
|
1517
1517
|
const projectDir = path.resolve(directory);
|
|
1518
|
-
const {
|
|
1519
|
-
return await ExistingInstall.detect(
|
|
1518
|
+
const { wizzDir } = await this.findWizzDir(projectDir);
|
|
1519
|
+
return await ExistingInstall.detect(wizzDir);
|
|
1520
1520
|
}
|
|
1521
1521
|
|
|
1522
1522
|
/**
|
|
@@ -1528,37 +1528,37 @@ class Installer {
|
|
|
1528
1528
|
|
|
1529
1529
|
/**
|
|
1530
1530
|
* Get the configured output folder name for a project
|
|
1531
|
-
* Resolves
|
|
1531
|
+
* Resolves wizzDir internally from projectDir
|
|
1532
1532
|
* @param {string} projectDir - Project directory
|
|
1533
1533
|
* @returns {string} Output folder name (relative, default: '_wizz-output')
|
|
1534
1534
|
*/
|
|
1535
1535
|
async getOutputFolder(projectDir) {
|
|
1536
|
-
const {
|
|
1537
|
-
return this._readOutputFolder(
|
|
1536
|
+
const { wizzDir } = await this.findWizzDir(projectDir);
|
|
1537
|
+
return this._readOutputFolder(wizzDir);
|
|
1538
1538
|
}
|
|
1539
1539
|
|
|
1540
1540
|
/**
|
|
1541
|
-
* Find the
|
|
1541
|
+
* Find the wizz installation directory in a project
|
|
1542
1542
|
* Always uses the standard _wizz folder name
|
|
1543
1543
|
* @param {string} projectDir - Project directory
|
|
1544
|
-
* @returns {Promise<Object>} {
|
|
1544
|
+
* @returns {Promise<Object>} { wizzDir: string }
|
|
1545
1545
|
*/
|
|
1546
|
-
async
|
|
1547
|
-
const
|
|
1548
|
-
return {
|
|
1546
|
+
async findWizzDir(projectDir) {
|
|
1547
|
+
const wizzDir = path.join(projectDir, WIZZ_FOLDER_NAME);
|
|
1548
|
+
return { wizzDir };
|
|
1549
1549
|
}
|
|
1550
1550
|
|
|
1551
1551
|
/**
|
|
1552
1552
|
* Read the output_folder setting from module config files
|
|
1553
1553
|
* Checks bmm/config.yaml first, then other module configs
|
|
1554
|
-
* @param {string}
|
|
1554
|
+
* @param {string} wizzDir - WIZZ installation directory
|
|
1555
1555
|
* @returns {string} Output folder path or default
|
|
1556
1556
|
*/
|
|
1557
|
-
async _readOutputFolder(
|
|
1557
|
+
async _readOutputFolder(wizzDir) {
|
|
1558
1558
|
const yaml = require('yaml');
|
|
1559
1559
|
|
|
1560
1560
|
// Check bmm/config.yaml first (most common)
|
|
1561
|
-
const bmmConfigPath = path.join(
|
|
1561
|
+
const bmmConfigPath = path.join(wizzDir, 'bmm', 'config.yaml');
|
|
1562
1562
|
if (await fs.pathExists(bmmConfigPath)) {
|
|
1563
1563
|
try {
|
|
1564
1564
|
const content = await fs.readFile(bmmConfigPath, 'utf8');
|
|
@@ -1574,10 +1574,10 @@ class Installer {
|
|
|
1574
1574
|
|
|
1575
1575
|
// Scan other module config.yaml files
|
|
1576
1576
|
try {
|
|
1577
|
-
const entries = await fs.readdir(
|
|
1577
|
+
const entries = await fs.readdir(wizzDir, { withFileTypes: true });
|
|
1578
1578
|
for (const entry of entries) {
|
|
1579
1579
|
if (!entry.isDirectory() || entry.name === 'bmm' || entry.name.startsWith('_')) continue;
|
|
1580
|
-
const configPath = path.join(
|
|
1580
|
+
const configPath = path.join(wizzDir, entry.name, 'config.yaml');
|
|
1581
1581
|
if (await fs.pathExists(configPath)) {
|
|
1582
1582
|
try {
|
|
1583
1583
|
const content = await fs.readFile(configPath, 'utf8');
|