@einja/dev-cli 0.1.30 → 0.1.32

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.
Files changed (51) hide show
  1. package/README.md +1 -0
  2. package/dist/commands/task-loop/index.d.ts.map +1 -1
  3. package/dist/commands/task-loop/index.js +149 -16
  4. package/dist/commands/task-loop/index.js.map +1 -1
  5. package/dist/commands/task-loop/lib/task-state-manager.d.ts +33 -2
  6. package/dist/commands/task-loop/lib/task-state-manager.d.ts.map +1 -1
  7. package/dist/commands/task-loop/lib/task-state-manager.js +74 -3
  8. package/dist/commands/task-loop/lib/task-state-manager.js.map +1 -1
  9. package/dist/commands/task-loop/lib/task-state-manager.test.js +252 -1
  10. package/dist/commands/task-loop/lib/task-state-manager.test.js.map +1 -1
  11. package/dist/commands/task-loop/lib/types.d.ts +17 -0
  12. package/dist/commands/task-loop/lib/types.d.ts.map +1 -1
  13. package/dist/commands/task-loop/lib/vibe-kanban-client.d.ts +25 -0
  14. package/dist/commands/task-loop/lib/vibe-kanban-client.d.ts.map +1 -1
  15. package/dist/commands/task-loop/lib/vibe-kanban-client.js +63 -0
  16. package/dist/commands/task-loop/lib/vibe-kanban-client.js.map +1 -1
  17. package/dist/commands/task-loop/lib/vibe-kanban-client.test.js +184 -0
  18. package/dist/commands/task-loop/lib/vibe-kanban-client.test.js.map +1 -1
  19. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.d.ts +47 -0
  20. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.d.ts.map +1 -1
  21. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js +116 -0
  22. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.js.map +1 -1
  23. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.test.d.ts +2 -0
  24. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.test.d.ts.map +1 -0
  25. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.test.js +293 -0
  26. package/dist/commands/task-loop/lib/vibe-kanban-rest-client.test.js.map +1 -0
  27. package/package.json +1 -1
  28. package/presets/default/.claude/agents/einja/codex-agent.md +117 -0
  29. package/presets/default/.claude/agents/einja/specs/spec-requirements-generator.md +15 -6
  30. package/presets/default/.claude/hooks/einja/playwright-resize.sh +12 -2
  31. package/presets/default/.claude/settings.json +15 -0
  32. package/presets/default/.claude/skills/einja-backend-architecture/SKILL.md +4 -0
  33. package/presets/default/.claude/skills/einja-output-format/SKILL.md +21 -0
  34. package/presets/default/.claude/skills/einja-spec-context-loader/SKILL.md +1 -1
  35. package/scaffolds/.mcp.json +6 -9
  36. package/scaffolds/example/specs/issues/issue999-example-task/qa-tests/scenarios.md +4 -4
  37. package/scaffolds/example/specs/issues/issue999-example-task/requirements.md +131 -100
  38. package/scaffolds/example/specs/issues/issue999-example-task/tasks.md +4 -3
  39. package/scaffolds/instructions/task-vibe-kanban-loop.md +38 -17
  40. package/scaffolds/instructions/vercel-cli-reference.md +451 -0
  41. package/scaffolds/steering/README.md +1 -0
  42. package/scaffolds/steering/acceptance-criteria-and-qa-guide.md +13 -1
  43. package/scaffolds/steering/development/backend-architecture.md +2 -1
  44. package/scaffolds/steering/development/database-guidelines.md +239 -0
  45. package/scaffolds/steering/development/frontend-development.md +80 -5
  46. package/scaffolds/steering/development/review-guidelines.md +5 -0
  47. package/scaffolds/steering/development-workflow.md +15 -1
  48. package/scaffolds/steering/infrastructure/deployment.md +27 -21
  49. package/scaffolds/steering/task-management.md +21 -0
  50. package/scaffolds/templates/README.md +11 -7
  51. package/scaffolds/templates/requirements.md.template +44 -32
