aios-core 4.2.13 ā 4.2.15
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/.aios-core/core/code-intel/helpers/dev-helper.js +206 -0
- package/.aios-core/core/registry/registry-schema.json +166 -166
- package/.aios-core/core/synapse/diagnostics/collectors/hook-collector.js +3 -3
- package/.aios-core/data/entity-registry.yaml +27 -0
- package/.aios-core/development/scripts/approval-workflow.js +642 -642
- package/.aios-core/development/scripts/backup-manager.js +606 -606
- package/.aios-core/development/scripts/branch-manager.js +389 -389
- package/.aios-core/development/scripts/code-quality-improver.js +1311 -1311
- package/.aios-core/development/scripts/commit-message-generator.js +849 -849
- package/.aios-core/development/scripts/conflict-resolver.js +674 -674
- package/.aios-core/development/scripts/dependency-analyzer.js +637 -637
- package/.aios-core/development/scripts/diff-generator.js +351 -351
- package/.aios-core/development/scripts/elicitation-engine.js +384 -384
- package/.aios-core/development/scripts/elicitation-session-manager.js +299 -299
- package/.aios-core/development/scripts/git-wrapper.js +461 -461
- package/.aios-core/development/scripts/manifest-preview.js +244 -244
- package/.aios-core/development/scripts/metrics-tracker.js +775 -775
- package/.aios-core/development/scripts/modification-validator.js +554 -554
- package/.aios-core/development/scripts/pattern-learner.js +1224 -1224
- package/.aios-core/development/scripts/performance-analyzer.js +757 -757
- package/.aios-core/development/scripts/refactoring-suggester.js +1138 -1138
- package/.aios-core/development/scripts/rollback-handler.js +530 -530
- package/.aios-core/development/scripts/security-checker.js +358 -358
- package/.aios-core/development/scripts/template-engine.js +239 -239
- package/.aios-core/development/scripts/template-validator.js +278 -278
- package/.aios-core/development/scripts/test-generator.js +843 -843
- package/.aios-core/development/scripts/transaction-manager.js +589 -589
- package/.aios-core/development/scripts/usage-tracker.js +673 -673
- package/.aios-core/development/scripts/validate-filenames.js +226 -226
- package/.aios-core/development/scripts/version-tracker.js +526 -526
- package/.aios-core/development/scripts/yaml-validator.js +396 -396
- package/.aios-core/development/tasks/build-autonomous.md +10 -4
- package/.aios-core/development/tasks/create-service.md +23 -0
- package/.aios-core/development/tasks/dev-develop-story.md +12 -6
- package/.aios-core/development/tasks/dev-suggest-refactoring.md +7 -1
- package/.aios-core/development/tasks/publish-npm.md +3 -3
- package/.aios-core/hooks/unified/README.md +1 -1
- package/.aios-core/install-manifest.yaml +65 -61
- package/.aios-core/manifests/schema/manifest-schema.json +190 -190
- package/.aios-core/product/templates/component-react-tmpl.tsx +98 -98
- package/.aios-core/product/templates/engine/schemas/adr.schema.json +102 -102
- package/.aios-core/product/templates/engine/schemas/dbdr.schema.json +205 -205
- package/.aios-core/product/templates/engine/schemas/epic.schema.json +175 -175
- package/.aios-core/product/templates/engine/schemas/pmdr.schema.json +175 -175
- package/.aios-core/product/templates/engine/schemas/prd-v2.schema.json +300 -300
- package/.aios-core/product/templates/engine/schemas/prd.schema.json +152 -152
- package/.aios-core/product/templates/engine/schemas/story.schema.json +222 -222
- package/.aios-core/product/templates/engine/schemas/task.schema.json +154 -154
- package/.aios-core/product/templates/eslintrc-security.json +32 -32
- package/.aios-core/product/templates/github-actions-cd.yml +212 -212
- package/.aios-core/product/templates/github-actions-ci.yml +172 -172
- package/.aios-core/product/templates/shock-report-tmpl.html +502 -502
- package/.aios-core/product/templates/token-exports-css-tmpl.css +240 -240
- package/.aios-core/quality/schemas/quality-metrics.schema.json +233 -233
- package/.aios-core/scripts/migrate-framework-docs.sh +300 -300
- package/README.en.md +747 -0
- package/README.md +4 -2
- package/bin/aios.js +7 -4
- package/package.json +1 -1
- package/packages/aios-pro-cli/src/recover.js +1 -1
- package/packages/installer/src/wizard/ide-config-generator.js +6 -6
- package/packages/installer/src/wizard/pro-setup.js +3 -3
- package/pro/license/degradation.js +220 -220
- package/pro/license/errors.js +450 -450
- package/pro/license/feature-gate.js +354 -354
- package/pro/license/index.js +181 -181
- package/pro/license/license-cache.js +523 -523
- package/pro/license/license-crypto.js +303 -303
- package/scripts/package-synapse.js +5 -5
- package/scripts/validate-package-completeness.js +3 -3
- package/.aios-core/.session/current-session.json +0 -14
- package/.aios-core/data/registry-update-log.jsonl +0 -191
- package/.aios-core/docs/SHARD-TRANSLATION-GUIDE.md +0 -335
- package/.aios-core/docs/component-creation-guide.md +0 -458
- package/.aios-core/docs/session-update-pattern.md +0 -307
- package/.aios-core/docs/standards/AIOS-FRAMEWORK-MASTER.md +0 -1963
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1-SUMMARY.md +0 -1190
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO-V2.1.md +0 -439
- package/.aios-core/docs/standards/AIOS-LIVRO-DE-OURO.md +0 -5398
- package/.aios-core/docs/standards/V3-ARCHITECTURAL-DECISIONS.md +0 -523
- package/.aios-core/docs/template-syntax.md +0 -267
- package/.aios-core/docs/troubleshooting-guide.md +0 -625
- package/.aios-core/infrastructure/tests/utilities-audit-results.json +0 -501
- package/.aios-core/manifests/agents.csv +0 -29
- package/.aios-core/manifests/tasks.csv +0 -198
- package/.aios-core/manifests/workers.csv +0 -204
- package/.claude/rules/agent-authority.md +0 -105
- package/.claude/rules/coderabbit-integration.md +0 -93
- package/.claude/rules/ids-principles.md +0 -112
- package/.claude/rules/story-lifecycle.md +0 -139
- package/.claude/rules/workflow-execution.md +0 -150
- package/scripts/glue/README.md +0 -355
- package/scripts/glue/compose-agent-prompt.cjs +0 -362
- /package/.claude/hooks/{precompact-session-digest.js ā precompact-session-digest.cjs} +0 -0
- /package/.claude/hooks/{synapse-engine.js ā synapse-engine.cjs} +0 -0
|
@@ -1,245 +1,245 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Manifest Preview Utility
|
|
3
|
-
* Shows diff view for manifest updates
|
|
4
|
-
* @module manifest-preview
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
const fs = require('fs-extra');
|
|
8
|
-
const path = require('path');
|
|
9
|
-
const yaml = require('js-yaml');
|
|
10
|
-
const ComponentPreview = require('./component-preview');
|
|
11
|
-
const chalk = require('chalk');
|
|
12
|
-
|
|
13
|
-
class ManifestPreview {
|
|
14
|
-
constructor(rootPath) {
|
|
15
|
-
this.rootPath = rootPath || process.cwd();
|
|
16
|
-
this.manifestPath = path.join(this.rootPath, 'aios-core', 'team-manifest.yaml');
|
|
17
|
-
this.componentPreview = new ComponentPreview();
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
/**
|
|
21
|
-
* Preview manifest update for a new component
|
|
22
|
-
* @param {string} componentType - Type of component
|
|
23
|
-
* @param {Object} componentInfo - Component information
|
|
24
|
-
* @returns {Promise<Object>} Preview result with diff
|
|
25
|
-
*/
|
|
26
|
-
async previewManifestUpdate(componentType, componentInfo) {
|
|
27
|
-
try {
|
|
28
|
-
// Read current manifest
|
|
29
|
-
const currentContent = await fs.readFile(this.manifestPath, 'utf8');
|
|
30
|
-
const manifest = yaml.load(currentContent);
|
|
31
|
-
|
|
32
|
-
// Create updated manifest
|
|
33
|
-
const updatedManifest = this.addComponentToManifest(manifest, componentType, componentInfo);
|
|
34
|
-
const updatedContent = yaml.dump(updatedManifest, {
|
|
35
|
-
styles: {
|
|
36
|
-
'!!null': 'canonical'
|
|
37
|
-
},
|
|
38
|
-
sortKeys: false
|
|
39
|
-
});
|
|
40
|
-
|
|
41
|
-
// Generate diff preview
|
|
42
|
-
const diff = this.componentPreview.generateManifestDiff(currentContent, updatedContent);
|
|
43
|
-
|
|
44
|
-
return {
|
|
45
|
-
success: true,
|
|
46
|
-
diff,
|
|
47
|
-
currentContent,
|
|
48
|
-
updatedContent,
|
|
49
|
-
changes: this.summarizeChanges(manifest, updatedManifest)
|
|
50
|
-
};
|
|
51
|
-
} catch (error) {
|
|
52
|
-
return {
|
|
53
|
-
success: false,
|
|
54
|
-
error: error.message
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
/**
|
|
60
|
-
* Add component to manifest structure
|
|
61
|
-
* @private
|
|
62
|
-
*/
|
|
63
|
-
addComponentToManifest(manifest, componentType, componentInfo) {
|
|
64
|
-
const updated = JSON.parse(JSON.stringify(manifest)); // Deep clone
|
|
65
|
-
|
|
66
|
-
switch (componentType) {
|
|
67
|
-
case 'agent':
|
|
68
|
-
if (!updated.team) updated.team = {};
|
|
69
|
-
if (!updated.team.agents) updated.team.agents = [];
|
|
70
|
-
|
|
71
|
-
// Check if agent already exists
|
|
72
|
-
const existingAgentIndex = updated.team.agents.findIndex(
|
|
73
|
-
a => a.id === componentInfo.id
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
if (existingAgentIndex >= 0) {
|
|
77
|
-
// Update existing
|
|
78
|
-
updated.team.agents[existingAgentIndex] = {
|
|
79
|
-
id: componentInfo.id,
|
|
80
|
-
path: `agents/${componentInfo.id}.md`,
|
|
81
|
-
name: componentInfo.name || componentInfo.id,
|
|
82
|
-
...(componentInfo.description && { description: componentInfo.description })
|
|
83
|
-
};
|
|
84
|
-
} else {
|
|
85
|
-
// Add new
|
|
86
|
-
updated.team.agents.push({
|
|
87
|
-
id: componentInfo.id,
|
|
88
|
-
path: `agents/${componentInfo.id}.md`,
|
|
89
|
-
name: componentInfo.name || componentInfo.id,
|
|
90
|
-
...(componentInfo.description && { description: componentInfo.description })
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
break;
|
|
94
|
-
|
|
95
|
-
case 'workflow':
|
|
96
|
-
if (!updated.workflows) updated.workflows = [];
|
|
97
|
-
|
|
98
|
-
const existingWorkflowIndex = updated.workflows.findIndex(
|
|
99
|
-
w => w.id === componentInfo.id
|
|
100
|
-
);
|
|
101
|
-
|
|
102
|
-
if (existingWorkflowIndex >= 0) {
|
|
103
|
-
updated.workflows[existingWorkflowIndex] = {
|
|
104
|
-
id: componentInfo.id,
|
|
105
|
-
path: `workflows/${componentInfo.id}.yaml`,
|
|
106
|
-
name: componentInfo.name || componentInfo.id,
|
|
107
|
-
type: componentInfo.type || 'standard',
|
|
108
|
-
...(componentInfo.description && { description: componentInfo.description })
|
|
109
|
-
};
|
|
110
|
-
} else {
|
|
111
|
-
updated.workflows.push({
|
|
112
|
-
id: componentInfo.id,
|
|
113
|
-
path: `workflows/${componentInfo.id}.yaml`,
|
|
114
|
-
name: componentInfo.name || componentInfo.id,
|
|
115
|
-
type: componentInfo.type || 'standard',
|
|
116
|
-
...(componentInfo.description && { description: componentInfo.description })
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
break;
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
// Update metadata
|
|
123
|
-
if (!updated.metadata) updated.metadata = {};
|
|
124
|
-
updated.metadata.lastUpdated = new Date().toISOString();
|
|
125
|
-
updated.metadata.version = this.incrementVersion(updated.metadata.version || '1.0.0');
|
|
126
|
-
|
|
127
|
-
return updated;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Increment semantic version
|
|
132
|
-
* @private
|
|
133
|
-
*/
|
|
134
|
-
incrementVersion(version) {
|
|
135
|
-
const parts = version.split('.');
|
|
136
|
-
parts[2] = String(parseInt(parts[2] || '0') + 1);
|
|
137
|
-
return parts.join('.');
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
/**
|
|
141
|
-
* Summarize changes made to manifest
|
|
142
|
-
* @private
|
|
143
|
-
*/
|
|
144
|
-
summarizeChanges(oldManifest, newManifest) {
|
|
145
|
-
const changes = [];
|
|
146
|
-
|
|
147
|
-
// Check agents
|
|
148
|
-
const oldAgents = oldManifest.team?.agents || [];
|
|
149
|
-
const newAgents = newManifest.team?.agents || [];
|
|
150
|
-
|
|
151
|
-
if (newAgents.length > oldAgents.length) {
|
|
152
|
-
const added = newAgents.slice(oldAgents.length);
|
|
153
|
-
added.forEach(agent => {
|
|
154
|
-
changes.push({
|
|
155
|
-
type: 'added',
|
|
156
|
-
category: 'agent',
|
|
157
|
-
item: agent.id
|
|
158
|
-
});
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
// Check workflows
|
|
163
|
-
const oldWorkflows = oldManifest.workflows || [];
|
|
164
|
-
const newWorkflows = newManifest.workflows || [];
|
|
165
|
-
|
|
166
|
-
if (newWorkflows.length > oldWorkflows.length) {
|
|
167
|
-
const added = newWorkflows.slice(oldWorkflows.length);
|
|
168
|
-
added.forEach(workflow => {
|
|
169
|
-
changes.push({
|
|
170
|
-
type: 'added',
|
|
171
|
-
category: 'workflow',
|
|
172
|
-
item: workflow.id
|
|
173
|
-
});
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
// Version change
|
|
178
|
-
if (oldManifest.metadata?.version !== newManifest.metadata?.version) {
|
|
179
|
-
changes.push({
|
|
180
|
-
type: 'updated',
|
|
181
|
-
category: 'version',
|
|
182
|
-
from: oldManifest.metadata?.version || '1.0.0',
|
|
183
|
-
to: newManifest.metadata?.version
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
return changes;
|
|
188
|
-
}
|
|
189
|
-
|
|
190
|
-
/**
|
|
191
|
-
* Apply manifest update after preview
|
|
192
|
-
* @param {string} updatedContent - New manifest content
|
|
193
|
-
*/
|
|
194
|
-
async applyManifestUpdate(updatedContent) {
|
|
195
|
-
await fs.writeFile(this.manifestPath, updatedContent, 'utf8');
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
/**
|
|
199
|
-
* Show interactive manifest update prompt
|
|
200
|
-
* @param {string} componentType - Type of component
|
|
201
|
-
* @param {Object} componentInfo - Component information
|
|
202
|
-
* @returns {Promise<boolean>} Whether update was applied
|
|
203
|
-
*/
|
|
204
|
-
async interactiveManifestUpdate(componentType, componentInfo) {
|
|
205
|
-
const preview = await this.previewManifestUpdate(componentType, componentInfo);
|
|
206
|
-
|
|
207
|
-
if (!preview.success) {
|
|
208
|
-
console.log(chalk.red(`\nā Failed to preview manifest update: ${preview.error}`));
|
|
209
|
-
return false;
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
// Show diff
|
|
213
|
-
console.log(preview.diff);
|
|
214
|
-
|
|
215
|
-
// Show change summary
|
|
216
|
-
console.log(chalk.cyan('\nš Summary of changes:'));
|
|
217
|
-
preview.changes.forEach(change => {
|
|
218
|
-
if (change.type === 'added') {
|
|
219
|
-
console.log(chalk.green(` + Added ${change.category}: ${change.item}`));
|
|
220
|
-
} else if (change.type === 'updated') {
|
|
221
|
-
console.log(chalk.yellow(` ~ Updated ${change.category}: ${change.from} ā ${change.to}`));
|
|
222
|
-
}
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
// Confirm update
|
|
226
|
-
const inquirer = require('inquirer');
|
|
227
|
-
const { confirm } = await inquirer.prompt([{
|
|
228
|
-
type: 'confirm',
|
|
229
|
-
name: 'confirm',
|
|
230
|
-
message: 'Apply these changes to team-manifest.yaml?',
|
|
231
|
-
default: true
|
|
232
|
-
}]);
|
|
233
|
-
|
|
234
|
-
if (confirm) {
|
|
235
|
-
await this.applyManifestUpdate(preview.updatedContent);
|
|
236
|
-
console.log(chalk.green('\nā
Manifest updated successfully!'));
|
|
237
|
-
return true;
|
|
238
|
-
}
|
|
239
|
-
|
|
240
|
-
console.log(chalk.yellow('\nā ļø Manifest update cancelled'));
|
|
241
|
-
return false;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
|
|
1
|
+
/**
|
|
2
|
+
* Manifest Preview Utility
|
|
3
|
+
* Shows diff view for manifest updates
|
|
4
|
+
* @module manifest-preview
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const fs = require('fs-extra');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const yaml = require('js-yaml');
|
|
10
|
+
const ComponentPreview = require('./component-preview');
|
|
11
|
+
const chalk = require('chalk');
|
|
12
|
+
|
|
13
|
+
class ManifestPreview {
|
|
14
|
+
constructor(rootPath) {
|
|
15
|
+
this.rootPath = rootPath || process.cwd();
|
|
16
|
+
this.manifestPath = path.join(this.rootPath, 'aios-core', 'team-manifest.yaml');
|
|
17
|
+
this.componentPreview = new ComponentPreview();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Preview manifest update for a new component
|
|
22
|
+
* @param {string} componentType - Type of component
|
|
23
|
+
* @param {Object} componentInfo - Component information
|
|
24
|
+
* @returns {Promise<Object>} Preview result with diff
|
|
25
|
+
*/
|
|
26
|
+
async previewManifestUpdate(componentType, componentInfo) {
|
|
27
|
+
try {
|
|
28
|
+
// Read current manifest
|
|
29
|
+
const currentContent = await fs.readFile(this.manifestPath, 'utf8');
|
|
30
|
+
const manifest = yaml.load(currentContent);
|
|
31
|
+
|
|
32
|
+
// Create updated manifest
|
|
33
|
+
const updatedManifest = this.addComponentToManifest(manifest, componentType, componentInfo);
|
|
34
|
+
const updatedContent = yaml.dump(updatedManifest, {
|
|
35
|
+
styles: {
|
|
36
|
+
'!!null': 'canonical'
|
|
37
|
+
},
|
|
38
|
+
sortKeys: false
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Generate diff preview
|
|
42
|
+
const diff = this.componentPreview.generateManifestDiff(currentContent, updatedContent);
|
|
43
|
+
|
|
44
|
+
return {
|
|
45
|
+
success: true,
|
|
46
|
+
diff,
|
|
47
|
+
currentContent,
|
|
48
|
+
updatedContent,
|
|
49
|
+
changes: this.summarizeChanges(manifest, updatedManifest)
|
|
50
|
+
};
|
|
51
|
+
} catch (error) {
|
|
52
|
+
return {
|
|
53
|
+
success: false,
|
|
54
|
+
error: error.message
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Add component to manifest structure
|
|
61
|
+
* @private
|
|
62
|
+
*/
|
|
63
|
+
addComponentToManifest(manifest, componentType, componentInfo) {
|
|
64
|
+
const updated = JSON.parse(JSON.stringify(manifest)); // Deep clone
|
|
65
|
+
|
|
66
|
+
switch (componentType) {
|
|
67
|
+
case 'agent':
|
|
68
|
+
if (!updated.team) updated.team = {};
|
|
69
|
+
if (!updated.team.agents) updated.team.agents = [];
|
|
70
|
+
|
|
71
|
+
// Check if agent already exists
|
|
72
|
+
const existingAgentIndex = updated.team.agents.findIndex(
|
|
73
|
+
a => a.id === componentInfo.id
|
|
74
|
+
);
|
|
75
|
+
|
|
76
|
+
if (existingAgentIndex >= 0) {
|
|
77
|
+
// Update existing
|
|
78
|
+
updated.team.agents[existingAgentIndex] = {
|
|
79
|
+
id: componentInfo.id,
|
|
80
|
+
path: `agents/${componentInfo.id}.md`,
|
|
81
|
+
name: componentInfo.name || componentInfo.id,
|
|
82
|
+
...(componentInfo.description && { description: componentInfo.description })
|
|
83
|
+
};
|
|
84
|
+
} else {
|
|
85
|
+
// Add new
|
|
86
|
+
updated.team.agents.push({
|
|
87
|
+
id: componentInfo.id,
|
|
88
|
+
path: `agents/${componentInfo.id}.md`,
|
|
89
|
+
name: componentInfo.name || componentInfo.id,
|
|
90
|
+
...(componentInfo.description && { description: componentInfo.description })
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
break;
|
|
94
|
+
|
|
95
|
+
case 'workflow':
|
|
96
|
+
if (!updated.workflows) updated.workflows = [];
|
|
97
|
+
|
|
98
|
+
const existingWorkflowIndex = updated.workflows.findIndex(
|
|
99
|
+
w => w.id === componentInfo.id
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
if (existingWorkflowIndex >= 0) {
|
|
103
|
+
updated.workflows[existingWorkflowIndex] = {
|
|
104
|
+
id: componentInfo.id,
|
|
105
|
+
path: `workflows/${componentInfo.id}.yaml`,
|
|
106
|
+
name: componentInfo.name || componentInfo.id,
|
|
107
|
+
type: componentInfo.type || 'standard',
|
|
108
|
+
...(componentInfo.description && { description: componentInfo.description })
|
|
109
|
+
};
|
|
110
|
+
} else {
|
|
111
|
+
updated.workflows.push({
|
|
112
|
+
id: componentInfo.id,
|
|
113
|
+
path: `workflows/${componentInfo.id}.yaml`,
|
|
114
|
+
name: componentInfo.name || componentInfo.id,
|
|
115
|
+
type: componentInfo.type || 'standard',
|
|
116
|
+
...(componentInfo.description && { description: componentInfo.description })
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
// Update metadata
|
|
123
|
+
if (!updated.metadata) updated.metadata = {};
|
|
124
|
+
updated.metadata.lastUpdated = new Date().toISOString();
|
|
125
|
+
updated.metadata.version = this.incrementVersion(updated.metadata.version || '1.0.0');
|
|
126
|
+
|
|
127
|
+
return updated;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Increment semantic version
|
|
132
|
+
* @private
|
|
133
|
+
*/
|
|
134
|
+
incrementVersion(version) {
|
|
135
|
+
const parts = version.split('.');
|
|
136
|
+
parts[2] = String(parseInt(parts[2] || '0') + 1);
|
|
137
|
+
return parts.join('.');
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Summarize changes made to manifest
|
|
142
|
+
* @private
|
|
143
|
+
*/
|
|
144
|
+
summarizeChanges(oldManifest, newManifest) {
|
|
145
|
+
const changes = [];
|
|
146
|
+
|
|
147
|
+
// Check agents
|
|
148
|
+
const oldAgents = oldManifest.team?.agents || [];
|
|
149
|
+
const newAgents = newManifest.team?.agents || [];
|
|
150
|
+
|
|
151
|
+
if (newAgents.length > oldAgents.length) {
|
|
152
|
+
const added = newAgents.slice(oldAgents.length);
|
|
153
|
+
added.forEach(agent => {
|
|
154
|
+
changes.push({
|
|
155
|
+
type: 'added',
|
|
156
|
+
category: 'agent',
|
|
157
|
+
item: agent.id
|
|
158
|
+
});
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
// Check workflows
|
|
163
|
+
const oldWorkflows = oldManifest.workflows || [];
|
|
164
|
+
const newWorkflows = newManifest.workflows || [];
|
|
165
|
+
|
|
166
|
+
if (newWorkflows.length > oldWorkflows.length) {
|
|
167
|
+
const added = newWorkflows.slice(oldWorkflows.length);
|
|
168
|
+
added.forEach(workflow => {
|
|
169
|
+
changes.push({
|
|
170
|
+
type: 'added',
|
|
171
|
+
category: 'workflow',
|
|
172
|
+
item: workflow.id
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Version change
|
|
178
|
+
if (oldManifest.metadata?.version !== newManifest.metadata?.version) {
|
|
179
|
+
changes.push({
|
|
180
|
+
type: 'updated',
|
|
181
|
+
category: 'version',
|
|
182
|
+
from: oldManifest.metadata?.version || '1.0.0',
|
|
183
|
+
to: newManifest.metadata?.version
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return changes;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* Apply manifest update after preview
|
|
192
|
+
* @param {string} updatedContent - New manifest content
|
|
193
|
+
*/
|
|
194
|
+
async applyManifestUpdate(updatedContent) {
|
|
195
|
+
await fs.writeFile(this.manifestPath, updatedContent, 'utf8');
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Show interactive manifest update prompt
|
|
200
|
+
* @param {string} componentType - Type of component
|
|
201
|
+
* @param {Object} componentInfo - Component information
|
|
202
|
+
* @returns {Promise<boolean>} Whether update was applied
|
|
203
|
+
*/
|
|
204
|
+
async interactiveManifestUpdate(componentType, componentInfo) {
|
|
205
|
+
const preview = await this.previewManifestUpdate(componentType, componentInfo);
|
|
206
|
+
|
|
207
|
+
if (!preview.success) {
|
|
208
|
+
console.log(chalk.red(`\nā Failed to preview manifest update: ${preview.error}`));
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// Show diff
|
|
213
|
+
console.log(preview.diff);
|
|
214
|
+
|
|
215
|
+
// Show change summary
|
|
216
|
+
console.log(chalk.cyan('\nš Summary of changes:'));
|
|
217
|
+
preview.changes.forEach(change => {
|
|
218
|
+
if (change.type === 'added') {
|
|
219
|
+
console.log(chalk.green(` + Added ${change.category}: ${change.item}`));
|
|
220
|
+
} else if (change.type === 'updated') {
|
|
221
|
+
console.log(chalk.yellow(` ~ Updated ${change.category}: ${change.from} ā ${change.to}`));
|
|
222
|
+
}
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
// Confirm update
|
|
226
|
+
const inquirer = require('inquirer');
|
|
227
|
+
const { confirm } = await inquirer.prompt([{
|
|
228
|
+
type: 'confirm',
|
|
229
|
+
name: 'confirm',
|
|
230
|
+
message: 'Apply these changes to team-manifest.yaml?',
|
|
231
|
+
default: true
|
|
232
|
+
}]);
|
|
233
|
+
|
|
234
|
+
if (confirm) {
|
|
235
|
+
await this.applyManifestUpdate(preview.updatedContent);
|
|
236
|
+
console.log(chalk.green('\nā
Manifest updated successfully!'));
|
|
237
|
+
return true;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
console.log(chalk.yellow('\nā ļø Manifest update cancelled'));
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
|
|
245
245
|
module.exports = ManifestPreview;
|