Skip to content

Commit 15150ea

Browse files
Merge origin/main into add-changelog-extension
Resolve updated_at conflict by bumping to 2026-05-11. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2 parents f50ebf8 + b5db159 commit 15150ea

12 files changed

Lines changed: 488 additions & 83 deletions

File tree

.github/workflows/catalog-assign.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ jobs:
1919
permissions:
2020
issues: write
2121
steps:
22-
- uses: actions/github-script@v7
22+
- uses: actions/github-script@v9
2323
with:
2424
script: |
2525
const issue = context.payload.issue;

.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@34e114876b0b11c390a56381ad16ebd13914f8d5 # v4
2323

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

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

.github/workflows/docs.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ jobs:
3535
fetch-depth: 0 # Fetch all history for git info
3636

3737
- name: Setup .NET
38-
uses: actions/setup-dotnet@67a3573c9a986a3f9c594539f4ab511d57bb3ce9 # v4
38+
uses: actions/setup-dotnet@c2fa09f4bde5ebb9d1777cf28262a3eb3db3ced7 # v5.2.0
3939
with:
4040
dotnet-version: '8.x'
4141

.github/workflows/lint.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ jobs:
1515
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
1616

1717
- name: Run markdownlint-cli2
18-
uses: DavidAnson/markdownlint-cli2-action@6b51ade7a9e4a75a7ad929842dd298a3804ebe8b # v23
18+
uses: DavidAnson/markdownlint-cli2-action@ded1f9488f68a970bc66ea5619e13e9b52e601cd # v23
1919
with:
2020
globs: |
2121
'**/*.md'

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 Changelog | Auto-generate changelogs and release notes from spec git history and requirement diffs | `docs` | Read-only | [spec-kit-changelog](https://github.com/Quratulain-bilal/spec-kit-changelog) |
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 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) |
272274
| 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) |

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: 68 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"schema_version": "1.0",
3-
"updated_at": "2026-05-08T03:31:16Z",
3+
"updated_at": "2026-05-11T00:00:00Z",
44
"catalog_url": "https://raw.githubusercontent.com/github/spec-kit/main/extensions/catalog.community.json",
55
"extensions": {
66
"aide": {
@@ -174,8 +174,8 @@
174174
"id": "architecture-guard",
175175
"description": "Continuous architecture governance for AI-assisted development. Reviews specs, plans, and code for architecture drift, producing structured refactor tasks and evolution proposals.",
176176
"author": "DyanGalih",
177-
"version": "1.6.7",
178-
"download_url": "https://github.com/DyanGalih/spec-kit-architecture-guard/archive/refs/tags/v1.6.7.zip",
177+
"version": "1.8.0",
178+
"download_url": "https://github.com/DyanGalih/spec-kit-architecture-guard/archive/refs/tags/v1.8.0.zip",
179179
"repository": "https://github.com/DyanGalih/spec-kit-architecture-guard",
180180
"homepage": "https://github.com/DyanGalih/spec-kit-architecture-guard",
181181
"documentation": "https://github.com/DyanGalih/spec-kit-architecture-guard/blob/main/README.md",
@@ -200,7 +200,7 @@
200200
"downloads": 0,
201201
"stars": 0,
202202
"created_at": "2026-05-05T07:26:00Z",
203-
"updated_at": "2026-05-06T22:28:55Z"
203+
"updated_at": "2026-05-07T15:37:14Z"
204204
},
205205
"archive": {
206206
"name": "Archive Extension",
@@ -1448,6 +1448,35 @@
14481448
"created_at": "2026-04-28T00:00:00Z",
14491449
"updated_at": "2026-04-28T00:00:00Z"
14501450
},
1451+
"mde": {
1452+
"name": "MDE",
1453+
"id": "mde",
1454+
"description": "A Spec Kit extension that exposes a minimal model-driven engineering workflow with setup, next, and status commands.",
1455+
"author": "AI-MDE",
1456+
"version": "0.5.1",
1457+
"download_url": "https://github.com/AI-MDE/spec-kit-mde/archive/refs/tags/v0.5.1.zip",
1458+
"repository": "https://github.com/AI-MDE/spec-kit-mde",
1459+
"homepage": "https://github.com/AI-MDE/spec-kit-mde",
1460+
"license": "MIT",
1461+
"requires": {
1462+
"speckit_version": ">=0.1.0"
1463+
},
1464+
"provides": {
1465+
"commands": 4,
1466+
"hooks": 1
1467+
},
1468+
"tags": [
1469+
"mde",
1470+
"model-driven-engineering",
1471+
"workflow",
1472+
"process"
1473+
],
1474+
"verified": false,
1475+
"downloads": 0,
1476+
"stars": 0,
1477+
"created_at": "2026-05-08T00:00:00Z",
1478+
"updated_at": "2026-05-08T00:00:00Z"
1479+
},
14511480
"memory-loader": {
14521481
"name": "Memory Loader",
14531482
"id": "memory-loader",
@@ -1484,8 +1513,8 @@
14841513
"id": "memory-md",
14851514
"description": "Spec Kit extension for repository-native Markdown memory that captures durable decisions, bugs, and project context",
14861515
"author": "DyanGalih",
1487-
"version": "0.7.9",
1488-
"download_url": "https://github.com/DyanGalih/spec-kit-memory-hub/archive/refs/tags/v0.7.9.zip",
1516+
"version": "0.8.0",
1517+
"download_url": "https://github.com/DyanGalih/spec-kit-memory-hub/archive/refs/tags/v0.8.0.zip",
14891518
"repository": "https://github.com/DyanGalih/spec-kit-memory-hub",
14901519
"homepage": "https://github.com/DyanGalih/spec-kit-memory-hub",
14911520
"documentation": "https://github.com/DyanGalih/spec-kit-memory-hub/blob/main/README.md",
@@ -1510,7 +1539,7 @@
15101539
"downloads": 0,
15111540
"stars": 0,
15121541
"created_at": "2026-04-23T00:00:00Z",
1513-
"updated_at": "2026-05-06T22:28:55Z"
1542+
"updated_at": "2026-05-07T15:37:14Z"
15141543
},
15151544
"memorylint": {
15161545
"name": "MemoryLint",
@@ -2148,6 +2177,38 @@
21482177
"created_at": "2026-04-20T00:00:00Z",
21492178
"updated_at": "2026-04-20T00:00:00Z"
21502179
},
2180+
"schedule": {
2181+
"name": "Spec Kit Schedule — CP-SAT Agent Orchestrator",
2182+
"id": "schedule",
2183+
"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",
2184+
"author": "Julio César Franco Ardila",
2185+
"version": "0.6.2",
2186+
"download_url": "https://github.com/jfranc38/spec-kit-schedule/archive/refs/tags/v0.6.2.zip",
2187+
"repository": "https://github.com/jfranc38/spec-kit-schedule",
2188+
"homepage": "https://github.com/jfranc38/spec-kit-schedule",
2189+
"documentation": "https://github.com/jfranc38/spec-kit-schedule/blob/main/README.md",
2190+
"changelog": "https://github.com/jfranc38/spec-kit-schedule/blob/main/CHANGELOG.md",
2191+
"license": "MIT",
2192+
"requires": {
2193+
"speckit_version": ">=0.4.0"
2194+
},
2195+
"provides": {
2196+
"commands": 5,
2197+
"hooks": 1
2198+
},
2199+
"tags": [
2200+
"scheduling",
2201+
"optimization",
2202+
"multi-agent",
2203+
"cp-sat",
2204+
"operations-research"
2205+
],
2206+
"verified": false,
2207+
"downloads": 0,
2208+
"stars": 0,
2209+
"created_at": "2026-05-06T22:35:00Z",
2210+
"updated_at": "2026-05-07T17:25:00Z"
2211+
},
21512212
"scope": {
21522213
"name": "Spec Scope",
21532214
"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",

src/specify_cli/__init__.py

Lines changed: 42 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -769,6 +769,8 @@ def _install_shared_infra(
769769
tracker: StepTracker | None = None,
770770
force: bool = False,
771771
invoke_separator: str = ".",
772+
refresh_managed: bool = False,
773+
refresh_hint: str | None = None,
772774
) -> bool:
773775
"""Install shared infrastructure files into *project_path*.
774776
@@ -780,9 +782,23 @@ def _install_shared_infra(
780782
placeholders using *invoke_separator* (``"."`` for markdown agents,
781783
``"-"`` for skills agents).
782784
783-
When *force* is ``True``, existing files are overwritten with the
784-
latest bundled versions. When ``False`` (default), only missing
785-
files are added and existing ones are skipped.
785+
Overwrite policy:
786+
787+
* ``force=True`` — overwrite every existing file (still skips symlinks
788+
to avoid following links outside the project root).
789+
* ``refresh_managed=True`` — overwrite only files whose on-disk hash
790+
still matches the previously recorded manifest hash (i.e. unmodified
791+
files installed by spec-kit). Files with diverging hashes are
792+
treated as user customizations and preserved with a warning.
793+
* Default — only add missing files; existing ones are skipped.
794+
795+
*refresh_hint* — caller-supplied rich-text fragment shown after the
796+
"Preserved customized files" warning to tell the user which flag/command
797+
they should re-run with to overwrite their customizations. Each caller
798+
passes the flag that's actually valid in its CLI surface (e.g.
799+
``--refresh-shared-infra`` for ``integration switch``,
800+
``--force`` for ``init``/``integration upgrade``). When ``None``, no
801+
remediation hint is printed for customizations.
786802
787803
Returns ``True`` on success.
788804
"""
@@ -795,6 +811,8 @@ def _install_shared_infra(
795811
console=console,
796812
force=force,
797813
invoke_separator=invoke_separator,
814+
refresh_managed=refresh_managed,
815+
refresh_hint=refresh_hint,
798816
)
799817

800818

@@ -804,6 +822,8 @@ def _install_shared_infra_or_exit(
804822
tracker: StepTracker | None = None,
805823
force: bool = False,
806824
invoke_separator: str = ".",
825+
refresh_managed: bool = False,
826+
refresh_hint: str | None = None,
807827
) -> bool:
808828
try:
809829
return _install_shared_infra(
@@ -812,6 +832,8 @@ def _install_shared_infra_or_exit(
812832
tracker=tracker,
813833
force=force,
814834
invoke_separator=invoke_separator,
835+
refresh_managed=refresh_managed,
836+
refresh_hint=refresh_hint,
815837
)
816838
except (ValueError, OSError) as exc:
817839
console.print(f"[red]Error:[/red] Failed to install shared infrastructure: {exc}")
@@ -2583,7 +2605,8 @@ def integration_uninstall(
25832605
def integration_switch(
25842606
target: str = typer.Argument(help="Integration key to switch to"),
25852607
script: str | None = typer.Option(None, "--script", help="Script type: sh or ps (default: from init-options.json or platform default)"),
2586-
force: bool = typer.Option(False, "--force", help="Force removal of modified files during uninstall"),
2608+
force: bool = typer.Option(False, "--force", help="Force removal of modified files during uninstall of the previous integration"),
2609+
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)"),
25872610
integration_options: str | None = typer.Option(None, "--integration-options", help='Options for the target integration'),
25882611
):
25892612
"""Switch from the current integration to a different one."""
@@ -2754,14 +2777,27 @@ def integration_switch(
27542777
target_integration, current, target, integration_options
27552778
)
27562779

2757-
# Ensure shared infrastructure is present (safe to run unconditionally;
2758-
# _install_shared_infra merges missing files without overwriting).
2780+
# Refresh shared infrastructure to the current CLI version. Switching
2781+
# integrations is exactly when stale vendored shared scripts (e.g.
2782+
# update-agent-context.sh that pre-dates the target integration's
2783+
# supported-agent list) would silently break the new integration.
2784+
#
2785+
# Use refresh_managed=True so only files that match their previously
2786+
# recorded hash are overwritten — user customizations are detected via
2787+
# hash divergence and preserved with a warning. Pass
2788+
# --refresh-shared-infra to overwrite customizations as well. See #2293.
27592789
_install_shared_infra_or_exit(
27602790
project_root,
27612791
selected_script,
2792+
force=refresh_shared_infra,
2793+
refresh_managed=True,
27622794
invoke_separator=_invoke_separator_for_integration(
27632795
target_integration, current, target, parsed_options
27642796
),
2797+
refresh_hint=(
2798+
"To overwrite customizations, re-run with "
2799+
"[cyan]specify integration switch ... --refresh-shared-infra[/cyan]."
2800+
),
27652801
)
27662802
if os.name != "nt":
27672803
ensure_executable_scripts(project_root)

0 commit comments

Comments
 (0)