@@ -0,0 +1,293 @@
1
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
+ import { VibeKanbanRestClient } from "./vibe-kanban-rest-client.js";
3
+ // fetchをモック
4
+ const mockFetch = vi.fn();
5
+ vi.stubGlobal("fetch", mockFetch);
6
+ describe("VibeKanbanRestClient", () => {
7
+ let client;
8
+ beforeEach(() => {
9
+ vi.clearAllMocks();
10
+ vi.spyOn(console, "warn").mockImplementation(() => { });
11
+ vi.spyOn(console, "log").mockImplementation(() => { });
12
+ client = new VibeKanbanRestClient(12345);
13
+ // setTimeoutをモックしてリトライの待機をスキップ
14
+ vi.spyOn(global, "setTimeout").mockImplementation((fn) => {
15
+ if (typeof fn === "function")
16
+ fn();
17
+ return 0;
18
+ });
19
+ });
20
+ afterEach(() => {
21
+ vi.restoreAllMocks();
22
+ });
23
+ describe("setParentIssue", () => {
24
+ it("正常時、PATCH リクエストが /api/remote/issues/{issueId} に parent_issue_id 付きで送信される", async () => {
25
+ // Given: 正常なレスポンスが返る
26
+ mockFetch.mockResolvedValueOnce({
27
+ ok: true,
28
+ status: 200,
29
+ text: async () => "OK",
30
+ });
31
+ // When: setParentIssue を呼び出す
32
+ await client.setParentIssue("issue-123", "parent-456");
33
+ // Then: PATCH リクエストが正しいURL・ボディで送信される
34
+ expect(mockFetch).toHaveBeenCalledWith("http://127.0.0.1:12345/api/remote/issues/issue-123", {
35
+ method: "PATCH",
36
+ headers: { "Content-Type": "application/json" },
37
+ body: JSON.stringify({ parent_issue_id: "parent-456" }),
38
+ });
39
+ });
40
+ it("レスポンスが非200の場合、エラーがスローされる", async () => {
41
+ // Given: 404 レスポンスが返る
42
+ mockFetch.mockResolvedValueOnce({
43
+ ok: false,
44
+ status: 404,
45
+ text: async () => "Not Found",
46
+ });
47
+ // When/Then: エラーがスローされる
48
+ await expect(client.setParentIssue("issue-123", "parent-456")).rejects.toThrow("parent_issue_id の設定に失敗しました (404)");
49
+ });
50
+ });
51
+ describe("removeParentIssue", () => {
52
+ it("正常時、PATCH リクエストが { parent_issue_id: null } 付きで送信される", async () => {
53
+ // Given: 正常なレスポンスが返る
54
+ mockFetch.mockResolvedValueOnce({
55
+ ok: true,
56
+ status: 200,
57
+ text: async () => "OK",
58
+ });
59
+ // When: removeParentIssue を呼び出す
60
+ await client.removeParentIssue("issue-123");
61
+ // Then: PATCH リクエストが null の parent_issue_id で送信される
62
+ expect(mockFetch).toHaveBeenCalledWith("http://127.0.0.1:12345/api/remote/issues/issue-123", {
63
+ method: "PATCH",
64
+ headers: { "Content-Type": "application/json" },
65
+ body: JSON.stringify({ parent_issue_id: null }),
66
+ });
67
+ });
68
+ it("500エラーが3回続いた場合、fetchWithRetryからエラーがスローされる", async () => {
69
+ // Given: 500 レスポンスが毎回返る(リトライ後も失敗)
70
+ mockFetch.mockResolvedValue({
71
+ ok: false,
72
+ status: 500,
73
+ statusText: "Internal Server Error",
74
+ text: async () => "Internal Server Error",
75
+ });
76
+ // When/Then: fetchWithRetry が最終リトライ後にエラーをスローする
77
+ await expect(client.removeParentIssue("issue-123")).rejects.toThrow("REST API request failed after 3 retries: 500");
78
+ // Then: fetch が MAX_RETRIES (3) 回呼ばれる
79
+ expect(mockFetch).toHaveBeenCalledTimes(3);
80
+ });
81
+ });
82
+ describe("listIssuesWithParent", () => {
83
+ it("正常時、Issue一覧が返される(parent_issue_id フィールド含む)", async () => {
84
+ // Given: Issue一覧を含むレスポンスが返る
85
+ const mockIssues = [
86
+ { id: "issue-1", title: "Task 1", status: "todo", parent_issue_id: null },
87
+ { id: "issue-2", title: "Task 2", status: "done", parent_issue_id: "issue-1" },
88
+ ];
89
+ mockFetch.mockResolvedValueOnce({
90
+ ok: true,
91
+ status: 200,
92
+ json: async () => ({ issues: mockIssues }),
93
+ });
94
+ // When: listIssuesWithParent を呼び出す
95
+ const result = await client.listIssuesWithParent("project-abc");
96
+ // Then: Issue一覧が返る
97
+ expect(result).toEqual(mockIssues);
98
+ expect(result[0].parent_issue_id).toBeNull();
99
+ expect(result[1].parent_issue_id).toBe("issue-1");
100
+ });
101
+ it("正常時、GET リクエストが /api/remote/issues?project_id={projectId} に送信される", async () => {
102
+ // Given: 正常なレスポンスが返る
103
+ mockFetch.mockResolvedValueOnce({
104
+ ok: true,
105
+ status: 200,
106
+ json: async () => ({ issues: [] }),
107
+ });
108
+ // When: listIssuesWithParent を呼び出す
109
+ await client.listIssuesWithParent("my-project");
110
+ // Then: 正しいURLで GET リクエストが送信される
111
+ expect(mockFetch).toHaveBeenCalledWith("http://127.0.0.1:12345/api/remote/issues?project_id=my-project", { method: "GET" });
112
+ });
113
+ it("issues が空の場合、空配列が返される", async () => {
114
+ // Given: 空の issues リストが返る
115
+ mockFetch.mockResolvedValueOnce({
116
+ ok: true,
117
+ status: 200,
118
+ json: async () => ({ issues: [] }),
119
+ });
120
+ // When: listIssuesWithParent を呼び出す
121
+ const result = await client.listIssuesWithParent("project-abc");
122
+ // Then: 空配列が返る
123
+ expect(result).toEqual([]);
124
+ });
125
+ it("issues フィールドがない場合も空配列が返される", async () => {
126
+ // Given: issues フィールドなしのレスポンスが返る
127
+ mockFetch.mockResolvedValueOnce({
128
+ ok: true,
129
+ status: 200,
130
+ json: async () => ({}),
131
+ });
132
+ // When: listIssuesWithParent を呼び出す
133
+ const result = await client.listIssuesWithParent("project-abc");
134
+ // Then: 空配列が返る
135
+ expect(result).toEqual([]);
136
+ });
137
+ });
138
+ describe("probeCapability", () => {
139
+ it("レスポンスが200の場合、trueが返る", async () => {
140
+ // Given: 200 レスポンスが返る
141
+ mockFetch.mockResolvedValueOnce({
142
+ ok: true,
143
+ status: 200,
144
+ });
145
+ // When: probeCapability を呼び出す
146
+ const result = await client.probeCapability();
147
+ // Then: true が返る
148
+ expect(result).toBe(true);
149
+ });
150
+ it("レスポンスが404の場合、trueが返る(APIは動作している)", async () => {
151
+ // Given: 404 レスポンスが返る(プロジェクトが見つからないが API は動作中)
152
+ mockFetch.mockResolvedValueOnce({
153
+ ok: false,
154
+ status: 404,
155
+ });
156
+ // When: probeCapability を呼び出す
157
+ const result = await client.probeCapability();
158
+ // Then: true が返る(404 はAPIが動作している証拠)
159
+ expect(result).toBe(true);
160
+ });
161
+ it("レスポンスが502の場合、falseが返る", async () => {
162
+ // Given: 502 レスポンスが返る(バックエンドが停止中)
163
+ mockFetch.mockResolvedValueOnce({
164
+ ok: false,
165
+ status: 502,
166
+ });
167
+ // When: probeCapability を呼び出す
168
+ const result = await client.probeCapability();
169
+ // Then: false が返る
170
+ expect(result).toBe(false);
171
+ });
172
+ it("レスポンスが503の場合、falseが返る", async () => {
173
+ // Given: 503 レスポンスが返る(サービス利用不可)
174
+ mockFetch.mockResolvedValueOnce({
175
+ ok: false,
176
+ status: 503,
177
+ });
178
+ // When: probeCapability を呼び出す
179
+ const result = await client.probeCapability();
180
+ // Then: false が返る
181
+ expect(result).toBe(false);
182
+ });
183
+ it("fetch失敗(ネットワークエラー)の場合、falseが返る", async () => {
184
+ // Given: ネットワークエラーが発生する
185
+ mockFetch.mockRejectedValueOnce(new Error("Network error"));
186
+ // When: probeCapability を呼び出す
187
+ const result = await client.probeCapability();
188
+ // Then: false が返る
189
+ expect(result).toBe(false);
190
+ });
191
+ });
192
+ describe("fetchWithRetry(間接テスト)", () => {
193
+ it("429エラーの場合、リトライして成功する(setParentIssue経由でテスト)", async () => {
194
+ // Given: 最初のリクエストは 429、2回目は成功
195
+ mockFetch
196
+ .mockResolvedValueOnce({
197
+ ok: false,
198
+ status: 429,
199
+ text: async () => "Too Many Requests",
200
+ })
201
+ .mockResolvedValueOnce({
202
+ ok: true,
203
+ status: 200,
204
+ text: async () => "OK",
205
+ });
206
+ // When: setParentIssue を呼び出す
207
+ await client.setParentIssue("issue-123", "parent-456");
208
+ // Then: 2回 fetch が呼ばれる(リトライされた)
209
+ expect(mockFetch).toHaveBeenCalledTimes(2);
210
+ });
211
+ it("500エラーの場合、リトライして成功する", async () => {
212
+ // Given: 最初のリクエストは 500、2回目は成功
213
+ mockFetch
214
+ .mockResolvedValueOnce({
215
+ ok: false,
216
+ status: 500,
217
+ text: async () => "Internal Server Error",
218
+ })
219
+ .mockResolvedValueOnce({
220
+ ok: true,
221
+ status: 200,
222
+ text: async () => "OK",
223
+ });
224
+ // When: setParentIssue を呼び出す
225
+ await client.setParentIssue("issue-123", "parent-456");
226
+ // Then: 2回 fetch が呼ばれる(リトライされた)
227
+ expect(mockFetch).toHaveBeenCalledTimes(2);
228
+ });
229
+ it("401エラーの場合、リトライせず即座にエラーがスローされる", async () => {
230
+ // Given: 401 レスポンスが返る
231
+ mockFetch.mockResolvedValueOnce({
232
+ ok: false,
233
+ status: 401,
234
+ text: async () => "Unauthorized",
235
+ });
236
+ // When/Then: リトライせず即座にエラーがスローされる
237
+ await expect(client.setParentIssue("issue-123", "parent-456")).rejects.toThrow("認証エラー (401)");
238
+ // Then: fetch は1回しか呼ばれない
239
+ expect(mockFetch).toHaveBeenCalledTimes(1);
240
+ });
241
+ it("403エラーの場合、リトライせず即座にエラーがスローされる", async () => {
242
+ // Given: 403 レスポンスが返る
243
+ mockFetch.mockResolvedValueOnce({
244
+ ok: false,
245
+ status: 403,
246
+ text: async () => "Forbidden",
247
+ });
248
+ // When/Then: リトライせず即座にエラーがスローされる
249
+ await expect(client.setParentIssue("issue-123", "parent-456")).rejects.toThrow("認証エラー (403)");
250
+ // Then: fetch は1回しか呼ばれない
251
+ expect(mockFetch).toHaveBeenCalledTimes(1);
252
+ });
253
+ it("3回全てネットワークエラーの場合、最後のエラーがスローされる", async () => {
254
+ // Given: 全3回ネットワークエラーが発生する
255
+ const networkError = new Error("Network error");
256
+ mockFetch
257
+ .mockRejectedValueOnce(networkError)
258
+ .mockRejectedValueOnce(networkError)
259
+ .mockRejectedValueOnce(networkError);
260
+ // When/Then: 最後のエラーがスローされる
261
+ await expect(client.setParentIssue("issue-123", "parent-456")).rejects.toThrow("Network error");
262
+ // Then: fetch が MAX_RETRIES (3) 回呼ばれる
263
+ expect(mockFetch).toHaveBeenCalledTimes(3);
264
+ });
265
+ it("429エラーが3回続いた場合、最終リトライ後にエラーがスローされる", async () => {
266
+ // Given: 全3回 429 が返る
267
+ mockFetch.mockResolvedValue({
268
+ ok: false,
269
+ status: 429,
270
+ statusText: "Too Many Requests",
271
+ text: async () => "Too Many Requests",
272
+ });
273
+ // When/Then: fetchWithRetry が最終リトライ後にエラーをスローする
274
+ await expect(client.setParentIssue("issue-123", "parent-456")).rejects.toThrow("REST API request failed after 3 retries: 429");
275
+ // Then: fetch が MAX_RETRIES (3) 回呼ばれる
276
+ expect(mockFetch).toHaveBeenCalledTimes(3);
277
+ });
278
+ it("5xxエラーが3回続いた場合、最終リトライ後にエラーがスローされる", async () => {
279
+ // Given: 全3回 503 が返る
280
+ mockFetch.mockResolvedValue({
281
+ ok: false,
282
+ status: 503,
283
+ statusText: "Service Unavailable",
284
+ text: async () => "Service Unavailable",
285
+ });
286
+ // When/Then: fetchWithRetry が最終リトライ後にエラーをスローする
287
+ await expect(client.setParentIssue("issue-123", "parent-456")).rejects.toThrow("REST API request failed after 3 retries: 503");
288
+ // Then: fetch が MAX_RETRIES (3) 回呼ばれる
289
+ expect(mockFetch).toHaveBeenCalledTimes(3);
290
+ });
291
+ });
292
+ });
293
+ //# sourceMappingURL=vibe-kanban-rest-client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vibe-kanban-rest-client.test.js","sourceRoot":"","sources":["../../../../src/commands/task-loop/lib/vibe-kanban-rest-client.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEpE,YAAY;AACZ,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC1B,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;AAElC,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,MAA4B,CAAC;IAEjC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,aAAa,EAAE,CAAC;QACnB,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACvD,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACtD,MAAM,GAAG,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC;QACzC,+BAA+B;QAC/B,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAgB,EAAE,EAAE;YACrE,IAAI,OAAO,EAAE,KAAK,UAAU;gBAAE,EAAE,EAAE,CAAC;YACnC,OAAO,CAA6C,CAAC;QACvD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;QAC9B,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;YACxF,qBAAqB;YACrB,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;aACvB,CAAC,CAAC;YAEH,6BAA6B;YAC7B,MAAM,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAEvD,qCAAqC;YACrC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,oDAAoD,EACpD;gBACE,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,YAAY,EAAE,CAAC;aACxD,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;YACxC,sBAAsB;YACtB,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW;aAC9B,CAAC,CAAC;YAEH,wBAAwB;YACxB,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5E,kCAAkC,CACnC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;QACjC,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;YACnE,qBAAqB;YACrB,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;aACvB,CAAC,CAAC;YAEH,gCAAgC;YAChC,MAAM,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;YAE5C,mDAAmD;YACnD,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,oDAAoD,EACpD;gBACE,MAAM,EAAE,OAAO;gBACf,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;gBAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC;aAChD,CACF,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,kCAAkC;YAClC,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,uBAAuB;gBACnC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,uBAAuB;aAC1C,CAAC,CAAC;YAEH,+CAA+C;YAC/C,MAAM,MAAM,CAAC,MAAM,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CACjE,8CAA8C,CAC/C,CAAC;YAEF,sCAAsC;YACtC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,4BAA4B;YAC5B,MAAM,UAAU,GAAG;gBACjB,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,IAAI,EAAE;gBACzE,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,SAAS,EAAE;aAC/E,CAAC;YACF,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;aAC3C,CAAC,CAAC;YAEH,mCAAmC;YACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;YAEhE,mBAAmB;YACnB,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YACnC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,QAAQ,EAAE,CAAC;YAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACpD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,qBAAqB;YACrB,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aACnC,CAAC,CAAC;YAEH,mCAAmC;YACnC,MAAM,MAAM,CAAC,oBAAoB,CAAC,YAAY,CAAC,CAAC;YAEhD,gCAAgC;YAChC,MAAM,CAAC,SAAS,CAAC,CAAC,oBAAoB,CACpC,gEAAgE,EAChE,EAAE,MAAM,EAAE,KAAK,EAAE,CAClB,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,0BAA0B;YAC1B,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;aACnC,CAAC,CAAC;YAEH,mCAAmC;YACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;YAEhE,eAAe;YACf,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,4BAA4B,EAAE,KAAK,IAAI,EAAE;YAC1C,iCAAiC;YACjC,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;aACvB,CAAC,CAAC;YAEH,mCAAmC;YACnC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,aAAa,CAAC,CAAC;YAEhE,eAAe;YACf,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;QAC/B,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACpC,sBAAsB;YACtB,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;YAEH,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;YAE9C,iBAAiB;YACjB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;YAChD,+CAA+C;YAC/C,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;YAEH,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;YAE9C,oCAAoC;YACpC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,kCAAkC;YAClC,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;YAEH,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;YAE9C,kBAAkB;YAClB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;YACrC,gCAAgC;YAChC,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;aACZ,CAAC,CAAC;YAEH,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;YAE9C,kBAAkB;YAClB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,wBAAwB;YACxB,SAAS,CAAC,qBAAqB,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;YAE5D,8BAA8B;YAC9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,eAAe,EAAE,CAAC;YAE9C,kBAAkB;YAClB,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACrC,EAAE,CAAC,4CAA4C,EAAE,KAAK,IAAI,EAAE;YAC1D,8BAA8B;YAC9B,SAAS;iBACN,qBAAqB,CAAC;gBACrB,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,mBAAmB;aACtC,CAAC;iBACD,qBAAqB,CAAC;gBACrB,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;aACvB,CAAC,CAAC;YAEL,6BAA6B;YAC7B,MAAM,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAEvD,gCAAgC;YAChC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;YACpC,8BAA8B;YAC9B,SAAS;iBACN,qBAAqB,CAAC;gBACrB,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,uBAAuB;aAC1C,CAAC;iBACD,qBAAqB,CAAC;gBACrB,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;aACvB,CAAC,CAAC;YAEL,6BAA6B;YAC7B,MAAM,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;YAEvD,gCAAgC;YAChC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,sBAAsB;YACtB,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,cAAc;aACjC,CAAC,CAAC;YAEH,iCAAiC;YACjC,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5E,aAAa,CACd,CAAC;YAEF,yBAAyB;YACzB,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;YAC7C,sBAAsB;YACtB,SAAS,CAAC,qBAAqB,CAAC;gBAC9B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,WAAW;aAC9B,CAAC,CAAC;YAEH,iCAAiC;YACjC,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5E,aAAa,CACd,CAAC;YAEF,yBAAyB;YACzB,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;YAC9C,2BAA2B;YAC3B,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;YAChD,SAAS;iBACN,qBAAqB,CAAC,YAAY,CAAC;iBACnC,qBAAqB,CAAC,YAAY,CAAC;iBACnC,qBAAqB,CAAC,YAAY,CAAC,CAAC;YAEvC,2BAA2B;YAC3B,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5E,eAAe,CAChB,CAAC;YAEF,sCAAsC;YACtC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,qBAAqB;YACrB,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,mBAAmB;gBAC/B,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,mBAAmB;aACtC,CAAC,CAAC;YAEH,+CAA+C;YAC/C,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5E,8CAA8C,CAC/C,CAAC;YAEF,sCAAsC;YACtC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;YACjD,qBAAqB;YACrB,SAAS,CAAC,iBAAiB,CAAC;gBAC1B,EAAE,EAAE,KAAK;gBACT,MAAM,EAAE,GAAG;gBACX,UAAU,EAAE,qBAAqB;gBACjC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC,qBAAqB;aACxC,CAAC,CAAC;YAEH,+CAA+C;YAC/C,MAAM,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAC5E,8CAA8C,CAC/C,CAAC;YAEF,sCAAsC;YACtC,MAAM,CAAC,SAAS,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@einja/dev-cli",
3
- "version": "0.1.30",
3
+ "version": "0.1.32",
4
4
  "description": "Einja CLI - .claude設定とテンプレート同期をnpxでインストール",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -0,0 +1,117 @@
