Skip to content

Commit 3d4bed3

Browse files
committed
Merge origin/main into feat/init-dir-python-cli
Assisted-by: OpenAI Codex (model: GPT-5, autonomous)
2 parents f1e0c45 + 4badf3b commit 3d4bed3

131 files changed

Lines changed: 2077 additions & 2634 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.devcontainer/post-create.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ run_command "npm install -g @jetbrains/junie-cli@latest"
5656
echo "✅ Done"
5757

5858
echo -e "\n🤖 Installing Pi Coding Agent..."
59-
run_command "npm install -g @mariozechner/pi-coding-agent@latest"
59+
run_command "npm install -g @earendil-works/pi-coding-agent@latest"
6060
echo "✅ Done"
6161

6262
echo -e "\n🤖 Installing Kiro CLI..."
Lines changed: 293 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,293 @@
1+
name: Bundle Submission
2+
description: Submit your bundle metadata for community catalog validation
3+
title: "[Bundle]: Add "
4+
labels: ["enhancement", "needs-triage"]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for contributing a bundle! This template captures metadata for maintainers to validate formatting, links, component resolution, and installation evidence. Maintainers do not audit, endorse, or support bundle code or installed components.
10+
11+
**Before submitting:**
12+
- Review the [Bundles reference](https://github.com/github/spec-kit/blob/main/docs/reference/bundles.md)
13+
- Ensure your bundle has a valid `bundle.yml` manifest
14+
- Create a GitHub release with a versioned bundle artifact
15+
- Test installation from a downloaded artifact: `specify bundle install ./your-bundle-1.0.0.zip`
16+
- If you host a bundle catalog, test catalog installation with `specify bundle catalog add <catalog-url> --id <catalog-id> --policy install-allowed` and `specify bundle install <bundle-id>`
17+
- If your bundle depends on components from non-default catalogs, document those catalog URLs and test installation from a clean project
18+
19+
- type: input
20+
id: bundle-id
21+
attributes:
22+
label: Bundle ID
23+
description: Unique bundle identifier; must start and end with a lowercase letter or digit and may contain lowercase letters, digits, dots, underscores, and hyphens between
24+
placeholder: "e.g., security-governance-stack"
25+
validations:
26+
required: true
27+
28+
- type: input
29+
id: bundle-name
30+
attributes:
31+
label: Bundle Name
32+
description: Human-readable bundle name
33+
placeholder: "e.g., Security Governance Stack"
34+
validations:
35+
required: true
36+
37+
- type: input
38+
id: version
39+
attributes:
40+
label: Version
41+
description: Semantic version number
42+
placeholder: "e.g., 1.0.0"
43+
validations:
44+
required: true
45+
46+
- type: input
47+
id: role
48+
attributes:
49+
label: Role or Team
50+
description: Primary role, team, or persona this bundle provisions
51+
placeholder: "e.g., security-engineer, product-manager, platform-team"
52+
validations:
53+
required: true
54+
55+
- type: textarea
56+
id: description
57+
attributes:
58+
label: Description
59+
description: Brief description of the stack this bundle installs
60+
placeholder: Installs a security governance stack with compliance presets, review commands, and evidence workflows
61+
validations:
62+
required: true
63+
64+
- type: input
65+
id: author
66+
attributes:
67+
label: Author
68+
description: Your name or organization
69+
placeholder: "e.g., Jane Doe or Acme Corp"
70+
validations:
71+
required: true
72+
73+
- type: input
74+
id: repository
75+
attributes:
76+
label: Repository URL
77+
description: GitHub repository URL for your bundle source
78+
placeholder: "https://github.com/your-org/spec-kit-bundle-your-bundle"
79+
validations:
80+
required: true
81+
82+
- type: input
83+
id: download-url
84+
attributes:
85+
label: Download URL
86+
description: URL to the versioned bundle artifact generated by `specify bundle build`
87+
placeholder: "https://github.com/your-org/spec-kit-bundle-your-bundle/releases/download/v1.0.0/your-bundle-1.0.0.zip"
88+
validations:
89+
required: true
90+
91+
- type: input
92+
id: documentation
93+
attributes:
94+
label: Documentation URL
95+
description: Link to documentation that explains what the bundle installs and how to use it
96+
placeholder: "https://github.com/your-org/spec-kit-bundle-your-bundle/blob/main/README.md"
97+
validations:
98+
required: true
99+
100+
- type: input
101+
id: license
102+
attributes:
103+
label: License
104+
description: Open source license type
105+
placeholder: "e.g., MIT, Apache-2.0"
106+
validations:
107+
required: true
108+
109+
- type: input
110+
id: speckit-version
111+
attributes:
112+
label: Required Spec Kit Version
113+
description: Minimum Spec Kit version required by the bundle
114+
placeholder: "e.g., >=0.9.0"
115+
validations:
116+
required: true
117+
118+
- type: input
119+
id: integration
120+
attributes:
121+
label: Integration Target (optional)
122+
description: Integration ID if the bundle pins one; leave empty if integration-agnostic
123+
placeholder: "e.g., claude, copilot, gemini"
124+
125+
- type: textarea
126+
id: components-provided
127+
attributes:
128+
label: Components Provided
129+
description: List the extensions, presets, workflows, and steps this bundle installs
130+
placeholder: |
131+
- extensions: sicario-guard@0.5.1
132+
- presets: sicario-core@0.5.1, sicario-ai-governance@0.5.1
133+
- workflows: evidence-review@1.0.0
134+
- steps: threat-model
135+
validations:
136+
required: true
137+
138+
- type: textarea
139+
id: required-catalogs
140+
attributes:
141+
label: Required Component Catalogs
142+
description: List any non-default catalogs users must add before this bundle can resolve its components; enter "None" if every component resolves from built-in or bundled catalogs
143+
placeholder: |
144+
- Presets: https://github.com/your-org/your-bundle/releases/download/v1.0.0/presets.json
145+
- Extensions: https://github.com/your-org/your-bundle/releases/download/v1.0.0/extensions.json
146+
validations:
147+
required: true
148+
149+
- type: textarea
150+
id: tags
151+
attributes:
152+
label: Tags
153+
description: 2-5 relevant tags (lowercase, separated by commas)
154+
placeholder: "security, governance, compliance"
155+
validations:
156+
required: true
157+
158+
- type: textarea
159+
id: features
160+
attributes:
161+
label: Key Features
162+
description: List the main capabilities this bundle provides
163+
placeholder: |
164+
- Installs evidence-first security governance templates
165+
- Adds automated bundle verification commands
166+
- Pins all components to release-tested versions
167+
validations:
168+
required: true
169+
170+
- type: checkboxes
171+
id: testing
172+
attributes:
173+
label: Testing Checklist
174+
description: Confirm that your bundle has been tested
175+
options:
176+
- label: Validation succeeds with `specify bundle validate --path <bundle-directory>`
177+
required: true
178+
- label: Build succeeds with `specify bundle build --path <bundle-directory>` and produces the submitted artifact
179+
required: true
180+
- label: Bundle installs successfully from the built artifact
181+
required: true
182+
- label: The submitted distribution path was tested end to end, including bundle-ID installation from an install-allowed catalog when a catalog entry is proposed
183+
required: true
184+
- label: Installation was tested in a clean Spec Kit project
185+
required: true
186+
- label: Required component catalogs are documented and were included in testing, or no extra catalogs are required
187+
required: true
188+
- label: Documentation is complete and accurate
189+
required: true
190+
191+
- type: checkboxes
192+
id: requirements
193+
attributes:
194+
label: Submission Requirements
195+
description: Verify your bundle meets all requirements
196+
options:
197+
- label: Valid `bundle.yml` manifest included
198+
required: true
199+
- label: README.md explains the bundle's intended role, installed components, and installation steps
200+
required: true
201+
- label: LICENSE file included
202+
required: true
203+
- label: GitHub release created with a version tag
204+
required: true
205+
- label: Bundle ID matches the manifest and follows naming conventions
206+
required: true
207+
- label: Every extension, preset, workflow, and step reference is pinned where the manifest requires a version
208+
required: true
209+
210+
- type: textarea
211+
id: testing-details
212+
attributes:
213+
label: Testing Details
214+
description: Describe how you tested your bundle
215+
placeholder: |
216+
**Tested on:**
217+
- macOS 15 with Spec Kit v0.9.0
218+
- Ubuntu 24.04 with Spec Kit v0.9.0
219+
220+
**Test project:** [Link or description]
221+
222+
**Test scenarios:**
223+
1. Added required catalogs
224+
2. Validated bundle manifest
225+
3. Built release artifact
226+
4. Installed bundle in a clean project
227+
5. Ran the installed commands or workflows
228+
validations:
229+
required: true
230+
231+
- type: textarea
232+
id: example-usage
233+
attributes:
234+
label: Example Usage
235+
description: Provide a simple example of installing and using your bundle
236+
render: markdown
237+
placeholder: |
238+
```bash
239+
# Add any required component catalogs first
240+
specify preset catalog add https://github.com/your-org/your-bundle/releases/download/v1.0.0/presets.json --name your-bundle --install-allowed
241+
specify extension catalog add https://github.com/your-org/your-bundle/releases/download/v1.0.0/extensions.json --name your-bundle --install-allowed
242+
243+
# Install the downloaded bundle artifact
244+
curl -L -o your-bundle-1.0.0.zip https://github.com/your-org/your-bundle/releases/download/v1.0.0/your-bundle-1.0.0.zip
245+
specify bundle install ./your-bundle-1.0.0.zip
246+
247+
# Or test through an install-allowed bundle catalog
248+
specify bundle catalog add https://github.com/your-org/your-bundle/releases/download/v1.0.0/bundles.json --id your-bundle-catalog --policy install-allowed
249+
specify bundle install your-bundle
250+
```
251+
validations:
252+
required: true
253+
254+
- type: textarea
255+
id: catalog-entry
256+
attributes:
257+
label: Proposed Catalog Entry
258+
description: Provide the JSON entry that would appear under the top-level `bundles` object in a bundle catalog (helps reviewers)
259+
render: json
260+
placeholder: |
261+
{
262+
"your-bundle": {
263+
"name": "Your Bundle",
264+
"id": "your-bundle",
265+
"version": "1.0.0",
266+
"role": "security-engineer",
267+
"description": "Brief description of the stack",
268+
"author": "Your Name",
269+
"license": "MIT",
270+
"download_url": "https://github.com/your-org/your-bundle/releases/download/v1.0.0/your-bundle-1.0.0.zip",
271+
"repository": "https://github.com/your-org/your-bundle",
272+
"requires": {
273+
"speckit_version": ">=0.9.0"
274+
},
275+
"provides": {
276+
"extensions": 1,
277+
"presets": 2,
278+
"steps": 0,
279+
"workflows": 1
280+
},
281+
"tags": ["security", "governance"],
282+
"verified": false
283+
}
284+
}
285+
validations:
286+
required: true
287+
288+
- type: textarea
289+
id: additional-context
290+
attributes:
291+
label: Additional Context
292+
description: Any other information that would help reviewers
293+
placeholder: Screenshots, demo videos, links to related projects, dependency-resolution notes, etc.

AGENTS.md

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@ class WindsurfIntegration(MarkdownIntegration):
7575
"args": "$ARGUMENTS",
7676
"extension": ".md",
7777
}
78-
context_file = ".windsurf/rules/specify-rules.md"
7978
```
8079

8180
**TOML agent (Gemini):**
@@ -101,7 +100,6 @@ class GeminiIntegration(TomlIntegration):
101100
"args": "{{args}}",
102101
"extension": ".toml",
103102
}
104-
context_file = "GEMINI.md"
105103
```
106104

