teamcast 0.6.0
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.
- package/LICENSE +21 -0
- package/README.md +654 -0
- package/dist/application/build-generated-files.d.ts +8 -0
- package/dist/application/build-generated-files.d.ts.map +1 -0
- package/dist/application/build-generated-files.js +16 -0
- package/dist/application/build-generated-files.js.map +1 -0
- package/dist/application/team.d.ts +27 -0
- package/dist/application/team.d.ts.map +1 -0
- package/dist/application/team.js +203 -0
- package/dist/application/team.js.map +1 -0
- package/dist/application/validate-team.d.ts +32 -0
- package/dist/application/validate-team.d.ts.map +1 -0
- package/dist/application/validate-team.js +132 -0
- package/dist/application/validate-team.js.map +1 -0
- package/dist/cli/diff.d.ts +3 -0
- package/dist/cli/diff.d.ts.map +1 -0
- package/dist/cli/diff.js +57 -0
- package/dist/cli/diff.js.map +1 -0
- package/dist/cli/explain.d.ts +3 -0
- package/dist/cli/explain.d.ts.map +1 -0
- package/dist/cli/explain.js +29 -0
- package/dist/cli/explain.js.map +1 -0
- package/dist/cli/generate.d.ts +3 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +68 -0
- package/dist/cli/generate.js.map +1 -0
- package/dist/cli/import.d.ts +3 -0
- package/dist/cli/import.d.ts.map +1 -0
- package/dist/cli/import.js +93 -0
- package/dist/cli/import.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +3 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +155 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/cli/manage.d.ts +3 -0
- package/dist/cli/manage.d.ts.map +1 -0
- package/dist/cli/manage.js +350 -0
- package/dist/cli/manage.js.map +1 -0
- package/dist/cli/manifest-validation.d.ts +13 -0
- package/dist/cli/manifest-validation.d.ts.map +1 -0
- package/dist/cli/manifest-validation.js +38 -0
- package/dist/cli/manifest-validation.js.map +1 -0
- package/dist/cli/reset.d.ts +3 -0
- package/dist/cli/reset.d.ts.map +1 -0
- package/dist/cli/reset.js +116 -0
- package/dist/cli/reset.js.map +1 -0
- package/dist/cli/validate.d.ts +3 -0
- package/dist/cli/validate.d.ts.map +1 -0
- package/dist/cli/validate.js +48 -0
- package/dist/cli/validate.js.map +1 -0
- package/dist/components/agent-fragments.d.ts +15 -0
- package/dist/components/agent-fragments.d.ts.map +1 -0
- package/dist/components/agent-fragments.js +163 -0
- package/dist/components/agent-fragments.js.map +1 -0
- package/dist/components/policy-fragments.d.ts +5 -0
- package/dist/components/policy-fragments.d.ts.map +1 -0
- package/dist/components/policy-fragments.js +125 -0
- package/dist/components/policy-fragments.js.map +1 -0
- package/dist/core/assertions.d.ts +28 -0
- package/dist/core/assertions.d.ts.map +1 -0
- package/dist/core/assertions.js +11 -0
- package/dist/core/assertions.js.map +1 -0
- package/dist/core/guards.d.ts +11 -0
- package/dist/core/guards.d.ts.map +1 -0
- package/dist/core/guards.js +20 -0
- package/dist/core/guards.js.map +1 -0
- package/dist/core/index.d.ts +9 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +9 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/instructions.d.ts +10 -0
- package/dist/core/instructions.d.ts.map +1 -0
- package/dist/core/instructions.js +33 -0
- package/dist/core/instructions.js.map +1 -0
- package/dist/core/permissions.d.ts +10 -0
- package/dist/core/permissions.d.ts.map +1 -0
- package/dist/core/permissions.js +67 -0
- package/dist/core/permissions.js.map +1 -0
- package/dist/core/policy-evaluator.d.ts +5 -0
- package/dist/core/policy-evaluator.d.ts.map +1 -0
- package/dist/core/policy-evaluator.js +161 -0
- package/dist/core/policy-evaluator.js.map +1 -0
- package/dist/core/skill-resolver.d.ts +8 -0
- package/dist/core/skill-resolver.d.ts.map +1 -0
- package/dist/core/skill-resolver.js +17 -0
- package/dist/core/skill-resolver.js.map +1 -0
- package/dist/core/skills.d.ts +4 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +14 -0
- package/dist/core/skills.js.map +1 -0
- package/dist/core/types.d.ts +117 -0
- package/dist/core/types.d.ts.map +1 -0
- package/dist/core/types.js +6 -0
- package/dist/core/types.js.map +1 -0
- package/dist/detector/index.d.ts +7 -0
- package/dist/detector/index.d.ts.map +1 -0
- package/dist/detector/index.js +57 -0
- package/dist/detector/index.js.map +1 -0
- package/dist/diff/index.d.ts +10 -0
- package/dist/diff/index.d.ts.map +1 -0
- package/dist/diff/index.js +26 -0
- package/dist/diff/index.js.map +1 -0
- package/dist/explainer/index.d.ts +3 -0
- package/dist/explainer/index.d.ts.map +1 -0
- package/dist/explainer/index.js +85 -0
- package/dist/explainer/index.js.map +1 -0
- package/dist/generator/file-policies.d.ts +2 -0
- package/dist/generator/file-policies.d.ts.map +1 -0
- package/dist/generator/file-policies.js +4 -0
- package/dist/generator/file-policies.js.map +1 -0
- package/dist/generator/index.d.ts +5 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +10 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/renderers/agent-md.d.ts +5 -0
- package/dist/generator/renderers/agent-md.d.ts.map +1 -0
- package/dist/generator/renderers/agent-md.js +66 -0
- package/dist/generator/renderers/agent-md.js.map +1 -0
- package/dist/generator/renderers/agents-md.d.ts +4 -0
- package/dist/generator/renderers/agents-md.d.ts.map +1 -0
- package/dist/generator/renderers/agents-md.js +86 -0
- package/dist/generator/renderers/agents-md.js.map +1 -0
- package/dist/generator/renderers/claude-md.d.ts +4 -0
- package/dist/generator/renderers/claude-md.d.ts.map +1 -0
- package/dist/generator/renderers/claude-md.js +68 -0
- package/dist/generator/renderers/claude-md.js.map +1 -0
- package/dist/generator/renderers/codex-config.d.ts +4 -0
- package/dist/generator/renderers/codex-config.d.ts.map +1 -0
- package/dist/generator/renderers/codex-config.js +145 -0
- package/dist/generator/renderers/codex-config.js.map +1 -0
- package/dist/generator/renderers/codex-skill-md.d.ts +4 -0
- package/dist/generator/renderers/codex-skill-md.d.ts.map +1 -0
- package/dist/generator/renderers/codex-skill-md.js +47 -0
- package/dist/generator/renderers/codex-skill-md.js.map +1 -0
- package/dist/generator/renderers/settings-json.d.ts +5 -0
- package/dist/generator/renderers/settings-json.d.ts.map +1 -0
- package/dist/generator/renderers/settings-json.js +100 -0
- package/dist/generator/renderers/settings-json.js.map +1 -0
- package/dist/generator/renderers/skill-md.d.ts +4 -0
- package/dist/generator/renderers/skill-md.d.ts.map +1 -0
- package/dist/generator/renderers/skill-md.js +44 -0
- package/dist/generator/renderers/skill-md.js.map +1 -0
- package/dist/generator/state.d.ts +14 -0
- package/dist/generator/state.d.ts.map +1 -0
- package/dist/generator/state.js +76 -0
- package/dist/generator/state.js.map +1 -0
- package/dist/generator/targets/claude.d.ts +3 -0
- package/dist/generator/targets/claude.d.ts.map +1 -0
- package/dist/generator/targets/claude.js +24 -0
- package/dist/generator/targets/claude.js.map +1 -0
- package/dist/generator/targets/codex.d.ts +3 -0
- package/dist/generator/targets/codex.d.ts.map +1 -0
- package/dist/generator/targets/codex.js +19 -0
- package/dist/generator/targets/codex.js.map +1 -0
- package/dist/generator/targets/index.d.ts +4 -0
- package/dist/generator/targets/index.d.ts.map +1 -0
- package/dist/generator/targets/index.js +10 -0
- package/dist/generator/targets/index.js.map +1 -0
- package/dist/generator/targets/types.d.ts +8 -0
- package/dist/generator/targets/types.d.ts.map +1 -0
- package/dist/generator/targets/types.js +2 -0
- package/dist/generator/targets/types.js.map +1 -0
- package/dist/generator/types.d.ts +11 -0
- package/dist/generator/types.d.ts.map +1 -0
- package/dist/generator/types.js +2 -0
- package/dist/generator/types.js.map +1 -0
- package/dist/generator/writer.d.ts +5 -0
- package/dist/generator/writer.d.ts.map +1 -0
- package/dist/generator/writer.js +14 -0
- package/dist/generator/writer.js.map +1 -0
- package/dist/importer/index.d.ts +12 -0
- package/dist/importer/index.d.ts.map +1 -0
- package/dist/importer/index.js +295 -0
- package/dist/importer/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +25 -0
- package/dist/index.js.map +1 -0
- package/dist/manifest/compat.d.ts +6 -0
- package/dist/manifest/compat.d.ts.map +1 -0
- package/dist/manifest/compat.js +56 -0
- package/dist/manifest/compat.js.map +1 -0
- package/dist/manifest/defaults.d.ts +4 -0
- package/dist/manifest/defaults.d.ts.map +1 -0
- package/dist/manifest/defaults.js +28 -0
- package/dist/manifest/defaults.js.map +1 -0
- package/dist/manifest/normalize.d.ts +14 -0
- package/dist/manifest/normalize.d.ts.map +1 -0
- package/dist/manifest/normalize.js +353 -0
- package/dist/manifest/normalize.js.map +1 -0
- package/dist/manifest/reader.d.ts +7 -0
- package/dist/manifest/reader.d.ts.map +1 -0
- package/dist/manifest/reader.js +36 -0
- package/dist/manifest/reader.js.map +1 -0
- package/dist/manifest/schema-validator.d.ts +13 -0
- package/dist/manifest/schema-validator.d.ts.map +1 -0
- package/dist/manifest/schema-validator.js +33 -0
- package/dist/manifest/schema-validator.js.map +1 -0
- package/dist/manifest/types.d.ts +150 -0
- package/dist/manifest/types.d.ts.map +1 -0
- package/dist/manifest/types.js +4 -0
- package/dist/manifest/types.js.map +1 -0
- package/dist/manifest/writer.d.ts +3 -0
- package/dist/manifest/writer.d.ts.map +1 -0
- package/dist/manifest/writer.js +10 -0
- package/dist/manifest/writer.js.map +1 -0
- package/dist/presets/index.d.ts +6 -0
- package/dist/presets/index.d.ts.map +1 -0
- package/dist/presets/index.js +56 -0
- package/dist/presets/index.js.map +1 -0
- package/dist/presets/types.d.ts +12 -0
- package/dist/presets/types.d.ts.map +1 -0
- package/dist/presets/types.js +2 -0
- package/dist/presets/types.js.map +1 -0
- package/dist/renderers/claude/agent-md.d.ts +5 -0
- package/dist/renderers/claude/agent-md.d.ts.map +1 -0
- package/dist/renderers/claude/agent-md.js +45 -0
- package/dist/renderers/claude/agent-md.js.map +1 -0
- package/dist/renderers/claude/docs.d.ts +5 -0
- package/dist/renderers/claude/docs.d.ts.map +1 -0
- package/dist/renderers/claude/docs.js +155 -0
- package/dist/renderers/claude/docs.js.map +1 -0
- package/dist/renderers/claude/index.d.ts +5 -0
- package/dist/renderers/claude/index.d.ts.map +1 -0
- package/dist/renderers/claude/index.js +23 -0
- package/dist/renderers/claude/index.js.map +1 -0
- package/dist/renderers/claude/policy-mapper.d.ts +10 -0
- package/dist/renderers/claude/policy-mapper.d.ts.map +1 -0
- package/dist/renderers/claude/policy-mapper.js +40 -0
- package/dist/renderers/claude/policy-mapper.js.map +1 -0
- package/dist/renderers/claude/settings.d.ts +5 -0
- package/dist/renderers/claude/settings.d.ts.map +1 -0
- package/dist/renderers/claude/settings.js +77 -0
- package/dist/renderers/claude/settings.js.map +1 -0
- package/dist/renderers/claude/skill-map.d.ts +16 -0
- package/dist/renderers/claude/skill-map.d.ts.map +1 -0
- package/dist/renderers/claude/skill-map.js +39 -0
- package/dist/renderers/claude/skill-map.js.map +1 -0
- package/dist/renderers/claude/skill-md.d.ts +4 -0
- package/dist/renderers/claude/skill-md.d.ts.map +1 -0
- package/dist/renderers/claude/skill-md.js +35 -0
- package/dist/renderers/claude/skill-md.js.map +1 -0
- package/dist/renderers/claude/tools.d.ts +4 -0
- package/dist/renderers/claude/tools.d.ts.map +1 -0
- package/dist/renderers/claude/tools.js +12 -0
- package/dist/renderers/claude/tools.js.map +1 -0
- package/dist/renderers/index.d.ts +3 -0
- package/dist/renderers/index.d.ts.map +1 -0
- package/dist/renderers/index.js +2 -0
- package/dist/renderers/index.js.map +1 -0
- package/dist/renderers/types.d.ts +12 -0
- package/dist/renderers/types.d.ts.map +1 -0
- package/dist/renderers/types.js +2 -0
- package/dist/renderers/types.js.map +1 -0
- package/dist/team-templates/policies.d.ts +4 -0
- package/dist/team-templates/policies.d.ts.map +1 -0
- package/dist/team-templates/policies.js +69 -0
- package/dist/team-templates/policies.js.map +1 -0
- package/dist/team-templates/presets.d.ts +6 -0
- package/dist/team-templates/presets.d.ts.map +1 -0
- package/dist/team-templates/presets.js +14 -0
- package/dist/team-templates/presets.js.map +1 -0
- package/dist/team-templates/roles.d.ts +22 -0
- package/dist/team-templates/roles.d.ts.map +1 -0
- package/dist/team-templates/roles.js +117 -0
- package/dist/team-templates/roles.js.map +1 -0
- package/dist/types/manifest.d.ts +11 -0
- package/dist/types/manifest.d.ts.map +1 -0
- package/dist/types/manifest.js +16 -0
- package/dist/types/manifest.js.map +1 -0
- package/dist/utils/chalk-helpers.d.ts +18 -0
- package/dist/utils/chalk-helpers.d.ts.map +1 -0
- package/dist/utils/chalk-helpers.js +51 -0
- package/dist/utils/chalk-helpers.js.map +1 -0
- package/dist/utils/prompts.d.ts +28 -0
- package/dist/utils/prompts.d.ts.map +1 -0
- package/dist/utils/prompts.js +51 -0
- package/dist/utils/prompts.js.map +1 -0
- package/dist/validator/checks/handoff-graph.d.ts +5 -0
- package/dist/validator/checks/handoff-graph.d.ts.map +1 -0
- package/dist/validator/checks/handoff-graph.js +65 -0
- package/dist/validator/checks/handoff-graph.js.map +1 -0
- package/dist/validator/checks/instruction-blocks.d.ts +5 -0
- package/dist/validator/checks/instruction-blocks.d.ts.map +1 -0
- package/dist/validator/checks/instruction-blocks.js +45 -0
- package/dist/validator/checks/instruction-blocks.js.map +1 -0
- package/dist/validator/checks/role-warnings.d.ts +5 -0
- package/dist/validator/checks/role-warnings.d.ts.map +1 -0
- package/dist/validator/checks/role-warnings.js +50 -0
- package/dist/validator/checks/role-warnings.js.map +1 -0
- package/dist/validator/checks/security-baseline.d.ts +3 -0
- package/dist/validator/checks/security-baseline.d.ts.map +1 -0
- package/dist/validator/checks/security-baseline.js +73 -0
- package/dist/validator/checks/security-baseline.js.map +1 -0
- package/dist/validator/checks/tool-conflicts.d.ts +5 -0
- package/dist/validator/checks/tool-conflicts.d.ts.map +1 -0
- package/dist/validator/checks/tool-conflicts.js +33 -0
- package/dist/validator/checks/tool-conflicts.js.map +1 -0
- package/dist/validator/index.d.ts +5 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +28 -0
- package/dist/validator/index.js.map +1 -0
- package/dist/validator/reporter.d.ts +4 -0
- package/dist/validator/reporter.d.ts.map +1 -0
- package/dist/validator/reporter.js +76 -0
- package/dist/validator/reporter.js.map +1 -0
- package/dist/validator/types.d.ts +10 -0
- package/dist/validator/types.d.ts.map +1 -0
- package/dist/validator/types.js +2 -0
- package/dist/validator/types.js.map +1 -0
- package/dist/wizard/index.d.ts +7 -0
- package/dist/wizard/index.d.ts.map +1 -0
- package/dist/wizard/index.js +57 -0
- package/dist/wizard/index.js.map +1 -0
- package/dist/wizard/steps/agent-customization.d.ts +5 -0
- package/dist/wizard/steps/agent-customization.d.ts.map +1 -0
- package/dist/wizard/steps/agent-customization.js +68 -0
- package/dist/wizard/steps/agent-customization.js.map +1 -0
- package/dist/wizard/steps/confirm-generate.d.ts +3 -0
- package/dist/wizard/steps/confirm-generate.d.ts.map +1 -0
- package/dist/wizard/steps/confirm-generate.js +19 -0
- package/dist/wizard/steps/confirm-generate.js.map +1 -0
- package/dist/wizard/steps/custom-team.d.ts +3 -0
- package/dist/wizard/steps/custom-team.d.ts.map +1 -0
- package/dist/wizard/steps/custom-team.js +17 -0
- package/dist/wizard/steps/custom-team.js.map +1 -0
- package/dist/wizard/steps/project-context.d.ts +6 -0
- package/dist/wizard/steps/project-context.d.ts.map +1 -0
- package/dist/wizard/steps/project-context.js +24 -0
- package/dist/wizard/steps/project-context.js.map +1 -0
- package/dist/wizard/steps/team-selection.d.ts +5 -0
- package/dist/wizard/steps/team-selection.d.ts.map +1 -0
- package/dist/wizard/steps/team-selection.js +44 -0
- package/dist/wizard/steps/team-selection.js.map +1 -0
- package/package.json +56 -0
- package/schema/teamcast.schema.json +580 -0
- package/templates/presets/feature-team.yaml +77 -0
- package/templates/presets/research-and-build.yaml +69 -0
- package/templates/presets/secure-dev.yaml +93 -0
- package/templates/presets/solo-dev.yaml +32 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Mykola Vozniuk
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,654 @@
|
|
|
1
|
+
# TeamCast
|
|
2
|
+
|
|
3
|
+
CLI to design, generate, and validate Claude Code subagents from a single manifest.
|
|
4
|
+
|
|
5
|
+
Define your subagents in one `teamcast.yaml` file. TeamCast generates Claude Code config files, validates the configuration, and keeps generated output in sync with the manifest.
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install -g teamcast
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Or run without installing:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx teamcast <command>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Initialize a new team with the interactive wizard
|
|
23
|
+
teamcast init
|
|
24
|
+
|
|
25
|
+
# Or skip the wizard and use a preset directly
|
|
26
|
+
teamcast init --preset feature-team
|
|
27
|
+
|
|
28
|
+
# Generate Claude Code config files from teamcast.yaml
|
|
29
|
+
teamcast generate
|
|
30
|
+
|
|
31
|
+
# Validate the manifest
|
|
32
|
+
teamcast validate
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
After `generate`, your project will have:
|
|
36
|
+
- `.claude/agents/<name>.md` - one file per agent
|
|
37
|
+
- `.claude/skills/<skill>/SKILL.md` - one stub file per unique skill
|
|
38
|
+
- `.claude/settings.json` - permissions and sandbox config
|
|
39
|
+
- `.claude/settings.local.json` - local Claude settings when enabled
|
|
40
|
+
- `CLAUDE.md` - team documentation for Claude Code
|
|
41
|
+
- `AGENTS.md` - universal AI agent documentation
|
|
42
|
+
|
|
43
|
+
## Native Claude Code Model
|
|
44
|
+
|
|
45
|
+
TeamCast now uses a canonical agent shape that separates:
|
|
46
|
+
|
|
47
|
+
- `agents.<name>.claude` - native Claude Code subagent runtime fields
|
|
48
|
+
- `agents.<name>.forge` - TeamCast-only metadata such as delegation graph
|
|
49
|
+
|
|
50
|
+
Legacy flat manifests are still accepted and normalized automatically, but new writes use the canonical shape.
|
|
51
|
+
|
|
52
|
+
## Command Summary
|
|
53
|
+
|
|
54
|
+
| Command | Description |
|
|
55
|
+
|---------|-------------|
|
|
56
|
+
| `init` | Initialize `teamcast.yaml` and generate files |
|
|
57
|
+
| `generate` | Generate Claude Code files from `teamcast.yaml` |
|
|
58
|
+
| `validate` | Validate the team configuration |
|
|
59
|
+
| `validate --format json` | Machine-readable validation output for CI pipelines |
|
|
60
|
+
| `explain` | Print a human-readable view of the team architecture |
|
|
61
|
+
| `diff` | Show what generated files would change |
|
|
62
|
+
| `add agent <name>` | Add a new agent |
|
|
63
|
+
| `edit agent <name>` | Edit an existing agent |
|
|
64
|
+
| `remove agent <name>` | Remove an agent and clean up handoffs |
|
|
65
|
+
| `create skill <name>` | Create a new skill and assign it to one agent |
|
|
66
|
+
| `assign skill <name>` | Assign an existing skill to more agents |
|
|
67
|
+
| `import` | Import an existing `.claude/` setup into `teamcast.yaml` |
|
|
68
|
+
| `reset` | Delete generated files, keep `teamcast.yaml` |
|
|
69
|
+
| `clean` | Delete generated files and `teamcast.yaml` |
|
|
70
|
+
|
|
71
|
+
Useful options:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
teamcast init --preset <name> # skip wizard and use a preset
|
|
75
|
+
teamcast init --from <path> # initialize from an existing YAML file
|
|
76
|
+
teamcast init --yes # non-interactive init, uses defaults
|
|
77
|
+
teamcast generate --dry-run # preview generated files without writing
|
|
78
|
+
teamcast validate --strict # fail on warnings as well as errors
|
|
79
|
+
teamcast validate --format json # JSON output, useful in CI scripts
|
|
80
|
+
teamcast import --yes # skip import confirmation
|
|
81
|
+
teamcast reset --yes # skip reset confirmation
|
|
82
|
+
teamcast clean --yes # skip clean confirmation
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Presets
|
|
86
|
+
|
|
87
|
+
| Preset | Description |
|
|
88
|
+
|--------|-------------|
|
|
89
|
+
| `feature-team` | orchestrator -> planner -> developer -> reviewer |
|
|
90
|
+
| `solo-dev` | single developer agent with broad tool access |
|
|
91
|
+
| `research-and-build` | orchestrator -> researcher -> planner -> developer |
|
|
92
|
+
| `secure-dev` | orchestrator -> planner -> developer -> security-auditor -> reviewer |
|
|
93
|
+
|
|
94
|
+
The built-in preset files live in `templates/presets/` and are valid TeamCast YAML. Use them as a reference when creating custom presets, or copy one as a starting point:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
cp node_modules/teamcast/templates/presets/feature-team.yaml ./my-team.yaml
|
|
98
|
+
teamcast init --from ./my-team.yaml
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
## Flows
|
|
102
|
+
|
|
103
|
+
### `init`
|
|
104
|
+
|
|
105
|
+
`teamcast init` creates a fresh `teamcast.yaml`, validates it, and generates all output files.
|
|
106
|
+
|
|
107
|
+
Interactive wizard flow:
|
|
108
|
+
|
|
109
|
+
1. `Project name:`
|
|
110
|
+
- default is auto-detected from the current directory
|
|
111
|
+
- must match lowercase letters, numbers, and hyphens
|
|
112
|
+
2. `How do you want to set up your agent team?`
|
|
113
|
+
- `Use a preset`
|
|
114
|
+
- `Custom team`
|
|
115
|
+
- `Single agent`
|
|
116
|
+
3. If you choose `Use a preset`:
|
|
117
|
+
- `Select a preset:`
|
|
118
|
+
4. If you choose `Custom team`:
|
|
119
|
+
- `Select roles for your team:`
|
|
120
|
+
- available roles: `orchestrator`, `planner`, `researcher`, `developer`, `tester`, `reviewer`, `security-auditor`
|
|
121
|
+
- if `orchestrator` is selected with other roles, handoffs are auto-wired to the other selected agents
|
|
122
|
+
5. `Customize agents before generating?`
|
|
123
|
+
- if yes, each agent gets:
|
|
124
|
+
- `Model for <agent>:`
|
|
125
|
+
6. Preview:
|
|
126
|
+
- shows the files that will be created
|
|
127
|
+
- asks `Generate these files?`
|
|
128
|
+
|
|
129
|
+
Important limitations of the wizard:
|
|
130
|
+
|
|
131
|
+
- It does not let you rename individual agents.
|
|
132
|
+
- It does not ask for custom `claude.instructions`.
|
|
133
|
+
- It does not ask for custom `claude.skills`, `forge.handoffs`, `claude.max_turns`, or exact tool lists.
|
|
134
|
+
- Those values come from built-in presets or role templates.
|
|
135
|
+
- If you want deeper customization, edit `teamcast.yaml` after init and run `teamcast generate`.
|
|
136
|
+
|
|
137
|
+
Non-interactive `init` flows:
|
|
138
|
+
|
|
139
|
+
- `teamcast init --preset <name>`
|
|
140
|
+
- skips the wizard
|
|
141
|
+
- loads the preset
|
|
142
|
+
- uses the detected directory name as `project.name`
|
|
143
|
+
- writes `teamcast.yaml`
|
|
144
|
+
- generates files immediately
|
|
145
|
+
- `teamcast init --from ./my-team.yaml`
|
|
146
|
+
- loads a custom YAML file
|
|
147
|
+
- validates schema and manifest rules
|
|
148
|
+
- writes `teamcast.yaml`
|
|
149
|
+
- generates files immediately
|
|
150
|
+
- `teamcast init --yes`
|
|
151
|
+
- runs wizard defaults without prompts
|
|
152
|
+
- uses detected project name
|
|
153
|
+
- uses the `feature-team` preset
|
|
154
|
+
- skips final confirmation
|
|
155
|
+
|
|
156
|
+
### `add agent <name>`
|
|
157
|
+
|
|
158
|
+
`teamcast add agent <name>` adds a new agent to an existing manifest, writes `teamcast.yaml`, then regenerates all files.
|
|
159
|
+
|
|
160
|
+
Two modes are supported:
|
|
161
|
+
|
|
162
|
+
- `teamcast add agent <name>`
|
|
163
|
+
- creates a custom agent from a short interactive flow
|
|
164
|
+
- `teamcast add agent <name> --template <role>`
|
|
165
|
+
- creates an agent from a built-in role template
|
|
166
|
+
|
|
167
|
+
Interactive questions for `add agent <name>`:
|
|
168
|
+
|
|
169
|
+
1. `Agent description (when should Claude delegate to this agent?):`
|
|
170
|
+
2. `Model:`
|
|
171
|
+
- `sonnet`
|
|
172
|
+
- `opus`
|
|
173
|
+
- `haiku`
|
|
174
|
+
3. `Can this agent write/edit files?`
|
|
175
|
+
4. `Can this agent run shell commands?`
|
|
176
|
+
5. `Can this agent access the internet?`
|
|
177
|
+
6. `Can this agent delegate to other agents?`
|
|
178
|
+
|
|
179
|
+
How those answers map into the manifest:
|
|
180
|
+
|
|
181
|
+
- Every custom agent gets `Read`, `Grep`, and `Glob`.
|
|
182
|
+
- If write access is enabled, TeamCast adds `Write`, `Edit`, `MultiEdit`.
|
|
183
|
+
- If bash access is enabled, TeamCast adds `Bash`.
|
|
184
|
+
- If internet access is enabled, TeamCast adds `WebFetch`, `WebSearch`.
|
|
185
|
+
- If delegation is enabled, TeamCast adds `Agent`.
|
|
186
|
+
- For disabled write/bash/web capabilities, the matching tools are written into `claude.disallowed_tools`.
|
|
187
|
+
|
|
188
|
+
What `add agent` does not ask for:
|
|
189
|
+
|
|
190
|
+
- `claude.instructions`
|
|
191
|
+
- `claude.skills`
|
|
192
|
+
- `forge.handoffs`
|
|
193
|
+
- `claude.max_turns`
|
|
194
|
+
- `claude.permission_mode`
|
|
195
|
+
- `claude.mcp_servers`
|
|
196
|
+
- a fully custom `claude.tools` / `claude.disallowed_tools` list
|
|
197
|
+
|
|
198
|
+
That means a custom agent added this way starts with a minimal prompt. To make it useful, edit `teamcast.yaml` and add fields such as `claude.instructions`, `claude.skills`, and `forge.handoffs`.
|
|
199
|
+
|
|
200
|
+
### `edit agent <name>`
|
|
201
|
+
|
|
202
|
+
`teamcast edit agent <name>` updates an existing agent, writes `teamcast.yaml`, then regenerates all files.
|
|
203
|
+
|
|
204
|
+
Two modes are supported:
|
|
205
|
+
|
|
206
|
+
- Non-interactive:
|
|
207
|
+
|
|
208
|
+
```bash
|
|
209
|
+
teamcast edit agent reviewer --description "Reviews backend changes"
|
|
210
|
+
teamcast edit agent reviewer --model opus
|
|
211
|
+
teamcast edit agent reviewer --max-turns 40
|
|
212
|
+
```
|
|
213
|
+
|
|
214
|
+
- Interactive:
|
|
215
|
+
|
|
216
|
+
```bash
|
|
217
|
+
teamcast edit agent reviewer
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Interactive questions:
|
|
221
|
+
|
|
222
|
+
1. `Description:`
|
|
223
|
+
2. `Model:`
|
|
224
|
+
- `sonnet`
|
|
225
|
+
- `opus`
|
|
226
|
+
- `haiku`
|
|
227
|
+
- `inherit`
|
|
228
|
+
3. `Max turns (leave empty to keep current):`
|
|
229
|
+
4. `Customize tools?`
|
|
230
|
+
5. If yes:
|
|
231
|
+
- `Select allowed tools:`
|
|
232
|
+
- `claude.disallowed_tools` is computed automatically as the inverse of the selected allow-list
|
|
233
|
+
|
|
234
|
+
Important limitations:
|
|
235
|
+
|
|
236
|
+
- `edit agent` does not edit `claude.instructions`, `claude.skills`, `forge.handoffs`, `claude.permission_mode`, or `claude.mcp_servers`.
|
|
237
|
+
- If you pass any direct flags such as `--description`, `--model`, or `--max-turns`, the command updates only those fields and skips the interactive tool editor.
|
|
238
|
+
|
|
239
|
+
### `remove agent <name>`
|
|
240
|
+
|
|
241
|
+
`teamcast remove agent <name>` removes an agent from the manifest, removes that agent from any `forge.handoffs`, deletes the orphaned `.claude/agents/<name>.md` file, and regenerates the rest.
|
|
242
|
+
|
|
243
|
+
Interactive flow:
|
|
244
|
+
|
|
245
|
+
1. Shows the current agent name
|
|
246
|
+
2. Asks:
|
|
247
|
+
- `Remove agent "<name>"? This will also remove it from any handoffs.`
|
|
248
|
+
|
|
249
|
+
Use `--yes` to skip confirmation.
|
|
250
|
+
|
|
251
|
+
### `create skill <name>`
|
|
252
|
+
|
|
253
|
+
`teamcast create skill <name>` registers a new skill name on one agent, writes `teamcast.yaml`, and generates `.claude/skills/<name>/SKILL.md`.
|
|
254
|
+
|
|
255
|
+
Rules and prompts:
|
|
256
|
+
|
|
257
|
+
- skill names must start with a letter and use lowercase letters, numbers, and hyphens only
|
|
258
|
+
- if the skill already exists anywhere in the manifest, the command fails
|
|
259
|
+
- existing skill names are shown for context
|
|
260
|
+
- then TeamCast asks:
|
|
261
|
+
- `Which agent should own this skill?`
|
|
262
|
+
|
|
263
|
+
The generated `SKILL.md` file is a stub intended for manual editing. TeamCast will not overwrite an existing skill stub on later `generate` runs.
|
|
264
|
+
|
|
265
|
+
### `assign skill <name>`
|
|
266
|
+
|
|
267
|
+
`teamcast assign skill <name>` adds an existing skill to one or more additional agents, writes `teamcast.yaml`, and regenerates files.
|
|
268
|
+
|
|
269
|
+
Interactive flow:
|
|
270
|
+
|
|
271
|
+
1. Validates that the skill already exists somewhere in the manifest
|
|
272
|
+
2. Prints agents that already have the skill
|
|
273
|
+
3. Asks:
|
|
274
|
+
- `Assign to which agents?`
|
|
275
|
+
|
|
276
|
+
The prompt is a multi-select list and requires at least one target agent.
|
|
277
|
+
|
|
278
|
+
### `generate`
|
|
279
|
+
|
|
280
|
+
`teamcast generate` reads `teamcast.yaml`, validates it for blocking issues, and writes generated files.
|
|
281
|
+
|
|
282
|
+
```bash
|
|
283
|
+
teamcast generate
|
|
284
|
+
teamcast generate --dry-run
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
Behavior:
|
|
288
|
+
|
|
289
|
+
- `generate` overwrites generated agent/docs/settings files
|
|
290
|
+
- skill stub files under `.claude/skills/` are created only if missing
|
|
291
|
+
- `--dry-run` shows what would be generated without writing anything
|
|
292
|
+
|
|
293
|
+
### `diff`
|
|
294
|
+
|
|
295
|
+
`teamcast diff` compares the current manifest to generated files already on disk.
|
|
296
|
+
|
|
297
|
+
It reports:
|
|
298
|
+
|
|
299
|
+
- new files
|
|
300
|
+
- modified files with added or removed line counts when available
|
|
301
|
+
- unchanged files
|
|
302
|
+
|
|
303
|
+
Use it to preview drift before running `teamcast generate`.
|
|
304
|
+
|
|
305
|
+
### `validate`
|
|
306
|
+
|
|
307
|
+
`teamcast validate` runs the validator against `teamcast.yaml`.
|
|
308
|
+
|
|
309
|
+
```bash
|
|
310
|
+
teamcast validate
|
|
311
|
+
teamcast validate --strict
|
|
312
|
+
teamcast validate --format json
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
Behavior:
|
|
316
|
+
|
|
317
|
+
- exits non-zero on validation errors
|
|
318
|
+
- with `--strict`, also exits non-zero on warnings
|
|
319
|
+
- with `--format json`, prints a JSON result object instead of human-readable output; useful for CI scripts that need to parse results programmatically
|
|
320
|
+
|
|
321
|
+
Validation categories include:
|
|
322
|
+
|
|
323
|
+
- handoff graph correctness
|
|
324
|
+
- tool conflicts
|
|
325
|
+
- role-based warnings
|
|
326
|
+
- security baseline checks
|
|
327
|
+
|
|
328
|
+
#### Policy Assertions
|
|
329
|
+
|
|
330
|
+
Assertions are declarative rules about your team that `validate` enforces. Define them under `policies.assertions`:
|
|
331
|
+
|
|
332
|
+
```yaml
|
|
333
|
+
policies:
|
|
334
|
+
assertions:
|
|
335
|
+
- rule: require_sandbox_with_execute
|
|
336
|
+
- rule: no_unrestricted_execute
|
|
337
|
+
- rule: max_agents
|
|
338
|
+
count: 6
|
|
339
|
+
- rule: deny_skill_for_role
|
|
340
|
+
agent: reviewer
|
|
341
|
+
skill: write_files
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
Available rules:
|
|
345
|
+
|
|
346
|
+
| Rule | Parameters | Description |
|
|
347
|
+
|------|-----------|-------------|
|
|
348
|
+
| `require_sandbox_with_execute` | — | Any agent with `execute` skill must have sandbox enabled |
|
|
349
|
+
| `no_unrestricted_execute` | — | `execute` skill must have a permission scope (e.g. `Bash(npm *)`) |
|
|
350
|
+
| `require_skill` | `skill` | All agents must have the specified skill |
|
|
351
|
+
| `deny_skill_for_role` | `agent`, `skill` | A named agent must not have the specified skill |
|
|
352
|
+
| `forbid_skill_combination` | `skills[]` | No single agent may hold all listed skills at once |
|
|
353
|
+
| `max_agents` | `count` | Team must not exceed the given number of agents |
|
|
354
|
+
| `require_instruction_block` | `kind` | All agents must include an instruction block of the given kind |
|
|
355
|
+
| `require_delegation_chain` | — | At least one agent must have the `delegate` skill |
|
|
356
|
+
|
|
357
|
+
The `secure-dev` preset includes several security assertions by default.
|
|
358
|
+
|
|
359
|
+
### `explain`
|
|
360
|
+
|
|
361
|
+
`teamcast explain` prints a human-readable summary of the team:
|
|
362
|
+
|
|
363
|
+
- project metadata
|
|
364
|
+
- agents
|
|
365
|
+
- models
|
|
366
|
+
- tools
|
|
367
|
+
- handoffs
|
|
368
|
+
- skills
|
|
369
|
+
|
|
370
|
+
Use this after `init`, `import`, or larger manifest edits to sanity-check the architecture.
|
|
371
|
+
|
|
372
|
+
### `import`
|
|
373
|
+
|
|
374
|
+
`teamcast import` converts an existing `.claude/` setup into `teamcast.yaml`.
|
|
375
|
+
|
|
376
|
+
Preconditions:
|
|
377
|
+
|
|
378
|
+
- `.claude/` must exist
|
|
379
|
+
- `teamcast.yaml` must not already exist
|
|
380
|
+
|
|
381
|
+
Flow:
|
|
382
|
+
|
|
383
|
+
1. Scans `.claude/agents/*.md`
|
|
384
|
+
2. Scans `.claude/settings.json`
|
|
385
|
+
3. Builds a manifest
|
|
386
|
+
4. Prints import warnings, if any
|
|
387
|
+
5. Prints discovered agents and policy categories
|
|
388
|
+
6. Validates the imported manifest
|
|
389
|
+
7. Asks:
|
|
390
|
+
- `Write teamcast.yaml with imported configuration?`
|
|
391
|
+
|
|
392
|
+
Use `--yes` to skip confirmation.
|
|
393
|
+
|
|
394
|
+
Important note:
|
|
395
|
+
|
|
396
|
+
- `import` writes `teamcast.yaml`
|
|
397
|
+
- it does not run `generate`
|
|
398
|
+
- imported instructions are extracted from the agent markdown body text
|
|
399
|
+
- legacy TeamCast markdown is still supported, and old generated `Skills`, `Delegation`, and `Constraints` sections are stripped during import
|
|
400
|
+
|
|
401
|
+
### `reset`
|
|
402
|
+
|
|
403
|
+
`teamcast reset` deletes generated output but keeps `teamcast.yaml`.
|
|
404
|
+
|
|
405
|
+
It targets:
|
|
406
|
+
|
|
407
|
+
- `.claude/agents`
|
|
408
|
+
- `.claude/skills`
|
|
409
|
+
- `.claude/settings.json`
|
|
410
|
+
- `.claude/settings.local.json`
|
|
411
|
+
- `CLAUDE.md`
|
|
412
|
+
- `AGENTS.md`
|
|
413
|
+
|
|
414
|
+
Flow:
|
|
415
|
+
|
|
416
|
+
1. Shows the files that will be deleted
|
|
417
|
+
2. Asks:
|
|
418
|
+
- `Delete these files?`
|
|
419
|
+
|
|
420
|
+
Use `--yes` to skip confirmation.
|
|
421
|
+
|
|
422
|
+
### `clean`
|
|
423
|
+
|
|
424
|
+
`teamcast clean` is the destructive version of `reset`.
|
|
425
|
+
|
|
426
|
+
It deletes:
|
|
427
|
+
|
|
428
|
+
- everything removed by `reset`
|
|
429
|
+
- `teamcast.yaml`
|
|
430
|
+
|
|
431
|
+
Flow:
|
|
432
|
+
|
|
433
|
+
1. Shows the files that will be deleted
|
|
434
|
+
2. Asks:
|
|
435
|
+
- `Delete everything including teamcast.yaml?`
|
|
436
|
+
|
|
437
|
+
Use `--yes` to skip confirmation.
|
|
438
|
+
|
|
439
|
+
## Prompt Generation
|
|
440
|
+
|
|
441
|
+
Everything is defined in `teamcast.yaml` at the root of your project.
|
|
442
|
+
|
|
443
|
+
For each agent, TeamCast renders `.claude/agents/<name>.md` from `agents.<name>.claude`.
|
|
444
|
+
|
|
445
|
+
Native Claude Code fields are rendered into frontmatter:
|
|
446
|
+
|
|
447
|
+
- `description`
|
|
448
|
+
- `model`
|
|
449
|
+
- `tools`
|
|
450
|
+
- `disallowedTools`
|
|
451
|
+
- `permissionMode`
|
|
452
|
+
- `maxTurns`
|
|
453
|
+
- `skills`
|
|
454
|
+
- `mcpServers`
|
|
455
|
+
- `background`
|
|
456
|
+
|
|
457
|
+
`claude.instructions` becomes the markdown body.
|
|
458
|
+
|
|
459
|
+
`forge` metadata is not rendered into the agent markdown. It is used by TeamCast for validation, workflow docs, and delegation modeling.
|
|
460
|
+
|
|
461
|
+
This is important for custom agents:
|
|
462
|
+
|
|
463
|
+
- role templates and presets come with built-in `claude.instructions`
|
|
464
|
+
- `add agent <name>` without `--template` does not ask for `claude.instructions`
|
|
465
|
+
- a custom agent created from `add agent` therefore starts with a very minimal prompt until you edit `teamcast.yaml`
|
|
466
|
+
|
|
467
|
+
## Configuration
|
|
468
|
+
|
|
469
|
+
Everything is defined in `teamcast.yaml` at the root of your project.
|
|
470
|
+
|
|
471
|
+
### Minimal Example
|
|
472
|
+
|
|
473
|
+
```yaml
|
|
474
|
+
version: "1"
|
|
475
|
+
project:
|
|
476
|
+
name: my-project
|
|
477
|
+
|
|
478
|
+
agents:
|
|
479
|
+
developer:
|
|
480
|
+
claude:
|
|
481
|
+
description: Implements features and fixes bugs
|
|
482
|
+
model: sonnet
|
|
483
|
+
tools: [Read, Write, Edit, Bash, Grep, Glob]
|
|
484
|
+
disallowed_tools: [WebFetch, WebSearch]
|
|
485
|
+
instructions: |
|
|
486
|
+
Implement the requested changes.
|
|
487
|
+
Write tests when behavior changes.
|
|
488
|
+
```
|
|
489
|
+
|
|
490
|
+
### Full Example
|
|
491
|
+
|
|
492
|
+
```yaml
|
|
493
|
+
version: "1"
|
|
494
|
+
project:
|
|
495
|
+
name: my-project
|
|
496
|
+
description: TypeScript/Node.js web app
|
|
497
|
+
|
|
498
|
+
agents:
|
|
499
|
+
orchestrator:
|
|
500
|
+
claude:
|
|
501
|
+
description: Coordinates the team and delegates tasks
|
|
502
|
+
model: opus
|
|
503
|
+
tools: [Read, Grep, Glob, Agent]
|
|
504
|
+
disallowed_tools: [Edit, Write, Bash]
|
|
505
|
+
max_turns: 30
|
|
506
|
+
instructions: |
|
|
507
|
+
You are the coordinator for the project.
|
|
508
|
+
Read the request, break it into subtasks, and delegate to the right agents.
|
|
509
|
+
Never modify files yourself.
|
|
510
|
+
forge:
|
|
511
|
+
handoffs: [planner, developer, reviewer]
|
|
512
|
+
|
|
513
|
+
planner:
|
|
514
|
+
claude:
|
|
515
|
+
description: Analyzes codebase and produces implementation plans
|
|
516
|
+
model: sonnet
|
|
517
|
+
tools: [Read, Grep, Glob, WebFetch, WebSearch]
|
|
518
|
+
disallowed_tools: [Edit, Write, Bash]
|
|
519
|
+
instructions: |
|
|
520
|
+
Read the codebase and produce a step-by-step implementation plan.
|
|
521
|
+
Never modify files.
|
|
522
|
+
|
|
523
|
+
developer:
|
|
524
|
+
claude:
|
|
525
|
+
description: Implements features based on the plan
|
|
526
|
+
model: sonnet
|
|
527
|
+
tools: [Read, Write, Edit, Bash, Grep, Glob]
|
|
528
|
+
disallowed_tools: [WebFetch, WebSearch]
|
|
529
|
+
skills: [test-first, clean-code]
|
|
530
|
+
instructions: |
|
|
531
|
+
Implement the plan, write tests, and verify the result.
|
|
532
|
+
|
|
533
|
+
reviewer:
|
|
534
|
+
claude:
|
|
535
|
+
description: Reviews code for quality and security issues
|
|
536
|
+
model: sonnet
|
|
537
|
+
tools: [Read, Grep, Glob, Bash]
|
|
538
|
+
disallowed_tools: [Edit, Write]
|
|
539
|
+
instructions: |
|
|
540
|
+
Review the implementation for correctness, style, and security.
|
|
541
|
+
Do not modify files yourself.
|
|
542
|
+
|
|
543
|
+
policies:
|
|
544
|
+
permissions:
|
|
545
|
+
allow:
|
|
546
|
+
- "Bash(npm run *)"
|
|
547
|
+
- "Bash(npm test)"
|
|
548
|
+
- "Bash(git status)"
|
|
549
|
+
- "Bash(git diff *)"
|
|
550
|
+
- "Bash(git commit *)"
|
|
551
|
+
ask:
|
|
552
|
+
- "Bash(git push *)"
|
|
553
|
+
deny:
|
|
554
|
+
- "Bash(rm -rf *)"
|
|
555
|
+
- "Bash(git push --force *)"
|
|
556
|
+
- "Write(.env*)"
|
|
557
|
+
sandbox:
|
|
558
|
+
enabled: true
|
|
559
|
+
auto_allow_bash: true
|
|
560
|
+
|
|
561
|
+
settings:
|
|
562
|
+
default_model: sonnet
|
|
563
|
+
generate_docs: true
|
|
564
|
+
generate_local_settings: true
|
|
565
|
+
```
|
|
566
|
+
|
|
567
|
+
### Agent Fields
|
|
568
|
+
|
|
569
|
+
| Field | Type | Description |
|
|
570
|
+
|-------|------|-------------|
|
|
571
|
+
| `claude.description` | string | Required. Shown in the Claude Code subagent picker |
|
|
572
|
+
| `claude.model` | `opus \| sonnet \| haiku \| inherit` | Model alias to use |
|
|
573
|
+
| `claude.tools` | string[] | Native Claude Code tool allow-list |
|
|
574
|
+
| `claude.disallowed_tools` | string[] | Native Claude Code tool deny-list |
|
|
575
|
+
| `claude.skills` | string[] | Skill names. Each unique skill generates `.claude/skills/<skill>/SKILL.md` |
|
|
576
|
+
| `claude.max_turns` | number | Maximum agentic turns |
|
|
577
|
+
| `claude.mcp_servers` | object[] | MCP server definitions |
|
|
578
|
+
| `claude.permission_mode` | `default \| acceptEdits \| bypassPermissions \| plan \| dontAsk` | Claude Code permission mode |
|
|
579
|
+
| `claude.instructions` | string | Freeform instructions used as the markdown body |
|
|
580
|
+
| `forge.handoffs` | string[] | Other agents this agent can delegate to. Requires `Agent` in `claude.tools` |
|
|
581
|
+
|
|
582
|
+
Available Claude Code tools:
|
|
583
|
+
|
|
584
|
+
`Read`, `Write`, `Edit`, `MultiEdit`, `Grep`, `Glob`, `Bash`, `WebFetch`, `WebSearch`, `Agent`
|
|
585
|
+
|
|
586
|
+
### Abstract Skills
|
|
587
|
+
|
|
588
|
+
Instead of listing raw tool names, you can specify platform-agnostic skills in `claude.tools`. TeamCast expands each skill to the appropriate Claude Code tools automatically.
|
|
589
|
+
|
|
590
|
+
| Skill | Expands to |
|
|
591
|
+
|-------|-----------|
|
|
592
|
+
| `read_files` | `Read`, `Grep`, `Glob` |
|
|
593
|
+
| `write_files` | `Write`, `Edit`, `MultiEdit` |
|
|
594
|
+
| `execute` | `Bash` |
|
|
595
|
+
| `search` | `Glob`, `Grep` |
|
|
596
|
+
| `web` | `WebFetch`, `WebSearch` |
|
|
597
|
+
| `delegate` | `Agent` |
|
|
598
|
+
| `interact` | `AskUserQuestion`, `TodoWrite`, `TodoRead` |
|
|
599
|
+
| `notebook` | `NotebookEdit` |
|
|
600
|
+
|
|
601
|
+
Example:
|
|
602
|
+
|
|
603
|
+
```yaml
|
|
604
|
+
developer:
|
|
605
|
+
claude:
|
|
606
|
+
tools: [read_files, write_files, execute]
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
Raw tool names and skills can be mixed in the same `tools` array.
|
|
610
|
+
|
|
611
|
+
### Policy Fields
|
|
612
|
+
|
|
613
|
+
```yaml
|
|
614
|
+
policies:
|
|
615
|
+
permissions:
|
|
616
|
+
allow: ["Bash(npm run *)", "WebFetch(api.example.com:*)"]
|
|
617
|
+
ask: ["Bash(git push *)"]
|
|
618
|
+
deny: ["Bash(rm -rf *)", "Write(.env*)"]
|
|
619
|
+
default_mode: acceptEdits
|
|
620
|
+
sandbox:
|
|
621
|
+
enabled: true
|
|
622
|
+
auto_allow_bash: true
|
|
623
|
+
```
|
|
624
|
+
|
|
625
|
+
## Custom Templates
|
|
626
|
+
|
|
627
|
+
Use `--from` to initialize from any valid TeamCast YAML file:
|
|
628
|
+
|
|
629
|
+
```bash
|
|
630
|
+
teamcast init --from ./my-team-template.yaml
|
|
631
|
+
```
|
|
632
|
+
|
|
633
|
+
This validates the file against the schema, writes `teamcast.yaml`, and generates all config files.
|
|
634
|
+
|
|
635
|
+
## Preset Metadata
|
|
636
|
+
|
|
637
|
+
When sharing presets, you can add optional metadata:
|
|
638
|
+
|
|
639
|
+
```yaml
|
|
640
|
+
preset_meta:
|
|
641
|
+
author: your-name
|
|
642
|
+
tags: [typescript, fullstack, security]
|
|
643
|
+
min_version: "0.5.0"
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
## Validation
|
|
647
|
+
|
|
648
|
+
`teamcast validate` checks:
|
|
649
|
+
|
|
650
|
+
- handoff graph correctness
|
|
651
|
+
- tool allow or deny conflicts
|
|
652
|
+
- role-based warnings
|
|
653
|
+
- security baseline configuration
|
|
654
|
+
- policy assertions (when defined in `policies.assertions`)
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { CoreTeam } from '../core/types.js';
|
|
2
|
+
import type { RenderedFile } from '../renderers/types.js';
|
|
3
|
+
export interface BuildGeneratedOutputsOptions {
|
|
4
|
+
cwd: string;
|
|
5
|
+
dryRun?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export declare function buildGeneratedOutputs(team: CoreTeam, options: BuildGeneratedOutputsOptions): RenderedFile[];
|
|
8
|
+
//# sourceMappingURL=build-generated-files.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-generated-files.d.ts","sourceRoot":"","sources":["../../src/application/build-generated-files.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,YAAY,EAAkB,MAAM,uBAAuB,CAAC;AAI1E,MAAM,WAAW,4BAA4B;IAC3C,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,4BAA4B,GAAG,YAAY,EAAE,CAa3G"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { ClaudeRenderer } from '../renderers/claude/index.js';
|
|
2
|
+
import { isUserEditableGeneratedFile } from '../generator/file-policies.js';
|
|
3
|
+
import { writeFiles } from '../generator/writer.js';
|
|
4
|
+
export function buildGeneratedOutputs(team, options) {
|
|
5
|
+
const spec = { team };
|
|
6
|
+
const renderer = new ClaudeRenderer();
|
|
7
|
+
const files = renderer.render(spec);
|
|
8
|
+
if (!options.dryRun) {
|
|
9
|
+
const editable = files.filter((file) => isUserEditableGeneratedFile(file.path));
|
|
10
|
+
const generated = files.filter((file) => !isUserEditableGeneratedFile(file.path));
|
|
11
|
+
writeFiles(generated, options.cwd);
|
|
12
|
+
writeFiles(editable, options.cwd, { skipExisting: true });
|
|
13
|
+
}
|
|
14
|
+
return files;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=build-generated-files.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-generated-files.js","sourceRoot":"","sources":["../../src/application/build-generated-files.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAOpD,MAAM,UAAU,qBAAqB,CAAC,IAAc,EAAE,OAAqC;IACzF,MAAM,IAAI,GAAmB,EAAE,IAAI,EAAE,CAAC;IACtC,MAAM,QAAQ,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEpC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAChF,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QAClF,UAAU,CAAC,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,UAAU,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|