Skip to content

Commit a13e00c

Browse files
author
Markus
committed
Merge remote-tracking branch 'origin/main' into feat/3717-gate-verdict-input
2 parents e0e6d4f + 9e150cd commit a13e00c

49 files changed

Lines changed: 1696 additions & 185 deletions

Some content is hidden

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

‎.github/workflows/codeql.yml‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ jobs:
2222
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
2323

2424
- name: Initialize CodeQL
25-
uses: github/codeql-action/init@7188fc363630916deb702c7fdcf4e481b751f97a # v4
25+
uses: github/codeql-action/init@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4
2626
with:
2727
languages: ${{ matrix.language }}
2828

2929
- name: Perform CodeQL Analysis
30-
uses: github/codeql-action/analyze@7188fc363630916deb702c7fdcf4e481b751f97a # v4
30+
uses: github/codeql-action/analyze@e4fba868fa4b1b91e1fdab776edc8cfbe6e9fb81 # v4
3131
with:
3232
category: "/language:${{ matrix.language }}"

‎AGENTS.md‎

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,14 @@ class KilocodeIntegration(MarkdownIntegration):
6464
key = "kilocode"
6565
config = {
6666
"name": "Kilo Code",
67-
"folder": ".kilocode/",
68-
"commands_subdir": "workflows",
67+
"folder": ".kilo/",
68+
"commands_subdir": "commands",
6969
"install_url": None,
7070
"requires_cli": False,
7171
}
7272
registrar_config = {
73-
"dir": ".kilocode/workflows",
73+
"dir": ".kilo/commands",
74+
"legacy_dir": ".kilocode/workflows",
7475
"format": "markdown",
7576
"args": "$ARGUMENTS",
7677
"extension": ".md",
@@ -201,8 +202,8 @@ Only add custom setup logic when the agent needs non-standard behavior. Integrat
201202
specify init my-project --integration <key>
202203
203204
# Verify files were created in the commands directory configured by
204-
# config["folder"] + config["commands_subdir"] (for example, .kilocode/workflows/)
205-
ls -R my-project/.kilocode/workflows/
205+
# config["folder"] + config["commands_subdir"] (for example, .kilo/commands/)
206+
ls -R my-project/.kilo/commands/
206207
207208
# Uninstall cleanly
208209
cd my-project && specify integration uninstall <key>

‎CHANGELOG.md‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,31 @@
22

33
<!-- insert new changelog below this comment -->
44

5+
## [0.14.2] - 2026-07-24
6+
7+
### Changed
8+
9+
- Update Intake Review Governance preset to v0.1.1 (#3729)
10+
- Update Verify Review Ship extension to v0.3.0 (#3728)
11+
- Update Architecture Guard extension to v1.13.1 (#3724)
12+
- docs(upgrade): Claude Code files live in .claude/skills, not .claude/commands (#3708)
13+
- fix(kilocode): install commands under .kilo/commands (#3672)
14+
- fix(auth): normalize whitespace in auth-config env-var/id references at store time (#3691)
15+
- fix(workflows): guard non-mapping 'inputs:' block in engine._resolve_inputs (#3696)
16+
- Update Intake Authoring Governance preset to v0.2.0 (#3721)
17+
- docs: clarify shell-step interpolation safety (#3719)
18+
- [extension] Add Blueprint Index — Living Architecture Map extension to community catalog (#3718)
19+
- fix(github-http): return None on malformed host in resolve_github_release_asset_api_url (#3715)
20+
- fix(integrations): declare PiIntegration multi_install_safe (#3652)
21+
- harden: remove shell parameter from run_command() (#3716)
22+
- chore(deps): bump github/codeql-action/init from 4.37.1 to 4.37.3 (#3699)
23+
- fix: auto-correct conflicting feature prefixes (#1829)
24+
- chore(deps): bump actions/checkout from 6.0.3 to 7.0.1 (#3703)
25+
- chore(deps): bump DavidAnson/markdownlint-cli2-action (#3702)
26+
- chore(deps): bump actions/setup-node from 6.4.0 to 7.0.0 (#3701)
27+
- chore(deps): bump astral-sh/setup-uv from 8.3.2 to 9.0.0 (#3700)
28+
- chore: release 0.14.1, begin 0.14.2.dev0 development (#3698)
29+
530
## [0.14.1] - 2026-07-23
631

732
### Changed

‎docs/community/extensions.md‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ The following community-contributed extensions are available in [`catalog.commun
3636
| Archive Extension | Archive merged features into main project memory. | `docs` | Read+Write | [spec-kit-archive](https://github.com/stn1slv/spec-kit-archive) |
3737
| Azure DevOps Integration | Sync user stories and tasks to Azure DevOps work items using OAuth authentication | `integration` | Read+Write | [spec-kit-azure-devops](https://github.com/pragya247/spec-kit-azure-devops) |
3838
| Blueprint | Stay code-literate in AI-driven development: review a complete code blueprint for every task from spec artifacts before /speckit.implement runs | `docs` | Read+Write | [spec-kit-blueprint](https://github.com/chordpli/spec-kit-blueprint) |
39+
| Blueprint Index — Living Architecture Map | A living architecture map for spec-driven projects, kept honest by a deterministic, low-friction, machine-first CI gate (JSON, self-healable) that blocks only when the map contradicts the specs or code. Brownfield or greenfield. | `process` | Read+Write | [spec-kit-blueprint](https://github.com/ogil109/spec-kit-blueprint) |
3940
| Branch Convention | Configurable branch and folder naming conventions for /specify with presets and custom patterns | `process` | Read+Write | [spec-kit-branch-convention](https://github.com/Quratulain-bilal/spec-kit-branch-convention) |
4041
| Brownfield Bootstrap | Bootstrap spec-kit for existing codebases — auto-discover architecture and adopt SDD incrementally | `process` | Read+Write | [spec-kit-brownfield](https://github.com/Quratulain-bilal/spec-kit-brownfield) |
4142
| BrownKit | Evidence-driven capability discovery, security and QA risk assessment for existing codebases | `process` | Read+Write | [BrownKit](https://github.com/MaksimShevtsov/BrownKit) |
@@ -158,7 +159,7 @@ The following community-contributed extensions are available in [`catalog.commun
158159
| Token Economy | Token routing, measured savings, and context audit workflows | `process` | Read+Write | [spec-kit-token-economy](https://github.com/formin/spec-kit-token-economy) |
159160
| V-Model Extension Pack | Enforces V-Model paired generation of development specs and test specs with full traceability | `docs` | Read+Write | [spec-kit-v-model](https://github.com/leocamello/spec-kit-v-model) |
160161
| Verify Extension | Post-implementation quality gate that validates implemented code against specification artifacts | `code` | Read-only | [spec-kit-verify](https://github.com/ismaelJimenez/spec-kit-verify) |
161-
| Verify Review Ship | Adds post-implementation verify, review, and ship readiness gates to Spec Kit workflows | `process` | Read-only | [spec-kit-verify-review-ship](https://github.com/cadugevaerd/spec-kit-verify-review-ship) |
162+
| Verify Review Ship | Post-convergence operational verification, technical review, learning governance, and transactional delivery. | `process` | Read+Write | [spec-kit-verify-review-ship](https://github.com/cadugevaerd/spec-kit-verify-review-ship) |
162163
| Verify Tasks Extension | Detect phantom completions: tasks marked [X] in tasks.md with no real implementation | `code` | Read-only | [spec-kit-verify-tasks](https://github.com/datastone-inc/spec-kit-verify-tasks) |
163164
| Version Guard | Verify tech stack versions against live npm registries before planning and implementation | `process` | Read-only | [spec-kit-version-guard](https://github.com/KevinBrown5280/spec-kit-version-guard) |
164165
| What-if Analysis | Preview the downstream impact (complexity, effort, tasks, risks) of requirement changes before committing to them | `visibility` | Read-only | [spec-kit-whatif](https://github.com/DevAbdullah90/spec-kit-whatif) |

‎docs/community/presets.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,9 @@ The following community-contributed presets customize how Spec Kit behaves — o
1919
| Explicit Task Dependencies | Adds explicit `(depends on T###)` dependency declarations and an Execution Wave DAG to tasks.md for parallel scheduling | 1 template, 1 command | — | [spec-kit-preset-explicit-task-dependencies](https://github.com/Quratulain-bilal/spec-kit-preset-explicit-task-dependencies) |
2020
| Fiction Book Writing | It adapts the Spec-Driven Development workflow for storytelling to create books or audiobooks (with annotations) in 12 languages: features become story elements, specs become story briefs, plans become story structures, and tasks become scene-by-scene writing tasks. Supports single and multi-POV, all major plot structure frameworks, and two style modes: an author voice sample or humanized AI prose principles. Supports interactive elements like brainstorming, interview, roleplay, and extras like statistics, cover builder, illustration builder, and bio command. Export with templates for KDP, D2D, etc. | 26 templates, 34 commands, 2 scripts | — | [speckit-preset-fiction-book-writing](https://github.com/adaumann/speckit-preset-fiction-book-writing) |
2121
| Game Narrative Writing | Preset for game narrative design and interactive storytelling. It adapts the Spec-Driven Development workflow for game narratives: features become story mechanics, specs become narrative briefs, plans become story maps, and tasks become dialogue and scene-writing tasks. Supports branching narratives, player agency systems, state machines, and interactive dialogue trees. | 37 templates, 34 commands, 5 scripts | — | [speckit-preset-game-narrative-writing](https://github.com/adaumann/speckit-preset-game-narrative-writing) |
22-
| Intake Authoring Governance | Creates traceable Spec Kit intakes from ordered text sources and now truthfully adopts legacy intakes without inventing predecessor receipts. | 7 templates, 2 commands, 2 scripts | — | [spec-kit-preset-intake-authoring-governance](https://github.com/hindermath/spec-kit-preset-intake-authoring-governance) |
23-
| Intake Review Governance | Adds hash-bound review, repair, and status gates for single, series, and campaign intake files before interactive, autonomous, or parallel Spec Kit execution. | 8 templates, 3 commands, 2 scripts | — | [spec-kit-preset-intake-review-governance](https://github.com/hindermath/spec-kit-preset-intake-review-governance) |
22+
| Intake Authoring Governance | Governs traceable intake CRUD, bounded public HTTPS sources, and explicitly approved single or series authoring without granting execution authority. | 10 templates, 5 commands, 4 scripts | — | [spec-kit-preset-intake-authoring-governance](https://github.com/hindermath/spec-kit-preset-intake-authoring-governance) |
23+
| Intake Review Governance | Reviews single, series, and campaign intake files before Spec Kit execution and binds accepted outcomes to normalized content hashes. | 8 templates, 3 commands, 2 scripts | — | [spec-kit-preset-intake-review-governance](https://github.com/hindermath/spec-kit-preset-intake-review-governance) |
24+
| Intake Sequencing Governance | Manages traceable intake-series order, typed dependencies, lifecycle, and safe next-candidate selection without executing downstream workflows. | 10 templates, 6 commands, 5 scripts | — | [spec-kit-preset-intake-sequencing-governance](https://github.com/hindermath/spec-kit-preset-intake-sequencing-governance) |
2425
| iSAQB Architecture Governance | Adds iSAQB/CPSA-F and arc42 architecture governance with audit-ready evidence for goals, views, resumability, partial-failure scenarios, ADRs, risks, and technical debt. | 13 templates, 3 commands | — | [spec-kit-preset-isaqb-architecture-governance](https://github.com/hindermath/spec-kit-preset-isaqb-architecture-governance) |
2526
| Jira Issue Tracking | Overrides `speckit.taskstoissues` to create Jira epics, stories, and tasks instead of GitHub Issues via Atlassian MCP tools | 1 command | — | [spec-kit-preset-jira](https://github.com/luno/spec-kit-preset-jira) |
2627
| Model Driven Engineering | Focuses on streamlined commands, app repository support, cross-spec support, and capability-aware project memory for model-driven engineering workflows | 6 templates, 11 commands | MDE extension | [spec-kit-preset-mde](https://github.com/AI-MDE/spec-kit-preset-mde) |

‎docs/reference/integrations.md‎

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ The Specify CLI supports a wide range of AI coding agents. When you run `specify
2525
| [Hermes](https://github.com/NousResearch/hermes-agent) | `hermes` | Skills-based integration; installs skills globally into `~/.hermes/skills/` |
2626
| [IBM Bob](https://www.ibm.com/products/bob) | `bob` | Skills-based integration by default; installs skills as `speckit-<command>/SKILL.md` under `.bob/skills/` and invokes them as `/speckit-<command>`. Pass `--integration-options="--legacy-commands"` to scaffold the deprecated Bob 1.x layout (`.bob/commands/*.md`) instead; that flag will be removed in a future release. Existing legacy installs can migrate with `specify integration upgrade bob --integration-options="--skills"`, which converts them to the skills layout and removes the old command files. If preset overrides are installed, the migration is rejected with an actionable error (preset artifacts cannot yet be reconciled across a layout change) — remove the preset(s), migrate, then reinstall them. |
2727
| [Junie](https://junie.jetbrains.com/) | `junie` | |
28-
| [Kilo Code](https://github.com/Kilo-Org/kilocode) | `kilocode` | |
28+
| [Kilo Code](https://github.com/Kilo-Org/kilocode) | `kilocode` | Installs commands into `.kilo/commands`; legacy `.kilocode/workflows` installs remain supported as a registration fallback |
2929
| [Kimi Code](https://code.kimi.com/) | `kimi` | Skills-based integration; installs into `.kimi-code/skills/`. `--migrate-legacy` moves old `.kimi/skills/` installs to the new paths |
3030
| [Kiro CLI](https://kiro.dev/docs/cli/) | `kiro-cli` | Kiro CLI does not substitute `$ARGUMENTS` in file-based prompts, so Spec Kit ships a prose fallback at render time (see [Manage prompts](https://kiro.dev/docs/cli/chat/manage-prompts/) and issue [#1926](https://github.com/github/spec-kit/issues/1926)). Alias: `--integration kiro` |
3131
| [Lingma](https://lingma.aliyun.com/) | `lingma` | Skills-based integration; skills are installed automatically |
@@ -269,13 +269,16 @@ The currently declared multi-install safe integrations are:
269269
| `codebuddy` | `.codebuddy/commands` |
270270
| `codex` | `.agents/skills` |
271271
| `cursor-agent` | `.cursor/skills` |
272+
| `droid` | `.factory/skills` |
272273
| `firebender` | `.firebender/commands` |
273274
| `gemini` | `.gemini/commands` |
274275
| `grok` | `.grok/skills` |
275276
| `junie` | `.junie/commands` |
276-
| `kilocode` | `.kilocode/workflows` |
277+
| `kilocode` | `.kilo/commands` |
277278
| `kiro-cli` | `.kiro/prompts` |
279+
| `lingma` | `.lingma/skills` |
278280
| `omp` | `.omp/commands` |
281+
| `pi` | `.pi/prompts` |
279282
| `qodercli` | `.qoder/commands` |
280283
| `qwen` | `.qwen/commands` |
281284
| `shai` | `.shai/commands` |

‎docs/reference/workflows.md‎

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,32 @@ args: "{{ inputs.spec }}"
502502
message: "{{ status | default('pending') }}"
503503
```
504504

505+
### Interpolation and shell safety
506+
507+
Expressions are resolved by **plain string substitution** — the value of `{{ ... }}` is spliced into the surrounding text exactly as-is, with no quoting or escaping added. That is convenient for building `args` and `message` strings, but it has an important consequence for `shell` steps: a `run` field is handed to the system shell (`/bin/sh -c` on POSIX), so any interpolated value is interpreted as **shell syntax**, not just data.
508+
509+
If an interpolated value can contain characters like `;`, `|`, `&`, `$( )`, backticks, or quotes, it can change or extend the command that actually runs. This matters most when the value is not fully under the workflow author's control:
510+
511+
- **Workflow `inputs.*`** — supplied by whoever runs the workflow.
512+
- **A prior step's output**, e.g. `{{ steps.plan.output.stdout }}` — for a `prompt` step this is **text produced by the AI agent**, which can in turn be influenced by files, tickets, or web content the agent read. Treat agent output as untrusted when it flows into a `shell` step.
513+
514+
There is **no shell-escaping filter** in the expression language and **no sandbox** around a `shell` step, so none of the practices below can be treated as a guarantee that a hostile value is neutralised. The only reliable control is to constrain what an interpolated value *can* be, and to keep values you cannot constrain out of `run` fields entirely. Scrutinise every `run` field that interpolates a value you do not control, and at minimum:
515+
516+
- **Constrain the value at the source with `enum`/an allowlist.** When `inputs.*` feeds a `run` field, restrict it to a fixed set of known-safe values so a caller cannot supply arbitrary shell text at all. This is the strongest control the engine offers — prefer it over any downstream mitigation.
517+
518+
```yaml
519+
inputs:
520+
target:
521+
type: string
522+
enum: [staging, production] # caller cannot inject arbitrary text
523+
```
524+
525+
- **Keep unconstrained values out of `run`.** If a value cannot be constrained to an allowlist — most agent/`prompt` output — do not interpolate it into a `run` field. Branch on it with `if`/`switch` against fixed conditions, or act on it in a `command`/`prompt` step rather than a shell command built from it.
526+
- **Quoting is not a security boundary.** Surrounding a substitution with quotes (`'{{ inputs.x }}'`) helps the shell treat a *trusted* value as a single argument and avoids word-splitting on spaces, but a value that itself contains the matching quote character can still break out and inject shell syntax. Quote for correctness on constrained values; never rely on quoting to make an *unconstrained* substitution safe.
527+
- **Gates do not inspect the next step, and `message` is printed verbatim.** A `gate` step renders only its own `message`/`show_file` — it does not display, resolve, or sanitise the command that follows it, and approval never neutralises an injectable interpolation. Do **not** interpolate raw untrusted data into `message`: it is printed as-is with no control-character stripping, so agent or caller output could inject terminal/ANSI escapes that alter or hide the approval prompt. Keep `message` to trusted, constrained text, and surface untrusted material for review via `show_file` instead — its path and contents are control/ANSI-stripped before display.
528+
529+
A `shell` step is an arbitrary-command primitive by design; these practices reduce exposure and keep *which* command runs under the author's control, but they do not eliminate the risk of interpolating values you do not fully control.
530+
505531
## Shell Step Environment Variables
506532

507533
Shell steps automatically receive the following environment variables:

0 commit comments

Comments
 (0)