burhan-mop 0.1.0 → 0.1.2
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/{.memoryofplanet → .MOP}/PROTOCOL.md +40 -37
- package/{.memoryofplanet → .MOP}/STATE.json +11 -11
- package/{.memoryofplanet → .MOP}/config/defaults.json +2 -2
- package/.MOP/scripts/burhan-mop.mjs +257 -0
- package/{.memoryofplanet → .MOP}/scripts/mop-auto-deploy.mjs +5 -6
- package/{.memoryofplanet → .MOP}/scripts/mop-autosycn.mjs +24 -24
- package/{.memoryofplanet → .MOP}/scripts/mop-core.mjs +24 -24
- package/{.memoryofplanet → .MOP}/scripts/mop-workflow.mjs +17 -17
- package/.agents/AGENTS.md +7 -6
- package/.agents/skills/auto-deploy/SKILL.md +2 -2
- package/.agents/skills/autosycn/SKILL.md +10 -10
- package/.agents/skills/mop-help/SKILL.md +4 -4
- package/.agents/skills/ruflo-core/SKILL.md +2 -3
- package/.claude/skills/auto-deploy/SKILL.md +2 -2
- package/.claude/skills/autosycn/SKILL.md +7 -7
- package/.claude/skills/mop-help/SKILL.md +4 -4
- package/.codex/config.toml +1 -1
- package/AGENTS.md +10 -9
- package/CLAUDE.md +10 -9
- package/GEMINI.md +3 -3
- package/README.bm.md +152 -0
- package/README.md +68 -1013
- package/bin/burhan-mop.mjs +1 -1
- package/bin/mop-core.mjs +1 -1
- package/bin/mop-workflow.mjs +1 -1
- package/package.json +8 -7
- package/.memoryofplanet/scripts/burhan-mop.mjs +0 -124
- /package/{.memoryofplanet → .MOP}/config/team.json +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/adversarial-review.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/architecture.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/decision-log.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/handoff.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/implementation-notes.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/prd.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/product-brief.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/readiness-report.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/release-notes.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/review.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/story.md +0 -0
- /package/{.memoryofplanet → .MOP}/templates/artifacts/ux-spec.md +0 -0
|
@@ -97,7 +97,7 @@ function requireActiveAgent(state, actor, role = 'core', title = 'Core Agent') {
|
|
|
97
97
|
throw new Error([
|
|
98
98
|
`Agent diperlukan sebelum autosycn untuk ${actor}.`,
|
|
99
99
|
`Task ini perlukan ${title}. Agent ini belum ada nama lagi atau belum dipilih.`,
|
|
100
|
-
`Jalankan: node .
|
|
100
|
+
`Jalankan: node .MOP/scripts/mop-core.mjs agent activate --actor ${actor} --role ${role} --title "${title}" --name "<agent-name>"`
|
|
101
101
|
].join(' '));
|
|
102
102
|
}
|
|
103
103
|
|
|
@@ -139,7 +139,7 @@ function identityFor(state, actor) {
|
|
|
139
139
|
throw new Error([
|
|
140
140
|
`Missing git email for ${actor}.`,
|
|
141
141
|
'Set a GitHub-verified email or noreply email first:',
|
|
142
|
-
`node .
|
|
142
|
+
`node .MOP/scripts/mop-core.mjs member git-identity --actor ${actor} --name "${name}" --email "<github-verified-email>" [--github-username "<username>"]`
|
|
143
143
|
].join(' '));
|
|
144
144
|
}
|
|
145
145
|
return {
|
|
@@ -248,8 +248,8 @@ function runProjectCommand(command, env) {
|
|
|
248
248
|
}
|
|
249
249
|
|
|
250
250
|
function validateStateIfPresent() {
|
|
251
|
-
if (!existsSync(join(rootDir, '.
|
|
252
|
-
const result = spawnSync('node', ['.
|
|
251
|
+
if (!existsSync(join(rootDir, '.MOP', 'STATE.json'))) return 'skipped';
|
|
252
|
+
const result = spawnSync('node', ['.MOP/scripts/mop-core.mjs', 'validate'], {
|
|
253
253
|
cwd: rootDir,
|
|
254
254
|
encoding: 'utf8'
|
|
255
255
|
});
|
|
@@ -353,7 +353,7 @@ function syncMainFromOrigin(state, env) {
|
|
|
353
353
|
function preflight(args) {
|
|
354
354
|
ensureGitRepo();
|
|
355
355
|
const state = readState();
|
|
356
|
-
if (!state.initialized) throw new Error('
|
|
356
|
+
if (!state.initialized) throw new Error('MOP is not initialized.');
|
|
357
357
|
const actor = requireArg(args, 'actor');
|
|
358
358
|
const agent = requireActiveAgent(state, actor);
|
|
359
359
|
const identity = identityFor(state, actor);
|
|
@@ -406,10 +406,10 @@ function saveMemory(actor, summary) {
|
|
|
406
406
|
function push(args) {
|
|
407
407
|
ensureGitRepo();
|
|
408
408
|
const state = readState();
|
|
409
|
-
if (!state.initialized) throw new Error('
|
|
409
|
+
if (!state.initialized) throw new Error('MOP is not initialized.');
|
|
410
410
|
const actor = requireArg(args, 'actor');
|
|
411
411
|
const agent = requireActiveAgent(state, actor);
|
|
412
|
-
const reason = String(args.reason || '
|
|
412
|
+
const reason = String(args.reason || 'MOP autosycn');
|
|
413
413
|
const identity = identityFor(state, actor);
|
|
414
414
|
const env = identityEnv(identity);
|
|
415
415
|
const ghStatus = verifyGhUser(identity, state);
|
|
@@ -419,7 +419,7 @@ function push(args) {
|
|
|
419
419
|
const before = currentBranch();
|
|
420
420
|
const dirty = runGit(['status', '--porcelain']);
|
|
421
421
|
if (state.mode === 'team' && before !== target && dirty) {
|
|
422
|
-
throw new Error(`Team autosycn must commit from ${target}. Run preflight before starting work: node .
|
|
422
|
+
throw new Error(`Team autosycn must commit from ${target}. Run preflight before starting work: node .MOP/scripts/mop-autosycn.mjs preflight --actor ${actor}`);
|
|
423
423
|
}
|
|
424
424
|
ensureBranch(target);
|
|
425
425
|
const commit = commitIfNeeded(reason, env);
|
|
@@ -439,7 +439,7 @@ function push(args) {
|
|
|
439
439
|
|
|
440
440
|
function init(args) {
|
|
441
441
|
const state = readState();
|
|
442
|
-
if (!state.initialized) throw new Error('
|
|
442
|
+
if (!state.initialized) throw new Error('MOP is not initialized.');
|
|
443
443
|
const actor = requireArg(args, 'actor');
|
|
444
444
|
const agent = requireActiveAgent(state, actor);
|
|
445
445
|
if (actor !== state.ownerCodename) throw new Error('Only the owner can initialize autosycn.');
|
|
@@ -456,7 +456,7 @@ function init(args) {
|
|
|
456
456
|
appendLedger(state, actor, 'autosycn-init', `Initialized autosycn remote ${remote}.`, agent);
|
|
457
457
|
if (url) state.githubUrl = url;
|
|
458
458
|
writeState(state);
|
|
459
|
-
const commit = commitIfNeeded('Initialize
|
|
459
|
+
const commit = commitIfNeeded('Initialize MOP autosycn baseline', env);
|
|
460
460
|
runGit(['push', '-u', 'origin', state.autosync?.targetMainBranch || 'main'], { env });
|
|
461
461
|
|
|
462
462
|
console.log(JSON.stringify({
|
|
@@ -474,7 +474,7 @@ function init(args) {
|
|
|
474
474
|
function mergeMain(args) {
|
|
475
475
|
ensureGitRepo();
|
|
476
476
|
const state = readState();
|
|
477
|
-
if (!state.initialized) throw new Error('
|
|
477
|
+
if (!state.initialized) throw new Error('MOP is not initialized.');
|
|
478
478
|
const actor = requireArg(args, 'actor');
|
|
479
479
|
const agent = requireActiveAgent(state, actor);
|
|
480
480
|
if (state.autosync?.requireOwnerForMerge === true && actor !== state.ownerCodename) {
|
|
@@ -500,9 +500,9 @@ function mergeMain(args) {
|
|
|
500
500
|
if (merge.status !== 0) {
|
|
501
501
|
const conflicted = runOptional('git', ['diff', '--name-only', '--diff-filter=U']);
|
|
502
502
|
const files = conflicted.stdout.split(/\r?\n/).filter(Boolean);
|
|
503
|
-
if (files.length === 1 && files[0].replaceAll('\\', '/') === '.
|
|
504
|
-
runGit(['checkout', '--ours', '--', '.
|
|
505
|
-
runGit(['add', '.
|
|
503
|
+
if (files.length === 1 && files[0].replaceAll('\\', '/') === '.MOP/STATE.json') {
|
|
504
|
+
runGit(['checkout', '--ours', '--', '.MOP/STATE.json']);
|
|
505
|
+
runGit(['add', '.MOP/STATE.json']);
|
|
506
506
|
} else {
|
|
507
507
|
runOptional('git', ['merge', '--abort']);
|
|
508
508
|
const detail = `${merge.stderr || merge.stdout}`.trim();
|
|
@@ -518,7 +518,7 @@ function mergeMain(args) {
|
|
|
518
518
|
const mergedState = readState();
|
|
519
519
|
appendLedger(mergedState, guardian.name || 'BURHAN-MOP', 'merge-approved', `${source} approved and merged to ${mainBranch}.`);
|
|
520
520
|
writeState(mergedState);
|
|
521
|
-
runGit(['add', '.
|
|
521
|
+
runGit(['add', '.MOP/STATE.json']);
|
|
522
522
|
}
|
|
523
523
|
runGit(['commit', '-m', reason], { env });
|
|
524
524
|
} catch (error) {
|
|
@@ -543,7 +543,7 @@ function mergeMain(args) {
|
|
|
543
543
|
|
|
544
544
|
function runAll(args) {
|
|
545
545
|
const actor = requireArg(args, 'actor');
|
|
546
|
-
const reason = String(args.reason || '
|
|
546
|
+
const reason = String(args.reason || 'MOP autosycn');
|
|
547
547
|
saveMemory(actor, reason);
|
|
548
548
|
push({ ...args, actor, reason });
|
|
549
549
|
const state = readState();
|
|
@@ -590,7 +590,7 @@ function main() {
|
|
|
590
590
|
if (command === 'init') return init(args);
|
|
591
591
|
if (command === 'memory') {
|
|
592
592
|
const actor = requireArg(args, 'actor');
|
|
593
|
-
const summary = String(args.summary || args.reason || '
|
|
593
|
+
const summary = String(args.summary || args.reason || 'MOP conversation');
|
|
594
594
|
saveMemory(actor, summary);
|
|
595
595
|
console.log(`Memory saved for ${actor}.`);
|
|
596
596
|
return;
|
|
@@ -600,13 +600,13 @@ function main() {
|
|
|
600
600
|
if (command === 'run') return runAll(args);
|
|
601
601
|
|
|
602
602
|
console.log(`Usage:
|
|
603
|
-
node .
|
|
604
|
-
node .
|
|
605
|
-
node .
|
|
606
|
-
node .
|
|
607
|
-
node .
|
|
608
|
-
node .
|
|
609
|
-
node .
|
|
603
|
+
node .MOP/scripts/mop-autosycn.mjs status
|
|
604
|
+
node .MOP/scripts/mop-autosycn.mjs preflight --actor <codename>
|
|
605
|
+
node .MOP/scripts/mop-autosycn.mjs init --actor <owner-codename> --url <github-url>
|
|
606
|
+
node .MOP/scripts/mop-autosycn.mjs memory --actor <codename> --summary "what happened"
|
|
607
|
+
node .MOP/scripts/mop-autosycn.mjs push --actor <codename> --reason "what changed"
|
|
608
|
+
node .MOP/scripts/mop-autosycn.mjs merge --actor <owner> --from <codename> --reason "merge reason"
|
|
609
|
+
node .MOP/scripts/mop-autosycn.mjs run --actor <codename> --reason "what changed"`);
|
|
610
610
|
}
|
|
611
611
|
|
|
612
612
|
try {
|
|
@@ -93,7 +93,7 @@ function requireActiveAgent(state, actor, role = 'core', title = 'Core Agent') {
|
|
|
93
93
|
throw new Error([
|
|
94
94
|
`Agent diperlukan sebelum sambung kerja untuk ${actor}.`,
|
|
95
95
|
`Task ini perlukan ${title}. Agent ini belum ada nama lagi atau belum dipilih.`,
|
|
96
|
-
`Jalankan: node .
|
|
96
|
+
`Jalankan: node .MOP/scripts/mop-core.mjs agent activate --actor ${actor} --role ${role} --title "${title}" --name "<agent-name>"`
|
|
97
97
|
].join(' '));
|
|
98
98
|
}
|
|
99
99
|
|
|
@@ -345,10 +345,10 @@ function inferAgentRoute(state, taskText) {
|
|
|
345
345
|
function setup(args) {
|
|
346
346
|
const state = readState();
|
|
347
347
|
if (state.initialized) {
|
|
348
|
-
throw new Error('
|
|
348
|
+
throw new Error('MOP already initialized.');
|
|
349
349
|
}
|
|
350
350
|
|
|
351
|
-
const folderDefault = rootDir.split(/[\\/]/).filter(Boolean).pop() || '
|
|
351
|
+
const folderDefault = rootDir.split(/[\\/]/).filter(Boolean).pop() || 'MOP';
|
|
352
352
|
const projectName = String(args['project-name'] || folderDefault);
|
|
353
353
|
const displayName = requireArg(args, 'name');
|
|
354
354
|
const codename = slug(requireArg(args, 'codename'));
|
|
@@ -411,7 +411,7 @@ function setup(args) {
|
|
|
411
411
|
};
|
|
412
412
|
appendLedger(state, codename, 'setup', `Initialized ${projectName} in ${mode} mode.`);
|
|
413
413
|
writeState(state);
|
|
414
|
-
console.log(`
|
|
414
|
+
console.log(`MOP initialized. Owner ${displayName} (${codename}) is active.`);
|
|
415
415
|
}
|
|
416
416
|
|
|
417
417
|
function login(args) {
|
|
@@ -429,13 +429,13 @@ function login(args) {
|
|
|
429
429
|
writeState(state);
|
|
430
430
|
console.log(`Active member: ${codename}`);
|
|
431
431
|
if (!activeAgentFor(state, codename) && state.agentPolicy?.requiredAfterAuth !== false) {
|
|
432
|
-
console.log(`Agent diperlukan. Jalankan: node .
|
|
432
|
+
console.log(`Agent diperlukan. Jalankan: node .MOP/scripts/mop-core.mjs agent activate --actor ${codename} --role ${state.agentPolicy?.defaultRole || 'core'} --title "${state.agentPolicy?.defaultTitle || 'Core Agent'}" --name "<agent-name>"`);
|
|
433
433
|
}
|
|
434
434
|
}
|
|
435
435
|
|
|
436
436
|
function agentActivate(args) {
|
|
437
437
|
const state = readState();
|
|
438
|
-
if (!state.initialized) throw new Error('
|
|
438
|
+
if (!state.initialized) throw new Error('MOP is not initialized.');
|
|
439
439
|
const actor = slug(requireArg(args, 'actor'));
|
|
440
440
|
if (!state.members?.[actor]) throw new Error('Unknown actor.');
|
|
441
441
|
|
|
@@ -472,7 +472,7 @@ function agentActivate(args) {
|
|
|
472
472
|
|
|
473
473
|
function agentUse(args) {
|
|
474
474
|
const state = readState();
|
|
475
|
-
if (!state.initialized) throw new Error('
|
|
475
|
+
if (!state.initialized) throw new Error('MOP is not initialized.');
|
|
476
476
|
const actor = slug(requireArg(args, 'actor'));
|
|
477
477
|
if (!state.members?.[actor]) throw new Error('Unknown actor.');
|
|
478
478
|
const name = requireArg(args, 'name').trim();
|
|
@@ -521,7 +521,7 @@ function agentRequire(args) {
|
|
|
521
521
|
|
|
522
522
|
function agentRoute(args) {
|
|
523
523
|
const state = readState();
|
|
524
|
-
if (!state.initialized) throw new Error('
|
|
524
|
+
if (!state.initialized) throw new Error('MOP is not initialized.');
|
|
525
525
|
if (state.agentRouter?.enabled === false) throw new Error('Agent Router is disabled.');
|
|
526
526
|
const actor = slug(requireArg(args, 'actor'));
|
|
527
527
|
if (!state.members?.[actor]) throw new Error('Unknown actor.');
|
|
@@ -567,7 +567,7 @@ function agentRoute(args) {
|
|
|
567
567
|
response.nextAction = 'name-required-party-agents';
|
|
568
568
|
response.message = 'Party mode diperlukan, tetapi ada agent terlibat yang belum dinamakan.';
|
|
569
569
|
response.missingAgentCommands = missingPartyAgents.map((item) => (
|
|
570
|
-
`node .
|
|
570
|
+
`node .MOP/scripts/mop-core.mjs agent activate --actor ${actor} --role ${item.role} --title "${item.title}" --name "<agent-name>"`
|
|
571
571
|
));
|
|
572
572
|
} else {
|
|
573
573
|
response.nextAction = route.needsClarification ? 'ask-clarifying-questions' : 'proceed-with-agent';
|
|
@@ -576,7 +576,7 @@ function agentRoute(args) {
|
|
|
576
576
|
response.nextAction = 'name-required-agent';
|
|
577
577
|
response.message = `Task ini perlukan ${route.primaryTitle}. Agent ini belum ada nama lagi atau belum dipilih.`;
|
|
578
578
|
response.ask = `Beri nama untuk ${route.primaryTitle} kamu:`;
|
|
579
|
-
response.command = `node .
|
|
579
|
+
response.command = `node .MOP/scripts/mop-core.mjs agent activate --actor ${actor} --role ${route.primaryRole} --title "${route.primaryTitle}" --name "<agent-name>"`;
|
|
580
580
|
if (route.needsClarification) response.afterNaming = route.questions;
|
|
581
581
|
}
|
|
582
582
|
|
|
@@ -593,7 +593,7 @@ function agentList() {
|
|
|
593
593
|
|
|
594
594
|
function memberGitIdentity(args) {
|
|
595
595
|
const state = readState();
|
|
596
|
-
if (!state.initialized) throw new Error('
|
|
596
|
+
if (!state.initialized) throw new Error('MOP is not initialized.');
|
|
597
597
|
const actor = slug(requireArg(args, 'actor'));
|
|
598
598
|
const member = state.members?.[actor];
|
|
599
599
|
if (!member) throw new Error('Unknown actor.');
|
|
@@ -651,7 +651,7 @@ function validate() {
|
|
|
651
651
|
}
|
|
652
652
|
}
|
|
653
653
|
for (const type of state.artifacts?.types || []) {
|
|
654
|
-
const templatePath = join(rootDir, state.artifacts?.templateDirectory || '.
|
|
654
|
+
const templatePath = join(rootDir, state.artifacts?.templateDirectory || '.MOP/templates/artifacts', `${type}.md`);
|
|
655
655
|
if (!existsSync(templatePath)) errors.push(`artifact template missing: ${templatePath}`);
|
|
656
656
|
const folder = state.artifacts?.folderByType?.[type];
|
|
657
657
|
if (state.artifacts?.folderByType && (!folder || typeof folder !== 'string')) {
|
|
@@ -684,7 +684,7 @@ function validate() {
|
|
|
684
684
|
process.exitCode = 1;
|
|
685
685
|
return;
|
|
686
686
|
}
|
|
687
|
-
console.log('
|
|
687
|
+
console.log('MOP state OK.');
|
|
688
688
|
}
|
|
689
689
|
|
|
690
690
|
function status() {
|
|
@@ -753,17 +753,17 @@ function main() {
|
|
|
753
753
|
if (command === 'agent' && subcommand === 'list') return agentList();
|
|
754
754
|
|
|
755
755
|
console.log(`Usage:
|
|
756
|
-
node .
|
|
757
|
-
node .
|
|
758
|
-
node .
|
|
759
|
-
node .
|
|
760
|
-
node .
|
|
761
|
-
node .
|
|
762
|
-
node .
|
|
763
|
-
node .
|
|
764
|
-
node .
|
|
765
|
-
node .
|
|
766
|
-
node .
|
|
756
|
+
node .MOP/scripts/mop-core.mjs status
|
|
757
|
+
node .MOP/scripts/mop-core.mjs validate
|
|
758
|
+
node .MOP/scripts/mop-core.mjs setup --project-name NAME --name DISPLAY --codename CODE --password PASS --mode solo|team --conversation-language LANG --coding-language LANG --git-email EMAIL [--git-name NAME] [--github-username USER] [--github-url URL]
|
|
759
|
+
node .MOP/scripts/mop-core.mjs login --codename CODE --password PASS
|
|
760
|
+
node .MOP/scripts/mop-core.mjs member git-identity --actor CODE --name NAME --email EMAIL [--github-username USER]
|
|
761
|
+
node .MOP/scripts/mop-core.mjs agent activate --actor CODE --role ROLE --title TITLE --name NAME
|
|
762
|
+
node .MOP/scripts/mop-core.mjs agent use --actor CODE --name NAME
|
|
763
|
+
node .MOP/scripts/mop-core.mjs agent current --actor CODE
|
|
764
|
+
node .MOP/scripts/mop-core.mjs agent require --actor CODE [--role ROLE] [--title TITLE]
|
|
765
|
+
node .MOP/scripts/mop-core.mjs agent route --actor CODE --task "task text"
|
|
766
|
+
node .MOP/scripts/mop-core.mjs agent list`);
|
|
767
767
|
}
|
|
768
768
|
|
|
769
769
|
try {
|
|
@@ -76,9 +76,9 @@ function deepMerge(base, override) {
|
|
|
76
76
|
|
|
77
77
|
function mergedConfig(state, actor = '') {
|
|
78
78
|
const files = state.customization?.files || {};
|
|
79
|
-
const defaults = readJson(join(rootDir, files.defaults || '.
|
|
80
|
-
const team = readJson(join(rootDir, files.team || '.
|
|
81
|
-
const memberPattern = files.memberPattern || '.
|
|
79
|
+
const defaults = readJson(join(rootDir, files.defaults || '.MOP/config/defaults.json'));
|
|
80
|
+
const team = readJson(join(rootDir, files.team || '.MOP/config/team.json'));
|
|
81
|
+
const memberPattern = files.memberPattern || '.MOP/config/members/<codename>.json';
|
|
82
82
|
const memberPath = actor ? join(rootDir, memberPattern.replace('<codename>', slug(actor))) : '';
|
|
83
83
|
const member = memberPath ? readJson(memberPath) : {};
|
|
84
84
|
return deepMerge(deepMerge(defaults, team), member);
|
|
@@ -129,7 +129,7 @@ function status(args) {
|
|
|
129
129
|
nextPhase,
|
|
130
130
|
customization: config.workflow || {},
|
|
131
131
|
artifacts: {
|
|
132
|
-
directory: state.artifacts?.directory || '.
|
|
132
|
+
directory: state.artifacts?.directory || '.MOP/artifacts',
|
|
133
133
|
layout: state.artifacts?.layout || 'category/artifact-slug/type.md',
|
|
134
134
|
folderByType: state.artifacts?.folderByType || {}
|
|
135
135
|
},
|
|
@@ -156,10 +156,10 @@ function help(args) {
|
|
|
156
156
|
partyRoles: phase?.partyRoles || [],
|
|
157
157
|
nextArtifact,
|
|
158
158
|
nextArtifactCategory: nextCategory,
|
|
159
|
-
nextArtifactPathPattern: `${state.artifacts?.directory || '.
|
|
160
|
-
nextCommand: `node .
|
|
159
|
+
nextArtifactPathPattern: `${state.artifacts?.directory || '.MOP/artifacts'}/${nextCategory}/<artifact-slug>/${nextArtifact}.md`,
|
|
160
|
+
nextCommand: `node .MOP/scripts/mop-workflow.mjs artifact create --actor ${actor || '<codename>'} --type ${nextArtifact} --title "<title>"`,
|
|
161
161
|
readinessRequired,
|
|
162
|
-
readinessCommand: `node .
|
|
162
|
+
readinessCommand: `node .MOP/scripts/mop-workflow.mjs gate readiness --actor ${actor || '<codename>'} --task "<task>"`,
|
|
163
163
|
nextPhase: nextPhase?.id || null
|
|
164
164
|
}, null, 2));
|
|
165
165
|
}
|
|
@@ -196,8 +196,8 @@ function artifactCreate(args) {
|
|
|
196
196
|
const title = String(args.title || type);
|
|
197
197
|
const artifactSlug = slug(args.slug || title || type);
|
|
198
198
|
const category = artifactCategoryFor(state, args, type);
|
|
199
|
-
const artifactRoot = join(rootDir, state.artifacts?.directory || '.
|
|
200
|
-
const templatePath = join(rootDir, state.artifacts?.templateDirectory || '.
|
|
199
|
+
const artifactRoot = join(rootDir, state.artifacts?.directory || '.MOP/artifacts', category, artifactSlug);
|
|
200
|
+
const templatePath = join(rootDir, state.artifacts?.templateDirectory || '.MOP/templates/artifacts', `${type}.md`);
|
|
201
201
|
const template = existsSync(templatePath)
|
|
202
202
|
? readFileSync(templatePath, 'utf8')
|
|
203
203
|
: `# {{title}}\n\n## Notes\n\n`;
|
|
@@ -330,14 +330,14 @@ function main() {
|
|
|
330
330
|
if (command === 'config' && subcommand === 'show') return configShow(args);
|
|
331
331
|
|
|
332
332
|
console.log(`Usage:
|
|
333
|
-
node .
|
|
334
|
-
node .
|
|
335
|
-
node .
|
|
336
|
-
node .
|
|
337
|
-
node .
|
|
338
|
-
node .
|
|
339
|
-
node .
|
|
340
|
-
node .
|
|
333
|
+
node .MOP/scripts/mop-workflow.mjs status [--actor CODE] [--task TEXT]
|
|
334
|
+
node .MOP/scripts/mop-workflow.mjs help --actor CODE --task "what user asked"
|
|
335
|
+
node .MOP/scripts/mop-workflow.mjs next --actor CODE --task "what user asked"
|
|
336
|
+
node .MOP/scripts/mop-workflow.mjs phase set --actor CODE --phase prd
|
|
337
|
+
node .MOP/scripts/mop-workflow.mjs artifact create --actor CODE --type prd --title "Title" [--category plan] [--dry-run]
|
|
338
|
+
node .MOP/scripts/mop-workflow.mjs gate readiness --actor CODE --task "task" [--artifact path]
|
|
339
|
+
node .MOP/scripts/mop-workflow.mjs review adversarial --actor CODE --target "plan or file" [--write]
|
|
340
|
+
node .MOP/scripts/mop-workflow.mjs config show [--actor CODE]`);
|
|
341
341
|
}
|
|
342
342
|
|
|
343
343
|
try {
|
package/.agents/AGENTS.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# MOP Core - Antigravity Instructions
|
|
2
2
|
|
|
3
3
|
This is the Antigravity managed-agent entry point. The provider-neutral project
|
|
4
4
|
rules are in the root `AGENTS.md`; apply those rules first when the root is
|
|
@@ -6,8 +6,8 @@ available in the environment.
|
|
|
6
6
|
|
|
7
7
|
## Authentication Gate
|
|
8
8
|
|
|
9
|
-
Before doing anything, read `.
|
|
10
|
-
`.
|
|
9
|
+
Before doing anything, read `.MOP/STATE.json` and follow
|
|
10
|
+
`.MOP/PROTOCOL.md`.
|
|
11
11
|
|
|
12
12
|
- If setup is pending, run only the setup wizard.
|
|
13
13
|
- If login is required, ask only for codename and password.
|
|
@@ -17,7 +17,7 @@ Before doing anything, read `.memoryofplanet/STATE.json` and follow
|
|
|
17
17
|
- If the router says clarification is needed, ask the clarifying questions
|
|
18
18
|
before implementation.
|
|
19
19
|
- If the router activates Party Mode, show visible agent-to-agent dialogue using
|
|
20
|
-
the exact format in `.
|
|
20
|
+
the exact format in `.MOP/PROTOCOL.md`, with `PARTY MODE` shown in
|
|
21
21
|
large uppercase before the dialogue. Party Mode normally uses at least 3
|
|
22
22
|
agents and prefers 4 when relevant roles exist.
|
|
23
23
|
- For complex work or "what next?" questions, use MOP Workflow:
|
|
@@ -50,5 +50,6 @@ Before doing anything, read `.memoryofplanet/STATE.json` and follow
|
|
|
50
50
|
- Ruflo runtime config: `.claude-flow/config.yaml`
|
|
51
51
|
- Antigravity skills: `.agents/skills/`
|
|
52
52
|
|
|
53
|
-
Installer command
|
|
54
|
-
|
|
53
|
+
Installer command: `npx burhan-mop install`.
|
|
54
|
+
GitHub source fallback for development builds:
|
|
55
|
+
`npx --yes github:BURHANDEV-ENTERPRISE/BURHAN-MOP install`.
|
|
@@ -26,7 +26,7 @@ Okey, nanti kalau nak deploy beri tahu saya. Saya setup auto deploy.
|
|
|
26
26
|
Then record the defer action:
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
node .
|
|
29
|
+
node .MOP/scripts/mop-auto-deploy.mjs defer --actor <codename> --answer nanti
|
|
30
30
|
```
|
|
31
31
|
|
|
32
32
|
## Activation
|
|
@@ -34,7 +34,7 @@ node .memoryofplanet/scripts/mop-auto-deploy.mjs defer --actor <codename> --answ
|
|
|
34
34
|
Only after explicit confirmation:
|
|
35
35
|
|
|
36
36
|
```bash
|
|
37
|
-
node .
|
|
37
|
+
node .MOP/scripts/mop-auto-deploy.mjs enable --actor <codename> --provider github|docker|vercel|all --confirm yes
|
|
38
38
|
```
|
|
39
39
|
|
|
40
40
|
## Provider Intent
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: autosycn
|
|
3
|
-
description: Use this after every meaningful
|
|
3
|
+
description: Use this after every meaningful MOP state or file change to save memory, commit as the real active user, push to the correct branch, and merge to main when allowed.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Autosycn
|
|
7
7
|
|
|
8
|
-
Autosycn is
|
|
8
|
+
Autosycn is MOP's identity-safe autosync skill. The name keeps the
|
|
9
9
|
project spelling `autosycn`, but the behavior is autosync.
|
|
10
10
|
|
|
11
11
|
## Required Identity Rule
|
|
@@ -14,7 +14,7 @@ Never let commits fall back to the AI tool identity. Before pushing, the helper
|
|
|
14
14
|
must have a user Git identity:
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
node .
|
|
17
|
+
node .MOP/scripts/mop-core.mjs member git-identity --actor <codename> --name "<display name>" --email "<github-verified-email>" --github-username "<github-login>"
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
Use a GitHub-verified email or the user's GitHub noreply email. The branch name
|
|
@@ -27,27 +27,27 @@ key used for `git push`.
|
|
|
27
27
|
First-time git setup:
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
node .
|
|
30
|
+
node .MOP/scripts/mop-autosycn.mjs init --actor <owner-codename> --url "<github-url>"
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
Before starting new work, after login, or after a long break:
|
|
34
34
|
|
|
35
35
|
```bash
|
|
36
|
-
node .
|
|
36
|
+
node .MOP/scripts/mop-autosycn.mjs preflight --actor <codename>
|
|
37
37
|
```
|
|
38
38
|
|
|
39
39
|
After a state or file change:
|
|
40
40
|
|
|
41
41
|
```bash
|
|
42
|
-
node .
|
|
42
|
+
node .MOP/scripts/mop-autosycn.mjs run --actor <codename> --reason "<what changed>"
|
|
43
43
|
```
|
|
44
44
|
|
|
45
45
|
Manual steps:
|
|
46
46
|
|
|
47
47
|
```bash
|
|
48
|
-
node .
|
|
49
|
-
node .
|
|
50
|
-
node .
|
|
48
|
+
node .MOP/scripts/mop-autosycn.mjs memory --actor <codename> --summary "<what changed>"
|
|
49
|
+
node .MOP/scripts/mop-autosycn.mjs push --actor <codename> --reason "<what changed>"
|
|
50
|
+
node .MOP/scripts/mop-autosycn.mjs merge --actor <codename> --from <codename> --reason "Merge dev/<codename>: <what changed>"
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
## Guarantees
|
|
@@ -61,7 +61,7 @@ node .memoryofplanet/scripts/mop-autosycn.mjs merge --actor <codename> --from <c
|
|
|
61
61
|
- BURHAN-MOP reviews the pushed branch and merges to `main` only when checks
|
|
62
62
|
pass.
|
|
63
63
|
- Sets `GIT_AUTHOR_NAME`, `GIT_AUTHOR_EMAIL`, `GIT_COMMITTER_NAME`, and
|
|
64
|
-
`GIT_COMMITTER_EMAIL` from
|
|
64
|
+
`GIT_COMMITTER_EMAIL` from MOP member state.
|
|
65
65
|
- Sets local `git config user.name` and `user.email` before commit/merge.
|
|
66
66
|
- Refuses to push when the user's Git email is missing.
|
|
67
67
|
- If a GitHub username is configured, refuses to push unless `gh api user`
|
|
@@ -5,12 +5,12 @@ or asks which agent/workflow/artifact should be used.
|
|
|
5
5
|
|
|
6
6
|
## Behavior
|
|
7
7
|
|
|
8
|
-
1. Read `.
|
|
9
|
-
2. Respect auth and Agent Router gates from `.
|
|
8
|
+
1. Read `.MOP/STATE.json`.
|
|
9
|
+
2. Respect auth and Agent Router gates from `.MOP/PROTOCOL.md`.
|
|
10
10
|
3. Run:
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
node .
|
|
13
|
+
node .MOP/scripts/mop-workflow.mjs help --actor <codename> --task "<user task>"
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
4. Explain the next step in the user's language.
|
|
@@ -25,7 +25,7 @@ node .memoryofplanet/scripts/mop-workflow.mjs help --actor <codename> --task "<u
|
|
|
25
25
|
## Rules
|
|
26
26
|
|
|
27
27
|
- Do not invent a workflow phase if the helper returns one.
|
|
28
|
-
- Keep artifacts under `.
|
|
28
|
+
- Keep artifacts under `.MOP/artifacts/<category>/<artifact-slug>/<type>.md`.
|
|
29
29
|
- Treat the current workspace root as the project root. Do not suggest a nested
|
|
30
30
|
project wrapper folder unless the user explicitly asks for a monorepo or
|
|
31
31
|
multiple apps.
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ruflo-core
|
|
3
|
-
description: Use this when working with the
|
|
3
|
+
description: Use this when working with the MOP Ruflo core, Claude Flow configuration, MCP server setup, swarm routing, hooks, or cross-provider agent instructions.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Ruflo Core Skill
|
|
7
7
|
|
|
8
8
|
## Goal
|
|
9
9
|
|
|
10
|
-
Keep the
|
|
10
|
+
Keep the MOP Ruflo core portable across Claude Code, Codex,
|
|
11
11
|
ChatGPT coding surfaces, Gemini CLI, and Antigravity.
|
|
12
12
|
|
|
13
13
|
## Instructions
|
|
@@ -32,4 +32,3 @@ ChatGPT coding surfaces, Gemini CLI, and Antigravity.
|
|
|
32
32
|
- Do not assume MCP is available; degrade to filesystem and shell inspection.
|
|
33
33
|
- Do not modify runtime state, logs, sessions, or memory data unless the user
|
|
34
34
|
specifically asks.
|
|
35
|
-
|
|
@@ -20,12 +20,12 @@ Okey, nanti kalau nak deploy beri tahu saya. Saya setup auto deploy.
|
|
|
20
20
|
Record defer:
|
|
21
21
|
|
|
22
22
|
```bash
|
|
23
|
-
node .
|
|
23
|
+
node .MOP/scripts/mop-auto-deploy.mjs defer --actor <codename> --answer nanti
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
Activate only with confirmation:
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
|
-
node .
|
|
29
|
+
node .MOP/scripts/mop-auto-deploy.mjs enable --actor <codename> --provider github|docker|vercel|all --confirm yes
|
|
30
30
|
```
|
|
31
31
|
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: autosycn
|
|
3
|
-
description: Use this after every meaningful
|
|
3
|
+
description: Use this after every meaningful MOP state or file change to save memory, commit as the real active user, push to the correct branch, and merge to main when allowed.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Autosycn
|
|
7
7
|
|
|
8
|
-
Autosycn is
|
|
8
|
+
Autosycn is MOP's identity-safe autosync skill. Use:
|
|
9
9
|
|
|
10
10
|
```bash
|
|
11
|
-
node .
|
|
12
|
-
node .
|
|
13
|
-
node .
|
|
11
|
+
node .MOP/scripts/mop-autosycn.mjs init --actor <owner-codename> --url "<github-url>"
|
|
12
|
+
node .MOP/scripts/mop-autosycn.mjs preflight --actor <codename>
|
|
13
|
+
node .MOP/scripts/mop-autosycn.mjs run --actor <codename> --reason "<what changed>"
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
Before first use, configure the user's real Git identity:
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
|
-
node .
|
|
19
|
+
node .MOP/scripts/mop-core.mjs member git-identity --actor <codename> --name "<display name>" --email "<github-verified-email>" --github-username "<github-login>"
|
|
20
20
|
```
|
|
21
21
|
|
|
22
22
|
The helper sets Git author and committer environment variables and local git
|
|
23
|
-
config from
|
|
23
|
+
config from MOP state. It refuses to push without a configured email.
|
|
24
24
|
If a GitHub username is configured, it also refuses to push unless `gh api user`
|
|
25
25
|
matches that username. The branch name does not control GitHub attribution;
|
|
26
26
|
commit email and push credentials do.
|
|
@@ -5,12 +5,12 @@ or asks which agent/workflow/artifact should be used.
|
|
|
5
5
|
|
|
6
6
|
## Behavior
|
|
7
7
|
|
|
8
|
-
1. Read `.
|
|
9
|
-
2. Respect auth and Agent Router gates from `.
|
|
8
|
+
1. Read `.MOP/STATE.json`.
|
|
9
|
+
2. Respect auth and Agent Router gates from `.MOP/PROTOCOL.md`.
|
|
10
10
|
3. Run:
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
node .
|
|
13
|
+
node .MOP/scripts/mop-workflow.mjs help --actor <codename> --task "<user task>"
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
4. Explain the next step in the user's language.
|
|
@@ -25,7 +25,7 @@ node .memoryofplanet/scripts/mop-workflow.mjs help --actor <codename> --task "<u
|
|
|
25
25
|
## Rules
|
|
26
26
|
|
|
27
27
|
- Do not invent a workflow phase if the helper returns one.
|
|
28
|
-
- Keep artifacts under `.
|
|
28
|
+
- Keep artifacts under `.MOP/artifacts/<category>/<artifact-slug>/<type>.md`.
|
|
29
29
|
- Treat the current workspace root as the project root. Do not suggest a nested
|
|
30
30
|
project wrapper folder unless the user explicitly asks for a monorepo or
|
|
31
31
|
multiple apps.
|
package/.codex/config.toml
CHANGED