@mindfoldhq/trellis 0.3.0-rc.5 → 0.3.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 (121) hide show
  1. package/README.md +16 -4
  2. package/dist/cli/index.js +4 -0
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/commands/init.d.ts +4 -0
  5. package/dist/commands/init.d.ts.map +1 -1
  6. package/dist/commands/init.js +29 -15
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/update.d.ts.map +1 -1
  9. package/dist/commands/update.js +19 -11
  10. package/dist/commands/update.js.map +1 -1
  11. package/dist/configurators/antigravity.d.ts +8 -0
  12. package/dist/configurators/antigravity.d.ts.map +1 -0
  13. package/dist/configurators/antigravity.js +18 -0
  14. package/dist/configurators/antigravity.js.map +1 -0
  15. package/dist/configurators/gemini.d.ts +8 -0
  16. package/dist/configurators/gemini.d.ts.map +1 -0
  17. package/dist/configurators/gemini.js +52 -0
  18. package/dist/configurators/gemini.js.map +1 -0
  19. package/dist/configurators/index.d.ts.map +1 -1
  20. package/dist/configurators/index.js +49 -1
  21. package/dist/configurators/index.js.map +1 -1
  22. package/dist/configurators/kilo.d.ts +8 -0
  23. package/dist/configurators/kilo.d.ts.map +1 -0
  24. package/dist/configurators/kilo.js +51 -0
  25. package/dist/configurators/kilo.js.map +1 -0
  26. package/dist/configurators/kiro.d.ts +8 -0
  27. package/dist/configurators/kiro.d.ts.map +1 -0
  28. package/dist/configurators/kiro.js +20 -0
  29. package/dist/configurators/kiro.js.map +1 -0
  30. package/dist/migrations/manifests/0.3.0-rc.6.json +9 -0
  31. package/dist/migrations/manifests/0.3.0.json +11 -0
  32. package/dist/templates/antigravity/index.d.ts +12 -0
  33. package/dist/templates/antigravity/index.d.ts.map +1 -0
  34. package/dist/templates/antigravity/index.js +29 -0
  35. package/dist/templates/antigravity/index.js.map +1 -0
  36. package/dist/templates/claude/agents/implement.md +1 -1
  37. package/dist/templates/claude/commands/trellis/brainstorm.md +16 -18
  38. package/dist/templates/claude/commands/trellis/start.md +73 -48
  39. package/dist/templates/codex/skills/brainstorm/SKILL.md +16 -18
  40. package/dist/templates/codex/skills/start/SKILL.md +80 -46
  41. package/dist/templates/cursor/commands/trellis-brainstorm.md +16 -18
  42. package/dist/templates/cursor/commands/trellis-start.md +191 -23
  43. package/dist/templates/extract.d.ts +52 -0
  44. package/dist/templates/extract.d.ts.map +1 -1
  45. package/dist/templates/extract.js +90 -0
  46. package/dist/templates/extract.js.map +1 -1
  47. package/dist/templates/gemini/commands/trellis/before-backend-dev.toml +17 -0
  48. package/dist/templates/gemini/commands/trellis/before-frontend-dev.toml +17 -0
  49. package/dist/templates/gemini/commands/trellis/brainstorm.toml +420 -0
  50. package/dist/templates/gemini/commands/trellis/break-loop.toml +129 -0
  51. package/dist/templates/gemini/commands/trellis/check-backend.toml +17 -0
  52. package/dist/templates/gemini/commands/trellis/check-cross-layer.toml +147 -0
  53. package/dist/templates/gemini/commands/trellis/check-frontend.toml +17 -0
  54. package/dist/templates/gemini/commands/trellis/create-command.toml +119 -0
  55. package/dist/templates/gemini/commands/trellis/finish-work.toml +133 -0
  56. package/dist/templates/gemini/commands/trellis/integrate-skill.toml +104 -0
  57. package/dist/templates/gemini/commands/trellis/onboard.toml +111 -0
  58. package/dist/templates/gemini/commands/trellis/record-session.toml +66 -0
  59. package/dist/templates/gemini/commands/trellis/start.toml +292 -0
  60. package/dist/templates/gemini/commands/trellis/update-spec.toml +132 -0
  61. package/dist/templates/gemini/index.d.ts +21 -0
  62. package/dist/templates/gemini/index.d.ts.map +1 -0
  63. package/dist/templates/gemini/index.js +44 -0
  64. package/dist/templates/gemini/index.js.map +1 -0
  65. package/dist/templates/iflow/agents/implement.md +1 -1
  66. package/dist/templates/iflow/commands/trellis/brainstorm.md +16 -18
  67. package/dist/templates/iflow/commands/trellis/finish-work.md +9 -0
  68. package/dist/templates/iflow/commands/trellis/start.md +108 -50
  69. package/dist/templates/iflow/index.d.ts +3 -2
  70. package/dist/templates/iflow/index.d.ts.map +1 -1
  71. package/dist/templates/iflow/index.js +7 -9
  72. package/dist/templates/iflow/index.js.map +1 -1
  73. package/dist/templates/kilo/commands/trellis/before-backend-dev.md +13 -0
  74. package/dist/templates/kilo/commands/trellis/before-frontend-dev.md +13 -0
  75. package/dist/templates/kilo/commands/trellis/brainstorm.md +474 -0
  76. package/dist/templates/kilo/commands/trellis/break-loop.md +125 -0
  77. package/dist/templates/kilo/commands/trellis/check-backend.md +13 -0
  78. package/dist/templates/kilo/commands/trellis/check-cross-layer.md +153 -0
  79. package/dist/templates/kilo/commands/trellis/check-frontend.md +13 -0
  80. package/dist/templates/kilo/commands/trellis/create-command.md +152 -0
  81. package/dist/templates/kilo/commands/trellis/finish-work.md +129 -0
  82. package/dist/templates/kilo/commands/trellis/integrate-skill.md +219 -0
  83. package/dist/templates/kilo/commands/trellis/onboard.md +358 -0
  84. package/dist/templates/kilo/commands/trellis/parallel.md +194 -0
  85. package/dist/templates/kilo/commands/trellis/record-session.md +62 -0
  86. package/dist/templates/kilo/commands/trellis/start.md +321 -0
  87. package/dist/templates/kilo/commands/trellis/update-spec.md +285 -0
  88. package/dist/templates/kilo/index.d.ts +16 -0
  89. package/dist/templates/kilo/index.d.ts.map +1 -0
  90. package/dist/templates/kilo/index.js +39 -0
  91. package/dist/templates/kilo/index.js.map +1 -0
  92. package/dist/templates/kiro/index.d.ts +18 -0
  93. package/dist/templates/kiro/index.d.ts.map +1 -0
  94. package/dist/templates/kiro/index.js +40 -0
  95. package/dist/templates/kiro/index.js.map +1 -0
  96. package/dist/templates/kiro/skills/before-backend-dev/SKILL.md +18 -0
  97. package/dist/templates/kiro/skills/before-frontend-dev/SKILL.md +18 -0
  98. package/dist/templates/kiro/skills/brainstorm/SKILL.md +479 -0
  99. package/dist/templates/kiro/skills/break-loop/SKILL.md +130 -0
  100. package/dist/templates/kiro/skills/check-backend/SKILL.md +18 -0
  101. package/dist/templates/kiro/skills/check-cross-layer/SKILL.md +158 -0
  102. package/dist/templates/kiro/skills/check-frontend/SKILL.md +18 -0
  103. package/dist/templates/kiro/skills/create-command/SKILL.md +101 -0
  104. package/dist/templates/kiro/skills/finish-work/SKILL.md +148 -0
  105. package/dist/templates/kiro/skills/integrate-skill/SKILL.md +221 -0
  106. package/dist/templates/kiro/skills/onboard/SKILL.md +363 -0
  107. package/dist/templates/kiro/skills/record-session/SKILL.md +67 -0
  108. package/dist/templates/kiro/skills/start/SKILL.md +330 -0
  109. package/dist/templates/kiro/skills/update-spec/SKILL.md +335 -0
  110. package/dist/templates/opencode/agents/implement.md +1 -1
  111. package/dist/templates/opencode/agents/research.md +1 -2
  112. package/dist/templates/opencode/commands/trellis/brainstorm.md +16 -18
  113. package/dist/templates/opencode/commands/trellis/start.md +71 -48
  114. package/dist/templates/trellis/scripts/common/cli_adapter.py +100 -12
  115. package/dist/templates/trellis/scripts/common/registry.py +1 -1
  116. package/dist/templates/trellis/scripts/task.py +1 -8
  117. package/dist/types/ai-tools.d.ts +4 -4
  118. package/dist/types/ai-tools.d.ts.map +1 -1
  119. package/dist/types/ai-tools.js +32 -0
  120. package/dist/types/ai-tools.js.map +1 -1
  121. package/package.json +3 -2
