wizz-method 2.16.0 → 2.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/THIRD-PARTY-NOTICES.md +6 -0
  2. package/package.json +1 -1
  3. package/skills-registry.yaml +18 -6
  4. package/src/modules/wizz/_shared/model-ladder.md +7 -5
  5. package/src/modules/wizz/_shared/video-pipeline.md +1 -0
  6. package/src/modules/wizz/subagents/codex/wizz-exec-mechanical.toml +2 -2
  7. package/src/modules/wizz/subagents/codex/wizz-exec-review.toml +2 -2
  8. package/src/modules/wizz/subagents/codex/wizz-exec-standard.toml +2 -2
  9. package/src/modules/wizz/subagents/codex/wizz-exec-strong.toml +2 -2
  10. package/src/modules/wizz/subagents/spec.yaml +7 -4
  11. package/src/skills-lib/wizz-router/references/routing-table-flat.md +1 -0
  12. package/src/skills-lib/wizz-video-styles/SKILL.md +66 -0
  13. package/src/skills-lib/wizz-video-styles/assets/audio/CREDITS.md +54 -0
  14. package/src/skills-lib/wizz-video-styles/assets/audio/LIBRARIES.md +31 -0
  15. package/src/skills-lib/wizz-video-styles/assets/audio/kit.json +182 -0
  16. package/src/skills-lib/wizz-video-styles/assets/audio/music/acoustic-lifestyle.mp3 +0 -0
  17. package/src/skills-lib/wizz-video-styles/assets/audio/music/cinematic-tense.mp3 +0 -0
  18. package/src/skills-lib/wizz-video-styles/assets/audio/music/classical-light.mp3 +0 -0
  19. package/src/skills-lib/wizz-video-styles/assets/audio/music/corporate-light.mp3 +0 -0
  20. package/src/skills-lib/wizz-video-styles/assets/audio/music/lofi-chill.mp3 +0 -0
  21. package/src/skills-lib/wizz-video-styles/assets/audio/music/meme-beat.mp3 +0 -0
  22. package/src/skills-lib/wizz-video-styles/assets/audio/music/piano-editorial.mp3 +0 -0
  23. package/src/skills-lib/wizz-video-styles/assets/audio/music/tech-pulse.mp3 +0 -0
  24. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/boom-impact.mp3 +0 -0
  25. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/click-mouse.mp3 +0 -0
  26. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/ding-notify.mp3 +0 -0
  27. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/glitch-short.mp3 +0 -0
  28. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/ka-ching.mp3 +0 -0
  29. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/pop-bubble.mp3 +0 -0
  30. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/record-scratch.mp3 +0 -0
  31. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/riser-short.mp3 +0 -0
  32. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/swoosh-text.mp3 +0 -0
  33. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/typing-short.mp3 +0 -0
  34. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/whoosh-fast.mp3 +0 -0
  35. package/src/skills-lib/wizz-video-styles/assets/audio/sfx/whoosh-soft.mp3 +0 -0
  36. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/EditorialReel.tsx +111 -0
  37. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/README.md +77 -0
  38. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/captions.tsx +56 -0
  39. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/example-words.json +285 -0
  40. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/primitives.tsx +241 -0
  41. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/scenes.tsx +113 -0
  42. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/theme.ts +68 -0
  43. package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/timeline.ts +65 -0
  44. package/src/skills-lib/wizz-video-styles/data/recipes.json +341 -0
  45. package/src/skills-lib/wizz-video-styles/data/references.json +3397 -0
  46. package/src/skills-lib/wizz-video-styles/data/styles.json +726 -0
  47. package/src/skills-lib/wizz-video-styles/references/audio.md +54 -0
  48. package/src/skills-lib/wizz-video-styles/references/measured-patterns.md +38 -0
  49. package/src/skills-lib/wizz-video-styles/references/research-method.md +33 -0
  50. package/src/skills-lib/wizz-video-styles/references/style-picker.md +51 -0
  51. package/src/skills-lib/wizz-video-styles/references/styles/camera-no-setup.md +60 -0
  52. package/src/skills-lib/wizz-video-styles/references/styles/desafio-numero.md +60 -0
  53. package/src/skills-lib/wizz-video-styles/references/styles/esquete.md +57 -0
  54. package/src/skills-lib/wizz-video-styles/references/styles/experimento.md +56 -0
  55. package/src/skills-lib/wizz-video-styles/references/styles/explicador-animado.md +62 -0
  56. package/src/skills-lib/wizz-video-styles/references/styles/macro-asmr.md +61 -0
  57. package/src/skills-lib/wizz-video-styles/references/styles/meme-rapido.md +65 -0
  58. package/src/skills-lib/wizz-video-styles/references/styles/motion-editorial.md +69 -0
  59. package/src/skills-lib/wizz-video-styles/references/styles/podcast-clip.md +61 -0
  60. package/src/skills-lib/wizz-video-styles/references/styles/pov-vlog.md +57 -0
  61. package/src/skills-lib/wizz-video-styles/references/styles/quadro-branco.md +60 -0
  62. package/src/skills-lib/wizz-video-styles/references/styles/talking-head-cards.md +62 -0
  63. package/src/skills-lib/wizz-video-styles/references/styles/talking-head-legenda.md +62 -0
  64. package/src/skills-lib/wizz-video-styles/references/styles/tour.md +59 -0
  65. package/src/skills-lib/wizz-video-styles/scripts/analyze.sh +66 -0
  66. package/src/skills-lib/wizz-video-styles/scripts/build_catalog.py +128 -0
  67. package/tools/installer/core/project-instructions.js +2 -1
  68. package/tools/installer/core/subagent-models.js +112 -0
  69. package/tools/installer/ide/_config-driven.js +8 -3
