@vxnus/siduri 0.0.5 → 0.0.6

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.
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const generator_1 = require("./generator");
4
+ describe('Instance Generator Composition Invariants (Phase 3)', () => {
5
+ const MOCK_MANIFESTS = {
6
+ brain: {
7
+ name: '@siduri-x/brain',
8
+ organType: 'brain',
9
+ version: '1.0.0',
10
+ displayName: 'Brain (Cognition & Planning)',
11
+ entrypoint: './dist/index.js',
12
+ factory: 'OpenRouterBrain',
13
+ configKey: 'brain',
14
+ configSchema: { type: 'object', properties: { provider: { type: 'string' }, model: { type: 'string' } } },
15
+ environment: [{ name: 'OPENROUTER_API_KEY', required: true, secret: true }],
16
+ services: [{ name: 'LLM Inference', kind: 'http_service' }],
17
+ },
18
+ hands: {
19
+ name: '@siduri-x/hands',
20
+ organType: 'hands',
21
+ version: '1.0.0',
22
+ displayName: 'Hands (MCP Tool Execution)',
23
+ entrypoint: './dist/index.js',
24
+ factory: 'DefaultHandsOrgan',
25
+ configKey: 'hands',
26
+ configSchema: { type: 'object', properties: { defaultTimeoutMs: { type: 'number' } } },
27
+ environment: [{ name: 'ACTION_POLICY_SECRET', required: true, secret: true }],
28
+ services: [],
29
+ },
30
+ memory: {
31
+ name: '@siduri-x/memory',
32
+ organType: 'memory',
33
+ version: '1.0.0',
34
+ displayName: 'Memory (PostgreSQL FTS Claims)',
35
+ entrypoint: './dist/index.js',
36
+ factory: 'PostgresMemoryOrgan',
37
+ configKey: 'memory',
38
+ configSchema: { type: 'object', properties: { provider: { type: 'string' } } },
39
+ environment: [{ name: 'DATABASE_URL', required: true, secret: true }],
40
+ services: [{ name: 'PostgreSQL', kind: 'database' }],
41
+ database: { engine: 'postgres', migrationsDir: './migrations' },
42
+ },
43
+ body: {
44
+ name: '@siduri-x/body',
45
+ organType: 'body',
46
+ version: '1.0.0',
47
+ displayName: 'Body (Live2D & Avatar State)',
48
+ entrypoint: './dist/index.js',
49
+ factory: 'NeutralBodyOrgan',
50
+ configKey: 'body',
51
+ configSchema: { type: 'object', properties: { provider: { type: 'string' } } },
52
+ environment: [],
53
+ services: [],
54
+ },
55
+ voice: {
56
+ name: '@siduri-x/voice',
57
+ organType: 'voice',
58
+ version: '1.0.0',
59
+ displayName: 'Voice (VOICEVOX Speech Synthesis)',
60
+ entrypoint: './dist/index.js',
61
+ factory: 'VoicevoxAdapter',
62
+ configKey: 'voice',
63
+ configSchema: { type: 'object', properties: { provider: { type: 'string' } } },
64
+ environment: [{ name: 'VOICEVOX_URL', default: 'http://localhost:50021' }],
65
+ services: [{ name: 'VOICEVOX', kind: 'http_service' }],
66
+ },
67
+ };
68
+ test('Composition A: Brain only', () => {
69
+ const files = (0, generator_1.generateInstanceFiles)({
70
+ name: 'brain-only-agent',
71
+ selectedManifests: [MOCK_MANIFESTS.brain],
72
+ });
73
+ const pkg = JSON.parse(files['package.json']);
74
+ expect(pkg.dependencies['@siduri-x/core']).toBeDefined();
75
+ expect(pkg.dependencies['@siduri-x/brain']).toBeDefined();
76
+ expect(pkg.dependencies['@siduri-x/memory']).toBeUndefined();
77
+ expect(pkg.dependencies['@siduri-x/hands']).toBeUndefined();
78
+ expect(pkg.dependencies['@siduri-x/voice']).toBeUndefined();
79
+ expect(pkg.dependencies['@siduri-x/body']).toBeUndefined();
80
+ // src/index.js
81
+ expect(files['src/index.js']).toContain("import { OpenRouterBrain } from '@siduri-x/brain'");
82
+ expect(files['src/index.js']).not.toContain('@siduri-x/hands');
83
+ expect(files['src/index.js']).not.toContain('@siduri-x/memory');
84
+ expect(files['src/index.js']).not.toContain('siduri-runtime.js');
85
+ // siduri.config.json
86
+ const config = JSON.parse(files['siduri.config.json']);
87
+ expect(config.organs.brain).toBeDefined();
88
+ expect(config.organs.hands).toBeUndefined();
89
+ expect(config.organs.memory).toBeUndefined();
90
+ // .env.example
91
+ expect(files['.env.example']).toContain('OPENROUTER_API_KEY');
92
+ expect(files['.env.example']).not.toContain('DATABASE_URL');
93
+ expect(files['.env.example']).not.toContain('ACTION_POLICY_SECRET');
94
+ // No body asset scaffold
95
+ expect(files.createAssetsBodyDir).toBe(false);
96
+ });
97
+ test('Composition B: Brain + Hands', () => {
98
+ const files = (0, generator_1.generateInstanceFiles)({
99
+ name: 'coding-agent',
100
+ selectedManifests: [MOCK_MANIFESTS.brain, MOCK_MANIFESTS.hands],
101
+ });
102
+ const pkg = JSON.parse(files['package.json']);
103
+ expect(pkg.dependencies['@siduri-x/core']).toBeDefined();
104
+ expect(pkg.dependencies['@siduri-x/brain']).toBeDefined();
105
+ expect(pkg.dependencies['@siduri-x/hands']).toBeDefined();
106
+ expect(pkg.dependencies['@siduri-x/memory']).toBeUndefined();
107
+ // src/index.js
108
+ expect(files['src/index.js']).toContain("import { OpenRouterBrain } from '@siduri-x/brain'");
109
+ expect(files['src/index.js']).toContain("import { DefaultHandsOrgan } from '@siduri-x/hands'");
110
+ expect(files['src/index.js']).not.toContain('@siduri-x/memory');
111
+ // .env.example
112
+ expect(files['.env.example']).toContain('OPENROUTER_API_KEY');
113
+ expect(files['.env.example']).toContain('ACTION_POLICY_SECRET');
114
+ expect(files['.env.example']).not.toContain('DATABASE_URL');
115
+ expect(files.createAssetsBodyDir).toBe(false);
116
+ });
117
+ test('Composition C: Brain + Memory', () => {
118
+ const files = (0, generator_1.generateInstanceFiles)({
119
+ name: 'memory-agent',
120
+ selectedManifests: [MOCK_MANIFESTS.brain, MOCK_MANIFESTS.memory],
121
+ });
122
+ const pkg = JSON.parse(files['package.json']);
123
+ expect(pkg.dependencies['@siduri-x/core']).toBeDefined();
124
+ expect(pkg.dependencies['@siduri-x/brain']).toBeDefined();
125
+ expect(pkg.dependencies['@siduri-x/memory']).toBeDefined();
126
+ expect(pkg.dependencies['@siduri-x/hands']).toBeUndefined();
127
+ // .env.example
128
+ expect(files['.env.example']).toContain('OPENROUTER_API_KEY');
129
+ expect(files['.env.example']).toContain('DATABASE_URL');
130
+ expect(files['.env.example']).not.toContain('ACTION_POLICY_SECRET');
131
+ // README mentions database
132
+ expect(files['README.md']).toContain('DATABASE_URL');
133
+ expect(files['README.md']).toContain('npx @vxnus/siduri db push');
134
+ });
135
+ test('Composition D: Full with Body', () => {
136
+ const files = (0, generator_1.generateInstanceFiles)({
137
+ name: 'companion-full',
138
+ selectedManifests: [
139
+ MOCK_MANIFESTS.brain,
140
+ MOCK_MANIFESTS.memory,
141
+ MOCK_MANIFESTS.hands,
142
+ MOCK_MANIFESTS.body,
143
+ MOCK_MANIFESTS.voice,
144
+ ],
145
+ });
146
+ const pkg = JSON.parse(files['package.json']);
147
+ expect(pkg.dependencies['@siduri-x/core']).toBeDefined();
148
+ expect(pkg.dependencies['@siduri-x/brain']).toBeDefined();
149
+ expect(pkg.dependencies['@siduri-x/memory']).toBeDefined();
150
+ expect(pkg.dependencies['@siduri-x/hands']).toBeDefined();
151
+ expect(pkg.dependencies['@siduri-x/body']).toBeDefined();
152
+ expect(pkg.dependencies['@siduri-x/voice']).toBeDefined();
153
+ // Body asset directory requested
154
+ expect(files.createAssetsBodyDir).toBe(true);
155
+ // README mentions Live2D model assets
156
+ expect(files['README.md']).toContain('assets/body/model');
157
+ });
158
+ });
package/dist/index.d.ts CHANGED
@@ -1,2 +1,4 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export declare function runCreateWizard(targetDir?: string): Promise<void>;
3
+ export declare function runCliDoctor(targetDir?: string): Promise<void>;
4
+ export declare function runCliDb(subcommand?: string, targetDir?: string): Promise<void>;