deepmodel-dmx 0.1.0__tar.gz
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.
- deepmodel_dmx-0.1.0/.editorconfig +21 -0
- deepmodel_dmx-0.1.0/.github/PULL_REQUEST_TEMPLATE.md +13 -0
- deepmodel_dmx-0.1.0/.github/dependabot.yml +23 -0
- deepmodel_dmx-0.1.0/.github/workflows/publish.yml +27 -0
- deepmodel_dmx-0.1.0/.github/workflows/test.yml +39 -0
- deepmodel_dmx-0.1.0/.gitignore +48 -0
- deepmodel_dmx-0.1.0/.pre-commit-config.yaml +28 -0
- deepmodel_dmx-0.1.0/CHANGELOG.md +32 -0
- deepmodel_dmx-0.1.0/CLA.md +46 -0
- deepmodel_dmx-0.1.0/CONTRIBUTING.md +77 -0
- deepmodel_dmx-0.1.0/LICENSE +38 -0
- deepmodel_dmx-0.1.0/PKG-INFO +219 -0
- deepmodel_dmx-0.1.0/README.md +185 -0
- deepmodel_dmx-0.1.0/SECURITY.md +33 -0
- deepmodel_dmx-0.1.0/pyproject.toml +90 -0
- deepmodel_dmx-0.1.0/src/dmx/__init__.py +24 -0
- deepmodel_dmx-0.1.0/src/dmx/_workflow_version.py +10 -0
- deepmodel_dmx-0.1.0/src/dmx/catalog.py +260 -0
- deepmodel_dmx-0.1.0/src/dmx/cli.py +196 -0
- deepmodel_dmx-0.1.0/src/dmx/exceptions.py +55 -0
- deepmodel_dmx-0.1.0/src/dmx/http_auth.py +50 -0
- deepmodel_dmx-0.1.0/src/dmx/ide/__init__.py +12 -0
- deepmodel_dmx-0.1.0/src/dmx/ide/detect.py +86 -0
- deepmodel_dmx-0.1.0/src/dmx/ide/emitters.py +264 -0
- deepmodel_dmx-0.1.0/src/dmx/rules/system-prompt.md +116 -0
- deepmodel_dmx-0.1.0/src/dmx/server.py +244 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/specialist/dmx-docs.md +132 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/specialist/dmx-review.md +101 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/specialist/dmx-secure.md +112 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/specialist/dmx-test.md +102 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/utility/dmx-commit.md +174 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/utility/dmx-create-branch.md +216 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/utility/dmx-draft-pr-description.md +176 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/utility/dmx-status.md +114 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/utility/dmx-sync-branch.md +96 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/utility/dmx-update-memory.md +114 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/0-init/dmx-init.md +346 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/1-triage/dmx-create-ticket.md +268 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/1-triage/dmx-derive-ticket.md +267 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/1-triage/dmx-hotfix.md +122 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/2-plan/dmx-plan.md +132 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/3-build/dmx-implement-next-phase.md +88 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/3-build/dmx-implement-next-task.md +84 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/4-validate/dmx-validate.md +173 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/5-ship/dmx-close-ticket.md +208 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/5-ship/dmx-create-pr.md +153 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/6-release/dmx-create-release.md +122 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/6-release/dmx-draft-release-note.md +216 -0
- deepmodel_dmx-0.1.0/src/dmx/skills/workflow/6-release/dmx-release-merge.md +144 -0
- deepmodel_dmx-0.1.0/src/dmx/tools.py +244 -0
- deepmodel_dmx-0.1.0/tests/__init__.py +1 -0
- deepmodel_dmx-0.1.0/tests/__snapshots__/test_ide.ambr +70 -0
- deepmodel_dmx-0.1.0/tests/conftest.py +78 -0
- deepmodel_dmx-0.1.0/tests/test_catalog.py +214 -0
- deepmodel_dmx-0.1.0/tests/test_cli.py +320 -0
- deepmodel_dmx-0.1.0/tests/test_ide.py +533 -0
- deepmodel_dmx-0.1.0/tests/test_server.py +154 -0
- deepmodel_dmx-0.1.0/tests/test_tools.py +500 -0
- deepmodel_dmx-0.1.0/uv.lock +2058 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
root = true
|
|
2
|
+
|
|
3
|
+
[*]
|
|
4
|
+
indent_style = space
|
|
5
|
+
indent_size = 4
|
|
6
|
+
end_of_line = lf
|
|
7
|
+
charset = utf-8
|
|
8
|
+
trim_trailing_whitespace = true
|
|
9
|
+
insert_final_newline = true
|
|
10
|
+
|
|
11
|
+
[*.md]
|
|
12
|
+
trim_trailing_whitespace = false
|
|
13
|
+
|
|
14
|
+
[*.toml]
|
|
15
|
+
indent_size = 4
|
|
16
|
+
|
|
17
|
+
[*.yml]
|
|
18
|
+
indent_size = 2
|
|
19
|
+
|
|
20
|
+
[*.yaml]
|
|
21
|
+
indent_size = 2
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
## Summary
|
|
2
|
+
|
|
3
|
+
<!-- What does this PR do? Why? -->
|
|
4
|
+
|
|
5
|
+
## Checklist
|
|
6
|
+
|
|
7
|
+
- [ ] Tests added or updated for all changed behaviour
|
|
8
|
+
- [ ] `CHANGELOG.md` entry added under `[Unreleased]`
|
|
9
|
+
- [ ] All new functions and classes have type annotations
|
|
10
|
+
- [ ] `uv run ruff check src/ tests/` passes
|
|
11
|
+
- [ ] `uv run ruff format --check src/ tests/` passes
|
|
12
|
+
- [ ] `uv run mypy src/` passes
|
|
13
|
+
- [ ] `uv run python -m pytest` passes
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
version: 2
|
|
2
|
+
|
|
3
|
+
updates:
|
|
4
|
+
- package-ecosystem: pip
|
|
5
|
+
directory: /
|
|
6
|
+
schedule:
|
|
7
|
+
interval: weekly
|
|
8
|
+
day: monday
|
|
9
|
+
open-pull-requests-limit: 5
|
|
10
|
+
labels:
|
|
11
|
+
- dependencies
|
|
12
|
+
ignore:
|
|
13
|
+
# fastmcp is the critical dependency; pin updates manually after testing.
|
|
14
|
+
- dependency-name: fastmcp
|
|
15
|
+
update-types: ["version-update:semver-major"]
|
|
16
|
+
|
|
17
|
+
- package-ecosystem: github-actions
|
|
18
|
+
directory: /
|
|
19
|
+
schedule:
|
|
20
|
+
interval: weekly
|
|
21
|
+
day: monday
|
|
22
|
+
labels:
|
|
23
|
+
- dependencies
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
name: Publish to PyPI
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
tags:
|
|
6
|
+
- "v*"
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
publish:
|
|
10
|
+
name: Build and publish
|
|
11
|
+
runs-on: ubuntu-latest
|
|
12
|
+
environment: pypi
|
|
13
|
+
permissions:
|
|
14
|
+
id-token: write # required for OIDC trusted publishing
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- uses: actions/checkout@v6
|
|
18
|
+
|
|
19
|
+
- uses: astral-sh/setup-uv@v7
|
|
20
|
+
with:
|
|
21
|
+
version: "latest"
|
|
22
|
+
|
|
23
|
+
- name: Build
|
|
24
|
+
run: uv build
|
|
25
|
+
|
|
26
|
+
- name: Publish
|
|
27
|
+
run: uv publish
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
name: Test
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches: ["**"]
|
|
6
|
+
pull_request:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
test:
|
|
10
|
+
name: "Python ${{ matrix.python-version }} / ${{ matrix.os }}"
|
|
11
|
+
runs-on: ${{ matrix.os }}
|
|
12
|
+
strategy:
|
|
13
|
+
fail-fast: false
|
|
14
|
+
matrix:
|
|
15
|
+
python-version: ["3.11", "3.12", "3.13"]
|
|
16
|
+
os: [ubuntu-latest, macos-latest]
|
|
17
|
+
|
|
18
|
+
steps:
|
|
19
|
+
- uses: actions/checkout@v6
|
|
20
|
+
|
|
21
|
+
- uses: astral-sh/setup-uv@v7
|
|
22
|
+
with:
|
|
23
|
+
version: "latest"
|
|
24
|
+
python-version: ${{ matrix.python-version }}
|
|
25
|
+
|
|
26
|
+
- name: Install dependencies
|
|
27
|
+
run: uv sync --extra dev
|
|
28
|
+
|
|
29
|
+
- name: Lint — ruff check
|
|
30
|
+
run: uv run ruff check src/ tests/
|
|
31
|
+
|
|
32
|
+
- name: Lint — ruff format
|
|
33
|
+
run: uv run ruff format --check src/ tests/
|
|
34
|
+
|
|
35
|
+
- name: Type check — mypy
|
|
36
|
+
run: uv run mypy src/
|
|
37
|
+
|
|
38
|
+
- name: Test
|
|
39
|
+
run: uv run python -m pytest --cov --cov-fail-under=75 -q
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
# Python
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[cod]
|
|
4
|
+
*$py.class
|
|
5
|
+
*.so
|
|
6
|
+
*.egg
|
|
7
|
+
*.egg-info/
|
|
8
|
+
dist/
|
|
9
|
+
build/
|
|
10
|
+
.eggs/
|
|
11
|
+
|
|
12
|
+
# uv / virtualenv
|
|
13
|
+
.venv/
|
|
14
|
+
venv/
|
|
15
|
+
.python-version
|
|
16
|
+
|
|
17
|
+
# uv.lock is intentionally committed — do not add it here
|
|
18
|
+
|
|
19
|
+
# Type checking
|
|
20
|
+
.mypy_cache/
|
|
21
|
+
.dmypy.json
|
|
22
|
+
|
|
23
|
+
# Linting / formatting
|
|
24
|
+
.ruff_cache/
|
|
25
|
+
|
|
26
|
+
# Testing
|
|
27
|
+
.pytest_cache/
|
|
28
|
+
.coverage
|
|
29
|
+
htmlcov/
|
|
30
|
+
|
|
31
|
+
# IDE
|
|
32
|
+
.idea/
|
|
33
|
+
.vscode/
|
|
34
|
+
*.swp
|
|
35
|
+
*.swo
|
|
36
|
+
|
|
37
|
+
# OS
|
|
38
|
+
.DS_Store
|
|
39
|
+
Thumbs.db
|
|
40
|
+
|
|
41
|
+
# Distribution
|
|
42
|
+
*.whl
|
|
43
|
+
*.tar.gz
|
|
44
|
+
MANIFEST
|
|
45
|
+
|
|
46
|
+
# Environment / secrets
|
|
47
|
+
.env
|
|
48
|
+
.env.*
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
3
|
+
rev: v0.4.10
|
|
4
|
+
hooks:
|
|
5
|
+
- id: ruff
|
|
6
|
+
args: [--fix]
|
|
7
|
+
- id: ruff-format
|
|
8
|
+
|
|
9
|
+
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
10
|
+
rev: v1.10.0
|
|
11
|
+
hooks:
|
|
12
|
+
- id: mypy
|
|
13
|
+
additional_dependencies:
|
|
14
|
+
- fastmcp
|
|
15
|
+
- python-frontmatter
|
|
16
|
+
- pyyaml
|
|
17
|
+
- types-PyYAML
|
|
18
|
+
- click
|
|
19
|
+
|
|
20
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
21
|
+
rev: v4.6.0
|
|
22
|
+
hooks:
|
|
23
|
+
- id: trailing-whitespace
|
|
24
|
+
- id: end-of-file-fixer
|
|
25
|
+
- id: check-yaml
|
|
26
|
+
- id: check-toml
|
|
27
|
+
- id: check-merge-conflict
|
|
28
|
+
- id: debug-statements
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to `deepmodel-dmx` are documented here.
|
|
4
|
+
|
|
5
|
+
Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).
|
|
6
|
+
Versioning follows [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## [Unreleased]
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## [0.1.0] — 2026-06-01
|
|
15
|
+
|
|
16
|
+
### Added
|
|
17
|
+
|
|
18
|
+
- **23 SDLC skills** as MCP prompts, namespaced under the MCP server name: `/dmx/init`, `/dmx/create-ticket`, `/dmx/derive-ticket`, `/dmx/plan`, `/dmx/implement-next-phase`, `/dmx/implement-next-task`, `/dmx/validate`, `/dmx/create-branch`, `/dmx/commit`, `/dmx/create-pr`, `/dmx/draft-pr-description`, `/dmx/close-ticket`, `/dmx/hotfix`, `/dmx/draft-release-note`, `/dmx/release-merge`, `/dmx/create-release`, `/dmx/status`, `/dmx/sync-branch`, `/dmx/update-memory`, `/dmx/review`, `/dmx/test`, `/dmx/docs`, `/dmx/secure`
|
|
19
|
+
- **`system-prompt` rule** — always-apply AI persona and memory bank instructions
|
|
20
|
+
- **`detect_invoking_ide` tool** — detects Cursor, Claude, Copilot, Antigravity from MCP `clientInfo.name`, `X-Dmx-IDE` header, or `DMX_IDE` env var
|
|
21
|
+
- **`setup_ide_rules` tool** — emits per-IDE rule files for Cursor (`.mdc`), Claude, Copilot, Antigravity, and generic agents; response includes `workflow_version`
|
|
22
|
+
- **Workflow versioning** — `_workflow_version.py` tracks a `WORKFLOW_VERSION` constant independent of the package version; embedded in the DMX marker (`<!-- deepmodel:dmx:start workflow-v1 -->`) so staleness can be detected on re-init
|
|
23
|
+
- **`dmx serve`** — stdio and HTTP/SSE transports; `PORT` env var; `REQUIRE_API_KEY` + `MCP_API_KEY` bearer auth
|
|
24
|
+
- **`dmx serve --watch`** — hot-reload on skill/rule file changes (`watchfiles` extra)
|
|
25
|
+
- **`dmx list-skills`** — print all loaded skills with name, title, and argument count
|
|
26
|
+
- **`--skills-dir` / `--rules-dir`** CLI overrides and `DMX_SKILLS_DIR` / `DMX_RULES_DIR` env var overrides
|
|
27
|
+
- **`create_app()`** internal extension API for the Deepmodel commercial layer
|
|
28
|
+
- **CI** — GitHub Actions matrix: Python 3.11/3.12/3.13 × ubuntu/macos; ruff, mypy, pytest
|
|
29
|
+
- **Publishing** — OIDC trusted publisher workflow on `v*` tags
|
|
30
|
+
|
|
31
|
+
[Unreleased]: https://github.com/deepmodel-ai/dmx/compare/v0.1.0...HEAD
|
|
32
|
+
[0.1.0]: https://github.com/deepmodel-ai/dmx/releases/tag/v0.1.0
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# Contributor License Agreement
|
|
2
|
+
|
|
3
|
+
**Deepmodel, Inc. ("Deepmodel") Individual Contributor License Agreement ("CLA")**
|
|
4
|
+
|
|
5
|
+
Thank you for your interest in contributing to open-source software projects managed by Deepmodel ("We" or "Us").
|
|
6
|
+
|
|
7
|
+
This CLA is for your protection as a contributor as well as the protection of Deepmodel and its users; it does not change your rights to use your own contributions for any other purpose.
|
|
8
|
+
|
|
9
|
+
Please read this document carefully before signing and keep a copy for your records.
|
|
10
|
+
|
|
11
|
+
## 1. Definitions
|
|
12
|
+
|
|
13
|
+
"You" means the individual who submits a Contribution to Us.
|
|
14
|
+
|
|
15
|
+
"Contribution" means any original work of authorship, including any modifications or additions to an existing work, that you intentionally submit to Us for inclusion in, or documentation of, any of the products owned or managed by Us (the "Work").
|
|
16
|
+
|
|
17
|
+
"Submit" means any form of electronic, verbal, or written communication sent to Us, including but not limited to communication on electronic mailing lists, source-code control systems, and issue tracking systems.
|
|
18
|
+
|
|
19
|
+
## 2. Grant of Copyright License
|
|
20
|
+
|
|
21
|
+
Subject to the terms and conditions of this Agreement, you hereby assign to Us joint ownership of, and all copyrights in, your Contributions. This assignment allows Us to license your Contributions under any license, including proprietary licenses, in addition to any open-source license under which the Work is made available.
|
|
22
|
+
|
|
23
|
+
You retain the right to use your Contributions for any purpose and in any way you see fit, including the right to offer your Contributions under other license terms.
|
|
24
|
+
|
|
25
|
+
## 3. Grant of Patent License
|
|
26
|
+
|
|
27
|
+
Subject to the terms and conditions of this Agreement, you hereby grant to Us and to recipients of software distributed by Us a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by you that are necessarily infringed by your Contributions alone or by combination of your Contributions with the Work to which such Contributions were submitted.
|
|
28
|
+
|
|
29
|
+
## 4. You represent that
|
|
30
|
+
|
|
31
|
+
- Each Contribution you submit is your original creation.
|
|
32
|
+
- You have the legal authority to enter into this Agreement.
|
|
33
|
+
- Your Contributions do not violate any third-party intellectual property rights.
|
|
34
|
+
- If your employer has rights to intellectual property that you create, you have received permission to make Contributions on behalf of that employer, or your employer has waived such rights for your Contributions to Us.
|
|
35
|
+
|
|
36
|
+
## 5. Disclaimer of Warranties
|
|
37
|
+
|
|
38
|
+
Your Contributions are provided on an "AS IS" basis, without warranties or conditions of any kind, either express or implied, including, without limitation, any warranties or conditions of title, non-infringement, merchantability, or fitness for a particular purpose.
|
|
39
|
+
|
|
40
|
+
## 6. Agreement
|
|
41
|
+
|
|
42
|
+
By signing the CLA (via CLA Assistant when opening a pull request to a Deepmodel repository), you accept and agree to the terms and conditions of this Agreement for your present and future Contributions submitted to Deepmodel.
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
*This CLA is adapted from the Apache Individual Contributor License Agreement v2.0.*
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Contributing to dmx
|
|
2
|
+
|
|
3
|
+
Thank you for your interest in contributing. This document explains how to contribute and what we expect from contributors.
|
|
4
|
+
|
|
5
|
+
## Contributor License Agreement (CLA)
|
|
6
|
+
|
|
7
|
+
**Before your first pull request can be merged, you must sign the [Contributor License Agreement](CLA.md).**
|
|
8
|
+
|
|
9
|
+
We use [CLA Assistant](https://cla-assistant.io) — it will prompt you to sign directly in the PR when you open one. The CLA assigns copyright to Deepmodel while granting you the right to retain and use your contributions. This allows Deepmodel to offer `dmx` under AGPL-3.0 alongside a commercial license.
|
|
10
|
+
|
|
11
|
+
## Development setup
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
git clone https://github.com/deepmodel-ai/dmx.git
|
|
15
|
+
cd dmx
|
|
16
|
+
uv sync --extra dev
|
|
17
|
+
uv run pre-commit install # optional but recommended
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Running checks locally
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
uv run ruff check src/ tests/ # lint
|
|
24
|
+
uv run ruff format --check src/ tests/ # format
|
|
25
|
+
uv run mypy src/ # type check
|
|
26
|
+
uv run python -m pytest # tests
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
All four must pass before opening a PR. CI runs the same commands on Python 3.11, 3.12, and 3.13 on Ubuntu and macOS.
|
|
30
|
+
|
|
31
|
+
## Adding or editing skills
|
|
32
|
+
|
|
33
|
+
Skills are Markdown files under `src/dmx/skills/`. Each file requires YAML frontmatter:
|
|
34
|
+
|
|
35
|
+
```yaml
|
|
36
|
+
---
|
|
37
|
+
name: dmx-my-skill
|
|
38
|
+
title: Short human-readable title
|
|
39
|
+
description: One-sentence description shown in the IDE command palette.
|
|
40
|
+
arguments:
|
|
41
|
+
- name: my_arg
|
|
42
|
+
description: What this argument controls.
|
|
43
|
+
required: false
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
Your skill prompt body here.
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
- `name` must match `^[a-z0-9_-]+$`
|
|
50
|
+
- `title` and `description` are shown in the IDE; keep them concise
|
|
51
|
+
- Skill files live under `src/dmx/skills/<category>/<order>-<slug>/` — order prefix controls sort order
|
|
52
|
+
|
|
53
|
+
## Adding or editing rules
|
|
54
|
+
|
|
55
|
+
Rules are Markdown files under `src/dmx/rules/`. Each file requires YAML frontmatter:
|
|
56
|
+
|
|
57
|
+
```yaml
|
|
58
|
+
---
|
|
59
|
+
name: my-rule
|
|
60
|
+
title: Short title
|
|
61
|
+
description: One-sentence description of what this rule enforces.
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
Rule body here (written as an instruction to the AI).
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Pull request checklist
|
|
68
|
+
|
|
69
|
+
- [ ] Tests added or updated for all changed behaviour
|
|
70
|
+
- [ ] `CHANGELOG.md` entry added under `[Unreleased]`
|
|
71
|
+
- [ ] All new functions and classes have type annotations
|
|
72
|
+
- [ ] `ruff check`, `ruff format --check`, `mypy`, and `pytest` all pass
|
|
73
|
+
- [ ] CLA signed (CLA Assistant will prompt on first PR)
|
|
74
|
+
|
|
75
|
+
## Reporting bugs and feature requests
|
|
76
|
+
|
|
77
|
+
Open a [GitHub issue](https://github.com/deepmodel-ai/dmx/issues). For security issues, see [SECURITY.md](SECURITY.md).
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
GNU AFFERO GENERAL PUBLIC LICENSE
|
|
2
|
+
Version 3, 19 November 2007
|
|
3
|
+
|
|
4
|
+
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
|
|
5
|
+
Everyone is permitted to copy and distribute verbatim copies
|
|
6
|
+
of this license document, but changing it is not allowed.
|
|
7
|
+
|
|
8
|
+
Preamble
|
|
9
|
+
|
|
10
|
+
The GNU Affero General Public License is a free, copyleft license for
|
|
11
|
+
software and other kinds of works, specifically designed to ensure
|
|
12
|
+
cooperation with the community in the case of network server software.
|
|
13
|
+
|
|
14
|
+
The licenses for most software and other practical works are designed
|
|
15
|
+
to take away your freedom to share and change the works. By contrast,
|
|
16
|
+
our General Public Licenses are intended to guarantee your freedom to
|
|
17
|
+
share and change all versions of a program--to make sure it remains free
|
|
18
|
+
software for all its users.
|
|
19
|
+
|
|
20
|
+
When we speak of free software, we are referring to freedom, not
|
|
21
|
+
price. Our General Public Licenses are designed to make sure that you
|
|
22
|
+
have the freedom to distribute copies of free software (and charge for
|
|
23
|
+
them if you wish), that you receive source code or can modify it, that
|
|
24
|
+
you know you can do these rights, and that you have the freedom to use,
|
|
25
|
+
share, and change the software.
|
|
26
|
+
|
|
27
|
+
Specifically, the GNU Affero General Public License is designed to
|
|
28
|
+
ensure that anyone running a modified version of the software over a
|
|
29
|
+
network can receive the source code for that version.
|
|
30
|
+
|
|
31
|
+
For the full license text, see: https://www.gnu.org/licenses/agpl-3.0.txt
|
|
32
|
+
|
|
33
|
+
Copyright (C) 2024 Deepmodel Inc.
|
|
34
|
+
All Rights Reserved under AGPL-3.0.
|
|
35
|
+
|
|
36
|
+
Additional permissions: Deepmodel Inc. retains the right to release
|
|
37
|
+
the software under different license terms (dual licensing). See
|
|
38
|
+
CLA.md for contributor terms.
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: deepmodel-dmx
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: AI SDLC MCP server — skills and rules for any AI IDE.
|
|
5
|
+
License: AGPL-3.0
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Keywords: ai,claude,cursor,mcp,sdlc
|
|
8
|
+
Classifier: Development Status :: 3 - Alpha
|
|
9
|
+
Classifier: Intended Audience :: Developers
|
|
10
|
+
Classifier: License :: OSI Approved :: GNU Affero General Public License v3
|
|
11
|
+
Classifier: Programming Language :: Python :: 3
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
15
|
+
Requires-Python: >=3.11
|
|
16
|
+
Requires-Dist: click>=8.1
|
|
17
|
+
Requires-Dist: fastmcp>=2.0
|
|
18
|
+
Requires-Dist: python-frontmatter>=1.1
|
|
19
|
+
Requires-Dist: pyyaml>=6.0
|
|
20
|
+
Requires-Dist: starlette>=0.40
|
|
21
|
+
Provides-Extra: dev
|
|
22
|
+
Requires-Dist: httpx2>=2.2.0; extra == 'dev'
|
|
23
|
+
Requires-Dist: mypy>=1.10; extra == 'dev'
|
|
24
|
+
Requires-Dist: pre-commit>=3; extra == 'dev'
|
|
25
|
+
Requires-Dist: pytest-asyncio>=0.24; extra == 'dev'
|
|
26
|
+
Requires-Dist: pytest-cov>=5; extra == 'dev'
|
|
27
|
+
Requires-Dist: pytest>=8; extra == 'dev'
|
|
28
|
+
Requires-Dist: ruff>=0.4; extra == 'dev'
|
|
29
|
+
Requires-Dist: syrupy>=4; extra == 'dev'
|
|
30
|
+
Requires-Dist: types-pyyaml>=6.0; extra == 'dev'
|
|
31
|
+
Provides-Extra: watch
|
|
32
|
+
Requires-Dist: watchfiles>=0.21; extra == 'watch'
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
34
|
+
|
|
35
|
+
# dmx
|
|
36
|
+
|
|
37
|
+
[](https://pypi.org/project/deepmodel-dmx/)
|
|
38
|
+
[](https://github.com/deepmodel-ai/dmx/actions/workflows/test.yml)
|
|
39
|
+
[](LICENSE)
|
|
40
|
+
|
|
41
|
+
The official implementation of the [AI SDLC](https://github.com/deepmodel-ai/ai-sdlc) — delivered as an MCP server for any AI IDE.
|
|
42
|
+
|
|
43
|
+
`dmx` turns the AI SDLC framework into slash commands and always-apply engineering rules. Connect it to Cursor, Claude Code, GitHub Copilot, Antigravity, or any MCP-compatible IDE and get a structured, phase-gated AI engineering workflow out of the box.
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## The workflow
|
|
48
|
+
|
|
49
|
+
The [AI SDLC](https://github.com/deepmodel-ai/ai-sdlc) structures development around five phases with explicit developer control points. AI executes within each phase and stops. The developer drives every transition forward.
|
|
50
|
+
|
|
51
|
+

|
|
52
|
+
|
|
53
|
+
| Phase | What happens | dmx command |
|
|
54
|
+
|---|---|---|
|
|
55
|
+
| **Specify** | AI drafts a structured spec, surfaces ambiguity, asks Q&A. Developer answers. | `/dmx/create-ticket` |
|
|
56
|
+
| **Plan** | AI generates a phased task list from the answered spec. Developer reviews. | `/dmx/plan` |
|
|
57
|
+
| **Build** | AI implements one phase, stops, reports. Developer reviews and commits. Repeats. | `/dmx/implement-next-phase` |
|
|
58
|
+
| **Validate** | Automated quality gate checks spec, security, coverage. AI drafts the PR body. | `/dmx/validate` · `/dmx/create-pr` |
|
|
59
|
+
| **Ship** | Developer merges. AI tags the release and publishes. Developer confirms. | `/dmx/create-release` |
|
|
60
|
+
|
|
61
|
+
> The model does not merge. It does not advance the workflow. It does not decide when the work is done.
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Quick start
|
|
66
|
+
|
|
67
|
+
Add to your IDE's MCP config and restart:
|
|
68
|
+
|
|
69
|
+
**Cursor** — `~/.cursor/mcp.json`
|
|
70
|
+
|
|
71
|
+
```json
|
|
72
|
+
{
|
|
73
|
+
"mcpServers": {
|
|
74
|
+
"dmx": {
|
|
75
|
+
"command": "uvx",
|
|
76
|
+
"args": ["--from", "deepmodel-dmx", "dmx", "serve"]
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
**Claude Code** — `~/.claude/claude_desktop_config.json`
|
|
83
|
+
|
|
84
|
+
```json
|
|
85
|
+
{
|
|
86
|
+
"mcpServers": {
|
|
87
|
+
"dmx": {
|
|
88
|
+
"command": "uvx",
|
|
89
|
+
"args": ["--from", "deepmodel-dmx", "dmx", "serve"]
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**Antigravity** — `~/.gemini/config/mcp_config.json`
|
|
96
|
+
|
|
97
|
+
```json
|
|
98
|
+
{
|
|
99
|
+
"mcpServers": {
|
|
100
|
+
"dmx": {
|
|
101
|
+
"command": "uvx",
|
|
102
|
+
"args": ["--from", "deepmodel-dmx", "dmx", "serve"]
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
**GitHub Copilot** — `.vscode/settings.json` (workspace) or user settings
|
|
109
|
+
|
|
110
|
+
```json
|
|
111
|
+
{
|
|
112
|
+
"mcp": {
|
|
113
|
+
"servers": {
|
|
114
|
+
"dmx": {
|
|
115
|
+
"command": "uvx",
|
|
116
|
+
"args": ["--from", "deepmodel-dmx", "dmx", "serve"]
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Then run `/dmx-init` in your IDE to write always-apply rules and scaffold the `.dmx/` memory bank.
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## `/dmx-init` walkthrough
|
|
128
|
+
|
|
129
|
+
`/dmx-init` is the one-time project setup skill. It:
|
|
130
|
+
|
|
131
|
+
1. Detects your workflow mode (feature branches vs. trunk) and ticketing system
|
|
132
|
+
2. Auto-detects your GitHub remote and tech stack
|
|
133
|
+
3. Writes `.dmx/config.md` with project context
|
|
134
|
+
4. Scaffolds the `.dmx/` memory bank (architecture, decisions, style guide, etc.)
|
|
135
|
+
5. Calls `detect_invoking_ide` and `setup_ide_rules` to write IDE-specific rule files
|
|
136
|
+
6. Writes the always-apply persona rule so every future chat starts with the right context
|
|
137
|
+
|
|
138
|
+
Safe to re-run — updates config without overwriting memory bank files that already have content.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## Skill catalog
|
|
143
|
+
|
|
144
|
+
All `/dmx-*` commands are MCP prompts served live — no file writes, no installation beyond the MCP config.
|
|
145
|
+
|
|
146
|
+
### Workflow
|
|
147
|
+
|
|
148
|
+
| Skill | What it does |
|
|
149
|
+
|---|---|
|
|
150
|
+
| `/dmx/init` | One-time project setup: rules, memory bank, IDE config |
|
|
151
|
+
| `/dmx/create-ticket` | Idea → ticket → branch → spec in one command |
|
|
152
|
+
| `/dmx/derive-ticket` | Uncommitted changes → ticket → branch → derived spec |
|
|
153
|
+
| `/dmx/plan` | Answered spec → phased `tasks.md` |
|
|
154
|
+
| `/dmx/implement-next-phase` | Execute the next phase in `tasks.md`, stop |
|
|
155
|
+
| `/dmx/implement-next-task` | Execute the next single task, stop |
|
|
156
|
+
| `/dmx/validate` | Pre-PR quality gate: ticket, code, security |
|
|
157
|
+
| `/dmx/create-branch` | Create a properly named branch, scaffold spec |
|
|
158
|
+
| `/dmx/commit` | Conventional commit from staged diff |
|
|
159
|
+
| `/dmx/create-pr` | Open PR with correct title + description |
|
|
160
|
+
| `/dmx/draft-pr-description` | Generate PR body without opening the PR |
|
|
161
|
+
| `/dmx/close-ticket` | Post-merge: close ticket, delete branch, archive |
|
|
162
|
+
|
|
163
|
+
### Release
|
|
164
|
+
|
|
165
|
+
| Skill | What it does |
|
|
166
|
+
|---|---|
|
|
167
|
+
| `/dmx/hotfix` | Create hotfix branch from master |
|
|
168
|
+
| `/dmx/draft-release-note` | Generate release notes from merged PRs |
|
|
169
|
+
| `/dmx/release-merge` | Open staging → master release gate PR |
|
|
170
|
+
| `/dmx/create-release` | Tag and publish GitHub release |
|
|
171
|
+
|
|
172
|
+
### Utilities
|
|
173
|
+
|
|
174
|
+
| Skill | What it does |
|
|
175
|
+
|---|---|
|
|
176
|
+
| `/dmx/status` | Snapshot of in-progress tickets and open PRs |
|
|
177
|
+
| `/dmx/sync-branch` | Rebase/merge base branch onto current branch |
|
|
178
|
+
| `/dmx/update-memory` | Sync ticket learnings into memory bank |
|
|
179
|
+
| `/dmx/review` | Code review: clarity, correctness, maintainability |
|
|
180
|
+
| `/dmx/test` | Write tests that enable change |
|
|
181
|
+
| `/dmx/docs` | Write clear, human-first documentation |
|
|
182
|
+
| `/dmx/secure` | Security analysis — thinks like an attacker |
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## CLI
|
|
187
|
+
|
|
188
|
+
```
|
|
189
|
+
dmx serve # stdio transport (default, for IDE MCP config)
|
|
190
|
+
dmx serve --http # SSE transport on :8080 (team server / Docker)
|
|
191
|
+
dmx serve --http --port 9000
|
|
192
|
+
dmx serve --watch # hot-reload on file change (requires watchfiles extra)
|
|
193
|
+
dmx list-skills # print all loaded skills
|
|
194
|
+
dmx version
|
|
195
|
+
```
|
|
196
|
+
|
|
197
|
+
**Environment variables**
|
|
198
|
+
|
|
199
|
+
| Variable | Purpose | Default |
|
|
200
|
+
|---|---|---|
|
|
201
|
+
| `PORT` | HTTP port | `8080` |
|
|
202
|
+
| `DMX_SKILLS_DIR` | Override bundled skills directory | bundled |
|
|
203
|
+
| `DMX_RULES_DIR` | Override bundled rules directory | bundled |
|
|
204
|
+
| `DMX_IDE` | Force IDE detection (`cursor`, `claude`, `copilot`, `antigravity`, `agents`) | auto-detect |
|
|
205
|
+
| `MCP_API_KEY` | Bearer token for HTTP auth | — |
|
|
206
|
+
| `REQUIRE_API_KEY` | Enable HTTP bearer auth (`true`/`false`) | `false` |
|
|
207
|
+
|
|
208
|
+
---
|
|
209
|
+
|
|
210
|
+
## Requirements
|
|
211
|
+
|
|
212
|
+
- Python 3.11+
|
|
213
|
+
- `uv` (recommended) or any package manager that supports `uvx`
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## License
|
|
218
|
+
|
|
219
|
+
[AGPL-3.0](LICENSE) — free for open-source use. Commercial licensing available from [Deepmodel](https://deepmodel.ai).
|