@@ -443,28 +443,26 @@ Context / Decision / Consequences
443
443
 
444
444
  ## Integration with Start Workflow
445
445
 
446
- High-level flow:
446
+ After brainstorm completes (Step 8 confirmation approved), the flow continues to the Task Workflow's **Phase 2: Prepare for Implementation**:
447
447
 
448
448
  ```text
449
- User describes task
450
-
451
- Step 0: Ensure task exists (create if missing)
452
-
453
- Step 1: Auto-context (inspect repo/docs, research if needed)
454
-
455
- Step 2: Classify complexity
456
-
457
- Step 4 (if triggered): Research-first propose options
458
-
459
- Step 5: Expansion sweep (diverge)
460
-
461
- Step 6: Q&A loop (converge; update PRD each turn)
462
-
463
- Step 8: Final confirmation + small-PR plan
464
-
465
- Implement
449
+ Brainstorm
450
+ Step 0: Create task directory + seed PRD
451
+ Step 1–7: Discover requirements, research, converge
452
+ Step 8: Final confirmation → user approves
453
+
454
+ Task Workflow Phase 2 (Prepare for Implementation)
455
+ Code-Spec Depth Check (if applicable)
456
+ → Research codebase (based on confirmed PRD)
457
+ Configure code-spec context (jsonl files)
458
+ → Activate task
459
+
460
+ Task Workflow Phase 3 (Execute)
461
+ Implement Check Complete
466
462
  ```
467
463
 
464
+ The task directory and PRD already exist from brainstorm, so Phase 1 of the Task Workflow is skipped entirely.
465
+
468
466
  ---
469
467
 
470
468
  ## Related Commands
