burhan-mop 0.1.0 → 0.1.1
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 +36 -36
- package/{.memoryofplanet → .MOP}/STATE.json +11 -11
- package/{.memoryofplanet → .MOP}/config/defaults.json +2 -2
- package/{.memoryofplanet → .MOP}/scripts/burhan-mop.mjs +6 -6
- 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.md +136 -89
- package/bin/burhan-mop.mjs +1 -1
- package/bin/mop-core.mjs +1 -1
- package/bin/mop-workflow.mjs +1 -1
- package/package.json +7 -7
- /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
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
#
|
|
1
|
+
# MOP Core Protocol
|
|
2
2
|
|
|
3
3
|
This is the source of truth for setup, authentication, member state, and agent
|
|
4
|
-
naming in
|
|
4
|
+
naming in MOP.
|
|
5
5
|
|
|
6
6
|
## First Action Gate
|
|
7
7
|
|
|
8
8
|
Before any assistant answers questions or edits files in this core, read
|
|
9
|
-
`.
|
|
9
|
+
`.MOP/STATE.json`.
|
|
10
10
|
|
|
11
11
|
- If `initialized` is `false`, output:
|
|
12
|
-
`
|
|
12
|
+
`MOP belum di-setup. Jalankan /mop-setup.`
|
|
13
13
|
Then run the setup wizard only.
|
|
14
14
|
- If `initialized` is `true` and `activeMember` is empty, output:
|
|
15
15
|
`Codename dan password.`
|
|
@@ -40,7 +40,7 @@ Use this order:
|
|
|
40
40
|
After confirmation, run:
|
|
41
41
|
|
|
42
42
|
```bash
|
|
43
|
-
node .
|
|
43
|
+
node .MOP/scripts/mop-core.mjs setup --project-name "<name>" --name "<display>" --codename <codename> --password "<password>" --mode <solo|team> --conversation-language "<lang>" --coding-language "<lang>" --git-email "<github-verified-email>" [--git-name "<display>"] [--github-username "<github-login>"] [--github-url "<url>"] [--join-mode <mode>]
|
|
44
44
|
```
|
|
45
45
|
|
|
46
46
|
## Agent Naming Ceremony
|
|
@@ -69,7 +69,7 @@ only when their expertise is genuinely needed, with no fixed maximum.
|
|
|
69
69
|
Use:
|
|
70
70
|
|
|
71
71
|
```bash
|
|
72
|
-
node .
|
|
72
|
+
node .MOP/scripts/mop-core.mjs agent route --actor <codename> --task "<user task>"
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
Routing rules:
|
|
@@ -152,7 +152,7 @@ agent: <from-name> (<from-role>)
|
|
|
152
152
|
|
|
153
153
|
## MOP Workflow
|
|
154
154
|
|
|
155
|
-
MOP Workflow is BMAD-inspired
|
|
155
|
+
MOP Workflow is BMAD-inspired and MOP-native. It is the default
|
|
156
156
|
structure for complex work:
|
|
157
157
|
|
|
158
158
|
`idea -> brief -> prd -> ux-spec -> architecture -> story -> readiness -> implementation -> review -> release`
|
|
@@ -161,9 +161,9 @@ Use the workflow helper when the user asks what to do next, asks for a plan, or
|
|
|
161
161
|
requests implementation:
|
|
162
162
|
|
|
163
163
|
```bash
|
|
164
|
-
node .
|
|
165
|
-
node .
|
|
166
|
-
node .
|
|
164
|
+
node .MOP/scripts/mop-workflow.mjs help --actor <codename> --task "<user task>"
|
|
165
|
+
node .MOP/scripts/mop-workflow.mjs next --actor <codename> --task "<user task>"
|
|
166
|
+
node .MOP/scripts/mop-workflow.mjs status --actor <codename>
|
|
167
167
|
```
|
|
168
168
|
|
|
169
169
|
The workflow helper returns the suggested phase, lead agent role, party roles,
|
|
@@ -171,12 +171,12 @@ next artifact, and gate status. The primary agent still owns the answer.
|
|
|
171
171
|
|
|
172
172
|
## Artifacts
|
|
173
173
|
|
|
174
|
-
Complex work should create durable artifacts under `.
|
|
174
|
+
Complex work should create durable artifacts under `.MOP/artifacts/`.
|
|
175
175
|
Artifacts are grouped by category so planning, reviews, releases, and decisions
|
|
176
176
|
do not mix together:
|
|
177
177
|
|
|
178
178
|
```text
|
|
179
|
-
.
|
|
179
|
+
.MOP/artifacts/<category>/<artifact-slug>/<type>.md
|
|
180
180
|
```
|
|
181
181
|
|
|
182
182
|
Default categories:
|
|
@@ -208,7 +208,7 @@ Available artifact types:
|
|
|
208
208
|
Create artifacts with:
|
|
209
209
|
|
|
210
210
|
```bash
|
|
211
|
-
node .
|
|
211
|
+
node .MOP/scripts/mop-workflow.mjs artifact create --actor <codename> --type <type> --title "<title>"
|
|
212
212
|
```
|
|
213
213
|
|
|
214
214
|
Use `--category <name>` only when the default type category is not suitable.
|
|
@@ -232,14 +232,14 @@ for a monorepo or multiple apps.
|
|
|
232
232
|
|
|
233
233
|
Customization is layered and non-bypassing:
|
|
234
234
|
|
|
235
|
-
1. defaults: `.
|
|
236
|
-
2. team: `.
|
|
237
|
-
3. member: `.
|
|
235
|
+
1. defaults: `.MOP/config/defaults.json`
|
|
236
|
+
2. team: `.MOP/config/team.json`
|
|
237
|
+
3. member: `.MOP/config/members/<codename>.json`
|
|
238
238
|
|
|
239
239
|
Show merged config with:
|
|
240
240
|
|
|
241
241
|
```bash
|
|
242
|
-
node .
|
|
242
|
+
node .MOP/scripts/mop-workflow.mjs config show --actor <codename>
|
|
243
243
|
```
|
|
244
244
|
|
|
245
245
|
Customization may tune workflow preferences, party mode verbosity, and preferred
|
|
@@ -251,7 +251,7 @@ BURHAN-MOP review.
|
|
|
251
251
|
Before coding or making implementation changes, run:
|
|
252
252
|
|
|
253
253
|
```bash
|
|
254
|
-
node .
|
|
254
|
+
node .MOP/scripts/mop-workflow.mjs gate readiness --actor <codename> --task "<user task>" [--artifact <path>]
|
|
255
255
|
```
|
|
256
256
|
|
|
257
257
|
If status is not `ready`, ask clarification or update the required artifact
|
|
@@ -263,7 +263,7 @@ Use adversarial review before implementation for risky work, before merge, or
|
|
|
263
263
|
when the user asks for review:
|
|
264
264
|
|
|
265
265
|
```bash
|
|
266
|
-
node .
|
|
266
|
+
node .MOP/scripts/mop-workflow.mjs review adversarial --actor <codename> --target "<plan, artifact, file, or task>"
|
|
267
267
|
```
|
|
268
268
|
|
|
269
269
|
Adversarial review must challenge assumptions, find failure modes, surface
|
|
@@ -300,10 +300,10 @@ npx --yes github:BURHANDEV-ENTERPRISE/BURHAN-MOP install
|
|
|
300
300
|
Local equivalent:
|
|
301
301
|
|
|
302
302
|
```bash
|
|
303
|
-
node .
|
|
303
|
+
node .MOP/scripts/burhan-mop.mjs install --target <project-folder>
|
|
304
304
|
```
|
|
305
305
|
|
|
306
|
-
Installer copies provider entrypoints,
|
|
306
|
+
Installer copies provider entrypoints, MOP state, skills, workflow
|
|
307
307
|
config, and artifact templates. Existing files are skipped unless `--force` is
|
|
308
308
|
used.
|
|
309
309
|
|
|
@@ -319,19 +319,19 @@ Then ask:
|
|
|
319
319
|
Save the answer with:
|
|
320
320
|
|
|
321
321
|
```bash
|
|
322
|
-
node .
|
|
322
|
+
node .MOP/scripts/mop-core.mjs agent activate --actor <codename> --role <role> --title "<title>" --name "<agent-name>"
|
|
323
323
|
```
|
|
324
324
|
|
|
325
325
|
Check the current active agent with:
|
|
326
326
|
|
|
327
327
|
```bash
|
|
328
|
-
node .
|
|
328
|
+
node .MOP/scripts/mop-core.mjs agent current --actor <codename>
|
|
329
329
|
```
|
|
330
330
|
|
|
331
331
|
Switch to an existing owned agent with:
|
|
332
332
|
|
|
333
333
|
```bash
|
|
334
|
-
node .
|
|
334
|
+
node .MOP/scripts/mop-core.mjs agent use --actor <codename> --name "<agent-name>"
|
|
335
335
|
```
|
|
336
336
|
|
|
337
337
|
All durable memory and ledger entries must include the active agent when one is
|
|
@@ -346,7 +346,7 @@ available to the active member:
|
|
|
346
346
|
3. Save the name with:
|
|
347
347
|
|
|
348
348
|
```bash
|
|
349
|
-
node .
|
|
349
|
+
node .MOP/scripts/mop-core.mjs agent activate --actor <codename> --role <role> --title "<title>" --name "<agent-name>"
|
|
350
350
|
```
|
|
351
351
|
|
|
352
352
|
## Shared Agent Rule
|
|
@@ -366,15 +366,15 @@ changes. It is intentionally identity-safe.
|
|
|
366
366
|
Before first push for a member, configure the real Git identity:
|
|
367
367
|
|
|
368
368
|
```bash
|
|
369
|
-
node .
|
|
369
|
+
node .MOP/scripts/mop-core.mjs member git-identity --actor <codename> --name "<display name>" --email "<github-verified-email>" --github-username "<github-login>"
|
|
370
370
|
```
|
|
371
371
|
|
|
372
372
|
Then run:
|
|
373
373
|
|
|
374
374
|
```bash
|
|
375
|
-
node .
|
|
376
|
-
node .
|
|
377
|
-
node .
|
|
375
|
+
node .MOP/scripts/mop-autosycn.mjs init --actor <owner-codename> --url "<github-url>"
|
|
376
|
+
node .MOP/scripts/mop-autosycn.mjs preflight --actor <codename>
|
|
377
|
+
node .MOP/scripts/mop-autosycn.mjs run --actor <codename> --reason "<what changed>"
|
|
378
378
|
```
|
|
379
379
|
|
|
380
380
|
Autosycn must:
|
|
@@ -423,13 +423,13 @@ Only activate deployment after explicit confirmation.
|
|
|
423
423
|
|
|
424
424
|
## File Layout
|
|
425
425
|
|
|
426
|
-
- `.
|
|
427
|
-
- `.
|
|
428
|
-
- `.
|
|
429
|
-
- `.
|
|
430
|
-
- `.
|
|
431
|
-
- `.
|
|
432
|
-
- `.
|
|
426
|
+
- `.MOP/STATE.json` - durable project/member/agent state.
|
|
427
|
+
- `.MOP/PROTOCOL.md` - this protocol.
|
|
428
|
+
- `.MOP/scripts/mop-core.mjs` - setup/login/agent helper.
|
|
429
|
+
- `.MOP/scripts/mop-workflow.mjs` - workflow/help/artifact/readiness/review helper.
|
|
430
|
+
- `.MOP/scripts/burhan-mop.mjs` - installer CLI for `npx burhan-mop install`.
|
|
431
|
+
- `.MOP/scripts/mop-autosycn.mjs` - identity-safe autosycn helper.
|
|
432
|
+
- `.MOP/scripts/mop-auto-deploy.mjs` - opt-in deployment helper.
|
|
433
433
|
- `AGENTS.md` - Codex and provider-neutral entrypoint.
|
|
434
434
|
- `CLAUDE.md` - Claude Code entrypoint.
|
|
435
435
|
- `GEMINI.md` - Gemini CLI entrypoint.
|
|
@@ -58,7 +58,7 @@
|
|
|
58
58
|
"workflow": {
|
|
59
59
|
"enabled": true,
|
|
60
60
|
"name": "MOP Workflow",
|
|
61
|
-
"style": "BMAD-inspired,
|
|
61
|
+
"style": "BMAD-inspired, MOP-native",
|
|
62
62
|
"currentPhase": null,
|
|
63
63
|
"phaseOrder": [
|
|
64
64
|
"idea",
|
|
@@ -202,8 +202,8 @@
|
|
|
202
202
|
},
|
|
203
203
|
"artifacts": {
|
|
204
204
|
"enabled": true,
|
|
205
|
-
"directory": ".
|
|
206
|
-
"templateDirectory": ".
|
|
205
|
+
"directory": ".MOP/artifacts",
|
|
206
|
+
"templateDirectory": ".MOP/templates/artifacts",
|
|
207
207
|
"layout": "category/artifact-slug/type.md",
|
|
208
208
|
"defaultCategory": "general",
|
|
209
209
|
"folderByType": {
|
|
@@ -243,9 +243,9 @@
|
|
|
243
243
|
"member"
|
|
244
244
|
],
|
|
245
245
|
"files": {
|
|
246
|
-
"defaults": ".
|
|
247
|
-
"team": ".
|
|
248
|
-
"memberPattern": ".
|
|
246
|
+
"defaults": ".MOP/config/defaults.json",
|
|
247
|
+
"team": ".MOP/config/team.json",
|
|
248
|
+
"memberPattern": ".MOP/config/members/<codename>.json"
|
|
249
249
|
},
|
|
250
250
|
"rules": [
|
|
251
251
|
"Defaults define safe project behavior.",
|
|
@@ -276,7 +276,7 @@
|
|
|
276
276
|
"config",
|
|
277
277
|
"scripts",
|
|
278
278
|
".github",
|
|
279
|
-
".
|
|
279
|
+
".MOP",
|
|
280
280
|
".agents",
|
|
281
281
|
".claude",
|
|
282
282
|
".codex",
|
|
@@ -335,10 +335,10 @@
|
|
|
335
335
|
"enabled": true,
|
|
336
336
|
"packageName": "burhan-mop",
|
|
337
337
|
"command": "npx burhan-mop install",
|
|
338
|
-
"entrypoint": ".
|
|
338
|
+
"entrypoint": ".MOP/scripts/burhan-mop.mjs",
|
|
339
339
|
"installTargets": [
|
|
340
340
|
"provider entrypoints",
|
|
341
|
-
"
|
|
341
|
+
"MOP state",
|
|
342
342
|
"skills",
|
|
343
343
|
"workflow config",
|
|
344
344
|
"artifact templates"
|
|
@@ -511,7 +511,7 @@
|
|
|
511
511
|
"role": "memory",
|
|
512
512
|
"title": "Memory Keeper",
|
|
513
513
|
"kind": "memory",
|
|
514
|
-
"purpose": "Save, recall, summarize, search, and clean long-term
|
|
514
|
+
"purpose": "Save, recall, summarize, search, and clean long-term MOP records."
|
|
515
515
|
},
|
|
516
516
|
{
|
|
517
517
|
"role": "ux",
|
|
@@ -555,7 +555,7 @@
|
|
|
555
555
|
"at": "2026-06-11T00:00:00.000Z",
|
|
556
556
|
"actor": "system",
|
|
557
557
|
"kind": "state-created",
|
|
558
|
-
"summary": "
|
|
558
|
+
"summary": "MOP state scaffold created; setup pending."
|
|
559
559
|
}
|
|
560
560
|
]
|
|
561
561
|
}
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
"includeGateStatus": true
|
|
15
15
|
},
|
|
16
16
|
"artifacts": {
|
|
17
|
-
"directory": ".
|
|
18
|
-
"templateDirectory": ".
|
|
17
|
+
"directory": ".MOP/artifacts",
|
|
18
|
+
"templateDirectory": ".MOP/templates/artifacts",
|
|
19
19
|
"layout": "category/artifact-slug/type.md",
|
|
20
20
|
"defaultCategory": "general",
|
|
21
21
|
"folderByType": {
|
|
@@ -41,7 +41,7 @@ function install(args) {
|
|
|
41
41
|
'AGENTS.md',
|
|
42
42
|
'CLAUDE.md',
|
|
43
43
|
'GEMINI.md',
|
|
44
|
-
'.
|
|
44
|
+
'.MOP',
|
|
45
45
|
'.agents',
|
|
46
46
|
'.claude',
|
|
47
47
|
'.claude-flow',
|
|
@@ -63,7 +63,7 @@ function install(args) {
|
|
|
63
63
|
next: [
|
|
64
64
|
'Run /mop-setup in the target project.',
|
|
65
65
|
'For team mode, initialize autosycn after setup.',
|
|
66
|
-
'Use: node .
|
|
66
|
+
'Use: node .MOP/scripts/mop-workflow.mjs help --actor <codename> --task "lepas ni buat apa?"'
|
|
67
67
|
]
|
|
68
68
|
}, null, 2));
|
|
69
69
|
}
|
|
@@ -73,10 +73,10 @@ function doctor() {
|
|
|
73
73
|
'AGENTS.md',
|
|
74
74
|
'CLAUDE.md',
|
|
75
75
|
'GEMINI.md',
|
|
76
|
-
'.
|
|
77
|
-
'.
|
|
78
|
-
'.
|
|
79
|
-
'.
|
|
76
|
+
'.MOP/STATE.json',
|
|
77
|
+
'.MOP/PROTOCOL.md',
|
|
78
|
+
'.MOP/scripts/mop-core.mjs',
|
|
79
|
+
'.MOP/scripts/mop-workflow.mjs',
|
|
80
80
|
'.agents/skills/mop-help/SKILL.md'
|
|
81
81
|
];
|
|
82
82
|
const results = required.map((entry) => {
|
|
@@ -102,7 +102,7 @@ function defer(args) {
|
|
|
102
102
|
|
|
103
103
|
function enable(args) {
|
|
104
104
|
const state = readState();
|
|
105
|
-
if (!state.initialized) throw new Error('
|
|
105
|
+
if (!state.initialized) throw new Error('MOP is not initialized.');
|
|
106
106
|
const actor = requireArg(args, 'actor');
|
|
107
107
|
if (!state.members?.[actor]) throw new Error(`Unknown actor: ${actor}`);
|
|
108
108
|
const confirm = String(args.confirm || '').toLowerCase();
|
|
@@ -138,10 +138,10 @@ function main() {
|
|
|
138
138
|
if (command === 'enable') return enable(args);
|
|
139
139
|
|
|
140
140
|
console.log(`Usage:
|
|
141
|
-
node .
|
|
142
|
-
node .
|
|
143
|
-
node .
|
|
144
|
-
node .
|
|
141
|
+
node .MOP/scripts/mop-auto-deploy.mjs status
|
|
142
|
+
node .MOP/scripts/mop-auto-deploy.mjs ask
|
|
143
|
+
node .MOP/scripts/mop-auto-deploy.mjs defer --actor <codename> --answer nanti
|
|
144
|
+
node .MOP/scripts/mop-auto-deploy.mjs enable --actor <codename> --provider github|docker|vercel|all --confirm yes`);
|
|
145
145
|
}
|
|
146
146
|
|
|
147
147
|
try {
|
|
@@ -150,4 +150,3 @@ try {
|
|
|
150
150
|
console.error(error.message);
|
|
151
151
|
process.exitCode = 1;
|
|
152
152
|
}
|
|
153
|
-
|
|
@@ -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 {
|