teamcast 0.6.0 → 0.9.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.
Files changed (288) hide show
  1. package/dist/application/build-generated-files.d.ts +1 -1
  2. package/dist/application/build-generated-files.d.ts.map +1 -1
  3. package/dist/application/build-generated-files.js +4 -3
  4. package/dist/application/build-generated-files.js.map +1 -1
  5. package/dist/application/team.d.ts +19 -14
  6. package/dist/application/team.d.ts.map +1 -1
  7. package/dist/application/team.js +125 -51
  8. package/dist/application/team.js.map +1 -1
  9. package/dist/application/validate-team.d.ts +2 -19
  10. package/dist/application/validate-team.d.ts.map +1 -1
  11. package/dist/application/validate-team.js +38 -48
  12. package/dist/application/validate-team.js.map +1 -1
  13. package/dist/cli/explain.d.ts +1 -0
  14. package/dist/cli/explain.d.ts.map +1 -1
  15. package/dist/cli/explain.js +20 -1
  16. package/dist/cli/explain.js.map +1 -1
  17. package/dist/cli/generate.js +1 -1
  18. package/dist/cli/generate.js.map +1 -1
  19. package/dist/cli/import.d.ts.map +1 -1
  20. package/dist/cli/import.js +75 -33
  21. package/dist/cli/import.js.map +1 -1
  22. package/dist/cli/init.d.ts.map +1 -1
  23. package/dist/cli/init.js +35 -16
  24. package/dist/cli/init.js.map +1 -1
  25. package/dist/cli/manage.d.ts.map +1 -1
  26. package/dist/cli/manage.js +199 -80
  27. package/dist/cli/manage.js.map +1 -1
  28. package/dist/cli/reset.d.ts.map +1 -1
  29. package/dist/cli/reset.js +36 -12
  30. package/dist/cli/reset.js.map +1 -1
  31. package/dist/cli/validate.d.ts.map +1 -1
  32. package/dist/cli/validate.js +6 -8
  33. package/dist/cli/validate.js.map +1 -1
  34. package/dist/components/policy-fragments.d.ts +1 -1
  35. package/dist/components/policy-fragments.d.ts.map +1 -1
  36. package/dist/components/policy-fragments.js +12 -49
  37. package/dist/components/policy-fragments.js.map +1 -1
  38. package/dist/core/index.d.ts +0 -1
  39. package/dist/core/index.d.ts.map +1 -1
  40. package/dist/core/index.js +0 -1
  41. package/dist/core/index.js.map +1 -1
  42. package/dist/core/types.d.ts +9 -12
  43. package/dist/core/types.d.ts.map +1 -1
  44. package/dist/detector/index.d.ts +0 -2
  45. package/dist/detector/index.d.ts.map +1 -1
  46. package/dist/detector/index.js +4 -10
  47. package/dist/detector/index.js.map +1 -1
  48. package/dist/diff/index.d.ts +2 -2
  49. package/dist/diff/index.d.ts.map +1 -1
  50. package/dist/diff/index.js +2 -2
  51. package/dist/diff/index.js.map +1 -1
  52. package/dist/explainer/index.d.ts +2 -1
  53. package/dist/explainer/index.d.ts.map +1 -1
  54. package/dist/explainer/index.js +29 -21
  55. package/dist/explainer/index.js.map +1 -1
  56. package/dist/generator/index.d.ts +2 -2
  57. package/dist/generator/index.d.ts.map +1 -1
  58. package/dist/generator/index.js +18 -5
  59. package/dist/generator/index.js.map +1 -1
  60. package/dist/importer/index.d.ts +3 -2
  61. package/dist/importer/index.d.ts.map +1 -1
  62. package/dist/importer/index.js +255 -39
  63. package/dist/importer/index.js.map +1 -1
  64. package/dist/index.d.ts +1 -1
  65. package/dist/index.d.ts.map +1 -1
  66. package/dist/index.js +2 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/manifest/defaults.d.ts +1 -2
  69. package/dist/manifest/defaults.d.ts.map +1 -1
  70. package/dist/manifest/defaults.js +12 -12
  71. package/dist/manifest/defaults.js.map +1 -1
  72. package/dist/manifest/normalize.d.ts +8 -4
  73. package/dist/manifest/normalize.d.ts.map +1 -1
  74. package/dist/manifest/normalize.js +97 -161
  75. package/dist/manifest/normalize.js.map +1 -1
  76. package/dist/manifest/reader.d.ts +2 -2
  77. package/dist/manifest/reader.d.ts.map +1 -1
  78. package/dist/manifest/reader.js +5 -4
  79. package/dist/manifest/reader.js.map +1 -1
  80. package/dist/manifest/schema-validator.d.ts.map +1 -1
  81. package/dist/manifest/schema-validator.js +4 -2
  82. package/dist/manifest/schema-validator.js.map +1 -1
  83. package/dist/manifest/types.d.ts +23 -68
  84. package/dist/manifest/types.d.ts.map +1 -1
  85. package/dist/manifest/types.js.map +1 -1
  86. package/dist/manifest/writer.d.ts +2 -2
  87. package/dist/manifest/writer.d.ts.map +1 -1
  88. package/dist/manifest/writer.js +2 -3
  89. package/dist/manifest/writer.js.map +1 -1
  90. package/dist/plugins/core/models-plugin.d.ts +3 -0
  91. package/dist/plugins/core/models-plugin.d.ts.map +1 -0
  92. package/dist/plugins/core/models-plugin.js +28 -0
  93. package/dist/plugins/core/models-plugin.js.map +1 -0
  94. package/dist/plugins/core/tools-plugin.d.ts +3 -0
  95. package/dist/plugins/core/tools-plugin.d.ts.map +1 -0
  96. package/dist/plugins/core/tools-plugin.js +44 -0
  97. package/dist/plugins/core/tools-plugin.js.map +1 -0
  98. package/dist/plugins/environments/node-env-plugin.d.ts +3 -0
  99. package/dist/plugins/environments/node-env-plugin.d.ts.map +1 -0
  100. package/dist/plugins/environments/node-env-plugin.js +31 -0
  101. package/dist/plugins/environments/node-env-plugin.js.map +1 -0
  102. package/dist/plugins/environments/python-env-plugin.d.ts +3 -0
  103. package/dist/plugins/environments/python-env-plugin.d.ts.map +1 -0
  104. package/dist/plugins/environments/python-env-plugin.js +33 -0
  105. package/dist/plugins/environments/python-env-plugin.js.map +1 -0
  106. package/dist/plugins/index.d.ts +3 -0
  107. package/dist/plugins/index.d.ts.map +1 -0
  108. package/dist/plugins/index.js +13 -0
  109. package/dist/plugins/index.js.map +1 -0
  110. package/dist/plugins/inject.d.ts +3 -0
  111. package/dist/plugins/inject.d.ts.map +1 -0
  112. package/dist/plugins/inject.js +16 -0
  113. package/dist/plugins/inject.js.map +1 -0
  114. package/dist/plugins/merge-policies.d.ts +8 -0
  115. package/dist/plugins/merge-policies.d.ts.map +1 -0
  116. package/dist/plugins/merge-policies.js +56 -0
  117. package/dist/plugins/merge-policies.js.map +1 -0
  118. package/dist/plugins/registry.d.ts +21 -0
  119. package/dist/plugins/registry.d.ts.map +1 -0
  120. package/dist/plugins/registry.js +63 -0
  121. package/dist/plugins/registry.js.map +1 -0
  122. package/dist/plugins/types.d.ts +71 -0
  123. package/dist/plugins/types.d.ts.map +1 -0
  124. package/dist/{generator/targets → plugins}/types.js.map +1 -1
  125. package/dist/presets/index.d.ts +2 -2
  126. package/dist/presets/index.d.ts.map +1 -1
  127. package/dist/presets/index.js +7 -2
  128. package/dist/presets/index.js.map +1 -1
  129. package/dist/presets/types.d.ts +2 -2
  130. package/dist/presets/types.d.ts.map +1 -1
  131. package/dist/renderers/claude/agent-md.js +1 -1
  132. package/dist/renderers/claude/agent-md.js.map +1 -1
  133. package/dist/renderers/claude/docs.js +1 -1
  134. package/dist/renderers/claude/docs.js.map +1 -1
  135. package/dist/renderers/claude/index.d.ts +2 -0
  136. package/dist/renderers/claude/index.d.ts.map +1 -1
  137. package/dist/renderers/claude/index.js +11 -0
  138. package/dist/renderers/claude/index.js.map +1 -1
  139. package/dist/renderers/claude/policy-mapper.d.ts.map +1 -1
  140. package/dist/renderers/claude/policy-mapper.js +3 -22
  141. package/dist/renderers/claude/policy-mapper.js.map +1 -1
  142. package/dist/renderers/claude/tools.d.ts +0 -1
  143. package/dist/renderers/claude/tools.d.ts.map +1 -1
  144. package/dist/renderers/claude/tools.js +0 -2
  145. package/dist/renderers/claude/tools.js.map +1 -1
  146. package/dist/renderers/codex/index.d.ts +7 -0
  147. package/dist/renderers/codex/index.d.ts.map +1 -0
  148. package/dist/renderers/codex/index.js +97 -0
  149. package/dist/renderers/codex/index.js.map +1 -0
  150. package/dist/renderers/codex/skill-map.d.ts +8 -0
  151. package/dist/renderers/codex/skill-map.d.ts.map +1 -0
  152. package/dist/renderers/codex/skill-map.js +29 -0
  153. package/dist/renderers/codex/skill-map.js.map +1 -0
  154. package/dist/renderers/codex/tools.d.ts +3 -0
  155. package/dist/renderers/codex/tools.d.ts.map +1 -0
  156. package/dist/renderers/codex/tools.js +8 -0
  157. package/dist/renderers/codex/tools.js.map +1 -0
  158. package/dist/renderers/index.d.ts +3 -0
  159. package/dist/renderers/index.d.ts.map +1 -1
  160. package/dist/renderers/index.js +7 -0
  161. package/dist/renderers/index.js.map +1 -1
  162. package/dist/renderers/registry.d.ts +8 -0
  163. package/dist/renderers/registry.d.ts.map +1 -0
  164. package/dist/renderers/registry.js +22 -0
  165. package/dist/renderers/registry.js.map +1 -0
  166. package/dist/renderers/target-context.d.ts +14 -0
  167. package/dist/renderers/target-context.d.ts.map +1 -0
  168. package/dist/renderers/target-context.js +2 -0
  169. package/dist/renderers/target-context.js.map +1 -0
  170. package/dist/team-templates/policies.d.ts.map +1 -1
  171. package/dist/team-templates/policies.js +0 -12
  172. package/dist/team-templates/policies.js.map +1 -1
  173. package/dist/team-templates/presets.d.ts +1 -1
  174. package/dist/team-templates/presets.d.ts.map +1 -1
  175. package/dist/team-templates/roles.d.ts +6 -6
  176. package/dist/team-templates/roles.d.ts.map +1 -1
  177. package/dist/team-templates/roles.js +3 -4
  178. package/dist/team-templates/roles.js.map +1 -1
  179. package/dist/tools/types.d.ts +5 -0
  180. package/dist/tools/types.d.ts.map +1 -0
  181. package/dist/tools/types.js +2 -0
  182. package/dist/tools/types.js.map +1 -0
  183. package/dist/types/manifest.d.ts +8 -5
  184. package/dist/types/manifest.d.ts.map +1 -1
  185. package/dist/types/manifest.js +7 -9
  186. package/dist/types/manifest.js.map +1 -1
  187. package/dist/validator/checks/handoff-graph.d.ts.map +1 -1
  188. package/dist/validator/checks/handoff-graph.js +3 -2
  189. package/dist/validator/checks/handoff-graph.js.map +1 -1
  190. package/dist/validator/checks/instruction-blocks.d.ts.map +1 -1
  191. package/dist/validator/checks/instruction-blocks.js +3 -1
  192. package/dist/validator/checks/instruction-blocks.js.map +1 -1
  193. package/dist/validator/checks/security-baseline.d.ts.map +1 -1
  194. package/dist/validator/checks/security-baseline.js +4 -19
  195. package/dist/validator/checks/security-baseline.js.map +1 -1
  196. package/dist/validator/index.d.ts +2 -2
  197. package/dist/validator/index.d.ts.map +1 -1
  198. package/dist/validator/index.js +4 -8
  199. package/dist/validator/index.js.map +1 -1
  200. package/dist/wizard/index.d.ts +2 -0
  201. package/dist/wizard/index.d.ts.map +1 -1
  202. package/dist/wizard/index.js +30 -10
  203. package/dist/wizard/index.js.map +1 -1
  204. package/dist/wizard/steps/agent-customization.d.ts +2 -1
  205. package/dist/wizard/steps/agent-customization.d.ts.map +1 -1
  206. package/dist/wizard/steps/agent-customization.js +66 -30
  207. package/dist/wizard/steps/agent-customization.js.map +1 -1
  208. package/dist/wizard/steps/confirm-generate.d.ts +2 -2
  209. package/dist/wizard/steps/confirm-generate.d.ts.map +1 -1
  210. package/dist/wizard/steps/confirm-generate.js +2 -2
  211. package/dist/wizard/steps/confirm-generate.js.map +1 -1
  212. package/dist/wizard/steps/custom-team.d.ts +3 -2
  213. package/dist/wizard/steps/custom-team.d.ts.map +1 -1
  214. package/dist/wizard/steps/custom-team.js +3 -3
  215. package/dist/wizard/steps/custom-team.js.map +1 -1
  216. package/dist/wizard/steps/target-selection.d.ts +6 -0
  217. package/dist/wizard/steps/target-selection.d.ts.map +1 -0
  218. package/dist/wizard/steps/target-selection.js +27 -0
  219. package/dist/wizard/steps/target-selection.js.map +1 -0
  220. package/dist/wizard/steps/team-selection.d.ts +4 -2
  221. package/dist/wizard/steps/team-selection.d.ts.map +1 -1
  222. package/dist/wizard/steps/team-selection.js +6 -6
  223. package/dist/wizard/steps/team-selection.js.map +1 -1
  224. package/package.json +17 -3
  225. package/schema/teamcast.schema.json +42 -155
  226. package/templates/presets/feature-team.yaml +78 -47
  227. package/templates/presets/research-and-build.yaml +64 -41
  228. package/templates/presets/secure-dev.yaml +84 -56
  229. package/templates/presets/solo-dev.yaml +23 -17
  230. package/dist/cli/manifest-validation.d.ts +0 -13
  231. package/dist/cli/manifest-validation.d.ts.map +0 -1
  232. package/dist/cli/manifest-validation.js +0 -38
  233. package/dist/cli/manifest-validation.js.map +0 -1
  234. package/dist/core/permissions.d.ts +0 -10
  235. package/dist/core/permissions.d.ts.map +0 -1
  236. package/dist/core/permissions.js +0 -67
  237. package/dist/core/permissions.js.map +0 -1
  238. package/dist/generator/renderers/agent-md.d.ts +0 -5
  239. package/dist/generator/renderers/agent-md.d.ts.map +0 -1
  240. package/dist/generator/renderers/agent-md.js +0 -66
  241. package/dist/generator/renderers/agent-md.js.map +0 -1
  242. package/dist/generator/renderers/agents-md.d.ts +0 -4
  243. package/dist/generator/renderers/agents-md.d.ts.map +0 -1
  244. package/dist/generator/renderers/agents-md.js +0 -86
  245. package/dist/generator/renderers/agents-md.js.map +0 -1
  246. package/dist/generator/renderers/claude-md.d.ts +0 -4
  247. package/dist/generator/renderers/claude-md.d.ts.map +0 -1
  248. package/dist/generator/renderers/claude-md.js +0 -68
  249. package/dist/generator/renderers/claude-md.js.map +0 -1
  250. package/dist/generator/renderers/codex-config.d.ts +0 -4
  251. package/dist/generator/renderers/codex-config.d.ts.map +0 -1
  252. package/dist/generator/renderers/codex-config.js +0 -145
  253. package/dist/generator/renderers/codex-config.js.map +0 -1
  254. package/dist/generator/renderers/codex-skill-md.d.ts +0 -4
  255. package/dist/generator/renderers/codex-skill-md.d.ts.map +0 -1
  256. package/dist/generator/renderers/codex-skill-md.js +0 -47
  257. package/dist/generator/renderers/codex-skill-md.js.map +0 -1
  258. package/dist/generator/renderers/settings-json.d.ts +0 -5
  259. package/dist/generator/renderers/settings-json.d.ts.map +0 -1
  260. package/dist/generator/renderers/settings-json.js +0 -100
  261. package/dist/generator/renderers/settings-json.js.map +0 -1
  262. package/dist/generator/renderers/skill-md.d.ts +0 -4
  263. package/dist/generator/renderers/skill-md.d.ts.map +0 -1
  264. package/dist/generator/renderers/skill-md.js +0 -44
  265. package/dist/generator/renderers/skill-md.js.map +0 -1
  266. package/dist/generator/state.d.ts +0 -14
  267. package/dist/generator/state.d.ts.map +0 -1
  268. package/dist/generator/state.js +0 -76
  269. package/dist/generator/state.js.map +0 -1
  270. package/dist/generator/targets/claude.d.ts +0 -3
  271. package/dist/generator/targets/claude.d.ts.map +0 -1
  272. package/dist/generator/targets/claude.js +0 -24
  273. package/dist/generator/targets/claude.js.map +0 -1
  274. package/dist/generator/targets/codex.d.ts +0 -3
  275. package/dist/generator/targets/codex.d.ts.map +0 -1
  276. package/dist/generator/targets/codex.js +0 -19
  277. package/dist/generator/targets/codex.js.map +0 -1
  278. package/dist/generator/targets/index.d.ts +0 -4
  279. package/dist/generator/targets/index.d.ts.map +0 -1
  280. package/dist/generator/targets/index.js +0 -10
  281. package/dist/generator/targets/index.js.map +0 -1
  282. package/dist/generator/targets/types.d.ts +0 -8
  283. package/dist/generator/targets/types.d.ts.map +0 -1
  284. package/dist/manifest/compat.d.ts +0 -6
  285. package/dist/manifest/compat.d.ts.map +0 -1
  286. package/dist/manifest/compat.js +0 -56
  287. package/dist/manifest/compat.js.map +0 -1
  288. /package/dist/{generator/targets → plugins}/types.js +0 -0