@@ -104,18 +104,70 @@ See `/trellis:brainstorm` for the full process. Summary:
104
104
  - Check Agent verifies against code-spec requirements
105
105
  - Result: Code that follows project conventions automatically
106
106
 
107
- ### Step 1: Understand the Task `[AI]`
107
+ ### Overview: Two Entry Points
108
108
 
109
- **If coming from Brainstorm:** Skip this step - requirements are already in PRD.
109
+ ```
110
+ From Brainstorm (Complex Task):
111
+ PRD confirmed → Research → Configure Context → Activate → Implement → Check → Complete
112
+
113
+ From Simple Task:
114
+ Confirm → Create Task → Write PRD → Research → Configure Context → Activate → Implement → Check → Complete
115
+ ```
116
+
117
+ **Key principle: Research happens AFTER requirements are clear (PRD exists).**
118
+
119
+ ---
120
+
121
+ ### Phase 1: Establish Requirements
122
+
123
+ #### Path A: From Brainstorm (skip to Phase 2)
124
+
125
+ PRD and task directory already exist from brainstorm. Skip directly to Phase 2.
110
126
 
111
- **If Simple Task:** Quick confirm understanding:
127
+ #### Path B: From Simple Task
128
+
129
+ **Step 1: Confirm Understanding** `[AI]`
130
+
131
+ Quick confirm:
112
132
  - What is the goal?
113
133
  - What type of development? (frontend / backend / fullstack)
114
134
  - Any specific requirements or constraints?
115
135
 
116
- If unclear, ask clarifying questions.
136
+ **Step 2: Create Task Directory** `[AI]`
137
+
138
+ ```bash
139
+ TASK_DIR=$(python3 ./.trellis/scripts/task.py create "<title>" --slug <name>)
140
+ ```
117
141
 
118
- ### Step 1.5: Code-Spec Depth Requirement (CRITICAL) `[AI]`
142
+ **Step 3: Write PRD** `[AI]`
143
+
144
+ Create `prd.md` in the task directory with:
145
+
146
+ ```markdown
147
+ # <Task Title>
148
+
149
+ ## Goal
150
+ <What we're trying to achieve>
151
+
152
+ ## Requirements
153
+ - <Requirement 1>
154
+ - <Requirement 2>
155
+
156
+ ## Acceptance Criteria
157
+ - [ ] <Criterion 1>
158
+ - [ ] <Criterion 2>
159
+
160
+ ## Technical Notes
161
+ <Any technical decisions or constraints>
162
+ ```
163
+
164
+ ---
165
+
166
+ ### Phase 2: Prepare for Implementation (shared)
167
+
168
+ > Both paths converge here. PRD and task directory must exist before proceeding.
169
+
170
+ **Step 4: Code-Spec Depth Check** `[AI]`
119
171
 
120
172
  If the task touches infra or cross-layer contracts, do not start implementation until code-spec depth is defined.
121
173
 
@@ -125,22 +177,22 @@ Trigger this requirement when the change includes any of:
125
177
  - Infra integrations (storage, queue, cache, secrets, env contracts)
126
178
  - Cross-layer payload transformations
127
179
 
128
- Must-have before implementation:
180
+ Must-have before proceeding:
129
181
  - [ ] Target code-spec files to update are identified
130
182
  - [ ] Concrete contract is defined (signature, fields, env keys)
131
183
  - [ ] Validation and error matrix is defined
132
184
  - [ ] At least one Good/Base/Bad case is defined
133
185
 
134
- ### Step 2: Research the Codebase `[AI]`
186
+ **Step 5: Research the Codebase** `[AI]`
135
187
 
136
- Call Research Agent to analyze:
188
+ Based on the confirmed PRD, call Research Agent to find relevant specs and patterns:
137
189
 
138
190
  ```
139
191
  Task(
140
192
  subagent_type: "research",
141
193
  prompt: "Analyze the codebase for this task:
142
194
 
143
- Task: <user's task description>
195
+ Task: <goal from PRD>
144
196
  Type: <frontend/backend/fullstack>
145
197
 
146
198
  Please find:
@@ -156,23 +208,12 @@ Task(
156
208
  - <pattern>: <example file path>
157
209
 
158
210
  ## Files to Modify
159
- - <path>: <what change>
160
-
161
- ## Suggested Task Name
162
- - <short-slug-name>",
211
+ - <path>: <what change>",
163
212
  model: "opus"
164
213
  )
165
214
  ```
166
215
 
167
- ### Step 3: Create Task Directory `[AI]`
168
-
169
- Based on research results:
170
-
171
- ```bash
172
- TASK_DIR=$(python3 ./.trellis/scripts/task.py create "<title from research>" --slug <suggested-slug>)
173
- ```
174
-
175
- ### Step 4: Configure Context `[AI]`
216
+ **Step 6: Configure Context** `[AI]`
176
217
 
177
218
  Initialize default context:
178
219
 
@@ -189,29 +230,7 @@ python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" implement "<path>" "<
189
230
  python3 ./.trellis/scripts/task.py add-context "$TASK_DIR" check "<path>" "<reason>"