@@ -0,0 +1,112 @@
1
+ // Modelo dos subagentes resolvido na instalação (2026-10-05).
2
+ //
3
+ // O spec.yaml pina um modelo por tier e plataforma. No Claude Code isso é um
4
+ // apelido (haiku/sonnet/opus/fable) que o próprio Claude Code aponta para a
5
+ // versão mais nova, então o arquivo passa intacto. O Codex não tem apelido de
6
+ // "mais novo": aqui o installer lê o cache de modelos do Codex desta máquina
7
+ // (~/.codex/models_cache.json) e troca o modelo pinado pelo mais novo da mesma
8
+ // classe (barato / do dia a dia / fronteira). Qualquer dúvida mantém o pinado:
9
+ // sem cache, cache mais velho que o spec (o pinado nem aparece nele), esforço
10
+ // que o modelo novo não suporta, ou JSON em formato inesperado.
11
+ //
12
+ // OpenCode e Gemini seguem pinados: falta uma fonte local confiável da lista
13
+ // de modelos deles.
14
+
15
+ const fs = require('node:fs');
16
+ const os = require('node:os');
17
+ const path = require('node:path');
18
+
19
+ const CLASS_PATTERNS = {
20
+ fast: /\b(fast|affordable|efficient|lightweight|cheap|mini|nano)\b/i,
21
+ frontier: /\b(frontier|most capable|most demanding|most intelligent)\b/i,
22
+ };
23
+ const OUTDATED = /\b(older|legacy|deprecated)\b/i;
24
+
25
+ function defaultCodexCachePath() {
26
+ return process.env.CODEX_MODELS_CACHE || path.join(os.homedir(), '.codex', 'models_cache.json');
27
+ }
28
+
29
+ function loadCodexCache(cachePath = defaultCodexCachePath()) {
30
+ try {
31
+ return JSON.parse(fs.readFileSync(cachePath, 'utf8'));
32
+ } catch {
33
+ return null;
34
+ }
35
+ }
36
+
37
+ // Classe pela descrição; um modelo antigo ("Older fast and efficient model")
38
+ // ainda casa a classe certa porque o padrão ignora o "Older".
39
+ function classOf(entry) {
40
+ const text = `${entry.slug} ${entry.description || ''}`;
41
+ if (CLASS_PATTERNS.frontier.test(text)) return 'frontier';
42
+ if (CLASS_PATTERNS.fast.test(text)) return 'fast';
43
+ return 'workhorse';
44
+ }
45
+
46
+ function isCurrent(entry) {
47
+ return entry.visibility === 'list' && !entry.upgrade && !OUTDATED.test(entry.description || '');
48
+ }
49
+
50
+ function supportsEffort(entry, effort) {
51
+ if (!effort) return true;
52
+ const levels = Array.isArray(entry.supported_reasoning_levels) ? entry.supported_reasoning_levels : [];
53
+ return levels.some((level) => level && level.effort === effort);
54
+ }
55
+
56
+ /**
57
+ * Modelo Codex mais novo da mesma classe do pinado, ou o próprio pinado.
58
+ * @param {string} pinned - modelo do spec
59
+ * @param {string|undefined} effort - model_reasoning_effort do arquivo
60
+ * @param {Object|null} cache - conteúdo de models_cache.json
61
+ */
62
+ function resolveCodexModel(pinned, effort, cache) {
63
+ const models = cache && Array.isArray(cache.models) ? cache.models.filter((m) => m && typeof m.slug === 'string') : null;
64
+ if (!models) return pinned;
65
+ const pinnedEntry = models.find((m) => m.slug === pinned);
66
+ // O pinado fora do cache = cache mais velho que o spec: nunca rebaixar.
67
+ if (!pinnedEntry) return pinned;
68
+ const wanted = classOf(pinnedEntry);
69
+ const newest = models
70
+ .filter((m) => isCurrent(m) && classOf(m) === wanted)
71
+ .sort((a, b) => (a.priority ?? Infinity) - (b.priority ?? Infinity))[0];
72
+ if (!newest || !supportsEffort(newest, effort)) return pinned;
73
+ return newest.slug;
74
+ }
75
+
76
+ function readModel(content) {
77
+ const match = content.match(/^model = "([^"]+)"$/m) || content.match(/^model: (\S+)$/m);
78
+ return match ? match[1] : null;
79
+ }
80
+
81
+ function replaceModel(content, from, to) {
82
+ return from && to && from !== to ? content.split(from).join(to) : content;
83
+ }
84
+
85
+ /**
86
+ * Conteúdo do subagente com o modelo resolvido para esta máquina.
87
+ * @param {string} content - arquivo gerado a partir do spec
88
+ * @param {string|undefined} platform - agents_source_subdir (codex, gemini...)
89
+ * @param {Object} [opts] - codexCache (objeto) ou codexCachePath
90
+ */
91
+ function renderSubagent(content, platform, opts = {}) {
92
+ if (platform !== 'codex') return content;
93
+ const pinned = readModel(content);
94
+ if (!pinned) return content;
95
+ const effort = (content.match(/^model_reasoning_effort = "([^"]+)"$/m) || [])[1];
96
+ const cache = opts.codexCache === undefined ? loadCodexCache(opts.codexCachePath) : opts.codexCache;
97
+ return replaceModel(content, pinned, resolveCodexModel(pinned, effort, cache));
98
+ }
99
+
100
+ /**
101
+ * Dois arquivos iguais a menos do modelo: um arquivo instalado com outro
102
+ * modelo resolvido continua sendo do Wizz (não precisa de backup).
103
+ */
104
+ function sameExceptModel(a, b) {
105
+ if (a === b) return true;
106
+ const modelA = readModel(a);
107
+ const modelB = readModel(b);
108
+ if (!modelA || !modelB) return false;
109
+ return a.split(modelA).join('<wizz-model>') === b.split(modelB).join('<wizz-model>');
110
+ }
111
+
112
+ module.exports = { renderSubagent, resolveCodexModel, sameExceptModel, loadCodexCache };
@@ -6,6 +6,7 @@ const prompts = require('../prompts');
6
6
  const { loadCsvCached } = require('../core/yaml-cache');
