Skip to content

Commit b74842a

Browse files
committed
Merge remote-tracking branch 'upstream/main' into speckit-arch
2 parents adcb67a + 0593565 commit b74842a

15 files changed

Lines changed: 703 additions & 213 deletions

File tree

.github/workflows/codeql.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
language: [ 'actions', 'python' ]
2020
steps:
2121
- name: Checkout repository
22-
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
22+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
2323

2424
- name: Initialize CodeQL
2525
uses: github/codeql-action/init@68bde559dea0fdcac2102bfdf6230c5f70eb485e # v4

.github/workflows/test.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ jobs:
1313
runs-on: ubuntu-latest
1414
steps:
1515
- name: Checkout
16-
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
16+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
1717

1818
- name: Install uv
1919
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0
@@ -34,7 +34,7 @@ jobs:
3434
python-version: ["3.11", "3.12", "3.13"]
3535
steps:
3636
- name: Checkout
37-
uses: actions/checkout@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
37+
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
3838

3939
- name: Install uv
4040
uses: astral-sh/setup-uv@08807647e7069bb48b6ef5acd8ec9567f424441b # v8.1.0

CHANGELOG.md

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

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

5+
## [0.8.8] - 2026-05-11
6+
7+
### Changed
8+
9+
- chore(deps): bump actions/checkout from 4.3.1 to 6.0.2 (#2486)
10+
- feat(catalog): add Spec Kit Schedule (schedule) community extension (#2473)
11+
- fix(integration): refresh shared infra on `integration switch` (#2375)
12+
- Add MDE preset to community catalog (#2513)
13+
- Add MDE extension to community catalog (#2512)
14+
- chore: update community catalog with latest extension versions (#2490)
15+
- chore(deps): bump actions/setup-dotnet from 4.3.1 to 5.2.0 (#2489)
16+
- chore(deps): bump actions/github-script from 7 to 9 (#2488)
17+
- chore(deps): bump DavidAnson/markdownlint-cli2-action (#2487)
18+
- chore(deps): bump github/codeql-action from 4.35.3 to 4.35.4 (#2485)
19+
- feat(catalog): add API Evolve (api-evolve) community extension (#2479)
20+
- feat: Config-driven opt-in authentication registry with multi-platform support (#2393)
21+
- chore: release 0.8.7, begin 0.8.8.dev0 development (#2480)
22+
523
## [0.8.7] - 2026-05-07
624

725
### Changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ The following community-contributed extensions are available in [`catalog.commun
236236
| MAQA Linear Integration | Linear integration for MAQA — syncs issues and sub-issues across workflow states as features progress | `integration` | Read+Write | [spec-kit-maqa-linear](https://github.com/GenieRobot/spec-kit-maqa-linear) |
237237
| MAQA Trello Integration | Trello board integration for MAQA — populates board from specs, moves cards, real-time checklist ticking | `integration` | Read+Write | [spec-kit-maqa-trello](https://github.com/GenieRobot/spec-kit-maqa-trello) |
238238
| MarkItDown Document Converter | Convert documents (PDF, Word, PowerPoint, Excel, and more) to Markdown for use as spec reference material | `docs` | Read+Write | [spec-kit-markitdown](https://github.com/BenBtg/spec-kit-markitdown) |
239+
| MDE | Minimal model-driven engineering workflow with setup, next, and status commands | `process` | Read+Write | [spec-kit-mde](https://github.com/AI-MDE/spec-kit-mde) |
239240
| Memory Loader | Loads .specify/memory/ files before lifecycle commands so LLM agents have project governance context | `docs` | Read-only | [spec-kit-memory-loader](https://github.com/KevinBrown5280/spec-kit-memory-loader) |
240241
| Memory MD | Spec Kit extension for repository-native Markdown memory that captures durable decisions, bugs, and project context | `docs` | Read+Write | [spec-kit-memory-hub](https://github.com/DyanGalih/spec-kit-memory-hub) |
241242
| MemoryLint | Agent memory governance tool: Automatically audits and fixes boundary conflicts between AGENTS.md and the constitution. | `process` | Read+Write | [memorylint](https://github.com/RbBtSn0w/spec-kit-extensions/tree/main/memorylint) |
@@ -267,6 +268,7 @@ The following community-contributed extensions are available in [`catalog.commun
267268
| Spec Reference Loader | Reads the ## References section from the feature spec and loads only the listed docs into context | `docs` | Read-only | [spec-kit-spec-reference-loader](https://github.com/KevinBrown5280/spec-kit-spec-reference-loader) |
268269
| Spec Critique Extension | Dual-lens critical review of spec and plan from product strategy and engineering risk perspectives | `docs` | Read-only | [spec-kit-critique](https://github.com/arunt14/spec-kit-critique) |
269270
| Spec Diagram | Auto-generate Mermaid diagrams of SDD workflow state, feature progress, and task dependencies | `visibility` | Read-only | [spec-kit-diagram-](https://github.com/Quratulain-bilal/spec-kit-diagram-) |
271+
| Spec Kit Schedule | Optimal multi-agent task scheduling via CP-SAT — DAG precedence, hallucination-aware caps, file-conflict avoidance, stochastic durations, replanning, and interactive HTML output | `process` | Read+Write | [spec-kit-schedule](https://github.com/jfranc38/spec-kit-schedule) |
270272
| Spec Orchestrator | Cross-feature orchestration — track state, select tasks, and detect conflicts across parallel specs | `process` | Read-only | [spec-kit-orchestrator](https://github.com/Quratulain-bilal/spec-kit-orchestrator) |
271273
| Spec Refine | Update specs in-place, propagate changes to plan and tasks, and diff impact across artifacts | `process` | Read+Write | [spec-kit-refine](https://github.com/Quratulain-bilal/spec-kit-refine) |
272274
| Spec Scope | Effort estimation and scope tracking — estimate work, detect creep, and budget time per phase | `process` | Read-only | [spec-kit-scope-](https://github.com/Quratulain-bilal/spec-kit-scope-) |

docs/community/presets.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ The following community-contributed presets customize how Spec Kit behaves — o
1818
| 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. Supports interactive elements like brainstorming, interview, roleplay and extras like statistics, cover builder and bio command. Export with templates for KDP, D2D etc. | 22 templates, 27 commands, 2 scripts || [speckit-preset-fiction-book-writing](https://github.com/adaumann/speckit-preset-fiction-book-writing) |
1919
| iSAQB Architecture Governance | Adds general iSAQB/CPSA-F and arc42 architecture governance: goals, context, building blocks, runtime and deployment views, quality 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) |
2020
| 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) |
21+
| 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) |
2122
| Multi-Repo Branching | Coordinates feature branch creation across multiple git repositories (independent repos and submodules) during plan and tasks phases | 2 commands || [spec-kit-preset-multi-repo-branching](https://github.com/sakitA/spec-kit-preset-multi-repo-branching) |
2223
| Pirate Speak (Full) | Transforms all Spec Kit output into pirate speak — specs become "Voyage Manifests", plans become "Battle Plans", tasks become "Crew Assignments" | 6 templates, 9 commands || [spec-kit-presets](https://github.com/mnriem/spec-kit-presets) |
2324
| Screenwriting | Spec-Driven Development for screenwriting/scriptwriting/tutorials: feature films, television (pilot, episode, limited series), and stage plays. Adapts the Spec Kit workflow to screenplay craft — slug lines, action lines, act breaks, beat sheets, and industry-standard pitch documents. Supports three-act, Save the Cat, TV pilot, network episode, cable/streaming episode, and stage-play structural frameworks. Export to Fountain, FTX, PDF | 26 templates, 32 commands, 1 script || [speckit-preset-screenwriting](https://github.com/adaumann/speckit-preset-screenwriting) |

extensions/catalog.community.json

Lines changed: 62 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"schema_version": "1.0",
3-
"updated_at": "2026-05-07T15:37:14Z",
3+
"updated_at": "2026-05-07T20:05:00Z",
44
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
55
"extensions": {
66
"aide": {
@@ -1416,6 +1416,35 @@
14161416
"created_at": "2026-04-28T00:00:00Z",
14171417
"updated_at": "2026-04-28T00:00:00Z"
14181418
},
1419+
"mde": {
1420+
"name": "MDE",
1421+
"id": "mde",
1422+
"description": "A Spec Kit extension that exposes a minimal model-driven engineering workflow with setup, next, and status commands.",
1423+
"author": "AI-MDE",
1424+
"version": "0.5.1",
1425+
"download_url": "https://github.com/AI-MDE/spec-kit-mde/archive/refs/tags/v0.5.1.zip",
1426+
"repository": "https://github.com/AI-MDE/spec-kit-mde",
1427+
"homepage": "https://github.com/AI-MDE/spec-kit-mde",
1428+
"license": "MIT",
1429+
"requires": {
1430+
"speckit_version": ">=0.1.0"
1431+
},
1432+
"provides": {
1433+
"commands": 4,
1434+
"hooks": 1
1435+
},
1436+
"tags": [
1437+
"mde",
1438+
"model-driven-engineering",
1439+
"workflow",
1440+
"process"
1441+
],
1442+
"verified": false,
1443+
"downloads": 0,
1444+
"stars": 0,
1445+
"created_at": "2026-05-08T00:00:00Z",
1446+
"updated_at": "2026-05-08T00:00:00Z"
1447+
},
14191448
"memory-loader": {
14201449
"name": "Memory Loader",
14211450
"id": "memory-loader",
@@ -2116,6 +2145,38 @@
21162145
"created_at": "2026-04-20T00:00:00Z",
21172146
"updated_at": "2026-04-20T00:00:00Z"
21182147
},
2148+
"schedule": {
2149+
"name": "Spec Kit Schedule — CP-SAT Agent Orchestrator",
2150+
"id": "schedule",
2151+
"description": "Optimal multi-agent task scheduling via CP-SAT solver with DAG precedence, hallucination-aware caps, file-conflict avoidance, stochastic durations, replanning, and interactive HTML output",
2152+
"author": "Julio César Franco Ardila",
2153+
"version": "0.6.2",
2154+
"download_url": "https://github.com/jfranc38/spec-kit-schedule/archive/refs/tags/v0.6.2.zip",
2155+
"repository": "https://github.com/jfranc38/spec-kit-schedule",
2156+
"homepage": "https://github.com/jfranc38/spec-kit-schedule",
2157+
"documentation": "https://github.com/jfranc38/spec-kit-schedule/blob/main/README.md",
2158+
"changelog": "https://github.com/jfranc38/spec-kit-schedule/blob/main/CHANGELOG.md",
2159+
"license": "MIT",
2160+
"requires": {
2161+
"speckit_version": ">=0.4.0"
2162+
},
2163+
"provides": {
2164+
"commands": 5,
2165+
"hooks": 1
2166+
},
2167+
"tags": [
2168+
"scheduling",
2169+
"optimization",
2170+
"multi-agent",
2171+
"cp-sat",
2172+
"operations-research"
2173+
],
2174+
"verified": false,
2175+
"downloads": 0,
2176+
"stars": 0,
2177+
"created_at": "2026-05-06T22:35:00Z",
2178+
"updated_at": "2026-05-07T17:25:00Z"
2179+
},
21192180
"scope": {
21202181
"name": "Spec Scope",
21212182
"id": "scope",

presets/catalog.community.json

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -311,6 +311,37 @@
311311
"created_at": "2026-04-15T00:00:00Z",
312312
"updated_at": "2026-04-15T00:00:00Z"
313313
},
314+
"mde": {
315+
"name": "Model Driven Engineering",
316+
"id": "mde",
317+
"version": "0.5.1",
318+
"description": "Focuses on streamlined commands, app repository support, cross-spec support, and capability-aware project memory for model-driven engineering workflows.",
319+
"author": "Ralph Hanna",
320+
"repository": "https://github.com/AI-MDE/spec-kit-preset-mde",
321+
"download_url": "https://github.com/AI-MDE/spec-kit-preset-mde/archive/refs/tags/v0.5.1.zip",
322+
"homepage": "https://github.com/AI-MDE/spec-kit-preset-mde",
323+
"documentation": "https://github.com/AI-MDE/spec-kit-preset-mde/blob/main/README.md",
324+
"license": "MIT",
325+
"requires": {
326+
"speckit_version": ">=0.1.0",
327+
"extensions": [
328+
"mde"
329+
]
330+
},
331+
"provides": {
332+
"templates": 6,
333+
"commands": 11
334+
},
335+
"tags": [
336+
"model-driven-engineering",
337+
"software-lifecycle",
338+
"business-analysis",
339+
"business-application",
340+
"multi-layered-architecture"
341+
],
342+
"created_at": "2026-05-08T00:00:00Z",
343+
"updated_at": "2026-05-08T00:00:00Z"
344+
},
314345
"multi-repo-branching": {
315346
"name": "Multi-Repo Branching",
316347
"id": "multi-repo-branching",

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "specify-cli"
3-
version = "0.8.8.dev0"
3+
version = "0.8.9.dev0"
44
description = "Specify CLI, part of GitHub Spec Kit. A tool to bootstrap your projects for Spec-Driven Development (SDD)."
55
requires-python = ">=3.11"
66
dependencies = [

src/specify_cli/__init__.py

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,8 @@ def _install_shared_infra(
773773
tracker: StepTracker | None = None,
774774
force: bool = False,
775775
invoke_separator: str = ".",
776+
refresh_managed: bool = False,
777+
refresh_hint: str | None = None,
776778
) -> bool:
777779
"""Install shared infrastructure files into *project_path*.
778780
@@ -784,9 +786,23 @@ def _install_shared_infra(
784786
placeholders using *invoke_separator* (``"."`` for markdown agents,
785787
``"-"`` for skills agents).
786788
787-
When *force* is ``True``, existing files are overwritten with the
788-
latest bundled versions. When ``False`` (default), only missing
789-
files are added and existing ones are skipped.
789+
Overwrite policy:
790+
791+
* ``force=True`` — overwrite every existing file (still skips symlinks
792+
to avoid following links outside the project root).
793+
* ``refresh_managed=True`` — overwrite only files whose on-disk hash
794+
still matches the previously recorded manifest hash (i.e. unmodified
795+
files installed by spec-kit). Files with diverging hashes are
796+
treated as user customizations and preserved with a warning.
797+
* Default — only add missing files; existing ones are skipped.
798+
799+
*refresh_hint* — caller-supplied rich-text fragment shown after the
800+
"Preserved customized files" warning to tell the user which flag/command
801+
they should re-run with to overwrite their customizations. Each caller
802+
passes the flag that's actually valid in its CLI surface (e.g.
803+
``--refresh-shared-infra`` for ``integration switch``,
804+
``--force`` for ``init``/``integration upgrade``). When ``None``, no
805+
remediation hint is printed for customizations.
790806
791807
Returns ``True`` on success.
792808
"""
@@ -799,6 +815,8 @@ def _install_shared_infra(
799815
console=console,
800816
force=force,
801817
invoke_separator=invoke_separator,
818+
refresh_managed=refresh_managed,
819+
refresh_hint=refresh_hint,
802820
)
803821

804822

@@ -808,6 +826,8 @@ def _install_shared_infra_or_exit(
808826
tracker: StepTracker | None = None,
809827
force: bool = False,
810828
invoke_separator: str = ".",
829+
refresh_managed: bool = False,
830+
refresh_hint: str | None = None,
811831
) -> bool:
812832
try:
813833
return _install_shared_infra(
@@ -816,6 +836,8 @@ def _install_shared_infra_or_exit(
816836
tracker=tracker,
817837
force=force,
818838
invoke_separator=invoke_separator,
839+
refresh_managed=refresh_managed,
840+
refresh_hint=refresh_hint,
819841
)
820842
except (ValueError, OSError) as exc:
821843
console.print(f"[red]Error:[/red] Failed to install shared infrastructure: {exc}")
@@ -2634,7 +2656,8 @@ def integration_uninstall(
26342656
def integration_switch(
26352657
target: str = typer.Argument(help="Integration key to switch to"),
26362658
script: str | None = typer.Option(None, "--script", help="Script type: sh or ps (default: from init-options.json or platform default)"),
2637-
force: bool = typer.Option(False, "--force", help="Force removal of modified files during uninstall"),
2659+
force: bool = typer.Option(False, "--force", help="Force removal of modified files during uninstall of the previous integration"),
2660+
refresh_shared_infra: bool = typer.Option(False, "--refresh-shared-infra", help="Also overwrite shared infrastructure files even if you customized them (otherwise customizations are preserved)"),
26382661
integration_options: str | None = typer.Option(None, "--integration-options", help='Options for the target integration'),
26392662
):
26402663
"""Switch from the current integration to a different one."""
@@ -2805,14 +2828,27 @@ def integration_switch(
28052828
target_integration, current, target, integration_options
28062829
)
28072830

2808-
# Ensure shared infrastructure is present (safe to run unconditionally;
2809-
# _install_shared_infra merges missing files without overwriting).
2831+
# Refresh shared infrastructure to the current CLI version. Switching
2832+
# integrations is exactly when stale vendored shared scripts (e.g.
2833+
# update-agent-context.sh that pre-dates the target integration's
2834+
# supported-agent list) would silently break the new integration.
2835+
#
2836+
# Use refresh_managed=True so only files that match their previously
2837+
# recorded hash are overwritten — user customizations are detected via
2838+
# hash divergence and preserved with a warning. Pass
2839+
# --refresh-shared-infra to overwrite customizations as well. See #2293.
28102840
_install_shared_infra_or_exit(
28112841
project_root,
28122842
selected_script,
2843+
force=refresh_shared_infra,
2844+
refresh_managed=True,
28132845
invoke_separator=_invoke_separator_for_integration(
28142846
target_integration, current, target, parsed_options
28152847
),
2848+
refresh_hint=(
2849+
"To overwrite customizations, re-run with "
2850+
"[cyan]specify integration switch ... --refresh-shared-infra[/cyan]."
2851+
),
28162852
)
28172853
if os.name != "nt":
28182854
ensure_executable_scripts(project_root)

0 commit comments

Comments
 (0)