107105
**Skills agent (Codex):**
@@ -129,7 +127,6 @@ class CodexIntegration(SkillsIntegration):
129127
"args": "$ARGUMENTS",
130128
"extension": "/SKILL.md",
131129
}
132-
context_file = "AGENTS.md"
133130

134131
@classmethod
135132
def options(cls) -> list[IntegrationOption]:
@@ -150,7 +147,6 @@ class CodexIntegration(SkillsIntegration):
150147
| `key` | Class attribute | Unique identifier; for CLI-based integrations (`requires_cli: True`), must match the CLI executable name |
151148
| `config` | Class attribute (dict) | Agent metadata: `name`, `folder`, `commands_subdir`, `install_url`, `requires_cli` |
152149
| `registrar_config` | Class attribute (dict) | Command output config: `dir`, `format`, `args` placeholder, file `extension` |
153-
| `context_file` | Class attribute (str or None) | Path to agent context/instructions file (e.g., `"CLAUDE.md"`, `".github/copilot-instructions.md"`) |
154150

155151
**Key design rule:** For CLI-based integrations (`requires_cli: True`), `key` must be the actual executable name (e.g., `"cursor-agent"` not `"cursor"`). This ensures `shutil.which(key)` works for CLI-tool checks without special-case mappings. IDE-based integrations (`requires_cli: False`) should use their canonical identifier (e.g., `"windsurf"`, `"copilot"`).
156152

