guild-cli 0.6.0__tar.gz → 0.6.2__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 (102) hide show
  1. {guild_cli-0.6.0 → guild_cli-0.6.2}/CHANGELOG.md +33 -0
  2. {guild_cli-0.6.0 → guild_cli-0.6.2}/PKG-INFO +1 -1
  3. {guild_cli-0.6.0 → guild_cli-0.6.2}/docs/skill-sources.md +11 -11
  4. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/scaffold/instantiate.py +37 -1
  5. {guild_cli-0.6.0 → guild_cli-0.6.2}/pyproject.toml +1 -1
  6. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_scaffold_instantiate.py +73 -0
  7. {guild_cli-0.6.0 → guild_cli-0.6.2}/uv.lock +1 -1
  8. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/agent-config/SKILL.md +0 -0
  9. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  10. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/agent-config/scripts/show.sh +0 -0
  11. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  12. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  13. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/cicd/SKILL.md +0 -0
  14. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  15. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  16. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  17. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  18. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  19. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/communicate/SKILL.md +0 -0
  20. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  21. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  22. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  23. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  24. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  25. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  26. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  27. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  28. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/guild/SKILL.md +0 -0
  29. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/guild/scripts/configure-repo.sh +0 -0
  30. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/guild/scripts/create.sh +0 -0
  31. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/guild/scripts/overview.sh +0 -0
  32. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/onboard/SKILL.md +0 -0
  33. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/onboard/scripts/onboard.sh +0 -0
  34. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  35. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  36. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/run-tests/SKILL.md +0 -0
  37. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/run-tests/scripts/test.sh +0 -0
  38. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/sonarclaude/SKILL.md +0 -0
  39. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  40. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  41. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  42. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/teach/SKILL.md +0 -0
  43. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/teach/scripts/teach.sh +0 -0
  44. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/think/SKILL.md +0 -0
  45. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/think/scripts/think.sh +0 -0
  46. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/version-bump/SKILL.md +0 -0
  47. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills/version-bump/scripts/bump.py +0 -0
  48. {guild_cli-0.6.0 → guild_cli-0.6.2}/.claude/skills.local.yaml.example +0 -0
  49. {guild_cli-0.6.0 → guild_cli-0.6.2}/.devague/frames/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
  50. {guild_cli-0.6.0 → guild_cli-0.6.2}/.devague/plans/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
  51. {guild_cli-0.6.0 → guild_cli-0.6.2}/.flake8 +0 -0
  52. {guild_cli-0.6.0 → guild_cli-0.6.2}/.github/workflows/publish.yml +0 -0
  53. {guild_cli-0.6.0 → guild_cli-0.6.2}/.github/workflows/tests.yml +0 -0
  54. {guild_cli-0.6.0 → guild_cli-0.6.2}/.gitignore +0 -0
  55. {guild_cli-0.6.0 → guild_cli-0.6.2}/.markdownlint-cli2.yaml +0 -0
  56. {guild_cli-0.6.0 → guild_cli-0.6.2}/CLAUDE.md +0 -0
  57. {guild_cli-0.6.0 → guild_cli-0.6.2}/LICENSE +0 -0
  58. {guild_cli-0.6.0 → guild_cli-0.6.2}/README.md +0 -0
  59. {guild_cli-0.6.0 → guild_cli-0.6.2}/culture.yaml +0 -0
  60. {guild_cli-0.6.0 → guild_cli-0.6.2}/docs/cutover.md +0 -0
  61. {guild_cli-0.6.0 → guild_cli-0.6.2}/docs/plans/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +0 -0
  62. {guild_cli-0.6.0 → guild_cli-0.6.2}/docs/specs/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +0 -0
  63. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/__init__.py +0 -0
  64. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/__main__.py +0 -0
  65. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/__init__.py +0 -0
  66. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/__init__.py +0 -0
  67. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/_broadcast.py +0 -0
  68. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/_provision_template.py +0 -0
  69. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/create.py +0 -0
  70. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/explain.py +0 -0
  71. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/learn.py +0 -0
  72. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/onboard.py +0 -0
  73. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/overview.py +0 -0
  74. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/show.py +0 -0
  75. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/teach.py +0 -0
  76. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_commands/whoami.py +0 -0
  77. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_errors.py +0 -0
  78. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_output.py +0 -0
  79. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/cli/_repo.py +0 -0
  80. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/scaffold/__init__.py +0 -0
  81. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/skills/__init__.py +0 -0
  82. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/skills/identity.py +0 -0
  83. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/skills/ledger.py +0 -0
  84. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/skills/render.py +0 -0
  85. {guild_cli-0.6.0 → guild_cli-0.6.2}/guild/skills/sources.py +0 -0
  86. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/__init__.py +0 -0
  87. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_broadcast_post.py +0 -0
  88. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_cli.py +0 -0
  89. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_cli_create.py +0 -0
  90. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_cli_explain.py +0 -0
  91. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_cli_learn.py +0 -0
  92. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_cli_onboard.py +0 -0
  93. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_cli_overview.py +0 -0
  94. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_cli_show.py +0 -0
  95. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_cli_teach.py +0 -0
  96. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_cli_whoami.py +0 -0
  97. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_skills_convention.py +0 -0
  98. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_skills_identity.py +0 -0
  99. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_skills_ledger.py +0 -0
  100. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_skills_render.py +0 -0
  101. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_skills_sources.py +0 -0
  102. {guild_cli-0.6.0 → guild_cli-0.6.2}/tests/test_version_fallback.py +0 -0