1
+ ---
2
+ name: codex-agent
3
+ description: OpenAI Codex CLIを活用した汎用コーディングエージェント。コードレビュー、実装支援、バグ修正、リファクタリングなどCodexの強みを活かした作業を担当。<example>Context: ユーザーがコードレビューやリファクタリングを依頼した場合。user: "この関数をリファクタリングして" assistant: "codex-agentエージェントを使用して、Codexの分析力を活かしたリファクタリングを実施します" <commentary>Codexの強みを活かしたコード改善が必要なため、codex-agentエージェントを起動します。</commentary></example> <example>Context: バグの調査と修正が必要な場合。user: "このバグを調査して修正して" assistant: "codex-agentエージェントを起動して、Codexによるバグ分析と修正案の提示を行います" <commentary>Codexの高度なコード分析力を活用するため、codex-agentエージェントに依頼します。</commentary></example>
4
+ model: sonnet
5
+ color: green
6
+ skills:
7
+ - output-format
8
+ ---
9
+
10
+ ## ✅ 最重要: 出力形式
11
+
12
+ **「codex-agent」テンプレートに従って報告すること。この形式から逸脱しないこと。**
13
+
14
+ ---
15
+
16
+ あなたはOpenAI Codex CLIを活用した汎用コーディングエージェントです。Codex MCPツールを駆使して、コードレビュー、実装支援、バグ修正、リファクタリングなど幅広いコーディング作業を高品質に遂行します。
17
+
18
+ ## あなたの中核的な責務
19
+
20
+ Codex MCPツール(`mcp__codex__codex` / `mcp__codex__codex-reply`)を活用し、以下の作業を担当します:
21
+
22
+ - **コードレビュー**: コード品質の分析、改善提案
23
+ - **実装支援**: 機能実装のサポート、コード生成
24
+ - **バグ修正**: バグの原因分析と修正案の提示
25
+ - **リファクタリング**: コード構造の改善、可読性向上
26
+ - **コード調査**: コードベースの分析、影響範囲の特定
27
+
28
+ ## Codex MCPツールの使い方
29
+
30
+ ### `mcp__codex__codex`
31
+
32
+ Codexに新しいタスクを送信するツールです。
33
+
34
+ **使用場面**:
35
+ - 新しい作業を開始する場合
36
+ - コードの分析・レビューを依頼する場合
37
+ - 実装やリファクタリングを依頼する場合
38
+
39
+ **重要**: ToolSearchで `mcp__codex__codex` を事前にロードしてから使用すること。
40
+
41
+ ### `mcp__codex__codex-reply`
42
+
43
+ Codexの実行中のセッションに追加の指示やコンテキストを送信するツールです。
44
+
45
+ **使用場面**:
46
+ - Codexからの質問に回答する場合
47
+ - 追加のコンテキスト情報を提供する場合
48
+ - 作業方針を修正・補足する場合
49
+
50
+ **重要**: ToolSearchで `mcp__codex__codex-reply` を事前にロードしてから使用すること。
51
+
52
+ ## 作業モード別の実行プロセス
53
+
54
+ ### レビューモード
55
+
56
+ 1. 対象コードを読み込み、レビュー観点を整理
57
+ 2. `mcp__codex__codex` でCodexにコードレビューを依頼
58
+ 3. Codexの分析結果を受け取り、構造化して報告
59
+ 4. 改善提案をリスト化
60
+
61
+ ### 実装モード
62
+
63
+ 1. 要件と既存コードを把握
64
+ 2. `mcp__codex__codex` でCodexに実装を依頼
65
+ 3. 必要に応じて `mcp__codex__codex-reply` で追加コンテキストを提供
66
+ 4. 生成されたコードをプロジェクトに適用
67
+
68
+ ### バグ修正モード
69
+
70
+ 1. バグの症状と再現手順を整理
71
+ 2. `mcp__codex__codex` でCodexにバグ分析を依頼
72
+ 3. 原因特定後、修正コードを適用
73
+ 4. 修正内容と影響範囲を報告
74
+
75
+ ### リファクタリングモード
76
+
77
+ 1. リファクタリング対象と目標を明確化
78
+ 2. `mcp__codex__codex` でCodexにリファクタリングを依頼
79
+ 3. 段階的に変更を適用
80
+ 4. 変更前後の比較を報告
81
+
82
+ ### 調査モード
83
+
84
+ 1. 調査対象と質問を整理
85
+ 2. `mcp__codex__codex` でCodexに分析を依頼
86
+ 3. 調査結果を構造化して報告
87
+
88
+ ## エラーハンドリング
89
+
90
+ ### Codex MCP接続失敗時
91
+
92
+ 1. ToolSearchで該当ツールが利用可能か確認
93
+ 2. 利用不可の場合、ユーザーに報告し代替手段を提案
94
+ 3. 代替手段: 通常のコード読み取り・編集ツールで作業を継続
95
+
96
+ ### Codexからの応答がない場合
97
+
98
+ 1. `mcp__codex__codex-reply` で状況を確認
99
+ 2. タイムアウトの場合、タスクを分割して再試行
100
+ 3. 繰り返し失敗する場合、ユーザーに報告
101
+
102
+ ## 品質チェックリスト
103
+
104
+ 作業完了前に以下を確認:
105
+
106
+ - [ ] Codexの出力がプロジェクトのコーディング規約に準拠しているか
107
+ - [ ] 型安全性が確保されているか(any型不使用)
108
+ - [ ] 既存のコードパターンと一貫性があるか
109
+ - [ ] エラーハンドリングが適切か
110
+ - [ ] 変更の影響範囲が明確か
111
+
112
+ ## 重要な原則
113
+
114
+ - **Codexの出力を鵜呑みにしない**: 必ずプロジェクトの規約・パターンとの整合性を検証
115
+ - **段階的な作業**: 大きな変更は段階的に実施
116
+ - **透明性**: Codexに依頼した内容と得られた結果を明確に報告
117
+ - **フォールバック**: Codexが利用できない場合の代替手段を常に持つ
@@ -220,17 +220,23 @@ requirements.mdファイルは、この正確な構造と順序に従う必要
220
220
  ## ユーザーストーリー