190
231
  ```
191
232
 
192
- ### Step 5: Write Requirements `[AI]`
193
-
194
- Create `prd.md` in the task directory with:
195
-
196
- ```markdown
197
- # <Task Title>
198
-
199
- ## Goal
200
- <What we're trying to achieve>
201
-
202
- ## Requirements
203
- - <Requirement 1>
204
- - <Requirement 2>
205
-
206
- ## Acceptance Criteria
207
- - [ ] <Criterion 1>
208
- - [ ] <Criterion 2>
209
-
210
- ## Technical Notes
211
- <Any technical decisions or constraints>
212
- ```
213
-
214
- ### Step 6: Activate Task `[AI]`
233
+ **Step 7: Activate Task** `[AI]`
215
234
 
216
235
  ```bash
217
236
  python3 ./.trellis/scripts/task.py start "$TASK_DIR"
@@ -219,7 +238,11 @@ python3 ./.trellis/scripts/task.py start "$TASK_DIR"
219
238
 
220
239
  This sets `.current-task` so hooks can inject context.
221
240
 
222
- ### Step 7: Implement `[AI]`
241
+ ---
242
+
243
+ ### Phase 3: Execute (shared)
244
+
245
+ **Step 8: Implement** `[AI]`
223
246
 
224
247
  Call Implement Agent (code-spec context is auto-injected by hook):
225
248
 
@@ -234,7 +257,7 @@ Task(
234
257
  )
235
258
  ```
236
259
 
237
- ### Step 8: Check Quality `[AI]`
260
+ **Step 9: Check Quality** `[AI]`
238
261
 
239
262
  Call Check Agent (code-spec context is auto-injected by hook):
240
263
 
@@ -249,7 +272,7 @@ Task(
249
272
  )
250
273
  ```
251
274
 
252
- ### Step 9: Complete `[AI]`
275
+ **Step 10: Complete** `[AI]`
253
276
 
254
277
  1. Verify lint and typecheck pass
255
278
  2. Report what was implemented
@@ -1,7 +1,7 @@
1
1
  """
2
2
  CLI Adapter for Multi-Platform Support.
3
3
 
4
- Abstracts differences between Claude Code, OpenCode, Cursor, iFlow, and Codex interfaces.
4
+ Abstracts differences between Claude Code, OpenCode, Cursor, iFlow, Codex, Kilo, Kiro Code, Gemini CLI, and Antigravity interfaces.
5
5
 
6
6
  Supported platforms:
7
7
  - claude: Claude Code (default)
@@ -9,6 +9,10 @@ Supported platforms:
9
9
  - cursor: Cursor IDE
10
10
  - iflow: iFlow CLI
11
11
  - codex: Codex CLI (skills-based)
12
+ - kilo: Kilo CLI
13
+ - kiro: Kiro Code (skills-based)
14
+ - gemini: Gemini CLI
15
+ - antigravity: Antigravity (workflow-based)
12
16
 
13
17
  Usage:
14
18
  from common.cli_adapter import CLIAdapter
@@ -27,7 +31,7 @@ from dataclasses import dataclass
27
31
  from pathlib import Path
28
32
  from typing import ClassVar, Literal
29
33
 
30
- Platform = Literal["claude", "opencode", "cursor", "iflow", "codex"]
34
+ Platform = Literal["claude", "opencode", "cursor", "iflow", "codex", "kilo", "kiro", "gemini", "antigravity"]
31
35
 
32
36
 
33
37
  @dataclass
@@ -71,7 +75,7 @@ class CLIAdapter:
71
75
  """Get platform-specific config directory name.
72
76
 
73
77
  Returns:
74
- Directory name ('.claude', '.opencode', '.cursor', '.iflow', or '.agents')
78
+ Directory name ('.claude', '.opencode', '.cursor', '.iflow', '.agents', '.kilocode', '.kiro', '.gemini', or '.agent')
75
79
  """
76
80
  if self.platform == "opencode":
77
81
  return ".opencode"
@@ -81,6 +85,14 @@ class CLIAdapter:
81
85
  return ".iflow"
82
86
  elif self.platform == "codex":
83
87
  return ".agents"
88
+ elif self.platform == "kilo":
89
+ return ".kilocode"
90
+ elif self.platform == "kiro":
91
+ return ".kiro"
92
+ elif self.platform == "gemini":
93
+ return ".gemini"
94
+ elif self.platform == "antigravity":
95
+ return ".agent"
84
96
  else:
85
97
  return ".claude"
86
98
 
@@ -91,7 +103,7 @@ class CLIAdapter:
91
103
  project_root: Project root directory
92
104
 
93
105
  Returns:
94
- Path to config directory (.claude, .opencode, .cursor, .iflow, or .agents)
106
+ Path to config directory (.claude, .opencode, .cursor, .iflow, .agents, .kilocode, .kiro, or .agent)
95
107
  """
96
108
  return project_root / self.config_dir_name
97
109
 
@@ -120,8 +132,18 @@ class CLIAdapter:
120
132
 
121
133
  Note:
122
134
  Cursor uses prefix naming: .cursor/commands/trellis-<name>.md
135
+ Antigravity uses workflow directory: .agent/workflows/<name>.md
123
136
  Claude/OpenCode use subdirectory: .claude/commands/trellis/<name>.md
