burhan-mop 0.1.0

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 (382) hide show
  1. package/.agents/AGENTS.md +54 -0
  2. package/.agents/skills/auto-deploy/SKILL.md +48 -0
  3. package/.agents/skills/autosycn/SKILL.md +75 -0
  4. package/.agents/skills/mop-help/SKILL.md +35 -0
  5. package/.agents/skills/ruflo-core/SKILL.md +35 -0
  6. package/.claude/agents/analysis/analyze-code-quality.md +179 -0
  7. package/.claude/agents/analysis/code-analyzer.md +210 -0
  8. package/.claude/agents/analysis/code-review/analyze-code-quality.md +179 -0
  9. package/.claude/agents/architecture/arch-system-design.md +157 -0
  10. package/.claude/agents/architecture/system-design/arch-system-design.md +155 -0
  11. package/.claude/agents/browser/browser-agent.yaml +182 -0
  12. package/.claude/agents/consensus/byzantine-coordinator.md +63 -0
  13. package/.claude/agents/consensus/crdt-synchronizer.md +997 -0
  14. package/.claude/agents/consensus/gossip-coordinator.md +63 -0
  15. package/.claude/agents/consensus/performance-benchmarker.md +851 -0
  16. package/.claude/agents/consensus/quorum-manager.md +823 -0
  17. package/.claude/agents/consensus/raft-manager.md +63 -0
  18. package/.claude/agents/consensus/security-manager.md +622 -0
  19. package/.claude/agents/core/planner.md +375 -0
  20. package/.claude/agents/custom/test-long-runner.md +44 -0
  21. package/.claude/agents/data/data-ml-model.md +445 -0
  22. package/.claude/agents/data/ml/data-ml-model.md +193 -0
  23. package/.claude/agents/development/backend/dev-backend-api.md +142 -0
  24. package/.claude/agents/development/dev-backend-api.md +345 -0
  25. package/.claude/agents/devops/ci-cd/ops-cicd-github.md +164 -0
  26. package/.claude/agents/devops/ops-cicd-github.md +165 -0
  27. package/.claude/agents/documentation/api-docs/docs-api-openapi.md +174 -0
  28. package/.claude/agents/documentation/docs-api-openapi.md +355 -0
  29. package/.claude/agents/flow-nexus/app-store.md +88 -0
  30. package/.claude/agents/flow-nexus/authentication.md +69 -0
  31. package/.claude/agents/flow-nexus/challenges.md +81 -0
  32. package/.claude/agents/flow-nexus/neural-network.md +88 -0
  33. package/.claude/agents/flow-nexus/payments.md +83 -0
  34. package/.claude/agents/flow-nexus/sandbox.md +76 -0
  35. package/.claude/agents/flow-nexus/swarm.md +76 -0
  36. package/.claude/agents/flow-nexus/user-tools.md +96 -0
  37. package/.claude/agents/flow-nexus/workflow.md +84 -0
  38. package/.claude/agents/github/code-review-swarm.md +377 -0
  39. package/.claude/agents/github/github-modes.md +173 -0
  40. package/.claude/agents/github/issue-tracker.md +576 -0
  41. package/.claude/agents/github/multi-repo-swarm.md +553 -0
  42. package/.claude/agents/github/pr-manager.md +438 -0
  43. package/.claude/agents/github/project-board-sync.md +509 -0
  44. package/.claude/agents/github/release-manager.md +605 -0
  45. package/.claude/agents/github/release-swarm.md +583 -0
  46. package/.claude/agents/github/repo-architect.md +398 -0
  47. package/.claude/agents/github/swarm-issue.md +573 -0
  48. package/.claude/agents/github/swarm-pr.md +428 -0
  49. package/.claude/agents/github/sync-coordinator.md +452 -0
  50. package/.claude/agents/github/workflow-automation.md +903 -0
  51. package/.claude/agents/goal/agent.md +816 -0
  52. package/.claude/agents/optimization/benchmark-suite.md +665 -0
  53. package/.claude/agents/optimization/load-balancer.md +431 -0
  54. package/.claude/agents/optimization/performance-monitor.md +672 -0
  55. package/.claude/agents/optimization/resource-allocator.md +674 -0
  56. package/.claude/agents/optimization/topology-optimizer.md +808 -0
  57. package/.claude/agents/payments/agentic-payments.md +126 -0
  58. package/.claude/agents/sona/sona-learning-optimizer.md +74 -0
  59. package/.claude/agents/sparc/architecture.md +699 -0
  60. package/.claude/agents/sparc/pseudocode.md +520 -0
  61. package/.claude/agents/sparc/refinement.md +802 -0
  62. package/.claude/agents/sparc/specification.md +478 -0
  63. package/.claude/agents/specialized/mobile/spec-mobile-react-native.md +225 -0
  64. package/.claude/agents/specialized/spec-mobile-react-native.md +227 -0
  65. package/.claude/agents/sublinear/consensus-coordinator.md +338 -0
  66. package/.claude/agents/sublinear/matrix-optimizer.md +185 -0
  67. package/.claude/agents/sublinear/pagerank-analyzer.md +299 -0
  68. package/.claude/agents/sublinear/performance-optimizer.md +368 -0
  69. package/.claude/agents/sublinear/trading-predictor.md +246 -0
  70. package/.claude/agents/swarm/adaptive-coordinator.md +1127 -0
  71. package/.claude/agents/swarm/hierarchical-coordinator.md +710 -0
  72. package/.claude/agents/swarm/mesh-coordinator.md +963 -0
  73. package/.claude/agents/templates/automation-smart-agent.md +205 -0
  74. package/.claude/agents/templates/base-template-generator.md +289 -0
  75. package/.claude/agents/templates/coordinator-swarm-init.md +90 -0
  76. package/.claude/agents/templates/github-pr-manager.md +177 -0
  77. package/.claude/agents/templates/implementer-sparc-coder.md +259 -0
  78. package/.claude/agents/templates/memory-coordinator.md +187 -0
  79. package/.claude/agents/templates/orchestrator-task.md +139 -0
  80. package/.claude/agents/templates/performance-analyzer.md +199 -0
  81. package/.claude/agents/templates/sparc-coordinator.md +514 -0
  82. package/.claude/agents/testing/production-validator.md +395 -0
  83. package/.claude/agents/testing/tdd-london-swarm.md +244 -0
  84. package/.claude/agents/v3/aidefence-guardian.md +282 -0
  85. package/.claude/agents/v3/claims-authorizer.md +208 -0
  86. package/.claude/agents/v3/collective-intelligence-coordinator.md +993 -0
  87. package/.claude/agents/v3/ddd-domain-expert.md +220 -0
  88. package/.claude/agents/v3/injection-analyst.md +236 -0
  89. package/.claude/agents/v3/performance-engineer.md +1233 -0
  90. package/.claude/agents/v3/pii-detector.md +151 -0
  91. package/.claude/agents/v3/reasoningbank-learner.md +213 -0
  92. package/.claude/agents/v3/security-architect-aidefence.md +410 -0
  93. package/.claude/agents/v3/security-architect.md +867 -0
  94. package/.claude/agents/v3/swarm-memory-manager.md +157 -0
  95. package/.claude/agents/v3/v3-integration-architect.md +205 -0
  96. package/.claude/commands/agents/README.md +50 -0
  97. package/.claude/commands/agents/agent-capabilities.md +140 -0
  98. package/.claude/commands/agents/agent-coordination.md +28 -0
  99. package/.claude/commands/agents/agent-spawning.md +28 -0
  100. package/.claude/commands/agents/agent-types.md +216 -0
  101. package/.claude/commands/agents/health.md +139 -0
  102. package/.claude/commands/agents/list.md +100 -0
  103. package/.claude/commands/agents/logs.md +130 -0
  104. package/.claude/commands/agents/metrics.md +122 -0
  105. package/.claude/commands/agents/pool.md +127 -0
  106. package/.claude/commands/agents/spawn.md +140 -0
  107. package/.claude/commands/agents/status.md +115 -0
  108. package/.claude/commands/agents/stop.md +102 -0
  109. package/.claude/commands/analysis/COMMAND_COMPLIANCE_REPORT.md +54 -0
  110. package/.claude/commands/analysis/README.md +9 -0
  111. package/.claude/commands/analysis/bottleneck-detect.md +162 -0
  112. package/.claude/commands/analysis/performance-bottlenecks.md +59 -0
  113. package/.claude/commands/analysis/performance-report.md +25 -0
  114. package/.claude/commands/analysis/token-efficiency.md +45 -0
  115. package/.claude/commands/analysis/token-usage.md +25 -0
  116. package/.claude/commands/automation/README.md +9 -0
  117. package/.claude/commands/automation/auto-agent.md +122 -0
  118. package/.claude/commands/automation/self-healing.md +106 -0
  119. package/.claude/commands/automation/session-memory.md +90 -0
  120. package/.claude/commands/automation/smart-agents.md +73 -0
  121. package/.claude/commands/automation/smart-spawn.md +25 -0
  122. package/.claude/commands/automation/workflow-select.md +25 -0
  123. package/.claude/commands/claude-flow-help.md +103 -0
  124. package/.claude/commands/claude-flow-memory.md +107 -0
  125. package/.claude/commands/claude-flow-swarm.md +205 -0
  126. package/.claude/commands/coordination/README.md +9 -0
  127. package/.claude/commands/coordination/agent-spawn.md +25 -0
  128. package/.claude/commands/coordination/init.md +44 -0
  129. package/.claude/commands/coordination/orchestrate.md +43 -0
  130. package/.claude/commands/coordination/spawn.md +45 -0
  131. package/.claude/commands/coordination/swarm-init.md +85 -0
  132. package/.claude/commands/coordination/task-orchestrate.md +25 -0
  133. package/.claude/commands/github/README.md +11 -0
  134. package/.claude/commands/github/code-review-swarm.md +514 -0
  135. package/.claude/commands/github/code-review.md +25 -0
  136. package/.claude/commands/github/github-modes.md +147 -0
  137. package/.claude/commands/github/github-swarm.md +121 -0
  138. package/.claude/commands/github/issue-tracker.md +292 -0
  139. package/.claude/commands/github/issue-triage.md +25 -0
  140. package/.claude/commands/github/multi-repo-swarm.md +519 -0
  141. package/.claude/commands/github/pr-enhance.md +26 -0
  142. package/.claude/commands/github/pr-manager.md +170 -0
  143. package/.claude/commands/github/project-board-sync.md +471 -0
  144. package/.claude/commands/github/release-manager.md +340 -0
  145. package/.claude/commands/github/release-swarm.md +544 -0
  146. package/.claude/commands/github/repo-analyze.md +25 -0
  147. package/.claude/commands/github/repo-architect.md +367 -0
  148. package/.claude/commands/github/swarm-issue.md +485 -0
  149. package/.claude/commands/github/swarm-pr.md +288 -0
  150. package/.claude/commands/github/sync-coordinator.md +303 -0
  151. package/.claude/commands/github/workflow-automation.md +442 -0
  152. package/.claude/commands/hive-mind/README.md +17 -0
  153. package/.claude/commands/hive-mind/hive-mind-consensus.md +8 -0
  154. package/.claude/commands/hive-mind/hive-mind-init.md +18 -0
  155. package/.claude/commands/hive-mind/hive-mind-memory.md +8 -0
  156. package/.claude/commands/hive-mind/hive-mind-metrics.md +8 -0
  157. package/.claude/commands/hive-mind/hive-mind-resume.md +8 -0
  158. package/.claude/commands/hive-mind/hive-mind-sessions.md +8 -0
  159. package/.claude/commands/hive-mind/hive-mind-spawn.md +21 -0
  160. package/.claude/commands/hive-mind/hive-mind-status.md +8 -0
  161. package/.claude/commands/hive-mind/hive-mind-stop.md +8 -0
  162. package/.claude/commands/hive-mind/hive-mind-wizard.md +8 -0
  163. package/.claude/commands/hive-mind/hive-mind.md +27 -0
  164. package/.claude/commands/hooks/README.md +11 -0
  165. package/.claude/commands/hooks/overview.md +58 -0
  166. package/.claude/commands/hooks/post-edit.md +117 -0
  167. package/.claude/commands/hooks/post-task.md +112 -0
  168. package/.claude/commands/hooks/pre-edit.md +113 -0
  169. package/.claude/commands/hooks/pre-task.md +111 -0
  170. package/.claude/commands/hooks/session-end.md +118 -0
  171. package/.claude/commands/hooks/setup.md +103 -0
  172. package/.claude/commands/memory/README.md +9 -0
  173. package/.claude/commands/memory/memory-persist.md +25 -0
  174. package/.claude/commands/memory/memory-search.md +25 -0
  175. package/.claude/commands/memory/memory-usage.md +25 -0
  176. package/.claude/commands/memory/neural.md +47 -0
  177. package/.claude/commands/monitoring/README.md +9 -0
  178. package/.claude/commands/monitoring/agent-metrics.md +25 -0
  179. package/.claude/commands/monitoring/agents.md +44 -0
  180. package/.claude/commands/monitoring/real-time-view.md +25 -0
  181. package/.claude/commands/monitoring/status.md +46 -0
  182. package/.claude/commands/monitoring/swarm-monitor.md +25 -0
  183. package/.claude/commands/optimization/README.md +9 -0
  184. package/.claude/commands/optimization/auto-topology.md +62 -0
  185. package/.claude/commands/optimization/cache-manage.md +25 -0
  186. package/.claude/commands/optimization/parallel-execute.md +25 -0
  187. package/.claude/commands/optimization/parallel-execution.md +50 -0
  188. package/.claude/commands/optimization/topology-optimize.md +25 -0
  189. package/.claude/commands/pair/README.md +261 -0
  190. package/.claude/commands/pair/commands.md +546 -0
  191. package/.claude/commands/pair/config.md +510 -0
  192. package/.claude/commands/pair/examples.md +512 -0
  193. package/.claude/commands/pair/modes.md +348 -0
  194. package/.claude/commands/pair/session.md +407 -0
  195. package/.claude/commands/pair/start.md +209 -0
  196. package/.claude/commands/sparc/analyzer.md +52 -0
  197. package/.claude/commands/sparc/architect.md +53 -0
  198. package/.claude/commands/sparc/ask.md +97 -0
  199. package/.claude/commands/sparc/batch-executor.md +54 -0
  200. package/.claude/commands/sparc/code.md +89 -0
  201. package/.claude/commands/sparc/coder.md +54 -0
  202. package/.claude/commands/sparc/debug.md +83 -0
  203. package/.claude/commands/sparc/debugger.md +54 -0
  204. package/.claude/commands/sparc/designer.md +53 -0
  205. package/.claude/commands/sparc/devops.md +109 -0
  206. package/.claude/commands/sparc/docs-writer.md +80 -0
  207. package/.claude/commands/sparc/documenter.md +54 -0
  208. package/.claude/commands/sparc/innovator.md +54 -0
  209. package/.claude/commands/sparc/integration.md +83 -0
  210. package/.claude/commands/sparc/mcp.md +117 -0
  211. package/.claude/commands/sparc/memory-manager.md +54 -0
  212. package/.claude/commands/sparc/optimizer.md +54 -0
  213. package/.claude/commands/sparc/orchestrator.md +132 -0
  214. package/.claude/commands/sparc/post-deployment-monitoring-mode.md +83 -0
  215. package/.claude/commands/sparc/refinement-optimization-mode.md +83 -0
  216. package/.claude/commands/sparc/researcher.md +54 -0
  217. package/.claude/commands/sparc/reviewer.md +54 -0
  218. package/.claude/commands/sparc/security-review.md +80 -0
  219. package/.claude/commands/sparc/sparc-modes.md +174 -0
  220. package/.claude/commands/sparc/sparc.md +111 -0
  221. package/.claude/commands/sparc/spec-pseudocode.md +80 -0
  222. package/.claude/commands/sparc/supabase-admin.md +348 -0
  223. package/.claude/commands/sparc/swarm-coordinator.md +54 -0
  224. package/.claude/commands/sparc/tdd.md +54 -0
  225. package/.claude/commands/sparc/tester.md +54 -0
  226. package/.claude/commands/sparc/tutorial.md +79 -0
  227. package/.claude/commands/sparc/workflow-manager.md +54 -0
  228. package/.claude/commands/stream-chain/pipeline.md +121 -0
  229. package/.claude/commands/stream-chain/run.md +70 -0
  230. package/.claude/commands/swarm/README.md +15 -0
  231. package/.claude/commands/swarm/analysis.md +95 -0
  232. package/.claude/commands/swarm/development.md +96 -0
  233. package/.claude/commands/swarm/examples.md +168 -0
  234. package/.claude/commands/swarm/maintenance.md +102 -0
  235. package/.claude/commands/swarm/optimization.md +117 -0
  236. package/.claude/commands/swarm/research.md +136 -0
  237. package/.claude/commands/swarm/swarm-analysis.md +8 -0
  238. package/.claude/commands/swarm/swarm-background.md +8 -0
  239. package/.claude/commands/swarm/swarm-init.md +19 -0
  240. package/.claude/commands/swarm/swarm-modes.md +8 -0
  241. package/.claude/commands/swarm/swarm-monitor.md +8 -0
  242. package/.claude/commands/swarm/swarm-spawn.md +19 -0
  243. package/.claude/commands/swarm/swarm-status.md +8 -0
  244. package/.claude/commands/swarm/swarm-strategies.md +8 -0
  245. package/.claude/commands/swarm/swarm.md +87 -0
  246. package/.claude/commands/swarm/testing.md +131 -0
  247. package/.claude/commands/training/README.md +9 -0
  248. package/.claude/commands/training/model-update.md +25 -0
  249. package/.claude/commands/training/neural-patterns.md +108 -0
  250. package/.claude/commands/training/neural-train.md +75 -0
  251. package/.claude/commands/training/pattern-learn.md +25 -0
  252. package/.claude/commands/training/specialization.md +63 -0
  253. package/.claude/commands/truth/start.md +143 -0
  254. package/.claude/commands/verify/check.md +50 -0
  255. package/.claude/commands/verify/start.md +128 -0
  256. package/.claude/commands/workflows/README.md +9 -0
  257. package/.claude/commands/workflows/development.md +78 -0
  258. package/.claude/commands/workflows/research.md +63 -0
  259. package/.claude/commands/workflows/workflow-create.md +25 -0
  260. package/.claude/commands/workflows/workflow-execute.md +25 -0
  261. package/.claude/commands/workflows/workflow-export.md +25 -0
  262. package/.claude/helpers/README.md +97 -0
  263. package/.claude/helpers/adr-compliance.sh +186 -0
  264. package/.claude/helpers/auto-commit.sh +178 -0
  265. package/.claude/helpers/auto-memory-hook.mjs +368 -0
  266. package/.claude/helpers/checkpoint-manager.sh +251 -0
  267. package/.claude/helpers/daemon-manager.sh +252 -0
  268. package/.claude/helpers/ddd-tracker.sh +144 -0
  269. package/.claude/helpers/github-safe.js +156 -0
  270. package/.claude/helpers/github-setup.sh +45 -0
  271. package/.claude/helpers/guidance-hook.sh +13 -0
  272. package/.claude/helpers/guidance-hooks.sh +102 -0
  273. package/.claude/helpers/health-monitor.sh +108 -0
  274. package/.claude/helpers/hook-handler.cjs +286 -0
  275. package/.claude/helpers/intelligence.cjs +1031 -0
  276. package/.claude/helpers/learning-hooks.sh +329 -0
  277. package/.claude/helpers/learning-optimizer.sh +127 -0
  278. package/.claude/helpers/learning-service.mjs +1144 -0
  279. package/.claude/helpers/memory.js +83 -0
  280. package/.claude/helpers/metrics-db.mjs +488 -0
  281. package/.claude/helpers/pattern-consolidator.sh +86 -0
  282. package/.claude/helpers/perf-worker.sh +160 -0
  283. package/.claude/helpers/post-commit +16 -0
  284. package/.claude/helpers/pre-commit +26 -0
  285. package/.claude/helpers/quick-start.sh +19 -0
  286. package/.claude/helpers/router.js +105 -0
  287. package/.claude/helpers/ruflo-hook.cjs +59 -0
  288. package/.claude/helpers/security-scanner.sh +127 -0
  289. package/.claude/helpers/session.js +157 -0
  290. package/.claude/helpers/setup-mcp.sh +18 -0
  291. package/.claude/helpers/standard-checkpoint-hooks.sh +189 -0
  292. package/.claude/helpers/statusline-hook.sh +21 -0
  293. package/.claude/helpers/statusline.cjs +693 -0
  294. package/.claude/helpers/statusline.js +352 -0
  295. package/.claude/helpers/swarm-comms.sh +353 -0
  296. package/.claude/helpers/swarm-hooks.sh +761 -0
  297. package/.claude/helpers/swarm-monitor.sh +211 -0
  298. package/.claude/helpers/sync-v3-metrics.sh +245 -0
  299. package/.claude/helpers/update-v3-progress.sh +166 -0
  300. package/.claude/helpers/v3-quick-status.sh +58 -0
  301. package/.claude/helpers/v3.sh +111 -0
  302. package/.claude/helpers/validate-v3-config.sh +216 -0
  303. package/.claude/helpers/worker-manager.sh +170 -0
  304. package/.claude/settings.json +285 -0
  305. package/.claude/skills/agentdb-advanced/SKILL.md +550 -0
  306. package/.claude/skills/agentdb-learning/SKILL.md +545 -0
  307. package/.claude/skills/agentdb-memory-patterns/SKILL.md +339 -0
  308. package/.claude/skills/agentdb-optimization/SKILL.md +509 -0
  309. package/.claude/skills/agentdb-vector-search/SKILL.md +339 -0
  310. package/.claude/skills/auto-deploy/SKILL.md +31 -0
  311. package/.claude/skills/autosycn/SKILL.md +30 -0
  312. package/.claude/skills/browser/SKILL.md +204 -0
  313. package/.claude/skills/dual-mode/README.md +71 -0
  314. package/.claude/skills/dual-mode/dual-collect.md +103 -0
  315. package/.claude/skills/dual-mode/dual-coordinate.md +85 -0
  316. package/.claude/skills/dual-mode/dual-spawn.md +81 -0
  317. package/.claude/skills/flow-nexus-neural/SKILL.md +727 -0
  318. package/.claude/skills/flow-nexus-platform/SKILL.md +1154 -0
  319. package/.claude/skills/flow-nexus-swarm/SKILL.md +604 -0
  320. package/.claude/skills/github-code-review/SKILL.md +1125 -0
  321. package/.claude/skills/github-multi-repo/SKILL.md +862 -0
  322. package/.claude/skills/github-project-management/SKILL.md +1262 -0
  323. package/.claude/skills/github-release-management/SKILL.md +1064 -0
  324. package/.claude/skills/github-workflow-automation/SKILL.md +1047 -0
  325. package/.claude/skills/hooks-automation/SKILL.md +1201 -0
  326. package/.claude/skills/mop-help/SKILL.md +35 -0
  327. package/.claude/skills/pair-programming/SKILL.md +1202 -0
  328. package/.claude/skills/reasoningbank-agentdb/SKILL.md +446 -0
  329. package/.claude/skills/reasoningbank-intelligence/SKILL.md +201 -0
  330. package/.claude/skills/skill-builder/SKILL.md +910 -0
  331. package/.claude/skills/sparc-methodology/SKILL.md +1106 -0
  332. package/.claude/skills/stream-chain/SKILL.md +560 -0
  333. package/.claude/skills/swarm-advanced/SKILL.md +970 -0
  334. package/.claude/skills/swarm-orchestration/SKILL.md +179 -0
  335. package/.claude/skills/v3-cli-modernization/SKILL.md +872 -0
  336. package/.claude/skills/v3-core-implementation/SKILL.md +797 -0
  337. package/.claude/skills/v3-ddd-architecture/SKILL.md +442 -0
  338. package/.claude/skills/v3-integration-deep/SKILL.md +241 -0
  339. package/.claude/skills/v3-mcp-optimization/SKILL.md +777 -0
  340. package/.claude/skills/v3-memory-unification/SKILL.md +174 -0
  341. package/.claude/skills/v3-performance-optimization/SKILL.md +390 -0
  342. package/.claude/skills/v3-security-overhaul/SKILL.md +82 -0
  343. package/.claude/skills/v3-swarm-coordination/SKILL.md +340 -0
  344. package/.claude/skills/verification-quality/SKILL.md +691 -0
  345. package/.claude-flow/CAPABILITIES.md +403 -0
  346. package/.claude-flow/config.yaml +43 -0
  347. package/.claude-flow/metrics/learning.json +17 -0
  348. package/.claude-flow/metrics/swarm-activity.json +18 -0
  349. package/.claude-flow/metrics/v3-progress.json +26 -0
  350. package/.claude-flow/security/audit-status.json +8 -0
  351. package/.codex/config.toml +39 -0
  352. package/.gemini/settings.json +49 -0
  353. package/.mcp.json +55 -0
  354. package/.memoryofplanet/PROTOCOL.md +436 -0
  355. package/.memoryofplanet/STATE.json +561 -0
  356. package/.memoryofplanet/config/defaults.json +46 -0
  357. package/.memoryofplanet/config/team.json +7 -0
  358. package/.memoryofplanet/scripts/burhan-mop.mjs +124 -0
  359. package/.memoryofplanet/scripts/mop-auto-deploy.mjs +153 -0
  360. package/.memoryofplanet/scripts/mop-autosycn.mjs +617 -0
  361. package/.memoryofplanet/scripts/mop-core.mjs +774 -0
  362. package/.memoryofplanet/scripts/mop-workflow.mjs +348 -0
  363. package/.memoryofplanet/templates/artifacts/adversarial-review.md +33 -0
  364. package/.memoryofplanet/templates/artifacts/architecture.md +28 -0
  365. package/.memoryofplanet/templates/artifacts/decision-log.md +21 -0
  366. package/.memoryofplanet/templates/artifacts/handoff.md +21 -0
  367. package/.memoryofplanet/templates/artifacts/implementation-notes.md +21 -0
  368. package/.memoryofplanet/templates/artifacts/prd.md +29 -0
  369. package/.memoryofplanet/templates/artifacts/product-brief.md +30 -0
  370. package/.memoryofplanet/templates/artifacts/readiness-report.md +25 -0
  371. package/.memoryofplanet/templates/artifacts/release-notes.md +21 -0
  372. package/.memoryofplanet/templates/artifacts/review.md +21 -0
  373. package/.memoryofplanet/templates/artifacts/story.md +25 -0
  374. package/.memoryofplanet/templates/artifacts/ux-spec.md +32 -0
  375. package/AGENTS.md +126 -0
  376. package/CLAUDE.md +235 -0
  377. package/GEMINI.md +19 -0
  378. package/README.md +1096 -0
  379. package/bin/burhan-mop.mjs +2 -0
  380. package/bin/mop-core.mjs +2 -0
  381. package/bin/mop-workflow.mjs +2 -0
  382. package/package.json +66 -0
