guild-cli 0.5.1__tar.gz → 0.6.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 (102) hide show
  1. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/guild/SKILL.md +72 -13
  2. guild_cli-0.6.1/.claude/skills/guild/scripts/configure-repo.sh +102 -0
  3. guild_cli-0.6.1/.claude/skills/guild/scripts/create.sh +42 -0
  4. {guild_cli-0.5.1 → guild_cli-0.6.1}/.gitignore +3 -0
  5. {guild_cli-0.5.1 → guild_cli-0.6.1}/CHANGELOG.md +52 -0
  6. {guild_cli-0.5.1 → guild_cli-0.6.1}/CLAUDE.md +4 -0
  7. {guild_cli-0.5.1 → guild_cli-0.6.1}/PKG-INFO +1 -1
  8. {guild_cli-0.5.1 → guild_cli-0.6.1}/docs/skill-sources.md +11 -11
  9. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/__init__.py +2 -0
  10. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/__init__.py +5 -0
  11. guild_cli-0.6.1/guild/cli/_commands/_provision_template.py +352 -0
  12. guild_cli-0.6.1/guild/cli/_commands/create.py +233 -0
  13. guild_cli-0.6.1/guild/scaffold/__init__.py +14 -0
  14. guild_cli-0.6.1/guild/scaffold/instantiate.py +444 -0
  15. {guild_cli-0.5.1 → guild_cli-0.6.1}/pyproject.toml +1 -1
  16. guild_cli-0.6.1/tests/test_cli_create.py +642 -0
  17. guild_cli-0.6.1/tests/test_scaffold_instantiate.py +387 -0
  18. {guild_cli-0.5.1 → guild_cli-0.6.1}/uv.lock +1 -1
  19. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/agent-config/SKILL.md +0 -0
  20. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
  21. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/agent-config/scripts/show.sh +0 -0
  22. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
  23. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
  24. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/SKILL.md +0 -0
  25. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
  26. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
  27. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
  28. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
  29. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/scripts/workflow.sh +0 -0
  30. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/SKILL.md +0 -0
  31. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
  32. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
  33. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
  34. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
  35. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
  36. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
  37. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
  38. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
  39. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/guild/scripts/overview.sh +0 -0
  40. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/onboard/SKILL.md +0 -0
  41. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/onboard/scripts/onboard.sh +0 -0
  42. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
  43. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
  44. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/run-tests/SKILL.md +0 -0
  45. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
  46. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/sonarclaude/SKILL.md +0 -0
  47. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
  48. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/spec-to-plan/SKILL.md +0 -0
  49. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
  50. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/teach/SKILL.md +0 -0
  51. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/teach/scripts/teach.sh +0 -0
  52. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/think/SKILL.md +0 -0
  53. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/think/scripts/think.sh +0 -0
  54. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/version-bump/SKILL.md +0 -0
  55. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/version-bump/scripts/bump.py +0 -0
  56. {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills.local.yaml.example +0 -0
  57. {guild_cli-0.5.1 → guild_cli-0.6.1}/.devague/frames/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
  58. {guild_cli-0.5.1 → guild_cli-0.6.1}/.devague/plans/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
  59. {guild_cli-0.5.1 → guild_cli-0.6.1}/.flake8 +0 -0
  60. {guild_cli-0.5.1 → guild_cli-0.6.1}/.github/workflows/publish.yml +0 -0
  61. {guild_cli-0.5.1 → guild_cli-0.6.1}/.github/workflows/tests.yml +0 -0
  62. {guild_cli-0.5.1 → guild_cli-0.6.1}/.markdownlint-cli2.yaml +0 -0
  63. {guild_cli-0.5.1 → guild_cli-0.6.1}/LICENSE +0 -0
  64. {guild_cli-0.5.1 → guild_cli-0.6.1}/README.md +0 -0
  65. {guild_cli-0.5.1 → guild_cli-0.6.1}/culture.yaml +0 -0
  66. {guild_cli-0.5.1 → guild_cli-0.6.1}/docs/cutover.md +0 -0
  67. {guild_cli-0.5.1 → guild_cli-0.6.1}/docs/plans/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +0 -0
  68. {guild_cli-0.5.1 → guild_cli-0.6.1}/docs/specs/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +0 -0
  69. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/__init__.py +0 -0
  70. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/__main__.py +0 -0
  71. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/_broadcast.py +0 -0
  72. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/explain.py +0 -0
  73. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/learn.py +0 -0
  74. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/onboard.py +0 -0
  75. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/overview.py +0 -0
  76. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/show.py +0 -0
  77. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/teach.py +0 -0
  78. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/whoami.py +0 -0
  79. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_errors.py +0 -0
  80. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_output.py +0 -0
  81. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_repo.py +0 -0
  82. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/skills/__init__.py +0 -0
  83. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/skills/identity.py +0 -0
  84. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/skills/ledger.py +0 -0
  85. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/skills/render.py +0 -0
  86. {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/skills/sources.py +0 -0
  87. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/__init__.py +0 -0
  88. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_broadcast_post.py +0 -0
  89. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli.py +0 -0
  90. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_explain.py +0 -0
  91. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_learn.py +0 -0
  92. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_onboard.py +0 -0
  93. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_overview.py +0 -0
  94. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_show.py +0 -0
  95. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_teach.py +0 -0
  96. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_whoami.py +0 -0
  97. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_skills_convention.py +0 -0
  98. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_skills_identity.py +0 -0
  99. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_skills_ledger.py +0 -0
  100. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_skills_render.py +0 -0
  101. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_skills_sources.py +0 -0
  102. {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_version_fallback.py +0 -0
@@ -1,18 +1,19 @@
1
1
  ---
2
2
  name: guild
3
3
  description: >
4
- Run guildmaster's skills-supplier overview and narrate it. Run `guild
5
- overview` (via scripts/overview.sh) for the deterministic evidence pack the
6
- canonical skill set + versions/origins, the docs/skill-sources.md ledger, and
7
- skills-scoped drift signals then narrate three separated layers: observed
8
- facts, inferred relationships, and suggestions (each naming the command that
9
- enacts it). Use when an operator asks "what skills do we supply", "who
10
- consumes what", "is anything drifting", or "what should I teach next".
11
- Skills-scoped and reflect-only it surfaces and interprets supplier-side
12
- skill/version signals; it does NOT narrate the agent relationship graph or
13
- judge alignment (that stays with steward's org-overview / steward doctor).
14
- The skills-scoped excerpt of steward's `org-overview` narration contract
15
- (cite-don't-import, issue #12).
4
+ Run guildmaster's skills-supplier CLI surfaces and narrate them. Covers
5
+ `guild overview` (evidence pack: canonical skill set + ledger + drift),
6
+ `guild create` (provision a new sibling repo by instantiating the template),
7
+ and `guild show` (one agent's config). Run the matching script for
8
+ deterministic evidence, then narrate three separated layers: observed facts,
9
+ inferred relationships, and suggestions (each naming the command that enacts
10
+ it). Use when an operator asks "what skills do we supply", "provision a new
11
+ agent", "who consumes what", "is anything drifting", or "what should I teach
12
+ next". Skills-scoped and reflect-only for overview/show; create is a write
13
+ verb (dry-run by default, --apply executes). Does NOT narrate the agent
14
+ relationship graph or judge alignment (steward's lane). The skills-scoped
15
+ excerpt of steward's `org-overview` narration contract (cite-don't-import,
16
+ issue #12).
16
17
  type: command
17
18
  ---
18
19
 
@@ -72,7 +73,7 @@ without waiting for the cutover. Still skills-scoped — no relationship graph.
72
73
  - "What should I `teach` next?" — overview's gaps are the input to `teach`.
73
74
  - Before `guild teach` / `guild onboard`, to see uncovered skills and kit gaps.
74
75
 
75
- ## How to run
76
+ ## How to run `guild overview`
76
77
 
77
78
  One script. Pick the scope (or just run `guild overview`, which this wraps):
78
79
 
@@ -91,6 +92,64 @@ One script. Pick the scope (or just run `guild overview`, which this wraps):
91
92
  .claude/skills/guild/scripts/overview.sh --scope mesh --json
92
93
  ```
93
94
 
95
+ ## How to run `guild create`
96
+
97
+ Provision a new sibling by instantiating the GitHub template and customising it:
98
+
99
+ ```bash
100
+ # Dry-run — renders the rename plan + ledger diff, performs nothing external
101
+ .claude/skills/guild/scripts/create.sh \
102
+ --agent agentculture/new-agent \
103
+ --desc "A short description of the new agent."
104
+
105
+ # --apply — actually creates the repo, clones, transforms, pushes, registers
106
+ .claude/skills/guild/scripts/create.sh \
107
+ --agent agentculture/new-agent \
108
+ --desc "A short description." \
109
+ --apply
110
+
111
+ # Custom template or backend
112
+ .claude/skills/guild/scripts/create.sh \
113
+ --agent agentculture/new-agent \
114
+ --desc "An ACP agent." \
115
+ --backend acp \
116
+ --template myorg/my-template \
117
+ --apply
118
+
119
+ # JSON output (works in both dry-run and apply)
120
+ .claude/skills/guild/scripts/create.sh \
121
+ --agent agentculture/new-agent \
122
+ --desc "Machine-readable output." \
123
+ --json
124
+ ```
125
+
126
+ ### What `guild create` does
127
+
128
+ 1. Instantiates `agentculture/culture-agent-template` (or `--template`) via
129
+ `gh repo create --template`.
130
+ 2. Clones the new repo into `<workspace-root>/<bare>`.
131
+ 3. Runs the **pure transform** on the clone:
132
+ - global text replace: `culture_agent_template` → pkg, `culture-agent-template` → repo token
133
+ - renames the package directory
134
+ - sets `description` in `pyproject.toml`
135
+ - rewrites `README.md` first heading + intro
136
+ - overwrites `CLAUDE.md` with a self-init seed (names the agent, embeds the
137
+ description, carries a `/init` re-init instruction)
138
+ 4. Runs `configure-repo.sh` to apply GitHub settings (branch protection,
139
+ environments, `SONAR_TOKEN` placeholder).
140
+ 5. Stages, commits (`scaffold <bare> from culture-agent-template`), and pushes.
141
+ 6. Registers the new agent in `docs/skill-sources.md` (idempotent).
142
+
143
+ Dry-run (default) performs steps 1–5 as a plan description only — nothing
144
+ external. `--apply` executes all steps.
145
+
146
+ ### When to use
147
+
148
+ - Provisioning a brand-new AgentCulture sibling repo.
149
+ - Before `guild onboard` (create the repo first, then onboard the skill kit).
150
+ - The new agent gets a `/init` seed CLAUDE.md; run `/init` in the new repo to
151
+ expand it into a full runtime prompt.
152
+
94
153
  The script prints the CLI's markdown by default: the canonical-skill table, a
95
154
  ledger section, and a drift section. The exact per-skill consumer and gap lists
96
155
  live in `--json`.
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ # configure-repo — apply guildmaster's standard GitHub repo config to a sibling.
4
+ #
5
+ # GitHub template instantiation copies files + branches but NOT repo settings,
6
+ # so `guild create` must apply these itself after the repo exists. This is the
7
+ # deterministic config layer, mirroring guildmaster's own setup:
8
+ #
9
+ # 1. delete_branch_on_merge = true (auto-delete head branches on merge)
10
+ # 2. environments: pypi, testpypi (Trusted Publishing targets for publish.yml)
11
+ # 3. ruleset "Protect main" (block deletion + non-fast-forward; require a PR)
12
+ # 4. secret SONAR_TOKEN (created EMPTY if absent; never clobbers an
13
+ # existing value — override it in the GitHub UI)
14
+ #
15
+ # Idempotent: the ruleset is created only if no ruleset of that name exists, and
16
+ # the secret is set only if it is not already present. Dry-run by default.
17
+ #
18
+ # Usage:
19
+ # configure-repo.sh <owner/repo> # dry-run: print what it WOULD do
20
+ # configure-repo.sh <owner/repo> --apply # apply via gh
21
+ #
22
+ # Exit codes: 0 success · 1 usage / environment error.
23
+
24
+ RULESET_NAME="Protect main"
25
+ SONAR_SECRET="SONAR_TOKEN"
26
+ ENVIRONMENTS=(pypi testpypi)
27
+
28
+ repo=""
29
+ apply=false
30
+ for arg in "$@"; do
31
+ case "$arg" in
32
+ --apply) apply=true ;;
33
+ -*) echo "configure-repo: unknown flag: $arg" >&2; exit 1 ;;
34
+ *) repo="$arg" ;;
35
+ esac
36
+ done
37
+
38
+ if [ -z "$repo" ]; then
39
+ echo "usage: configure-repo.sh <owner/repo> [--apply]" >&2
40
+ exit 1
41
+ fi
42
+ command -v gh >/dev/null 2>&1 || { echo "configure-repo: 'gh' not on PATH" >&2; exit 1; }
43
+
44
+ say() { if $apply; then echo " ✓ $1"; else echo " would: $1"; fi; }
45
+
46
+ echo "── configure-repo: $repo $([ "$apply" = true ] && echo '(--apply)' || echo '(dry-run)') ──"
47
+
48
+ # 1. auto-delete-on-merge ---------------------------------------------------
49
+ say "set delete_branch_on_merge = true"
50
+ if $apply; then
51
+ gh api -X PATCH "repos/$repo" -F delete_branch_on_merge=true >/dev/null
52
+ fi
53
+
54
+ # 2. environments -----------------------------------------------------------
55
+ for env in "${ENVIRONMENTS[@]}"; do
56
+ say "ensure environment '$env'"
57
+ if $apply; then
58
+ gh api -X PUT "repos/$repo/environments/$env" >/dev/null
59
+ fi
60
+ done
61
+
62
+ # 3. ruleset "Protect main" (idempotent by name; no gh calls in dry-run) -----
63
+ if ! $apply; then
64
+ echo " would: ensure ruleset '$RULESET_NAME' (deletion + non_fast_forward + pull_request; created if absent)"
65
+ elif gh api "repos/$repo/rulesets" --jq '.[].name' 2>/dev/null | grep -Fxq "$RULESET_NAME"; then
66
+ echo " • ruleset '$RULESET_NAME' already present — skipping"
67
+ else
68
+ echo " ✓ create ruleset '$RULESET_NAME' (deletion + non_fast_forward + pull_request)"
69
+ gh api -X POST "repos/$repo/rulesets" --input - >/dev/null <<JSON
70
+ {
71
+ "name": "$RULESET_NAME",
72
+ "target": "branch",
73
+ "enforcement": "active",
74
+ "conditions": { "ref_name": { "include": ["~DEFAULT_BRANCH"], "exclude": [] } },
75
+ "rules": [
76
+ { "type": "deletion" },
77
+ { "type": "non_fast_forward" },
78
+ { "type": "pull_request",
79
+ "parameters": {
80
+ "required_approving_review_count": 0,
81
+ "dismiss_stale_reviews_on_push": false,
82
+ "require_code_owner_review": false,
83
+ "require_last_push_approval": false,
84
+ "required_review_thread_resolution": false
85
+ }
86
+ }
87
+ ]
88
+ }
89
+ JSON
90
+ fi
91
+
92
+ # 4. SONAR_TOKEN secret (empty placeholder; never clobber an override) -------
93
+ if ! $apply; then
94
+ echo " would: ensure secret '$SONAR_SECRET' (created empty if absent; never clobbers an override)"
95
+ elif gh secret list --repo "$repo" 2>/dev/null | grep -q "^${SONAR_SECRET}\b"; then
96
+ echo " • secret '$SONAR_SECRET' already set — leaving it (override lives in GitHub)"
97
+ else
98
+ echo " ✓ create empty secret '$SONAR_SECRET' (override it in the GitHub UI)"
99
+ printf '' | gh secret set "$SONAR_SECRET" --repo "$repo" >/dev/null
100
+ fi
101
+
102
+ echo "── done ──"
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ # create — invoke `guild create` from guildmaster's repo root.
4
+ #
5
+ # Instantiates agentculture/culture-agent-template (or a caller-supplied
6
+ # --template) for a new sibling agent, renames identifiers, writes a self-init
7
+ # CLAUDE.md seed, configures the GitHub repo, pushes the genesis commit, and
8
+ # registers the agent in docs/skill-sources.md.
9
+ #
10
+ # Dry-run by default; --apply executes.
11
+ #
12
+ # Usage:
13
+ # create.sh --agent OWNER/REPO --desc TEXT [--backend claude|acp]
14
+ # [--workspace-root DIR] [--template OWNER/REPO]
15
+ # [--org agentculture] [--apply] [--json]
16
+ #
17
+ # Exit codes:
18
+ # 0 success (delegates to `guild create`; its exit code propagates)
19
+ # 1 environment error (no way to invoke guild)
20
+
21
+ SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
22
+
23
+ # Resolve guildmaster's repo root.
24
+ REPO_ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || true)"
25
+ if [ -z "$REPO_ROOT" ]; then
26
+ REPO_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
27
+ fi
28
+ cd "$REPO_ROOT"
29
+
30
+ # Resolve how to invoke guild.
31
+ if command -v guild >/dev/null 2>&1; then
32
+ GUILD=(guild)
33
+ elif [ -f "$REPO_ROOT/pyproject.toml" ] && command -v uv >/dev/null 2>&1; then
34
+ GUILD=(uv run --project "$REPO_ROOT" guild)
35
+ elif command -v python3 >/dev/null 2>&1; then
36
+ GUILD=(python3 -m guild)
37
+ else
38
+ echo "create: cannot invoke guild (need 'guild', 'uv', or 'python3' on PATH)" >&2
39
+ exit 1
40
+ fi
41
+
42
+ exec "${GUILD[@]}" create "$@"
@@ -222,3 +222,6 @@ __marimo__/
222
222
 
