Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
44 commits
Select commit Hold shift + click to select a range
c2773a0
feat: add optimized AIOX agents and skills for Grok Build
oalanicolas Jul 9, 2026
532e83c
fix: improve grok-skills-sync purpose metadata for IDS registry
oalanicolas Jul 9, 2026
1b50f34
test: harden flaky pre-push suites for local agent pollution
oalanicolas Jul 9, 2026
f94e761
fix: regenerate install manifest for entity-registry hash
oalanicolas Jul 9, 2026
7f63a8e
fix: address CodeRabbit review on Grok skills sync
oalanicolas Jul 9, 2026
ebf28ae
chore: sync entity-registry and install manifest after IDS hook
oalanicolas Jul 9, 2026
bbe445e
docs: add CORE-SUPER-UPDATE epic and roadmap from hub/enterprise harvest
oalanicolas Jul 9, 2026
008e6e9
docs: apply roundtable APPROVE_WITH_FIXES to CORE-SUPER-UPDATE
oalanicolas Jul 9, 2026
9369b1c
docs: rehome CORE-SUPER-UPDATE under docs/framework/epics (architect-…
oalanicolas Jul 9, 2026
7aea6a6
feat(synapse): complete CORE-SU.A1 configurable pipeline timeout test…
oalanicolas Jul 9, 2026
e55a6fd
feat(synapse): wire configurable pipeline timeout in engine and core-…
oalanicolas Jul 9, 2026
03d741b
chore: sync manifest after A1 + mark A1 done on roadmap
oalanicolas Jul 9, 2026
885a34c
fix(config): skip ConfigCache sweep timer under Jest (#797)
oalanicolas Jul 9, 2026
99a7419
chore: regenerate install manifest after ConfigCache fix
oalanicolas Jul 9, 2026
4e35921
feat(permissions): add path, prompt, and SSRF guards (CORE-SU.A3)
oalanicolas Jul 9, 2026
0bae7b5
chore: regenerate install manifest after permissions guards
oalanicolas Jul 9, 2026
9da1efc
feat(security): OSS port denylist CI + doctor check (CORE-SU.A4)
oalanicolas Jul 9, 2026
291e87d
chore: regenerate install manifest after port-denylist
oalanicolas Jul 9, 2026
8fe79fa
feat(sdc): Wave B lean SDC skills + Grok sync (CORE-SUPER-UPDATE)
oalanicolas Jul 9, 2026
3c2339a
feat(sdc): executable full-sdc + wave-execute runtime (CLI First)
oalanicolas Jul 9, 2026
ea6e7ff
feat(sdc): C1 wave-run controller + close Wave A residuals
oalanicolas Jul 9, 2026
de0ae36
fix(security): harden port-denylist scan + format sdc modules
oalanicolas Jul 9, 2026
d407cf7
feat(sdc): complete Wave C via wave-execute + full-sdc (C2–C4)
oalanicolas Jul 9, 2026
3be2517
feat(install): Windows npx ECOMPROMISED guidance (CORE-SU.F1 #773)
oalanicolas Jul 9, 2026
d182465
feat(core): real pm.sh agent CLI + constitution XI/XII + IDE contract
oalanicolas Jul 9, 2026
45341ae
docs(governance): dual-path stories + ignore unhardened .codex
oalanicolas Jul 9, 2026
aa4bac2
feat(harvest): Wave 0 three-way framework diff + analysis corrections
oalanicolas Jul 9, 2026
56f8ce5
docs(harvest): mark Wave 0 arch/story Done; peer env vars
oalanicolas Jul 9, 2026
24fb715
feat(synapse): port memory-bridge heuristics from hub (CORE-SU.MB)
oalanicolas Jul 9, 2026
38b09d1
docs(epic): mark core super update pr-ready
oalanicolas Jul 9, 2026
6469591
chore(ids): refresh generated registry metadata
oalanicolas Jul 9, 2026
6528f4a
chore(epic): freeze CORE-SUPER-UPDATE required scope complete
oalanicolas Jul 9, 2026
f88552b
fix(doctor): keep framework-3way check lightweight
oalanicolas Jul 9, 2026
d3720c9
chore(ids): sync entity-registry after doctor check fix
oalanicolas Jul 9, 2026
8b1f656
docs: strip trailing whitespace in ROADMAP for pre-push
oalanicolas Jul 9, 2026
b3d9104
chore(ids): sync registry metadata after pre-push
oalanicolas Jul 9, 2026
122a6c0
fix(security): address CodeRabbit majors from pre-push review
oalanicolas Jul 9, 2026
59178ae
chore(ids): refresh entity-registry after CR fixes
oalanicolas Jul 9, 2026
0c59e2e
merge: resolve main into feat/core-super-update-epic for PR #801
oalanicolas Jul 9, 2026
72b59bc
fix(ci): allow Claude SDC skills in parity gate
oalanicolas Jul 9, 2026
3c1c87c
chore(ids): sync registry after parity fix
oalanicolas Jul 9, 2026
a46e7b7
fix(ids): skip registry rewrite when entity is unchanged
oalanicolas Jul 9, 2026
468e12e
chore(ids): sync registry after idempotent updater fix
oalanicolas Jul 9, 2026
3110863
docs(security): mark path/ssrf guards as standalone, not wired to enf…
Pedrovaleriolopez Jul 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
212 changes: 212 additions & 0 deletions .aiox-core/cli/commands/sdc/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
/**
* CLI: aiox sdc — lean full-sdc plan / status / verify / mark
*
* Usage:
* aiox sdc plan <story-path> [--mode yolo|interactive] [--force]
* aiox sdc status <story-id|story-path>
* aiox sdc verify <story-path> <phase> [--mark]
* aiox sdc mark <story-id> <phase> --status passed|failed|skipped|halted [--notes "..."]
* aiox sdc phases
*/

'use strict';

const path = require('path');
const { Command } = require('commander');
const sdc = require('../../../core/sdc');

function createSdcCommand() {
const cmd = new Command('sdc');
cmd.description('Lean Full SDC runtime (plan, verify, progress)');

cmd
.command('phases')
.description('List SDC phases')
.action(() => {
console.log(sdc.PHASES.join('\n'));
});

cmd
.command('plan')
.description('Initialize full-sdc run state for a story')
.argument('<story-path>', 'Path to story markdown')
.option('--mode <mode>', 'yolo | interactive', 'interactive')
.option('--force', 'Reset existing state', false)
.option('--json', 'JSON output', false)
.action((storyPath, opts) => {
const { state, meta } = sdc.initFullSdc(storyPath, {
mode: opts.mode,
force: opts.force,
});
if (opts.json) {
console.log(JSON.stringify({ state, meta }, null, 2));
return;
}
console.log(`SDC plan: ${state.storyId}`);
console.log(` path: ${state.storyPath}`);
console.log(` status: ${state.status} (story file: ${meta.status})`);
console.log(` mode: ${state.mode}`);
console.log(` phase: ${state.currentPhase || '(done)'}`);
console.log(` state: ${sdc.sdcStatePath(state.storyId)}`);
console.log(' phases:');
for (const p of sdc.PHASES) {
console.log(` - ${p}: ${state.phases[p].status}`);
}
console.log('\nNext: run skill phases, then: aiox sdc verify <story> <phase> --mark');
});

cmd
.command('status')
.description('Show SDC progress for story id or path')
.argument('<story>', 'Story id or path')
.option('--json', 'JSON output', false)
.action((story, opts) => {
let storyId = story;
let meta = null;
if (story.includes('/') || story.endsWith('.md')) {
meta = sdc.parseStoryFile(story);
storyId = meta.storyId;
}
const state = sdc.loadSdcState(storyId);
if (!state) {
console.error(`No SDC state for ${storyId}. Run: aiox sdc plan <story-path>`);
process.exitCode = 1;
return;
}
if (opts.json) {
console.log(JSON.stringify({ state, meta }, null, 2));
return;
}
console.log(`SDC status: ${state.storyId} [${state.status}]`);
console.log(` current: ${state.currentPhase || '—'}`);
console.log(` qg: ${state.qgIterations}/${state.maxQgIterations}`);
for (const p of sdc.PHASES) {
const ph = state.phases[p];
console.log(` ${p.padEnd(16)} ${ph.status}${ph.at ? ` @ ${ph.at}` : ''}`);
}
});

cmd
.command('verify')
.description('Verify post-phase artifacts on disk')
.argument('<story-path>', 'Path to story markdown')
.argument('<phase>', `One of: ${sdc.PHASES.join('|')}`)
.option('--mark', 'Write result into progress state', false)
.option('--json', 'JSON output', false)
.action((storyPath, phase, opts) => {
if (!sdc.PHASES.includes(phase)) {
console.error(`Unknown phase ${phase}`);
process.exitCode = 1;
return;
}
const { result, state } = sdc.verifyAndMaybeMark(storyPath, phase, {
mark: opts.mark,
});
if (opts.json) {
console.log(JSON.stringify({ result, state }, null, 2));
} else {
console.log(`Verify ${phase}: ${result.ok ? 'OK' : 'FAIL'}`);
for (const c of result.checks) console.log(` ${c}`);
if (opts.mark) {
console.log(`Marked in ${sdc.sdcStatePath(state.storyId)}`);
}
}
if (!result.ok) process.exitCode = 1;
});

cmd
.command('mark')
.description('Manually mark a phase (agent/orchestrator)')
.argument('<story-id>', 'Story id')
.argument('<phase>', `One of: ${sdc.PHASES.join('|')}`)
.requiredOption(
'--status <status>',
'passed | failed | skipped | halted'
)
.option('--notes <notes>', 'Optional notes')
.option('--json', 'JSON output', false)
.action((storyId, phase, opts) => {
let state = sdc.loadSdcState(storyId);
if (!state) {
console.error(`No state for ${storyId}; run aiox sdc plan first`);
process.exitCode = 1;
return;
}
if (phase === 'apply_qa_fixes' && opts.status === 'passed') {
state.qgIterations = (state.qgIterations || 0) + 1;
}
sdc.markPhase(state, phase, opts.status, opts.notes);
sdc.saveSdcState(state);
if (opts.json) {
console.log(JSON.stringify(state, null, 2));
} else {
console.log(`Marked ${phase}=${opts.status} for ${storyId}`);
console.log(` run status: ${state.status}; next: ${state.currentPhase || '—'}`);
}
});

cmd
.command('next')
.description('Print next phase + skill to run for a story')
.argument('<story>', 'Story id or path')
.option('--json', 'JSON output', false)
.action((story, opts) => {
let storyId = story;
let storyPath = null;
if (story.includes('/') || story.endsWith('.md')) {
const meta = sdc.parseStoryFile(story);
storyId = meta.storyId;
storyPath = meta.relPath;
}
let state = sdc.loadSdcState(storyId);
if (!state && storyPath) {
({ state } = sdc.initFullSdc(storyPath));
}
if (!state) {
console.error(`No state for ${storyId}`);
process.exitCode = 1;
return;
}
const phase = state.currentPhase;
const skillMap = {
validate: 'validate-story-draft',
develop: 'develop-story',
review: 'review-story',
apply_qa_fixes: 'apply-qa-fixes',
close: 'close-story',
};
const payload = {
storyId,
storyPath: state.storyPath,
status: state.status,
nextPhase: phase,
skill: phase ? skillMap[phase] : null,
skillPath: phase
? path.join(
'.aiox-core',
'development',
'skills',
skillMap[phase],
'SKILL.md'
)
: null,
};
if (opts.json) {
console.log(JSON.stringify(payload, null, 2));
return;
}
if (!phase) {
console.log(`SDC complete for ${storyId}`);
return;
}
console.log(`Next phase: ${phase}`);
console.log(` skill: ${payload.skill}`);
console.log(` path: ${payload.skillPath}`);
console.log(` story: ${state.storyPath}`);
console.log(` after: aiox sdc verify ${state.storyPath} ${phase} --mark`);
});

return cmd;
}

module.exports = { createSdcCommand };
Loading
Loading