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.
Files changed (28) hide show
  1. {agent_guild-1.2.0 → agent_guild-1.2.1}/CHANGELOG.md +7 -0
  2. {agent_guild-1.2.0 → agent_guild-1.2.1}/PKG-INFO +19 -1
  3. {agent_guild-1.2.0 → agent_guild-1.2.1}/README.md +18 -0
  4. {agent_guild-1.2.0 → agent_guild-1.2.1}/pyproject.toml +1 -1
  5. {agent_guild-1.2.0 → agent_guild-1.2.1}/src/agent_guild/cli.py +5 -0
  6. {agent_guild-1.2.0 → agent_guild-1.2.1}/src/agent_guild/installer.py +4 -1
  7. {agent_guild-1.2.0 → agent_guild-1.2.1}/tests/test_cli.py +41 -0
  8. {agent_guild-1.2.0 → agent_guild-1.2.1}/uv.lock +1 -1
  9. {agent_guild-1.2.0 → agent_guild-1.2.1}/.github/workflows/ci.yml +0 -0
  10. {agent_guild-1.2.0 → agent_guild-1.2.1}/.github/workflows/release.yml +0 -0
  11. {agent_guild-1.2.0 → agent_guild-1.2.1}/.gitignore +0 -0
  12. {agent_guild-1.2.0 → agent_guild-1.2.1}/LICENSE +0 -0
  13. {agent_guild-1.2.0 → agent_guild-1.2.1}/agents/architect.md +0 -0
  14. {agent_guild-1.2.0 → agent_guild-1.2.1}/agents/code-grader.md +0 -0
  15. {agent_guild-1.2.0 → agent_guild-1.2.1}/agents/coder.md +0 -0
  16. {agent_guild-1.2.0 → agent_guild-1.2.1}/agents/utility.md +0 -0
  17. {agent_guild-1.2.0 → agent_guild-1.2.1}/development-workflow.md +0 -0
  18. {agent_guild-1.2.0 → agent_guild-1.2.1}/docs/manual_installation.md +0 -0
  19. {agent_guild-1.2.0 → agent_guild-1.2.1}/scripts/release_notes.py +0 -0
  20. {agent_guild-1.2.0 → agent_guild-1.2.1}/src/agent_guild/__init__.py +0 -0
  21. {agent_guild-1.2.0 → agent_guild-1.2.1}/src/agent_guild/files.py +0 -0
  22. {agent_guild-1.2.0 → agent_guild-1.2.1}/src/agent_guild/specialists.py +0 -0
  23. {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/agents-rules.md +0 -0
  24. {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/coders/python.md +0 -0
  25. {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/coders/swift.md +0 -0
  26. {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/coders/typescript.md +0 -0
  27. {agent_guild-1.2.0 → agent_guild-1.2.1}/templates/memory-bank-rules.md +0 -0
  28. {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.0
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.0"
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("unchanged", claude_md, f"already has '{heading}' (CLAUDE.md or AGENTS.md)")
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()
@@ -4,7 +4,7 @@ requires-python = ">=3.11"
4
4
 
5
5
  [[package]]
6
6
  name = "agent-guild"
7
- version = "1.2.0"
7
+ version = "1.2.1"
8
8
  source = { editable = "." }
9
9
 
10
10
  [package.dev-dependencies]
File without changes
File without changes
File without changes