223
223
  # devague working state (not committed by default)
224
224
  .devague/reviews/
225
+
226
+ # agex (cicd) per-checkout working dir
227
+ .agex/
@@ -5,6 +5,58 @@ 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.1] - 2026-05-26
9
+
10
+ ### Added
11
+
12
+ - **Registered `agenda`** (`agentculture/agenda`) in `docs/skill-sources.md` as a
13
+ downstream consumer of the canonical kit — the first sibling provisioned via
14
+ `guild create --apply`.
15
+
16
+ ### Fixed
17
+
18
+ - **`guild create` seed generator (`instantiate.py`)**: the CLAUDE.md/AGENTS.md
19
+ seed emitted the agent name as a standalone emphasized line (`**<name>**`),
20
+ tripping markdownlint **MD036** and failing the new repo's first CI run; the
21
+ name is now inlined in a sentence.
22
+ - **`guild create` README rewrite**: `_set_readme_intro` only replaced the first
23
+ line of the template's intro, leaving a dangling fragment when the intro spans
24
+ multiple lines (as the real `culture-agent-template` intro does). It now
25
+ replaces the whole first paragraph, stopping at a blank line **or** the start
26
+ of a new markdown block (heading / list / blockquote / badge / code fence) so
27
+ a block that immediately follows the intro is never silently dropped, while
28
+ wrapped inline-code prose (a single leading backtick) is still consumed. Both
29
+ bugs surfaced provisioning `agenda`; regression tests added.
30
+
31
+ ## [0.6.0] - 2026-05-26
32
+
33
+ ### Added
34
+
35
+ - **`guild create` — template-instantiate a new sibling repo.** Provisions a
36
+ brand-new AgentCulture sibling by instantiating
37
+ `agentculture/culture-agent-template` (overridable via `--template`),
38
+ renaming identifiers throughout the clone (`culture_agent_template` → pkg,
39
+ `culture-agent-template` → repo token), writing a self-init CLAUDE.md seed
40
+ (carries a `/init` re-init instruction; satisfies `steward doctor`
41
+ prompt-file-present + backend-consistency invariants), configuring the GitHub
42
+ repo via `configure-repo.sh`, pushing the genesis commit, and registering the
43
+ agent in `docs/skill-sources.md` (idempotent). Dry-run by default; `--apply`
44
+ executes. `--json` emits a structured payload on both paths.
45
+ - `guild/scaffold/instantiate.py` — the **pure** transform: `rename_map`,
46
+ `transform_plan` (dry-run description), `transform_clone` (in-place);
47
+ no network, no subprocess, fully unit-testable against a fixture dir.
48
+ - `guild/cli/_commands/_provision_template.py` — injectable-runner executor
49
+ with `preflight` (fail-fast: auth, existence, empty dest) and `apply`
50
+ (gh→clone→transform→configure→commit→push).
51
+ - `guild/cli/_commands/create.py` — CLI verb wiring argparse → plan → render
52
+ | apply.
53
+ - `.claude/skills/guild/scripts/create.sh` — thin wrapper (mirrors
54
+ `overview.sh`).
55
+ - 39 new tests covering: transform correctness, package-dir rename,
56
+ identifier replacement everywhere, CLAUDE.md seed shape, dry-run
57
+ external-free guarantee, `--apply` command sequence, fail-fast on existing
58
+ repo / no auth / non-empty dest, ledger idempotency.
59
+
8
60
  ## [0.5.1] - 2026-05-24
