Interactive setup of team AI directives. Use when bootstrapping a team directives repository from scratch, cloning an existing one, pointing to a local path, or checking an existing configuration. Auto-invoked by team-boot when a project has no configured team AI directives (self-install), and available on demand via /team-setup.
npx skills add https://github.com/tikalk/adlc-team-skills --skill team-setup
team-setup is an interactive skill that guides you through setting up the team AI directives. It presents four modes, explains each option, confirms your choice, and executes the setup.
It is invoked in two ways:
/team-setup) — anytime, to configure or check a project.team-boot — automatically at session start when a project has no .adlc/init-options.json configuration (self-install), so an unconfigured project wires itself without the user knowing the command.The skill is non-destructive: it never overwrites existing files or directories. If the target path already contains a configured team AI directives, it detects this and offers the "Already configured" mode instead.
.adlc/init-options.json team_ai_directives field).team-boot when it detects an unconfigured project at session start (self-install).When team-boot invokes this skill because the project is unconfigured, the
user may choose not to set up team AI directives right now. Handle decline
explicitly to avoid a re-prompt loop:
cleanly and tell team-boot the user declined.
(build mode only), write .adlc/init-options.json with
team_ai_directives: null:
echo '{"team_ai_directives": null}' > ".adlc/init-options.json"
This marker makes team-boot skip setup silently on every future prompt.
decline is session-scoped only; tell team-boot to defer.
Set up a team AI directives using one of four modes.
Before executing any mode, validate every user-supplied value (paths, URLs, team
names). These values are interpolated into shell commands; unvalidated input is
a command-injection vector.
{DEST}, {ABSOLUTE_PATH}): reject if they contain any of , $, ;, |, &, (, ), <, >`, newline, or backslash.
Resolve to an absolute path with realpath/Resolve-Path before use.
^[A-Za-z0-9 ._-]+$. Reject anything else.https://. Reject file://, ssh://,and any non-https scheme unless the user explicitly confirms the risk.
Cloning runs no code from the repo, but the cloned content is read by agents
later — only clone repositories you trust.
If any value fails validation, report which value and why, and re-ask. Never
interpolate a user value into a Python/eval source string — pass it through the
environment (see Mode 2).
Clone an existing team-ai-directives repository from GitHub.
Explore:
https://github.com/tikalk/agentic-sdlc-team-ai-directives)https:// (reject file://, ssh://, and other schemes — see Input Validation). Only clone repositories you trust; the cloned content is read by agents later../team-ai-directives)Present:
Show the user:
Confirm:
Clone team-ai-directives from {URL} to {DEST}?
[Y/n]
Write/Execute:
git clone "{URL}" "{DEST}"
After clone, verify the team AI directives structure exists:
{DEST}/context_modules/constitution.md{DEST}/context_modules/rules/{DEST}/context_modules/personas/{DEST}/context_modules/examples/{DEST}/CDR.md{DEST}/.skills.jsonWire an existing local team-ai-directives directory into the project.
Explore:
Present:
Show the user:
Confirm:
Use existing team-ai-directives at {ABSOLUTE_PATH}?
[Y/n]
Write/Execute:
Update the project's .adlc/init-options.json to set the team_ai_directives field to the resolved path. Uses jq for safe JSON manipulation — never interpolate user input into shell source.
# Resolve to an absolute path and validate (see Input Validation)
ABSOLUTE_PATH="$(realpath "$USER_PATH")"
# Write config using jq (merge into existing or create new)
if [ -f ".adlc/init-options.json" ]; then
jq --arg p "$ABSOLUTE_PATH" '. + {team_ai_directives: $p}' ".adlc/init-options.json" > ".adlc/init-options.json.tmp" && mv ".adlc/init-options.json.tmp" ".adlc/init-options.json"
else
jq -n --arg p "$ABSOLUTE_PATH" '{team_ai_directives: $p}' > ".adlc/init-options.json"
fi
Create a fresh, neutral team AI directives at a specified path.
Explore:
./team-ai-directives)Present:
Show the user the 10 files that will be created:
| # | File | Purpose |
|---|------|---------|
| 1 | README.md | Getting started documentation |
| 2 | AGENTS.md | Agent instructions (loading order, rules, skills) |
| 3 | CDR.md | Empty CDR index table |
| 4 | .skills.json | Empty skills manifest (schema v2.0.0: default/external/blocked/policy) |
| 5 | .mcp.json.example | Empty MCP servers config example |
| 6 | context_modules/constitution.md | Placeholder constitution (OKF frontmatter) — fill via /team-constitution |
| 7 | context_modules/index.md | OKF toplevel index linking sub-directories |
| 8 | context_modules/rules/index.md | OKF progressive disclosure (rules) |
| 9 | context_modules/rules/.gitkeep | Rules directory placeholder |
| 10 | context_modules/personas/index.md | OKF progressive disclosure (personas) |
| 11 | context_modules/personas/.gitkeep | Personas directory placeholder |
| 12 | context_modules/examples/index.md | OKF progressive disclosure (examples) |
| 13 | context_modules/examples/.gitkeep | Examples directory placeholder |
| 14 | skills/.gitkeep | Skills directory placeholder |
Confirm:
Scaffold empty team-ai-directives at {DEST} with team name "{TEAM_NAME}"?
[Y/n]
Write/Execute:
Create directory structure:
mkdir -p "{DEST}/context_modules/rules"
mkdir -p "{DEST}/context_modules/personas"
mkdir -p "{DEST}/context_modules/examples"
mkdir -p "{DEST}/skills"
Create {DEST}/README.md:
# {TEAM_NAME} Team AI Directives
Team AI directives repository for {TEAM_NAME}.
## Getting Started
1. Wire this directives repository into a project:
/team-setup
Choose "Point to existing local path" and select this directory.
2. Add context modules to `context_modules/` (rules, personas, examples).
3. Add skills to `skills/` and register them in `.skills.json`.
4. Update `CDR.md` as context modules are approved.
See [ADLC Team Skills](https://github.com/tikalk/adlc-team-skills) for full documentation.
Create {DEST}/AGENTS.md:
# Agent Instructions
## Structure
- `context_modules/constitution.md` — Team constitution
- `context_modules/rules/` — Team rules and workflows
- `context_modules/personas/` — Team personas
- `context_modules/examples/` — Team examples
- `skills/` — Team skills
- `CDR.md` — Context Directive Records
## Loading Order
1. Load constitution.md first
2. Load relevant rules for the current task
3. Load relevant personas for the current task
4. Load relevant examples for the current task
## Using Skills
Skills are located in the `skills/` directory. Browse available skills using `team-skills` and install them as needed.
## CDR.md
The CDR.md file tracks approved context contributions. Update it when adding new context modules.
Create {DEST}/CDR.md:
# Context Directive Records
Context Directive Records (CDRs) track decisions about contributing context modules (rules, personas, examples, skills) to team-ai-directives.
## CDR Index
| ID | Target Module | Type | Status | Created | Verified | Age | Descriptor |
|----|---------------|------|--------|---------|----------|-----|------------|
**Stats**: 0 entries | Last Updated: {TODAY}
Create {DEST}/.skills.json:
{
"version": "2.0.0",
"source": "team-ai-directives",
"description": "Team skills manifest. The `default` list contains skill names that are auto-installed during project setup. The `external` map contains on-demand skills fetched by URL. The `blocked` list contains skills that must never be installed.",
"default": [],
"external": {},
"blocked": [],
"policy": {
"auto_install_default": true,
"enforce_blocked": true,
"allow_project_override": true
}
}
Create {DEST}/.mcp.json.example:
{
"mcpServers": {}
}
Create {DEST}/context_modules/constitution.md:
---
type: Constitution
title: "{TEAM_NAME} Constitution"
description: "Team-wide principles and governance"
resource: ./context_modules/constitution.md
tags: [constitution]
timestamp: {TODAY}T00:00:00Z
---
# {TEAM_NAME} Constitution
No team-wide principles defined yet. Add principles as they are established.
Create OKF-compliant index.md files for progressive disclosure:
Create {DEST}/context_modules/index.md:
# Context Modules
| Directory | Description |
|-----------|-------------|
| [rules/](rules/index.md) | Team rules and workflows |
| [personas/](personas/index.md) | Team personas |
| [examples/](examples/index.md) | Team examples |
Create {DEST}/context_modules/rules/index.md:
# Rules
No rules defined yet. Use `/levelup-specify` to create rules via CDRs.
Create {DEST}/context_modules/personas/index.md:
# Personas
No personas defined yet. Use `/levelup-specify` to create personas via CDRs.
Create {DEST}/context_modules/examples/index.md:
# Examples
No examples defined yet. Use `/levelup-specify` to create examples via CDRs.
Create gitkeep files:
touch "{DEST}/context_modules/rules/.gitkeep"
touch "{DEST}/context_modules/personas/.gitkeep"
touch "{DEST}/context_modules/examples/.gitkeep"
touch "{DEST}/skills/.gitkeep"
Initialize git (required for /levelup-publish branch/commit/PR flow):
cd "{DEST}" && git init && git add -A && git commit -m "Initial team-ai-directives scaffold"
Follow-up: The scaffolded context_modules/constitution.md is a placeholder ("No team-wide principles defined yet"). Tell the user:
Scaffold complete. Run /team-constitution next to establish your team's
principles interactively — it detects the placeholder and walks you through
creating the real constitution.
After scaffold, run the post-setup configuration (same as Mode 4 below).
The team AI directives is already configured. Verify and report status.
Explore:
.adlc/init-options.json for team_ai_directives fieldTEAM_AI_DIRECTIVES env var as fallbackteam-ai-directives as final fallbackPresent:
Show the user the resolved team AI directives path and validation results.
Write/Execute:
No writes needed — the team AI directives is already configured. Then run the
MCP config install (see Post-Setup Configuration step 4): merge
.mcp.json servers into the project's config if not already present.
How would you like to set up team-ai-directives?
1) Clone from GitHub — Clone an existing repository
2) Point to existing local path — Use a team AI directives you already have
3) Scaffold new empty team AI directives — Create a fresh neutral team AI directives
4) Already configured — Check existing configuration
After any mode completes successfully, update the project configuration:
team_ai_directives to .adlc/init-options.json{TEAM_AI_DIRECTIVES}/context_modules/constitution.md exists{TEAM_AI_DIRECTIVES}/.skills.json exists and is valid JSONAGENTS.md directive so agents auto-invoke team-boot at session start:# Bash
bash "$(dirname "$0")/team-helpers.sh" --inject-agents "{PROJECT_ROOT}"
# PowerShell
pwsh "$(Split-Path $PSCommandPath -Parent)/team-helpers.ps1" -InjectAgents "{PROJECT_ROOT}"
This creates or updates the project's AGENTS.md with a managed section (between <!-- TEAM_AI_DIRECTIVES START --> and <!-- TEAM_AI_DIRECTIVES END --> markers) containing:
team-boot runs automatically at session start via the event hook (for agents with event support), injecting a lean orientation into the first user message.team-boot skill before responding to any task or question."team-setup skill."ID | Name | Type | Relevance) listing genuinely matched CDRs/skills, followed by _Searched N CDR entries, M skills, J matched._Without this section, an agent without event support has no session-start instruction to load team context, and the team AI directives repository remains invisible until manually loaded. The section is idempotent: re-running team-setup or team-repair updates the section in place without duplicating content.
{TEAM_AI_DIRECTIVES}/.mcp.json if it exists, and merge its mcpServers configuration into the project's own .mcp.json or .opencode/mcp.json config. Report which servers were merged, and highlight any unresolved environment variables needed by the servers.| Rationalization | Why it's wrong | What to do instead |
|---|---|---|
| "I'll just clone it manually." | Manual cloning skips the .adlc/init-options.json wiring, so agents won't find the team AI directives. | Use Mode 1 — it clones AND configures. |
| "I already have a team AI directives directory, I'll just use it." | The directory may be incomplete (missing required files) or not wired in config. | Use Mode 2 — it validates the structure and creates the config entry. |
| "I'll just create a few files by hand." | An incomplete scaffold breaks health checks and agent discovery. | Use Mode 3 — it creates all 10 required files with valid structure. |
| "I'm sure it's already configured." | The path may be stale, moved, or the env var may point to a deleted dir. | Use Mode 4 — it validates the existing configuration. |
| "Scaffolding without a team name is fine." | The team name is used in README.md — a blank name makes the team AI directives anonymous and harder to audit. | Always provide a team name in Mode 3. |
mkdir -p but will fail on permission errors; check permissions first.team_ai_directives config write — without this field in init-options.json, agents cannot discover the team AI directives.init-options.json — always resolve to an absolute path so the config is portable across working directories.git init in Mode 3 — a scaffolded team AI directives without git cannot be used by /levelup-publish (branch/commit/PR flow). Mode 3 runs git init automatically; if you skip it, run git init manually before /levelup-publish.<!-- TEAM_AI_DIRECTIVES START --> managed section in the project's AGENTS.md, agents without event support have no session-start instruction to load team context. The .adlc/init-options.json config alone is insufficient — it tells skills where the team AI directives is, but nothing tells the agent to check. (For agents with event support, the session-start hook injects the orientation regardless, but AGENTS.md remains the fallback and the source of the Team Context in Use output contract.)os.environ) instead; string interpolation of $ABSOLUTE_PATH into a Python one-liner is a command-injection vector.https:// URL in Mode 1 — reject file:///ssh:///other schemes; cloned content is read by agents later, so only clone trusted repos..mcp.json servers stay unconfigured; the project won't have access to team-declared MCP servers.mkdir/git commit/heredocs (see Input Validation).team-boot the user declined, and offer the team_ai_directives: null opt-out marker (build mode only).{TEAM_AI_DIRECTIVES}/context_modules/constitution.md exists.{TEAM_AI_DIRECTIVES}/context_modules/rules/ exists.{TEAM_AI_DIRECTIVES}/context_modules/personas/ exists.{TEAM_AI_DIRECTIVES}/context_modules/examples/ exists.{TEAM_AI_DIRECTIVES}/CDR.md exists.{TEAM_AI_DIRECTIVES}/.skills.json exists and is valid JSON..adlc/init-options.json contains a team_ai_directives field with the absolute path.AGENTS.md exists and contains the <!-- TEAM_AI_DIRECTIVES START --> managed section with the event-hook awareness note, fallback team-boot invocation, and the Team Context in Use output contract.git rev-parse --is-inside-work-tree succeeds inside {TEAM_AI_DIRECTIVES}.team-verify (Phase 0 of team-repair) passes all 7 checks.https://).team_ai_directives via the environment (no $ABSOLUTE_PATH interpolation into Python source).{TEAM_AI_DIRECTIVES}/.mcp.json exists, any declared mcpServers were successfully merged into the project's config, and unresolved env vars were highlighted.team-boot) a user decline exited cleanly without running any mode; the persistent opt-out was offered, and team_ai_directives: null was written only in build mode.TEAM_AI_DIRECTIVES — Path to the team AI directives (overrides .adlc/init-options.json)..adlc/init-options.json — Project-level config file with team_ai_directives field.team-ai-directives/ relative to project root.team-helpers.sh / team-helpers.ps1 — Shared scripts used for scaffolding and path resolution.Factor XI (Directives as Code) — establishes a version-controlled team directives repository.
Take tikalk/team-setup from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.