221
221
 
222
222
  ### Story 1: [ストーリータイトル]
223
+ [ストーリーの内容を1文で要約]
224
+
223
225
  **As a** [ユーザーロール]
224
226
  **I want to** [実現したいこと]
225
227
  **So that** [得られる価値]
226
228
 
227
229
  #### 受け入れ基準
228
- - [ ] **AC1.1**: Given: [前提条件]
229
- When: [アクション]
230
- Then: [期待結果]
231
- - [ ] **AC1.2**: Given: [前提条件2]
232
- When: [アクション2]
233
- Then: [期待結果2]
230
+ - [ ] **AC1.1**: [この受け入れ基準の振る舞いを1文で要約]
231
+ - Given: [前提条件]
232
+ - When: [アクション]
233
+ - Then: [期待結果]
234
+ - 検証レベル: [Unit / Integration / E2E / Browser]
235
+ - [ ] **AC1.2**: [この受け入れ基準の振る舞いを1文で要約]
236
+ - Given: [前提条件2]
237
+ - When: [アクション2]
238
+ - Then: [期待結果2]
239
+ - 検証レベル: [Unit / Integration / E2E / Browser]
234
240
 
235
241
  **注意**: 各受け入れ基準には`AC{StoryNumber}.{SequentialNumber}`形式で一意の番号を付けてください(例: Story 1の場合はAC1.1, AC1.2, AC1.3...)。この番号はtasks.mdで参照されます。
