sinapse-ai 1.25.2 → 1.26.0
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/.agents/skills/react-bits-frontend/SKILL.md +13 -4
- package/.claude/skill-manifest.json +1 -0
- package/.claude/skills/react-bits-frontend/SKILL.md +75 -0
- package/.codex/scripts/sync-codex-native.js +12 -0
- package/.sinapse-ai/data/entity-registry.yaml +39 -14
- package/.sinapse-ai/install-manifest.yaml +3 -3
- package/CHANGELOG.md +8 -7
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/bin/commands/install.js +25 -4
- package/bin/commands/uninstall.js +1 -1
- package/bin/commands/update.js +19 -3
- package/bin/lib/command-generator.js +60 -36
- package/bin/lib/global-provider-adapters.js +257 -50
- package/bin/lib/provider-contract.js +25 -0
- package/bin/lib/provider-parity.js +67 -10
- package/docs/guides/ide-integration.md +1 -1
- package/package.json +1 -1
- package/packages/installer/src/installer/react-bits-corpus.js +90 -0
- package/packages/installer/src/installer/sinapse-ai-installer.js +9 -0
- package/scripts/sync-provider-adapters.js +7 -2
- package/scripts/validate-provider-adapters.js +21 -1
- package/squads/squad-animations/agents/animations-orqx.md +7 -0
- package/squads/squad-animations/squad.yaml +1 -1
|
@@ -14,6 +14,7 @@ const path = require('path');
|
|
|
14
14
|
const crypto = require('crypto');
|
|
15
15
|
const ora = require('ora');
|
|
16
16
|
const { hashFile } = require('./file-hasher');
|
|
17
|
+
const { copyReactBitsCorpusSync } = require('./react-bits-corpus');
|
|
17
18
|
|
|
18
19
|
const NOFOLLOW_READ_FLAGS = nativeFs.constants.O_RDONLY | (nativeFs.constants.O_NOFOLLOW || 0);
|
|
19
20
|
|
|
@@ -705,6 +706,13 @@ async function installSinapseCore(options = {}) {
|
|
|
705
706
|
if (claudeSettings) result.installedFiles.push(claudeSettings);
|
|
706
707
|
}
|
|
707
708
|
|
|
709
|
+
if (includeClaude || includeCodex) {
|
|
710
|
+
spinner.text = 'Copying React Bits corpus...';
|
|
711
|
+
const corpusFiles = copyReactBitsCorpusSync(pkgRoot, targetDir);
|
|
712
|
+
result.reactBitsCorpusFiles = corpusFiles.length;
|
|
713
|
+
result.installedFiles.push(...corpusFiles);
|
|
714
|
+
}
|
|
715
|
+
|
|
708
716
|
// AGENTS.md is the Codex CLI's default context file (Imperator greeting +
|
|
709
717
|
// the full agent roster). It lives at the package ROOT (not under .codex/ or
|
|
710
718
|
// .sinapse-ai/), so neither loop above reaches it. Without it, a Codex user's
|
|
@@ -878,6 +886,7 @@ module.exports = {
|
|
|
878
886
|
deliverClaudeNativeAdapters,
|
|
879
887
|
getClaudeHookName,
|
|
880
888
|
reconcileClaudeHookSettings,
|
|
889
|
+
copyReactBitsCorpusSync,
|
|
881
890
|
FOLDERS_TO_COPY,
|
|
882
891
|
ROOT_FILES_TO_COPY,
|
|
883
892
|
CODEX_ROOT_FILES,
|
|
@@ -11,10 +11,12 @@ const {
|
|
|
11
11
|
syncCodexNativeAgents,
|
|
12
12
|
} = require('../.codex/scripts/sync-codex-native');
|
|
13
13
|
const { resolveCodexAgent } = require('../.codex/scripts/resolve-codex-agent');
|
|
14
|
+
const { GLOBAL_SUPPLEMENTAL_PROVIDER_SKILL_IDS } = require('../bin/lib/provider-contract');
|
|
14
15
|
|
|
15
16
|
const PROJECT_ROOT = path.resolve(__dirname, '..');
|
|
16
17
|
const CLAUDE_AGENTS_DIR = '.claude/agents';
|
|
17
18
|
const CLAUDE_SKILLS_DIR = '.claude/skills';
|
|
19
|
+
const SUPPLEMENTAL_PROVIDER_SKILL_IDS = GLOBAL_SUPPLEMENTAL_PROVIDER_SKILL_IDS;
|
|
18
20
|
|
|
19
21
|
function writeFileAtomically(filePath, content) {
|
|
20
22
|
const temporaryPath = `${filePath}.${process.pid}.${Date.now()}.tmp`;
|
|
@@ -136,11 +138,13 @@ function collectClaudeSkills(projectRoot = PROJECT_ROOT) {
|
|
|
136
138
|
catalog.genericAgentSkillId,
|
|
137
139
|
])].sort();
|
|
138
140
|
|
|
139
|
-
return skillIds.map((skillId) => {
|
|
141
|
+
return [...new Set([...skillIds, ...SUPPLEMENTAL_PROVIDER_SKILL_IDS])].sort().map((skillId) => {
|
|
140
142
|
const nativePath = path.join(projectRoot, '.agents', 'skills', skillId, 'SKILL.md');
|
|
141
143
|
const metadata = parseSkillMetadata(fs.readFileSync(nativePath, 'utf8'));
|
|
142
144
|
let content;
|
|
143
|
-
if (skillId
|
|
145
|
+
if (SUPPLEMENTAL_PROVIDER_SKILL_IDS.includes(skillId)) {
|
|
146
|
+
content = fs.readFileSync(nativePath, 'utf8');
|
|
147
|
+
} else if (skillId === catalog.genericAgentSkillId) {
|
|
144
148
|
content = renderClaudeGenericSkill(skillId, metadata.description);
|
|
145
149
|
} else if (skillId === 'sinapse-loop' || skillId === 'sinapse-spec-driven') {
|
|
146
150
|
content = renderClaudeWorkflowSkill(skillId, metadata.description);
|
|
@@ -195,6 +199,7 @@ if (require.main === module) main();
|
|
|
195
199
|
module.exports = {
|
|
196
200
|
CLAUDE_AGENTS_DIR,
|
|
197
201
|
CLAUDE_SKILLS_DIR,
|
|
202
|
+
SUPPLEMENTAL_PROVIDER_SKILL_IDS,
|
|
198
203
|
claudeAgentFileName,
|
|
199
204
|
renderClaudeAgent,
|
|
200
205
|
collectClaudeSkills,
|
|
@@ -8,6 +8,11 @@ const yaml = require('js-yaml');
|
|
|
8
8
|
const legacyClaudeCommandHashes = require('../packages/installer/src/migrations/legacy-claude-agent-command-hashes.json');
|
|
9
9
|
|
|
10
10
|
const { validateNativeCodex } = require('../.codex/scripts/validate-codex-native');
|
|
11
|
+
const {
|
|
12
|
+
REACT_BITS_CORPUS_RELATIVE_PATH,
|
|
13
|
+
REQUIRED_REACT_BITS_CORPUS_FILES,
|
|
14
|
+
hasCompleteReactBitsCorpus,
|
|
15
|
+
} = require('../packages/installer/src/installer/react-bits-corpus');
|
|
11
16
|
|
|
12
17
|
const PROJECT_ROOT = path.resolve(__dirname, '..');
|
|
13
18
|
|
|
@@ -125,10 +130,13 @@ function validateClaudeNative(projectRoot = PROJECT_ROOT) {
|
|
|
125
130
|
try {
|
|
126
131
|
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
127
132
|
expectedSkills = (manifest.skillIds || []).map((skillId) => ({ skillId }));
|
|
128
|
-
if (expectedSkills.length !==
|
|
133
|
+
if (expectedSkills.length !== 37) errors.push(`Claude skill manifest must contain 37 IDs, found ${expectedSkills.length}`);
|
|
129
134
|
for (const alias of ['sinapse', 'sinapse-orqx', 'snps', 'snps-orqx', 'sinapse-agent']) {
|
|
130
135
|
if (!manifest.skillIds.includes(alias)) errors.push(`Claude skill manifest is missing public alias ${alias}`);
|
|
131
136
|
}
|
|
137
|
+
if (!manifest.skillIds.includes('react-bits-frontend')) {
|
|
138
|
+
errors.push('Claude skill manifest is missing react-bits-frontend');
|
|
139
|
+
}
|
|
132
140
|
} catch (error) {
|
|
133
141
|
errors.push(`Claude skill manifest: ${error.message}`);
|
|
134
142
|
}
|
|
@@ -209,6 +217,17 @@ function validateProviderAdapters(projectRoot = PROJECT_ROOT) {
|
|
|
209
217
|
if (!pkg.files.includes(entry)) errors.push(`package.json files[] is missing ${entry}`);
|
|
210
218
|
}
|
|
211
219
|
if (pkg.files.includes('.codex/skills/')) errors.push('package.json must not publish the legacy .codex/skills root');
|
|
220
|
+
if (!hasCompleteReactBitsCorpus(projectRoot)) {
|
|
221
|
+
errors.push(`React Bits corpus is incomplete: expected ${REQUIRED_REACT_BITS_CORPUS_FILES.length} files under ${REACT_BITS_CORPUS_RELATIVE_PATH}`);
|
|
222
|
+
}
|
|
223
|
+
for (const relativePath of [
|
|
224
|
+
path.join('.agents', 'skills', 'react-bits-frontend', 'SKILL.md'),
|
|
225
|
+
path.join('.claude', 'skills', 'react-bits-frontend', 'SKILL.md'),
|
|
226
|
+
]) {
|
|
227
|
+
if (!fs.existsSync(path.join(projectRoot, relativePath))) {
|
|
228
|
+
errors.push(`React Bits provider skill is missing: ${relativePath}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
212
231
|
return {
|
|
213
232
|
ok: errors.length === 0,
|
|
214
233
|
errors,
|
|
@@ -240,4 +259,5 @@ module.exports = {
|
|
|
240
259
|
validateClaudeHookSettings,
|
|
241
260
|
validateClaudeNative,
|
|
242
261
|
validateProviderAdapters,
|
|
262
|
+
REQUIRED_REACT_BITS_CORPUS_FILES,
|
|
243
263
|
};
|
|
@@ -28,6 +28,8 @@ Kinetic e o diretor da squad. Recebe os Animation Briefs do Decoder (animation-i
|
|
|
28
28
|
- Garantir coesao entre animacoes de diferentes agentes
|
|
29
29
|
- Orquestrar o workflow prompt-to-animation-cycle
|
|
30
30
|
- Gerar relatorios de entrega
|
|
31
|
+
- Roteiar trabalho React Bits pelo task `orchestrate-react-bits-frontend` e pelo
|
|
32
|
+
corpus operacional antes de delegar implementacao
|
|
31
33
|
|
|
32
34
|
## Pipeline de Orquestracao
|
|
33
35
|
|
|
@@ -64,6 +66,7 @@ Kinetic → Review final → Entrega
|
|
|
64
66
|
| Hover effects | css-motion-artist | shader-artist |
|
|
65
67
|
| Loading animations | css-motion-artist | motion-choreographer |
|
|
66
68
|
| Camera movements 3D | threejs-architect | motion-choreographer |
|
|
69
|
+
| React Bits frontend | orchestrate-react-bits-frontend | animation-performance-engineer |
|
|
67
70
|
|
|
68
71
|
## Criterios de Qualidade
|
|
69
72
|
|
|
@@ -86,6 +89,7 @@ Toda animacao deve passar por:
|
|
|
86
89
|
| Definir timing e coreografia | motion-choreographer (Tempo) |
|
|
87
90
|
| Implementar scroll animation | scroll-narrative-engineer (Parallax) |
|
|
88
91
|
| Criar sistema de particulas | generative-particle-engineer (Cloud) |
|
|
92
|
+
| Orquestrar frontend React Bits | orchestrate-react-bits-frontend |
|
|
89
93
|
| Otimizar performance | animation-performance-engineer (Benchmark) |
|
|
90
94
|
|
|
91
95
|
## NON-NEGOTIABLE: ORCHESTRATE, DON'T EXECUTE
|
|
@@ -135,6 +139,9 @@ integration:
|
|
|
135
139
|
- agent: "animation-performance-engineer (Benchmark)"
|
|
136
140
|
when: "Quality gate before delivery — perf audit, 60fps validation, mobile check"
|
|
137
141
|
context_passed: "all built animations, target devices, perf budget"
|
|
142
|
+
- agent: "orchestrate-react-bits-frontend"
|
|
143
|
+
when: "Frontend request that needs React Bits discovery, selection, installation or implementation"
|
|
144
|
+
context_passed: "project stack, target surface, desired interaction, accessibility and performance constraints"
|
|
138
145
|
receives_from:
|
|
139
146
|
- agent: "@sinapse-orqx (Imperator)"
|
|
140
147
|
when: "Animation/motion request routed from ecosystem"
|