spec-runner 1.0.0-alpha.1
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.
- package/LICENSE +34 -0
- package/README.md +193 -0
- package/bin/spec-runner.js +715 -0
- package/install.sh +80 -0
- package/package.json +45 -0
- package/templates/base/.github/PULL_REQUEST_TEMPLATE.md +43 -0
- package/templates/base/.github/workflows/phase-gate-check.yml +216 -0
- package/templates/base/docs/adr/TEMPLATE.md +46 -0
- package/templates/base/docs/glossary.md +51 -0
- package/templates/base/docs/review/debt.md +8 -0
- package/templates/base/scripts/spec-runner.sh +1079 -0
- package/templates/base/templates/requirement/template.md +40 -0
- package/templates/claude/.claude/commands/sr-complete.md +9 -0
- package/templates/claude/.claude/commands/sr-configure.md +11 -0
- package/templates/claude/.claude/commands/sr-design-detail.md +9 -0
- package/templates/claude/.claude/commands/sr-design-high.md +9 -0
- package/templates/claude/.claude/commands/sr-fix.md +9 -0
- package/templates/claude/.claude/commands/sr-hotfix.md +9 -0
- package/templates/claude/.claude/commands/sr-implement.md +9 -0
- package/templates/claude/.claude/commands/sr-init.md +10 -0
- package/templates/claude/.claude/commands/sr-review.md +9 -0
- package/templates/claude/.claude/commands/sr-set-gate.md +9 -0
- package/templates/claude/.claude/commands/sr-status.md +9 -0
- package/templates/claude/.claude/commands/sr-test-design.md +9 -0
- package/templates/claude/.claude/hooks/pre-tool-use.sh +79 -0
- package/templates/claude/.claude/settings.json +29 -0
- package/templates/claude/CLAUDE.md +141 -0
- package/templates/copilot/.github/copilot-instructions.md +25 -0
- package/templates/copilot/.github/prompts/sr-complete.prompt.md +13 -0
- package/templates/copilot/.github/prompts/sr-configure.prompt.md +13 -0
- package/templates/copilot/.github/prompts/sr-design-detail.prompt.md +14 -0
- package/templates/copilot/.github/prompts/sr-design-high.prompt.md +13 -0
- package/templates/copilot/.github/prompts/sr-fix.prompt.md +14 -0
- package/templates/copilot/.github/prompts/sr-hotfix.prompt.md +14 -0
- package/templates/copilot/.github/prompts/sr-implement.prompt.md +13 -0
- package/templates/copilot/.github/prompts/sr-init.prompt.md +15 -0
- package/templates/copilot/.github/prompts/sr-review.prompt.md +14 -0
- package/templates/copilot/.github/prompts/sr-set-gate.prompt.md +14 -0
- package/templates/copilot/.github/prompts/sr-status.prompt.md +13 -0
- package/templates/copilot/.github/prompts/sr-test-design.prompt.md +13 -0
- package/templates/cursor/.cursor/commands/sr-complete.md +9 -0
- package/templates/cursor/.cursor/commands/sr-configure.md +11 -0
- package/templates/cursor/.cursor/commands/sr-design-detail.md +9 -0
- package/templates/cursor/.cursor/commands/sr-design-high.md +9 -0
- package/templates/cursor/.cursor/commands/sr-fix.md +9 -0
- package/templates/cursor/.cursor/commands/sr-hotfix.md +9 -0
- package/templates/cursor/.cursor/commands/sr-implement.md +9 -0
- package/templates/cursor/.cursor/commands/sr-init.md +10 -0
- package/templates/cursor/.cursor/commands/sr-review.md +9 -0
- package/templates/cursor/.cursor/commands/sr-set-gate.md +9 -0
- package/templates/cursor/.cursor/commands/sr-status.md +9 -0
- package/templates/cursor/.cursor/commands/sr-test-design.md +9 -0
- package/templates/cursor/.cursorrules +25 -0
package/install.sh
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# =============================================================================
|
|
3
|
+
# spec-runner インストーラー (curl 方式)
|
|
4
|
+
#
|
|
5
|
+
# 使い方:
|
|
6
|
+
# curl -sSL https://raw.githubusercontent.com/spec-runner/spec-runner/main/install.sh | bash
|
|
7
|
+
#
|
|
8
|
+
# または wget:
|
|
9
|
+
# wget -qO- https://raw.githubusercontent.com/spec-runner/spec-runner/main/install.sh | bash
|
|
10
|
+
# =============================================================================
|
|
11
|
+
|
|
12
|
+
set -e
|
|
13
|
+
|
|
14
|
+
BOLD='\033[1m'
|
|
15
|
+
GREEN='\033[0;32m'
|
|
16
|
+
YELLOW='\033[1;33m'
|
|
17
|
+
RED='\033[0;31m'
|
|
18
|
+
CYAN='\033[0;36m'
|
|
19
|
+
NC='\033[0m'
|
|
20
|
+
|
|
21
|
+
ok() { echo -e "${GREEN}✓${NC} $*"; }
|
|
22
|
+
warn() { echo -e "${YELLOW}⚠${NC} $*"; }
|
|
23
|
+
info() { echo -e "${CYAN}ℹ${NC} $*"; }
|
|
24
|
+
die() { echo -e "${RED}ERROR:${NC} $*" >&2; exit 1; }
|
|
25
|
+
|
|
26
|
+
echo ""
|
|
27
|
+
echo -e "${BOLD}╔════════════════════════════════════════╗${NC}"
|
|
28
|
+
echo -e "${BOLD}║ spec-runner インストーラー ║${NC}"
|
|
29
|
+
echo -e "${BOLD}║ AI-driven DDD Phase Gate System ║${NC}"
|
|
30
|
+
echo -e "${BOLD}╚════════════════════════════════════════╝${NC}"
|
|
31
|
+
echo ""
|
|
32
|
+
|
|
33
|
+
# ── Node.js チェック ──────────────────────────────────────────────────────────
|
|
34
|
+
if command -v node &>/dev/null; then
|
|
35
|
+
NODE_VERSION=$(node --version | sed 's/v//')
|
|
36
|
+
NODE_MAJOR=$(echo "$NODE_VERSION" | cut -d. -f1)
|
|
37
|
+
if [[ "$NODE_MAJOR" -lt 16 ]]; then
|
|
38
|
+
die "Node.js 16以上が必要です(現在: v${NODE_VERSION})\n https://nodejs.org からインストールしてください"
|
|
39
|
+
fi
|
|
40
|
+
ok "Node.js v${NODE_VERSION}"
|
|
41
|
+
else
|
|
42
|
+
die "Node.js がインストールされていません。\n https://nodejs.org からインストールしてください"
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# ── jq チェック ───────────────────────────────────────────────────────────────
|
|
46
|
+
if command -v jq &>/dev/null; then
|
|
47
|
+
ok "jq $(jq --version)"
|
|
48
|
+
else
|
|
49
|
+
warn "jq が見つかりません。インストールします..."
|
|
50
|
+
if command -v brew &>/dev/null; then
|
|
51
|
+
brew install jq
|
|
52
|
+
elif command -v apt-get &>/dev/null; then
|
|
53
|
+
sudo apt-get install -y jq
|
|
54
|
+
elif command -v yum &>/dev/null; then
|
|
55
|
+
sudo yum install -y jq
|
|
56
|
+
else
|
|
57
|
+
die "jq を手動でインストールしてください: https://stedolan.github.io/jq/download/"
|
|
58
|
+
fi
|
|
59
|
+
ok "jq インストール完了"
|
|
60
|
+
fi
|
|
61
|
+
|
|
62
|
+
# ── git チェック ──────────────────────────────────────────────────────────────
|
|
63
|
+
if command -v git &>/dev/null; then
|
|
64
|
+
ok "git $(git --version | awk '{print $3}')"
|
|
65
|
+
else
|
|
66
|
+
die "git がインストールされていません"
|
|
67
|
+
fi
|
|
68
|
+
|
|
69
|
+
echo ""
|
|
70
|
+
info "npx spec-runner を実行します..."
|
|
71
|
+
echo ""
|
|
72
|
+
|
|
73
|
+
# ── npm/npx で実行 ────────────────────────────────────────────────────────────
|
|
74
|
+
if command -v npx &>/dev/null; then
|
|
75
|
+
npx spec-runner@latest
|
|
76
|
+
elif command -v npm &>/dev/null; then
|
|
77
|
+
npm exec spec-runner@latest
|
|
78
|
+
else
|
|
79
|
+
die "npm/npx が見つかりません。Node.js を再インストールしてください"
|
|
80
|
+
fi
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "spec-runner",
|
|
3
|
+
"version": "1.0.0-alpha.1",
|
|
4
|
+
"description": "AI-driven DDD phase gate system — design-first enforcement for Claude Code, Cursor, and Copilot",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"bin": {
|
|
7
|
+
"spec-runner": "bin/spec-runner.js"
|
|
8
|
+
},
|
|
9
|
+
"engines": {
|
|
10
|
+
"node": ">=16.0.0"
|
|
11
|
+
},
|
|
12
|
+
"keywords": [
|
|
13
|
+
"ddd",
|
|
14
|
+
"phase-gate",
|
|
15
|
+
"ai-development",
|
|
16
|
+
"design-first",
|
|
17
|
+
"claude-code",
|
|
18
|
+
"spec-runner",
|
|
19
|
+
"laravel",
|
|
20
|
+
"rails",
|
|
21
|
+
"django",
|
|
22
|
+
"nextjs",
|
|
23
|
+
"spec-kit"
|
|
24
|
+
],
|
|
25
|
+
"files": [
|
|
26
|
+
"bin/",
|
|
27
|
+
"templates/",
|
|
28
|
+
"install.sh",
|
|
29
|
+
"README.md",
|
|
30
|
+
"LICENSE"
|
|
31
|
+
],
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"chalk": "^4.1.2",
|
|
34
|
+
"enquirer": "^2.3.6",
|
|
35
|
+
"ora": "^5.4.1"
|
|
36
|
+
},
|
|
37
|
+
"repository": {
|
|
38
|
+
"type": "git",
|
|
39
|
+
"url": "git+https://github.com/TEEE88/spec-runner.git"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://github.com/TEEE88/spec-runner",
|
|
42
|
+
"bugs": {
|
|
43
|
+
"url": "https://github.com/TEEE88/spec-runner/issues"
|
|
44
|
+
}
|
|
45
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
## 対象ユースケース
|
|
2
|
+
|
|
3
|
+
<!-- ./scripts/spec-runner.sh status の出力を貼り付ける -->
|
|
4
|
+
|
|
5
|
+
## 変更の種別
|
|
6
|
+
|
|
7
|
+
- [ ] 新規機能(feature/uc-)
|
|
8
|
+
- [ ] 通常修正(fix/)
|
|
9
|
+
- [ ] 緊急修正(hotfix/)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## ドキュメント更新チェック
|
|
14
|
+
|
|
15
|
+
<!-- 変更内容に応じてチェックしてください。不要な項目は N/A と書く -->
|
|
16
|
+
|
|
17
|
+
| ドキュメント | 更新済み | パス |
|
|
18
|
+
|------------|---------|------|
|
|
19
|
+
| ドメインモデル設計 | [ ] | docs/detailed/*/domain.md |
|
|
20
|
+
| ユースケース設計 | [ ] | docs/detailed/*/usecase.md |
|
|
21
|
+
| テーブル設計 | [ ] | docs/detailed/*/table.md |
|
|
22
|
+
| インフラ設計 | [ ] | docs/detailed/*/infra.md |
|
|
23
|
+
| テスト設計 | [ ] | docs/test-design/*.md |
|
|
24
|
+
| glossary.md | [ ] | docs/glossary.md |
|
|
25
|
+
| ADR | [ ] / N/A | docs/adr/XXX-*.md |
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## レビュアー向け読み順
|
|
30
|
+
|
|
31
|
+
1. **設計ドキュメント** `docs/detailed/<UC名>/` — 何を作るか
|
|
32
|
+
2. **ADR** `docs/adr/` — なぜその設計か(該当する場合)
|
|
33
|
+
3. **テスト設計** `docs/test-design/<UC名>.md` — 何を検証するか
|
|
34
|
+
4. **テストコード** — 振る舞いの確認
|
|
35
|
+
5. **実装コード** — 設計との整合性確認
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## hotfix の場合(追加記入)
|
|
40
|
+
|
|
41
|
+
- 影響ユースケース:
|
|
42
|
+
- 修正内容の要約:
|
|
43
|
+
- debt.md への記録: [ ] 完了
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
name: フェーズゲートチェック
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
pull_request:
|
|
5
|
+
branches: [main, 'aggregate/**']
|
|
6
|
+
|
|
7
|
+
jobs:
|
|
8
|
+
gate-check:
|
|
9
|
+
runs-on: ubuntu-latest
|
|
10
|
+
steps:
|
|
11
|
+
- uses: actions/checkout@v4
|
|
12
|
+
with:
|
|
13
|
+
fetch-depth: 0
|
|
14
|
+
|
|
15
|
+
- name: jq インストール確認
|
|
16
|
+
run: jq --version
|
|
17
|
+
|
|
18
|
+
# ─── spec-runner 設定の読み込み(.spec-runner/config.sh)────────────────
|
|
19
|
+
- name: spec-runner 設定の読み込み
|
|
20
|
+
run: |
|
|
21
|
+
if [[ -f .spec-runner/config.sh ]]; then
|
|
22
|
+
set -a
|
|
23
|
+
# shellcheck source=.spec-runner/config.sh
|
|
24
|
+
source .spec-runner/config.sh
|
|
25
|
+
set +a
|
|
26
|
+
echo "DOMAIN_PATH=$DOMAIN_PATH" >> $GITHUB_ENV
|
|
27
|
+
echo "USECASE_PATH=$USECASE_PATH" >> $GITHUB_ENV
|
|
28
|
+
echo "INFRA_PATH=$INFRA_PATH" >> $GITHUB_ENV
|
|
29
|
+
echo "MIGRATION_DIR=$MIGRATION_DIR" >> $GITHUB_ENV
|
|
30
|
+
echo "SOURCE_EXTENSIONS=$SOURCE_EXTENSIONS" >> $GITHUB_ENV
|
|
31
|
+
echo "DOMAIN_FORBIDDEN_GREP_PATTERN=$DOMAIN_FORBIDDEN_GREP_PATTERN" >> $GITHUB_ENV
|
|
32
|
+
else
|
|
33
|
+
echo "DOMAIN_PATH=src/domain" >> $GITHUB_ENV
|
|
34
|
+
echo "USECASE_PATH=src/useCase" >> $GITHUB_ENV
|
|
35
|
+
echo "INFRA_PATH=src/infrastructure" >> $GITHUB_ENV
|
|
36
|
+
echo "MIGRATION_DIR=" >> $GITHUB_ENV
|
|
37
|
+
echo "SOURCE_EXTENSIONS=ts tsx js jsx" >> $GITHUB_ENV
|
|
38
|
+
echo "DOMAIN_FORBIDDEN_GREP_PATTERN=" >> $GITHUB_ENV
|
|
39
|
+
fi
|
|
40
|
+
|
|
41
|
+
# ─── 1. ブランチ命名規則チェック ───────────────────────────────────
|
|
42
|
+
- name: ブランチ命名規則チェック
|
|
43
|
+
run: |
|
|
44
|
+
BRANCH="${{ github.head_ref }}"
|
|
45
|
+
echo "対象ブランチ: $BRANCH"
|
|
46
|
+
|
|
47
|
+
# 許可されるブランチパターン
|
|
48
|
+
if [[ "$BRANCH" =~ ^(feature/uc-|fix/|hotfix/|aggregate/) ]]; then
|
|
49
|
+
echo "✓ ブランチ命名: OK ($BRANCH)"
|
|
50
|
+
else
|
|
51
|
+
echo "✗ ブランチ命名が規約に違反しています: $BRANCH"
|
|
52
|
+
echo ""
|
|
53
|
+
echo "許可されるパターン:"
|
|
54
|
+
echo " feature/uc-<ユースケース名> ← 新機能"
|
|
55
|
+
echo " fix/<ユースケース名>-<内容> ← 通常修正"
|
|
56
|
+
echo " hotfix/<内容> ← 緊急修正"
|
|
57
|
+
echo " aggregate/<集約名> ← 集約ブランチ"
|
|
58
|
+
exit 1
|
|
59
|
+
fi
|
|
60
|
+
|
|
61
|
+
# ─── 2. ドメイン変更 → 設計ドキュメント更新チェック(config.sh のパスを使用)──
|
|
62
|
+
- name: ドメインモデル変更時の設計ドキュメント更新チェック
|
|
63
|
+
env:
|
|
64
|
+
DOMAIN_PATH: ${{ env.DOMAIN_PATH }}
|
|
65
|
+
USECASE_PATH: ${{ env.USECASE_PATH }}
|
|
66
|
+
MIGRATION_DIR: ${{ env.MIGRATION_DIR }}
|
|
67
|
+
run: |
|
|
68
|
+
ERRORS=0
|
|
69
|
+
|
|
70
|
+
CHANGED=$(git diff --name-only origin/${{ github.base_ref }}...HEAD)
|
|
71
|
+
echo "変更ファイル:"
|
|
72
|
+
echo "$CHANGED"
|
|
73
|
+
echo ""
|
|
74
|
+
|
|
75
|
+
# DOMAIN_PATH が変更されたら docs/detailed/*/domain.md も更新が必要
|
|
76
|
+
if [[ -n "$DOMAIN_PATH" ]]; then
|
|
77
|
+
DOMAIN_CHANGED=$(echo "$CHANGED" | grep -E "^${DOMAIN_PATH}/" || true)
|
|
78
|
+
if [[ -n "$DOMAIN_CHANGED" ]]; then
|
|
79
|
+
DETAIL_DOC_CHANGED=$(echo "$CHANGED" | grep -E 'docs/detailed/.*/domain\.md' || true)
|
|
80
|
+
if [[ -z "$DETAIL_DOC_CHANGED" ]]; then
|
|
81
|
+
echo "✗ $DOMAIN_PATH/ が変更されましたが docs/detailed/*/domain.md が更新されていません"
|
|
82
|
+
echo "$DOMAIN_CHANGED" | sed 's/^/ /'
|
|
83
|
+
ERRORS=$((ERRORS + 1))
|
|
84
|
+
else
|
|
85
|
+
echo "✓ $DOMAIN_PATH/ 変更 → domain.md 更新確認"
|
|
86
|
+
fi
|
|
87
|
+
fi
|
|
88
|
+
fi
|
|
89
|
+
|
|
90
|
+
# USECASE_PATH が変更されたら docs/detailed/*/usecase.md も更新が必要
|
|
91
|
+
if [[ -n "$USECASE_PATH" ]]; then
|
|
92
|
+
USECASE_CHANGED=$(echo "$CHANGED" | grep -E "^${USECASE_PATH}/" || true)
|
|
93
|
+
if [[ -n "$USECASE_CHANGED" ]]; then
|
|
94
|
+
USECASE_DOC_CHANGED=$(echo "$CHANGED" | grep -E 'docs/detailed/.*/usecase\.md' || true)
|
|
95
|
+
if [[ -z "$USECASE_DOC_CHANGED" ]]; then
|
|
96
|
+
echo "✗ $USECASE_PATH/ が変更されましたが docs/detailed/*/usecase.md が更新されていません"
|
|
97
|
+
ERRORS=$((ERRORS + 1))
|
|
98
|
+
else
|
|
99
|
+
echo "✓ $USECASE_PATH/ 変更 → usecase.md 更新確認"
|
|
100
|
+
fi
|
|
101
|
+
fi
|
|
102
|
+
fi
|
|
103
|
+
|
|
104
|
+
# MIGRATION_DIR が変更されたら docs/detailed/*/table.md も更新が必要
|
|
105
|
+
if [[ -n "$MIGRATION_DIR" ]]; then
|
|
106
|
+
MIGRATION_CHANGED=$(echo "$CHANGED" | grep -E "^${MIGRATION_DIR}/" || true)
|
|
107
|
+
if [[ -n "$MIGRATION_CHANGED" ]]; then
|
|
108
|
+
TABLE_DOC_CHANGED=$(echo "$CHANGED" | grep -E 'docs/detailed/.*/table\.md' || true)
|
|
109
|
+
if [[ -z "$TABLE_DOC_CHANGED" ]]; then
|
|
110
|
+
echo "✗ $MIGRATION_DIR/ が変更されましたが docs/detailed/*/table.md が更新されていません"
|
|
111
|
+
ERRORS=$((ERRORS + 1))
|
|
112
|
+
else
|
|
113
|
+
echo "✓ $MIGRATION_DIR/ 変更 → table.md 更新確認"
|
|
114
|
+
fi
|
|
115
|
+
fi
|
|
116
|
+
fi
|
|
117
|
+
|
|
118
|
+
if [[ $ERRORS -gt 0 ]]; then
|
|
119
|
+
echo ""
|
|
120
|
+
echo "ドキュメントの更新が必要です。コードと設計ドキュメントを同一PRに含めてください。"
|
|
121
|
+
exit 1
|
|
122
|
+
fi
|
|
123
|
+
|
|
124
|
+
echo ""
|
|
125
|
+
echo "✓ ドキュメント鮮度チェック: OK"
|
|
126
|
+
|
|
127
|
+
# ─── 3. hotfix の負債チェック ──────────────────────────────────────
|
|
128
|
+
- name: hotfix PRの負債記録チェック
|
|
129
|
+
run: |
|
|
130
|
+
BRANCH="${{ github.head_ref }}"
|
|
131
|
+
if [[ "$BRANCH" =~ ^hotfix/ ]]; then
|
|
132
|
+
if git diff --name-only origin/${{ github.base_ref }}...HEAD | grep -q 'docs/review/debt.md'; then
|
|
133
|
+
echo "✓ hotfix: debt.md への記録確認"
|
|
134
|
+
else
|
|
135
|
+
echo "✗ hotfix PR では docs/review/debt.md への負債記録が必要です"
|
|
136
|
+
echo " ./scripts/spec-runner.sh hotfix を使用してください"
|
|
137
|
+
exit 1
|
|
138
|
+
fi
|
|
139
|
+
fi
|
|
140
|
+
|
|
141
|
+
# ─── 4. DDD 依存方向チェック(config.sh の DOMAIN_PATH / DOMAIN_FORBIDDEN_GREP_PATTERN)──
|
|
142
|
+
- name: DDD レイヤー依存方向チェック
|
|
143
|
+
env:
|
|
144
|
+
DOMAIN_PATH: ${{ env.DOMAIN_PATH }}
|
|
145
|
+
SOURCE_EXTENSIONS: ${{ env.SOURCE_EXTENSIONS }}
|
|
146
|
+
DOMAIN_FORBIDDEN_GREP_PATTERN: ${{ env.DOMAIN_FORBIDDEN_GREP_PATTERN }}
|
|
147
|
+
run: |
|
|
148
|
+
ERRORS=0
|
|
149
|
+
|
|
150
|
+
if [[ -z "$DOMAIN_PATH" || ! -d "$DOMAIN_PATH" ]]; then
|
|
151
|
+
echo "✓ DDD依存方向: スキップ(DOMAIN_PATH 未設定またはディレクトリなし)"
|
|
152
|
+
exit 0
|
|
153
|
+
fi
|
|
154
|
+
|
|
155
|
+
if [[ -z "$DOMAIN_FORBIDDEN_GREP_PATTERN" ]]; then
|
|
156
|
+
echo "✓ DDD依存方向: スキップ(DOMAIN_FORBIDDEN_GREP_PATTERN 未設定。.spec-runner/config.sh で設定可能)"
|
|
157
|
+
exit 0
|
|
158
|
+
fi
|
|
159
|
+
|
|
160
|
+
# ソース拡張子で find して、禁止パターンに一致するファイルを検出
|
|
161
|
+
EXT_REGEX=".*\\.($(echo "$SOURCE_EXTENSIONS" | tr ' ' '|'))$"
|
|
162
|
+
VIOLATIONS=$(find "$DOMAIN_PATH" -type f -regextype posix-extended -regex "$EXT_REGEX" 2>/dev/null | xargs grep -l "$DOMAIN_FORBIDDEN_GREP_PATTERN" 2>/dev/null || true)
|
|
163
|
+
if [[ -n "$VIOLATIONS" ]]; then
|
|
164
|
+
echo "✗ Domain層が上位層に依存しています(DDD違反)"
|
|
165
|
+
echo "$VIOLATIONS" | sed 's/^/ /'
|
|
166
|
+
ERRORS=$((ERRORS + 1))
|
|
167
|
+
else
|
|
168
|
+
echo "✓ DDD依存方向: OK"
|
|
169
|
+
fi
|
|
170
|
+
|
|
171
|
+
[[ $ERRORS -eq 0 ]] || exit 1
|
|
172
|
+
|
|
173
|
+
# ─── 5. ADR の対応コードリンクチェック ────────────────────────────
|
|
174
|
+
- name: ADR 対応コードリンクチェック
|
|
175
|
+
run: |
|
|
176
|
+
WARNINGS=0
|
|
177
|
+
if [[ -d "docs/adr" ]]; then
|
|
178
|
+
for adr in docs/adr/[0-9]*.md; do
|
|
179
|
+
[[ -f "$adr" ]] || continue
|
|
180
|
+
# 「## 対応コード」セクションからファイルパスを抽出
|
|
181
|
+
code_refs=$(awk '/^## 対応コード/{found=1; next} /^## /{found=0} found && /`.*\.(php|ts|tsx)`/{print}' "$adr" | grep -oP '`[^`]+`' | tr -d '`' || true)
|
|
182
|
+
while IFS= read -r ref; do
|
|
183
|
+
[[ -z "$ref" ]] && continue
|
|
184
|
+
if [[ ! -f "$ref" ]]; then
|
|
185
|
+
echo "⚠ ADR $(basename $adr): 参照ファイルが存在しません → $ref"
|
|
186
|
+
WARNINGS=$((WARNINGS + 1))
|
|
187
|
+
fi
|
|
188
|
+
done <<< "$code_refs"
|
|
189
|
+
done
|
|
190
|
+
fi
|
|
191
|
+
|
|
192
|
+
if [[ $WARNINGS -gt 0 ]]; then
|
|
193
|
+
echo ""
|
|
194
|
+
echo "ADRの対応コードリンクを更新してください(警告: ブロックしません)"
|
|
195
|
+
else
|
|
196
|
+
echo "✓ ADR対応コードリンク: OK"
|
|
197
|
+
fi
|
|
198
|
+
|
|
199
|
+
# ─── 6. glossary.md の新エンティティチェック(config.sh の DOMAIN_PATH / SOURCE_EXTENSIONS)──
|
|
200
|
+
- name: 新規Domain classのglossary.md登録チェック
|
|
201
|
+
env:
|
|
202
|
+
DOMAIN_PATH: ${{ env.DOMAIN_PATH }}
|
|
203
|
+
SOURCE_EXTENSIONS: ${{ env.SOURCE_EXTENSIONS }}
|
|
204
|
+
run: |
|
|
205
|
+
CHANGED=$(git diff --name-only origin/${{ github.base_ref }}...HEAD)
|
|
206
|
+
EXT_PATTERN=$(echo "$SOURCE_EXTENSIONS" | tr ' ' '|')
|
|
207
|
+
NEW_DOMAIN=$(echo "$CHANGED" | grep -E "^${DOMAIN_PATH}/.*\.(${EXT_PATTERN})$" | xargs git diff --diff-filter=A --name-only origin/${{ github.base_ref }}...HEAD 2>/dev/null || true)
|
|
208
|
+
|
|
209
|
+
if [[ -n "$NEW_DOMAIN" && -n "$DOMAIN_PATH" ]]; then
|
|
210
|
+
if echo "$CHANGED" | grep -q 'docs/glossary.md'; then
|
|
211
|
+
echo "✓ 新規Domainクラス追加 → glossary.md 更新確認"
|
|
212
|
+
else
|
|
213
|
+
echo "⚠ 新規Domainクラスが追加されましたが glossary.md が更新されていません"
|
|
214
|
+
echo " 新しいエンティティ/値オブジェクトにはユビキタス言語の追加が必要です"
|
|
215
|
+
fi
|
|
216
|
+
fi
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: ADR-XXX <タイトル>
|
|
3
|
+
status: 提案 | 承認済み | 置き換え済み(by ADR-YYY)
|
|
4
|
+
date: YYYY-MM-DD
|
|
5
|
+
usecase: <関連ユースケース名>
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# ADR-XXX: <タイトル>
|
|
9
|
+
|
|
10
|
+
## ステータス: 提案
|
|
11
|
+
|
|
12
|
+
## コンテキスト
|
|
13
|
+
|
|
14
|
+
<!-- この判断が必要になった背景 -->
|
|
15
|
+
|
|
16
|
+
## 検討した選択肢
|
|
17
|
+
|
|
18
|
+
### A: <名前>
|
|
19
|
+
メリット:
|
|
20
|
+
デメリット:
|
|
21
|
+
|
|
22
|
+
### B: <名前>
|
|
23
|
+
メリット:
|
|
24
|
+
デメリット:
|
|
25
|
+
|
|
26
|
+
## 決定
|
|
27
|
+
|
|
28
|
+
<!-- どれを選んだか -->
|
|
29
|
+
|
|
30
|
+
## 根拠
|
|
31
|
+
|
|
32
|
+
<!-- なぜその選択肢を選んだか。トレードオフ -->
|
|
33
|
+
|
|
34
|
+
## 対応コード
|
|
35
|
+
|
|
36
|
+
<!--
|
|
37
|
+
CIがこのセクションを読んでファイル存在チェックする。
|
|
38
|
+
バッククォートで囲んだファイルパスを列挙すること。
|
|
39
|
+
-->
|
|
40
|
+
|
|
41
|
+
- `packages/backend/src/Domain/...`
|
|
42
|
+
- `packages/backend/src/Infrastructure/...`
|
|
43
|
+
|
|
44
|
+
## 影響
|
|
45
|
+
|
|
46
|
+
<!-- 他の設計・ADRへの影響 -->
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# ユビキタス言語辞書
|
|
2
|
+
|
|
3
|
+
> このファイルはプロジェクト内の用語の**唯一の真実源**。
|
|
4
|
+
> 新しい概念が登場したら、**まずここに追加してから**設計・実装に入ること。
|
|
5
|
+
> `./scripts/spec-runner.sh set-gate glossary_checked` で確認済みフラグを立てること。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 使い方
|
|
10
|
+
|
|
11
|
+
- 設計ドキュメント(`docs/`) → **日本語** 列を使う
|
|
12
|
+
- コード(クラス名・メソッド名・変数名)→ **英語** 列を使う
|
|
13
|
+
- PHPDoc / JSDoc → 日本語を `@description` に併記する
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## 顧客管理コンテキスト
|
|
18
|
+
|
|
19
|
+
| 日本語 | 英語 | コンテキスト | 説明 | 初出 |
|
|
20
|
+
|-------|------|------------|------|------|
|
|
21
|
+
| 顧客 | Customer | 顧客管理 | 当社のサービスを利用する法人または個人 | - |
|
|
22
|
+
| 顧客ステータス | CustomerStatus | 顧客管理 | アクティブ/休止/解約 | - |
|
|
23
|
+
| 連絡先 | Contact | 顧客管理 | 顧客に紐づく連絡先情報 | - |
|
|
24
|
+
| 担当者 | AccountManager | 顧客管理 | 顧客を担当する社内メンバー | - |
|
|
25
|
+
| 対応履歴 | InteractionHistory | 顧客管理 | 顧客とのやりとりの記録 | - |
|
|
26
|
+
|
|
27
|
+
## 認証コンテキスト
|
|
28
|
+
|
|
29
|
+
| 日本語 | 英語 | コンテキスト | 説明 | 初出 |
|
|
30
|
+
|-------|------|------------|------|------|
|
|
31
|
+
| ユーザー | User | 認証 | システムにログインするアカウント | - |
|
|
32
|
+
| ロール | Role | 認可 | 権限グループ(管理者/一般) | - |
|
|
33
|
+
|
|
34
|
+
## 共通
|
|
35
|
+
|
|
36
|
+
| 日本語 | 英語 | コンテキスト | 説明 | 初出 |
|
|
37
|
+
|-------|------|------------|------|------|
|
|
38
|
+
| 識別子 | Id | 共通 | エンティティを一意に特定する値(ULID) | - |
|
|
39
|
+
| 値オブジェクト | ValueObject | 共通 | 属性値で等価判定されるオブジェクト | - |
|
|
40
|
+
| エンティティ | Entity | 共通 | 同一性(ID)を持つドメインオブジェクト | - |
|
|
41
|
+
| ドメインイベント | DomainEvent | 共通 | ドメインで発生した事実を表すイベント | - |
|
|
42
|
+
| リポジトリ | Repository | 共通 | 永続化・取得を抽象化するインターフェース | - |
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## 追加ルール
|
|
47
|
+
|
|
48
|
+
1. 新しい概念 → 実装前にここへ追加
|
|
49
|
+
2. 日本語名変更 → 設計ドキュメントの全使用箇所も更新
|
|
50
|
+
3. 英語名変更 → コードの全使用箇所もリネーム
|
|
51
|
+
4. 「初出」列 → 最初に定義したドキュメントのパスを記載
|