guild-cli 0.3.0__tar.gz → 0.4.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.4.0/.claude/skills/agent-config/SKILL.md +82 -0
- guild_cli-0.4.0/.claude/skills/agent-config/data/backend-fingerprints.yaml +30 -0
- guild_cli-0.4.0/.claude/skills/agent-config/scripts/show.sh +136 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills.local.yaml.example +2 -1
- {guild_cli-0.3.0 → guild_cli-0.4.0}/CHANGELOG.md +37 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/CLAUDE.md +20 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/PKG-INFO +28 -1
- {guild_cli-0.3.0 → guild_cli-0.4.0}/README.md +27 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/docs/skill-sources.md +1 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/__init__.py +4 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/__init__.py +8 -0
- guild_cli-0.4.0/guild/cli/_commands/overview.py +273 -0
- guild_cli-0.4.0/guild/cli/_commands/show.py +266 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/skills/ledger.py +36 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/pyproject.toml +1 -1
- guild_cli-0.4.0/tests/test_cli_overview.py +148 -0
- guild_cli-0.4.0/tests/test_cli_show.py +165 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_skills_convention.py +2 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_skills_ledger.py +56 -1
- {guild_cli-0.3.0 → guild_cli-0.4.0}/uv.lock +1 -1
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/onboard/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/onboard/scripts/onboard.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/teach/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/teach/scripts/teach.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/think/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/think/scripts/think.sh +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/version-bump/SKILL.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.devague/frames/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.devague/plans/guildmaster-ships-teach-and-onboard-two-agent-firs.json +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.flake8 +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.github/workflows/publish.yml +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.github/workflows/tests.yml +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.gitignore +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/.markdownlint-cli2.yaml +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/LICENSE +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/culture.yaml +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/docs/cutover.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/docs/plans/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/docs/specs/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/__init__.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/__main__.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/_broadcast.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/explain.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/learn.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/onboard.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/teach.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_commands/whoami.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_errors.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_output.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/cli/_repo.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/skills/__init__.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/skills/identity.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/skills/render.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/guild/skills/sources.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/__init__.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_broadcast_post.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli_explain.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli_learn.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli_onboard.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli_teach.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_cli_whoami.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_skills_identity.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_skills_render.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_skills_sources.py +0 -0
- {guild_cli-0.3.0 → guild_cli-0.4.0}/tests/test_version_fallback.py +0 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-config
|
|
3
|
+
description: >
|
|
4
|
+
Show a Culture agent's full configuration in one read-only view: its
|
|
5
|
+
system-prompt file (CLAUDE.md / AGENTS.md / GEMINI.md), the parallel
|
|
6
|
+
culture.yaml, and the agent's local .claude/skills index. Use when an
|
|
7
|
+
operator says "show agent <name>", "what does <agent> look like", or before
|
|
8
|
+
teaching/onboarding an agent and you need to see its current kit + config.
|
|
9
|
+
Backs the `guild show` verb. Vendored from steward (cite-don't-import);
|
|
10
|
+
inventory only — it reports, it does not judge alignment or drift.
|
|
11
|
+
type: command
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# agent-config — surface a Culture agent's config in one view
|
|
15
|
+
|
|
16
|
+
guildmaster is the mesh's skills supplier and owns the **inventory** surfaces:
|
|
17
|
+
"what kit + config does this agent have?" This skill answers exactly that for a
|
|
18
|
+
single agent, showing the three artifacts that together define it:
|
|
19
|
+
|
|
20
|
+
1. **System-prompt file** (`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`) — the
|
|
21
|
+
prompt-side guidance for the agent's backend. The script detects which file
|
|
22
|
+
is present from a backend-fingerprint registry.
|
|
23
|
+
2. **`culture.yaml`** — the runtime-side config (`agents:` list with `suffix`,
|
|
24
|
+
`backend`, `model`, `system_prompt`, `channels`, `tags`, `acp_command`,
|
|
25
|
+
`extras`). Lives parallel to the prompt file at the project root.
|
|
26
|
+
3. **`.claude/skills/*/SKILL.md`** — the per-project skills the agent can
|
|
27
|
+
invoke, one line each (name + truncated description).
|
|
28
|
+
|
|
29
|
+
This is the **inventory half** of the steward → guildmaster split
|
|
30
|
+
([issue #12](https://github.com/agentculture/guildmaster/issues/12)): it reports
|
|
31
|
+
the config, it does **not** interpret drift or judge alignment. The relationship
|
|
32
|
+
graph and the "is this agent aligned?" judgment stay with `steward overview` /
|
|
33
|
+
`steward doctor`.
|
|
34
|
+
|
|
35
|
+
## When to use
|
|
36
|
+
|
|
37
|
+
- Before `guild teach` / `guild onboard` — see an agent's current kit + config.
|
|
38
|
+
- When an operator asks "show me agent `<name>`" or "what does `<agent>` run".
|
|
39
|
+
- Read it, don't guess — before answering a question about what an agent does.
|
|
40
|
+
|
|
41
|
+
## How to run
|
|
42
|
+
|
|
43
|
+
One script, two ways to call it (or just run `guild show`, which wraps it):
|
|
44
|
+
|
|
45
|
+
```bash
|
|
46
|
+
# Path mode — point at any directory with a prompt file + culture.yaml
|
|
47
|
+
.claude/skills/agent-config/scripts/show.sh ../culture
|
|
48
|
+
|
|
49
|
+
# Suffix mode — resolve a registered agent suffix via the Culture server's
|
|
50
|
+
# manifest (location set by culture_server_yaml in skills.local.yaml)
|
|
51
|
+
.claude/skills/agent-config/scripts/show.sh daria
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
Output is three sections: the detected system-prompt file, `culture.yaml` (or
|
|
55
|
+
`(missing)`), and a one-line summary per local skill (name + description,
|
|
56
|
+
truncated to 120 chars).
|
|
57
|
+
|
|
58
|
+
## What to look at in `culture.yaml`
|
|
59
|
+
|
|
60
|
+
| Field | Why it matters |
|
|
61
|
+
|-------|----------------|
|
|
62
|
+
| `suffix` | Identifies the agent on the mesh. |
|
|
63
|
+
| `backend` | One of `claude` / `codex` / `copilot` / `acp`. The all-backends rule means a feature in one must land in all four. |
|
|
64
|
+
| `model` | Drift here changes behavior silently. |
|
|
65
|
+
| `system_prompt` | Should not contradict the prompt file. |
|
|
66
|
+
| `channels` | Where the agent listens. |
|
|
67
|
+
| `tags`, `extras`, `acp_command` | Backend-specific. |
|
|
68
|
+
|
|
69
|
+
## Notes
|
|
70
|
+
|
|
71
|
+
- **Read-only.** The script never edits agent files. It reports; it does not
|
|
72
|
+
flag or fix drift — that judgment is steward's lane.
|
|
73
|
+
- **Backend-aware.** Prompt-file detection comes from
|
|
74
|
+
`data/backend-fingerprints.yaml` (the `prompt:` mapping), falling back to the
|
|
75
|
+
built-in `(CLAUDE.md AGENTS.md GEMINI.md)` list if the registry is absent.
|
|
76
|
+
- **Per-machine config.** Suffix mode reads `culture_server_yaml` from
|
|
77
|
+
`.claude/skills.local.yaml` (git-ignored), falling back to
|
|
78
|
+
`.claude/skills.local.yaml.example`.
|
|
79
|
+
- **Vendored from steward** (`agent-config`). guildmaster owns this copy and may
|
|
80
|
+
diverge; re-sync from steward's canonical copy when it changes. Divergences:
|
|
81
|
+
the SKILL.md is reframed for guildmaster's inventory role and adds
|
|
82
|
+
`type: command` for the culture backend's skill loader.
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
# Canonical backend fingerprint registry. Vendored from steward's agent-config
|
|
2
|
+
# skill (cite-don't-import); guildmaster owns this copy. Read by the agent-config
|
|
3
|
+
# show.sh (bash), which `guild show` shells out to. Upstream steward also reads
|
|
4
|
+
# it from a Python detector; guildmaster has no parallel detector, so only the
|
|
5
|
+
# `backends:` prompt mapping below is load-bearing here. Keep that mapping in
|
|
6
|
+
# sync with upstream when re-syncing.
|
|
7
|
+
#
|
|
8
|
+
# `prompt` — the backend's system-prompt filename at the repo root.
|
|
9
|
+
# `steering` — files/dirs distinctive enough to attribute to this backend.
|
|
10
|
+
# `shared_steering` — files/dirs that belong to NO specific backend. A repo
|
|
11
|
+
# declared as any backend may have these without triggering a
|
|
12
|
+
# mismatch. `.agents` is a generic Culture agent-config
|
|
13
|
+
# convention. `.claude/settings.json` and
|
|
14
|
+
# `.claude/settings.local.json` are generic Claude Code
|
|
15
|
+
# (editor/CLI) workspace config files — they appear in any
|
|
16
|
+
# repo that uses Claude Code as the development tool,
|
|
17
|
+
# regardless of the agent backend, so they must never be used
|
|
18
|
+
# to infer the backend or flag a mismatch. The claude backend
|
|
19
|
+
# is identified solely by its `CLAUDE.md` prompt file.
|
|
20
|
+
# `.github/copilot-instructions.md` is generic GitHub Copilot
|
|
21
|
+
# editor/IDE config — any repo may have it regardless of the
|
|
22
|
+
# declared agent backend, so it must not trigger a mismatch.
|
|
23
|
+
backends:
|
|
24
|
+
claude: { prompt: CLAUDE.md, steering: [] }
|
|
25
|
+
codex: { prompt: AGENTS.md, steering: [".codex"] }
|
|
26
|
+
acp: { prompt: AGENTS.md, steering: [".kiro"] }
|
|
27
|
+
copilot: { prompt: AGENTS.md, steering: [] }
|
|
28
|
+
gemini: { prompt: GEMINI.md, steering: [".gemini"] }
|
|
29
|
+
shared_steering: [".agents", ".claude/settings.json", ".claude/settings.local.json", ".github/copilot-instructions.md"]
|
|
30
|
+
prompt_fallback: AGENTS.md
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
# Show a Culture agent's full configuration in one view:
|
|
4
|
+
# the detected system-prompt file (CLAUDE.md / AGENTS.md / GEMINI.md), the
|
|
5
|
+
# parallel culture.yaml, and the .claude/skills/ index.
|
|
6
|
+
#
|
|
7
|
+
# Usage: show.sh <path-or-agent-suffix>
|
|
8
|
+
#
|
|
9
|
+
# Path mode: show.sh ../culture
|
|
10
|
+
# Suffix mode: show.sh daria (resolved via culture_server_yaml in skills.local.yaml)
|
|
11
|
+
#
|
|
12
|
+
# Exit codes:
|
|
13
|
+
# 0 success
|
|
14
|
+
# 1 environment error (missing manifest, missing PyYAML for suffix mode)
|
|
15
|
+
# 2 user error (no target given, unknown suffix, target path doesn't exist)
|
|
16
|
+
|
|
17
|
+
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
18
|
+
SKILL_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
19
|
+
REPO_ROOT="$(cd "$SKILL_DIR/../../.." && pwd)"
|
|
20
|
+
|
|
21
|
+
CFG="$REPO_ROOT/.claude/skills.local.yaml"
|
|
22
|
+
[ -f "$CFG" ] || CFG="$REPO_ROOT/.claude/skills.local.yaml.example"
|
|
23
|
+
|
|
24
|
+
# Read a top-level YAML scalar from CFG. Schema is intentionally tiny:
|
|
25
|
+
# key: value (with optional surrounding quotes / trailing comment)
|
|
26
|
+
# No PyYAML dependency.
|
|
27
|
+
read_cfg() {
|
|
28
|
+
awk -v key="$1" '
|
|
29
|
+
$0 ~ ("^" key ":[[:space:]]*") {
|
|
30
|
+
sub("^" key ":[[:space:]]*", "")
|
|
31
|
+
sub(/[[:space:]]*#.*$/, "")
|
|
32
|
+
sub(/^[[:space:]]+/, ""); sub(/[[:space:]]+$/, "")
|
|
33
|
+
sub(/^["\047]/, ""); sub(/["\047]$/, "")
|
|
34
|
+
print
|
|
35
|
+
exit
|
|
36
|
+
}
|
|
37
|
+
' "$CFG"
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
target="${1:-}"
|
|
41
|
+
if [ -z "$target" ]; then
|
|
42
|
+
echo "Usage: $(basename "$0") <path-or-agent-suffix>" >&2
|
|
43
|
+
exit 2
|
|
44
|
+
fi
|
|
45
|
+
|
|
46
|
+
if [ -d "$target" ]; then
|
|
47
|
+
DIR="$target"
|
|
48
|
+
else
|
|
49
|
+
SERVER_YAML_RAW="$(read_cfg culture_server_yaml)"
|
|
50
|
+
SERVER_YAML="${SERVER_YAML_RAW/#\~/$HOME}"
|
|
51
|
+
if [ ! -f "$SERVER_YAML" ]; then
|
|
52
|
+
echo "no server manifest at $SERVER_YAML — set culture_server_yaml in $CFG" >&2
|
|
53
|
+
echo "or pass an explicit path instead of suffix '$target'" >&2
|
|
54
|
+
exit 1
|
|
55
|
+
fi
|
|
56
|
+
# Suffix mode parses Culture's server manifest, whose schema is dictated by
|
|
57
|
+
# Culture (not by us) and includes nested mappings — too rich for awk.
|
|
58
|
+
# We use python+PyYAML here, with a friendly install hint if it's missing.
|
|
59
|
+
if ! python3 -c 'import yaml' 2>/dev/null; then
|
|
60
|
+
echo "suffix mode needs Python + PyYAML to parse $SERVER_YAML" >&2
|
|
61
|
+
echo " install: pip install --user pyyaml (or: uv pip install pyyaml)" >&2
|
|
62
|
+
echo " or pass an explicit path instead of suffix '$target'" >&2
|
|
63
|
+
exit 1
|
|
64
|
+
fi
|
|
65
|
+
# Use a dedicated exit code (2) for "unknown suffix" so the steward CLI
|
|
66
|
+
# wrapper can distinguish user errors (typo'd suffix) from env errors
|
|
67
|
+
# (missing manifest / PyYAML).
|
|
68
|
+
if ! DIR=$(python3 - "$SERVER_YAML" "$target" <<'PY'
|
|
69
|
+
import sys, yaml, pathlib
|
|
70
|
+
manifest_path, suffix = sys.argv[1], sys.argv[2]
|
|
71
|
+
m = yaml.safe_load(pathlib.Path(manifest_path).read_text()) or {}
|
|
72
|
+
agents = m.get('agents', {})
|
|
73
|
+
entry = agents.get(suffix)
|
|
74
|
+
if entry is None:
|
|
75
|
+
print(f"no agent registered with suffix {suffix!r} in {manifest_path}", file=sys.stderr)
|
|
76
|
+
sys.exit(2)
|
|
77
|
+
print(entry['directory'] if isinstance(entry, dict) else entry)
|
|
78
|
+
PY
|
|
79
|
+
); then
|
|
80
|
+
exit 2
|
|
81
|
+
fi
|
|
82
|
+
fi
|
|
83
|
+
|
|
84
|
+
DIR="${DIR/#\~/$HOME}"
|
|
85
|
+
|
|
86
|
+
# Recognized prompt filenames come from the shared registry (single source
|
|
87
|
+
# of truth with the Python detector). Fall back to the built-in list if the
|
|
88
|
+
# registry isn't present (e.g. skill vendored without the data file).
|
|
89
|
+
REGISTRY="$SKILL_DIR/data/backend-fingerprints.yaml"
|
|
90
|
+
prompt_files=()
|
|
91
|
+
if [ -f "$REGISTRY" ]; then
|
|
92
|
+
while IFS= read -r pf; do
|
|
93
|
+
[ -n "$pf" ] && prompt_files+=("$pf")
|
|
94
|
+
done < <(grep -oE 'prompt:[[:space:]]*[^,}[:space:]]+' "$REGISTRY" | awk '{print $NF}' | sort -u)
|
|
95
|
+
fi
|
|
96
|
+
[ ${#prompt_files[@]} -eq 0 ] && prompt_files=(CLAUDE.md AGENTS.md GEMINI.md)
|
|
97
|
+
|
|
98
|
+
shown=0
|
|
99
|
+
for pf in "${prompt_files[@]}"; do
|
|
100
|
+
if [ -f "$DIR/$pf" ]; then
|
|
101
|
+
echo "=== $DIR/$pf ==="
|
|
102
|
+
cat "$DIR/$pf"
|
|
103
|
+
echo
|
|
104
|
+
shown=1
|
|
105
|
+
fi
|
|
106
|
+
done
|
|
107
|
+
if [ "$shown" -eq 0 ]; then
|
|
108
|
+
echo "=== $DIR (system prompt) ==="
|
|
109
|
+
echo "(no recognized prompt file: ${prompt_files[*]})"
|
|
110
|
+
echo
|
|
111
|
+
fi
|
|
112
|
+
echo "=== $DIR/culture.yaml ==="
|
|
113
|
+
if [ -f "$DIR/culture.yaml" ]; then cat "$DIR/culture.yaml"; else echo "(missing)"; fi
|
|
114
|
+
echo
|
|
115
|
+
echo "=== $DIR/.claude/skills/ ==="
|
|
116
|
+
found=0
|
|
117
|
+
for s in "$DIR"/.claude/skills/*/SKILL.md; do
|
|
118
|
+
[ -f "$s" ] || continue
|
|
119
|
+
found=1
|
|
120
|
+
name=$(awk '/^name:/{print $2; exit}' "$s")
|
|
121
|
+
desc=$(awk '
|
|
122
|
+
/^description:/ {
|
|
123
|
+
sub(/^description:[[:space:]]*/, "")
|
|
124
|
+
buf = $0
|
|
125
|
+
flag = 1
|
|
126
|
+
next
|
|
127
|
+
}
|
|
128
|
+
flag && /^[a-z_-]+:/ { flag = 0 }
|
|
129
|
+
flag { buf = buf " " $0 }
|
|
130
|
+
END { gsub(/^[[:space:]]+|[[:space:]]+$/, "", buf); print buf }
|
|
131
|
+
' "$s")
|
|
132
|
+
printf " %-30s %s\n" "$name" "${desc:0:120}"
|
|
133
|
+
done
|
|
134
|
+
if [ "$found" -eq 0 ]; then
|
|
135
|
+
echo " (no skills)"
|
|
136
|
+
fi
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
# Skills read skills.local.yaml first, falling back to this example.
|
|
4
4
|
|
|
5
5
|
# Path to the Culture server's agent manifest (suffix → directory mapping).
|
|
6
|
-
# Used by skills that resolve a registered agent suffix to its repo dir
|
|
6
|
+
# Used by skills that resolve a registered agent suffix to its repo dir —
|
|
7
|
+
# e.g. the agent-config skill / `guild show <suffix>` (suffix mode).
|
|
7
8
|
culture_server_yaml: ~/.culture/server.yaml
|
|
8
9
|
|
|
9
10
|
# Sibling project paths checked by cross-repo skills (cicd alignment delta,
|
|
@@ -5,6 +5,43 @@ 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.4.0] - 2026-05-24
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **`guild overview`** — guildmaster's read-only skills-supplier overview surface
|
|
13
|
+
([#12](https://github.com/agentculture/guildmaster/issues/12)): the canonical
|
|
14
|
+
skill set + versions/origins, the `docs/skill-sources.md` ledger view, and
|
|
15
|
+
drift signals (unledgered skills, uncovered skills, per-agent kit gaps).
|
|
16
|
+
`--scope all` (default) and `--scope self <agent>`; markdown or `--json`.
|
|
17
|
+
Pure-Python, read-only — no `--apply`, no mutation, no LLM. Degrades
|
|
18
|
+
gracefully pre-cutover: when the ledger has no downstream column the verb
|
|
19
|
+
reports the canonical set and notes that drift activates after the
|
|
20
|
+
steward→guildmaster cutover. Skills-scoped only — does not reproduce
|
|
21
|
+
`steward overview`'s ecosystem relationship graph.
|
|
22
|
+
- **`guild show <path-or-suffix>`** — one agent's full config in one read-only
|
|
23
|
+
view ([#12](https://github.com/agentculture/guildmaster/issues/12)): the
|
|
24
|
+
detected system-prompt file (`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`), the
|
|
25
|
+
parallel `culture.yaml`, and the `.claude/skills` index. Path mode or suffix
|
|
26
|
+
mode (resolved via `culture_server_yaml`). Target resolution happens once in
|
|
27
|
+
Python; the human view shells out to the vendored `agent-config` `show.sh`
|
|
28
|
+
(mirroring `steward show`), while `--json` emits a structured object (prompt
|
|
29
|
+
file + contents, parsed `culture.yaml`, skills index) built natively. Failure
|
|
30
|
+
output stays the structured `error:` / `hint:` shape. Inventory only — it
|
|
31
|
+
reports, it does not judge drift.
|
|
32
|
+
- **`agent-config` skill** vendored from steward (cite-don't-import) to back
|
|
33
|
+
`guild show`: `scripts/show.sh` + `data/backend-fingerprints.yaml` verbatim;
|
|
34
|
+
SKILL.md reframed for guildmaster's inventory role + `type: command`. Recorded
|
|
35
|
+
in `docs/skill-sources.md`; now part of the canonical skill set.
|
|
36
|
+
- `guild.skills.ledger.supplier_skills` / `consumer_map` — pure helpers that
|
|
37
|
+
read the supplier ledger (skills tracked + their consumers) for `overview`.
|
|
38
|
+
|
|
39
|
+
### Changed
|
|
40
|
+
|
|
41
|
+
- `VERBS` index + `README.md` + `CLAUDE.md` document the new inventory verbs and
|
|
42
|
+
the issue #12 division of labor (inventory → guildmaster; alignment judgment →
|
|
43
|
+
steward).
|
|
44
|
+
|
|
8
45
|
## [0.3.0] - 2026-05-24
|
|
9
46
|
|
|
10
47
|
### Added
|
|
@@ -106,6 +106,26 @@ 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
|
+
**Inventory verbs — `overview` & `show` (the read-only surfaces).** guildmaster
|
|
110
|
+
owns the mesh's *inventory* surfaces per
|
|
111
|
+
[issue #12](https://github.com/agentculture/guildmaster/issues/12) — the
|
|
112
|
+
"what kit + config does an agent have?" view. The dividing rule from issue #12:
|
|
113
|
+
**inventory → guildmaster; judgment ("how do agents relate / are they aligned?")
|
|
114
|
+
→ steward.** Neither verb clones `steward overview`'s relationship graph.
|
|
115
|
+
|
|
116
|
+
- `guild overview [--scope all|self <agent>]` — the supplier view: canonical
|
|
117
|
+
skill set + versions/origins, the `docs/skill-sources.md` ledger, and drift
|
|
118
|
+
signals (uncovered skills, per-agent kit gaps). Pure-Python, read-only, **no
|
|
119
|
+
`--apply`**. Pre-cutover the ledger has no downstream column, so drift is
|
|
120
|
+
inactive and the verb says so (reads whichever ledger is authoritative).
|
|
121
|
+
- `guild show <path-or-suffix>` — one agent's full config: detected prompt file
|
|
122
|
+
(`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`), parallel `culture.yaml`, and the
|
|
123
|
+
`.claude/skills` index. Thin wrapper that shells out to the vendored
|
|
124
|
+
`agent-config` skill's `show.sh` (cite-don't-import from steward), mirroring
|
|
125
|
+
`steward show`. Path mode or suffix mode (resolved via `culture_server_yaml`).
|
|
126
|
+
|
|
127
|
+
Both **report**; they do not flag or fix drift (that judgment is steward's lane).
|
|
128
|
+
|
|
109
129
|
**Backend:** guildmaster is a CLI *plus* an agent like steward, so the natural
|
|
110
130
|
fit is `backend: claude` with this `CLAUDE.md` as the runtime prompt and a
|
|
111
131
|
`culture.yaml` declaring the `guildmaster` agent suffix (steward's is
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: guild-cli
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.4.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
|
|
@@ -94,6 +94,33 @@ verification). After: **one command** propagates a skill set, or onboards a
|
|
|
94
94
|
sibling end-to-end. Going live is gated on the staged steward→guildmaster
|
|
95
95
|
cutover — see [`docs/cutover.md`](docs/cutover.md).
|
|
96
96
|
|
|
97
|
+
### Inventory verbs — `overview` & `show`
|
|
98
|
+
|
|
99
|
+
guildmaster owns the mesh's **inventory** surfaces (the read-only "what kit +
|
|
100
|
+
config does an agent have?" view) per
|
|
101
|
+
[issue #12](https://github.com/agentculture/guildmaster/issues/12). Both are
|
|
102
|
+
read-only — no `--apply`, no mutation, no drift verdict (judgment stays with
|
|
103
|
+
`steward overview` / `steward doctor`).
|
|
104
|
+
|
|
105
|
+
| Verb | What it does |
|
|
106
|
+
|------|--------------|
|
|
107
|
+
| `guild overview [--scope all\|self <agent>]` | The supplier view: the canonical skill set + versions/origins, the `docs/skill-sources.md` ledger, and drift signals (uncovered skills, per-agent kit gaps). Feeds `teach` / `onboard`. |
|
|
108
|
+
| `guild show <path-or-suffix>` | One agent's full config in one view — its detected prompt file (`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`), its parallel `culture.yaml`, and its `.claude/skills` index. |
|
|
109
|
+
|
|
110
|
+
```bash
|
|
111
|
+
uv run guild overview # whole ledger + canonical set
|
|
112
|
+
uv run guild overview --scope self daria # one agent's kit + gaps
|
|
113
|
+
uv run guild show ../culture # config by path
|
|
114
|
+
uv run guild show daria # config by registered suffix
|
|
115
|
+
uv run guild show ../culture --json # structured config object
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`guild show` resolves a registered suffix via the Culture server manifest
|
|
119
|
+
(`culture_server_yaml` in `.claude/skills.local.yaml`); pass an explicit
|
|
120
|
+
directory path to skip the lookup. Pre-cutover the ledger is still a
|
|
121
|
+
consumer-side view with no downstream column, so `overview`'s drift signals
|
|
122
|
+
activate only after the steward→guildmaster cutover — the verb says so plainly.
|
|
123
|
+
|
|
97
124
|
## Develop
|
|
98
125
|
|
|
99
126
|
```bash
|
|
@@ -76,6 +76,33 @@ verification). After: **one command** propagates a skill set, or onboards a
|
|
|
76
76
|
sibling end-to-end. Going live is gated on the staged steward→guildmaster
|
|
77
77
|
cutover — see [`docs/cutover.md`](docs/cutover.md).
|
|
78
78
|
|
|
79
|
+
### Inventory verbs — `overview` & `show`
|
|
80
|
+
|
|
81
|
+
guildmaster owns the mesh's **inventory** surfaces (the read-only "what kit +
|
|
82
|
+
config does an agent have?" view) per
|
|
83
|
+
[issue #12](https://github.com/agentculture/guildmaster/issues/12). Both are
|
|
84
|
+
read-only — no `--apply`, no mutation, no drift verdict (judgment stays with
|
|
85
|
+
`steward overview` / `steward doctor`).
|
|
86
|
+
|
|
87
|
+
| Verb | What it does |
|
|
88
|
+
|------|--------------|
|
|
89
|
+
| `guild overview [--scope all\|self <agent>]` | The supplier view: the canonical skill set + versions/origins, the `docs/skill-sources.md` ledger, and drift signals (uncovered skills, per-agent kit gaps). Feeds `teach` / `onboard`. |
|
|
90
|
+
| `guild show <path-or-suffix>` | One agent's full config in one view — its detected prompt file (`CLAUDE.md` / `AGENTS.md` / `GEMINI.md`), its parallel `culture.yaml`, and its `.claude/skills` index. |
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
uv run guild overview # whole ledger + canonical set
|
|
94
|
+
uv run guild overview --scope self daria # one agent's kit + gaps
|
|
95
|
+
uv run guild show ../culture # config by path
|
|
96
|
+
uv run guild show daria # config by registered suffix
|
|
97
|
+
uv run guild show ../culture --json # structured config object
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
`guild show` resolves a registered suffix via the Culture server manifest
|
|
101
|
+
(`culture_server_yaml` in `.claude/skills.local.yaml`); pass an explicit
|
|
102
|
+
directory path to skip the lookup. Pre-cutover the ledger is still a
|
|
103
|
+
consumer-side view with no downstream column, so `overview`'s drift signals
|
|
104
|
+
activate only after the steward→guildmaster cutover — the verb says so plainly.
|
|
105
|
+
|
|
79
106
|
## Develop
|
|
80
107
|
|
|
81
108
|
```bash
|
|
@@ -32,6 +32,7 @@ vendored them during its initial scaffold
|
|
|
32
32
|
| `sonarclaude` | `steward` (`../steward/.claude/skills/sonarclaude/`) | SonarCloud API client; project key from `$SONAR_PROJECT` or `--project`. |
|
|
33
33
|
| `doc-test-alignment` | `steward` (`../steward/.claude/skills/doc-test-alignment/`) | Stub today; real implementation TBD upstream. |
|
|
34
34
|
| `pypi-maintainer` | `steward` (`../steward/.claude/skills/pypi-maintainer/`) | Switches a PyPI install between pypi / test-pypi / local. |
|
|
35
|
+
| `agent-config` | `steward` (`../steward/.claude/skills/agent-config/`) | Per-agent config view backing `guild show` ([#12](https://github.com/agentculture/guildmaster/issues/12)); `show.sh` + `data/backend-fingerprints.yaml` are vendored verbatim. **Divergence:** SKILL.md reframed from steward's alignment-judgment framing to guildmaster's inventory role and adds `type: command` for the culture backend's skill loader. |
|
|
35
36
|
|
|
36
37
|
## Inbound workflow skills (origin = `devague`, re-broadcast via `steward`)
|
|
37
38
|
|
|
@@ -35,6 +35,8 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
35
35
|
from guild.cli._commands import explain as _explain_cmd
|
|
36
36
|
from guild.cli._commands import learn as _learn_cmd
|
|
37
37
|
from guild.cli._commands import onboard as _onboard_cmd
|
|
38
|
+
from guild.cli._commands import overview as _overview_cmd
|
|
39
|
+
from guild.cli._commands import show as _show_cmd
|
|
38
40
|
from guild.cli._commands import teach as _teach_cmd
|
|
39
41
|
from guild.cli._commands import whoami as _whoami_cmd
|
|
40
42
|
|
|
@@ -54,6 +56,8 @@ def _build_parser() -> argparse.ArgumentParser:
|
|
|
54
56
|
_explain_cmd.register(sub)
|
|
55
57
|
_teach_cmd.register(sub)
|
|
56
58
|
_onboard_cmd.register(sub)
|
|
59
|
+
_overview_cmd.register(sub)
|
|
60
|
+
_show_cmd.register(sub)
|
|
57
61
|
|
|
58
62
|
return parser
|
|
59
63
|
|
|
@@ -25,6 +25,14 @@ 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
|
+
"overview": (
|
|
29
|
+
"Skills-supplier overview — the canonical skill set + versions, the "
|
|
30
|
+
"ledger view, and drift signals. Read-only; --scope all / self."
|
|
31
|
+
),
|
|
32
|
+
"show": (
|
|
33
|
+
"Show one agent's full config in a read-only view — its prompt file, "
|
|
34
|
+
"culture.yaml, and skills index. Path or registered suffix."
|
|
35
|
+
),
|
|
28
36
|
}
|
|
29
37
|
|
|
30
38
|
__all__ = ["VERBS"]
|