124
137
  """
138
+ if self.platform == "antigravity":
139
+ workflow_dir = self.get_config_dir(project_root) / "workflows"
140
+ if not parts:
141
+ return workflow_dir
142
+ if len(parts) >= 2 and parts[0] == "trellis":
143
+ filename = parts[-1]
144
+ return workflow_dir / filename
145
+ return workflow_dir / Path(*parts)
146
+
125
147
  if not parts:
126
148
  return self.get_config_dir(project_root) / "commands"
127
149
 
@@ -145,12 +167,21 @@ class CLIAdapter:
145
167
  Note:
146
168
  Cursor: .cursor/commands/trellis-<name>.md
147
169
  Codex: .agents/skills/<name>/SKILL.md
170
+ Kiro: .kiro/skills/<name>/SKILL.md
171
+ Gemini: .gemini/commands/trellis/<name>.toml
172
+ Antigravity: .agent/workflows/<name>.md
148
173
  Others: .{platform}/commands/trellis/<name>.md
149
174
  """
150
175
  if self.platform == "cursor":
151
176
  return f".cursor/commands/trellis-{name}.md"
152
177
  elif self.platform == "codex":
153
178
  return f".agents/skills/{name}/SKILL.md"
179
+ elif self.platform == "kiro":
180
+ return f".kiro/skills/{name}/SKILL.md"
181
+ elif self.platform == "gemini":
182
+ return f".gemini/commands/trellis/{name}.toml"
183
+ elif self.platform == "antigravity":
184
+ return f".agent/workflows/{name}.md"
154
185
  else:
155
186
  return f"{self.config_dir_name}/commands/trellis/{name}.md"
156
187
 
@@ -168,6 +199,12 @@ class CLIAdapter:
168
199
  return {"OPENCODE_NON_INTERACTIVE": "1"}
169
200
  elif self.platform == "codex":
170
201
  return {"CODEX_NON_INTERACTIVE": "1"}
202
+ elif self.platform == "kiro":
203
+ return {"KIRO_NON_INTERACTIVE": "1"}
204
+ elif self.platform == "gemini":
205
+ return {} # Gemini CLI doesn't have a non-interactive env var
206
+ elif self.platform == "antigravity":
207
+ return {}
171
208
  else:
172
209
  return {"CLAUDE_NON_INTERACTIVE": "1"}
173
210
 
@@ -221,6 +258,15 @@ class CLIAdapter:
221
258
  elif self.platform == "codex":
222
259
  cmd = ["codex", "exec"]
223
260
  cmd.append(prompt)
261
+ elif self.platform == "kiro":
262
+ cmd = ["kiro", "run", prompt]
263
+ elif self.platform == "gemini":
264
+ cmd = ["gemini"]
265
+ cmd.append(prompt)
266
+ elif self.platform == "antigravity":
267
+ raise ValueError(
268
+ "Antigravity workflows are UI slash commands; CLI agent run is not supported."
269
+ )
224
270
 
225
271
  else: # claude
226
272
  cmd = ["claude", "-p"]
@@ -255,6 +301,14 @@ class CLIAdapter:
255
301
  return ["opencode", "run", "--session", session_id]
256
302
  elif self.platform == "codex":
257
303
  return ["codex", "resume", session_id]
304
+ elif self.platform == "kiro":
305
+ return ["kiro", "resume", session_id]
306
+ elif self.platform == "gemini":
307
+ return ["gemini", "--resume", session_id]
308
+ elif self.platform == "antigravity":
309
+ raise ValueError(
310
+ "Antigravity workflows are UI slash commands; CLI resume is not supported."
311
+ )
258
312
  else:
259
313
  return ["claude", "--resume", session_id]
260
314
 
@@ -304,6 +358,12 @@ class CLIAdapter:
304
358
  return "opencode"
305
359
  elif self.is_cursor:
306
360
  return "cursor" # Note: Cursor is IDE-only, no CLI
361
+ elif self.platform == "kiro":
362
+ return "kiro"
363
+ elif self.platform == "gemini":
364
+ return "gemini"
365
+ elif self.platform == "antigravity":
366
+ return "agy"
307
367
  else:
308
368
  return "claude"
309
369
 
@@ -358,7 +418,7 @@ def get_cli_adapter(platform: str = "claude") -> CLIAdapter:
358
418
  """Get CLI adapter for the specified platform.
359
419
 
360
420
  Args:
361
- platform: Platform name ('claude', 'opencode', 'cursor', 'iflow', or 'codex')
421
+ platform: Platform name ('claude', 'opencode', 'cursor', 'iflow', 'codex', 'kilo', 'kiro', or 'antigravity')
362
422
 
363
423
  Returns:
364
424
  CLIAdapter instance
@@ -366,8 +426,8 @@ def get_cli_adapter(platform: str = "claude") -> CLIAdapter:
366
426
  Raises:
367
427
  ValueError: If platform is not supported
368
428
  """
369
- if platform not in ("claude", "opencode", "cursor", "iflow", "codex"):
370
- raise ValueError(f"Unsupported platform: {platform} (must be 'claude', 'opencode', 'cursor', 'iflow', or 'codex')")
429
+ if platform not in ("claude", "opencode", "cursor", "iflow", "codex", "kilo", "kiro", "gemini", "antigravity"):
430
+ raise ValueError(f"Unsupported platform: {platform} (must be 'claude', 'opencode', 'cursor', 'iflow', 'codex', 'kilo', 'kiro', 'gemini', or 'antigravity')")
371
431
 
372
432
  return CLIAdapter(platform=platform) # type: ignore
373
433
 
