aios-core 4.2.11 → 4.2.13

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,331 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+ const yaml = require('js-yaml');
6
+ const { getClient, isCodeIntelAvailable } = require('../code-intel');
7
+ const { RegistryLoader, DEFAULT_REGISTRY_PATH } = require('../ids/registry-loader');
8
+
9
+ // Role inference from entity path (order matters: more specific patterns first)
10
+ const ROLE_MAP = [
11
+ ['tasks/', 'task'],
12
+ ['templates/', 'template'],
13
+ ['agents/', 'agent'],
14
+ ['workflows/', 'workflow'],
15
+ ['scripts/', 'script'],
16
+ ['/data/', 'config'],
17
+ ['/core/', 'module'],
18
+ ];
19
+
20
+ /**
21
+ * Infer entity role from its file path.
22
+ * @param {string} entityPath - Entity source path
23
+ * @returns {string} Inferred role
24
+ */
25
+ function inferRole(entityPath) {
26
+ if (!entityPath) return 'unknown';
27
+ const normalized = entityPath.replace(/\\/g, '/');
28
+ for (const [pattern, role] of ROLE_MAP) {
29
+ if (normalized.includes(pattern)) return role;
30
+ }
31
+ return 'unknown';
32
+ }
33
+
34
+ /**
35
+ * RegistrySyncer — Enriches entity registry with code intelligence data.
36
+ *
37
+ * Features:
38
+ * - Batch enrichment of usedBy, dependencies, keywords via code intelligence
39
+ * - Incremental sync (mtime-based) and full resync (--full flag)
40
+ * - Atomic write (temp file + rename) to prevent registry corruption
41
+ * - Graceful fallback when no provider is available
42
+ */
43
+ class RegistrySyncer {
44
+ /**
45
+ * @param {Object} [options]
46
+ * @param {string} [options.registryPath] - Path to entity-registry.yaml
47
+ * @param {string} [options.repoRoot] - Repository root for resolving entity paths
48
+ * @param {Object} [options.client] - Code intel client (for testing injection)
49
+ * @param {Function} [options.logger] - Logger function (defaults to console.log)
50
+ */
51
+ constructor(options = {}) {
52
+ this._registryPath = options.registryPath || DEFAULT_REGISTRY_PATH;
53
+ this._repoRoot = options.repoRoot || path.resolve(__dirname, '../../../');
54
+ this._client = options.client || null;
55
+ this._logger = options.logger || console.log;
56
+ this._stats = { processed: 0, skipped: 0, errors: 0, total: 0 };
57
+ }
58
+
59
+ /**
60
+ * Get code intel client (lazy, allows injection for testing).
61
+ * @returns {Object|null}
62
+ */
63
+ _getClient() {
64
+ if (this._client) return this._client;
65
+ return getClient();
66
+ }
67
+
68
+ /**
69
+ * Sync the entity registry with code intelligence data.
70
+ * @param {Object} [options]
71
+ * @param {boolean} [options.full=false] - Force full resync (ignore lastSynced)
72
+ * @returns {Promise<Object>} Sync stats
73
+ */
74
+ async sync(options = {}) {
75
+ const isFull = options.full === true;
76
+
77
+ // AC5: Fallback — check provider availability first
78
+ if (!this._isProviderAvailable()) {
79
+ this._logger('[registry-syncer] No code intelligence provider available, skipping enrichment');
80
+ return { processed: 0, skipped: 0, errors: 0, total: 0, aborted: true };
81
+ }
82
+
83
+ // Load registry
84
+ const loader = new RegistryLoader(this._registryPath);
85
+ const registry = loader.load();
86
+ const entities = registry.entities || {};
87
+
88
+ // Flatten all entities for iteration
89
+ const allEntities = [];
90
+ for (const [category, categoryEntities] of Object.entries(entities)) {
91
+ if (!categoryEntities || typeof categoryEntities !== 'object') continue;
92
+ for (const [entityId, entityData] of Object.entries(categoryEntities)) {
93
+ allEntities.push({ id: entityId, category, data: entityData });
94
+ }
95
+ }
96
+
97
+ this._stats = { processed: 0, skipped: 0, errors: 0, total: allEntities.length };
98
+ this._logger(`[registry-syncer] Starting ${isFull ? 'full' : 'incremental'} sync of ${allEntities.length} entities`);
99
+
100
+ // Iterate and enrich
101
+ for (const entity of allEntities) {
102
+ try {
103
+ const wasProcessed = await this.syncEntity(entity, entities, isFull);
104
+ if (wasProcessed) {
105
+ this._stats.processed++;
106
+ } else {
107
+ this._stats.skipped++;
108
+ }
109
+ } catch (error) {
110
+ this._stats.errors++;
111
+ this._logger(`[registry-syncer] Error enriching ${entity.id}: ${error.message}`);
112
+ }
113
+ }
114
+
115
+ // Update metadata
116
+ registry.metadata = registry.metadata || {};
117
+ registry.metadata.lastUpdated = new Date().toISOString();
118
+ registry.metadata.entityCount = allEntities.length;
119
+
120
+ // Atomic write
121
+ this._atomicWrite(this._registryPath, registry);
122
+
123
+ this._logger(`[registry-syncer] Sync complete: ${this._stats.processed} processed, ${this._stats.skipped} skipped, ${this._stats.errors} errors`);
124
+ return { ...this._stats };
125
+ }
126
+
127
+ /**
128
+ * Enrich a single entity with code intelligence data.
129
+ * @param {Object} entity - { id, category, data }
130
+ * @param {Object} entities - Full entities map (for cross-reference)
131
+ * @param {boolean} isFull - Force full resync
132
+ * @returns {Promise<boolean>} true if entity was processed, false if skipped
133
+ */
134
+ async syncEntity(entity, entities, isFull) {
135
+ const { id, data } = entity;
136
+ const sourcePath = data.path;
137
+
138
+ // Skip entities without source path
139
+ if (!sourcePath) {
140
+ return false;
141
+ }
142
+
143
+ // AC6: Incremental sync — check mtime vs lastSynced
144
+ if (!isFull) {
145
+ const shouldSkip = this._shouldSkipIncremental(data);
146
+ if (shouldSkip) {
147
+ return false;
148
+ }
149
+ }
150
+
151
+ const client = this._getClient();
152
+ const now = new Date().toISOString();
153
+
154
+ // AC2: Populate usedBy via findReferences
155
+ const usedByIds = await this._findUsedBy(client, id, entities);
156
+ if (usedByIds !== null) {
157
+ data.usedBy = usedByIds;
158
+ }
159
+
160
+ // AC3: Populate dependencies via analyzeDependencies (JS/TS files only)
161
+ const deps = await this._findDependencies(client, sourcePath);
162
+ if (deps !== null) {
163
+ data.dependencies = deps;
164
+ }
165
+
166
+ // AC4: Populate codeIntelMetadata
167
+ const callerCount = Array.isArray(data.usedBy) ? data.usedBy.length : 0;
168
+ data.codeIntelMetadata = {
169
+ callerCount,
170
+ role: inferRole(sourcePath),
171
+ lastSynced: now,
172
+ provider: client._activeProvider ? client._activeProvider.name : 'unknown',
173
+ };
174
+
175
+ return true;
176
+ }
177
+
178
+ /**
179
+ * Check if provider is available.
180
+ * @returns {boolean}
181
+ * @private
182
+ */
183
+ _isProviderAvailable() {
184
+ if (this._client) {
185
+ return typeof this._client.findReferences === 'function';
186
+ }
187
+ return isCodeIntelAvailable();
188
+ }
189
+
190
+ /**
191
+ * Check if entity should be skipped in incremental mode.
192
+ * @param {Object} entityData
193
+ * @returns {boolean} true if should skip
194
+ * @private
195
+ */
196
+ _shouldSkipIncremental(entityData) {
197
+ const metadata = entityData.codeIntelMetadata;
198
+
199
+ // Entities without lastSynced are always processed (AC6)
200
+ if (!metadata || !metadata.lastSynced) {
201
+ return false;
202
+ }
203
+
204
+ // Get file mtime
205
+ const sourcePath = entityData.path;
206
+ if (!sourcePath) return true;
207
+
208
+ const fullPath = path.resolve(this._repoRoot, sourcePath);
209
+ try {
210
+ const stat = fs.statSync(fullPath);
211
+ const lastSyncedMs = new Date(metadata.lastSynced).getTime();
212
+ // Skip if file hasn't changed since last sync
213
+ return stat.mtimeMs <= lastSyncedMs;
214
+ } catch (_error) {
215
+ // File doesn't exist — clear metadata and skip
216
+ this._logger(`[registry-syncer] Warning: source file not found for ${sourcePath}, skipping`);
217
+ return true;
218
+ }
219
+ }
220
+
221
+ /**
222
+ * Find entities that reference this entity (usedBy).
223
+ * @param {Object} client - Code intel client
224
+ * @param {string} entityId - Entity ID to search for
225
+ * @param {Object} entities - Full entities map for cross-referencing
226
+ * @returns {Promise<string[]|null>} Array of entity IDs or null on failure
227
+ * @private
228
+ */
229
+ async _findUsedBy(client, entityId, entities) {
230
+ try {
231
+ const references = await client.findReferences(entityId);
232
+ if (!references || !Array.isArray(references)) return null;
233
+
234
+ // Cross-reference with registry to get entity IDs
235
+ const usedByIds = [];
236
+ for (const ref of references) {
237
+ const refPath = ref.file || ref.path || ref;
238
+ if (typeof refPath !== 'string') continue;
239
+
240
+ const matchedId = this._findEntityByPath(refPath, entities);
241
+ if (matchedId && matchedId !== entityId) {
242
+ usedByIds.push(matchedId);
243
+ }
244
+ }
245
+
246
+ return [...new Set(usedByIds)]; // Deduplicate
247
+ } catch (_error) {
248
+ return null;
249
+ }
250
+ }
251
+
252
+ /**
253
+ * Find dependencies of a source file.
254
+ * @param {Object} client - Code intel client
255
+ * @param {string} sourcePath - Source file path
256
+ * @returns {Promise<string[]|null>} Array of dependency names or null on failure
257
+ * @private
258
+ */
259
+ async _findDependencies(client, sourcePath) {
260
+ // Only analyze JS/TS files for import dependencies
261
+ if (!sourcePath.match(/\.(js|ts|mjs|cjs)$/)) return null;
262
+
263
+ try {
264
+ const fullPath = path.resolve(this._repoRoot, sourcePath);
265
+ const result = await client.analyzeDependencies(fullPath);
266
+ if (!result) return null;
267
+
268
+ // Filter to internal project dependencies only
269
+ const deps = [];
270
+ const items = result.dependencies || result.imports || result;
271
+ if (!Array.isArray(items)) return null;
272
+
273
+ for (const dep of items) {
274
+ const depPath = dep.path || dep.source || dep;
275
+ if (typeof depPath !== 'string') continue;
276
+ // Internal deps: relative paths or project paths (not node_modules)
277
+ if (depPath.startsWith('.') || depPath.startsWith('/') || depPath.includes('.aios-core')) {
278
+ deps.push(depPath);
279
+ }
280
+ }
281
+
282
+ return deps;
283
+ } catch (_error) {
284
+ return null;
285
+ }
286
+ }
287
+
288
+ /**
289
+ * Find entity ID by file path (cross-reference lookup).
290
+ * @param {string} filePath - File path from reference
291
+ * @param {Object} entities - Full entities map
292
+ * @returns {string|null} Entity ID or null
293
+ * @private
294
+ */
295
+ _findEntityByPath(filePath, entities) {
296
+ const normalized = filePath.replace(/\\/g, '/');
297
+ for (const [_category, categoryEntities] of Object.entries(entities)) {
298
+ if (!categoryEntities || typeof categoryEntities !== 'object') continue;
299
+ for (const [entityId, entityData] of Object.entries(categoryEntities)) {
300
+ if (entityData.path && normalized.includes(entityData.path.replace(/\\/g, '/'))) {
301
+ return entityId;
302
+ }
303
+ }
304
+ }
305
+ return null;
306
+ }
307
+
308
+ /**
309
+ * Atomic write: write to temp file then rename.
310
+ * Prevents partial corruption if process crashes mid-write.
311
+ * @param {string} registryPath - Target path
312
+ * @param {Object} registry - Registry data to write
313
+ * @private
314
+ */
315
+ _atomicWrite(registryPath, registry) {
316
+ const tmpPath = registryPath + '.tmp';
317
+ const content = yaml.dump(registry, { lineWidth: 120, noRefs: true });
318
+ fs.writeFileSync(tmpPath, content, 'utf8');
319
+ fs.renameSync(tmpPath, registryPath);
320
+ }
321
+
322
+ /**
323
+ * Get sync statistics from last run.
324
+ * @returns {Object}
325
+ */
326
+ getStats() {
327
+ return { ...this._stats };
328
+ }
329
+ }
330
+
331
+ module.exports = { RegistrySyncer, inferRole, ROLE_MAP };
@@ -232,6 +232,35 @@ class RegistryLoader {
232
232
  return entity;
233
233
  }