236
242
 
@@ -320,6 +326,7 @@ P0 (必須)
320
326
  - 実装の詳細に依存しない
321
327
  - ユーザーの視点から書かれている
322
328
  - **一意の番号付け**: 各受け入れ基準には`AC{StoryNumber}.{SequentialNumber}`形式で番号を付ける(例: Story 1の場合はAC1.1, AC1.2...)
329
+ - **1文の要約を先頭に記載**: 各受け入れ基準には振る舞いを1文で要約した文をAC番号の直後に記載する
323
330
 
324
331
  3. **ストーリーの優先順位付け**: 段階的な提供を可能にするために優先順位(P0=必須、P1=重要、P2=あれば良い)を割り当てます。
325
332
 
@@ -338,7 +345,9 @@ P0 (必須)
338
345
  ## 品質チェックリスト
339
346
  要件定義書を最終化する前に、以下を確認してください:
340
347
  - [ ] 各ストーリーは独立してテスト可能である
348
+ - [ ] 各ストーリーに1文の要約がある
341
349
  - [ ] 受け入れ基準がGiven-When-Then形式を使用している
350
+ - [ ] 各受け入れ基準に1文の要約がある
342
351
  - [ ] ストーリーが依存関係と優先順位で順序付けられている
343
352
  - [ ] 非機能要件に測定可能な目標がある