9
61
 
10
62
  ### Changed
@@ -106,6 +106,10 @@ asked for one; guildmaster fulfills the broadcast *role* via these two instead).
106
106
  Going live is gated on the steward→guildmaster cutover (`docs/cutover.md`) — no
107
107
  two live broadcasters.
108
108
 
109
+ **Provisioning verb — `guild create` (template-instantiate a new sibling).**
110
+
111
+ - `guild create --agent OWNER/REPO --desc TEXT [--backend claude|acp] [--workspace-root DIR] [--template agentculture/culture-agent-template] [--apply] [--json]` — provision a brand-new AgentCulture sibling by instantiating the GitHub template, renaming identifiers throughout the clone, writing a self-init CLAUDE.md seed, configuring the GitHub repo (branch protection, environments, SONAR_TOKEN placeholder), pushing the genesis commit, and registering the agent in `docs/skill-sources.md`. Dry-run by default; `--apply` executes. The transform is **pure** (unit-testable against a fixture dir; no network): `culture_agent_template` → pkg (underscore form, e.g. `my_agent`), `culture-agent-template` → repo token (hyphen form, e.g. `my-agent`). The CLAUDE.md seed is a `/init`-style bootstrap placeholder — run `/init` in the new repo after provisioning to expand it into a full runtime prompt. Implementation: `guild/scaffold/instantiate.py` (pure transform), `guild/cli/_commands/create.py` (CLI), `guild/cli/_commands/_provision_template.py` (injectable-runner executor), `.claude/skills/guild/scripts/create.sh` (thin wrapper).
112
+
109
113
  **Inventory verbs — `overview` & `show` (the read-only surfaces).** guildmaster
