aios-core 4.2.6 → 4.2.7
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/orchestration/context-manager.js +333 -5
- package/.aios-core/core/orchestration/dashboard-integration.js +17 -1
- package/.aios-core/core/orchestration/execution-profile-resolver.js +107 -0
- package/.aios-core/core/orchestration/index.js +3 -0
- package/.aios-core/core/orchestration/skill-dispatcher.js +2 -0
- package/.aios-core/core/orchestration/subagent-prompt-builder.js +2 -0
- package/.aios-core/core/orchestration/workflow-orchestrator.js +113 -5
- package/.aios-core/data/entity-registry.yaml +1114 -1336
- package/.aios-core/development/agents/ux-design-expert.md +1 -1
- package/.aios-core/development/checklists/brownfield-compatibility-checklist.md +114 -0
- package/.aios-core/development/scripts/workflow-state-manager.js +128 -1
- package/.aios-core/development/tasks/next.md +36 -5
- package/.aios-core/hooks/ids-post-commit.js +29 -1
- package/.aios-core/hooks/ids-pre-push.js +29 -1
- package/.aios-core/infrastructure/contracts/compatibility/aios-4.0.4.yaml +44 -0
- package/.aios-core/infrastructure/scripts/validate-parity.js +238 -2
- package/.aios-core/install-manifest.yaml +43 -27
- package/.aios-core/product/templates/brownfield-risk-report-tmpl.yaml +277 -0
- package/.aios-core/workflow-intelligence/engine/suggestion-engine.js +114 -5
- package/LICENSE +13 -1
- package/README.md +39 -9
- package/package.json +8 -6
- package/packages/installer/src/wizard/ide-config-generator.js +0 -117
- package/packages/installer/src/wizard/index.js +2 -118
- package/packages/installer/src/wizard/pro-setup.js +50 -5
- package/scripts/semantic-lint.js +190 -0
|
@@ -196,7 +196,7 @@ commands:
|
|
|
196
196
|
|
|
197
197
|
# === UNIVERSAL COMMANDS ===
|
|
198
198
|
scan {path|url}: 'Analyze HTML/React artifact for patterns'
|
|
199
|
-
integrate {
|
|
199
|
+
integrate {squad}: 'Connect with squad'
|
|
200
200
|
help: 'Show all commands organized by phase'
|
|
201
201
|
status: 'Show current workflow phase'
|
|
202
202
|
guide: 'Show comprehensive usage guide for this agent'
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# Brownfield Compatibility Checklist
|
|
2
|
+
|
|
3
|
+
> Story AIOS-DIFF-4.3.2: Checklist formal de compatibilidade retroativa
|
|
4
|
+
|
|
5
|
+
## Pre-Migration Compatibility Check
|
|
6
|
+
|
|
7
|
+
### 1. Source Control Status
|
|
8
|
+
- [ ] All changes committed to version control
|
|
9
|
+
- [ ] Working branch created from main/master
|
|
10
|
+
- [ ] Remote backup verified (push before migration)
|
|
11
|
+
|
|
12
|
+
### 2. Existing Configuration Preservation
|
|
13
|
+
- [ ] `.env` files backed up (never overwritten by AIOS)
|
|
14
|
+
- [ ] `package.json` scripts preserved
|
|
15
|
+
- [ ] Existing linting config (.eslintrc, .prettierrc) detected
|
|
16
|
+
- [ ] CI/CD workflows (.github/workflows) inventoried
|
|
17
|
+
|
|
18
|
+
### 3. Dependency Compatibility
|
|
19
|
+
- [ ] Node.js version compatible (>=18)
|
|
20
|
+
- [ ] No conflicting global dependencies
|
|
21
|
+
- [ ] Lock file (package-lock.json/yarn.lock) preserved
|
|
22
|
+
|
|
23
|
+
### 4. Directory Structure Analysis
|
|
24
|
+
- [ ] `docs/` directory status checked (empty/existing)
|
|
25
|
+
- [ ] `.aios-core/` not present (fresh install)
|
|
26
|
+
- [ ] No naming conflicts with AIOS directories
|
|
27
|
+
|
|
28
|
+
## During Migration Checks
|
|
29
|
+
|
|
30
|
+
### 5. Non-Destructive Operations
|
|
31
|
+
- [ ] AIOS creates new files, never overwrites existing
|
|
32
|
+
- [ ] Merge conflicts surfaced for user decision
|
|
33
|
+
- [ ] Original files preserved with `.backup` if conflict
|
|
34
|
+
|
|
35
|
+
### 6. Configuration Merge Strategy
|
|
36
|
+
- [ ] Existing `.gitignore` entries preserved + AIOS entries added
|
|
37
|
+
- [ ] TypeScript config extended (not replaced) if existing
|
|
38
|
+
- [ ] ESLint rules merged (not overwritten)
|
|
39
|
+
|
|
40
|
+
### 7. Rollback Points
|
|
41
|
+
- [ ] Pre-migration commit hash recorded
|
|
42
|
+
- [ ] AIOS files clearly identified (can be removed cleanly)
|
|
43
|
+
- [ ] No modifications to existing source code during install
|
|
44
|
+
|
|
45
|
+
## Post-Migration Validation
|
|
46
|
+
|
|
47
|
+
### 8. Existing Functionality
|
|
48
|
+
- [ ] `npm test` passes (if tests existed before)
|
|
49
|
+
- [ ] `npm run build` succeeds (if build existed)
|
|
50
|
+
- [ ] Application starts normally
|
|
51
|
+
|
|
52
|
+
### 9. AIOS Integration
|
|
53
|
+
- [ ] `npx aios-core doctor` reports healthy
|
|
54
|
+
- [ ] Agent activation works (@dev, @architect, etc.)
|
|
55
|
+
- [ ] Existing docs not duplicated
|
|
56
|
+
|
|
57
|
+
### 10. Rollback Verification
|
|
58
|
+
- [ ] `git diff HEAD~1` shows only AIOS additions
|
|
59
|
+
- [ ] `git checkout HEAD~1 -- .` would restore pre-AIOS state
|
|
60
|
+
- [ ] No orphaned AIOS processes or files
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Compatibility Matrix
|
|
65
|
+
|
|
66
|
+
| Existing Config | AIOS Behavior | User Action Required |
|
|
67
|
+
|-----------------|---------------|---------------------|
|
|
68
|
+
| `.eslintrc.*` | Detect + preserve | None |
|
|
69
|
+
| `.prettierrc.*` | Detect + preserve | None |
|
|
70
|
+
| `tsconfig.json` | Extend (not replace) | Review extends |
|
|
71
|
+
| `jest.config.*` | Detect + preserve | None |
|
|
72
|
+
| `docs/*.md` | Skip (don't overwrite) | Manual merge if needed |
|
|
73
|
+
| `.github/workflows/*` | Inventory only | User decides integration |
|
|
74
|
+
| `package.json` scripts | Preserve all | None |
|
|
75
|
+
|
|
76
|
+
## Rollback Procedure
|
|
77
|
+
|
|
78
|
+
If migration fails or is unwanted:
|
|
79
|
+
|
|
80
|
+
```bash
|
|
81
|
+
# Option 1: Full rollback to pre-migration state
|
|
82
|
+
git checkout HEAD~1 -- .
|
|
83
|
+
|
|
84
|
+
# Option 2: Remove only AIOS files
|
|
85
|
+
rm -rf .aios-core/
|
|
86
|
+
rm -rf docs/architecture/ docs/prd/ docs/stories/
|
|
87
|
+
# Review and revert .gitignore AIOS entries
|
|
88
|
+
|
|
89
|
+
# Option 3: Soft rollback (keep docs, remove runtime)
|
|
90
|
+
rm -rf .aios-core/
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Checklist Usage
|
|
96
|
+
|
|
97
|
+
**Pre-Migration:**
|
|
98
|
+
```bash
|
|
99
|
+
# Run compatibility check
|
|
100
|
+
npx aios-core doctor --pre-migration
|
|
101
|
+
```
|
|
102
|
+
|
|
103
|
+
**Post-Migration:**
|
|
104
|
+
```bash
|
|
105
|
+
# Validate migration
|
|
106
|
+
npx aios-core doctor
|
|
107
|
+
npm test # if tests exist
|
|
108
|
+
npm run build # if build exists
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
*AIOS Brownfield Compatibility Checklist v1.0*
|
|
114
|
+
*Story AIOS-DIFF-4.3.2*
|
|
@@ -17,13 +17,15 @@
|
|
|
17
17
|
* - Each session picks up where the last left off via state file
|
|
18
18
|
*
|
|
19
19
|
* @module workflow-state-manager
|
|
20
|
-
* @version
|
|
20
|
+
* @version 2.0.0
|
|
21
21
|
*/
|
|
22
22
|
|
|
23
23
|
const fs = require('fs').promises;
|
|
24
24
|
const path = require('path');
|
|
25
25
|
const yaml = require('js-yaml');
|
|
26
26
|
|
|
27
|
+
const WORKFLOW_STATE_VERSION = '2.0';
|
|
28
|
+
|
|
27
29
|
class WorkflowStateManager {
|
|
28
30
|
/**
|
|
29
31
|
* @param {Object} [options={}]
|
|
@@ -64,6 +66,7 @@ class WorkflowStateManager {
|
|
|
64
66
|
const instanceId = this._generateInstanceId(wf.id);
|
|
65
67
|
|
|
66
68
|
const state = {
|
|
69
|
+
state_version: WORKFLOW_STATE_VERSION,
|
|
67
70
|
workflow_id: wf.id,
|
|
68
71
|
workflow_name: wf.name || wf.id,
|
|
69
72
|
instance_id: instanceId,
|
|
@@ -137,6 +140,130 @@ class WorkflowStateManager {
|
|
|
137
140
|
return state;
|
|
138
141
|
}
|
|
139
142
|
|
|
143
|
+
// ============ Runtime-First Next Action ============
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Build normalized execution state from runtime signals.
|
|
147
|
+
* Deterministic priority:
|
|
148
|
+
* blocked > qa_rejected > ci_red > completed > in_development > ready_for_validation > unknown
|
|
149
|
+
*
|
|
150
|
+
* @param {Object} [signals={}]
|
|
151
|
+
* @param {string} [signals.story_status]
|
|
152
|
+
* @param {string} [signals.qa_status]
|
|
153
|
+
* @param {string} [signals.ci_status]
|
|
154
|
+
* @param {boolean} [signals.has_uncommitted_changes]
|
|
155
|
+
* @returns {{ state: string, reasons: string[], normalized: Object }}
|
|
156
|
+
*/
|
|
157
|
+
evaluateExecutionState(signals = {}) {
|
|
158
|
+
const storyStatus = String(signals.story_status || 'unknown').toLowerCase();
|
|
159
|
+
const qaStatus = String(signals.qa_status || 'unknown').toLowerCase();
|
|
160
|
+
const ciStatus = String(signals.ci_status || 'unknown').toLowerCase();
|
|
161
|
+
const hasUncommitted = Boolean(signals.has_uncommitted_changes);
|
|
162
|
+
|
|
163
|
+
const reasons = [];
|
|
164
|
+
let state = 'unknown';
|
|
165
|
+
|
|
166
|
+
if (storyStatus === 'blocked') {
|
|
167
|
+
state = 'blocked';
|
|
168
|
+
reasons.push('story status is blocked');
|
|
169
|
+
} else if (qaStatus === 'rejected' || qaStatus === 'fail' || qaStatus === 'failed') {
|
|
170
|
+
state = 'qa_rejected';
|
|
171
|
+
reasons.push(`qa status is ${qaStatus}`);
|
|
172
|
+
} else if (ciStatus === 'red' || ciStatus === 'failed' || ciStatus === 'error') {
|
|
173
|
+
state = 'ci_red';
|
|
174
|
+
reasons.push(`ci status is ${ciStatus}`);
|
|
175
|
+
} else if (storyStatus === 'done' || storyStatus === 'completed') {
|
|
176
|
+
state = 'completed';
|
|
177
|
+
reasons.push(`story status is ${storyStatus}`);
|
|
178
|
+
} else if (storyStatus === 'in_progress' || storyStatus === 'review') {
|
|
179
|
+
if (hasUncommitted) {
|
|
180
|
+
state = 'in_development';
|
|
181
|
+
reasons.push('story in progress with uncommitted changes');
|
|
182
|
+
} else {
|
|
183
|
+
state = 'ready_for_validation';
|
|
184
|
+
reasons.push('story in progress with clean working tree');
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return {
|
|
189
|
+
state,
|
|
190
|
+
reasons,
|
|
191
|
+
normalized: {
|
|
192
|
+
story_status: storyStatus,
|
|
193
|
+
qa_status: qaStatus,
|
|
194
|
+
ci_status: ciStatus,
|
|
195
|
+
has_uncommitted_changes: hasUncommitted,
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Deterministic next-action recommendation for runtime-first flows.
|
|
202
|
+
*
|
|
203
|
+
* @param {Object} [signals={}]
|
|
204
|
+
* @param {Object} [options={}]
|
|
205
|
+
* @param {string} [options.story]
|
|
206
|
+
* @returns {{ state: string, command: string, agent: string, rationale: string, confidence: number }}
|
|
207
|
+
*/
|
|
208
|
+
getNextActionRecommendation(signals = {}, options = {}) {
|
|
209
|
+
const result = this.evaluateExecutionState(signals);
|
|
210
|
+
const storyArg = options.story ? ` ${options.story}` : '';
|
|
211
|
+
|
|
212
|
+
const map = {
|
|
213
|
+
blocked: {
|
|
214
|
+
command: `*orchestrate-status${storyArg}`,
|
|
215
|
+
agent: '@po',
|
|
216
|
+
rationale: 'Story is blocked. Surface blockers and unblock path first.',
|
|
217
|
+
confidence: 0.95,
|
|
218
|
+
},
|
|
219
|
+
qa_rejected: {
|
|
220
|
+
command: `*apply-qa-fixes${storyArg}`,
|
|
221
|
+
agent: '@dev',
|
|
222
|
+
rationale: 'QA rejected the story. Apply fixes before progressing.',
|
|
223
|
+
confidence: 0.95,
|
|
224
|
+
},
|
|
225
|
+
ci_red: {
|
|
226
|
+
command: '*run-tests',
|
|
227
|
+
agent: '@dev',
|
|
228
|
+
rationale: 'CI is red. Reproduce and fix failing tests/checks first.',
|
|
229
|
+
confidence: 0.92,
|
|
230
|
+
},
|
|
231
|
+
completed: {
|
|
232
|
+
command: `*close-story${storyArg}`,
|
|
233
|
+
agent: '@po',
|
|
234
|
+
rationale: 'Story is complete. Close lifecycle and move to next item.',
|
|
235
|
+
confidence: 0.9,
|
|
236
|
+
},
|
|
237
|
+
in_development: {
|
|
238
|
+
command: '*run-tests',
|
|
239
|
+
agent: '@dev',
|
|
240
|
+
rationale: 'Code is in progress with local changes. Validate before QA handoff.',
|
|
241
|
+
confidence: 0.85,
|
|
242
|
+
},
|
|
243
|
+
ready_for_validation: {
|
|
244
|
+
command: `*review-build${storyArg}`,
|
|
245
|
+
agent: '@qa',
|
|
246
|
+
rationale: 'Development appears stable. Proceed to QA structured review.',
|
|
247
|
+
confidence: 0.82,
|
|
248
|
+
},
|
|
249
|
+
unknown: {
|
|
250
|
+
command: `*next${storyArg}`,
|
|
251
|
+
agent: '@dev',
|
|
252
|
+
rationale: 'Context is incomplete. Request explicit workflow guidance.',
|
|
253
|
+
confidence: 0.4,
|
|
254
|
+
},
|
|
255
|
+
};
|
|
256
|
+
|
|
257
|
+
const recommendation = map[result.state] || map.unknown;
|
|
258
|
+
return {
|
|
259
|
+
state: result.state,
|
|
260
|
+
command: recommendation.command,
|
|
261
|
+
agent: recommendation.agent,
|
|
262
|
+
rationale: recommendation.rationale,
|
|
263
|
+
confidence: recommendation.confidence,
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
|
|
140
267
|
/**
|
|
141
268
|
* Load state from file
|
|
142
269
|
* @param {string} instanceId
|
|
@@ -4,6 +4,9 @@
|
|
|
4
4
|
|
|
5
5
|
Suggest next commands based on current workflow context using the Workflow Intelligence System (WIS). Helps users navigate workflows efficiently without memorizing command sequences.
|
|
6
6
|
|
|
7
|
+
AIOS 4.0.4 runtime-first mode adds deterministic next-step recommendation from
|
|
8
|
+
execution signals (story/qa/ci/diff) via `workflow-state-manager`.
|
|
9
|
+
|
|
7
10
|
## Task Definition (AIOS Task Format V1.0)
|
|
8
11
|
|
|
9
12
|
```yaml
|
|
@@ -88,7 +91,23 @@ const context = await engine.buildContext({
|
|
|
88
91
|
});
|
|
89
92
|
```
|
|
90
93
|
|
|
91
|
-
### Step 3:
|
|
94
|
+
### Step 3: Runtime-First Deterministic Recommendation (Preferred)
|
|
95
|
+
```javascript
|
|
96
|
+
const { WorkflowStateManager } = require('.aios-core/development/scripts/workflow-state-manager');
|
|
97
|
+
const manager = new WorkflowStateManager();
|
|
98
|
+
|
|
99
|
+
const runtimeNext = manager.getNextActionRecommendation(
|
|
100
|
+
{
|
|
101
|
+
story_status: context.projectState?.storyStatus || 'unknown',
|
|
102
|
+
qa_status: context.projectState?.qaStatus || 'unknown',
|
|
103
|
+
ci_status: context.projectState?.ciStatus || 'unknown',
|
|
104
|
+
has_uncommitted_changes: context.projectState?.hasUncommittedChanges || false,
|
|
105
|
+
},
|
|
106
|
+
{ story: args.story || context.storyPath || '' },
|
|
107
|
+
);
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
### Step 4: Get WIS Suggestions (Fallback / enrichment)
|
|
92
111
|
```javascript
|
|
93
112
|
const result = await engine.suggestNext(context);
|
|
94
113
|
|
|
@@ -103,15 +122,27 @@ const result = await engine.suggestNext(context);
|
|
|
103
122
|
// }
|
|
104
123
|
```
|
|
105
124
|
|
|
106
|
-
### Step
|
|
125
|
+
### Step 5: Format Output
|
|
107
126
|
```javascript
|
|
108
127
|
const formatter = require('.aios-core/workflow-intelligence/engine/output-formatter');
|
|
109
128
|
|
|
110
|
-
|
|
111
|
-
|
|
129
|
+
const runtimeSuggestion = {
|
|
130
|
+
command: runtimeNext.command,
|
|
131
|
+
args: '',
|
|
132
|
+
description: runtimeNext.rationale,
|
|
133
|
+
confidence: runtimeNext.confidence,
|
|
134
|
+
priority: 1,
|
|
135
|
+
};
|
|
136
|
+
const mergedSuggestions = [runtimeSuggestion, ...(result.suggestions || [])];
|
|
137
|
+
const displaySuggestions = args.all ? mergedSuggestions : mergedSuggestions.slice(0, 3);
|
|
112
138
|
|
|
113
139
|
// Display formatted output
|
|
114
|
-
formatter.displaySuggestions(
|
|
140
|
+
formatter.displaySuggestions({
|
|
141
|
+
workflow: result.workflow || 'runtime_first',
|
|
142
|
+
currentState: runtimeNext.state,
|
|
143
|
+
confidence: runtimeNext.confidence,
|
|
144
|
+
suggestions: displaySuggestions,
|
|
145
|
+
});
|
|
115
146
|
```
|
|
116
147
|
|
|
117
148
|
---
|
|
@@ -15,6 +15,25 @@ const path = require('path');
|
|
|
15
15
|
|
|
16
16
|
const REPO_ROOT = path.resolve(__dirname, '../..');
|
|
17
17
|
|
|
18
|
+
function isDocsOnlyPath(relativePath) {
|
|
19
|
+
const p = String(relativePath || '').replace(/\\/g, '/');
|
|
20
|
+
if (!p) return false;
|
|
21
|
+
|
|
22
|
+
if (p.startsWith('docs/')) return true;
|
|
23
|
+
if (p === 'README.md') return true;
|
|
24
|
+
if (p === 'CHANGELOG.md') return true;
|
|
25
|
+
if (p === 'CONTRIBUTING.md') return true;
|
|
26
|
+
if (p === 'CODE_OF_CONDUCT.md') return true;
|
|
27
|
+
if (p === 'AGENTS.md') return true;
|
|
28
|
+
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
function isDocsOnlyCommit(changes) {
|
|
33
|
+
if (!Array.isArray(changes) || changes.length === 0) return false;
|
|
34
|
+
return changes.every((c) => isDocsOnlyPath(c.relativePath));
|
|
35
|
+
}
|
|
36
|
+
|
|
18
37
|
function getChangedFilesFromLastCommit() {
|
|
19
38
|
try {
|
|
20
39
|
const output = execSync('git diff-tree --no-commit-id --name-status -r HEAD', {
|
|
@@ -52,7 +71,11 @@ function getChangedFilesFromLastCommit() {
|
|
|
52
71
|
}
|
|
53
72
|
|
|
54
73
|
if (!filePath) continue;
|
|
55
|
-
changes.push({
|
|
74
|
+
changes.push({
|
|
75
|
+
action,
|
|
76
|
+
relativePath: filePath,
|
|
77
|
+
filePath: path.resolve(REPO_ROOT, filePath),
|
|
78
|
+
});
|
|
56
79
|
}
|
|
57
80
|
|
|
58
81
|
return changes;
|
|
@@ -67,6 +90,11 @@ async function main() {
|
|
|
67
90
|
|
|
68
91
|
if (changes.length === 0) return;
|
|
69
92
|
|
|
93
|
+
if (process.env.AIOS_IDS_FORCE !== '1' && isDocsOnlyCommit(changes)) {
|
|
94
|
+
console.log('[IDS-Hook] Docs-only commit detected, skipping registry update.');
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
70
98
|
try {
|
|
71
99
|
const { RegistryUpdater } = require(path.resolve(REPO_ROOT, '.aios-core/core/ids/registry-updater.js'));
|
|
72
100
|
const updater = new RegistryUpdater();
|
|
@@ -16,6 +16,25 @@ const path = require('path');
|
|
|
16
16
|
|
|
17
17
|
const REPO_ROOT = path.resolve(__dirname, '../..');
|
|
18
18
|
|
|
19
|
+
function isDocsOnlyPath(relativePath) {
|
|
20
|
+
const p = String(relativePath || '').replace(/\\/g, '/');
|
|
21
|
+
if (!p) return false;
|
|
22
|
+
|
|
23
|
+
if (p.startsWith('docs/')) return true;
|
|
24
|
+
if (p === 'README.md') return true;
|
|
25
|
+
if (p === 'CHANGELOG.md') return true;
|
|
26
|
+
if (p === 'CONTRIBUTING.md') return true;
|
|
27
|
+
if (p === 'CODE_OF_CONDUCT.md') return true;
|
|
28
|
+
if (p === 'AGENTS.md') return true;
|
|
29
|
+
|
|
30
|
+
return false;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function isDocsOnlyPush(changes) {
|
|
34
|
+
if (!Array.isArray(changes) || changes.length === 0) return false;
|
|
35
|
+
return changes.every((c) => isDocsOnlyPath(c.relativePath));
|
|
36
|
+
}
|
|
37
|
+
|
|
19
38
|
function getChangedFilesSinceRemote() {
|
|
20
39
|
try {
|
|
21
40
|
const trackingBranch = execSync('git rev-parse --abbrev-ref --symbolic-full-name @{u}', {
|
|
@@ -58,7 +77,11 @@ function getChangedFilesSinceRemote() {
|
|
|
58
77
|
}
|
|
59
78
|
|
|
60
79
|
if (!filePath) continue;
|
|
61
|
-
changes.push({
|
|
80
|
+
changes.push({
|
|
81
|
+
action,
|
|
82
|
+
relativePath: filePath,
|
|
83
|
+
filePath: path.resolve(REPO_ROOT, filePath),
|
|
84
|
+
});
|
|
62
85
|
}
|
|
63
86
|
|
|
64
87
|
return changes;
|
|
@@ -76,6 +99,11 @@ async function main() {
|
|
|
76
99
|
process.exit(0);
|
|
77
100
|
}
|
|
78
101
|
|
|
102
|
+
if (process.env.AIOS_IDS_FORCE !== '1' && isDocsOnlyPush(changes)) {
|
|
103
|
+
console.log('[IDS-Hook] Docs-only push detected, skipping registry update.');
|
|
104
|
+
process.exit(0);
|
|
105
|
+
}
|
|
106
|
+
|
|
79
107
|
try {
|
|
80
108
|
const { RegistryUpdater } = require(path.resolve(REPO_ROOT, '.aios-core/core/ids/registry-updater.js'));
|
|
81
109
|
const updater = new RegistryUpdater();
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
release: "AIOS 4.0.4"
|
|
2
|
+
updated_at: "2026-02-16"
|
|
3
|
+
source_of_truth:
|
|
4
|
+
docs_matrix: "docs/ide-integration.md"
|
|
5
|
+
validator: ".aios-core/infrastructure/scripts/validate-parity.js"
|
|
6
|
+
|
|
7
|
+
global_required_checks:
|
|
8
|
+
- paths
|
|
9
|
+
|
|
10
|
+
ide_matrix:
|
|
11
|
+
- ide: "claude-code"
|
|
12
|
+
display_name: "Claude Code"
|
|
13
|
+
expected_status: "Works"
|
|
14
|
+
required_checks:
|
|
15
|
+
- claude-sync
|
|
16
|
+
- claude-integration
|
|
17
|
+
- ide: "gemini"
|
|
18
|
+
display_name: "Gemini CLI"
|
|
19
|
+
expected_status: "Works"
|
|
20
|
+
required_checks:
|
|
21
|
+
- gemini-sync
|
|
22
|
+
- gemini-integration
|
|
23
|
+
- ide: "codex"
|
|
24
|
+
display_name: "Codex CLI"
|
|
25
|
+
expected_status: "Limited"
|
|
26
|
+
required_checks:
|
|
27
|
+
- codex-sync
|
|
28
|
+
- codex-integration
|
|
29
|
+
- codex-skills
|
|
30
|
+
- ide: "cursor"
|
|
31
|
+
display_name: "Cursor"
|
|
32
|
+
expected_status: "Limited"
|
|
33
|
+
required_checks:
|
|
34
|
+
- cursor-sync
|
|
35
|
+
- ide: "github-copilot"
|
|
36
|
+
display_name: "GitHub Copilot"
|
|
37
|
+
expected_status: "Limited"
|
|
38
|
+
required_checks:
|
|
39
|
+
- github-copilot-sync
|
|
40
|
+
- ide: "antigravity"
|
|
41
|
+
display_name: "AntiGravity"
|
|
42
|
+
expected_status: "Limited"
|
|
43
|
+
required_checks:
|
|
44
|
+
- antigravity-sync
|