@@ -0,0 +1,617 @@
1
+ #!/usr/bin/env node
2
+ import { existsSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
3
+ import { dirname, join, resolve } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { spawnSync } from 'node:child_process';
6
+
7
+ const here = dirname(fileURLToPath(import.meta.url));
8
+ const coreDir = resolve(here, '..');
9
+ const rootDir = resolve(coreDir, '..');
10
+ const statePath = join(coreDir, 'STATE.json');
11
+
12
+ function now() {
13
+ return new Date().toISOString();
14
+ }
15
+
16
+ function readState() {
17
+ return JSON.parse(readFileSync(statePath, 'utf8'));
18
+ }
19
+
20
+ function writeState(state) {
21
+ const tmp = `${statePath}.tmp`;
22
+ writeFileSync(tmp, `${JSON.stringify(state, null, 2)}\n`, 'utf8');
23
+ renameSync(tmp, statePath);
24
+ }
25
+
26
+ function parseArgs(argv) {
27
+ const out = { _: [] };
28
+ for (let i = 0; i < argv.length; i += 1) {
29
+ const item = argv[i];
30
+ if (!item.startsWith('--')) {
31
+ out._.push(item);
32
+ continue;
33
+ }
34
+ const key = item.slice(2);
35
+ const next = argv[i + 1];
36
+ if (!next || next.startsWith('--')) {
37
+ out[key] = true;
38
+ } else {
39
+ out[key] = next;
40
+ i += 1;
41
+ }
42
+ }
43
+ return out;
44
+ }
45
+
46
+ function requireArg(args, key) {
47
+ const value = args[key];
48
+ if (!value || value === true) throw new Error(`Missing --${key}`);
49
+ return String(value);
50
+ }
51
+
52
+ function runGit(args, options = {}) {
53
+ const result = spawnSync('git', args, {
54
+ cwd: rootDir,
55
+ env: { ...process.env, ...(options.env || {}) },
56
+ encoding: 'utf8'
57
+ });
58
+ if (result.status !== 0) {
59
+ const detail = `${result.stderr || result.stdout}`.trim();
60
+ throw new Error(`git ${args.join(' ')} failed${detail ? `: ${detail}` : ''}`);
61
+ }
62
+ return (result.stdout || '').trim();
63
+ }
64
+
65
+ function runGitAllowFailure(args, options = {}) {
66
+ return spawnSync('git', args, {
67
+ cwd: rootDir,
68
+ env: { ...process.env, ...(options.env || {}) },
69
+ encoding: 'utf8'
70
+ });
71
+ }
72
+
73
+ function runOptional(command, args, options = {}) {
74
+ const result = spawnSync(command, args, {
75
+ cwd: rootDir,
76
+ env: { ...process.env, ...(options.env || {}) },
77
+ encoding: 'utf8'
78
+ });
79
+ return {
80
+ ok: result.status === 0,
81
+ stdout: (result.stdout || '').trim(),
82
+ stderr: (result.stderr || '').trim()
83
+ };
84
+ }
85
+
86
+ function activeAgentFor(state, actor) {
87
+ const activeId = state.activeAgents?.[actor];
88
+ if (!activeId) return null;
89
+ const agent = (state.agentRoster || []).find((item) => item.id === activeId || item.name === activeId);
90
+ if (!agent || !(agent.owners || []).includes(actor)) return null;
91
+ return agent;
92
+ }
93
+
94
+ function requireActiveAgent(state, actor, role = 'core', title = 'Core Agent') {
95
+ const agent = activeAgentFor(state, actor);
96
+ if (agent) return agent;
97
+ throw new Error([
98
+ `Agent diperlukan sebelum autosycn untuk ${actor}.`,
99
+ `Task ini perlukan ${title}. Agent ini belum ada nama lagi atau belum dipilih.`,
100
+ `Jalankan: node .memoryofplanet/scripts/mop-core.mjs agent activate --actor ${actor} --role ${role} --title "${title}" --name "<agent-name>"`
101
+ ].join(' '));
102
+ }
103
+
104
+ function agentLedgerFields(agent) {
105
+ return agent ? {
106
+ agent: agent.name,
107
+ agentRole: agent.role,
108
+ agentId: agent.id
109
+ } : {};
110
+ }
111
+
112
+ function appendLedger(state, actor, kind, summary, agent = activeAgentFor(state, actor)) {
113
+ state.ledger ||= [];
114
+ state.ledger.push({ at: now(), actor, ...agentLedgerFields(agent), kind, summary });
115
+ }
116
+
117
+ function guardianConfig(state) {
118
+ return state.autosync?.mergeGuardian || {
119
+ enabled: true,
120
+ name: 'BURHAN-MOP',
121
+ autoReviewAfterPush: true,
122
+ decision: 'required',
123
+ checks: {}
124
+ };
125
+ }
126
+
127
+ function getMember(state, actor) {
128
+ const member = state.members?.[actor];
129
+ if (!member) throw new Error(`Unknown actor: ${actor}`);
130
+ return member;
131
+ }
132
+
133
+ function identityFor(state, actor) {
134
+ const member = getMember(state, actor);
135
+ const identity = member.gitIdentity || {};
136
+ const name = identity.name || member.displayName || actor;
137
+ const email = identity.email || member.github?.noreplyEmail || '';
138
+ if (!email && state.autosync?.requireUserGitEmail !== false) {
139
+ throw new Error([
140
+ `Missing git email for ${actor}.`,
141
+ 'Set a GitHub-verified email or noreply email first:',
142
+ `node .memoryofplanet/scripts/mop-core.mjs member git-identity --actor ${actor} --name "${name}" --email "<github-verified-email>" [--github-username "<username>"]`
143
+ ].join(' '));
144
+ }
145
+ return {
146
+ name,
147
+ email,
148
+ githubUsername: identity.githubUsername || member.github?.username || ''
149
+ };
150
+ }
151
+
152
+ function identityEnv(identity) {
153
+ return {
154
+ GIT_AUTHOR_NAME: identity.name,
155
+ GIT_AUTHOR_EMAIL: identity.email,
156
+ GIT_COMMITTER_NAME: identity.name,
157
+ GIT_COMMITTER_EMAIL: identity.email
158
+ };
159
+ }
160
+
161
+ function mergeIdentityFor(state, actorIdentity) {
162
+ const guardian = guardianConfig(state);
163
+ const guardianIdentity = guardian.gitIdentity || {};
164
+ if (guardian.commitAsGuardianWhenIdentityConfigured && guardianIdentity.email) {
165
+ return {
166
+ name: guardianIdentity.name || guardian.name || 'BURHAN-MOP',
167
+ email: guardianIdentity.email,
168
+ githubUsername: guardianIdentity.githubUsername || ''
169
+ };
170
+ }
171
+ return actorIdentity;
172
+ }
173
+
174
+ function ensureGitRepo() {
175
+ if (!existsSync(join(rootDir, '.git'))) {
176
+ throw new Error(`Not a git repository: ${rootDir}`);
177
+ }
178
+ runGit(['rev-parse', '--show-toplevel']);
179
+ }
180
+
181
+ function ensureGitRepoForInit() {
182
+ if (!existsSync(join(rootDir, '.git'))) {
183
+ const init = runGitAllowFailure(['init', '-b', 'main']);
184
+ if (init.status !== 0) {
185
+ runGit(['init']);
186
+ runGit(['branch', '-M', 'main']);
187
+ }
188
+ }
189
+ runGit(['rev-parse', '--show-toplevel']);
190
+ }
191
+
192
+ function remoteBranchExists(branch) {
193
+ const result = runOptional('git', ['ls-remote', '--exit-code', '--heads', 'origin', branch]);
194
+ return result.ok;
195
+ }
196
+
197
+ function localBranchExists(branch) {
198
+ return runOptional('git', ['rev-parse', '--verify', branch]).ok;
199
+ }
200
+
201
+ function configureLocalIdentity(identity) {
202
+ runGit(['config', '--local', 'user.name', identity.name]);
203
+ runGit(['config', '--local', 'user.email', identity.email]);
204
+ }
205
+
206
+ function configureRemote(url, replaceRemote = false) {
207
+ const existing = runOptional('git', ['remote', 'get-url', 'origin']);
208
+ if (existing.ok) {
209
+ if (url && existing.stdout !== url) {
210
+ if (!replaceRemote) {
211
+ throw new Error(`origin already points to ${existing.stdout}. Re-run with --replace-remote to set ${url}.`);
212
+ }
213
+ runGit(['remote', 'set-url', 'origin', url]);
214
+ return url;
215
+ }
216
+ return existing.stdout;
217
+ }
218
+ if (!url) throw new Error('Missing --url and no origin remote is configured.');
219
+ runGit(['remote', 'add', 'origin', url]);
220
+ return url;
221
+ }
222
+
223
+ function verifyGhUser(identity, state) {
224
+ if (!identity.githubUsername || state.autosync?.verifyGhUserWhenConfigured === false) return 'skipped';
225
+ const gh = runOptional('gh', ['api', 'user', '--jq', '.login']);
226
+ if (!gh.ok) {
227
+ throw new Error('GitHub username is configured, but gh could not verify the active account. Run gh auth login as the real user or set autosync.verifyGhUserWhenConfigured=false for SSH-only workflows.');
228
+ }
229
+ if (gh.stdout.toLowerCase() !== identity.githubUsername.toLowerCase()) {
230
+ throw new Error(`GitHub CLI authenticated as ${gh.stdout}, expected ${identity.githubUsername}. Refusing to push as the wrong account.`);
231
+ }
232
+ return `verified:${gh.stdout}`;
233
+ }
234
+
235
+ function runProjectCommand(command, env) {
236
+ if (!command) return 'skipped';
237
+ const result = spawnSync(command, {
238
+ cwd: rootDir,
239
+ env: { ...process.env, ...env },
240
+ encoding: 'utf8',
241
+ shell: true
242
+ });
243
+ if (result.status !== 0) {
244
+ const detail = `${result.stderr || result.stdout}`.trim();
245
+ throw new Error(`Command failed: ${command}${detail ? `: ${detail}` : ''}`);
246
+ }
247
+ return 'passed';
248
+ }
249
+
250
+ function validateStateIfPresent() {
251
+ if (!existsSync(join(rootDir, '.memoryofplanet', 'STATE.json'))) return 'skipped';
252
+ const result = spawnSync('node', ['.memoryofplanet/scripts/mop-core.mjs', 'validate'], {
253
+ cwd: rootDir,
254
+ encoding: 'utf8'
255
+ });
256
+ if (result.status !== 0) {
257
+ const detail = `${result.stderr || result.stdout}`.trim();
258
+ throw new Error(`State validation failed${detail ? `: ${detail}` : ''}`);
259
+ }
260
+ return 'passed';
261
+ }
262
+
263
+ function guardianReject(message) {
264
+ throw new Error(`BURHAN-MOP rejected merge: ${message}`);
265
+ }
266
+
267
+ function guardianReview(state, sourceRef, env) {
268
+ const guardian = guardianConfig(state);
269
+ const checks = guardian.checks || {};
270
+ const mainBranch = state.autosync?.targetMainBranch || 'main';
271
+ const report = {
272
+ guardian: guardian.name || 'BURHAN-MOP',
273
+ source: sourceRef,
274
+ main: mainBranch,
275
+ checks: {}
276
+ };
277
+
278
+ if (checks.workingTreeCleanAfterCommit !== false) {
279
+ const dirty = runGit(['status', '--porcelain']);
280
+ if (dirty) guardianReject('working tree is not clean before merge review');
281
+ report.checks.workingTreeCleanAfterCommit = 'passed';
282
+ }
283
+
284
+ runGit(['fetch', 'origin']);
285
+ if (checks.branchUpToDateWithMain !== false) {
286
+ const ancestor = runOptional('git', ['merge-base', '--is-ancestor', `origin/${mainBranch}`, sourceRef]);
287
+ if (!ancestor.ok) {
288
+ guardianReject(`${sourceRef} is not up to date with origin/${mainBranch}. Run preflight first.`);
289
+ }
290
+ report.checks.branchUpToDateWithMain = 'passed';
291
+ }
292
+
293
+ if (checks.secretScan !== false) {
294
+ const pattern = '(AIza|ghp_|github_pat_|sk-[A-Za-z0-9]|xox[baprs]-|password\\s*[:=]|secret\\s*[:=]|api[_-]?key\\s*[:=]|token\\s*[:=])';
295
+ const scan = runOptional('git', ['diff', '--name-only', '-G', pattern, `origin/${mainBranch}..${sourceRef}`, '--', '.']);
296
+ if (scan.ok && scan.stdout) {
297
+ guardianReject(`possible secret pattern found in changed files:\n${scan.stdout}`);
298
+ }
299
+ report.checks.secretScan = 'passed';
300
+ }
301
+
302
+ report.checks.stateValid = checks.stateValid === false ? 'skipped-before-merge' : 'pending-after-merge';
303
+ report.checks.testCommand = checks.testCommand ? 'pending-after-merge' : 'skipped';
304
+ report.checks.buildCommand = checks.buildCommand ? 'pending-after-merge' : 'skipped';
305
+ return report;
306
+ }
307
+
308
+ function commitIfNeeded(reason, env) {
309
+ runGit(['add', '-A']);
310
+ const status = runGit(['status', '--porcelain']);
311
+ if (!status) return 'nothing-to-commit';
312
+ runGit(['commit', '-m', reason], { env });
313
+ return runGit(['rev-parse', '--short', 'HEAD']);
314
+ }
315
+
316
+ function currentBranch() {
317
+ return runGit(['branch', '--show-current']);
318
+ }
319
+
320
+ function workBranchFor(state, actor) {
321
+ const mainBranch = state.autosync?.targetMainBranch || 'main';
322
+ const prefix = state.autosync?.workBranchPrefix || 'dev';
323
+ return state.mode === 'team' ? `${prefix}/${actor}` : mainBranch;
324
+ }
325
+
326
+ function ensureBranch(branch) {
327
+ runGit(['fetch', 'origin']);
328
+ if (localBranchExists(branch)) {
329
+ runGit(['checkout', branch]);
330
+ } else if (remoteBranchExists(branch)) {
331
+ runGit(['checkout', '-B', branch, `origin/${branch}`]);
332
+ } else {
333
+ runGit(['checkout', '-B', branch]);
334
+ }
335
+ }
336
+
337
+ function syncMainFromOrigin(state, env) {
338
+ const mainBranch = state.autosync?.targetMainBranch || 'main';
339
+ runGit(['fetch', 'origin']);
340
+ if (localBranchExists(mainBranch)) {
341
+ runGit(['checkout', mainBranch]);
342
+ } else if (remoteBranchExists(mainBranch)) {
343
+ runGit(['checkout', '-B', mainBranch, `origin/${mainBranch}`]);
344
+ } else {
345
+ runGit(['checkout', '-B', mainBranch]);
346
+ }
347
+ if (remoteBranchExists(mainBranch)) {
348
+ runGit(['pull', '--ff-only', 'origin', mainBranch], { env });
349
+ }
350
+ return mainBranch;
351
+ }
352
+
353
+ function preflight(args) {
354
+ ensureGitRepo();
355
+ const state = readState();
356
+ if (!state.initialized) throw new Error('MemoryOfPlanet is not initialized.');
357
+ const actor = requireArg(args, 'actor');
358
+ const agent = requireActiveAgent(state, actor);
359
+ const identity = identityFor(state, actor);
360
+ const env = identityEnv(identity);
361
+ const ghStatus = verifyGhUser(identity, state);
362
+ configureLocalIdentity(identity);
363
+
364
+ const dirty = runGit(['status', '--porcelain']);
365
+ if (dirty) {
366
+ throw new Error('Working tree has uncommitted changes. Run autosycn or commit/stash before preflight.');
367
+ }
368
+
369
+ const mainBranch = syncMainFromOrigin(state, env);
370
+ const workBranch = workBranchFor(state, actor);
371
+ if (workBranch !== mainBranch) {
372
+ if (localBranchExists(workBranch)) {
373
+ runGit(['checkout', workBranch]);
374
+ } else if (remoteBranchExists(workBranch)) {
375
+ runGit(['checkout', '-B', workBranch, `origin/${workBranch}`]);
376
+ } else {
377
+ runGit(['checkout', '-B', workBranch, mainBranch]);
378
+ }
379
+ const merge = runGitAllowFailure(['merge', '--no-edit', mainBranch], { env });
380
+ if (merge.status !== 0) {
381
+ runOptional('git', ['merge', '--abort']);
382
+ const detail = `${merge.stderr || merge.stdout}`.trim();
383
+ throw new Error(`Could not sync ${workBranch} with ${mainBranch}. Merge aborted.${detail ? ` ${detail}` : ''}`);
384
+ }
385
+ }
386
+
387
+ console.log(JSON.stringify({
388
+ ok: true,
389
+ actor,
390
+ agent: agent.name,
391
+ ghStatus,
392
+ mainBranch,
393
+ workBranch,
394
+ head: runGit(['rev-parse', '--short', 'HEAD'])
395
+ }, null, 2));
396
+ }
397
+
398
+ function saveMemory(actor, summary) {
399
+ const state = readState();
400
+ const agent = requireActiveAgent(state, actor);
401
+ appendLedger(state, actor, 'memory', summary, agent);
402
+ writeState(state);
403
+ return state;
404
+ }
405
+
406
+ function push(args) {
407
+ ensureGitRepo();
408
+ const state = readState();
409
+ if (!state.initialized) throw new Error('MemoryOfPlanet is not initialized.');
410
+ const actor = requireArg(args, 'actor');
411
+ const agent = requireActiveAgent(state, actor);
412
+ const reason = String(args.reason || 'MemoryOfPlanet autosycn');
413
+ const identity = identityFor(state, actor);
414
+ const env = identityEnv(identity);
415
+ const ghStatus = verifyGhUser(identity, state);
416
+ configureLocalIdentity(identity);
417
+
418
+ const target = workBranchFor(state, actor);
419
+ const before = currentBranch();
420
+ const dirty = runGit(['status', '--porcelain']);
421
+ if (state.mode === 'team' && before !== target && dirty) {
422
+ throw new Error(`Team autosycn must commit from ${target}. Run preflight before starting work: node .memoryofplanet/scripts/mop-autosycn.mjs preflight --actor ${actor}`);
423
+ }
424
+ ensureBranch(target);
425
+ const commit = commitIfNeeded(reason, env);
426
+ runGit(['push', '-u', 'origin', target], { env });
427
+
428
+ console.log(JSON.stringify({
429
+ ok: true,
430
+ actor,
431
+ agent: agent.name,
432
+ author: `${identity.name} <${identity.email}>`,
433
+ ghStatus,
434
+ branch: target,
435
+ previousBranch: before,
436
+ commit
437
+ }, null, 2));
438
+ }
439
+
440
+ function init(args) {
441
+ const state = readState();
442
+ if (!state.initialized) throw new Error('MemoryOfPlanet is not initialized.');
443
+ const actor = requireArg(args, 'actor');
444
+ const agent = requireActiveAgent(state, actor);
445
+ if (actor !== state.ownerCodename) throw new Error('Only the owner can initialize autosycn.');
446
+ const identity = identityFor(state, actor);
447
+ const env = identityEnv(identity);
448
+ const url = String(args.url || state.githubUrl || '');
449
+ const ghStatus = verifyGhUser(identity, state);
450
+
451
+ ensureGitRepoForInit();
452
+ configureLocalIdentity(identity);
453
+ const remote = configureRemote(url, args['replace-remote'] === true);
454
+ runGit(['checkout', '-B', state.autosync?.targetMainBranch || 'main']);
455
+
456
+ appendLedger(state, actor, 'autosycn-init', `Initialized autosycn remote ${remote}.`, agent);
457
+ if (url) state.githubUrl = url;
458
+ writeState(state);
459
+ const commit = commitIfNeeded('Initialize MemoryOfPlanet autosycn baseline', env);
460
+ runGit(['push', '-u', 'origin', state.autosync?.targetMainBranch || 'main'], { env });
461
+
462
+ console.log(JSON.stringify({
463
+ ok: true,
464
+ actor,
465
+ agent: agent.name,
466
+ author: `${identity.name} <${identity.email}>`,
467
+ ghStatus,
468
+ remote,
469
+ branch: state.autosync?.targetMainBranch || 'main',
470
+ commit
471
+ }, null, 2));
472
+ }
473
+
474
+ function mergeMain(args) {
475
+ ensureGitRepo();
476
+ const state = readState();
477
+ if (!state.initialized) throw new Error('MemoryOfPlanet is not initialized.');
478
+ const actor = requireArg(args, 'actor');
479
+ const agent = requireActiveAgent(state, actor);
480
+ if (state.autosync?.requireOwnerForMerge === true && actor !== state.ownerCodename) {
481
+ throw new Error('Only the owner can request BURHAN-MOP merge to main.');
482
+ }
483
+ const from = String(args.from || actor);
484
+ const prefix = state.autosync?.workBranchPrefix || 'dev';
485
+ const reason = String(args.reason || `Merge ${prefix}/${from}`);
486
+ const identity = identityFor(state, actor);
487
+ const mergeIdentity = mergeIdentityFor(state, identity);
488
+ const env = identityEnv(mergeIdentity);
489
+ const ghStatus = verifyGhUser(identity, state);
490
+ configureLocalIdentity(mergeIdentity);
491
+
492
+ const mainBranch = state.autosync?.targetMainBranch || 'main';
493
+ const source = `origin/${prefix}/${from}`;
494
+ const guardian = guardianConfig(state);
495
+ const review = guardian.enabled === false ? { guardian: 'disabled', checks: {} } : guardianReview(state, source, env);
496
+ runGit(['checkout', mainBranch]);
497
+ runGit(['pull', 'origin', mainBranch], { env });
498
+ runGit(['fetch', 'origin']);
499
+ const merge = runGitAllowFailure(['merge', '--no-ff', '--no-commit', source], { env });
500
+ if (merge.status !== 0) {
501
+ const conflicted = runOptional('git', ['diff', '--name-only', '--diff-filter=U']);
502
+ const files = conflicted.stdout.split(/\r?\n/).filter(Boolean);
503
+ if (files.length === 1 && files[0].replaceAll('\\', '/') === '.memoryofplanet/STATE.json') {
504
+ runGit(['checkout', '--ours', '--', '.memoryofplanet/STATE.json']);
505
+ runGit(['add', '.memoryofplanet/STATE.json']);
506
+ } else {
507
+ runOptional('git', ['merge', '--abort']);
508
+ const detail = `${merge.stderr || merge.stdout}`.trim();
509
+ guardianReject(`merge conflict outside STATE.json. Merge aborted.${detail ? ` ${detail}` : ''}`);
510
+ }
511
+ }
512
+ try {
513
+ if (guardian.checks?.stateValid !== false) review.checks.stateValid = validateStateIfPresent();
514
+ review.checks.testCommand = runProjectCommand(guardian.checks?.testCommand || '', env);
515
+ review.checks.buildCommand = runProjectCommand(guardian.checks?.buildCommand || '', env);
516
+
517
+ if (existsSync(statePath)) {
518
+ const mergedState = readState();
519
+ appendLedger(mergedState, guardian.name || 'BURHAN-MOP', 'merge-approved', `${source} approved and merged to ${mainBranch}.`);
520
+ writeState(mergedState);
521
+ runGit(['add', '.memoryofplanet/STATE.json']);
522
+ }
523
+ runGit(['commit', '-m', reason], { env });
524
+ } catch (error) {
525
+ runOptional('git', ['merge', '--abort']);
526
+ guardianReject(error.message);
527
+ }
528
+ runGit(['push', 'origin', mainBranch], { env });
529
+
530
+ console.log(JSON.stringify({
531
+ ok: true,
532
+ actor,
533
+ agent: agent.name,
534
+ guardian: review.guardian,
535
+ author: `${mergeIdentity.name} <${mergeIdentity.email}>`,
536
+ ghStatus,
537
+ merged: source,
538
+ branch: mainBranch,
539
+ review: review.checks,
540
+ head: runGit(['rev-parse', '--short', 'HEAD'])
541
+ }, null, 2));
542
+ }
543
+
544
+ function runAll(args) {
545
+ const actor = requireArg(args, 'actor');
546
+ const reason = String(args.reason || 'MemoryOfPlanet autosycn');
547
+ saveMemory(actor, reason);
548
+ push({ ...args, actor, reason });
549
+ const state = readState();
550
+ const guardian = guardianConfig(state);
551
+ if (state.mode === 'team' && state.autosync?.autoMergeToMain !== false && guardian.autoReviewAfterPush !== false) {
552
+ const prefix = state.autosync?.workBranchPrefix || 'dev';
553
+ mergeMain({ actor, from: actor, reason: `${guardian.name || 'BURHAN-MOP'} approved merge ${prefix}/${actor}: ${reason}` });
554
+ }
555
+ }
556
+
557
+ function status() {
558
+ const state = readState();
559
+ console.log(JSON.stringify({
560
+ enabled: state.autosync?.enabled !== false,
561
+ main: state.autosync?.targetMainBranch || 'main',
562
+ workBranchPrefix: state.autosync?.workBranchPrefix || 'dev',
563
+ autoMergeToMain: state.autosync?.autoMergeToMain !== false,
564
+ mergeGuardian: guardianConfig(state),
565
+ preflightBeforeWork: state.autosync?.preflightBeforeWork !== false,
566
+ requireUserGitEmail: state.autosync?.requireUserGitEmail !== false,
567
+ initialized: state.initialized,
568
+ activeMember: state.activeMember,
569
+ activeAgents: Object.fromEntries(Object.entries(state.activeAgents || {}).map(([codename, agentId]) => {
570
+ const agent = (state.agentRoster || []).find((item) => item.id === agentId || item.name === agentId);
571
+ return [codename, agent ? { name: agent.name, role: agent.role, id: agent.id } : { id: agentId, missing: true }];
572
+ })),
573
+ members: Object.fromEntries(Object.entries(state.members || {}).map(([key, member]) => [
574
+ key,
575
+ {
576
+ displayName: member.displayName,
577
+ gitIdentityConfigured: Boolean(member.gitIdentity?.email || member.github?.noreplyEmail),
578
+ gitName: member.gitIdentity?.name || member.displayName || key,
579
+ gitEmail: member.gitIdentity?.email || member.github?.noreplyEmail || ''
580
+ }
581
+ ]))
582
+ }, null, 2));
583
+ }
584
+
585
+ function main() {
586
+ const [command, ...rest] = process.argv.slice(2);
587
+ const args = parseArgs(rest);
588
+ if (command === 'status') return status();
589
+ if (command === 'preflight' || command === 'start') return preflight(args);
590
+ if (command === 'init') return init(args);
591
+ if (command === 'memory') {
592
+ const actor = requireArg(args, 'actor');
593
+ const summary = String(args.summary || args.reason || 'MemoryOfPlanet conversation');
594
+ saveMemory(actor, summary);
595
+ console.log(`Memory saved for ${actor}.`);
596
+ return;
597
+ }
598
+ if (command === 'push') return push(args);
599
+ if (command === 'merge') return mergeMain(args);
600
+ if (command === 'run') return runAll(args);
601
+
602
+ console.log(`Usage:
603
+ node .memoryofplanet/scripts/mop-autosycn.mjs status
604
+ node .memoryofplanet/scripts/mop-autosycn.mjs preflight --actor <codename>
605
+ node .memoryofplanet/scripts/mop-autosycn.mjs init --actor <owner-codename> --url <github-url>
606
+ node .memoryofplanet/scripts/mop-autosycn.mjs memory --actor <codename> --summary "what happened"
607
+ node .memoryofplanet/scripts/mop-autosycn.mjs push --actor <codename> --reason "what changed"
608
+ node .memoryofplanet/scripts/mop-autosycn.mjs merge --actor <owner> --from <codename> --reason "merge reason"
609
+ node .memoryofplanet/scripts/mop-autosycn.mjs run --actor <codename> --reason "what changed"`);
610
+ }
611
+
612
+ try {
613
+ main();
614
+ } catch (error) {
615
+ console.error(error.message);
616
+ process.exitCode = 1;
617
+ }