@ripla/godd-mcp 1.0.6 → 1.0.7-canary.2
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/dist/godd.cjs +194 -185
- package/dist/godd.js +191 -49
- package/dist/index.js +1 -1
- package/notes/api/.env.example +1 -4
- package/notes/api/README.md +4 -2
- package/notes/api/app/config.py +8 -5
- package/notes/api/app/routers/tree.py +3 -3
- package/notes/api/app/services/github.py +14 -13
- package/notes/api/app/services/github_app_token.py +10 -15
- package/notes/api/app/services/github_pr.py +14 -8
- package/notes/api/tests/test_files.py +2 -2
- package/notes/api/tests/test_github_app_token.py +6 -5
- package/notes/api/tests/test_github_service.py +30 -4
- package/notes/api/tests/test_pr_chain.py +25 -2
- package/notes/api/tests/test_tree.py +1 -1
- package/notes/app/e2e/pages/login-page.ts +6 -0
- package/notes/app/e2e/password-toggle.spec.ts +198 -0
- package/notes/app/src/components/PasswordInput.test.tsx +122 -0
- package/notes/app/src/components/PasswordInput.tsx +67 -0
- package/notes/app/src/pages/LoginPage.test.tsx +31 -1
- package/notes/app/src/pages/LoginPage.tsx +14 -8
- package/notes/app/src/pages/UserManagementPage.test.tsx +51 -0
- package/notes/app/src/pages/UserManagementPage.tsx +2 -2
- package/package.json +1 -1
- package/templates/github-actions/aws/deploy-notes.yml.hbs +31 -0
- package/templates/notes-compose.yml +0 -1
- package/templates/notes-docs/007_guides/setup_godd.md +46 -10
- package/templates/notes-docs/007_guides/setup_godd_notes.md +218 -16
- package/templates/notes-docs/007_guides/setup_godd_notes.md.styles.json +409 -0
- package/templates/notes-docs/007_guides/setup_infra.template.md +75 -22
- package/templates/terraform/aws/ecs.tf.hbs +9 -1
- package/templates/terraform/aws/provider.tf.hbs +1 -1
- package/templates/terraform/aws/secrets.tf.hbs +11 -3
|
@@ -118,11 +118,17 @@ terraform init && terraform apply
|
|
|
118
118
|
godd notes deploy -y
|
|
119
119
|
```
|
|
120
120
|
|
|
121
|
+
> **`godd notes deploy` の実行前に、ローカルの Docker daemon(Docker Desktop 等)を起動しておいてください。** 起動していない状態で実行すると `Cannot connect to the Docker daemon at unix:///.../docker.sock` で即失敗します。この前提は事前の `✓ 前提条件 OK` チェックでは検知されません。
|
|
122
|
+
|
|
121
123
|
### 4. Secrets Manager に値を設定
|
|
122
124
|
|
|
123
|
-
Terraform
|
|
125
|
+
Terraform が生成する ECS タスク定義(`ecs.tf`)は、下記のシークレットすべてを環境変数としてマッピングします。**使わない機能の値も投入しないとタスクが起動しません**(未投入のシークレットがあると `GetSecretValue` に失敗しタスクが起動しない、または起動直後にクラッシュします)。
|
|
124
126
|
シークレット名の `{env}` は入力した環境名(例: `dev`)に置き換えてください。
|
|
125
127
|
|
|
128
|
+
> **空文字列は投入できません。** AWS Secrets Manager の仕様上、空文字列(`""`)は投入不可です(エラー: `Invalid length for parameter SecretString, value: 0, valid min length: 1`)。すべての必須シークレットに値を入れてください。
|
|
129
|
+
>
|
|
130
|
+
> **AI コーディングアシスタント経由での書き込みがブロックされる場合があります。** `aws secretsmanager put-secret-value` は安全機構(承認フロー等)によりエージェント経由の実行が止まることがあります。その場合は自分のターミナルで直接実行してください。
|
|
131
|
+
|
|
126
132
|
#### jwt-secret
|
|
127
133
|
|
|
128
134
|
JWT アクセストークンの署名・検証(HS256)に使用します。32文字以上のランダム文字列を設定してください。
|
|
@@ -147,41 +153,65 @@ aws secretsmanager put-secret-value \
|
|
|
147
153
|
|
|
148
154
|
> パスワードは後から変更できますが、初回起動前に必ず設定してください。
|
|
149
155
|
|
|
150
|
-
####
|
|
151
|
-
|
|
152
|
-
docs ファイルの読取・PR 操作・Issue 操作に使用します。GitHub で Fine-grained personal access token を発行してください。
|
|
153
|
-
|
|
154
|
-
**トークンの発行手順:**
|
|
156
|
+
#### GitHub 連携(GitHub App 必須)
|
|
155
157
|
|
|
156
|
-
|
|
157
|
-
2. **Resource owner** でリポジトリのオーナーを選択
|
|
158
|
-
3. **Repository access** で対象リポジトリを選択
|
|
159
|
-
4. **Permissions** で以下を設定:
|
|
158
|
+
> **PAT(`github-token` / `GITHUB_TOKEN`)は禁止です。** Fine-grained PAT や Machine User PAT は使用できません。ECS タスク定義は `GITHUB_TOKEN` を注入しません。
|
|
160
159
|
|
|
161
|
-
|
|
160
|
+
docs ファイルの読取・PR 操作・Issue 操作に GitHub API を使います。**GitHub App の3変数すべてが必須**です(未設定だと Notes はモックモードで動作し、実際のリポジトリを読み書きできません)。
|
|
162
161
|
|
|
163
|
-
|
|
|
162
|
+
| シークレット | 型 | 内容 |
|
|
164
163
|
|---|---|---|
|
|
165
|
-
| `
|
|
166
|
-
| `
|
|
167
|
-
| `
|
|
164
|
+
| `github-app-id` | **int** | GitHub App の App ID |
|
|
165
|
+
| `github-app-private-key` | string | GitHub App の秘密鍵(PEM 全文) |
|
|
166
|
+
| `github-app-installation-id` | **int** | GitHub App のインストール ID |
|
|
168
167
|
|
|
169
|
-
|
|
168
|
+
PR / Issue の author が個人アカウントではなく Bot 名義になります。組織で GitHub App がまだ無い場合の作成手順:
|
|
170
169
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
170
|
+
1. GitHub → Organization の Settings → Developer settings → GitHub Apps → **New GitHub App**
|
|
171
|
+
2. App name を入力(Webhook は Active のチェックを外す)
|
|
172
|
+
3. Repository permissions で `Contents: Read & write` / `Pull requests: Read & write` / `Issues: Read & write` を設定
|
|
173
|
+
4. **Create GitHub App** → **Generate a private key** で `.pem` をダウンロード(このページの **App ID** もメモ)
|
|
174
|
+
5. Install App → 対象 Organization → Only select repositories で対象リポジトリを追加 → URL 末尾の数字が Installation ID(`https://github.com/organizations/<org>/settings/installations/<ID>`)
|
|
174
175
|
|
|
175
|
-
|
|
176
|
+
既に組織に GitHub App がある場合は、対象リポジトリへのアクセス権限追加のみで OK です(本ガイド [setup_godd_notes.md](./setup_godd_notes.md) のセットアップ手順を参照)。
|
|
176
177
|
|
|
177
178
|
**AWS CLI での設定:**
|
|
178
179
|
|
|
179
180
|
```bash
|
|
180
181
|
aws secretsmanager put-secret-value \
|
|
181
|
-
--secret-id godd-notes/{env}/github-
|
|
182
|
-
--secret-string "
|
|
182
|
+
--secret-id godd-notes/{env}/github-app-id \
|
|
183
|
+
--secret-string "123456" \
|
|
184
|
+
--profile <PROFILE> \
|
|
185
|
+
--region ap-northeast-1
|
|
186
|
+
|
|
187
|
+
aws secretsmanager put-secret-value \
|
|
188
|
+
--secret-id godd-notes/{env}/github-app-private-key \
|
|
189
|
+
--secret-string file://path/to/private-key.pem \
|
|
190
|
+
--profile <PROFILE> \
|
|
191
|
+
--region ap-northeast-1
|
|
192
|
+
|
|
193
|
+
aws secretsmanager put-secret-value \
|
|
194
|
+
--secret-id godd-notes/{env}/github-app-installation-id \
|
|
195
|
+
--secret-string "987654321" \
|
|
196
|
+
--profile <PROFILE> \
|
|
197
|
+
--region ap-northeast-1
|
|
183
198
|
```
|
|
184
199
|
|
|
200
|
+
> **int 型**(`github-app-id` / `github-app-installation-id`)は数値の文字列(例: `"123456"`)を指定してください。文字列ダミー(`"unused"`)は Pydantic 型検証で失敗し、ECS タスクが起動直後にクラッシュループします。
|
|
201
|
+
|
|
202
|
+
#### PAT 廃止時の ECS 移行(既存環境 — 必須順序)
|
|
203
|
+
|
|
204
|
+
`lifecycle.ignore_changes` により ECS サービスは Terraform の新 TD を自動採用しない。次の順序を守ること:
|
|
205
|
+
|
|
206
|
+
1. **先にデプロイ**(GitHub Actions `deploy-notes` または `godd notes deploy`)
|
|
207
|
+
現行 TD をクローンし `GITHUB_TOKEN` シークレット注入を除去した新リビジョンを登録してサービスを更新する
|
|
208
|
+
2. `aws ecs wait services-stable`(または CI の Wait)で **stable** を確認する
|
|
209
|
+
3. **その後** `terraform apply`
|
|
210
|
+
`removed { destroy = false }` により state から `github-token` を外すが、AWS 上のシークレットはすぐには消えない(旧 TD 参照の事故を防ぐ)
|
|
211
|
+
4. 全環境の稼働 TD に `GITHUB_TOKEN` が残っていないことを確認したら、Secrets Manager の `godd-notes/{env}/github-token` を **手動削除**する
|
|
212
|
+
|
|
213
|
+
> 順序を逆(apply でシークレットを先に destroy)にすると、旧 TD のまま再デプロイされたタスクが起動失敗する。
|
|
214
|
+
|
|
185
215
|
### 5. GitHub Secrets に CI/CD 用の値を登録
|
|
186
216
|
|
|
187
217
|
生成される `.github/workflows/deploy-notes.yml` は、フロントエンドデプロイ後の CloudFront キャッシュ無効化に GitHub Secrets の `CLOUDFRONT_DISTRIBUTION_ID` を参照します。Terraform 適用後に以下で登録してください。
|
|
@@ -194,6 +224,29 @@ gh secret set CLOUDFRONT_DISTRIBUTION_ID \
|
|
|
194
224
|
|
|
195
225
|
> 未登録の場合、deploy-app ジョブはキャッシュ無効化を warning 付きでスキップします(ジョブは失敗しません)。S3 へのデプロイは完了しますが、CloudFront のキャッシュ TTL が切れるまで旧コンテンツが配信され続けるため、登録を推奨します。
|
|
196
226
|
|
|
227
|
+
### 6. デプロイ後に ECS タスクが安定しない場合
|
|
228
|
+
|
|
229
|
+
`aws ecs describe-services` の `runningCount` / `rolloutState` だけでは「`IN_PROGRESS` のまま進まない」以上のことが分からず、原因特定にはタスクの停止理由とアプリログまで追う必要があります。
|
|
230
|
+
|
|
231
|
+
```bash
|
|
232
|
+
# 1. 停止済みタスクを確認(起動直後にクラッシュしている場合はここに出る)
|
|
233
|
+
aws ecs list-tasks --cluster godd-notes --service-name notes-api --desired-status STOPPED
|
|
234
|
+
|
|
235
|
+
# 2. 停止理由・終了コードを確認
|
|
236
|
+
aws ecs describe-tasks --cluster godd-notes --tasks <task-arn> \
|
|
237
|
+
--query 'tasks[0].{stoppedReason:stoppedReason,exitCode:containers[0].exitCode}'
|
|
238
|
+
|
|
239
|
+
# 3. アプリのスタックトレースを確認
|
|
240
|
+
aws logs describe-log-streams --log-group-name /ecs/godd-notes-api --order-by LastEventTime --descending
|
|
241
|
+
aws logs get-log-events --log-group-name /ecs/godd-notes-api --log-stream-name <stream>
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Secrets Manager の値を修正しても、既に起動中/クラッシュループ中の ECS サービスには自動反映されません。修正後は必ず再デプロイしてください。
|
|
245
|
+
|
|
246
|
+
```bash
|
|
247
|
+
aws ecs update-service --cluster godd-notes --service notes-api --force-new-deployment
|
|
248
|
+
```
|
|
249
|
+
|
|
197
250
|
---
|
|
198
251
|
|
|
199
252
|
## 設定の永続化
|
|
@@ -98,7 +98,6 @@ resource "aws_ecs_task_definition" "api" {
|
|
|
98
98
|
{ name = "DB_USER", valueFrom = "${aws_secretsmanager_secret.rds_credentials.arn}:username::" },
|
|
99
99
|
{ name = "DB_PASSWORD", valueFrom = "${aws_secretsmanager_secret.rds_credentials.arn}:password::" },
|
|
100
100
|
{ name = "JWT_SECRET", valueFrom = aws_secretsmanager_secret.jwt_secret.arn },
|
|
101
|
-
{ name = "GITHUB_TOKEN", valueFrom = aws_secretsmanager_secret.github_token.arn },
|
|
102
101
|
{ name = "GITHUB_APP_ID", valueFrom = aws_secretsmanager_secret.github_app_id.arn },
|
|
103
102
|
{ name = "GITHUB_APP_PRIVATE_KEY", valueFrom = aws_secretsmanager_secret.github_app_private_key.arn },
|
|
104
103
|
{ name = "GITHUB_APP_INSTALLATION_ID", valueFrom = aws_secretsmanager_secret.github_app_installation_id.arn },
|
|
@@ -139,4 +138,13 @@ resource "aws_ecs_service" "api" {
|
|
|
139
138
|
container_name = "notes-api"
|
|
140
139
|
container_port = local.container_port
|
|
141
140
|
}
|
|
141
|
+
|
|
142
|
+
# CI / `godd notes deploy` register image revisions; ignore TF drift on TD.
|
|
143
|
+
# Deploy paths strip legacy GITHUB_TOKEN secret refs when cloning TDs.
|
|
144
|
+
lifecycle {
|
|
145
|
+
ignore_changes = [
|
|
146
|
+
task_definition,
|
|
147
|
+
desired_count,
|
|
148
|
+
]
|
|
149
|
+
}
|
|
142
150
|
}
|
|
@@ -17,9 +17,17 @@ resource "aws_secretsmanager_secret" "jwt_secret" {
|
|
|
17
17
|
tags = local.tags
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
20
|
+
# PAT-era stacks may still have aws_secretsmanager_secret.github_token in state.
|
|
21
|
+
# Drop it from Terraform management without destroying the AWS secret, so an
|
|
22
|
+
# apply cannot orphan running task definitions that still inject GITHUB_TOKEN.
|
|
23
|
+
# After CI/`godd notes deploy` has registered a TD without GITHUB_TOKEN and the
|
|
24
|
+
# service is stable, delete the AWS secret manually (see setup_infra runbook).
|
|
25
|
+
removed {
|
|
26
|
+
from = aws_secretsmanager_secret.github_token
|
|
27
|
+
|
|
28
|
+
lifecycle {
|
|
29
|
+
destroy = false
|
|
30
|
+
}
|
|
23
31
|
}
|
|
24
32
|
|
|
25
33
|
resource "aws_secretsmanager_secret" "github_app_id" {
|