110
114
  owns the mesh's *inventory* surfaces per
111
115
  [issue #12](https://github.com/agentculture/guildmaster/issues/12) — the
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: guild-cli
3
- Version: 0.5.1
3
+ Version: 0.6.1
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` | 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` | 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` | 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` | Stub; real implementation TBD. `scripts/check.sh` exits not-yet-implemented today. |
39
+ | `pypi-maintainer` | `guildmaster` (`.claude/skills/pypi-maintainer/`) | `agtag`, `agenda` | 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` | 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` | 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` | 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` | 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` | 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` | 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
@@ -32,6 +32,7 @@ class _GuildArgumentParser(argparse.ArgumentParser):
32
32
  def _build_parser() -> argparse.ArgumentParser:
33
33
  # Deferred import to avoid coupling the parser module to the command modules
34
34
  # at import time (matches the afi-cli pattern; cheap insurance).
35
+ from guild.cli._commands import create as _create_cmd
35
36
  from guild.cli._commands import explain as _explain_cmd
36
37
  from guild.cli._commands import learn as _learn_cmd
37
38
  from guild.cli._commands import onboard as _onboard_cmd
@@ -56,6 +57,7 @@ def _build_parser() -> argparse.ArgumentParser:
56
57
  _explain_cmd.register(sub)
57
58
  _teach_cmd.register(sub)
58
59
  _onboard_cmd.register(sub)
60
+ _create_cmd.register(sub)
59
61
  _overview_cmd.register(sub)
60
62
  _show_cmd.register(sub)
61
63
 
@@ -25,6 +25,11 @@ VERBS: dict[str, str] = {
25
25
  "Onboard a new sibling: the full canonical kit + identity-setup section "
26
26
  "+ ledger registration + verification record. Dry-run by default."
27
27
  ),
28
+ "create": (
29
+ "Provision a brand-new sibling repo by instantiating the GitHub template "
30
+ "agentculture/culture-agent-template, customising it for the new agent, "
31
+ "and registering it in the ledger. Dry-run by default; --apply executes."
32
+ ),
28
33
  "overview": (
29
34
  "Skills-supplier overview — the canonical skill set + versions, the "
30
35
  "ledger view, and drift signals. Read-only; --scope all / self."