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.
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/guild/SKILL.md +72 -13
- guild_cli-0.6.1/.claude/skills/guild/scripts/configure-repo.sh +102 -0
- guild_cli-0.6.1/.claude/skills/guild/scripts/create.sh +42 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.gitignore +3 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/CHANGELOG.md +52 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/CLAUDE.md +4 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/PKG-INFO +1 -1
- {guild_cli-0.5.1 → guild_cli-0.6.1}/docs/skill-sources.md +11 -11
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/__init__.py +2 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/__init__.py +5 -0
- guild_cli-0.6.1/guild/cli/_commands/_provision_template.py +352 -0
- guild_cli-0.6.1/guild/cli/_commands/create.py +233 -0
- guild_cli-0.6.1/guild/scaffold/__init__.py +14 -0
- guild_cli-0.6.1/guild/scaffold/instantiate.py +444 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/pyproject.toml +1 -1
- guild_cli-0.6.1/tests/test_cli_create.py +642 -0
- guild_cli-0.6.1/tests/test_scaffold_instantiate.py +387 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/uv.lock +1 -1
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/agent-config/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/agent-config/scripts/show.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/guild/scripts/overview.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/onboard/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/onboard/scripts/onboard.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/run-tests/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/teach/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/teach/scripts/teach.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/think/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/think/scripts/think.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/version-bump/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.claude/skills.local.yaml.example +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.devague/frames/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.devague/plans/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.flake8 +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.github/workflows/publish.yml +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.github/workflows/tests.yml +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/.markdownlint-cli2.yaml +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/LICENSE +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/README.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/culture.yaml +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/docs/cutover.md +0 -0
- {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
- {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
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/__init__.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/__main__.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/_broadcast.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/explain.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/learn.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/onboard.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/overview.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/show.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/teach.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_commands/whoami.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_errors.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_output.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/cli/_repo.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/skills/__init__.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/skills/identity.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/skills/ledger.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/skills/render.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/guild/skills/sources.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/__init__.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_broadcast_post.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_explain.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_learn.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_onboard.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_overview.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_show.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_teach.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_cli_whoami.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_skills_convention.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_skills_identity.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_skills_ledger.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_skills_render.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.1}/tests/test_skills_sources.py +0 -0
- {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
|
|
5
|
-
overview` (
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
(cite-don't-import,
|
|
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 "$@"
|
|
@@ -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.
|
|
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/`) |
|
|
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."
|