344
353
  - [ ] 成功指標が定義され、測定可能である
@@ -2,8 +2,18 @@
2
2
  # playwright-resize.sh - Playwright使用前にリサイズを強制するhook
3
3
  # PreToolUseで実行され、リサイズ未実施ならブロックする
4
4
 
5
- input=$(cat)
6
- tool_name=$(echo "$input" | jq -r '.tool_name // empty')
5
+ # stdin読み込み(3秒タイムアウト)
6
+ input=""
7
+ while IFS= read -r -t 3 line; do
8
+ input="${input}${line}"
9
+ done
10
+
11
+ tool_name=$(echo "$input" | jq -r '.tool_name // empty' 2>/dev/null)
12
+
13
+ # inputが空またはtool_name取得失敗時 → 安全側で許可(hookをスキップ)
14
+ if [ -z "$tool_name" ]; then
15
+ exit 0
16
+ fi
7
17
 
8
18
  # Playwrightツール以外は無視
9
19
  if [[ ! "$tool_name" =~ ^mcp__playwright__ ]]; then
@@ -38,11 +38,15 @@
38
38
  "MultiEdit(**)",
39
39
  "Write",
40
40
  "Task(*)",
41
+ "Skill",
42
+ "Skill(*)",
41
43
  "TodoRead(*)",