@@ -381,19 +441,23 @@ def detect_platform(project_root: Path) -> Platform:
381
441
  3. .iflow directory exists → iflow
382
442
  4. .cursor directory exists (without .claude) → cursor
383
443
  5. .agents/skills exists and no other platform dirs → codex
384
- 6. Defaultclaude
444
+ 6. .kilocode directory exists kilo
445
+ 7. .kiro/skills exists and no other platform dirs → kiro
446
+ 8. .gemini directory exists → gemini
447
+ 9. .agent/workflows exists and no other platform dirs → antigravity
448
+ 10. Default → claude
385
449
 
386
450
  Args:
387
451
  project_root: Project root directory
388
452
 
389
453
  Returns:
390
- Detected platform ('claude', 'opencode', 'cursor', 'iflow', or 'codex')
454
+ Detected platform ('claude', 'opencode', 'cursor', 'iflow', 'codex', 'kilo', 'kiro', 'gemini', or 'antigravity')
391
455
  """
392
456
  import os
393
457
 
394
458
  # Check environment variable first
395
459
  env_platform = os.environ.get("TRELLIS_PLATFORM", "").lower()
396
- if env_platform in ("claude", "opencode", "cursor", "iflow", "codex"):
460
+ if env_platform in ("claude", "opencode", "cursor", "iflow", "codex", "kilo", "kiro", "gemini", "antigravity"):
397
461
  return env_platform # type: ignore
398
462
 
399
463
  # Check for .opencode directory (OpenCode-specific)
@@ -411,14 +475,38 @@ def detect_platform(project_root: Path) -> Platform:
411
475
  if (project_root / ".cursor").is_dir() and not (project_root / ".claude").is_dir():
412
476
  return "cursor"
413
477
 
478
+ # Check for .gemini directory (Gemini CLI-specific)
479
+ if (project_root / ".gemini").is_dir():
480
+ return "gemini"
481
+
414
482
  # Check for Codex skills directory only when no other platform config exists
415
- other_platform_dirs = (".claude", ".cursor", ".iflow", ".opencode")
483
+ other_platform_dirs_codex = (".claude", ".cursor", ".iflow", ".opencode", ".kilocode", ".kiro", ".gemini", ".agent")
416
484
  has_other_platform_config = any(
417
- (project_root / directory).is_dir() for directory in other_platform_dirs
485
+ (project_root / directory).is_dir() for directory in other_platform_dirs_codex
418
486
  )
419
487
  if (project_root / ".agents" / "skills").is_dir() and not has_other_platform_config:
420
488
  return "codex"
421
489
 
490
+ # Check for .kilocode directory (Kilo-specific)
491
+ if (project_root / ".kilocode").is_dir():
492
+ return "kilo"
493
+
494
+ # Check for Kiro skills directory only when no other platform config exists
495
+ other_platform_dirs_kiro = (".claude", ".cursor", ".iflow", ".opencode", ".agents", ".kilocode", ".gemini", ".agent")
496
+ has_other_platform_config = any(
497
+ (project_root / directory).is_dir() for directory in other_platform_dirs_kiro
498
+ )
499
+ if (project_root / ".kiro" / "skills").is_dir() and not has_other_platform_config:
500
+ return "kiro"
501
+
502
+ # Check for Antigravity workflow directory only when no other platform config exists
503
+ other_platform_dirs_antigravity = (".claude", ".cursor", ".iflow", ".opencode", ".agents", ".kilocode", ".kiro")
504
+ has_other_platform_config = any(
505
+ (project_root / directory).is_dir() for directory in other_platform_dirs_antigravity
506
+ )
507
+ if (project_root / ".agent" / "workflows").is_dir() and not has_other_platform_config:
508
+ return "antigravity"
509
+
422
510
  return "claude"
423
511
 
424
512
 
@@ -290,7 +290,7 @@ def registry_add_agent(
290
290
  pid: Process ID.
291
291
  task_dir: Task directory path.
292
292
  repo_root: Repository root path. Defaults to auto-detected.
293
- platform: Platform used (e.g., 'claude', 'opencode', 'codex'). Defaults to 'claude'.
293
+ platform: Platform used (e.g., 'claude', 'opencode', 'codex', 'kiro', 'antigravity'). Defaults to 'claude'.
294
294
 
295
295
  Returns:
296
296
  True on success.
@@ -147,7 +147,6 @@ def get_implement_base() -> list[dict]:
147
147
  """Get base implement context entries."""
148
148
  return [
149
149
  {"file": f"{DIR_WORKFLOW}/workflow.md", "reason": "Project workflow and conventions"},
150
- {"file": f"{DIR_WORKFLOW}/{DIR_SPEC}/shared/index.md", "reason": "Shared coding standards"},
151
150
  ]
152
151
 
153
152
 
@@ -155,8 +154,6 @@ def get_implement_backend() -> list[dict]:
155
154
  """Get backend implement context entries."""
156
155
  return [
157
156
  {"file": f"{DIR_WORKFLOW}/{DIR_SPEC}/backend/index.md", "reason": "Backend development guide"},
158
- {"file": f"{DIR_WORKFLOW}/{DIR_SPEC}/backend/api-module.md", "reason": "API module conventions"},
159
- {"file": f"{DIR_WORKFLOW}/{DIR_SPEC}/backend/quality.md", "reason": "Code quality requirements"},
160
157
  ]
161
158
 
162
159
 
@@ -164,7 +161,6 @@ def get_implement_frontend() -> list[dict]:
164
161
  """Get frontend implement context entries."""
165
162
  return [
166
163
  {"file": f"{DIR_WORKFLOW}/{DIR_SPEC}/frontend/index.md", "reason": "Frontend development guide"},
167
- {"file": f"{DIR_WORKFLOW}/{DIR_SPEC}/frontend/components.md", "reason": "Component conventions"},
168
164
  ]
169
165
 
170
166
 
@@ -174,7 +170,6 @@ def get_check_context(dev_type: str, repo_root: Path) -> list[dict]:
174
170
 
175
171
  entries = [
176
172
  {"file": adapter.get_trellis_command_path("finish-work"), "reason": "Finish work checklist"},
177
- {"file": f"{DIR_WORKFLOW}/{DIR_SPEC}/shared/index.md", "reason": "Shared coding standards"},
178
173
  ]
179
174
 
180
175
  if dev_type in ("backend", "fullstack"):
@@ -189,9 +184,7 @@ def get_debug_context(dev_type: str, repo_root: Path) -> list[dict]:
189
184
  """Get debug context entries."""
190
185
  adapter = get_cli_adapter_auto(repo_root)
191
186
 
192
- entries = [
193
- {"file": f"{DIR_WORKFLOW}/{DIR_SPEC}/shared/index.md", "reason": "Shared coding standards"},
194
- ]
187
+ entries: list[dict] = []
195
188
 
196
189
  if dev_type in ("backend", "fullstack"):
197
190
  entries.append({"file": adapter.get_trellis_command_path("check-backend"), "reason": "Backend check spec"})
@@ -6,16 +6,16 @@
6
6
  /**
7
7
  * Supported AI coding tools
8
8
  */
9
- export type AITool = "claude-code" | "cursor" | "opencode" | "iflow" | "codex";
9
+ export type AITool = "claude-code" | "cursor" | "opencode" | "iflow" | "codex" | "kilo" | "kiro" | "gemini" | "antigravity";
10
10
  /**
11
11
  * Template directory categories
12
12
  */
13
- export type TemplateDir = "common" | "claude" | "cursor" | "opencode" | "iflow" | "codex";
13
+ export type TemplateDir = "common" | "claude" | "cursor" | "opencode" | "iflow" | "codex" | "kilo" | "kiro" | "gemini" | "antigravity";
14
14
  /**
15
- * CLI flag names for platform selection (e.g., --claude, --cursor)
15
+ * CLI flag names for platform selection (e.g., --claude, --cursor, --kilo, --kiro, --gemini, --antigravity)
16
16
  * Must match keys in InitOptions (src/commands/init.ts)
17
17
  */
18
- export type CliFlag = "claude" | "cursor" | "opencode" | "iflow" | "codex";
18
+ export type CliFlag = "claude" | "cursor" | "opencode" | "iflow" | "codex" | "kilo" | "kiro" | "gemini" | "antigravity";
19
19
  /**
20
20
  * Configuration for an AI tool
21
21
  */
@@ -1 +1 @@
1
- {"version":3,"file":"ai-tools.d.ts","sourceRoot":"","sources":["../../src/types/ai-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,aAAa,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAE/E;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,OAAO,GACP,OAAO,CAAC;AAEZ;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,GAAG,OAAO,CAAC;AAE3E;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,cAAc,EAAE,OAAO,CAAC;IACxB,+EAA+E;IAC/E,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAyCjD,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAE3D"}
1
+ {"version":3,"file":"ai-tools.d.ts","sourceRoot":"","sources":["../../src/types/ai-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,MAAM,MAAM,GACd,aAAa,GACb,QAAQ,GACR,UAAU,GACV,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,QAAQ,GACR,aAAa,CAAC;AAElB;;GAEG;AACH,MAAM,MAAM,WAAW,GACnB,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,QAAQ,GACR,aAAa,CAAC;AAElB;;;GAGG;AACH,MAAM,MAAM,OAAO,GACf,QAAQ,GACR,QAAQ,GACR,UAAU,GACV,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,QAAQ,GACR,aAAa,CAAC;AAElB;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,+BAA+B;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,kDAAkD;IAClD,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,kEAAkE;IAClE,SAAS,EAAE,MAAM,CAAC;IAClB,qEAAqE;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,yEAAyE;IACzE,cAAc,EAAE,OAAO,CAAC;IACxB,+EAA+E;IAC/E,cAAc,EAAE,OAAO,CAAC;CACzB;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,CAyEjD,CAAC;AAEF;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAExD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAE3D"}
@@ -55,6 +55,38 @@ export const AI_TOOLS = {
55
55
  defaultChecked: false,
56
56
  hasPythonHooks: false,
57
57
  },
58
+ kilo: {
59
+ name: "Kilo CLI",
60
+ templateDirs: ["common", "kilo"],
61
+ configDir: ".kilocode",
62
+ cliFlag: "kilo",
63
+ defaultChecked: false,
64
+ hasPythonHooks: false,
65
+ },
66
+ kiro: {
67
+ name: "Kiro Code",
68
+ templateDirs: ["common", "kiro"],
69
+ configDir: ".kiro/skills",
70
+ cliFlag: "kiro",
71
+ defaultChecked: false,
72
+ hasPythonHooks: false,
73
+ },
74
+ gemini: {
75
+ name: "Gemini CLI",
76
+ templateDirs: ["common", "gemini"],
77
+ configDir: ".gemini",
78
+ cliFlag: "gemini",
79
+ defaultChecked: false,
80
+ hasPythonHooks: false,
81
+ },
82
+ antigravity: {
83
+ name: "Antigravity",
84
+ templateDirs: ["common", "antigravity"],
85
+ configDir: ".agent/workflows",
86
+ cliFlag: "antigravity",
87
+ defaultChecked: false,
88
+ hasPythonHooks: false,
89
+ },
58
90
  };
59
91
  /**
60
92
  * Get the configuration for a specific AI tool
@@ -1 +1 @@
1
- {"version":3,"file":"ai-tools.js","sourceRoot":"","sources":["../../src/types/ai-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA0CH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAiC;IACpD,aAAa,EAAE;QACb,IAAI,EAAE,aAAa;QACnB,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAClC,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,QAAQ;QACjB,cAAc,EAAE,IAAI;QACpB,cAAc,EAAE,IAAI;KACrB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAClC,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,QAAQ;QACjB,cAAc,EAAE,IAAI;QACpB,cAAc,EAAE,KAAK;KACtB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,YAAY,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;QACpC,SAAS,EAAE,WAAW;QACtB,OAAO,EAAE,UAAU;QACnB,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,KAAK;KACtB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,WAAW;QACjB,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QACjC,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,OAAO;QAChB,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,IAAI;KACrB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QACjC,SAAS,EAAE,gBAAgB;QAC3B,OAAO,EAAE,OAAO;QAChB,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,KAAK;KACtB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"ai-tools.js","sourceRoot":"","sources":["../../src/types/ai-tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAgEH;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAiC;IACpD,aAAa,EAAE;QACb,IAAI,EAAE,aAAa;QACnB,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAClC,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,QAAQ;QACjB,cAAc,EAAE,IAAI;QACpB,cAAc,EAAE,IAAI;KACrB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,QAAQ;QACd,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAClC,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,QAAQ;QACjB,cAAc,EAAE,IAAI;QACpB,cAAc,EAAE,KAAK;KACtB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,YAAY,EAAE,CAAC,QAAQ,EAAE,UAAU,CAAC;QACpC,SAAS,EAAE,WAAW;QACtB,OAAO,EAAE,UAAU;QACnB,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,KAAK;KACtB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,WAAW;QACjB,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QACjC,SAAS,EAAE,QAAQ;QACnB,OAAO,EAAE,OAAO;QAChB,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,IAAI;KACrB;IACD,KAAK,EAAE;QACL,IAAI,EAAE,OAAO;QACb,YAAY,EAAE,CAAC,QAAQ,EAAE,OAAO,CAAC;QACjC,SAAS,EAAE,gBAAgB;QAC3B,OAAO,EAAE,OAAO;QAChB,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,KAAK;KACtB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,UAAU;QAChB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;QAChC,SAAS,EAAE,WAAW;QACtB,OAAO,EAAE,MAAM;QACf,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,KAAK;KACtB;IACD,IAAI,EAAE;QACJ,IAAI,EAAE,WAAW;QACjB,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC;QAChC,SAAS,EAAE,cAAc;QACzB,OAAO,EAAE,MAAM;QACf,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,KAAK;KACtB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,YAAY;QAClB,YAAY,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC;QAClC,SAAS,EAAE,SAAS;QACpB,OAAO,EAAE,QAAQ;QACjB,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,KAAK;KACtB;IACD,WAAW,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,YAAY,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;QACvC,SAAS,EAAE,kBAAkB;QAC7B,OAAO,EAAE,aAAa;QACtB,cAAc,EAAE,KAAK;QACrB,cAAc,EAAE,KAAK;KACtB;CACF,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC;AACrC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mindfoldhq/trellis",
3
- "version": "0.3.0-rc.5",
3
+ "version": "0.3.0",
4
4
  "description": "AI capabilities grow like ivy — Trellis provides the structure to guide them along a disciplined path",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -55,7 +55,7 @@
55
55
  "dist",
56
56
  "bin",
57
57
  "README.md",
58
- "LICENSE.md"
58
+ "LICENSE"
59
59
  ],
60
60
  "repository": {
61
61
  "type": "git",
@@ -81,6 +81,7 @@
81
81
  "release:major": "git add -A && git diff-index --quiet HEAD || git commit -m 'chore: pre-release updates' && pnpm version major && git push origin main --tags",
82
82
  "release:beta": "git add -A && git diff-index --quiet HEAD || git commit -m 'chore: pre-release updates' && pnpm version prerelease --preid beta && git push origin HEAD --tags",
83
83
  "release:rc": "git add -A && git diff-index --quiet HEAD || git commit -m 'chore: pre-release updates' && pnpm version prerelease --preid rc && git push origin HEAD --tags",
84
+ "release:promote": "git add -A && git diff-index --quiet HEAD || git commit -m 'chore: pre-release updates' && pnpm version \"$(node -p \"require('./package.json').version.replace(/-.*/, '')\")\" && git push origin main --tags",
84
85
  "manifest": "node scripts/create-manifest.js"
85
86
  }
86
87
  }