guild-cli 0.2.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.4.0/.claude/skills/onboard/SKILL.md +40 -0
- guild_cli-0.4.0/.claude/skills/onboard/scripts/onboard.sh +17 -0
- guild_cli-0.4.0/.claude/skills/teach/SKILL.md +32 -0
- guild_cli-0.4.0/.claude/skills/teach/scripts/teach.sh +17 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills.local.yaml.example +2 -1
- guild_cli-0.4.0/.devague/frames/guildmaster-ships-teach-and-onboard-two-agent-firs.json +440 -0
- guild_cli-0.4.0/.devague/plans/guildmaster-ships-teach-and-onboard-two-agent-firs.json +344 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.gitignore +3 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.markdownlint-cli2.yaml +7 -0
- guild_cli-0.4.0/CHANGELOG.md +134 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/CLAUDE.md +41 -0
- guild_cli-0.4.0/PKG-INFO +140 -0
- guild_cli-0.4.0/README.md +122 -0
- guild_cli-0.4.0/docs/cutover.md +43 -0
- guild_cli-0.4.0/docs/plans/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +87 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/docs/skill-sources.md +1 -0
- guild_cli-0.4.0/docs/specs/2026-05-24-guildmaster-ships-teach-and-onboard-two-agent-firs.md +75 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/guild/cli/__init__.py +8 -0
- guild_cli-0.4.0/guild/cli/_commands/__init__.py +38 -0
- guild_cli-0.4.0/guild/cli/_commands/_broadcast.py +92 -0
- guild_cli-0.4.0/guild/cli/_commands/onboard.py +178 -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.4.0/guild/cli/_commands/teach.py +158 -0
- guild_cli-0.4.0/guild/skills/__init__.py +28 -0
- guild_cli-0.4.0/guild/skills/identity.py +85 -0
- guild_cli-0.4.0/guild/skills/ledger.py +383 -0
- guild_cli-0.4.0/guild/skills/render.py +127 -0
- guild_cli-0.4.0/guild/skills/sources.py +103 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/pyproject.toml +1 -1
- guild_cli-0.4.0/tests/test_broadcast_post.py +47 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/tests/test_cli_explain.py +11 -0
- guild_cli-0.4.0/tests/test_cli_onboard.py +127 -0
- 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.4.0/tests/test_cli_teach.py +112 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/tests/test_skills_convention.py +2 -0
- guild_cli-0.4.0/tests/test_skills_identity.py +108 -0
- guild_cli-0.4.0/tests/test_skills_ledger.py +256 -0
- guild_cli-0.4.0/tests/test_skills_render.py +102 -0
- guild_cli-0.4.0/tests/test_skills_sources.py +170 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/uv.lock +1 -1
- guild_cli-0.2.0/CHANGELOG.md +0 -64
- guild_cli-0.2.0/PKG-INFO +0 -82
- guild_cli-0.2.0/README.md +0 -64
- guild_cli-0.2.0/guild/cli/_commands/__init__.py +0 -22
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/assign-to-workforce/SKILL.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/assign-to-workforce/scripts/assign-to-workforce.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/cicd/SKILL.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/_resolve-nick.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/portability-lint.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/pr-reply.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/pr-status.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/cicd/scripts/workflow.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/communicate/SKILL.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/fetch-issues.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/mesh-message.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/post-comment.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/post-issue.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/templates/skill-new-brief.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/communicate/scripts/templates/skill-update-brief.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/doc-test-alignment/SKILL.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/doc-test-alignment/scripts/check.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/pypi-maintainer/SKILL.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/pypi-maintainer/scripts/switch-source.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/run-tests/SKILL.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/run-tests/scripts/test.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/sonarclaude/SKILL.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/sonarclaude/scripts/sonar.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/spec-to-plan/SKILL.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/spec-to-plan/scripts/spec-to-plan.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/think/SKILL.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/think/scripts/think.sh +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/version-bump/SKILL.md +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.claude/skills/version-bump/scripts/bump.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.flake8 +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.github/workflows/publish.yml +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/.github/workflows/tests.yml +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/LICENSE +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/culture.yaml +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/guild/__init__.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/guild/__main__.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/guild/cli/_commands/explain.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/guild/cli/_commands/learn.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/guild/cli/_commands/whoami.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/guild/cli/_errors.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/guild/cli/_output.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/guild/cli/_repo.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/tests/__init__.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/tests/test_cli.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/tests/test_cli_learn.py +0 -0
- {guild_cli-0.2.0 → guild_cli-0.4.0}/tests/test_cli_whoami.py +0 -0
- {guild_cli-0.2.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
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: onboard
|
|
3
|
+
description: Onboard a brand-new sibling agent into the AgentCulture mesh — guildmaster's new-agent ceremony for supplier operators. Files ONE consolidated issue (full canonical kit as per-skill sections + an identity-setup section), registers the agent in the ledger, and records the pins it should vendor. Dry-run by default; --apply files. Use when an operator says "onboard a new agent/sibling" or "welcome a new repo to the mesh".
|
|
4
|
+
type: command
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# onboard — welcome a brand-new sibling agent
|
|
8
|
+
|
|
9
|
+
`onboard` is guildmaster's new-agent ceremony, for **supplier operators**
|
|
10
|
+
bringing a brand-new **sibling repo** into the mesh. It wraps the
|
|
11
|
+
`guild onboard` CLI verb.
|
|
12
|
+
|
|
13
|
+
It is `teach` of the **whole canonical kit** in new framing, plus the
|
|
14
|
+
new-agent bookkeeping:
|
|
15
|
+
|
|
16
|
+
- one consolidated GitHub issue — every canonical skill as a per-skill section
|
|
17
|
+
(inbound skills, e.g. the devague trio, carry an origin-attribution block) —
|
|
18
|
+
followed by an **identity-setup section** (culture.yaml + backend + prompt
|
|
19
|
+
file, so the sibling passes `steward doctor`);
|
|
20
|
+
- **ledger registration** — the agent is added to `docs/skill-sources.md` as a
|
|
21
|
+
downstream consumer of every canonical skill (idempotent);
|
|
22
|
+
- a **verification record** — the pins the sibling is expected to vendor.
|
|
23
|
+
|
|
24
|
+
**Dry-run by default**: it renders the issue, the ledger diff it *would* apply,
|
|
25
|
+
and the verification record — writing nothing. `--apply` files the issue, writes
|
|
26
|
+
the ledger, and records the pins. Going live is gated on the steward→guildmaster
|
|
27
|
+
cutover (`docs/cutover.md`).
|
|
28
|
+
|
|
29
|
+
## How to run
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Render the full onboarding ceremony (dry-run):
|
|
33
|
+
bash .claude/skills/onboard/scripts/onboard.sh --agent agentculture/newsib
|
|
34
|
+
|
|
35
|
+
# Commit it — file the issue, write the ledger, record the pins:
|
|
36
|
+
bash .claude/skills/onboard/scripts/onboard.sh --agent agentculture/newsib --apply
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
A bare `--agent` name gets the `--org` prefix (default `agentculture`).
|
|
40
|
+
`--json` emits a structured payload.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
# onboard — forward to `guild onboard`, resolving the CLI portably.
|
|
4
|
+
#
|
|
5
|
+
# Prefers an installed `guild` on PATH (the normal case), falling back to
|
|
6
|
+
# `uv run guild` inside a source checkout. Every argument is forwarded verbatim.
|
|
7
|
+
# Dry-run is the CLI's default; pass --apply to file the issue + write the
|
|
8
|
+
# ledger + record the pins.
|
|
9
|
+
|
|
10
|
+
if command -v guild >/dev/null 2>&1; then
|
|
11
|
+
exec guild onboard "$@"
|
|
12
|
+
elif command -v uv >/dev/null 2>&1; then
|
|
13
|
+
exec uv run guild onboard "$@"
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
echo "guild not found on PATH. Install it: uv tool install guild-cli" >&2
|
|
17
|
+
exit 2
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: teach
|
|
3
|
+
description: Teach a set of skills to a set of AgentCulture mesh agents — guildmaster's supplier verb for operators propagating skills to sibling agents. Files one agent-major GitHub issue per target (per-skill sections bundled), new-vs-resync auto-detected from the ledger. Dry-run by default; --apply files. Use when an operator says "teach these skills to those agents", "broadcast a skill update", or "resync vendored skills".
|
|
4
|
+
type: command
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# teach — propagate a set of skills to a set of mesh agents
|
|
8
|
+
|
|
9
|
+
`teach` is guildmaster's supplier verb. The audience is **supplier operators**
|
|
10
|
+
(guildmaster itself; steward during the transition) targeting **sibling repos**
|
|
11
|
+
in the mesh. It wraps the `guild teach` CLI verb.
|
|
12
|
+
|
|
13
|
+
It is **agent-major**: one GitHub issue per target agent, bundling a per-skill
|
|
14
|
+
*section* for every skill that agent receives — not one issue per skill.
|
|
15
|
+
New-vs-resync framing is auto-detected per `(skill, agent)` from
|
|
16
|
+
`docs/skill-sources.md`. **Dry-run by default**; pass `--apply` to file the
|
|
17
|
+
issues. Going live is gated on the steward→guildmaster cutover (`docs/cutover.md`).
|
|
18
|
+
|
|
19
|
+
## How to run
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Render (dry-run) — what would be filed, nothing posted:
|
|
23
|
+
bash .claude/skills/teach/scripts/teach.sh --skill cicd --skill communicate --to tipalti
|
|
24
|
+
|
|
25
|
+
# Teach the full canonical kit to two agents and file the issues:
|
|
26
|
+
bash .claude/skills/teach/scripts/teach.sh --all --to daria --to tipalti --apply
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Skills must be selected explicitly (`--skill`, repeatable, or `--all`) — there
|
|
30
|
+
is no implicit default. Targets come from `--to` (bare names get `--org`,
|
|
31
|
+
default `agentculture`), falling back to the ledger's current consumers per
|
|
32
|
+
skill when `--to` is omitted. `--json` emits a structured payload.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
# teach — forward to `guild teach`, resolving the CLI portably.
|
|
4
|
+
#
|
|
5
|
+
# Prefers an installed `guild` on PATH (the normal case), falling back to
|
|
6
|
+
# `uv run guild` inside a source checkout. Every argument is forwarded verbatim,
|
|
7
|
+
# so this wrapper exists only for portable resolution + discoverability as a
|
|
8
|
+
# skill. Dry-run is the CLI's default; pass --apply to file issues.
|
|
9
|
+
|
|
10
|
+
if command -v guild >/dev/null 2>&1; then
|
|
11
|
+
exec guild teach "$@"
|
|
12
|
+
elif command -v uv >/dev/null 2>&1; then
|
|
13
|
+
exec uv run guild teach "$@"
|
|
14
|
+
fi
|
|
15
|
+
|
|
16
|
+
echo "guild not found on PATH. Install it: uv tool install guild-cli" >&2
|
|
17
|
+
exit 2
|
|
@@ -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,
|