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.
Files changed (26) hide show
  1. package/.aios-core/core/orchestration/context-manager.js +333 -5
  2. package/.aios-core/core/orchestration/dashboard-integration.js +17 -1
  3. package/.aios-core/core/orchestration/execution-profile-resolver.js +107 -0
  4. package/.aios-core/core/orchestration/index.js +3 -0
  5. package/.aios-core/core/orchestration/skill-dispatcher.js +2 -0
  6. package/.aios-core/core/orchestration/subagent-prompt-builder.js +2 -0
  7. package/.aios-core/core/orchestration/workflow-orchestrator.js +113 -5
  8. package/.aios-core/data/entity-registry.yaml +1114 -1336
  9. package/.aios-core/development/agents/ux-design-expert.md +1 -1
  10. package/.aios-core/development/checklists/brownfield-compatibility-checklist.md +114 -0
  11. package/.aios-core/development/scripts/workflow-state-manager.js +128 -1
  12. package/.aios-core/development/tasks/next.md +36 -5
  13. package/.aios-core/hooks/ids-post-commit.js +29 -1
  14. package/.aios-core/hooks/ids-pre-push.js +29 -1
  15. package/.aios-core/infrastructure/contracts/compatibility/aios-4.0.4.yaml +44 -0
  16. package/.aios-core/infrastructure/scripts/validate-parity.js +238 -2
  17. package/.aios-core/install-manifest.yaml +43 -27
  18. package/.aios-core/product/templates/brownfield-risk-report-tmpl.yaml +277 -0
  19. package/.aios-core/workflow-intelligence/engine/suggestion-engine.js +114 -5
  20. package/LICENSE +13 -1
  21. package/README.md +39 -9
  22. package/package.json +8 -6
  23. package/packages/installer/src/wizard/ide-config-generator.js +0 -117
  24. package/packages/installer/src/wizard/index.js +2 -118
  25. package/packages/installer/src/wizard/pro-setup.js +50 -5
  26. 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 {pack}: 'Connect with squad'
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 1.0.0
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: Get Suggestions
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 4: Format Output
125
+ ### Step 5: Format Output
107
126
  ```javascript
108
127
  const formatter = require('.aios-core/workflow-intelligence/engine/output-formatter');
109
128
 
110
- // Limit to top 3 unless --all flag
111
- const displaySuggestions = args.all ? result.suggestions : result.suggestions.slice(0, 3);
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(result.workflow, result.currentState, result.confidence, 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({ action, filePath: path.resolve(REPO_ROOT, filePath) });
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({ action, filePath: path.resolve(REPO_ROOT, filePath) });
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