@mawaru/sdk 0.29.0 → 0.30.0
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.
|
@@ -21,6 +21,21 @@ const valid = {
|
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
describe("aiManifestSchema", () => {
|
|
24
|
+
it("認証方式を保持し、不明な方式は拒否する", () => {
|
|
25
|
+
for (const auth_mode of ["subscription", "api"]) {
|
|
26
|
+
expect(
|
|
27
|
+
aiManifestSchema.parse({ ...valid, model: "gpt-6-astra", auth_mode })
|
|
28
|
+
.auth_mode,
|
|
29
|
+
).toBe(auth_mode)
|
|
30
|
+
}
|
|
31
|
+
expect(() =>
|
|
32
|
+
aiManifestSchema.parse({ ...valid, auth_mode: "auto" }),
|
|
33
|
+
).toThrow()
|
|
34
|
+
// 旧定義を編集できるよう読み込みは許可する。実行には明示選択が必要。
|
|
35
|
+
expect(
|
|
36
|
+
aiManifestSchema.parse({ ...valid, model: "gpt-6-astra" }).auth_mode,
|
|
37
|
+
).toBeUndefined()
|
|
38
|
+
})
|
|
24
39
|
it("フル指定の manifest を受け付ける", () => {
|
|
25
40
|
const manifest = aiManifestSchema.parse(valid)
|
|
26
41
|
expect(manifest.name).toBe("返信下書き")
|
package/_schemas/ai-manifest.ts
CHANGED
|
@@ -79,6 +79,8 @@ export const aiManifestSchema = z
|
|
|
79
79
|
// repo に置く時点で完成品なので必須(DB 時代の「書きかけ空文字」は廃止)
|
|
80
80
|
prompt: z.string().min(1),
|
|
81
81
|
model: aiModelSchema.default(DEFAULT_AI_MODEL),
|
|
82
|
+
// 旧定義も編集のため読める。Codex の実行・保存時には明示選択を必須にする
|
|
83
|
+
auth_mode: z.enum(["subscription", "api"]).optional(),
|
|
82
84
|
// 同 repo のトップレベル skills/ 配下のディレクトリ名
|
|
83
85
|
skills: z
|
|
84
86
|
.array(
|
|
@@ -56,6 +56,10 @@ export declare const aiManifestSchema: z.ZodObject<{
|
|
|
56
56
|
"gpt-5.6-luna": "gpt-5.6-luna";
|
|
57
57
|
"gpt-5.5": "gpt-5.5";
|
|
58
58
|
}>>;
|
|
59
|
+
auth_mode: z.ZodOptional<z.ZodEnum<{
|
|
60
|
+
subscription: "subscription";
|
|
61
|
+
api: "api";
|
|
62
|
+
}>>;
|
|
59
63
|
skills: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
60
64
|
env: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
61
65
|
verbose: z.ZodOptional<z.ZodBoolean>;
|
|
@@ -69,6 +69,8 @@ export const aiManifestSchema = z
|
|
|
69
69
|
// repo に置く時点で完成品なので必須(DB 時代の「書きかけ空文字」は廃止)
|
|
70
70
|
prompt: z.string().min(1),
|
|
71
71
|
model: aiModelSchema.default(DEFAULT_AI_MODEL),
|
|
72
|
+
// 旧定義も編集のため読める。Codex の実行・保存時には明示選択を必須にする
|
|
73
|
+
auth_mode: z.enum(["subscription", "api"]).optional(),
|
|
72
74
|
// 同 repo のトップレベル skills/ 配下のディレクトリ名
|
|
73
75
|
skills: z
|
|
74
76
|
.array(z
|
package/docs/development.md
CHANGED
|
@@ -48,7 +48,7 @@ skills/<dir>/ # AI ノードが参照する skill(SKILL.md)
|
|
|
48
48
|
`skills`(トップレベル `skills/` 配下のディレクトリ名)・`env`・`inputs` / `outputs`
|
|
49
49
|
- `model` が実行主体を決める:`claude-*` は Claude Code、`gpt-*` は Codex で走る
|
|
50
50
|
(選択肢は `AI_MODEL_GROUPS`)。認証は repo の Actions secrets に置く:Claude Code は
|
|
51
|
-
`ANTHROPIC_API_KEY`(または `CLAUDE_CODE_OAUTH_TOKEN`)、Codex
|
|
51
|
+
`ANTHROPIC_API_KEY`(または `CLAUDE_CODE_OAUTH_TOKEN`)、Codex は明示的な `auth_mode` と対応する認証情報(下記「Codex の認証方式」参照)
|
|
52
52
|
(`env` に宣言しなくても渡される)
|
|
53
53
|
- `inputs` は1件以上・key 自由。値は `{ "schema": <JSON Schema>, "resume": true }` の形
|
|
54
54
|
(`resume` は省略可。true の口から入力が届いた実行は、同じノードの直近セッションを
|
|
@@ -76,3 +76,55 @@ skills/<dir>/ # AI ノードが参照する skill(SKILL.md)
|
|
|
76
76
|
|
|
77
77
|
- `npx mawaru validate` — リポジトリ規約の検証(CI 向け。error で exit 1)
|
|
78
78
|
- config.json を変えたら `npx mawaru typegen` で型を更新し、ズレをコンパイルで検出する
|
|
79
|
+
|
|
80
|
+
### Codex の認証方式
|
|
81
|
+
|
|
82
|
+
Codex の AI 定義は `auth_mode` を必ず指定する。エディタの「認証方式」で選択できる。
|
|
83
|
+
|
|
84
|
+
- `subscription`:ChatGPT の Codex 利用枠を使う。
|
|
85
|
+
- `api`:OpenAI の API キーで従量課金する。
|
|
86
|
+
|
|
87
|
+
既存の Codex 定義にも明示的な選択が必要。未指定・認証不足・枠切れ・認証エラーでも別方式へ切り替えない。Claude の認証設定は従来どおり。
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"prompt": "入力に返信してください",
|
|
92
|
+
"model": "gpt-5.6-luna",
|
|
93
|
+
"auth_mode": "subscription",
|
|
94
|
+
"inputs": { "in": { "schema": {} } },
|
|
95
|
+
"outputs": { "main": { "type": "string" } }
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
API を選ぶ場合は実行 repo の Actions Secret に `OPENAI_API_KEY` または `CODEX_API_KEY` を登録する。両方ある場合は Codex 固有の `CODEX_API_KEY` を使う。
|
|
100
|
+
|
|
101
|
+
#### サブスクを Actions で使う
|
|
102
|
+
|
|
103
|
+
非公開の実行 repo で、更新した `mawaru-runner.yml` を `npx @mawaru/sdk init` で反映する。
|
|
104
|
+
|
|
105
|
+
1. 自動実行専用の Codex ログインをファイル形式で作る。日常利用のログインキャッシュを複数の repo・マシンへ配布しない。
|
|
106
|
+
2. GitHub の実行 repo に `mawaru-codex` Environment を作成する。
|
|
107
|
+
3. **Environment Secret** に `CODEX_AUTH_JSON`(ログインキャッシュの内容)と `CODEX_AUTH_WRITE_TOKEN`(その repo の Environment Secrets を更新できるトークン)を登録する。標準の `GITHUB_TOKEN` には Secret 更新権限がない。Fine-grained PAT では対象 repo を限定し、Environments の書き込み権限を付ける。
|
|
108
|
+
4. AI 定義で `auth_mode: "subscription"` を選ぶ。
|
|
109
|
+
|
|
110
|
+
認証ファイルを表示せず登録する例(`OWNER/REPO` は実行 repo に置き換える):
|
|
111
|
+
|
|
112
|
+
```sh
|
|
113
|
+
# CODEX_HOME を普段のログインと分けて、初回ログインする
|
|
114
|
+
CODEX_HOME="$HOME/.mawaru-codex" codex -c 'cli_auth_credentials_store="file"' login
|
|
115
|
+
# 値をコマンド引数・履歴・チャットへ貼り付けない
|
|
116
|
+
gh secret set CODEX_AUTH_JSON --repo OWNER/REPO --env mawaru-codex < "$HOME/.mawaru-codex/auth.json"
|
|
117
|
+
gh secret set CODEX_AUTH_WRITE_TOKEN --repo OWNER/REPO --env mawaru-codex
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
runner は認証を作業ディレクトリ外に展開し、Codex が更新した認証を実行の成否にかかわらず Environment Secret へ戻す。同じ repo の AI ジョブは直列に実行する。GitHub の待機キューは最大100件で、それを超える投入は避ける。repo Secret はキュー投入時の古い値を読むため、サブスク認証の保存先には使わない。実行中の強制キャンセル・書き戻し失敗・ログイン失効時は、新しくログインして `CODEX_AUTH_JSON` を再登録する。
|
|
121
|
+
|
|
122
|
+
API 選択時はサブスク認証を読み込まず、サブスク選択時は API キーを Codex に渡さない。サブスク認証は利用枠無制限を意味しない。追加購入済みクレジットの消費は ChatGPT アカウント側の設定に従う。
|
|
123
|
+
|
|
124
|
+
#### ローカルで使う
|
|
125
|
+
|
|
126
|
+
`auth_mode: "subscription"` を設定したうえで、`CODEX_AUTH_FILE` に自動実行用の auth.json の絶対パスを指定して runner を実行する。更新済み認証は同じファイルへ戻すため、親ディレクトリにも書き込み権限が必要。同じファイルを使う mawaru の並行実行はエラーで止める。
|
|
127
|
+
|
|
128
|
+
API 選択時は `OPENAI_API_KEY` / `CODEX_API_KEY` を runner の環境変数、または既存の `SECRETS_JSON` 経由で渡す。
|
|
129
|
+
|
|
130
|
+
参考:[Codexの認証](https://learn.chatgpt.com/docs/auth)、[CIでの認証維持](https://learn.chatgpt.com/docs/auth/ci-cd-auth)、[GitHubのSecret読み込み時点](https://docs.github.com/en/actions/reference/security/secrets)、[待機キューの上限](https://docs.github.com/en/actions/how-tos/write-workflows/choose-when-workflows-run/control-workflow-concurrency)。
|
package/package.json
CHANGED
|
@@ -20,6 +20,15 @@ on:
|
|
|
20
20
|
jobs:
|
|
21
21
|
run:
|
|
22
22
|
runs-on: ubuntu-latest
|
|
23
|
+
# 認証の更新を次のジョブ開始時に読むため、repo Secret ではなく環境Secretを使う。
|
|
24
|
+
environment:
|
|
25
|
+
name: mawaru-codex
|
|
26
|
+
deployment: false
|
|
27
|
+
# 同じ repo の AI ジョブを直列化。通常の concurrency は待機中ジョブを置換するため max。
|
|
28
|
+
concurrency:
|
|
29
|
+
group: ${{ github.event.client_payload.agent && 'mawaru-ai-auth' || github.run_id }}
|
|
30
|
+
cancel-in-progress: false
|
|
31
|
+
queue: max
|
|
23
32
|
steps:
|
|
24
33
|
# 自分の Actions run の URL を mawaru に自己申告する(画面のリンク表示用)。
|
|
25
34
|
# repository_dispatch は起動した run の ID を返さないため、URL を知っているのは
|
|
@@ -55,7 +64,10 @@ jobs:
|
|
|
55
64
|
# backstop は GHA のジョブ上限(6時間)に任せる。step の停止は mawaru の run キャンセル
|
|
56
65
|
- name: run
|
|
57
66
|
id: run
|
|
58
|
-
env:
|
|
67
|
+
env:
|
|
68
|
+
SECRETS_JSON: "${{ toJSON(secrets) }}"
|
|
69
|
+
MAWARU_CODEX_AUTH_STORAGE: github-environment
|
|
70
|
+
MAWARU_CODEX_PRIVATE_REPO: "${{ github.event.repository.private }}"
|
|
59
71
|
run: npx --yes "${{ github.event.client_payload.runner }}" payload.json
|
|
60
72
|
|
|
61
73
|
# ラッパー自体が起動できなかった事故(npx 失敗等)の backstop。
|