@@ -1,51 +1,100 @@
1
1
  version: "2"
2
2
  preset_meta:
3
- tags: [security, team, audit]
3
+ tags:
4
+ - security
5
+ - team
6
+ - audit
4
7
  min_version: "2"
5
8
  project:
6
9
  name: placeholder
7
10
  preset: secure-dev
8
- description: High-security team with a dedicated security auditor and strict access controls.
9
-
10
- agents:
11
- orchestrator:
12
- claude:
13
- description: Coordinates the team with security-first mindset. Ensures every change goes through security review.
11
+ description: High-security team with a dedicated security auditor and strict
12
+ access controls.
13
+ policies:
14
+ fragments:
15
+ - allow-git-read
16
+ - allow-git-write
17
+ - ask-git-push
18
+ - deny-destructive-shell
19
+ - deny-network-downloads
20
+ - deny-dynamic-exec
21
+ - deny-env-files
22
+ - sandbox-default
23
+ assertions:
24
+ - rule: require_sandbox_with_execute
25
+ - rule: no_unrestricted_execute
26
+ - rule: deny_skill_for_role
27
+ agent: reviewer
28
+ skill: write_files
29
+ - rule: require_instruction_block
30
+ kind: behavior
31
+ - rule: max_agents
32
+ count: 8
33
+ claude:
34
+ agents:
35
+ orchestrator:
36
+ forge:
37
+ handoffs:
38
+ - planner
39
+ - developer
40
+ - security-auditor
41
+ - reviewer
42
+ description: Coordinates the team with security-first mindset. Ensures every
43
+ change goes through security review.
14
44
  model: opus