42
44
  "TodoWrite(*)",
45
+ "AskUserQuestion",
43
46
  "NotebookRead(*)",
44
47
  "NotebookEdit(*)",
45
48
  "mcp__codex__codex",
49
+ "mcp__codex__codex-reply",
46
50
  "mcp__github__get_pull_request",
47
51
  "mcp__github__get_pull_request_files",
48
52
  "mcp__github__update_pull_request",
@@ -50,6 +54,7 @@
50
54
  "mcp__github__get_commit",
51
55
  "mcp__github__get_file_contents",
52
56
  "mcp__github__search_code",
57
+ "mcp__github__issue_read",
53
58
  "mcp__playwright",
54
59
  "mcp__playwright__browser_navigate",
55
60
  "mcp__playwright__browser_click",
@@ -59,6 +64,16 @@
59
64
  "mcp__playwright__browser_console_messages",
60
65
  "mcp__playwright__browser_handle_dialog",
61
66
  "mcp__playwright__browser_type",
67
+ "mcp__playwright__browser_take_screenshot",
68
+ "mcp__playwright__browser_fill_form",
69
+ "mcp__playwright__browser_press_key",
70
+ "mcp__playwright__browser_hover",
71
+ "mcp__playwright__browser_select_option",
72
+ "mcp__playwright__browser_drag",
73
+ "mcp__playwright__browser_tabs",
74
+ "mcp__playwright__browser_network_requests",
75
+ "mcp__playwright__browser_close",
76
+ "mcp__playwright__browser_resize",
62
77
  "mcp__serena",
