agent-guild 1.2.0__tar.gz → 1.2.1__tar.gz
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.
- {agent_guild-1.2.0 → agent_guild-1.2.1}/CHANGELOG.md +7 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/PKG-INFO +19 -1
- {agent_guild-1.2.0 → agent_guild-1.2.1}/README.md +18 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/pyproject.toml +1 -1
- {agent_guild-1.2.0 → agent_guild-1.2.1}/src/agent_guild/cli.py +5 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/src/agent_guild/installer.py +4 -1
- {agent_guild-1.2.0 → agent_guild-1.2.1}/tests/test_cli.py +41 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/uv.lock +1 -1
- {agent_guild-1.2.0 → agent_guild-1.2.1}/.github/workflows/ci.yml +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/.github/workflows/release.yml +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/.gitignore +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/LICENSE +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/agents/architect.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/agents/code-grader.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/agents/coder.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/agents/utility.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/development-workflow.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/docs/manual_installation.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/scripts/release_notes.py +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/src/agent_guild/__init__.py +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/src/agent_guild/files.py +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/src/agent_guild/specialists.py +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/agents-rules.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/coders/python.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/coders/swift.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/coders/typescript.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/memory-bank-rules.md +0 -0
- {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/sdd-rules.md +0 -0
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
## [Unreleased]
|
|
4
4
|
|
|
5
|
+
## [1.2.1] - 2026-10-22
|
|
6
|
+
|
|
7
|
+
- The install log says `skipped ... section '<name>' is already in CLAUDE.md or AGENTS.md` instead of the confusing
|
|
8
|
+
`unchanged`, notes when `.claude/skills` is a symlink and where skills are written, and ends with a hint to merge
|
|
9
|
+
skipped files that differ by hand.
|
|
10
|
+
- README: a section on adding agent-guild to a project that already has its own agents, skills and rules.
|
|
11
|
+
|
|
5
12
|
## [1.2.0] - 2026-10-22
|
|
6
13
|
|
|
7
14
|
- Follow the updated sdd-feature skill: Phase 0 has a UI track (wireframe) and a system track (`DESIGN.md` with Mermaid
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: agent-guild
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.1
|
|
4
4
|
Summary: A multi-agent setup for Claude Code (orchestrator + architect, coder, grader, utility subagents) with memory-bank, jevmem and Spec-Driven Development wired in, installed into a project with one command.
|
|
5
5
|
Project-URL: Homepage, https://github.com/illescasDaniel/agent-guild
|
|
6
6
|
Project-URL: Issues, https://github.com/illescasDaniel/agent-guild/issues
|
|
@@ -123,6 +123,24 @@ uv run agent-guild /path/to/project --dry-run
|
|
|
123
123
|
From a checkout, the CLI reads `agents/`, `templates/` and `development-workflow.md` at the repo root; the published
|
|
124
124
|
wheel bundles them.
|
|
125
125
|
|
|
126
|
+
## Adding it to a project that already has its own setup
|
|
127
|
+
|
|
128
|
+
The installer never overwrites a file that differs from the shipped one (and skips CLAUDE.md sections that `AGENTS.md`
|
|
129
|
+
or `CLAUDE.md` already has), so it is safe to run on a project with its own agents, skills and rules. After it runs:
|
|
130
|
+
|
|
131
|
+
- **Skipped files are yours.** Anything the log marks `skipped ... differs` keeps your version. If it is an older or
|
|
132
|
+
customised copy of a shipped one (the `sdd-feature` skill, `code-grader`, `jev-memory`), diff it against the shipped
|
|
133
|
+
file and merge what you want by hand. `--force` replaces it instead.
|
|
134
|
+
- **New files can land next to yours.** A skill folder you already have keeps its `SKILL.md`, but the shipped files
|
|
135
|
+
that are missing (templates, scripts) are added beside it. If `.claude/skills` is a symlink to `.cursor/skills`, the
|
|
136
|
+
log says so, and the skills are written there.
|
|
137
|
+
- **Cursor reads `.claude/agents/` too.** The agents installed here work in Cursor without copies in `.cursor/agents/`
|
|
138
|
+
(`.cursor/agents/` wins on a name clash). Cursor ignores `tools`, `disallowedTools` and `effort`, so the read-only
|
|
139
|
+
agents are not read-only there. If your project has a test that requires every `.claude/agents/*.md` to have a
|
|
140
|
+
`.cursor/agents/` twin, relax it to require the twin only for the Cursor agents.
|
|
141
|
+
- **Skip what you already have** with `--without memory-bank` / `jevmem` / `sdd`, for example when your own memory-bank
|
|
142
|
+
skill has a different name.
|
|
143
|
+
|
|
126
144
|
## Design choices
|
|
127
145
|
|
|
128
146
|
- **The orchestrator is the only writer of memory.** Parallel coders writing `memory/` would conflict, and someone has
|
|
@@ -104,6 +104,24 @@ uv run agent-guild /path/to/project --dry-run
|
|
|
104
104
|
From a checkout, the CLI reads `agents/`, `templates/` and `development-workflow.md` at the repo root; the published
|
|
105
105
|
wheel bundles them.
|
|
106
106
|
|
|
107
|
+
## Adding it to a project that already has its own setup
|
|
108
|
+
|
|
109
|
+
The installer never overwrites a file that differs from the shipped one (and skips CLAUDE.md sections that `AGENTS.md`
|
|
110
|
+
or `CLAUDE.md` already has), so it is safe to run on a project with its own agents, skills and rules. After it runs:
|
|
111
|
+
|
|
112
|
+
- **Skipped files are yours.** Anything the log marks `skipped ... differs` keeps your version. If it is an older or
|
|
113
|
+
customised copy of a shipped one (the `sdd-feature` skill, `code-grader`, `jev-memory`), diff it against the shipped
|
|
114
|
+
file and merge what you want by hand. `--force` replaces it instead.
|
|
115
|
+
- **New files can land next to yours.** A skill folder you already have keeps its `SKILL.md`, but the shipped files
|
|
116
|
+
that are missing (templates, scripts) are added beside it. If `.claude/skills` is a symlink to `.cursor/skills`, the
|
|
117
|
+
log says so, and the skills are written there.
|
|
118
|
+
- **Cursor reads `.claude/agents/` too.** The agents installed here work in Cursor without copies in `.cursor/agents/`
|
|
119
|
+
(`.cursor/agents/` wins on a name clash). Cursor ignores `tools`, `disallowedTools` and `effort`, so the read-only
|
|
120
|
+
agents are not read-only there. If your project has a test that requires every `.claude/agents/*.md` to have a
|
|
121
|
+
`.cursor/agents/` twin, relax it to require the twin only for the Cursor agents.
|
|
122
|
+
- **Skip what you already have** with `--without memory-bank` / `jevmem` / `sdd`, for example when your own memory-bank
|
|
123
|
+
skill has a different name.
|
|
124
|
+
|
|
107
125
|
## Design choices
|
|
108
126
|
|
|
109
127
|
- **The orchestrator is the only writer of memory.** Parallel coders writing `memory/` would conflict, and someone has
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "agent-guild"
|
|
3
|
-
version = "1.2.
|
|
3
|
+
version = "1.2.1"
|
|
4
4
|
description = "A multi-agent setup for Claude Code (orchestrator + architect, coder, grader, utility subagents) with memory-bank, jevmem and Spec-Driven Development wired in, installed into a project with one command."
|
|
5
5
|
readme = "README.md"
|
|
6
6
|
license = "MIT"
|
|
@@ -10,6 +10,9 @@ from .specialists import SPECIALISTS, detect_languages
|
|
|
10
10
|
_BUNDLED = Path(__file__).resolve().parent / "_assets" # present in installed wheels
|
|
11
11
|
DEFAULT_ASSETS = _BUNDLED if _BUNDLED.is_dir() else Path(__file__).resolve().parents[2] # else: a source checkout
|
|
12
12
|
|
|
13
|
+
KEPT_HINT = """Files marked "skipped ... differs" keep your version. If a skill or agent of yours is an older or customised
|
|
14
|
+
copy of a shipped one, diff it against the shipped file and merge the changes by hand (--force replaces it)."""
|
|
15
|
+
|
|
13
16
|
NEXT_STEPS = """Next steps:
|
|
14
17
|
- Review the diff (git status / git diff); edit or delete any copied file or CLAUDE.md section you don't want.
|
|
15
18
|
- Per machine, once: `uvx jevmem config init` and `uvx --from jevmem jevmem warmup`.
|
|
@@ -105,6 +108,8 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
105
108
|
print("\n".join(ctx.lines))
|
|
106
109
|
for w in ctx.warnings:
|
|
107
110
|
print(f"warning: {w}")
|
|
111
|
+
if any(line.lstrip().startswith("skipped") and "differs" in line for line in ctx.lines):
|
|
112
|
+
print(f"\n{KEPT_HINT}")
|
|
108
113
|
if not args.dry_run:
|
|
109
114
|
print(CODERS_NEXT_STEPS if args.coders_only else NEXT_STEPS)
|
|
110
115
|
for name in sorted(args.with_coders):
|
|
@@ -85,6 +85,9 @@ def install_skills(ctx: Ctx, opts: Options) -> None:
|
|
|
85
85
|
wanted = [c for c in COMPONENTS if opts.wants(c)]
|
|
86
86
|
if not wanted:
|
|
87
87
|
return
|
|
88
|
+
skills_dir = ctx.project / ".claude" / "skills"
|
|
89
|
+
if skills_dir.is_symlink():
|
|
90
|
+
ctx.log("note", skills_dir, f"is a symlink to {os.readlink(skills_dir)}: skills are written there")
|
|
88
91
|
with tempfile.TemporaryDirectory(prefix="agent-guild-") as tmp:
|
|
89
92
|
for component in wanted:
|
|
90
93
|
url, subpath, skill_name = SKILL_SOURCES[component]
|
|
@@ -129,7 +132,7 @@ def install_rules(ctx: Ctx, opts: Options) -> None:
|
|
|
129
132
|
added.append("@AGENTS.md import")
|
|
130
133
|
for heading, body in _rule_sections(opts):
|
|
131
134
|
if re.search(rf"^#+ .*{re.escape(heading)}", known, re.MULTILINE):
|
|
132
|
-
ctx.log("
|
|
135
|
+
ctx.log("skipped", claude_md, f"section '{heading}' is already in CLAUDE.md or AGENTS.md")
|
|
133
136
|
continue
|
|
134
137
|
text = text.rstrip("\n") + ("\n\n" if text.strip() else "") + body + "\n"
|
|
135
138
|
added.append(heading)
|
|
@@ -364,3 +364,44 @@ def test_given_coders_only_without_with_then_it_is_refused(tmp_path, sources):
|
|
|
364
364
|
# when / then
|
|
365
365
|
with pytest.raises(SystemExit):
|
|
366
366
|
run(project, sources, "--coders-only")
|
|
367
|
+
|
|
368
|
+
|
|
369
|
+
def test_given_edited_agent_when_run_again_then_the_merge_hint_is_printed(tmp_path, sources, capsys):
|
|
370
|
+
# given
|
|
371
|
+
project = tmp_path / "p"
|
|
372
|
+
project.mkdir()
|
|
373
|
+
run(project, sources)
|
|
374
|
+
(project / ".claude/agents/coder.md").write_text("mine")
|
|
375
|
+
capsys.readouterr()
|
|
376
|
+
# when
|
|
377
|
+
run(project, sources)
|
|
378
|
+
# then
|
|
379
|
+
assert "merge the changes by hand" in capsys.readouterr().out
|
|
380
|
+
|
|
381
|
+
|
|
382
|
+
def test_given_sections_already_in_agents_md_then_the_log_says_skipped_not_unchanged(tmp_path, sources, capsys):
|
|
383
|
+
# given
|
|
384
|
+
project = tmp_path / "p"
|
|
385
|
+
project.mkdir()
|
|
386
|
+
(project / "AGENTS.md").write_text("## Memory bank\n\n## Phase Gate Protocol\n")
|
|
387
|
+
# when
|
|
388
|
+
run(project, sources)
|
|
389
|
+
# then
|
|
390
|
+
out = capsys.readouterr().out
|
|
391
|
+
assert "skipped CLAUDE.md section 'Phase Gate Protocol' is already in CLAUDE.md or AGENTS.md" in out
|
|
392
|
+
|
|
393
|
+
|
|
394
|
+
def test_given_symlinked_skills_dir_then_the_log_notes_where_skills_are_written(tmp_path, sources, capsys):
|
|
395
|
+
# given
|
|
396
|
+
project = tmp_path / "p"
|
|
397
|
+
(project / ".cursor/skills").mkdir(parents=True)
|
|
398
|
+
(project / ".claude").mkdir()
|
|
399
|
+
try:
|
|
400
|
+
(project / ".claude/skills").symlink_to(project / ".cursor/skills", target_is_directory=True)
|
|
401
|
+
except (OSError, NotImplementedError):
|
|
402
|
+
pytest.skip("symlinks are not available here")
|
|
403
|
+
# when
|
|
404
|
+
run(project, sources)
|
|
405
|
+
# then
|
|
406
|
+
assert "is a symlink to" in capsys.readouterr().out
|
|
407
|
+
assert (project / ".cursor/skills/sdd-feature/SKILL.md").is_file()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|