guild-cli 0.5.1__tar.gz → 0.6.0__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.0}/.claude/skills/guild/SKILL.md +72 -13
- guild_cli-0.6.0/.claude/skills/guild/scripts/configure-repo.sh +102 -0
- guild_cli-0.6.0/.claude/skills/guild/scripts/create.sh +42 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.gitignore +3 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/CHANGELOG.md +29 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/CLAUDE.md +4 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/PKG-INFO +1 -1
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/__init__.py +2 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_commands/__init__.py +5 -0
- guild_cli-0.6.0/guild/cli/_commands/_provision_template.py +352 -0
- guild_cli-0.6.0/guild/cli/_commands/create.py +233 -0
- guild_cli-0.6.0/guild/scaffold/__init__.py +14 -0
- guild_cli-0.6.0/guild/scaffold/instantiate.py +408 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/pyproject.toml +1 -1
- guild_cli-0.6.0/tests/test_cli_create.py +642 -0
- guild_cli-0.6.0/tests/test_scaffold_instantiate.py +314 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/uv.lock +1 -1
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/agent-config/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/agent-config/data/backend-fingerprints.yaml +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/agent-config/scripts/show.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/cicd/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/communicate/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/guild/scripts/overview.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/onboard/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/onboard/scripts/onboard.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/teach/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/teach/scripts/teach.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/think/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/think/scripts/think.sh +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/version-bump/SKILL.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.claude/skills.local.yaml.example +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.devague/frames/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.devague/plans/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.flake8 +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.github/workflows/publish.yml +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.github/workflows/tests.yml +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/.markdownlint-cli2.yaml +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/LICENSE +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/README.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/culture.yaml +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/docs/cutover.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/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.0}/docs/skill-sources.md +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/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.0}/guild/__init__.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/__main__.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_commands/_broadcast.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_commands/explain.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_commands/learn.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_commands/onboard.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_commands/overview.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_commands/show.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_commands/teach.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_commands/whoami.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_errors.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_output.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/cli/_repo.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/skills/__init__.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/skills/identity.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/skills/ledger.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/skills/render.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/guild/skills/sources.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/__init__.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_broadcast_post.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_cli.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_cli_explain.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_cli_learn.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_cli_onboard.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_cli_overview.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_cli_show.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_cli_teach.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_cli_whoami.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_skills_convention.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_skills_identity.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_skills_ledger.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_skills_render.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/tests/test_skills_sources.py +0 -0
- {guild_cli-0.5.1 → guild_cli-0.6.0}/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,35 @@ 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.0] - 2026-05-26
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **`guild create` — template-instantiate a new sibling repo.** Provisions a
|
|
13
|
+
brand-new AgentCulture sibling by instantiating
|
|
14
|
+
`agentculture/culture-agent-template` (overridable via `--template`),
|
|
15
|
+
renaming identifiers throughout the clone (`culture_agent_template` → pkg,
|
|
16
|
+
`culture-agent-template` → repo token), writing a self-init CLAUDE.md seed
|
|
17
|
+
(carries a `/init` re-init instruction; satisfies `steward doctor`
|
|
18
|
+
prompt-file-present + backend-consistency invariants), configuring the GitHub
|
|
19
|
+
repo via `configure-repo.sh`, pushing the genesis commit, and registering the
|
|
20
|
+
agent in `docs/skill-sources.md` (idempotent). Dry-run by default; `--apply`
|
|
21
|
+
executes. `--json` emits a structured payload on both paths.
|
|
22
|
+
- `guild/scaffold/instantiate.py` — the **pure** transform: `rename_map`,
|
|
23
|
+
`transform_plan` (dry-run description), `transform_clone` (in-place);
|
|
24
|
+
no network, no subprocess, fully unit-testable against a fixture dir.
|
|
25
|
+
- `guild/cli/_commands/_provision_template.py` — injectable-runner executor
|
|
26
|
+
with `preflight` (fail-fast: auth, existence, empty dest) and `apply`
|
|
27
|
+
(gh→clone→transform→configure→commit→push).
|
|
28
|
+
- `guild/cli/_commands/create.py` — CLI verb wiring argparse → plan → render
|
|
29
|
+
| apply.
|
|
30
|
+
- `.claude/skills/guild/scripts/create.sh` — thin wrapper (mirrors
|
|
31
|
+
`overview.sh`).
|
|
32
|
+
- 39 new tests covering: transform correctness, package-dir rename,
|
|
33
|
+
identifier replacement everywhere, CLAUDE.md seed shape, dry-run
|
|
34
|
+
external-free guarantee, `--apply` command sequence, fail-fast on existing
|
|
35
|
+
repo / no auth / non-empty dest, ledger idempotency.
|
|
36
|
+
|
|
8
37
|
## [0.5.1] - 2026-05-24
|
|
9
38
|
|
|
10
39
|
### 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.0
|
|
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,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."
|