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.
- package/THIRD-PARTY-NOTICES.md +6 -0
- package/package.json +1 -1
- package/skills-registry.yaml +18 -6
- package/src/modules/wizz/_shared/model-ladder.md +7 -5
- package/src/modules/wizz/_shared/video-pipeline.md +1 -0
- package/src/modules/wizz/subagents/codex/wizz-exec-mechanical.toml +2 -2
- package/src/modules/wizz/subagents/codex/wizz-exec-review.toml +2 -2
- package/src/modules/wizz/subagents/codex/wizz-exec-standard.toml +2 -2
- package/src/modules/wizz/subagents/codex/wizz-exec-strong.toml +2 -2
- package/src/modules/wizz/subagents/spec.yaml +7 -4
- package/src/skills-lib/wizz-router/references/routing-table-flat.md +1 -0
- package/src/skills-lib/wizz-video-styles/SKILL.md +66 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/CREDITS.md +54 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/LIBRARIES.md +31 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/kit.json +182 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/music/acoustic-lifestyle.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/music/cinematic-tense.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/music/classical-light.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/music/corporate-light.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/music/lofi-chill.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/music/meme-beat.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/music/piano-editorial.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/music/tech-pulse.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/boom-impact.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/click-mouse.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/ding-notify.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/glitch-short.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/ka-ching.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/pop-bubble.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/record-scratch.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/riser-short.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/swoosh-text.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/typing-short.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/whoosh-fast.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/audio/sfx/whoosh-soft.mp3 +0 -0
- package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/EditorialReel.tsx +111 -0
- package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/README.md +77 -0
- package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/captions.tsx +56 -0
- package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/example-words.json +285 -0
- package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/primitives.tsx +241 -0
- package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/scenes.tsx +113 -0
- package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/theme.ts +68 -0
- package/src/skills-lib/wizz-video-styles/assets/remotion/editorial/timeline.ts +65 -0
- package/src/skills-lib/wizz-video-styles/data/recipes.json +341 -0
- package/src/skills-lib/wizz-video-styles/data/references.json +3397 -0
- package/src/skills-lib/wizz-video-styles/data/styles.json +726 -0
- package/src/skills-lib/wizz-video-styles/references/audio.md +54 -0
- package/src/skills-lib/wizz-video-styles/references/measured-patterns.md +38 -0
- package/src/skills-lib/wizz-video-styles/references/research-method.md +33 -0
- package/src/skills-lib/wizz-video-styles/references/style-picker.md +51 -0
- package/src/skills-lib/wizz-video-styles/references/styles/camera-no-setup.md +60 -0
- package/src/skills-lib/wizz-video-styles/references/styles/desafio-numero.md +60 -0
- package/src/skills-lib/wizz-video-styles/references/styles/esquete.md +57 -0
- package/src/skills-lib/wizz-video-styles/references/styles/experimento.md +56 -0
- package/src/skills-lib/wizz-video-styles/references/styles/explicador-animado.md +62 -0
- package/src/skills-lib/wizz-video-styles/references/styles/macro-asmr.md +61 -0
- package/src/skills-lib/wizz-video-styles/references/styles/meme-rapido.md +65 -0
- package/src/skills-lib/wizz-video-styles/references/styles/motion-editorial.md +69 -0
- package/src/skills-lib/wizz-video-styles/references/styles/podcast-clip.md +61 -0
- package/src/skills-lib/wizz-video-styles/references/styles/pov-vlog.md +57 -0
- package/src/skills-lib/wizz-video-styles/references/styles/quadro-branco.md +60 -0
- package/src/skills-lib/wizz-video-styles/references/styles/talking-head-cards.md +62 -0
- package/src/skills-lib/wizz-video-styles/references/styles/talking-head-legenda.md +62 -0
- package/src/skills-lib/wizz-video-styles/references/styles/tour.md +59 -0
- package/src/skills-lib/wizz-video-styles/scripts/analyze.sh +66 -0
- package/src/skills-lib/wizz-video-styles/scripts/build_catalog.py +128 -0
- package/tools/installer/core/project-instructions.js +2 -1
- package/tools/installer/core/subagent-models.js +112 -0
- 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
|
-
|
|
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.
|
|
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
|
|
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) {
|