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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +174 -0
- data/README.md +29 -11
- data/assets/agents-contract.md +2 -0
- data/assets/analyst +29 -51
- data/assets/coord +168 -41
- data/assets/dashboard +1 -5
- data/assets/dispatcher +127 -298
- data/assets/harness-hooks/context-watch.rb +5 -4
- data/assets/lima/maf.yaml.erb +61 -0
- data/install.md +6 -1
- data/lib/maf/bootstrap/claude_settings.rb +17 -9
- data/lib/maf/bootstrap/script_planner.rb +1 -1
- data/lib/maf/bootstrap.rb +4 -0
- data/lib/maf/cli.rb +22 -9
- data/lib/maf/flow/agent_links.rb +2 -2
- data/lib/maf/flow/bootstrapper.rb +5 -5
- data/lib/maf/flow/codex_hooks.rb +12 -1
- data/lib/maf/flow/effort_report.rb +20 -0
- data/lib/maf/flow/generator.rb +3 -2
- data/lib/maf/flow/harness_linker.rb +2 -2
- data/lib/maf/flow/hermes_env_setup.rb +46 -0
- data/lib/maf/flow/hook_files.rb +6 -0
- data/lib/maf/flow/hook_installer.rb +6 -20
- data/lib/maf/flow/manifest.rb +3 -3
- data/lib/maf/flow/mcp_config.rb +8 -22
- data/lib/maf/flow/mcp_installer.rb +3 -3
- data/lib/maf/flow/models.rb +14 -38
- data/lib/maf/flow/options.rb +33 -5
- data/lib/maf/flow/prompt_builder.rb +7 -14
- data/lib/maf/flow/prompt_text.rb +13 -14
- data/lib/maf/flow/report.rb +8 -9
- data/lib/maf/flow/role_catalog.rb +1 -1
- data/lib/maf/flow/role_files.rb +7 -22
- data/lib/maf/flow/roster.rb +6 -3
- data/lib/maf/flow/validator.rb +2 -2
- data/lib/maf/flow.rb +7 -21
- data/lib/maf/menu.rb +49 -15
- data/lib/maf/migrate/role_files.rb +3 -1
- data/lib/maf/retire.rb +42 -6
- data/lib/maf/setup_agent/args.rb +16 -10
- data/lib/maf/setup_agent/dispatch.rb +3 -3
- data/lib/maf/setup_agent/launcher.rb +16 -65
- data/lib/maf/setup_agent/manifest.rb +9 -3
- data/lib/maf/setup_agent/pty_relay.rb +75 -0
- data/lib/maf/setup_agent/role_file.rb +1 -1
- data/lib/maf/setup_agent/runtime_hooks.rb +1 -12
- data/lib/maf/setup_agent.rb +11 -13
- data/lib/maf/shared/harness/base.rb +57 -0
- data/lib/maf/shared/harness/defaults.rb +147 -0
- data/lib/maf/shared/harness/output.rb +55 -0
- data/lib/maf/shared/harness/traits.rb +35 -0
- data/lib/maf/shared/harness/vm_credential.rb +36 -0
- data/lib/maf/shared/harness.rb +12 -0
- data/lib/maf/shared/harnesses/claude.rb +137 -0
- data/lib/maf/shared/harnesses/codex.rb +202 -0
- data/lib/maf/shared/harnesses/cursor.rb +120 -0
- data/lib/maf/shared/harnesses/hermes.rb +122 -0
- data/lib/maf/shared/harnesses/opencode.rb +192 -0
- data/lib/maf/shared/processes.rb +20 -0
- data/lib/maf/shared/roles.rb +4 -0
- data/lib/maf/shared/sandbox/bwrap.rb +128 -0
- data/lib/maf/shared/sandbox/harness_files.rb +50 -0
- data/lib/maf/shared/sandbox/links.rb +28 -0
- data/lib/maf/shared/sandbox/paths.rb +124 -0
- data/lib/maf/shared/sandbox/references.rb +64 -0
- data/lib/maf/shared/sandbox/seatbelt.rb +86 -0
- data/lib/maf/shared/sandbox.rb +84 -0
- data/lib/maf/team.rb +5 -4
- data/lib/maf/team_command.rb +5 -3
- data/lib/maf/uninstall/manifest.rb +10 -8
- data/lib/maf/uninstall/mcp_entries.rb +4 -5
- data/lib/maf/uninstall/notes.rb +13 -2
- data/lib/maf/uninstall/role_files.rb +11 -10
- data/lib/maf/uninstall/runner.rb +4 -3
- data/lib/maf/uninstall/scripts.rb +1 -1
- data/lib/maf/uninstall/vm_files.rb +16 -0
- data/lib/maf/uninstall.rb +20 -5
- data/lib/maf/untrack.rb +12 -25
- data/lib/maf/version.rb +1 -1
- data/lib/maf/vm/login.rb +52 -0
- data/lib/maf/vm/options.rb +41 -0
- data/lib/maf/vm/template.rb +44 -0
- data/lib/maf/vm.rb +94 -0
- data/lib/maf/worker_control.rb +16 -8
- data/lib/maf/worker_list.rb +83 -0
- data/lib/maf/workers.rb +27 -0
- data/templates/roles.yml +14 -0
- metadata +33 -11
- data/lib/maf/setup_agent/hermes_launcher.rb +0 -34
- data/lib/maf/setup_agent/hermes_skill.rb +0 -26
- data/templates/claude.md.erb +0 -16
- data/templates/codex.md.erb +0 -7
- data/templates/hermes.md.erb +0 -12
- 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
|
data/templates/claude.md.erb
DELETED
|
@@ -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 %>
|
data/templates/codex.md.erb
DELETED
data/templates/hermes.md.erb
DELETED
data/templates/opencode.md.erb
DELETED
|
@@ -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 %>
|