63
78
  "mcp__serena__activate_project",
64
79
  "mcp__serena__check_onboarding_performed",
@@ -12,3 +12,7 @@ description: "4層レイヤードアーキテクチャ、Repositoryパターン
12
12
  ## 詳細ドキュメント
13
13
 
14
14
  @docs/einja/steering/development/backend-architecture.md
15
+
16
+ ## 関連ドキュメント
17
+
18
+ - @docs/einja/steering/development/database-guidelines.md
@@ -162,6 +162,27 @@ description: "サブエージェントの統一出力形式を定義"
162
162
  [後続処理の説明]
163
163
  ```
164
164
 
165
+ ### codex-agent
166
+
167
+ ```markdown
168
+ ## 🤖 Codex作業完了
169
+
170
+ ### タスク: [作業内容]
171
+
172
+ ### 作業結果: [✅ SUCCESS / ⚠️ PARTIAL / ❌ FAILURE]
173
+
174
+ ### 作業モード: [レビュー / 実装 / バグ修正 / リファクタリング / 調査]
175
+
176
+ ### サマリー
177
+ [主要な結果・数値]
178
+
179
+ ### 詳細
180
+ [Codexからの出力・分析結果]
181
+
182
+ ### 次のステップ
183
+ [後続処理の説明]
184
+ ```
185
+
165
186
  ## 長い出力の取り扱い
166
187
 
167
188
  出力が50行を超える場合、以下の形式で表示:
@@ -49,7 +49,7 @@ spec-create で作成された仕様書(requirements.md、design.md、qa-tests
49
49
  - **検証レベル**: 各ACの `Unit` / `Integration` / `E2E` 分類
50
50
  - **非機能要件**: パフォーマンス、セキュリティ等の制約
51
51
 
52
- **パース対象**: Given-When-Then 形式の受け入れ条件
52
+ **パース対象**: `**ACx.y**: [要約文]` + インデントGiven-When-Then形式の受け入れ条件(`- Given:` / `- When:` / `- Then:` / `- 検証レベル:` の箇条書き形式)
53
53
 
54
54
  ---
55
55
 
@@ -19,16 +19,17 @@
19
19
  "args": ["-y", "@playwright/mcp", "--isolated"]
20
20
  },
21
21
  "serena": {
22
+ "type": "stdio",
22
23
  "command": "uvx",
23
24
  "args": [
24
25
  "--from",
25
26
  "git+https://github.com/oraios/serena",
26
- "serena-mcp-server",
27
+ "serena",
28
+ "start-mcp-server",
27
29
  "--context",
28
- "ide-assistant",
29
- ".",
30
- "--enable-web-dashboard=false"
31
- ]
30
+ "claude-code",
31
+ "--open-web-dashboard",
32
+ "false"]
32
33
  },
33
34
  "github": {
34
35
  "type": "http",
@@ -36,10 +37,6 @@
36
37
  "headers": {
37
38
  "Authorization": "Bearer ${GITHUB_TOKEN}"
38
39
  }
39
- },
40
- "asana": {
41
- "command": "npx",
42
- "args": ["mcp-remote", "https://mcp.asana.com/sse"]
43
40
  }
44
41
  }
45
42
  }