@@ -175,9 +171,11 @@ def _register_builtins() -> None:
175171

176172
### 4. Context file behavior
177173

178-
Set `context_file` on the integration class. The base integration setup creates or updates the managed Spec Kit section in that file, and uninstall removes the managed section when appropriate.
174+
The Specify CLI carries **no agent-context state whatsoever**. Integration classes do **not** declare a `context_file`, and the CLI never creates, updates, removes, resolves, or migrates a context/instruction file (`CLAUDE.md`, `AGENTS.md`, `.github/copilot-instructions.md`, …). New integrations add nothing for context handling.
179175

180-
The managed section is owned by the bundled `agent-context` extension (`extensions/agent-context/`). All configuration flows through the extension's own config file at `.specify/extensions/agent-context/agent-context-config.yml`:
176+
Managing the "Spec Kit" section in the context file is fully owned by the bundled `agent-context` extension (`extensions/agent-context/`), which is a **full opt-in**: `specify init` does not install it. A user adds/enables it through the standard extension verbs, after which the extension's own bundled scripts maintain the context section. When the extension is absent or disabled, nothing in Spec Kit touches the context file.
177+
178+
The extension reads its own config file at `.specify/extensions/agent-context/agent-context-config.yml`:
181179

182180
```yaml
183181
# Path to the coding agent context file managed by this extension
@@ -189,10 +187,10 @@ context_markers:
189187
end: "<!-- SPECKIT END -->"
190188
```
191189
192-
- `context_file` is written automatically from the integration's class attribute when `specify init` or `specify integration use` is run.
193-
- `context_markers.{start,end}` defaults to `IntegrationBase.CONTEXT_MARKER_START` / `CONTEXT_MARKER_END`. Users who want custom markers edit `agent-context-config.yml` directly — both the Python layer (`upsert_context_section()` / `remove_context_section()`) and the bundled scripts (`extensions/agent-context/scripts/bash/update-agent-context.sh` and `.ps1`) read from this single source of truth.
190+
- The Specify CLI does **not** write this config. When `context_file` is empty, the extension's bundled scripts self-seed it by looking up the active integration's key in the extension's own `agent-context-defaults.json` map (`extensions/agent-context/scripts/bash/update-agent-context.sh` and `.ps1`). The CLI registry is never consulted — all agent→context-file knowledge lives inside the extension.
191+
- `context_markers.{start,end}` are read solely by the extension's scripts; they default to the Spec Kit markers shown above and can be customized by editing `agent-context-config.yml` directly.
194192