234
234
 
235
+ /**
236
+ * Get entity with code intelligence metadata (Story NOG-2).
237
+ * @param {string} entityId - Entity ID
238
+ * @returns {Object|null} Entity with codeIntelMetadata or null
239
+ */
240
+ getEntityWithIntel(entityId) {
241
+ const entity = this._findById(entityId);
242
+ if (!entity) return null;
243
+ return {
244
+ ...entity,
245
+ codeIntelMetadata: entity.codeIntelMetadata || null,
246
+ };
247
+ }
248
+
249
+ /**
250
+ * Query entities by keywords with optional role filter (Story NOG-2).
251
+ * @param {string[]} keywords - Keywords to search
252
+ * @param {Object} [options]
253
+ * @param {string} [options.role] - Filter by codeIntelMetadata.role
254
+ * @returns {Object[]} Matching entities
255
+ */
256
+ findByKeyword(keywords, options = {}) {
257
+ const results = this.queryByKeywords(keywords);
258
+ if (!options.role) return results;
259
+ return results.filter(
260
+ (e) => e.codeIntelMetadata && e.codeIntelMetadata.role === options.role,
261
+ );
262
+ }
263
+
235
264
  /**
236
265
  * Get registry metadata.
237
266
  */
@@ -6,7 +6,7 @@ const fs = require('fs');
6
6
  /**
7
7
  * Resolve runtime dependencies for Synapse hook execution.
8
8
  *
9
- * @param {{cwd?: string, sessionId?: string}} input
9
+ * @param {{cwd?: string, session_id?: string, sessionId?: string}} input
10
10
  * @returns {{
11
11
  * engine: import('../engine').SynapseEngine,
12
12
  * session: Object
@@ -14,7 +14,7 @@ const fs = require('fs');
14
14
  */