7
7
  const { WIZZ_FOLDER_NAME } = require('./shared/path-utils');
8
8
  const { findExistingWizzDir } = require('../core/wizz-dir');
9
+ const { renderSubagent, sameExceptModel } = require('../core/subagent-models');
9
10
  const { getInstalledCanonicalIds, isWizzOwnedEntry } = require('./shared/installed-skills');
10
11
 
11
12
  // Reserved OpenCode slash commands. A skill whose canonicalId collides with
@@ -567,7 +568,8 @@ class ConfigDrivenIdeSetup {
567
568
  }
568
569
  const existing = await fs.readFile(targetFile, 'utf8');
569
570
  const source = await fs.readFile(sourcePath, 'utf8');
570
- if (existing !== source) {
571
+ // Same file with another resolved model is still Wizz-generated.
572
+ if (!sameExceptModel(existing, source)) {
571
573
  const backupPath = await this._backupSubagentFile(targetFile, options, report);
572
574
  if (!backupPath) {
573
575
  report.preserved++;
@@ -576,7 +578,10 @@ class ConfigDrivenIdeSetup {
576
578
  report.backups++;
577
579
  }
578
580
  }
579
- await fs.copy(sourcePath, targetFile, { overwrite: true });
581
+ const rendered = renderSubagent(await fs.readFile(sourcePath, 'utf8'), config.agents_source_subdir, {
582
+ codexCachePath: options.codexModelsCachePath,
583
+ });
584
+ await fs.writeFile(targetFile, rendered);
580
585
  count++;
581
586
  report.installed++;
582
587
  } catch (error) {
@@ -930,7 +935,7 @@ class ConfigDrivenIdeSetup {
930
935
  // Exact source equality is the only proof that a source-backed file is
931
936
  // unchanged. Without a matching source, both current and legacy tiers
932
937
  // may contain customizations and must be backed up before removal.
933
- const generated = sourceContent !== undefined && content === sourceContent;
938
+ const generated = sourceContent !== undefined && sameExceptModel(content, sourceContent);
934
939
  if (!generated) {
935
940
  const backupPath = await this._backupSubagentFile(filePath, options, report);
936
941
  if (!backupPath) {