15
- capability_traits: [base-read, delegation, no-file-edits, no-commands, no-web]
45
+ capability_traits:
46
+ - base-read
47
+ - delegation
48
+ - no-file-edits
49
+ - no-commands
50
+ - no-web
16
51
  max_turns: 30
17
52
  instruction_fragments:
18
53
  - secure-orchestrator-core
19
54
  - secure-orchestrator-workflow
20
55
  - secure-orchestrator-gate
21
- forge:
22
- handoffs: [planner, developer, security-auditor, reviewer]
23
-
24
- planner:
25
- claude:
26
- description: Plans implementation with security considerations in mind. Identifies potential attack surfaces.
56
+ planner:
57
+ description: Plans implementation with security considerations in mind.
58
+ Identifies potential attack surfaces.
27
59
  model: sonnet
28
- capability_traits: [base-read, no-file-edits, no-commands, no-web]
29
- skills: [architecture-analysis, planning, threat-modeling]
60
+ capability_traits:
61
+ - base-read
62
+ - no-file-edits
63
+ - no-commands
64
+ - no-web
65
+ skills:
66
+ - architecture-analysis
67
+ - planning
68
+ - threat-modeling
30
69
  instruction_fragments:
31
70
  - secure-planning
32
-
33
- developer:
34
- claude:
71
+ developer:
35
72
  description: Implements code securely. Follows OWASP guidelines. No internet access.