15
15
  function resolveHookRuntime(input) {
16
16
  const cwd = input && input.cwd;
17
- const sessionId = input && input.sessionId;
17
+ const sessionId = input && (input.session_id || input.sessionId);
18
18
  if (!cwd || typeof cwd !== 'string') return null;
19
19
 
20
20
  const synapsePath = path.join(cwd, '.synapse');
@@ -1,7 +1,7 @@
1
1
  metadata:
2
2
  version: 1.0.0
3
- lastUpdated: '2026-02-16T04:49:07.416Z'
4
- entityCount: 506
3
+ lastUpdated: '2026-02-16T20:22:35.905Z'
4
+ entityCount: 508
5
5
  checksumAlgorithm: sha256
6
6
  entities:
7
7
  tasks:
@@ -3909,6 +3909,24 @@ entities:
3909
3909
  extensionPoints: []
3910
3910
  checksum: sha256:f7a0bb8fed5663c88ad691b8871fdf7a861b6a7c02599f0c2db3eb9393d353c8
3911
3911
  lastVerified: '2026-02-16T01:21:26.585Z'
3912
+ sync-registry-intel:
3913
+ path: .aios-core/development/tasks/sync-registry-intel.md
3914
+ type: task
3915
+ purpose: 'Task: Sync Registry Intel'
3916
+ keywords:
3917
+ - sync
3918
+ - registry
3919
+ - intel
3920
+ - 'task:'
3921
+ usedBy: []
3922
+ dependencies:
3923
+ - registry-syncer
3924
+ adaptability:
3925
+ score: 0.8
3926
+ constraints: []
3927
+ extensionPoints: []
3928
+ checksum: sha256:0e69435307db814563823896e7ba9b29a4a9c10d90f6dedec5cb7a6d6f7ba936
3929
+ lastVerified: '2026-02-16T20:19:27.659Z'
3912
3930
  templates:
3913
3931
  activation-instructions-inline-greeting:
3914
3932
  path: .aios-core/product/templates/activation-instructions-inline-greeting.yaml
@@ -5979,6 +5997,24 @@ entities:
5979
5997
  checksum: sha256:310884d94b81be976a346987822306a16a73ba812c08c3b805f4a03216ffef38
5980
5998
  lastVerified: '2026-02-15T19:28:17.743Z'
5981
5999
  modules:
6000
+ registry-syncer:
6001
+ path: .aios-core/core/code-intel/registry-syncer.js
6002
+ type: module
6003
+ purpose: Entity at .aios-core\core\code-intel\registry-syncer.js
6004
+ keywords:
6005
+ - registry
6006
+ - syncer
6007
+ usedBy:
6008
+ - sync-registry-intel
6009
+ dependencies:
6010
+ - code-intel
6011
+ - registry-loader
6012
+ adaptability:
6013
+ score: 0.4
6014
+ constraints: []
6015
+ extensionPoints: []
6016
+ checksum: sha256:011318e2ba5c250daae2e565a8e8fb1570c99b7569e631276a2bf46e887fc514
6017
+ lastVerified: '2026-02-16T20:19:27.658Z'
5982
6018
  index.esm:
5983
6019
  path: .aios-core/core/index.esm.js
5984
6020
  type: module
@@ -6562,6 +6598,7 @@ entities:
6562
6598
  - registry
6563
6599
  - loader
6564
6600
  usedBy:
6601
+ - registry-syncer
6565
6602
  - index
6566
6603
  - framework-governor
6567
6604
  dependencies: []
@@ -6569,8 +6606,8 @@ entities:
6569
6606
  score: 0.4
6570
6607
  constraints: []
6571
6608
  extensionPoints: []
6572
- checksum: sha256:7fb2edb5a605765757d5ca7201025a7ff4cf7bfa9b18f35a311e2b658532a865
6573
- lastVerified: '2026-02-08T13:33:24.336Z'
6609
+ checksum: sha256:88c67bace0a5ab6a14cb1d096e3f9cab9f5edc0dd8377788e27b692ccefbd487
6610
+ lastVerified: '2026-02-16T20:19:27.659Z'
6574
6611
  manifest-generator:
6575
6612
  path: .aios-core/core/manifest/manifest-generator.js
6576
6613
  type: module
@@ -8536,7 +8573,7 @@ entities:
8536
8573
  hook-runtime:
8537
8574
  path: .aios-core/core/synapse/runtime/hook-runtime.js
8538
8575
  type: module
8539
- purpose: Entity at .aios-core/core/synapse/runtime/hook-runtime.js
8576
+ purpose: Entity at .aios-core\core\synapse\runtime\hook-runtime.js
8540
8577
  keywords:
8541
8578
  - hook
8542
8579
  - runtime
@@ -8546,8 +8583,8 @@ entities:
8546
8583
  score: 0.4
8547
8584
  constraints: []
8548
8585
  extensionPoints: []
8549
- checksum: sha256:441bdee8bbfea448f4e20eeb0ff1277352b33e79c9cf6cde9012c6d150fee08b
8550
- lastVerified: '2026-02-15T19:28:17.742Z'
8586
+ checksum: sha256:2fdd54f36a1bbb4ba05d6577c607cf2d6711dcf9a06284fc935676189a461fa2
8587
+ lastVerified: '2026-02-16T20:22:35.904Z'
8551
8588
  migration-config:
8552
8589
  path: .aios-core/core/migration/migration-config.yaml
8553
8590
  type: module
@@ -8819,8 +8856,8 @@ entities:
8819
8856
  score: 0.3
8820
8857
  constraints: []
8821
8858
  extensionPoints: []
8822
- checksum: sha256:538fff4398eba7c2492b446fce3a1d9115e5f1c6f494f0c3b45a991526c2295a
8823
- lastVerified: '2026-02-10T16:04:17.827Z'
8859
+ checksum: sha256:092161d318ab523b8cd5c3dc8a2bd19accc23ab7fa731d5b4fa11c5afb8b5a08
8860
+ lastVerified: '2026-02-16T19:52:18.846Z'
8824
8861
  analyst:
8825
8862
  path: .aios-core/development/agents/analyst.md
8826
8863
  type: agent
@@ -177,3 +177,15 @@
177
177
  {"timestamp":"2026-02-16T01:46:56.302Z","action":"change","path":".aios-core/core/code-intel/code-intel-enricher.js","trigger":"watcher"}
178
178
  {"timestamp":"2026-02-16T01:46:56.302Z","action":"change","path":".aios-core/core/code-intel/index.js","trigger":"watcher"}
179
179
  {"timestamp":"2026-02-16T01:46:56.303Z","action":"change","path":".aios-core/core/code-intel/providers/code-graph-provider.js","trigger":"watcher"}
180
+ {"timestamp":"2026-02-16T19:52:18.842Z","action":"add","path":".aios-core/core/code-intel/registry-syncer.js","trigger":"watcher"}
181
+ {"timestamp":"2026-02-16T19:52:18.845Z","action":"change","path":".aios-core/core/ids/registry-loader.js","trigger":"watcher"}
182
+ {"timestamp":"2026-02-16T19:52:18.846Z","action":"change","path":".aios-core/development/agents/aios-master.md","trigger":"watcher"}
183
+ {"timestamp":"2026-02-16T19:52:18.847Z","action":"add","path":".aios-core/development/tasks/sync-registry-intel.md","trigger":"watcher"}
184
+ {"timestamp":"2026-02-16T20:19:21.429Z","action":"change","path":".aios-core/core/code-intel/registry-syncer.js","trigger":"watcher"}
185
+ {"timestamp":"2026-02-16T20:19:21.430Z","action":"change","path":".aios-core/core/ids/registry-loader.js","trigger":"watcher"}
186
+ {"timestamp":"2026-02-16T20:19:21.431Z","action":"change","path":".aios-core/development/tasks/sync-registry-intel.md","trigger":"watcher"}
187
+ {"timestamp":"2026-02-16T20:19:27.658Z","action":"change","path":".aios-core/core/code-intel/registry-syncer.js","trigger":"watcher"}
188
+ {"timestamp":"2026-02-16T20:19:27.659Z","action":"change","path":".aios-core/core/ids/registry-loader.js","trigger":"watcher"}
189
+ {"timestamp":"2026-02-16T20:19:27.659Z","action":"change","path":".aios-core/development/tasks/sync-registry-intel.md","trigger":"watcher"}
190
+ {"timestamp":"2026-02-16T20:22:31.161Z","action":"change","path":".aios-core/core/synapse/runtime/hook-runtime.js","trigger":"watcher"}
191
+ {"timestamp":"2026-02-16T20:22:35.904Z","action":"change","path":".aios-core/core/synapse/runtime/hook-runtime.js","trigger":"watcher"}
@@ -217,6 +217,11 @@ commands:
217
217
  - name: ids stats
218
218
  description: 'Registry statistics (entity count by type, categories, health score)'
219
219
 
220
+ # Code Intelligence — Registry Enrichment (Story NOG-2)
221
+ - name: sync-registry-intel
222
+ args: '[--full]'
223
+ description: 'Enrich entity registry with code intelligence data (usedBy, dependencies, codeIntelMetadata). Use --full to force full resync.'
224
+
220
225
  # IDS Pre-Action Hooks (Story IDS-7)
221
226
  # These hooks run BEFORE *create and *modify commands as advisory (non-blocking) steps.
222
227
  ids_hooks:
@@ -282,6 +287,7 @@ dependencies:
282
287
  - run-workflow.md
283
288
  - run-workflow-engine.md
284
289
  - ids-governor.md
290
+ - sync-registry-intel.md
285
291
  # Delegated tasks (Story 6.1.2.3):
286
292
  # brownfield-create-epic.md → @pm
287
293
  # brownfield-create-story.md → @pm
@@ -0,0 +1,79 @@
1
+ # Task: Sync Registry Intel
2
+
3
+ ## Metadata
4
+ - **Task ID:** sync-registry-intel
5
+ - **Agent:** @aios-master
6
+ - **Story:** NOG-2
7
+ - **Type:** Command Task
8
+ - **Elicit:** false
9
+
10
+ ---
11
+
12
+ ## Description
13
+
14
+ Enrich the entity registry with code intelligence data (usedBy, dependencies, codeIntelMetadata) using the configured code intelligence provider.
15
+
16
+ ---
17
+
18
+ ## Prerequisites
19
+
20
+ - Code intelligence provider available (NOG-1 complete)
21
+ - Entity registry exists at `.aios-core/data/entity-registry.yaml`
22
+
23
+ ---
24
+
25
+ ## Execution Steps
26
+
27
+ ### Step 1: Parse Arguments
28
+
29
+ ```text
30
+ Arguments:
31
+ --full Force full resync (reprocess all entities regardless of lastSynced)
32
+
33
+ Default: Incremental sync (only entities whose source file mtime > lastSynced)
34
+ ```
35
+
36
+ ### Step 2: Execute Sync
37
+
38
+ ```javascript
39
+ const { RegistrySyncer } = require('.aios-core/core/code-intel/registry-syncer');
40
+
41
+ const syncer = new RegistrySyncer();
42
+ const stats = await syncer.sync({ full: hasFullFlag });
43
+ ```
44
+
45
+ ### Step 3: Report Results
46
+
47
+ Display sync statistics:
48
+ - Total entities in registry
49
+ - Entities processed (enriched)
50
+ - Entities skipped (unchanged)
51
+ - Errors encountered
52
+
53
+ ### Step 4: Handle Fallback
54
+
55
+ If no code intelligence provider is available:
56
+ - Display: "No code intelligence provider available, skipping enrichment"
57
+ - Exit gracefully with zero modifications
58
+
59
+ ---
60
+
61
+ ## Output
62
+
63
+ ```yaml
64
+ success: true
65
+ stats:
66
+ total: 506
67
+ processed: 42
68
+ skipped: 464
69
+ errors: 0
70
+ ```
71
+
72
+ ---
73
+
74
+ ## Error Handling
75
+
76
+ - **No provider:** Graceful exit, zero modifications
77
+ - **Registry not found:** Error message, exit
78
+ - **Partial failure:** Continue batch, log errors, report count
79
+ - **Write failure:** Atomic write prevents corruption (temp + rename)
@@ -68,7 +68,7 @@ console.log(status.tip('Press Enter to continue'));
68
68
 
69
69
  ### Welcome Screen
70
70
  ```javascript
71
- console.log(headings.h1('🎉 Welcome to AIOS v4.0.4 Installer!'));
71
+ console.log(headings.h1('🎉 Welcome to AIOS v4.2 Installer!'));
72
72
  console.log(colors.info('Let\'s configure your project...\n'));
73
73
  ```
74
74
 
@@ -1,4 +1,4 @@
1
- # AIOS Color Palette v4.0.4
1
+ # AIOS Color Palette v4.2
2
2
 
3
3
  **Version:** 2.1.0
4
4
  **Created:** 2025-01-20
@@ -66,7 +66,7 @@ For special effects, animations, and branding moments:
66
66
  ```javascript
67
67
  const chalk = require('chalk');
68
68
 
69
- // AIOS Color Palette v4.0.4
69
+ // AIOS Color Palette v4.2
70
70
  const colors = {
71
71
  // Core Brand Colors
72
72
  primary: chalk.hex('#8B5CF6'), // ClickUp-inspired purple
@@ -162,7 +162,7 @@ module.exports = {
162
162
  - Example: Welcome screens, major section headers
163
163
 
164
164
  ```javascript
165
- console.log(colors.brandPrimary('🎉 AIOS v4.0.4 Installer'));
165
+ console.log(colors.brandPrimary('🎉 AIOS v4.2 Installer'));
166
166
  ```
167
167
 
168
168
  **Level 2: Primary Content**
@@ -193,7 +193,7 @@ console.log(colors.info('💡 Tip: You can change this later'));
193
193
  **Installer & Wizards:**
194
194
  ```javascript
195
195
  // Welcome
196
- console.log(colors.brandPrimary('\n🎉 Welcome to AIOS v4.0.4\n'));
196
+ console.log(colors.brandPrimary('\n🎉 Welcome to AIOS v4.2\n'));
197
197
  console.log(colors.info('Let\'s get your project set up...\n'));
198
198
 
199
199
  // Questions
@@ -1,4 +1,4 @@
1
- # AIOS Framework - Livro de Ouro v4.0.4 (Complete)
1
+ # AIOS Framework - Livro de Ouro v4.2 (Complete)
2
2
 
3
3
  ## O Sistema Operacional Definitivo para Orquestração de Agentes IA
4
4
 
@@ -17,7 +17,7 @@
17
17
 
18
18
  ## 📣 IMPORTANTE: Sobre Este Documento
19
19
 
20
- Este documento é a **versão consolidada v4.0.4** que incorpora todas as mudanças dos Sprints 2-5:
20
+ Este documento é a **versão consolidada v4.2** que incorpora todas as mudanças dos Sprints 2-5:
21
21
 
22
22
  - ✅ **Modular Architecture** (4 módulos: core, development, product, infrastructure)
23
23
  - ✅ **Squad System** (nova terminologia, substituindo "Squad")
@@ -34,7 +34,7 @@ Este documento é a **versão consolidada v4.0.4** que incorpora todas as mudan
34
34
 
35
35
  ---
36
36
 
37
- ## 📜 Open Source vs. Serviço - Business Model v4.0.4
37
+ ## 📜 Open Source vs. Serviço - Business Model v4.2
38
38
 
39
39
  ### O Que Mudou de v2.0 para v4.0.4
40
40
 
@@ -106,7 +106,7 @@ Este documento é a **versão consolidada v4.0.4** que incorpora todas as mudan
106
106
  | LangChain | ✅ Complete | ❌ None (commodity) |
107
107
  | CrewAI | ✅ Complete | ❌ None (commodity) |
108
108
  | AutoGen | ✅ Complete | ❌ None (commodity) |
109
- | **AIOS v4.0.4** | ✅ **Complete** | ✅ **Clones (DNA Mental™)** ⭐ |
109
+ | **AIOS v4.2** | ✅ **Complete** | ✅ **Clones (DNA Mental™)** ⭐ |
110
110
 
111
111
  **Analogia:** Linux é open source, mas Red Hat Enterprise Linux adiciona suporte e otimizações. Ambos são Linux, mas o valor agregado varia. AIOS funciona igual.
112
112
 
@@ -119,7 +119,7 @@ Este não é um documento para ser lido do início ao fim. É um **sistema de ap
119
119
  - 🚀 **Layer 0: DISCOVERY** - Descubra seu caminho (5 min)
120
120
  - 🎯 **Layer 1: UNDERSTANDING** - 5 essays que ensinam o modelo mental (75 min)
121
121
  - 🎨 **Layer 2: COMPONENT LIBRARY** - Catálogo completo de componentes
122
- - 📋 **Layer 3: USAGE GUIDE** - Como usar AIOS v4.0.4 no seu contexto
122
+ - 📋 **Layer 3: USAGE GUIDE** - Como usar AIOS v4.2 no seu contexto
123
123
  - 📚 **Layer 4: COMPLETE REFERENCE** - Especificação técnica completa
124
124
  - 🔄 **META: EVOLUTION** - Como contribuir e evoluir o framework
125
125
 
@@ -129,7 +129,7 @@ Este não é um documento para ser lido do início ao fim. É um **sistema de ap
129
129
 
130
130
  # 🚀 LAYER 0: DISCOVERY ROUTER
131
131
 
132
- ## Bem-vindo ao AIOS v4.0.4 - Vamos Encontrar Seu Caminho
132
+ ## Bem-vindo ao AIOS v4.2 - Vamos Encontrar Seu Caminho
133
133
 
134
134
  ### Learning Tracks Disponíveis
135
135
 
@@ -192,7 +192,7 @@ AIOS fornece **orquestração estruturada**:
192
192
 
193
193
  ---
194
194
 
195
- ## Essay 3: Business Model v4.0.4
195
+ ## Essay 3: Business Model v4.2
196
196
 
197
197
  ### Por Que Workers São Open-Source Agora?
198
198
 
@@ -212,7 +212,7 @@ AIOS fornece **orquestração estruturada**:
212
212
 
213
213
  ## Essay 4: Agent System
214
214
 
215
- ### Os 11 Agents v4.0.4
215
+ ### Os 11 Agents v4.2
216
216
 
217
217
  | Agent | ID | Archetype | Responsabilidade |
218
218
  | --------- | --------------- | ------------ | ----------------------- |
@@ -288,7 +288,7 @@ responsavel_type: Clone # Year 2
288
288
 
289
289
  # 🎨 LAYER 2: COMPONENT LIBRARY
290
290
 
291
- ## Arquitetura Modular v4.0.4
291
+ ## Arquitetura Modular v4.2
292
292
 
293
293
  ### Os 4 Módulos
294
294
 
@@ -342,7 +342,7 @@ Regras:
342
342
 
343
343
  ---
344
344
 
345
- ## Squad System (Novo em v4.0.4)
345
+ ## Squad System (Novo em v4.2)
346
346
 
347
347
  ### Terminologia
348
348
 
@@ -600,7 +600,7 @@ npm install @aios/mcp-presets
600
600
 
601
601
  # 📋 LAYER 3: USAGE GUIDE
602
602
 
603
- ## Quick Start v4.0.4
603
+ ## Quick Start v4.2
604
604
 
605
605
  ### Installation (5 minutes)
606
606
 
@@ -700,7 +700,7 @@ $ aios workflow brownfield-integration --target=./existing-project
700
700
 
701
701
  # 📚 LAYER 4: COMPLETE REFERENCE
702
702
 
703
- ## Source Tree v4.0.4 (Current)
703
+ ## Source Tree v4.2 (Current)
704
704
 
705
705
  ```
706
706
  @synkra/aios-core/ # Root project
@@ -785,7 +785,7 @@ $ aios workflow brownfield-integration --target=./existing-project
785
785
 
786
786
  ### Installation
787
787
 
788
- | Metric | v2.0 | v4.0.4 | Improvement |
788
+ | Metric | v2.0 | v4.2 | Improvement |
789
789
  | --------------- | ---------- | --------- | --------------- |
790
790
  | Time to install | 2-4 hours | 5 minutes | **96% faster** |
791
791
  | Steps required | 15+ manual | 1 command | **93% simpler** |
@@ -793,7 +793,7 @@ $ aios workflow brownfield-integration --target=./existing-project
793
793
 
794
794
  ### Development Speed
795
795
 
796
- | Metric | v2.0 | v4.0.4 | Improvement |
796
+ | Metric | v2.0 | v4.2 | Improvement |
797
797
  | --------------------- | -------- | ---------- | ----------------- |
798
798
  | Find reusable Worker | N/A | 30 seconds | **∞** |
799
799
  | Quality issues caught | 20% | 80% | **4x** |
@@ -801,7 +801,7 @@ $ aios workflow brownfield-integration --target=./existing-project
801
801
 
802
802
  ### Quality
803
803
 
804
- | Metric | v2.0 | v4.0.4 |
804
+ | Metric | v2.0 | v4.2 |
805
805
  | ------------------- | ---------- | ------------- |
806
806
  | Quality Gate Layers | 1 (manual) | 3 (automated) |
807
807
  | Auto-caught issues | 0% | 80% |
@@ -3,7 +3,7 @@
3
3
  **Version:** 2.1.0
4
4
  **Date:** 2025-12-09
5
5
  **Purpose:** Document differences between AIOS open-source and AIOS service implementations
6
- **Status:** ⚠️ Needs Review - Updated for v4.0.4 Multi-Repo Strategy
6
+ **Status:** ⚠️ Needs Review - Updated for v4.2 Multi-Repo Strategy
7
7
 
8
8
  ---
9
9
 
@@ -17,7 +17,7 @@ This document clarifies which features apply to which context.
17
17
 
18
18
  ---
19
19
 
20
- ## Multi-Repo Strategy (v4.0.4)
20
+ ## Multi-Repo Strategy (v4.2)
21
21
 
22
22
  ### Repository Organization
23
23
 
@@ -489,7 +489,7 @@ function validateTask(task) {
489
489
 
490
490
  ## Related Documents
491
491
 
492
- - [AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md](./AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md) - Complete v4.0.4 framework guide
492
+ - [AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md](./AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md) - Complete v4.2 framework guide
493
493
  - [STANDARDS-INDEX.md](./STANDARDS-INDEX.md) - Standards navigation
494
494
  - [TASK-FORMAT-SPECIFICATION-V1.md](./TASK-FORMAT-SPECIFICATION-V1.md) - Complete task format spec
495
495
  - [AGENT-PERSONALIZATION-STANDARD-V1.md](./AGENT-PERSONALIZATION-STANDARD-V1.md) - Personality guidelines
@@ -508,4 +508,4 @@ function validateTask(task) {
508
508
 
509
509
  **Last Updated:** 2025-12-09
510
510
  **Version:** 2.1.0
511
- **Applies to:** AIOS v4.0.4+
511
+ **Applies to:** AIOS v4.2+
@@ -1,4 +1,4 @@
1
- # Quality Gates Specification v4.0.4
1
+ # Quality Gates Specification v4.2
2
2
 
3
3
  **Version:** 2.1.0
4
4
  **Last Updated:** 2025-12-09
@@ -481,7 +481,7 @@ reviews:
481
481
  Verify:
482
482
  - Terminology uses 'Squad' not 'Squad'
483
483
  - All internal links work
484
- - Version numbers are v4.0.4
484
+ - Version numbers are v4.2
485
485
 
486
486
  - path: "squads/**"
487
487
  instructions: |
@@ -512,7 +512,7 @@ reviews:
512
512
  | Issues escaping to production | ~15% |
513
513
  | Developer context switches | High |
514
514
 
515
- ### After Quality Gates (v4.0.4)
515
+ ### After Quality Gates (v4.2)
516
516
 
517
517
  | Metric | Value | Improvement |
518
518
  |--------|-------|-------------|
@@ -23,11 +23,11 @@
23
23
 
24
24
  ## 📚 Standards by Category
25
25
 
26
- ### Core Framework Standards (Current v4.0.4)
26
+ ### Core Framework Standards (Current v4.2)
27
27
 
28
28
  | Document | Description | Status | Version |
29
29
  |----------|-------------|--------|---------|
30
- | [AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md](./AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md) | **Complete v4.0.4 framework guide** | ✅ Current | 2.1.0 |
30
+ | [AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md](./AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md) | **Complete v4.2 framework guide** | ✅ Current | 2.1.0 |
31
31
  | [QUALITY-GATES-SPECIFICATION.md](./QUALITY-GATES-SPECIFICATION.md) | 3-layer quality gates system | ✅ Current | 2.1.0 |
32
32
  | [STORY-TEMPLATE-V2-SPECIFICATION.md](./STORY-TEMPLATE-V2-SPECIFICATION.md) | Story template v2.0 specification | ✅ Current | 2.0.0 |
33
33
  | [TASK-FORMAT-SPECIFICATION-V1.md](./TASK-FORMAT-SPECIFICATION-V1.md) | Task-First architecture format | ✅ Current | 1.0.0 |
@@ -60,13 +60,13 @@
60
60
 
61
61
  ---
62
62
 
63
- ## 🔄 What Changed in v4.0.4
63
+ ## 🔄 What Changed in v4.2
64
64
 
65
65
  ### New Documents Created
66
66
 
67
67
  | Document | Purpose |
68
68
  |----------|---------|
69
- | AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md | Consolidated v4.0.4 documentation |
69
+ | AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md | Consolidated v4.2 documentation |
70
70
  | QUALITY-GATES-SPECIFICATION.md | 3-layer quality gates |
71
71
  | STORY-TEMPLATE-V2-SPECIFICATION.md | Story template v2.0 |
72
72
  | STANDARDS-INDEX.md | This navigation document |
@@ -101,8 +101,8 @@
101
101
  .aios-core/docs/standards/
102
102
  ├── STANDARDS-INDEX.md # This file - navigation
103
103
 
104
- ├── Current v4.0.4 Standards
105
- │ ├── AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md # Complete v4.0.4 guide
104
+ ├── Current v4.2 Standards
105
+ │ ├── AIOS-LIVRO-DE-OURO-V2.1-COMPLETE.md # Complete v4.2 guide
106
106
  │ ├── QUALITY-GATES-SPECIFICATION.md # Quality gates
107
107
  │ ├── STORY-TEMPLATE-V2-SPECIFICATION.md # Story template
108
108
  │ ├── TASK-FORMAT-SPECIFICATION-V1.md # Task format
@@ -156,7 +156,7 @@ Located in `docs/`:
156
156
 
157
157
  | Status | Meaning | Action |
158
158
  |--------|---------|--------|
159
- | ✅ Current | Up-to-date with v4.0.4 | Use as reference |
159
+ | ✅ Current | Up-to-date with v4.2 | Use as reference |
160
160
  | ⚠️ Deprecated | Superseded by newer document | Refer to replacement |
161
161
  | ⚠️ Needs Update | Content outdated | Update planned |
162
162
  | 📦 Archive Candidate | Should be archived | Move to _archived/ |
@@ -201,7 +201,7 @@ grep -r "v2.0" .aios-core/docs/standards --include="*.md"
201
201
 
202
202
  | Date | Version | Changes | Author |
203
203
  |------|---------|---------|--------|
204
- | 2025-12-09 | 2.1.0 | Initial STANDARDS-INDEX creation for v4.0.4 | @dev (Dex) |
204
+ | 2025-12-09 | 2.1.0 | Initial STANDARDS-INDEX creation for v4.2 | @dev (Dex) |
205
205
 
206
206
  ---
207
207
 
@@ -7,10 +7,10 @@
7
7
  # - SHA256 hashes for change detection
8
8
  # - File types for categorization
9
9
  #
10
- version: 4.2.11
11
- generated_at: "2026-02-16T17:42:52.251Z"
10
+ version: 4.2.13
11
+ generated_at: "2026-02-16T21:09:06.284Z"
12
12
  generator: scripts/generate-install-manifest.js
13
- file_count: 1004
13
+ file_count: 1006
14
14
  files:
15
15
  - path: cli/commands/config/index.js
16
16
  hash: sha256:ebcad2ce3807eda29dcddff76d7a95ddc9b7fa160df21fd608f94b802237e862
@@ -200,6 +200,10 @@ files:
200
200
  hash: sha256:7d16aa715155e9c077720a6bffc7e9e5411b65f821b6b4e5e909f226796e7acb
201
201
  type: core
202
202
  size: 3079
203
+ - path: core/code-intel/registry-syncer.js
204
+ hash: sha256:011318e2ba5c250daae2e565a8e8fb1570c99b7569e631276a2bf46e887fc514
205
+ type: core
206
+ size: 10891
203
207
  - path: core/config/config-cache.js
204
208
  hash: sha256:527a788cbe650aa6b13d1101ebc16419489bfef20b2ee93042f6eb6a51e898e9
205
209
  type: core
@@ -565,9 +569,9 @@ files:
565
569
  type: core
566
570
  size: 26179
567
571
  - path: core/ids/registry-loader.js
568
- hash: sha256:e98cee3af79091e972b379786345d15ae451afbcba968c10fb3da9bf981bb363
572
+ hash: sha256:88c67bace0a5ab6a14cb1d096e3f9cab9f5edc0dd8377788e27b692ccefbd487
569
573
  type: core
570
- size: 7170
574
+ size: 8096
571
575
  - path: core/ids/registry-updater.js
572
576
  hash: sha256:6d87ec21d32acff1ba9b9d13025118c106ce6db59c1339c3a6ef4b2a02fd7f52
573
577
  type: core
@@ -985,9 +989,9 @@ files:
985
989
  type: core
986
990
  size: 16418
987
991
  - path: core/synapse/runtime/hook-runtime.js
988
- hash: sha256:441bdee8bbfea448f4e20eeb0ff1277352b33e79c9cf6cde9012c6d150fee08b
992
+ hash: sha256:2fdd54f36a1bbb4ba05d6577c607cf2d6711dcf9a06284fc935676189a461fa2
989
993
  type: core
990
- size: 1529
994
+ size: 1572
991
995
  - path: core/synapse/scripts/generate-constitution.js
992
996
  hash: sha256:65405d3e4ee080d19a25fb8967e159360a289e773c15253a351ee163b469e877
993
997
  type: script
@@ -1037,9 +1041,9 @@ files:
1037
1041
  type: data
1038
1042
  size: 34251
1039
1043
  - path: data/entity-registry.yaml
1040
- hash: sha256:7b9bb3a5354107f9ec29105b5948d5c538e2a3b19d49fa42e2e785e4a767c38b
1044
+ hash: sha256:fefd5d2eba3de2c49a3dbf6219cda466062b05a05b894dc2f89886b1f937bd21
1041
1045
  type: data
1042
- size: 289966
1046
+ size: 291072
1043
1047
  - path: data/learned-patterns.yaml
1044
1048
  hash: sha256:24ac0b160615583a0ff783d3da8af80b7f94191575d6db2054ec8e10a3f945dc
1045
1049
  type: data
@@ -1085,9 +1089,9 @@ files:
1085
1089
  type: development
1086
1090
  size: 5012
1087
1091
  - path: development/agents/aios-master.md
1088
- hash: sha256:538fff4398eba7c2492b446fce3a1d9115e5f1c6f494f0c3b45a991526c2295a
1092
+ hash: sha256:092161d318ab523b8cd5c3dc8a2bd19accc23ab7fa731d5b4fa11c5afb8b5a08
1089
1093
  type: agent
1090
- size: 17534
1094
+ size: 17821
1091
1095
  - path: development/agents/analyst.md
1092
1096
  hash: sha256:470384d9ee05d1373fe7519602f135179a88a35895252277823b35339dafd2a3
1093
1097
  type: agent
@@ -2180,6 +2184,10 @@ files:
2180
2184
  hash: sha256:caa2077e7a5bbbba9269b04e878b7772a71422ed6fd138447fe5cfb7345f96fb
2181
2185
  type: task
2182
2186
  size: 23362
2187
+ - path: development/tasks/sync-registry-intel.md
2188
+ hash: sha256:0e69435307db814563823896e7ba9b29a4a9c10d90f6dedec5cb7a6d6f7ba936
2189
+ type: task
2190
+ size: 1664
2183
2191
  - path: development/tasks/tailwind-upgrade.md
2184
2192
  hash: sha256:c369df0a28d8be7f0092405ecaed669a40075841427337990e2346b8c1d43c3a
2185
2193
  type: task
@@ -2429,29 +2437,29 @@ files:
2429
2437
  type: documentation
2430
2438
  size: 16023
2431
2439
  - path: docs/standards/AIOS-COLOR-PALETTE-QUICK-REFERENCE.md
2432
- hash: sha256:3bf52aa948c6f5a79a43ab6cd4170b5ab476737e88813176d4d7a33f4a659edb
2440
+ hash: sha256:b521992d1f6a17b7b624ddbb9e78cb54b9efce62ca78d36b425a3f74f55e5c07
2433
2441
  type: documentation
2434
- size: 4095
2442
+ size: 4093
2435
2443
  - path: docs/standards/AIOS-COLOR-PALETTE-V2.1.md
2436
- hash: sha256:08ddcacf88f3cf5251108de5e30429cb93ba5dcaf5bd0ac88bbcacf6a4b06667
2444
+ hash: sha256:075760cd1734967e8af366fd6824cb3cd37cfae850d18340451d8c4df9f35889
2437
2445
  type: documentation
2438
- size: 9482
2446
+ size: 9474
2439
2447
  - path: docs/standards/EXECUTOR-DECISION-TREE.md
2440
2448
  hash: sha256:106af2a8bc009c129618fbd501e68c6927862dbbc2e28d1a5b67be9b5fc2bb5b
2441
2449
  type: documentation
2442
2450
  size: 19268
2443
2451
  - path: docs/standards/OPEN-SOURCE-VS-SERVICE-DIFFERENCES.md
2444
- hash: sha256:3cb48a85705305a5a70ec35cd110570a5cb71056d151ca226367e83d4a67e0f7
2452
+ hash: sha256:2411b48a14bc11ef78684cd3fb488165d13406832e0b1bc3fae0a15bf1714f3a
2445
2453
  type: documentation
2446
- size: 16398
2454
+ size: 16390
2447
2455
  - path: docs/standards/QUALITY-GATES-SPECIFICATION.md
2448
- hash: sha256:3c9b4ed28b5cf1ec0116d5a0095493beb261f1fe7dbef6ac6dc5e8651660e118
2456
+ hash: sha256:05df49e8ae8909fd583cf131bc2190a1709ba0249b761bf5d51c2e4bedbb4aeb
2449
2457
  type: documentation
2450
- size: 19752
2458
+ size: 19746
2451
2459
  - path: docs/standards/STANDARDS-INDEX.md
2452
- hash: sha256:d099262e71e64bfe8e723203c64f26cbd9645b6e7862d33915151bc2ec6ab4c2
2460
+ hash: sha256:f9c22b0fb6ac3240c44d71a44deeae9ef3a3b873ccae9bf2401f08edec61382a
2453
2461
  type: documentation
2454
- size: 8385
2462
+ size: 8369
2455
2463
  - path: docs/standards/STORY-TEMPLATE-V2-SPECIFICATION.md
2456
2464
  hash: sha256:31cf0854013c05a39020406bcdd8937f48ab7fe85c17274c8a077bdb3c45131f
2457
2465
  type: documentation
package/README.md CHANGED
@@ -36,7 +36,7 @@ npx aios-core install
36
36
  Definição de first-value (binária): ativação de agente + greeting válido + comando inicial com output útil em <= 10 minutos.
37
37
 
38
38
 
39
- ## Compatibilidade de Hooks por IDE (Realidade AIOS 4.0.4)
39
+ ## Compatibilidade de Hooks por IDE (Realidade AIOS 4.2)
40
40
 
41
41
  Muitos recursos avançados do AIOS dependem de eventos de ciclo de vida (hooks). A tabela abaixo mostra a paridade real entre IDEs/plataformas:
42
42
 
@@ -227,7 +227,7 @@ O Synkra AIOS inclui regras pré-configuradas para IDE para melhorar sua experi
227
227
 
228
228
  #### Para Codex CLI:
229
229
 
230
- - ✅ Integração de primeira classe no AIOS 4.0.4 (pipeline de ativação e greeting compartilhado)
230
+ - ✅ Integração de primeira classe no AIOS 4.2 (pipeline de ativação e greeting compartilhado)
231
231
  - ✅ Já configurado! O arquivo `AGENTS.md` na raiz é carregado automaticamente
232
232
  - Opcional: sincronize agentes auxiliares com `npm run sync:ide:codex`
233
233
  - Recomendado neste repositório: gerar e versionar skills locais com `npm run sync:skills:codex`
@@ -376,7 +376,7 @@ $ npx aios-core doctor
376
376
  ✔ npm version: 10.2.3
377
377
  ✔ Git installed: version 2.43.0
378
378
  ✔ GitHub CLI: gh 2.40.1
379
- ✔ Synkra AIOS: v1.0.0
379
+ ✔ Synkra AIOS: v4.2.11
380
380
 
381
381
  Configuration:
382
382
  ✔ .aios-core/ directory exists
@@ -496,7 +496,7 @@ O Synkra AIOS vem com 11 agentes especializados:
496
496
 
497
497
  ## 🤖 AIOS Autonomous Development Engine (ADE)
498
498
 
499
- O Synkra AIOS v1.0.0 introduz o **Autonomous Development Engine (ADE)** - um sistema completo para desenvolvimento autônomo que transforma requisitos em código funcional.
499
+ O Synkra AIOS introduz o **Autonomous Development Engine (ADE)** - um sistema completo para desenvolvimento autônomo que transforma requisitos em código funcional.
500
500
 
501
501
  ### 🎯 O Que é o ADE?
502
502
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "aios-core",
3
- "version": "4.2.11",
3
+ "version": "4.2.13",
4
4
  "description": "Synkra AIOS: AI-Orchestrated System for Full Stack Development - Core Framework",
5
5
  "bin": {
6
6
  "aios": "bin/aios.js",
@@ -719,23 +719,49 @@ async function runWizard(options = {}) {
719
719
  answers.proInstalled = proResult.success;
720
720
  answers.proResult = proResult;
721
721
  } else if (!isCI && !options.quiet) {
722
- // Interactive mode: ask if user has a Pro license
723
- const { hasPro } = await inquirer.prompt([
722
+ // Interactive mode: ask which edition to install
723
+ const { edition } = await inquirer.prompt([
724
724
  {
725
- type: 'confirm',
726
- name: 'hasPro',
727
- message: colors.primary('Do you have an AIOS Pro license key?'),
728
- default: false,
725
+ type: 'list',
726
+ name: 'edition',
727
+ message: colors.primary('Which edition do you want to install?'),
728
+ choices: [
729
+ {
730
+ name: 'Community (free) — agents, workflows, squads, full CLI',
731
+ value: 'community',
732
+ },
733
+ {
734
+ name: 'Pro (requires account) — premium squads, minds, priority support',
735
+ value: 'pro',
736
+ },
737
+ ],
738
+ default: 'community',
729
739
  },
730
740
  ]);
731
741
 
732
- if (hasPro) {
742
+ if (edition === 'pro') {
733
743
  const proResult = await runProWizard(proOptions);
734
744
  answers.proInstalled = proResult.success;
735
745
  answers.proResult = proResult;
736
746
 
737
747
  if (!proResult.success && proResult.error) {
738
- console.error(`\n⚠️ Pro installation issue: ${proResult.error}`);
748
+ console.error(`\n⚠️ Pro activation failed: ${proResult.error}`);
749
+
750
+ const { fallback } = await inquirer.prompt([
751
+ {
752
+ type: 'confirm',
753
+ name: 'fallback',
754
+ message: colors.primary('Continue with Community (free) edition instead?'),
755
+ default: true,
756
+ },
757
+ ]);
758
+
759
+ if (!fallback) {
760
+ console.log('\n👋 Installation cancelled. Run again when ready.');
761
+ return answers;
762
+ }
763
+
764
+ console.log('\n📦 Continuing with Community edition...\n');
739
765
  }
740
766
  } else {
741
767
  answers.proInstalled = false;
@@ -395,7 +395,34 @@ async function loginWithRetry(client, email) {
395
395
  // Activate Pro
396
396
  return activateProByAuth(client, loginResult.sessionToken);
397
397
  } catch (loginError) {
398
- if (loginError.code === 'INVALID_CREDENTIALS') {
398
+ if (loginError.code === 'EMAIL_NOT_VERIFIED') {
399
+ // Email not verified — poll by retrying login until verified
400
+ spinner.info('Email not verified yet. Please check your inbox and click the verification link.');
401
+ console.log(colors.dim(' (Checking every 5 seconds... timeout in 10 minutes)'));
402
+
403
+ const startTime = Date.now();
404
+ while (Date.now() - startTime < VERIFY_POLL_TIMEOUT_MS) {
405
+ await new Promise((resolve) => setTimeout(resolve, VERIFY_POLL_INTERVAL_MS));
406
+ try {
407
+ const retryLogin = await client.login(email, password);
408
+ showSuccess('Email verified!');
409
+ if (!retryLogin.emailVerified) {
410
+ const verifyResult = await waitForEmailVerification(client, retryLogin.sessionToken, email);
411
+ if (!verifyResult.success) return verifyResult;
412
+ }
413
+ return activateProByAuth(client, retryLogin.sessionToken);
414
+ } catch (retryError) {
415
+ if (retryError.code !== 'EMAIL_NOT_VERIFIED') {
416
+ return { success: false, error: retryError.message };
417
+ }
418
+ // Still not verified, continue polling
419
+ }
420
+ }
421
+
422
+ showError('Email verification timed out after 10 minutes.');
423
+ showInfo('Run the installer again to retry.');
424
+ return { success: false, error: 'Email verification timed out.' };
425
+ } else if (loginError.code === 'INVALID_CREDENTIALS') {
399
426
  const remaining = MAX_RETRIES - attempt;
400
427
  if (remaining > 0) {
401
428
  spinner.fail(`Incorrect password. ${remaining} attempt${remaining > 1 ? 's' : ''} remaining.`);
@@ -151,7 +151,24 @@ class LicenseApiClient {
151
151
  break;
152
152
 
153
153
  case 401:
154
- reject(LicenseActivationError.invalidKey());
154
+ // Preserve server error code (e.g., INVALID_CREDENTIALS, EMAIL_NOT_VERIFIED)
155
+ reject(
156
+ new LicenseActivationError(
157
+ message || 'Unauthorized',
158
+ code || 'INVALID_KEY',
159
+ details,
160
+ ),
161
+ );
162
+ break;
163
+
164
+ case 409:
165
+ reject(
166
+ new LicenseActivationError(
167
+ message || 'Conflict',
168
+ code || 'CONFLICT',
169
+ details,
170
+ ),
171
+ );
155
172
  break;
156
173
 
157
174
  case 403:
@@ -198,11 +215,12 @@ class LicenseApiClient {
198
215
  break;
199
216
 
200
217
  default:
218
+ // Preserve server error code/message when available
201
219
  reject(
202
220
  new LicenseActivationError(
203
- `Unexpected response: ${statusCode}`,
204
- 'UNEXPECTED_STATUS',
205
- { statusCode, response },
221
+ message || `Unexpected response: ${statusCode}`,
222
+ code || 'UNEXPECTED_STATUS',
223
+ details || { statusCode, response },
206
224
  ),
207
225
  );
208
226
  }
@@ -402,7 +420,10 @@ class LicenseApiClient {
402
420
  message: response.message || 'Verification email sent. Please check your inbox.',
403
421
  };
404
422
  } catch (error) {
405
- if (error.code === 'BAD_REQUEST' && error.message.includes('already')) {
423
+ if (
424
+ error.code === 'EMAIL_ALREADY_REGISTERED' ||
425
+ (error.code === 'BAD_REQUEST' && error.message.includes('already'))
426
+ ) {
406
427
  throw AuthError.emailAlreadyRegistered();
407
428
  }
408
429
  if (error.code === 'RATE_LIMITED') {
@@ -437,7 +458,14 @@ class LicenseApiClient {
437
458
  emailVerified: response.emailVerified !== false,
438
459
  };
439
460
  } catch (error) {
440
- if (error.code === 'INVALID_KEY' || error.code === 'BAD_REQUEST') {
461
+ if (error.code === 'EMAIL_NOT_VERIFIED') {
462
+ throw AuthError.emailNotVerified();
463
+ }
464
+ if (
465
+ error.code === 'INVALID_KEY' ||
466
+ error.code === 'INVALID_CREDENTIALS' ||
467
+ error.code === 'BAD_REQUEST'
468
+ ) {
441
469
  throw AuthError.invalidCredentials();
442
470
  }
443
471
  if (error.code === 'RATE_LIMITED') {