maf 0.1.0 → 0.3.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 (95) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +174 -0
  3. data/README.md +29 -11
  4. data/assets/agents-contract.md +2 -0
  5. data/assets/analyst +29 -51
  6. data/assets/coord +168 -41
  7. data/assets/dashboard +1 -5
  8. data/assets/dispatcher +127 -298
  9. data/assets/harness-hooks/context-watch.rb +5 -4
  10. data/assets/lima/maf.yaml.erb +61 -0
  11. data/install.md +6 -1
  12. data/lib/maf/bootstrap/claude_settings.rb +17 -9
  13. data/lib/maf/bootstrap/script_planner.rb +1 -1
  14. data/lib/maf/bootstrap.rb +4 -0
  15. data/lib/maf/cli.rb +22 -9
  16. data/lib/maf/flow/agent_links.rb +2 -2
  17. data/lib/maf/flow/bootstrapper.rb +5 -5
  18. data/lib/maf/flow/codex_hooks.rb +12 -1
  19. data/lib/maf/flow/effort_report.rb +20 -0
  20. data/lib/maf/flow/generator.rb +3 -2
  21. data/lib/maf/flow/harness_linker.rb +2 -2
  22. data/lib/maf/flow/hermes_env_setup.rb +46 -0
  23. data/lib/maf/flow/hook_files.rb +6 -0
  24. data/lib/maf/flow/hook_installer.rb +6 -20
  25. data/lib/maf/flow/manifest.rb +3 -3
  26. data/lib/maf/flow/mcp_config.rb +8 -22
  27. data/lib/maf/flow/mcp_installer.rb +3 -3
  28. data/lib/maf/flow/models.rb +14 -38
  29. data/lib/maf/flow/options.rb +33 -5
  30. data/lib/maf/flow/prompt_builder.rb +7 -14
  31. data/lib/maf/flow/prompt_text.rb +13 -14
  32. data/lib/maf/flow/report.rb +8 -9
  33. data/lib/maf/flow/role_catalog.rb +1 -1
  34. data/lib/maf/flow/role_files.rb +7 -22
  35. data/lib/maf/flow/roster.rb +6 -3
  36. data/lib/maf/flow/validator.rb +2 -2
  37. data/lib/maf/flow.rb +7 -21
  38. data/lib/maf/menu.rb +49 -15
  39. data/lib/maf/migrate/role_files.rb +3 -1
  40. data/lib/maf/retire.rb +42 -6
  41. data/lib/maf/setup_agent/args.rb +16 -10
  42. data/lib/maf/setup_agent/dispatch.rb +3 -3
  43. data/lib/maf/setup_agent/launcher.rb +16 -65
  44. data/lib/maf/setup_agent/manifest.rb +9 -3
  45. data/lib/maf/setup_agent/pty_relay.rb +75 -0
  46. data/lib/maf/setup_agent/role_file.rb +1 -1
  47. data/lib/maf/setup_agent/runtime_hooks.rb +1 -12
  48. data/lib/maf/setup_agent.rb +11 -13
  49. data/lib/maf/shared/harness/base.rb +57 -0
  50. data/lib/maf/shared/harness/defaults.rb +147 -0
  51. data/lib/maf/shared/harness/output.rb +55 -0
  52. data/lib/maf/shared/harness/traits.rb +35 -0
  53. data/lib/maf/shared/harness/vm_credential.rb +36 -0
  54. data/lib/maf/shared/harness.rb +12 -0
  55. data/lib/maf/shared/harnesses/claude.rb +137 -0
  56. data/lib/maf/shared/harnesses/codex.rb +202 -0
  57. data/lib/maf/shared/harnesses/cursor.rb +120 -0
  58. data/lib/maf/shared/harnesses/hermes.rb +122 -0
  59. data/lib/maf/shared/harnesses/opencode.rb +192 -0
  60. data/lib/maf/shared/processes.rb +20 -0
  61. data/lib/maf/shared/roles.rb +4 -0
  62. data/lib/maf/shared/sandbox/bwrap.rb +128 -0
  63. data/lib/maf/shared/sandbox/harness_files.rb +50 -0
  64. data/lib/maf/shared/sandbox/links.rb +28 -0
  65. data/lib/maf/shared/sandbox/paths.rb +124 -0
  66. data/lib/maf/shared/sandbox/references.rb +64 -0
  67. data/lib/maf/shared/sandbox/seatbelt.rb +86 -0
  68. data/lib/maf/shared/sandbox.rb +84 -0
  69. data/lib/maf/team.rb +5 -4
  70. data/lib/maf/team_command.rb +5 -3
  71. data/lib/maf/uninstall/manifest.rb +10 -8
  72. data/lib/maf/uninstall/mcp_entries.rb +4 -5
  73. data/lib/maf/uninstall/notes.rb +13 -2
  74. data/lib/maf/uninstall/role_files.rb +11 -10
  75. data/lib/maf/uninstall/runner.rb +4 -3
  76. data/lib/maf/uninstall/scripts.rb +1 -1
  77. data/lib/maf/uninstall/vm_files.rb +16 -0
  78. data/lib/maf/uninstall.rb +20 -5
  79. data/lib/maf/untrack.rb +12 -25
  80. data/lib/maf/version.rb +1 -1
  81. data/lib/maf/vm/login.rb +52 -0
  82. data/lib/maf/vm/options.rb +41 -0
  83. data/lib/maf/vm/template.rb +44 -0
  84. data/lib/maf/vm.rb +94 -0
  85. data/lib/maf/worker_control.rb +16 -8
  86. data/lib/maf/worker_list.rb +83 -0
  87. data/lib/maf/workers.rb +27 -0
  88. data/templates/roles.yml +14 -0
  89. metadata +33 -11
  90. data/lib/maf/setup_agent/hermes_launcher.rb +0 -34
  91. data/lib/maf/setup_agent/hermes_skill.rb +0 -26
  92. data/templates/claude.md.erb +0 -16
  93. data/templates/codex.md.erb +0 -7
  94. data/templates/hermes.md.erb +0 -12
  95. data/templates/opencode.md.erb +0 -24
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Maf
4
- module SetupAgent
5
- module Launcher
6
- # Hermes loads role files as skills from <hermes_dir>/<project>-<role>/.
7
- # flow.rb writes the skill there; --skills <project>-<role> loads it.
8
- # Hermes has no --agent flag; the skill's SKILL.md is the role definition.
9
- # `-q` on a TTY seeds an interactive session with the prompt.
10
- # A lead role owns no task, so it gets an inbox prompt. A role with
11
- # can_edit false starts without the file-writing toolsets.
12
- module Hermes
13
- PROMPT = "Follow the coordination rules of your role skill as role %<role>s. " \
14
- "Run coord inbox, then coord next --wait. Claim a task, do the work, finish it. Repeat."
15
- LEAD_PROMPT = "Follow your role skill and its coordination rules as role %<role>s. " \
16
- "You are a lead role. Never claim a task. Run coord inbox --wait and handle each message."
17
-
18
- def self.launch(role, _worker, model)
19
- cmd = %w[hermes chat]
20
- cmd += ["--skills", HermesSkill.name(role)] if HermesSkill.installed?(role)
21
- cmd += ["--model", model] if model
22
- cmd += ["-t", Flow::READ_ONLY_TOOLSETS] if read_only?(role)
23
- Launcher.exec_or_die(cmd + ["-q", prompt(role)])
24
- end
25
-
26
- def self.prompt(role) = format(Flow::LEADS.include?(role) ? LEAD_PROMPT : PROMPT, role: role)
27
-
28
- def self.read_only?(role)
29
- Project.manifest.fetch("agents", []).any? { |agent| agent["role"] == role && agent["can_edit"] == false }
30
- end
31
- end
32
- end
33
- end
34
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Maf
4
- module SetupAgent
5
- # HermesSkill resolves the skill flow.rb generated for a role: the name is
6
- # <project>-<role>, and the dir is the manifest's hermes_dir (set by
7
- # `flow.rb --hermes-dir`) or flow.rb's default ~/.hermes/skills.
8
- module HermesSkill
9
- DEFAULT_DIR = File.join(Dir.home, ".hermes", "skills")
10
-
11
- # Plain defs, not endless ones: this file must still parse on Ruby 2.x so
12
- # the version check above can print its message.
13
- def self.name(role)
14
- "#{File.basename(Project.root)}-#{role}"
15
- end
16
-
17
- def self.dir
18
- Project.manifest.fetch("hermes_dir", DEFAULT_DIR)
19
- end
20
-
21
- def self.installed?(role)
22
- File.exist?(File.join(dir, name(role), "SKILL.md"))
23
- end
24
- end
25
- end
26
- end
@@ -1,16 +0,0 @@
1
- ---
2
- # >>> multi-agent-flow >>>
3
- name: <%= role %>
4
- description: <%= description %>
5
- <% if model -%>
6
- model: <%= model %>
7
- <% end -%>
8
- <%# A tools list blocks each MCP tool that it does not name. -%>
9
- <% if can_edit -%>
10
- tools: Read, Write, Edit, Bash, Grep, Glob, mcp__graphify
11
- <% else -%>
12
- tools: Read, Bash, Grep, Glob, mcp__graphify
13
- <% end -%>
14
- ---
15
-
16
- <%= prompt %>
@@ -1,7 +0,0 @@
1
- <!-- >>> multi-agent-flow >>> -->
2
- # <%= title %>
3
-
4
- <% if model -%>
5
- > Model: `<%= model %>` (Codex sets the model at launch: `codex -m <%= model %>`)
6
- <% end -%>
7
- <%= prompt %>
@@ -1,12 +0,0 @@
1
- ---
2
- # >>> multi-agent-flow >>>
3
- name: <%= role %>
4
- description: <%= description %>
5
- ---
6
-
7
- # <%= title %>
8
-
9
- <% if model -%>
10
- > Model: `<%= model %>` (Hermes sets the model with `hermes model`)
11
- <% end -%>
12
- <%= prompt %>
@@ -1,24 +0,0 @@
1
- ---
2
- # >>> multi-agent-flow >>>
3
- description: <%= description %>
4
- mode: all
5
- <% if model -%>
6
- model: <%= model %>
7
- <% end -%>
8
- temperature: 0.1
9
- permission:
10
- edit: <%= can_edit ? "allow" : "deny" %>
11
- bash: allow
12
- # Worktrees live inside the project. The board, the artifacts, and git
13
- # data are outside the worktree, so opencode would ask for each access.
14
- external_directory:
15
- "/tmp/*": allow
16
- "/private/tmp/*": allow
17
- "<%= project %>/.maf/*": allow
18
- "<%= project %>/.git/*": allow
19
- task:
20
- "*": deny
21
- explore: allow
22
- ---
23
-
24
- <%= prompt %>