36
73
  model: sonnet
37
- capability_traits: [base-read, file-authoring, command-execution, no-web]
38
- skills: [test-first, clean-code, secure-coding]
74
+ capability_traits:
75
+ - base-read
76
+ - file-authoring
77
+ - command-execution
78
+ - no-web
79
+ skills:
80
+ - test-first
81
+ - clean-code
82
+ - secure-coding
39
83
  instruction_fragments:
40
84
  - secure-development
41
85
  - secure-development-tests
42
-
43
- security-auditor:
44
- claude:
45
- description: Performs security review of all code changes. Checks for vulnerabilities before code reaches reviewer.
86
+ security-auditor:
87
+ description: Performs security review of all code changes. Checks for
88
+ vulnerabilities before code reaches reviewer.
46
89
  model: sonnet
47
- capability_traits: [base-read, command-execution, no-file-edits, no-web]
48
- skills: [security-check, vulnerability-scan]
90
+ capability_traits:
91
+ - base-read
92
+ - command-execution
93
+ - no-file-edits
94
+ - no-web
95
+ skills:
96
+ - security-check
97
+ - vulnerability-scan
49
98
  instruction_blocks:
50
99
  - kind: behavior
51
100
  content: |
@@ -57,37 +106,16 @@ agents:
57
106
  - Known vulnerable dependencies
58
107
  instruction_fragments:
59
108
  - security-review-gate
60
-
61
- reviewer:
62
- claude:
109
+ reviewer:
63
110
  description: Reviews code quality and style after security clearance.
64
111
  model: sonnet
65
- capability_traits: [base-read, command-execution, no-file-edits, no-web]
66
- skills: [code-review]
112
+ capability_traits:
113
+ - base-read
114
+ - command-execution
115
+ - no-file-edits
116
+ - no-web
117
+ skills:
118
+ - code-review
67
119
  instruction_fragments:
68
120
  - post-audit-review-core
69
121
  - post-audit-review
70
-
71
- policies:
72
- fragments:
73
- - allow-npm-run
74
- - allow-npm-test
75
- - allow-npm-audit
76
- - allow-git-read
77
- - allow-git-write
78
- - ask-git-push
79
- - deny-destructive-shell
80
- - deny-network-downloads
81
- - deny-dynamic-exec
82
- - deny-env-files
83
- - sandbox-default
84
- assertions:
85
- - rule: require_sandbox_with_execute
86
- - rule: no_unrestricted_execute
87
- - rule: deny_skill_for_role
88
- agent: reviewer
89
- skill: write_files
90
- - rule: require_instruction_block
91
- kind: behavior
92
- - rule: max_agents
93
- count: 8
@@ -1,32 +1,38 @@
1
1
  version: "2"
2
2
  preset_meta:
3
- tags: [solo, simple]
3
+ tags:
4
+ - solo
5
+ - simple
4
6
  min_version: "2"
5
7
  project:
6
8
  name: placeholder
7
9
  preset: solo-dev
8
10
  description: Single enhanced developer agent with safe defaults for individual developers.
9
-
10
- agents:
11
- developer:
12
- claude:
13
- description: Full-stack developer agent. Reads, writes, edits files and runs commands. Use for any development task.
14
- model: sonnet
15
- capability_traits: [base-read, file-authoring, command-execution, web-research, delegation]
16
- skills: [test-first, clean-code, planning]
17
- instruction_fragments:
18
- - solo-dev-core
19
- - solo-dev-workflow
20
- - solo-dev-style
21
-
22
11
  policies:
23
12
  fragments:
24
- - allow-npm-run
25
- - allow-npm-test
26
13
  - allow-git-read
27
14
  - allow-git-write
28
- - allow-npx
29
15
  - ask-git-push
30
16
  - deny-destructive-shell
31
17
  - deny-env-files
32
18
  - sandbox-default