195-
Users can opt out entirely with `specify extension disable agent-context`; while disabled, Spec Kit skips context-file creation, updates, and removal (the gates are inside `upsert_context_section()` and `remove_context_section()`).
193+
Existing projects created by older Spec Kit versions keep working: any previously written managed section or extension config is left intact and is only ever updated by the extension when run.
196194

197195
Only add custom setup logic when the agent needs non-standard behavior. Integrations no longer require per-agent thin wrapper scripts or shared context-update dispatcher scripts — the `agent-context` extension is fully generic.
198196

@@ -401,7 +399,6 @@ Implementation: Extends `YamlIntegration` (parallel to `TomlIntegration`):
401399
2. Extracts title and description from frontmatter
402400
3. Renders output as Goose recipe YAML (version, title, description, author, extensions, activities, prompt)
403401
4. Uses `yaml.safe_dump()` for header fields to ensure proper escaping
404-
5. Sets `context_file = "AGENTS.md"` so the base setup manages the Spec Kit context section there
405402

406403
## Branch Naming Convention
407404

@@ -466,7 +463,7 @@ Disclosure is **continuous**, not a one-time event. A single AI-disclosure parag
466463
## Common Pitfalls
467464
468465
1. **Using shorthand keys for CLI-based integrations**: For CLI-based integrations (`requires_cli: True`), the `key` must match the executable name (e.g., `"cursor-agent"` not `"cursor"`). `shutil.which(key)` is used for CLI tool checks — mismatches require special-case mappings. IDE-based integrations (`requires_cli: False`) are not subject to this constraint.
469-
2. **Forgetting context configuration**: The bundled `agent-context` extension reads from `.specify/extensions/agent-context/agent-context-config.yml`. New integrations only need to set `context_file` on the class — markers and dispatcher scripts are managed centrally.
466+
2. **Reintroducing context handling into the CLI**: The opt-in `agent-context` extension owns everything about context files — including the per-agent default mapping in `agent-context-defaults.json`. Integration classes must **not** declare a `context_file`, and no CLI code should read, write, resolve, or migrate context files. All context-file logic lives in `.specify/extensions/agent-context/` and its bundled scripts.
470467
3. **Incorrect `requires_cli` value**: Set to `True` only for agents that have a CLI tool; set to `False` for IDE-based agents.
471468
4. **Wrong argument format**: Use `$ARGUMENTS` for Markdown agents, `{{args}}` for TOML agents.
472469
5. **Skipping registration**: The import and `_register()` call in `_register_builtins()` must both be added.

0 commit comments

Comments
 (0)