@@ -5,6 +5,39 @@ All notable changes to this project will be documented in this file.
5
5
  Format follows [Keep a Changelog](https://keepachangelog.com/). This project
6
6
  adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.6.2] - 2026-05-26
9
+
10
+ ### Added
11
+
12
+ - **Registered `dominion-breaker`** (`agentculture/dominion-breaker`) in
13
+ `docs/skill-sources.md` as a downstream consumer of the canonical kit —
14
+ provisioned via `guild create --apply` from `culture-agent-template`. It is an
15
+ agentic CLI for cited monolith decomposition (originating brief:
16
+ [#31](https://github.com/agentculture/guildmaster/issues/31)).
17
+
18
+ ## [0.6.1] - 2026-05-26
19
+
20
+ ### Added
21
+
22
+ - **Registered `agenda`** (`agentculture/agenda`) in `docs/skill-sources.md` as a
23
+ downstream consumer of the canonical kit — the first sibling provisioned via
24
+ `guild create --apply`.
25
+
26
+ ### Fixed
27
+
28
+ - **`guild create` seed generator (`instantiate.py`)**: the CLAUDE.md/AGENTS.md
29
+ seed emitted the agent name as a standalone emphasized line (`**<name>**`),
30
+ tripping markdownlint **MD036** and failing the new repo's first CI run; the
31
+ name is now inlined in a sentence.
32
+ - **`guild create` README rewrite**: `_set_readme_intro` only replaced the first
33
+ line of the template's intro, leaving a dangling fragment when the intro spans
34
+ multiple lines (as the real `culture-agent-template` intro does). It now
35
+ replaces the whole first paragraph, stopping at a blank line **or** the start
36
+ of a new markdown block (heading / list / blockquote / badge / code fence) so
37
+ a block that immediately follows the intro is never silently dropped, while
38
+ wrapped inline-code prose (a single leading backtick) is still consumed. Both
39
+ bugs surfaced provisioning `agenda`; regression tests added.
40
+
8
41
  ## [0.6.0] - 2026-05-26
9
42
 
10
43
  ### Added
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: guild-cli
3
- Version: 0.6.0
3
+ Version: 0.6.2
4
4
  Summary: guildmaster — an agent and CLI that manages skills for the AgentCulture mesh.
5
5
  Project-URL: Homepage, https://github.com/agentculture/guildmaster
6
6
  Project-URL: Issues, https://github.com/agentculture/guildmaster/issues
@@ -32,14 +32,14 @@ current by `guild overview --scope mesh`.
32
32
 
33
33
  | Skill | Upstream | Downstream copies (known) | Notes |
34
34
  |-------|----------|---------------------------|-------|
35
- | `agent-config` | `guildmaster` (`.claude/skills/agent-config/`) | | Inventory variant backing `guild show` ([#12](https://github.com/agentculture/guildmaster/issues/12)); `show.sh` + `data/backend-fingerprints.yaml` vendored verbatim from steward, SKILL.md reframed from alignment-judgment to inventory + `type: command` added. **Forked from steward:** steward retains its own alignment-focused `agent-config` variant; the inventory variant is guildmaster's to supply. |
36
- | `cicd` | `guildmaster` (`.claude/skills/cicd/`) — layered on `agex pr` (in `agentculture/agex-cli`) | `afi-cli`, `agex-cli` (adapted-thin delegate — owns `agex pr`; see [agex-cli#53](https://github.com/agentculture/agex-cli/pull/53)), `agtag`, `antoine`, `appsec`, `auntiepypi`, `cfafi` (still named `pr-review`), `code-lens-cli`, `culture` (still named `pr-review`), `devague`, `katvan`, `lecodeur`, `lepenseur`, `seer-cli`, `telek` | Thin delegate to `agex pr` for lint / open / read / reply / delta, plus guildmaster's `status` (SonarCloud quality gate + hotspots + unresolved-thread tally) and `await` (composes `agex pr read --wait` with `status`, non-zero exit on Sonar ERROR / unresolved threads) extensions. **Inverted case:** agex-cli, as the `agex pr` upstream, vendors the skill adapted-thin — a `workflow.sh`-only pure delegate ([agex-cli#53](https://github.com/agentculture/agex-cli/pull/53)). Renamed from `pr-review` in steward 0.7.0; downstream copies may keep the old name on their own cadence. |
37
- | `communicate` | `guildmaster` (`.claude/skills/communicate/`) | `afi-cli`, `agex-cli` (identifier-only — vendored steward 0.11.0; scripts current as of 0.18.0), `agtag`, `antoine`, `appsec`, `auntiepypi`, `code-lens-cli`, `culture` (still named `coordinate`), `devague`, `katvan`, `lecodeur`, `lepenseur`, `seer-cli`, `telek` | Cross-repo + mesh communication: file issues / hand off briefs to sibling-repo agents (auto-signed), comment on existing issues, fetch issues to inline state into briefs, and send live messages to Culture mesh channels (unsigned — nick is the speaker). Renamed from `coordinate` in steward 0.8.0; absorbed `gh-issues` (as `fetch-issues.sh`) in 0.9.1. Issue I/O backed by `agtag` (>=0.1) since steward 0.11.0 — signature resolves from local `culture.yaml` (override via `--as`). |
38
- | `doc-test-alignment` | `guildmaster` (`.claude/skills/doc-test-alignment/`) | `devague`, `lecodeur`, `lepenseur` | Stub; real implementation TBD. `scripts/check.sh` exits not-yet-implemented today. |
39
- | `pypi-maintainer` | `guildmaster` (`.claude/skills/pypi-maintainer/`) | `agtag` | Switches a PyPI package install between pypi / test-pypi / local. Generalised from the original culture-specific `change-package`. |
40
- | `run-tests` | `guildmaster` (`.claude/skills/run-tests/`) | `agtag`, `antoine`, `appsec`, `code-lens-cli`, `culture`, `culture-sonar-cli`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `shushu`, `telek` | Coverage source resolves from `[tool.coverage.run]` in `pyproject.toml`, so the script is portable across siblings without modification. |
41
- | `sonarclaude` | `guildmaster` (`.claude/skills/sonarclaude/`) | `antoine`, `appsec`, `code-lens-cli`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `telek` | SonarCloud API client. Project key resolves from `$SONAR_PROJECT` or `--project KEY`. |
42
- | `version-bump` | `guildmaster` (`.claude/skills/version-bump/`) | `afi-cli`, `agtag`, `antoine`, `appsec`, `auntiepypi`, `cfafi`, `code-lens-cli`, `culture`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `shushu`, `telek` | Pure Python, prepends a Keep-a-Changelog entry; no per-repo customization needed. |
35
+ | `agent-config` | `guildmaster` (`.claude/skills/agent-config/`) | `agenda`, `dominion-breaker` | Inventory variant backing `guild show` ([#12](https://github.com/agentculture/guildmaster/issues/12)); `show.sh` + `data/backend-fingerprints.yaml` vendored verbatim from steward, SKILL.md reframed from alignment-judgment to inventory + `type: command` added. **Forked from steward:** steward retains its own alignment-focused `agent-config` variant; the inventory variant is guildmaster's to supply. |
36
+ | `cicd` | `guildmaster` (`.claude/skills/cicd/`) — layered on `agex pr` (in `agentculture/agex-cli`) | `afi-cli`, `agex-cli` (adapted-thin delegate — owns `agex pr`; see [agex-cli#53](https://github.com/agentculture/agex-cli/pull/53)), `agtag`, `antoine`, `appsec`, `auntiepypi`, `cfafi` (still named `pr-review`), `code-lens-cli`, `culture` (still named `pr-review`), `devague`, `katvan`, `lecodeur`, `lepenseur`, `seer-cli`, `telek`, `agenda`, `dominion-breaker` | Thin delegate to `agex pr` for lint / open / read / reply / delta, plus guildmaster's `status` (SonarCloud quality gate + hotspots + unresolved-thread tally) and `await` (composes `agex pr read --wait` with `status`, non-zero exit on Sonar ERROR / unresolved threads) extensions. **Inverted case:** agex-cli, as the `agex pr` upstream, vendors the skill adapted-thin — a `workflow.sh`-only pure delegate ([agex-cli#53](https://github.com/agentculture/agex-cli/pull/53)). Renamed from `pr-review` in steward 0.7.0; downstream copies may keep the old name on their own cadence. |
37
+ | `communicate` | `guildmaster` (`.claude/skills/communicate/`) | `afi-cli`, `agex-cli` (identifier-only — vendored steward 0.11.0; scripts current as of 0.18.0), `agtag`, `antoine`, `appsec`, `auntiepypi`, `code-lens-cli`, `culture` (still named `coordinate`), `devague`, `katvan`, `lecodeur`, `lepenseur`, `seer-cli`, `telek`, `agenda`, `dominion-breaker` | Cross-repo + mesh communication: file issues / hand off briefs to sibling-repo agents (auto-signed), comment on existing issues, fetch issues to inline state into briefs, and send live messages to Culture mesh channels (unsigned — nick is the speaker). Renamed from `coordinate` in steward 0.8.0; absorbed `gh-issues` (as `fetch-issues.sh`) in 0.9.1. Issue I/O backed by `agtag` (>=0.1) since steward 0.11.0 — signature resolves from local `culture.yaml` (override via `--as`). |
38
+ | `doc-test-alignment` | `guildmaster` (`.claude/skills/doc-test-alignment/`) | `devague`, `lecodeur`, `lepenseur`, `agenda`, `dominion-breaker` | Stub; real implementation TBD. `scripts/check.sh` exits not-yet-implemented today. |
39
+ | `pypi-maintainer` | `guildmaster` (`.claude/skills/pypi-maintainer/`) | `agtag`, `agenda`, `dominion-breaker` | Switches a PyPI package install between pypi / test-pypi / local. Generalised from the original culture-specific `change-package`. |
40
+ | `run-tests` | `guildmaster` (`.claude/skills/run-tests/`) | `agtag`, `antoine`, `appsec`, `code-lens-cli`, `culture`, `culture-sonar-cli`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `shushu`, `telek`, `agenda`, `dominion-breaker` | Coverage source resolves from `[tool.coverage.run]` in `pyproject.toml`, so the script is portable across siblings without modification. |
41
+ | `sonarclaude` | `guildmaster` (`.claude/skills/sonarclaude/`) | `antoine`, `appsec`, `code-lens-cli`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `telek`, `agenda`, `dominion-breaker` | SonarCloud API client. Project key resolves from `$SONAR_PROJECT` or `--project KEY`. |
42
+ | `version-bump` | `guildmaster` (`.claude/skills/version-bump/`) | `afi-cli`, `agtag`, `antoine`, `appsec`, `auntiepypi`, `cfafi`, `code-lens-cli`, `culture`, `devague`, `lecodeur`, `lepenseur`, `seer-cli`, `shushu`, `telek`, `agenda`, `dominion-breaker` | Pure Python, prepends a Keep-a-Changelog entry; no per-repo customization needed. |
43
43
 
44
44
  > **How the downstream column is maintained.** The "Downstream copies (known)"
45
45
  > entries are kept in sync with guildmaster's own drift detector:
@@ -80,9 +80,9 @@ harmless on `claude-code`. This is the only divergence from upstream.
80
80
 
81
81
  | Skill | Origin | Downstream copies (known) | Notes |
82
82
  |-------|--------|---------------------------|-------|
83
- | `think` | `devague` (`agentculture/devague`, `../devague/.claude/skills/think/`) | — (broadcast pending) | Operator for the **idea→spec** leg (announcement frame → capture/classify claims → interrogate with honesty conditions → park open vagueness → `export` once the frame converges). Renamed from `devague` in devague 0.4.0. **Divergence:** `type: command` added. Runtime dep: `uv tool install devague`. |
84
- | `spec-to-plan` | `devague` (`agentculture/devague`, `../devague/.claude/skills/spec-to-plan/`) | — (broadcast pending) | Operator for the **spec→plan** leg (`devague plan ...`): seed from a converged frame, cover every coverage target with acceptance-gated, acyclically-ordered tasks, park unknowns as risks, `export` once the plan converges. New in devague 0.4.0. **Divergence:** `type: command` added. Runtime dep: `uv tool install devague`. |
85
- | `assign-to-workforce` | `devague` (`agentculture/devague`, `../devague/.claude/skills/assign-to-workforce/`) | — (broadcast pending) | Operator for the **implementation** leg: reads `devague plan waves` (read-only) and fans out independent tasks to one agent per task per wave in isolated git worktrees, with main-agent TDD-gated merges. Three human gates: spec / split plan / final PR. The CLI stays non-orchestrating ([devague#20](https://github.com/agentculture/devague/issues/20)). New in devague 0.10.0. **Divergence:** `type: command` added. Runtime deps: `uv tool install devague`, `git worktree`, the vendored `cicd` skill (for gate-3 `agex pr open`). |
83
+ | `think` | `devague` (`agentculture/devague`, `../devague/.claude/skills/think/`) | — (broadcast pending), `agenda`, `dominion-breaker` | Operator for the **idea→spec** leg (announcement frame → capture/classify claims → interrogate with honesty conditions → park open vagueness → `export` once the frame converges). Renamed from `devague` in devague 0.4.0. **Divergence:** `type: command` added. Runtime dep: `uv tool install devague`. |
84
+ | `spec-to-plan` | `devague` (`agentculture/devague`, `../devague/.claude/skills/spec-to-plan/`) | — (broadcast pending), `agenda`, `dominion-breaker` | Operator for the **spec→plan** leg (`devague plan ...`): seed from a converged frame, cover every coverage target with acceptance-gated, acyclically-ordered tasks, park unknowns as risks, `export` once the plan converges. New in devague 0.4.0. **Divergence:** `type: command` added. Runtime dep: `uv tool install devague`. |
85
+ | `assign-to-workforce` | `devague` (`agentculture/devague`, `../devague/.claude/skills/assign-to-workforce/`) | — (broadcast pending), `agenda`, `dominion-breaker` | Operator for the **implementation** leg: reads `devague plan waves` (read-only) and fans out independent tasks to one agent per task per wave in isolated git worktrees, with main-agent TDD-gated merges. Three human gates: spec / split plan / final PR. The CLI stays non-orchestrating ([devague#20](https://github.com/agentculture/devague/issues/20)). New in devague 0.10.0. **Divergence:** `type: command` added. Runtime deps: `uv tool install devague`, `git worktree`, the vendored `cicd` skill (for gate-3 `agex pr open`). |
86
86
 
87
87
  Downstream is empty by design: these are still being introduced to the mesh.
88
88
  `guild teach --new --skill <name> --to <repos>` frames them as *new* skills to
@@ -162,7 +162,7 @@ def _seed_prompt(bare: str, desc: str, backend: str) -> str:
162
162
 
163
163
  ## Agent
164
164
 
165
- **{bare}**
165
+ This repository hosts the **{bare}** agent.
166
166
 
167
167
  ## Description
168
168
 
@@ -272,6 +272,34 @@ def _is_desc_stub(line: str) -> bool:
272
272
  return not re.match(r"^[#>`\-\*!\[]", stripped)
273
273
 
274
274
 
275
+ def _is_block_start(line: str) -> bool:
276
+ """Return True if *line* begins a new markdown block.
277
+
278
+ Used to bound intro-paragraph consumption in ``_replace_heading_block`` so a
279
+ block that immediately follows the intro *without* a blank line (e.g. ``##
280
+ Section``, a list, or a badge row) is not swallowed. Recognised starts:
281
+ ATX headings (``#``), blockquotes (``>``), unordered list items
282
+ (``- ``/``* ``/``+ ``), links/badges (``[`` / ``![``), and fenced code
283
+ (```` ``` ```` / ``~~~``).
284
+
285
+ A *single* leading backtick is **not** a block start — it is inline code in
286
+ wrapped prose (e.g. ``` `culture.yaml`, and you have… ```), which is part of
287
+ the intro paragraph and must be consumed with it.
288
+ """
289
+ stripped = line.lstrip()
290
+ if not stripped:
291
+ return False
292
+ if stripped.startswith(("```", "~~~")):
293
+ return True
294
+ if stripped[0] in "#>":
295
+ return True
296
+ if stripped.startswith(("![", "[")):
297
+ return True
298
+ if stripped[:2] in ("- ", "* ", "+ "):
299
+ return True
300
+ return False
301
+
302
+
275
303
  def _replace_heading_block(lines: list[str], i: int, bare: str, desc: str) -> tuple[list[str], int]:
276
304
  """Replace the heading at *lines[i]* and its following description stub.
277
305
 
@@ -290,6 +318,14 @@ def _replace_heading_block(lines: list[str], i: int, bare: str, desc: str) -> tu
290
318
  if i < len(lines) and _is_desc_stub(lines[i]):
291
319
  out.append(desc + "\n")
292
320
  i += 1
321
+ # Consume the rest of the intro paragraph so a *multi-line* template
322
+ # intro is replaced wholesale rather than leaving a dangling fragment.
323
+ # Stop at a blank line (paragraph end) OR the start of a new markdown
324
+ # block (heading/list/blockquote/badge/fence) — even when no blank line
325
+ # separates it — so a following block is never silently dropped. A
326
+ # single leading backtick stays consumable (wrapped inline-code prose).
327
+ while i < len(lines) and lines[i].strip() != "" and not _is_block_start(lines[i]):
328
+ i += 1
293
329
  elif i < len(lines):
294
330
  out.append(desc + "\n\n")
295
331
  else:
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "guild-cli"
3
- version = "0.6.0"
3
+ version = "0.6.2"
4
4
  description = "guildmaster — an agent and CLI that manages skills for the AgentCulture mesh."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -312,3 +312,76 @@ def test_transform_invalid_backend_raises(tmp_path):
312
312
  def test_transform_missing_dest_raises(tmp_path):
313
313
  with pytest.raises(FileNotFoundError):
314
314
  transform_clone(tmp_path / "nonexistent", "appsec", "desc", "claude")
315
+
316
+
317
+ def test_transform_readme_replaces_multiline_intro_paragraph(tmp_path):
318
+ """A *multi-line* template intro must be replaced wholesale — the real
319
+ culture-agent-template intro spans several lines, and replacing only the
320
+ first leaves a dangling fragment (regression: agenda genesis README)."""
321
+ dest = _build_fixture(tmp_path)
322
+ (dest / "README.md").write_text(
323
+ "# culture-agent-template\n\n"
324
+ "A clonable AgentCulture agent template with a consistent structure,\n"
325
+ "lifecycle, and skills. Clone it, rename the package, and edit\n"
326
+ "`culture.yaml` to make it your own.\n\n"
327
+ "## More\n\nMore docs.\n"
328
+ )
329
+ transform_clone(dest, "appsec", "AppSec security scanner.", "claude")
330
+ readme = (dest / "README.md").read_text()
331
+ # New description present; the entire old intro paragraph is gone.
332
+ assert "AppSec security scanner." in readme
333
+ assert "lifecycle, and skills" not in readme
334
+ assert "Clone it, rename the package" not in readme
335
+ assert "make it your own" not in readme
336
+ # Body after the intro paragraph is preserved.
337
+ assert "## More" in readme
338
+ assert "More docs." in readme
339
+
340
+
341
+ def test_transform_readme_stops_intro_at_block_without_blank_line(tmp_path):
342
+ """Intro-paragraph consumption must stop at the start of a new markdown
343
+ block even when no blank line separates it from the intro stub — otherwise
344
+ a following heading/list/badge is silently dropped (Qodo, PR #29)."""
345
+ dest = _build_fixture(tmp_path)
346
+ (dest / "README.md").write_text(
347
+ "# culture-agent-template\n\n"
348
+ "A clonable template.\n" # stub immediately followed by a heading
349
+ "## Features\n\n- one\n- two\n"
350
+ )
351
+ transform_clone(dest, "appsec", "AppSec scanner.", "claude")
352
+ readme = (dest / "README.md").read_text()
353
+ assert "AppSec scanner." in readme
354
+ assert "A clonable template." not in readme # stub replaced
355
+ # The block that immediately follows the stub must survive.
356
+ assert "## Features" in readme
357
+ assert "- one" in readme
358
+ assert "- two" in readme
359
+
360
+
361
+ def test_transform_readme_consumes_wrapped_inline_code_prose(tmp_path):
362
+ """A continuation line beginning with a *single* backtick (inline code) is
363
+ wrapped prose, not a block start, so it is consumed with the intro."""
364
+ dest = _build_fixture(tmp_path)
365
+ (dest / "README.md").write_text(
366
+ "# culture-agent-template\n\n"
367
+ "A clonable template you configure by editing\n"
368
+ "`culture.yaml` to taste.\n\n"
369
+ "## More\n"
370
+ )
371
+ transform_clone(dest, "appsec", "AppSec scanner.", "claude")
372
+ readme = (dest / "README.md").read_text()
373
+ assert "AppSec scanner." in readme
374
+ assert "culture.yaml` to taste" not in readme # backtick prose consumed
375
+ assert "## More" in readme
376
+
377
+
378
+ def test_transform_seed_avoids_md036_standalone_emphasis(tmp_path):
379
+ """The CLAUDE.md seed must not place the agent name on a standalone
380
+ emphasized line (markdownlint MD036 no-emphasis-as-heading — this broke
381
+ the agenda genesis CI lint job)."""
382
+ dest = _build_fixture(tmp_path)
383
+ transform_clone(dest, "appsec", "AppSec scanner.", "claude")
384
+ seed_lines = [ln.strip() for ln in (dest / "CLAUDE.md").read_text().splitlines()]
385
+ assert "**appsec**" not in seed_lines
386
+ # The name still appears, inlined in prose.
387
+ assert any("appsec" in ln for ln in seed_lines)
@@ -179,7 +179,7 @@ wheels = [
179
179
 
180
180
  [[package]]
181
181
  name = "guild-cli"
182
- version = "0.6.0"
182
+ version = "0.6.2"
183
183
  source = { editable = "." }
184
184
  dependencies = [
185
185
  { name = "pyyaml" },
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