19
+ claude:
20
+ agents:
21
+ developer:
22
+ description: Full-stack developer agent. Reads, writes, edits files and runs
23
+ commands. Use for any development task.
24
+ model: sonnet
25
+ capability_traits:
26
+ - base-read
27
+ - file-authoring
28
+ - command-execution
29
+ - web-research
30
+ - delegation
31
+ skills:
32
+ - test-first
33
+ - clean-code
34
+ - planning
35
+ instruction_fragments:
36
+ - solo-dev-core
37
+ - solo-dev-workflow
38
+ - solo-dev-style
@@ -1,13 +0,0 @@
1
- import type { TeamCastManifest } from '../types/manifest.js';
2
- import type { ValidationResult } from '../validator/types.js';
3
- export interface ManifestValidationSummary {
4
- schemaErrors: Array<{
5
- path: string;
6
- message: string;
7
- }>;
8
- validationResults: ValidationResult[];
9
- }
10
- export declare function evaluateManifest(manifest: TeamCastManifest): ManifestValidationSummary;
11
- export declare function manifestHasBlockingIssues(summary: ManifestValidationSummary): boolean;
12
- export declare function printManifestValidation(summary: ManifestValidationSummary): void;
13
- //# sourceMappingURL=manifest-validation.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest-validation.d.ts","sourceRoot":"","sources":["../../src/cli/manifest-validation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAI/D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D,MAAM,WAAW,yBAAyB;IACxC,YAAY,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACvD,iBAAiB,EAAE,gBAAgB,EAAE,CAAC;CACvC;AAED,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,yBAAyB,CAcxF;AAED,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,yBAAyB,GAAG,OAAO,CAErF;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,yBAAyB,GAAG,IAAI,CAkBhF"}
@@ -1,38 +0,0 @@
1
- import chalk from 'chalk';
2
- import { validateSchema } from '../manifest/schema-validator.js';
3
- import { runValidation } from '../validator/index.js';
4
- import { hasErrors, printValidationReport } from '../validator/reporter.js';
5
- export function evaluateManifest(manifest) {
6
- const schema = validateSchema(manifest);
7
- if (!schema.valid) {
8
- return {
9
- schemaErrors: schema.errors,
10
- validationResults: [],
11
- };
12
- }
13
- return {
14
- schemaErrors: [],
15
- validationResults: runValidation(manifest),
16
- };
17
- }
18
- export function manifestHasBlockingIssues(summary) {
19
- return summary.schemaErrors.length > 0 || hasErrors(summary.validationResults);
20
- }
21
- export function printManifestValidation(summary) {
22
- if (summary.schemaErrors.length > 0) {
23
- console.log('');
24
- console.log(chalk.red(' [x] Manifest failed schema validation'));
25
- for (const error of summary.schemaErrors) {
26
- console.log(chalk.dim(` ${error.path}: ${error.message}`));
27
- }
28
- console.log('');
29
- return;
30
- }
31
- if (summary.validationResults.length > 0) {
32
- printValidationReport(summary.validationResults);
33
- return;
34
- }
35
- console.log(chalk.green(' [ok] Validation passed'));
36
- console.log('');
37
- }
38
- //# sourceMappingURL=manifest-validation.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manifest-validation.js","sourceRoot":"","sources":["../../src/cli/manifest-validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAQ5E,MAAM,UAAU,gBAAgB,CAAC,QAA4B;IAC3D,MAAM,MAAM,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;IAExC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO;YACL,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,iBAAiB,EAAE,EAAE;SACtB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,YAAY,EAAE,EAAE;QAChB,iBAAiB,EAAE,aAAa,CAAC,QAAQ,CAAC;KAC3C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,OAAkC;IAC1E,OAAO,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,uBAAuB,CAAC,OAAkC;IACxE,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,yCAAyC,CAAC,CAAC,CAAC;QAClE,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzC,qBAAqB,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,0BAA0B,CAAC,CAAC,CAAC;IACrD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -1,10 +0,0 @@
1
- import type { AbstractPermission } from './types.js';
2
- export declare const ABSTRACT_PERMISSIONS: AbstractPermission[];
3
- type PermissionBucket = 'allow' | 'ask' | 'deny';
4
- export declare function isAbstractPermission(value: string): value is AbstractPermission;
5
- export declare function normalizePermissionTokens(tokens: string[] | undefined, bucket: PermissionBucket): {
6
- abstract: AbstractPermission[] | undefined;
7
- raw: string[] | undefined;
8
- };
9
- export {};
10
- //# sourceMappingURL=permissions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/core/permissions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,eAAO,MAAM,oBAAoB,EAAE,kBAAkB,EAYpD,CAAC;AAEF,KAAK,gBAAgB,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAC;AA8BjD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,kBAAkB,CAE/E;AAED,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAC5B,MAAM,EAAE,gBAAgB,GACvB;IAAE,QAAQ,EAAE,kBAAkB,EAAE,GAAG,SAAS,CAAC;IAAC,GAAG,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,CA2B3E"}
@@ -1,67 +0,0 @@
1
- export const ABSTRACT_PERMISSIONS = [
2
- 'project.commands',
3
- 'tests',
4
- 'git.read',
5
- 'git.write',
6
- 'package.exec',
7
- 'security.audit',
8
- 'git.push',
9
- 'destructive-shell',
10
- 'downloads',
11
- 'dynamic-exec',
12
- 'env.write',
13
- ];
14
- const LEGACY_PERMISSION_RULE_MAP = {
15
- allow: {
16
- 'Bash(npm run *)': 'project.commands',
17
- 'Bash(npm run)': 'project.commands',
18
- 'Bash(npm test *)': 'tests',
19
- 'Bash(npm test)': 'tests',
20
- 'Bash(git status)': 'git.read',
21
- 'Bash(git diff *)': 'git.read',
22
- 'Bash(git add *)': 'git.write',
23
- 'Bash(git commit *)': 'git.write',
24
- 'Bash(npx *)': 'package.exec',
25
- 'Bash(npm audit)': 'security.audit',
26
- },
27
- ask: {
28
- 'Bash(git push *)': 'git.push',
29
- },
30
- deny: {
31
- 'Bash(rm -rf *)': 'destructive-shell',
32
- 'Bash(git push --force *)': 'destructive-shell',
33
- 'Bash(curl *)': 'downloads',
34
- 'Bash(wget *)': 'downloads',
35
- 'Bash(eval *)': 'dynamic-exec',
36
- 'Bash(exec *)': 'dynamic-exec',
37
- 'Write(.env*)': 'env.write',
38
- 'Edit(.env*)': 'env.write',
39
- },
40
- };
41
- export function isAbstractPermission(value) {
42
- return ABSTRACT_PERMISSIONS.includes(value);
43
- }
44
- export function normalizePermissionTokens(tokens, bucket) {
45
- if (!tokens?.length) {
46
- return { abstract: undefined, raw: undefined };
47
- }
48
- const abstract = new Set();
49
- const raw = new Set();
50
- for (const token of tokens) {
51
- if (isAbstractPermission(token)) {
52
- abstract.add(token);
53
- continue;
54
- }
55
- const mapped = LEGACY_PERMISSION_RULE_MAP[bucket][token];
56
- if (mapped) {
57
- abstract.add(mapped);
58
- continue;
59
- }
60
- raw.add(token);
61
- }
62
- return {
63
- abstract: abstract.size > 0 ? [...abstract] : undefined,
64
- raw: raw.size > 0 ? [...raw] : undefined,
65
- };
66
- }
67
- //# sourceMappingURL=permissions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/core/permissions.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAyB;IACxD,kBAAkB;IAClB,OAAO;IACP,UAAU;IACV,WAAW;IACX,cAAc;IACd,gBAAgB;IAChB,UAAU;IACV,mBAAmB;IACnB,WAAW;IACX,cAAc;IACd,WAAW;CACZ,CAAC;AAIF,MAAM,0BAA0B,GAAiE;IAC/F,KAAK,EAAE;QACL,iBAAiB,EAAE,kBAAkB;QACrC,eAAe,EAAE,kBAAkB;QACnC,kBAAkB,EAAE,OAAO;QAC3B,gBAAgB,EAAE,OAAO;QACzB,kBAAkB,EAAE,UAAU;QAC9B,kBAAkB,EAAE,UAAU;QAC9B,iBAAiB,EAAE,WAAW;QAC9B,oBAAoB,EAAE,WAAW;QACjC,aAAa,EAAE,cAAc;QAC7B,iBAAiB,EAAE,gBAAgB;KACpC;IACD,GAAG,EAAE;QACH,kBAAkB,EAAE,UAAU;KAC/B;IACD,IAAI,EAAE;QACJ,gBAAgB,EAAE,mBAAmB;QACrC,0BAA0B,EAAE,mBAAmB;QAC/C,cAAc,EAAE,WAAW;QAC3B,cAAc,EAAE,WAAW;QAC3B,cAAc,EAAE,cAAc;QAC9B,cAAc,EAAE,cAAc;QAC9B,cAAc,EAAE,WAAW;QAC3B,aAAa,EAAE,WAAW;KAC3B;CACF,CAAC;AAEF,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,oBAAoB,CAAC,QAAQ,CAAC,KAA2B,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,MAA4B,EAC5B,MAAwB;IAExB,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;QACpB,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAsB,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAE9B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,oBAAoB,CAAC,KAAK,CAAC,EAAE,CAAC;YAChC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,SAAS;QACX,CAAC;QAED,MAAM,MAAM,GAAG,0BAA0B,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACjB,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;QACvD,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;KACzC,CAAC;AACJ,CAAC"}
@@ -1,5 +0,0 @@
1
- import type { AgentConfig, TeamCastManifest } from '../../types/manifest.js';
2
- import type { GeneratedFile } from '../types.js';
3
- export declare function renderAgentMd(agentId: string, agent: AgentConfig): string;
4
- export declare function renderAllAgentMd(manifest: TeamCastManifest): GeneratedFile[];
5
- //# sourceMappingURL=agent-md.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-md.d.ts","sourceRoot":"","sources":["../../../src/generator/renderers/agent-md.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE/E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAiBjD,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,MAAM,CAuDzE;AAGD,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,aAAa,EAAE,CAK9E"}
@@ -1,66 +0,0 @@
1
- import { hasAllowList, MODEL_ID_MAP } from '../../types/manifest.js';
2
- // Builds YAML frontmatter string from a key-value map
3
- function buildFrontmatter(fields) {
4
- const lines = fields
5
- .filter(([, v]) => v !== undefined && v !== '')
6
- .map(([k, v]) => `${k}: ${v}`);
7
- return `---\n${lines.join('\n')}\n---`;
8
- }
9
- // Maps model alias to Claude Code model ID
10
- function resolveModel(model) {
11
- if (!model || model === 'inherit')
12
- return undefined;
13
- return MODEL_ID_MAP[model];
14
- }
15
- // Renders a single agent config into a .claude/agents/<name>.md file
16
- export function renderAgentMd(agentId, agent) {
17
- // Build frontmatter fields
18
- const toolsField = agent.tools && hasAllowList(agent.tools)
19
- ? agent.tools.allow.join(',')
20
- : undefined;
21
- const frontmatter = buildFrontmatter([
22
- ['name', agentId],
23
- ['description', agent.description],
24
- ['model', resolveModel(agent.model)],
25
- ['tools', toolsField],
26
- ['permissionMode', agent.permission_mode !== 'default' ? agent.permission_mode : undefined],
27
- ]);
28
- // Build body sections
29
- const sections = [];
30
- if (agent.behavior) {
31
- sections.push(agent.behavior.trim());
32
- }
33
- // Skills reference section
34
- if (agent.skills && agent.skills.length > 0) {
35
- sections.push(`## Skills\n\nUse the following skills when applicable: ${agent.skills.join(', ')}.`);
36
- }
37
- // Delegation section (handoffs)
38
- if (agent.handoffs && agent.handoffs.length > 0) {
39
- sections.push(`## Delegation\n\nYou can delegate tasks to the following agents: ${agent.handoffs.join(', ')}.`);
40
- }
41
- // Constraints section
42
- const constraints = [];
43
- if (agent.max_turns) {
44
- constraints.push(`- Maximum turns: ${agent.max_turns}`);
45
- }
46
- if (agent.tools && hasAllowList(agent.tools) && agent.tools.deny && agent.tools.deny.length > 0) {
47
- constraints.push(`- Never use the following tools: ${agent.tools.deny.join(', ')}`);
48
- }
49
- if (agent.tools && !hasAllowList(agent.tools)) {
50
- // deny-only variant: list what is denied
51
- constraints.push(`- Never use the following tools: ${agent.tools.deny.join(', ')}`);
52
- }
53
- if (constraints.length > 0) {
54
- sections.push(`## Constraints\n\n${constraints.join('\n')}`);
55
- }
56
- const body = sections.length > 0 ? sections.join('\n\n') : '';
57
- return `${frontmatter}\n\n${body}`.trimEnd() + '\n';
58
- }
59
- // Renders all agents in the manifest
60
- export function renderAllAgentMd(manifest) {
61
- return Object.entries(manifest.agents).map(([agentId, agent]) => ({
62
- path: `.claude/agents/${agentId}.md`,
63
- content: renderAgentMd(agentId, agent),
64
- }));
65
- }
66
- //# sourceMappingURL=agent-md.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agent-md.js","sourceRoot":"","sources":["../../../src/generator/renderers/agent-md.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { TeamCastManifest } from '../../types/manifest.js';
2
- import type { GeneratedFile } from '../types.js';
3
- export declare function renderAgentsMd(manifest: TeamCastManifest): GeneratedFile;
4
- //# sourceMappingURL=agents-md.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agents-md.d.ts","sourceRoot":"","sources":["../../../src/generator/renderers/agents-md.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAKjD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,aAAa,CA+F1E"}
@@ -1,86 +0,0 @@
1
- import { hasAllowList } from '../../types/manifest.js';
2
- // Generates AGENTS.md — universal AI agent documentation.
3
- // Read by Codex, GitHub Copilot, Cursor, and other AI coding tools.
4
- // Content is tool-agnostic: project structure, conventions, how to contribute.
5
- export function renderAgentsMd(manifest) {
6
- const lines = [];
7
- const { project, agents, policies } = manifest;
8
- lines.push(`# ${project.name}`);
9
- lines.push('');
10
- if (project.description) {
11
- lines.push(project.description);
12
- lines.push('');
13
- }
14
- // Project structure hint — generic, helps any AI understand the codebase layout
15
- lines.push('## Project Overview');
16
- lines.push('');
17
- lines.push('This project uses a multi-agent architecture managed by AgentForge.');
18
- lines.push(`Agent configuration: \`agentforge.yaml\` (edit this file, then run \`agentforge generate\`)`);
19
- lines.push('');
20
- // Agent roster — who is in the team and what they do
21
- lines.push('## Agent Roster');
22
- lines.push('');
23
- for (const [agentId, agent] of Object.entries(agents)) {
24
- const model = agent.model ?? manifest.settings?.default_model ?? 'sonnet';
25
- lines.push(`### ${agentId}`);
26
- lines.push('');
27
- lines.push(`**Role:** ${agent.description}`);
28
- lines.push(`**Model:** ${model}`);
29
- lines.push('');
30
- if (agent.tools) {
31
- if (hasAllowList(agent.tools)) {
32
- lines.push(`**Allowed tools:** ${agent.tools.allow.join(', ')}`);
33
- if (agent.tools.deny?.length) {
34
- lines.push(`**Restricted tools:** ${agent.tools.deny.join(', ')}`);
35
- }
36
- }
37
- else {
38
- lines.push(`**Restricted tools:** ${agent.tools.deny.join(', ')}`);
39
- }
40
- }
41
- if (agent.handoffs?.length) {
42
- lines.push(`**Can delegate to:** ${agent.handoffs.join(', ')}`);
43
- }
44
- if (agent.skills?.length) {
45
- lines.push(`**Skills:** ${agent.skills.join(', ')}`);
46
- }
47
- lines.push('');
48
- }
49
- // Access control summary — useful for any agent to know what's safe to do
50
- lines.push('## Access Control');
51
- lines.push('');
52
- if (policies?.permissions?.allow?.length) {
53
- lines.push('**Permitted operations:**');
54
- for (const rule of policies.permissions.allow) {
55
- lines.push(`- \`${rule}\``);
56
- }
57
- lines.push('');
58
- }
59
- if (policies?.permissions?.deny?.length) {
60
- lines.push('**Prohibited operations:**');
61
- for (const rule of policies.permissions.deny) {
62
- lines.push(`- \`${rule}\``);
63
- }
64
- lines.push('');
65
- }
66
- if (policies?.permissions?.ask?.length) {
67
- lines.push('**Requires confirmation:**');
68
- for (const rule of policies.permissions.ask) {
69
- lines.push(`- \`${rule}\``);
70
- }
71
- lines.push('');
72
- }
73
- if (policies?.network?.allowed_domains?.length) {
74
- lines.push(`**Network access:** restricted to ${policies.network.allowed_domains.join(', ')}`);
75
- lines.push('');
76
- }
77
- lines.push('---');
78
- lines.push('');
79
- lines.push('*Generated by [AgentForge](https://github.com/agentforge/agentforge)*');
80
- lines.push('');
81
- return {
82
- path: 'AGENTS.md',
83
- content: lines.join('\n'),
84
- };
85
- }
86
- //# sourceMappingURL=agents-md.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"agents-md.js","sourceRoot":"","sources":["../../../src/generator/renderers/agents-md.ts"],"names":[],"mappings":"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"}
@@ -1,4 +0,0 @@
1
- import type { TeamCastManifest } from '../../types/manifest.js';
2
- import type { GeneratedFile } from '../types.js';
3
- export declare function renderClaudeMd(manifest: TeamCastManifest): GeneratedFile;
4
- //# sourceMappingURL=claude-md.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../../src/generator/renderers/claude-md.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAIjD,wBAAgB,cAAc,CAAC,QAAQ,EAAE,kBAAkB,GAAG,aAAa,CA8E1E"}
@@ -1,68 +0,0 @@
1
- import { hasAllowList } from '../../types/manifest.js';
2
- // Generates CLAUDE.md — instructions for the main Claude Code session.
3
- // This is the primary mechanism ensuring agents are actually used.
4
- export function renderClaudeMd(manifest) {
5
- const lines = [];
6
- const { project, agents } = manifest;
7
- lines.push(`# ${project.name}`);
8
- lines.push('');
9
- if (project.description) {
10
- lines.push(project.description);
11
- lines.push('');
12
- }
13
- // Agent team section — the key part that drives delegation
14
- lines.push('## Agent Team');
15
- lines.push('');
16
- lines.push('This project uses a multi-agent setup. Delegate tasks to the appropriate agent:');
17
- lines.push('');
18
- lines.push('| Agent | When to use |');
19
- lines.push('|-------|-------------|');
20
- for (const [agentId, agent] of Object.entries(agents)) {
21
- lines.push(`| **${agentId}** | ${agent.description} |`);
22
- }
23
- lines.push('');
24
- // Find orchestrator-like agents (have Task + handoffs) — these are entry points
25
- const entryPoints = Object.entries(agents).filter(([, agent]) => {
26
- const hasTask = agent.tools && hasAllowList(agent.tools) && agent.tools.allow.includes('Task');
27
- const hasHandoffs = agent.handoffs && agent.handoffs.length > 0;
28
- return hasTask && hasHandoffs;
29
- });
30
- if (entryPoints.length > 0) {
31
- lines.push('### Preferred workflow');
32
- lines.push('');
33
- for (const [agentId, agent] of entryPoints) {
34
- const chain = agent.handoffs ? [agentId, ...agent.handoffs].join(' → ') : agentId;
35
- lines.push(`For complex tasks, start with **${agentId}**: \`${chain}\``);
36
- }
37
- lines.push('');
38
- lines.push('For simple single-file changes, work directly without delegation.');
39
- lines.push('');
40
- }
41
- // Security boundaries summary
42
- const policies = manifest.policies;
43
- if (policies) {
44
- lines.push('## Security Boundaries');
45
- lines.push('');
46
- if (policies.sandbox?.enabled) {
47
- lines.push('- Sandbox is **enabled**');
48
- }
49
- const denied = policies.permissions?.deny ?? [];
50
- if (denied.length > 0) {
51
- lines.push(`- Blocked operations: ${denied.join(', ')}`);
52
- }
53
- const allowed = policies.permissions?.allow ?? [];
54
- if (allowed.length > 0) {
55
- lines.push(`- Allowed shell commands: ${allowed.join(', ')}`);
56
- }
57
- lines.push('');
58
- }
59
- lines.push('---');
60
- lines.push('');
61
- lines.push('*Agent configuration managed by [AgentForge](https://github.com/agentforge/agentforge). Edit `agentforge.yaml` and run `agentforge generate` to update.*');
62
- lines.push('');
63
- return {
64
- path: 'CLAUDE.md',
65
- content: lines.join('\n'),
66
- };
67
- }
68
- //# sourceMappingURL=claude-md.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../../src/generator/renderers/claude-md.ts"],"names":[],"mappings":"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"}