moai-adk 0.10.1__py3-none-any.whl → 0.11.1__py3-none-any.whl
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.
Potentially problematic release.
This version of moai-adk might be problematic. Click here for more details.
- moai_adk/core/issue_creator.py +2 -2
- moai_adk/core/project/detector.py +285 -12
- moai_adk/core/project/phase_executor.py +4 -0
- moai_adk/core/tags/ci_validator.py +33 -3
- moai_adk/core/template_engine.py +6 -2
- moai_adk/templates/.claude/commands/alfred/0-project.md +60 -62
- moai_adk/templates/.claude/commands/alfred/1-plan.md +6 -0
- moai_adk/templates/.claude/commands/alfred/2-run.md +6 -0
- moai_adk/templates/.claude/commands/alfred/3-sync.md +6 -0
- moai_adk/templates/.claude/hooks/alfred/alfred_hooks.py +8 -9
- moai_adk/templates/.claude/hooks/alfred/core/project.py +22 -28
- moai_adk/templates/.claude/hooks/alfred/core/timeout.py +136 -0
- moai_adk/templates/.claude/hooks/alfred/core/ttl_cache.py +109 -0
- moai_adk/templates/.claude/hooks/alfred/core/version_cache.py +4 -4
- moai_adk/templates/.claude/hooks/alfred/notification__handle_events.py +10 -15
- moai_adk/templates/.claude/hooks/alfred/post_tool__log_changes.py +10 -15
- moai_adk/templates/.claude/hooks/alfred/pre_tool__auto_checkpoint.py +10 -15
- moai_adk/templates/.claude/hooks/alfred/session_end__cleanup.py +10 -15
- moai_adk/templates/.claude/hooks/alfred/session_start__show_project_info.py +10 -15
- moai_adk/templates/.claude/hooks/alfred/shared/core/__init__.py +2 -2
- moai_adk/templates/.claude/hooks/alfred/shared/core/project.py +19 -26
- moai_adk/templates/.claude/hooks/alfred/shared/core/tags.py +55 -23
- moai_adk/templates/.claude/hooks/alfred/shared/core/version_cache.py +4 -4
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/notification.py +134 -3
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/session.py +9 -10
- moai_adk/templates/.claude/hooks/alfred/shared/handlers/tool.py +3 -6
- moai_adk/templates/.claude/hooks/alfred/stop__handle_interrupt.py +10 -15
- moai_adk/templates/.claude/hooks/alfred/subagent_stop__handle_subagent_end.py +10 -15
- moai_adk/templates/.claude/hooks/alfred/user_prompt__jit_load_docs.py +11 -20
- moai_adk/templates/.claude/hooks/alfred/utils/__init__.py +1 -0
- moai_adk/templates/.claude/hooks/alfred/utils/timeout.py +136 -0
- moai_adk/templates/.github/workflows/c-tag-validation.yml +83 -0
- moai_adk/templates/.github/workflows/cpp-tag-validation.yml +79 -0
- moai_adk/templates/.github/workflows/csharp-tag-validation.yml +65 -0
- moai_adk/templates/.github/workflows/dart-tag-validation.yml +82 -0
- moai_adk/templates/.github/workflows/java-tag-validation.yml +75 -0
- moai_adk/templates/.github/workflows/kotlin-tag-validation.yml +67 -0
- moai_adk/templates/.github/workflows/{release.yml → moai-adk-release.yml} +6 -2
- moai_adk/templates/.github/workflows/{tag-validation.yml → moai-adk-tag-validation.yml} +53 -8
- moai_adk/templates/.github/workflows/moai-gitflow.yml +6 -1
- moai_adk/templates/.github/workflows/php-tag-validation.yml +56 -0
- moai_adk/templates/.github/workflows/ruby-tag-validation.yml +68 -0
- moai_adk/templates/.github/workflows/rust-tag-validation.yml +73 -0
- moai_adk/templates/.github/workflows/shell-tag-validation.yml +65 -0
- moai_adk/templates/.github/workflows/swift-tag-validation.yml +79 -0
- moai_adk/templates/.moai/memory/GITFLOW-PROTECTION-POLICY.md +330 -0
- moai_adk/templates/.moai/memory/SPEC-METADATA.md +356 -0
- moai_adk/templates/CLAUDE.md +536 -65
- moai_adk/templates/workflows/go-tag-validation.yml +130 -0
- moai_adk/templates/workflows/javascript-tag-validation.yml +135 -0
- moai_adk/templates/workflows/python-tag-validation.yml +118 -0
- moai_adk/templates/workflows/typescript-tag-validation.yml +154 -0
- {moai_adk-0.10.1.dist-info → moai_adk-0.11.1.dist-info}/METADATA +70 -13
- {moai_adk-0.10.1.dist-info → moai_adk-0.11.1.dist-info}/RECORD +58 -37
- /moai_adk/templates/.github/workflows/{spec-issue-sync.yml → moai-adk-spec-issue-sync.yml} +0 -0
- {moai_adk-0.10.1.dist-info → moai_adk-0.11.1.dist-info}/WHEEL +0 -0
- {moai_adk-0.10.1.dist-info → moai_adk-0.11.1.dist-info}/entry_points.txt +0 -0
- {moai_adk-0.10.1.dist-info → moai_adk-0.11.1.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# @CODE:LANG-001-GO | SPEC: SPEC-LANGUAGE-DETECTION-001.md | TEST: tests/test_workflows.py
|
|
2
|
+
# Go Project TAG Validation Workflow
|
|
3
|
+
# Automatically validates TAGs with go test, golangci-lint, and coverage
|
|
4
|
+
|
|
5
|
+
name: TAG Validation (Go)
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches: [main, develop, feature/**]
|
|
10
|
+
pull_request:
|
|
11
|
+
branches: [main, develop]
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
15
|
+
cancel-in-progress: true
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
validate:
|
|
19
|
+
name: Validate TAGs - Go ${{ matrix.go-version }}
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
|
|
22
|
+
strategy:
|
|
23
|
+
matrix:
|
|
24
|
+
go-version: ['1.22', '1.23']
|
|
25
|
+
fail-fast: false
|
|
26
|
+
|
|
27
|
+
steps:
|
|
28
|
+
- name: Checkout repository
|
|
29
|
+
uses: actions/checkout@v4
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 0
|
|
32
|
+
|
|
33
|
+
- name: Set up Go ${{ matrix.go-version }}
|
|
34
|
+
uses: actions/setup-go@v6
|
|
35
|
+
with:
|
|
36
|
+
go-version: ${{ matrix.go-version }}
|
|
37
|
+
cache: true
|
|
38
|
+
|
|
39
|
+
- name: Cache Go modules
|
|
40
|
+
uses: actions/cache@v4
|
|
41
|
+
with:
|
|
42
|
+
path: |
|
|
43
|
+
~/.cache/go-build
|
|
44
|
+
~/go/pkg/mod
|
|
45
|
+
key: go-${{ runner.os }}-${{ matrix.go-version }}-${{ hashFiles('**/go.sum') }}
|
|
46
|
+
restore-keys: |
|
|
47
|
+
go-${{ runner.os }}-${{ matrix.go-version }}-
|
|
48
|
+
go-${{ runner.os }}-
|
|
49
|
+
|
|
50
|
+
- name: Download dependencies
|
|
51
|
+
run: go mod download
|
|
52
|
+
|
|
53
|
+
- name: Verify dependencies
|
|
54
|
+
run: go mod verify
|
|
55
|
+
|
|
56
|
+
- name: Run go fmt
|
|
57
|
+
run: |
|
|
58
|
+
FMT_OUTPUT=$(gofmt -l .)
|
|
59
|
+
if [ -n "$FMT_OUTPUT" ]; then
|
|
60
|
+
echo "Files need formatting:"
|
|
61
|
+
echo "$FMT_OUTPUT"
|
|
62
|
+
exit 1
|
|
63
|
+
fi
|
|
64
|
+
|
|
65
|
+
- name: Run golangci-lint
|
|
66
|
+
uses: golangci/golangci-lint-action@v6
|
|
67
|
+
with:
|
|
68
|
+
version: latest
|
|
69
|
+
args: --timeout=5m
|
|
70
|
+
|
|
71
|
+
- name: Run tests with coverage
|
|
72
|
+
run: |
|
|
73
|
+
go test -v -race -coverprofile=coverage.out -covermode=atomic ./...
|
|
74
|
+
go tool cover -func=coverage.out
|
|
75
|
+
|
|
76
|
+
- name: Check coverage threshold
|
|
77
|
+
run: |
|
|
78
|
+
COVERAGE=$(go tool cover -func=coverage.out | grep total | awk '{print $3}' | sed 's/%//')
|
|
79
|
+
echo "Total coverage: ${COVERAGE}%"
|
|
80
|
+
if (( $(echo "$COVERAGE < 75" | bc -l) )); then
|
|
81
|
+
echo "❌ Coverage ${COVERAGE}% is below 75% threshold"
|
|
82
|
+
exit 1
|
|
83
|
+
fi
|
|
84
|
+
echo "✅ Coverage ${COVERAGE}% meets 75% threshold"
|
|
85
|
+
|
|
86
|
+
- name: Upload coverage reports
|
|
87
|
+
if: matrix.go-version == '1.23'
|
|
88
|
+
uses: actions/upload-artifact@v4
|
|
89
|
+
with:
|
|
90
|
+
name: coverage-report-go
|
|
91
|
+
path: coverage.out
|
|
92
|
+
|
|
93
|
+
- name: Comment PR with coverage
|
|
94
|
+
if: github.event_name == 'pull_request' && matrix.go-version == '1.23'
|
|
95
|
+
uses: codecov/codecov-action@v5
|
|
96
|
+
with:
|
|
97
|
+
files: ./coverage.out
|
|
98
|
+
flags: go
|
|
99
|
+
fail_ci_if_error: false
|
|
100
|
+
|
|
101
|
+
- name: Run go vet
|
|
102
|
+
run: go vet ./...
|
|
103
|
+
|
|
104
|
+
- name: Build project
|
|
105
|
+
run: go build -v ./...
|
|
106
|
+
|
|
107
|
+
quality-gate:
|
|
108
|
+
name: Quality Gate Summary
|
|
109
|
+
needs: validate
|
|
110
|
+
runs-on: ubuntu-latest
|
|
111
|
+
if: always()
|
|
112
|
+
|
|
113
|
+
steps:
|
|
114
|
+
- name: Check validation results
|
|
115
|
+
run: |
|
|
116
|
+
if [ "${{ needs.validate.result }}" != "success" ]; then
|
|
117
|
+
echo "❌ TAG validation failed"
|
|
118
|
+
exit 1
|
|
119
|
+
fi
|
|
120
|
+
echo "✅ TAG validation passed"
|
|
121
|
+
|
|
122
|
+
- name: Quality metrics summary
|
|
123
|
+
run: |
|
|
124
|
+
echo "## Quality Metrics Summary" >> $GITHUB_STEP_SUMMARY
|
|
125
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
126
|
+
echo "- ✅ Go tests passed" >> $GITHUB_STEP_SUMMARY
|
|
127
|
+
echo "- ✅ Code coverage ≥ 75%" >> $GITHUB_STEP_SUMMARY
|
|
128
|
+
echo "- ✅ Linting passed (golangci-lint)" >> $GITHUB_STEP_SUMMARY
|
|
129
|
+
echo "- ✅ Formatting checked (gofmt)" >> $GITHUB_STEP_SUMMARY
|
|
130
|
+
echo "- ✅ Build successful" >> $GITHUB_STEP_SUMMARY
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# @CODE:LANG-001-JAVASCRIPT | SPEC: SPEC-LANGUAGE-DETECTION-001.md | TEST: tests/test_workflows.py
|
|
2
|
+
# JavaScript Project TAG Validation Workflow
|
|
3
|
+
# Automatically validates TAGs in JavaScript projects with npm/yarn/pnpm auto-detection
|
|
4
|
+
|
|
5
|
+
name: TAG Validation (JavaScript)
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches: [main, develop, feature/**]
|
|
10
|
+
pull_request:
|
|
11
|
+
branches: [main, develop]
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
15
|
+
cancel-in-progress: true
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
validate:
|
|
19
|
+
name: Validate TAGs - Node ${{ matrix.node-version }}
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
|
|
22
|
+
strategy:
|
|
23
|
+
matrix:
|
|
24
|
+
node-version: ['20', '22']
|
|
25
|
+
fail-fast: false
|
|
26
|
+
|
|
27
|
+
steps:
|
|
28
|
+
- name: Checkout repository
|
|
29
|
+
uses: actions/checkout@v4
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 0
|
|
32
|
+
|
|
33
|
+
- name: Set up Node.js ${{ matrix.node-version }}
|
|
34
|
+
uses: actions/setup-node@v6
|
|
35
|
+
with:
|
|
36
|
+
node-version: ${{ matrix.node-version }}
|
|
37
|
+
|
|
38
|
+
- name: Detect package manager
|
|
39
|
+
id: detect-pm
|
|
40
|
+
run: |
|
|
41
|
+
if [ -f "bun.lockb" ]; then
|
|
42
|
+
echo "manager=bun" >> $GITHUB_OUTPUT
|
|
43
|
+
echo "lockfile=bun.lockb" >> $GITHUB_OUTPUT
|
|
44
|
+
elif [ -f "pnpm-lock.yaml" ]; then
|
|
45
|
+
echo "manager=pnpm" >> $GITHUB_OUTPUT
|
|
46
|
+
echo "lockfile=pnpm-lock.yaml" >> $GITHUB_OUTPUT
|
|
47
|
+
elif [ -f "yarn.lock" ]; then
|
|
48
|
+
echo "manager=yarn" >> $GITHUB_OUTPUT
|
|
49
|
+
echo "lockfile=yarn.lock" >> $GITHUB_OUTPUT
|
|
50
|
+
else
|
|
51
|
+
echo "manager=npm" >> $GITHUB_OUTPUT
|
|
52
|
+
echo "lockfile=package-lock.json" >> $GITHUB_OUTPUT
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
- name: Setup package manager cache
|
|
56
|
+
uses: actions/setup-node@v6
|
|
57
|
+
with:
|
|
58
|
+
node-version: ${{ matrix.node-version }}
|
|
59
|
+
cache: ${{ steps.detect-pm.outputs.manager }}
|
|
60
|
+
|
|
61
|
+
- name: Install pnpm (if needed)
|
|
62
|
+
if: steps.detect-pm.outputs.manager == 'pnpm'
|
|
63
|
+
run: npm install -g pnpm
|
|
64
|
+
|
|
65
|
+
- name: Install Bun (if needed)
|
|
66
|
+
if: steps.detect-pm.outputs.manager == 'bun'
|
|
67
|
+
uses: oven-sh/setup-bun@v2
|
|
68
|
+
|
|
69
|
+
- name: Install dependencies
|
|
70
|
+
run: |
|
|
71
|
+
case "${{ steps.detect-pm.outputs.manager }}" in
|
|
72
|
+
npm)
|
|
73
|
+
npm ci
|
|
74
|
+
;;
|
|
75
|
+
yarn)
|
|
76
|
+
yarn install --frozen-lockfile
|
|
77
|
+
;;
|
|
78
|
+
pnpm)
|
|
79
|
+
pnpm install --frozen-lockfile
|
|
80
|
+
;;
|
|
81
|
+
bun)
|
|
82
|
+
bun install --frozen-lockfile
|
|
83
|
+
;;
|
|
84
|
+
esac
|
|
85
|
+
|
|
86
|
+
- name: Run linting
|
|
87
|
+
run: |
|
|
88
|
+
if [ -f "biome.json" ]; then
|
|
89
|
+
npx @biomejs/biome check src/
|
|
90
|
+
elif command -v eslint &> /dev/null; then
|
|
91
|
+
npm run lint || npx eslint src/
|
|
92
|
+
fi
|
|
93
|
+
continue-on-error: false
|
|
94
|
+
|
|
95
|
+
- name: Run tests with coverage
|
|
96
|
+
run: npm test -- --coverage --coverage-threshold=80
|
|
97
|
+
continue-on-error: false
|
|
98
|
+
|
|
99
|
+
- name: Upload coverage reports
|
|
100
|
+
if: matrix.node-version == '22'
|
|
101
|
+
uses: actions/upload-artifact@v4
|
|
102
|
+
with:
|
|
103
|
+
name: coverage-report-javascript
|
|
104
|
+
path: coverage/
|
|
105
|
+
|
|
106
|
+
- name: Comment PR with coverage
|
|
107
|
+
if: github.event_name == 'pull_request' && matrix.node-version == '22'
|
|
108
|
+
uses: ArtiomTr/jest-coverage-report-action@v2
|
|
109
|
+
with:
|
|
110
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
111
|
+
threshold: 80
|
|
112
|
+
|
|
113
|
+
quality-gate:
|
|
114
|
+
name: Quality Gate Summary
|
|
115
|
+
needs: validate
|
|
116
|
+
runs-on: ubuntu-latest
|
|
117
|
+
if: always()
|
|
118
|
+
|
|
119
|
+
steps:
|
|
120
|
+
- name: Check validation results
|
|
121
|
+
run: |
|
|
122
|
+
if [ "${{ needs.validate.result }}" != "success" ]; then
|
|
123
|
+
echo "❌ TAG validation failed"
|
|
124
|
+
exit 1
|
|
125
|
+
fi
|
|
126
|
+
echo "✅ TAG validation passed"
|
|
127
|
+
|
|
128
|
+
- name: Quality metrics summary
|
|
129
|
+
run: |
|
|
130
|
+
echo "## Quality Metrics Summary" >> $GITHUB_STEP_SUMMARY
|
|
131
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
132
|
+
echo "- ✅ JavaScript tests passed" >> $GITHUB_STEP_SUMMARY
|
|
133
|
+
echo "- ✅ Code coverage ≥ 80%" >> $GITHUB_STEP_SUMMARY
|
|
134
|
+
echo "- ✅ Linting passed" >> $GITHUB_STEP_SUMMARY
|
|
135
|
+
echo "- ✅ TAG chain validated" >> $GITHUB_STEP_SUMMARY
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# @CODE:LANG-001-PYTHON | SPEC: SPEC-LANGUAGE-DETECTION-001.md | TEST: tests/test_workflows.py
|
|
2
|
+
# Python Project TAG Validation Workflow
|
|
3
|
+
# Automatically validates TAGs in Python projects with pytest, ruff, and mypy
|
|
4
|
+
|
|
5
|
+
name: TAG Validation (Python)
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches: [main, develop, feature/**]
|
|
10
|
+
pull_request:
|
|
11
|
+
branches: [main, develop]
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
15
|
+
cancel-in-progress: true
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
validate:
|
|
19
|
+
name: Validate TAGs - Python ${{ matrix.python-version }}
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
|
|
22
|
+
strategy:
|
|
23
|
+
matrix:
|
|
24
|
+
python-version: ['3.11', '3.12', '3.13']
|
|
25
|
+
fail-fast: false
|
|
26
|
+
|
|
27
|
+
steps:
|
|
28
|
+
- name: Checkout repository
|
|
29
|
+
uses: actions/checkout@v4
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 0
|
|
32
|
+
|
|
33
|
+
- name: Set up Python ${{ matrix.python-version }}
|
|
34
|
+
uses: actions/setup-python@v6
|
|
35
|
+
with:
|
|
36
|
+
python-version: ${{ matrix.python-version }}
|
|
37
|
+
cache: 'pip'
|
|
38
|
+
|
|
39
|
+
- name: Install uv
|
|
40
|
+
run: pip install uv
|
|
41
|
+
|
|
42
|
+
- name: Cache uv dependencies
|
|
43
|
+
uses: actions/cache@v4
|
|
44
|
+
with:
|
|
45
|
+
path: ~/.cache/uv
|
|
46
|
+
key: uv-${{ runner.os }}-${{ matrix.python-version }}-${{ hashFiles('**/pyproject.toml') }}
|
|
47
|
+
restore-keys: |
|
|
48
|
+
uv-${{ runner.os }}-${{ matrix.python-version }}-
|
|
49
|
+
uv-${{ runner.os }}-
|
|
50
|
+
|
|
51
|
+
- name: Install dependencies with uv
|
|
52
|
+
run: uv sync --all-extras --dev
|
|
53
|
+
|
|
54
|
+
- name: Run TAG validation
|
|
55
|
+
run: |
|
|
56
|
+
uv run pytest tests/ -v \
|
|
57
|
+
--cov=src \
|
|
58
|
+
--cov-report=term-missing \
|
|
59
|
+
--cov-report=html:htmlcov \
|
|
60
|
+
--cov-report=xml:coverage.xml \
|
|
61
|
+
--cov-fail-under=85
|
|
62
|
+
continue-on-error: false
|
|
63
|
+
|
|
64
|
+
- name: Run linting with ruff
|
|
65
|
+
run: uv run ruff check src/ tests/
|
|
66
|
+
continue-on-error: false
|
|
67
|
+
|
|
68
|
+
- name: Run type checking with mypy
|
|
69
|
+
run: uv run mypy src/ --ignore-missing-imports
|
|
70
|
+
continue-on-error: true
|
|
71
|
+
|
|
72
|
+
- name: Upload coverage reports
|
|
73
|
+
if: matrix.python-version == '3.13'
|
|
74
|
+
uses: actions/upload-artifact@v4
|
|
75
|
+
with:
|
|
76
|
+
name: coverage-report-python
|
|
77
|
+
path: |
|
|
78
|
+
htmlcov/
|
|
79
|
+
coverage.xml
|
|
80
|
+
|
|
81
|
+
- name: Comment PR with coverage
|
|
82
|
+
if: github.event_name == 'pull_request' && matrix.python-version == '3.13'
|
|
83
|
+
uses: py-cov-action/python-coverage-comment-action@v3
|
|
84
|
+
with:
|
|
85
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
86
|
+
MINIMUM_GREEN: 85
|
|
87
|
+
MINIMUM_ORANGE: 75
|
|
88
|
+
|
|
89
|
+
- name: Check TAG chain integrity
|
|
90
|
+
run: |
|
|
91
|
+
echo "Validating TAG chain integrity..."
|
|
92
|
+
uv run python -m moai_adk.core.tags.validator --validate-chain
|
|
93
|
+
continue-on-error: true
|
|
94
|
+
|
|
95
|
+
quality-gate:
|
|
96
|
+
name: Quality Gate Summary
|
|
97
|
+
needs: validate
|
|
98
|
+
runs-on: ubuntu-latest
|
|
99
|
+
if: always()
|
|
100
|
+
|
|
101
|
+
steps:
|
|
102
|
+
- name: Check validation results
|
|
103
|
+
run: |
|
|
104
|
+
if [ "${{ needs.validate.result }}" != "success" ]; then
|
|
105
|
+
echo "❌ TAG validation failed"
|
|
106
|
+
exit 1
|
|
107
|
+
fi
|
|
108
|
+
echo "✅ TAG validation passed"
|
|
109
|
+
|
|
110
|
+
- name: Quality metrics summary
|
|
111
|
+
run: |
|
|
112
|
+
echo "## Quality Metrics Summary" >> $GITHUB_STEP_SUMMARY
|
|
113
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
114
|
+
echo "- ✅ Python tests passed" >> $GITHUB_STEP_SUMMARY
|
|
115
|
+
echo "- ✅ Code coverage ≥ 85%" >> $GITHUB_STEP_SUMMARY
|
|
116
|
+
echo "- ✅ Linting passed (ruff)" >> $GITHUB_STEP_SUMMARY
|
|
117
|
+
echo "- ✅ Type checking passed (mypy)" >> $GITHUB_STEP_SUMMARY
|
|
118
|
+
echo "- ✅ TAG chain validated" >> $GITHUB_STEP_SUMMARY
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
# @CODE:LANG-001-TYPESCRIPT | SPEC: SPEC-LANGUAGE-DETECTION-001.md | TEST: tests/test_workflows.py
|
|
2
|
+
# TypeScript Project TAG Validation Workflow
|
|
3
|
+
# Automatically validates TAGs with type checking, linting, and testing
|
|
4
|
+
|
|
5
|
+
name: TAG Validation (TypeScript)
|
|
6
|
+
|
|
7
|
+
on:
|
|
8
|
+
push:
|
|
9
|
+
branches: [main, develop, feature/**]
|
|
10
|
+
pull_request:
|
|
11
|
+
branches: [main, develop]
|
|
12
|
+
|
|
13
|
+
concurrency:
|
|
14
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
15
|
+
cancel-in-progress: true
|
|
16
|
+
|
|
17
|
+
jobs:
|
|
18
|
+
validate:
|
|
19
|
+
name: Validate TAGs - Node ${{ matrix.node-version }}
|
|
20
|
+
runs-on: ubuntu-latest
|
|
21
|
+
|
|
22
|
+
strategy:
|
|
23
|
+
matrix:
|
|
24
|
+
node-version: ['20', '22']
|
|
25
|
+
fail-fast: false
|
|
26
|
+
|
|
27
|
+
steps:
|
|
28
|
+
- name: Checkout repository
|
|
29
|
+
uses: actions/checkout@v4
|
|
30
|
+
with:
|
|
31
|
+
fetch-depth: 0
|
|
32
|
+
|
|
33
|
+
- name: Set up Node.js ${{ matrix.node-version }}
|
|
34
|
+
uses: actions/setup-node@v6
|
|
35
|
+
with:
|
|
36
|
+
node-version: ${{ matrix.node-version }}
|
|
37
|
+
|
|
38
|
+
- name: Detect package manager
|
|
39
|
+
id: detect-pm
|
|
40
|
+
run: |
|
|
41
|
+
if [ -f "bun.lockb" ]; then
|
|
42
|
+
echo "manager=bun" >> $GITHUB_OUTPUT
|
|
43
|
+
echo "lockfile=bun.lockb" >> $GITHUB_OUTPUT
|
|
44
|
+
elif [ -f "pnpm-lock.yaml" ]; then
|
|
45
|
+
echo "manager=pnpm" >> $GITHUB_OUTPUT
|
|
46
|
+
echo "lockfile=pnpm-lock.yaml" >> $GITHUB_OUTPUT
|
|
47
|
+
elif [ -f "yarn.lock" ]; then
|
|
48
|
+
echo "manager=yarn" >> $GITHUB_OUTPUT
|
|
49
|
+
echo "lockfile=yarn.lock" >> $GITHUB_OUTPUT
|
|
50
|
+
else
|
|
51
|
+
echo "manager=npm" >> $GITHUB_OUTPUT
|
|
52
|
+
echo "lockfile=package-lock.json" >> $GITHUB_OUTPUT
|
|
53
|
+
fi
|
|
54
|
+
|
|
55
|
+
- name: Setup package manager cache
|
|
56
|
+
uses: actions/setup-node@v6
|
|
57
|
+
with:
|
|
58
|
+
node-version: ${{ matrix.node-version }}
|
|
59
|
+
cache: ${{ steps.detect-pm.outputs.manager }}
|
|
60
|
+
|
|
61
|
+
- name: Install pnpm (if needed)
|
|
62
|
+
if: steps.detect-pm.outputs.manager == 'pnpm'
|
|
63
|
+
run: npm install -g pnpm
|
|
64
|
+
|
|
65
|
+
- name: Install Bun (if needed)
|
|
66
|
+
if: steps.detect-pm.outputs.manager == 'bun'
|
|
67
|
+
uses: oven-sh/setup-bun@v2
|
|
68
|
+
|
|
69
|
+
- name: Install dependencies
|
|
70
|
+
run: |
|
|
71
|
+
case "${{ steps.detect-pm.outputs.manager }}" in
|
|
72
|
+
npm)
|
|
73
|
+
npm ci
|
|
74
|
+
;;
|
|
75
|
+
yarn)
|
|
76
|
+
yarn install --frozen-lockfile
|
|
77
|
+
;;
|
|
78
|
+
pnpm)
|
|
79
|
+
pnpm install --frozen-lockfile
|
|
80
|
+
;;
|
|
81
|
+
bun)
|
|
82
|
+
bun install --frozen-lockfile
|
|
83
|
+
;;
|
|
84
|
+
esac
|
|
85
|
+
|
|
86
|
+
- name: Run type checking
|
|
87
|
+
run: |
|
|
88
|
+
if [ -f "tsconfig.json" ]; then
|
|
89
|
+
npx tsc --noEmit
|
|
90
|
+
else
|
|
91
|
+
npm run type-check || npx tsc --noEmit
|
|
92
|
+
fi
|
|
93
|
+
continue-on-error: false
|
|
94
|
+
|
|
95
|
+
- name: Run linting
|
|
96
|
+
run: |
|
|
97
|
+
if [ -f "biome.json" ]; then
|
|
98
|
+
npx @biomejs/biome check src/
|
|
99
|
+
elif command -v eslint &> /dev/null; then
|
|
100
|
+
npm run lint || npx eslint src/
|
|
101
|
+
fi
|
|
102
|
+
continue-on-error: false
|
|
103
|
+
|
|
104
|
+
- name: Run tests with coverage
|
|
105
|
+
run: npm test -- --coverage --coverage-threshold=85
|
|
106
|
+
continue-on-error: false
|
|
107
|
+
|
|
108
|
+
- name: Upload coverage reports
|
|
109
|
+
if: matrix.node-version == '22'
|
|
110
|
+
uses: actions/upload-artifact@v4
|
|
111
|
+
with:
|
|
112
|
+
name: coverage-report-typescript
|
|
113
|
+
path: coverage/
|
|
114
|
+
|
|
115
|
+
- name: Comment PR with coverage
|
|
116
|
+
if: github.event_name == 'pull_request' && matrix.node-version == '22'
|
|
117
|
+
uses: ArtiomTr/jest-coverage-report-action@v2
|
|
118
|
+
with:
|
|
119
|
+
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
120
|
+
threshold: 85
|
|
121
|
+
|
|
122
|
+
- name: Build project
|
|
123
|
+
run: |
|
|
124
|
+
if grep -q '"build"' package.json; then
|
|
125
|
+
npm run build
|
|
126
|
+
else
|
|
127
|
+
npx tsc
|
|
128
|
+
fi
|
|
129
|
+
continue-on-error: true
|
|
130
|
+
|
|
131
|
+
quality-gate:
|
|
132
|
+
name: Quality Gate Summary
|
|
133
|
+
needs: validate
|
|
134
|
+
runs-on: ubuntu-latest
|
|
135
|
+
if: always()
|
|
136
|
+
|
|
137
|
+
steps:
|
|
138
|
+
- name: Check validation results
|
|
139
|
+
run: |
|
|
140
|
+
if [ "${{ needs.validate.result }}" != "success" ]; then
|
|
141
|
+
echo "❌ TAG validation failed"
|
|
142
|
+
exit 1
|
|
143
|
+
fi
|
|
144
|
+
echo "✅ TAG validation passed"
|
|
145
|
+
|
|
146
|
+
- name: Quality metrics summary
|
|
147
|
+
run: |
|
|
148
|
+
echo "## Quality Metrics Summary" >> $GITHUB_STEP_SUMMARY
|
|
149
|
+
echo "" >> $GITHUB_STEP_SUMMARY
|
|
150
|
+
echo "- ✅ TypeScript tests passed" >> $GITHUB_STEP_SUMMARY
|
|
151
|
+
echo "- ✅ Type checking passed (tsc)" >> $GITHUB_STEP_SUMMARY
|
|
152
|
+
echo "- ✅ Code coverage ≥ 85%" >> $GITHUB_STEP_SUMMARY
|
|
153
|
+
echo "- ✅ Linting passed" >> $GITHUB_STEP_SUMMARY
|
|
154
|
+
echo "- ✅ TAG chain validated" >> $GITHUB_STEP_SUMMARY
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: moai-adk
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.11.1
|
|
4
4
|
Summary: MoAI Agentic Development Kit - SPEC-First TDD with Alfred SuperAgent & Complete Skills v2.0
|
|
5
5
|
Project-URL: Homepage, https://github.com/modu-ai/moai-adk
|
|
6
6
|
Project-URL: Repository, https://github.com/modu-ai/moai-adk
|
|
@@ -14,17 +14,21 @@ Classifier: Development Status :: 4 - Beta
|
|
|
14
14
|
Classifier: Intended Audience :: Developers
|
|
15
15
|
Classifier: License :: OSI Approved :: MIT License
|
|
16
16
|
Classifier: Programming Language :: Python :: 3
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
18
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
19
|
Classifier: Programming Language :: Python :: 3.13
|
|
18
20
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
19
21
|
Classifier: Topic :: Software Development :: Quality Assurance
|
|
20
22
|
Classifier: Topic :: Software Development :: Testing
|
|
21
|
-
Requires-Python: >=3.
|
|
23
|
+
Requires-Python: >=3.11
|
|
22
24
|
Requires-Dist: click>=8.1.0
|
|
23
25
|
Requires-Dist: gitpython>=3.1.45
|
|
26
|
+
Requires-Dist: jinja2>=3.0.0
|
|
24
27
|
Requires-Dist: packaging>=21.0
|
|
25
28
|
Requires-Dist: pyfiglet>=1.0.2
|
|
26
29
|
Requires-Dist: pyyaml>=6.0
|
|
27
30
|
Requires-Dist: questionary>=2.0.0
|
|
31
|
+
Requires-Dist: requests>=2.28.0
|
|
28
32
|
Requires-Dist: rich>=13.0.0
|
|
29
33
|
Provides-Extra: dev
|
|
30
34
|
Requires-Dist: mypy>=1.7.0; extra == 'dev'
|
|
@@ -158,6 +162,22 @@ From the moment you adopt MoAI-ADK, you'll feel:
|
|
|
158
162
|
|
|
159
163
|
---
|
|
160
164
|
|
|
165
|
+
## 🖥️ Platform Support
|
|
166
|
+
|
|
167
|
+
### Supported Platforms
|
|
168
|
+
- ✅ **macOS** (11.0+)
|
|
169
|
+
- ✅ **Linux** (Ubuntu 20.04+, Debian 11+, etc.)
|
|
170
|
+
- ✅ **Windows** (10/11) - Full support as of v0.11.0
|
|
171
|
+
- Note: Hooks system requires Python 3.11+
|
|
172
|
+
- All hook features work seamlessly on Windows with cross-platform timeout handling
|
|
173
|
+
|
|
174
|
+
### System Requirements
|
|
175
|
+
- **Python**: 3.11 or higher
|
|
176
|
+
- **Git**: 2.30+
|
|
177
|
+
- **GitHub CLI** (`gh`): Optional, required for PR automation in team mode
|
|
178
|
+
|
|
179
|
+
---
|
|
180
|
+
|
|
161
181
|
## ⚡ 3-Minute Lightning Start
|
|
162
182
|
|
|
163
183
|
Get your first MoAI-ADK project running in **3 simple steps**. Beginners can finish in under 5 minutes.
|
|
@@ -299,6 +319,48 @@ In this section you'll experience:
|
|
|
299
319
|
|
|
300
320
|
---
|
|
301
321
|
|
|
322
|
+
## Language Support
|
|
323
|
+
|
|
324
|
+
MoAI-ADK automatically detects and supports **15 programming languages** with dedicated CI/CD workflows:
|
|
325
|
+
|
|
326
|
+
### Core Languages (v0.11.0+)
|
|
327
|
+
- **Python** (pytest, mypy, ruff, 85% coverage target)
|
|
328
|
+
- **JavaScript** (npm/yarn/pnpm/bun auto-detect, 80% coverage target)
|
|
329
|
+
- **TypeScript** (tsc type checking, biome/eslint, 85% coverage target)
|
|
330
|
+
- **Go** (golangci-lint, gofmt, 75% coverage target)
|
|
331
|
+
|
|
332
|
+
### Extended Languages (v0.11.1+)
|
|
333
|
+
- **Ruby** (RSpec, Rubocop, bundle)
|
|
334
|
+
- **PHP** (PHPUnit, PHPCS, composer)
|
|
335
|
+
- **Java** (JUnit 5, Jacoco, Maven/Gradle auto-detection)
|
|
336
|
+
- **Rust** (cargo test, clippy, rustfmt)
|
|
337
|
+
- **Dart** (flutter test, dart analyze)
|
|
338
|
+
- **Swift** (XCTest, SwiftLint, SPM)
|
|
339
|
+
- **Kotlin** (JUnit 5, ktlint, Gradle)
|
|
340
|
+
- **C#** (xUnit, StyleCop, dotnet CLI)
|
|
341
|
+
- **C** (gcc/clang, cppcheck, CMake)
|
|
342
|
+
- **C++** (g++/clang++, Google Test, cpplint)
|
|
343
|
+
- **Shell** (shellcheck, bats-core)
|
|
344
|
+
|
|
345
|
+
### How Language Detection Works
|
|
346
|
+
|
|
347
|
+
When you run `/alfred:2-run SPEC-XXX`, MoAI-ADK automatically:
|
|
348
|
+
1. Scans your project for configuration files (package.json, pyproject.toml, go.mod, Cargo.toml, pom.xml, build.gradle, etc.)
|
|
349
|
+
2. Detects your project's primary language using priority-based detection (Rust → Dart → Swift → ... → Shell)
|
|
350
|
+
3. Auto-detects build tools (Maven/Gradle for Java, CMake for C/C++, SPM for Swift, etc.)
|
|
351
|
+
4. Selects the appropriate CI/CD workflow template
|
|
352
|
+
5. Generates language-specific testing and linting configuration
|
|
353
|
+
|
|
354
|
+
### Supported Languages
|
|
355
|
+
|
|
356
|
+
For detailed language detection priority and build tool detection, see [Language Detection Guide](.moai/docs/language-detection-guide.md)
|
|
357
|
+
|
|
358
|
+
### Customization
|
|
359
|
+
|
|
360
|
+
For advanced workflow customization, see [Workflow Templates Guide](.moai/docs/workflow-templates.md)
|
|
361
|
+
|
|
362
|
+
---
|
|
363
|
+
|
|
302
364
|
## Earlier Detailed Guide (Optional Reading)
|
|
303
365
|
|
|
304
366
|
Need more explanations? See detailed guides below.
|
|
@@ -390,11 +452,6 @@ my-project/
|
|
|
390
452
|
│ ├── hooks/ # Event-driven automation
|
|
391
453
|
│ │ └── alfred/
|
|
392
454
|
│ │ └── alfred_hooks.py # 5 hooks (Session, PreTool, etc.)
|
|
393
|
-
│ ├── output-styles/ # Response styles
|
|
394
|
-
│ │ └── alfred/
|
|
395
|
-
│ │ ├── agentic-coding.md # Professional development mode
|
|
396
|
-
│ │ ├── moai-adk-learning.md # Educational explanations mode
|
|
397
|
-
│ │ └── study-with-alfred.md # Interactive learning mode
|
|
398
455
|
│ └── settings.json # Claude Code settings
|
|
399
456
|
├── src/ # Implementation code
|
|
400
457
|
├── tests/ # Test code
|
|
@@ -1770,7 +1827,7 @@ The **implementation-planner** Sub-agent decides:
|
|
|
1770
1827
|
|
|
1771
1828
|
```python
|
|
1772
1829
|
# tests/test_todo_api.py
|
|
1773
|
-
# @TEST:TODO
|
|
1830
|
+
# @TEST:README-EXAMPLE-TODO | SPEC: SPEC-TODO-001.md
|
|
1774
1831
|
|
|
1775
1832
|
import pytest
|
|
1776
1833
|
from src.todo.api import create_todo, get_todos
|
|
@@ -1911,7 +1968,7 @@ git commit -m "♻️ refactor(TODO-001): add database models and validation"
|
|
|
1911
1968
|
|
|
1912
1969
|
```bash
|
|
1913
1970
|
✅ @SPEC:TODO-001 → .moai/specs/SPEC-TODO-001/spec.md
|
|
1914
|
-
✅ @TEST:TODO
|
|
1971
|
+
✅ @TEST:README-EXAMPLE-TODO → tests/test_todo_api.py
|
|
1915
1972
|
✅ @CODE:TODO-001 → src/todo/ (3 files)
|
|
1916
1973
|
✅ @DOC:TODO-001 → docs/api/todo.md (auto-generated)
|
|
1917
1974
|
|
|
@@ -1937,7 +1994,7 @@ git commit -m "♻️ refactor(TODO-001): add database models and validation"
|
|
|
1937
1994
|
- Request: {"title": "string (1-200 chars)"}
|
|
1938
1995
|
- Response: 201 Created with todo object
|
|
1939
1996
|
- Implemented in: @CODE:TODO-001:API
|
|
1940
|
-
- Tested in: @TEST:TODO
|
|
1997
|
+
- Tested in: @TEST:README-EXAMPLE-TODO
|
|
1941
1998
|
|
|
1942
1999
|
### Get All Todos
|
|
1943
2000
|
|
|
@@ -1988,7 +2045,7 @@ rg '@(SPEC|TEST|CODE|DOC):TODO-001' -n
|
|
|
1988
2045
|
|
|
1989
2046
|
# Output:
|
|
1990
2047
|
# .moai/specs/SPEC-TODO-001/spec.md:1: # @SPEC:TODO-001: Todo Management API
|
|
1991
|
-
# tests/test_todo_api.py:2: # @TEST:TODO
|
|
2048
|
+
# tests/test_todo_api.py:2: # @TEST:README-EXAMPLE-TODO | SPEC: SPEC-TODO-001.md
|
|
1992
2049
|
# src/todo/api.py:5: # @CODE:TODO-001:API | SPEC: SPEC-TODO-001.md
|
|
1993
2050
|
# src/todo/models.py:5: # @CODE:TODO-001:MODEL | SPEC: SPEC-TODO-001.md
|
|
1994
2051
|
# docs/api/todo.md:1: # @DOC:TODO-001: Todo Management API
|
|
@@ -2028,7 +2085,7 @@ git log --oneline | head -5
|
|
|
2028
2085
|
└─ 🔴 RED: Tests written first
|
|
2029
2086
|
└─ 🟢 GREEN: Minimal implementation
|
|
2030
2087
|
└─ ♻️ REFACTOR: Quality improvement
|
|
2031
|
-
└─ @TEST:TODO
|
|
2088
|
+
└─ @TEST:README-EXAMPLE-TODO, @CODE:TODO-001 TAGs assigned
|
|
2032
2089
|
└─ 87% coverage, TRUST 5 principles verified
|
|
2033
2090
|
|
|
2034
2091
|
✅ Documentation sync (1 minute)
|
|
@@ -2599,7 +2656,7 @@ rg '@SPEC:HELLO-001' -n .moai/specs/
|
|
|
2599
2656
|
/alfred:1-plan "feature description"
|
|
2600
2657
|
|
|
2601
2658
|
# Or fix TAG in test file
|
|
2602
|
-
# Edit tests/test_hello.py: @TEST:HELLO-001 → @TEST:HELLO
|
|
2659
|
+
# Edit tests/test_hello.py: @TEST:HELLO-001 → @TEST:README-EXAMPLE-HELLO
|
|
2603
2660
|
|
|
2604
2661
|
# 4. Sync
|
|
2605
2662
|
/alfred:3-sync
|