[{"data":1,"prerenderedAt":952},["ShallowReactive",2],{"content-doc:article:/articles/workflow-2026-02":3,"content-surroundings:article:/articles/workflow-2026-02":941},{"id":4,"title":5,"body":6,"date":925,"description":926,"extension":204,"kind":927,"meta":928,"navigation":234,"ogImage":929,"path":930,"seo":931,"sitemap":933,"stem":935,"tags":936,"updatedAt":939,"__hash__":940},"article/articles/workflow-2026-02.md","理解度と速度のバランスを取ったAI駆動の開発ワークフロー",{"type":7,"value":8,"toc":914},"minimark",[9,20,24,59,62,72,75,127,130,135,138,167,192,197,200,828,835,838,878,881,910],[10,11,12,13,16,17,19],"p",{},"AIが大量に生成するコードに圧倒されることなく、コードへの理解を保ちながら、人間が主導権を握り続けるためのワークフロー。",[14,15],"br",{},"\n2026/02/20時点で感触が良いものをメモしておく。",[14,18],{},"\n（あくまでも個人開発や厳密さをそこまで要求されない部分での運用）",[21,22,23],"h2",{"id":23},"最初の要件定義",[25,26,27,40,52],"ol",{},[28,29,30,31],"li",{},"システムが満たすべき要件をリストとして列挙する\n",[32,33,34,37],"ul",{},[28,35,36],{},"ここは自分で考えて手で書く。漏れや重複を少なく、エッジケースや分岐も細かく考える",[28,38,39],{},"出来上がったアプリの動きを妄想する楽しいフェーズ",[28,41,42,46,47],{},[43,44,45],"code",{},"Codex CLI","の plan mode で、要件定義したい旨・システムを作る目的・想定ユーザ・1.のリストを投げる\n",[32,48,49],{},[28,50,51],{},"ディスカッションをしてヌケモレ重複を解消する",[28,53,54,55,58],{},"作ってもらった plan を ",[43,56,57],{},"/docs/plan"," 内に配置してもらう",[21,60,61],{"id":61},"機能設計",[25,63,64],{},[28,65,66,67],{},"plan内から1機能（フェーズ1）をピックアップし、詳細度を高めた plan を、plan mode で作成する\n",[32,68,69],{},[28,70,71],{},"実装に近い話をディスカッションして決めていく",[21,73,74],{"id":74},"開発",[25,76,77,89,92,121,124],{},[28,78,79,80,83,84],{},"Codex CLI に フェーズ1 に対する TDD用の TODO リストを作成してもらい、",[43,81,82],{},".md"," に追加する\n",[32,85,86],{},[28,87,88],{},"TODOリストは自分で作ってもいい",[28,90,91],{},"TODO リストをレビューする",[28,93,94,95],{},"TDDのループで実装を進める\n",[25,96,97,100,103,106,109,112,115,118],{},[28,98,99],{},"TODOリストから1件選ぶ",[28,101,102],{},"Red: そのケースに対する失敗するテストを1つ追加 or 修正する",[28,104,105],{},"Green: テストを通すための最小限の実装を行う",[28,107,108],{},"Refactor: テストがグリーンの状態を維持したままリファクタリングする",[28,110,111],{},"lint, format, knip を実行",[28,113,114],{},"plan を更新する",[28,116,117],{},"コミットする",[28,119,120],{},"問題なければ別のTODOに進む。",[28,122,123],{},"☝のシーケンス内では都度、質問、要件・機能・TODOのブラッシュアップを行う",[28,125,126],{},"定期的にテストケースの構造化を行う",[21,128,129],{"id":129},"繰り替えす",[25,131,132],{},[28,133,134],{},"次のフェーズのPlanを作成して開発 -> 次のフェーズの... を繰り返す",[21,136,137],{"id":137},"新しいセッションに入ったとき",[32,139,140,143,153],{},[28,141,142],{},"上述のTDDの指示を毎回打ち込むのはめんどくさい",[28,144,145,146,149,150,152],{},"また、context が圧迫してきたら plan を更新させた後 ",[43,147,148],{},"/compact","するが、",[43,151,148],{}," 後はワークフローが崩れる",[28,154,155,156,161,162],{},"そのため、上述のフローを ",[157,158,160],"a",{"href":159},"#%E5%8F%82%E8%80%83-skills","skills","に登録している\n",[32,163,164],{},[28,165,166],{},"実装中の plan と次タスクを明示して指示している",[168,169,174],"pre",{"className":170,"code":171,"language":172,"meta":173,"style":173},"language-bash shiki shiki-themes github-light","# 指示の例\n$workflow docs/implementation_plan_phase1-3.md の phase1.5 Case5 の続きを実装する\n","bash","",[43,175,176,185],{"__ignoreMap":173},[177,178,181],"span",{"class":179,"line":180},"line",1,[177,182,184],{"class":183},"sAwPA","# 指示の例\n",[177,186,188],{"class":179,"line":187},2,[177,189,191],{"class":190},"sgsFI","$workflow docs/implementation_plan_phase1-3.md の phase1.5 Case5 の続きを実装する\n",[193,194,196],"h3",{"id":195},"参考-skills","参考: skills",[10,198,199],{},"大まかに言うと、古典学派・TDDで実装してこうねという話",[168,201,205],{"className":202,"code":203,"language":204,"meta":173,"style":173},"language-md shiki shiki-themes github-light","---\nname: workflow\ndescription: Shared collaboration workflow for implementing one TODO case at a time (t-wada style classical TDD). Assumes plan and TODO list are already agreed. Includes explicit review gates and pre-commit quality checks (lint/format/knip).\n---\n\n# Workflow\n\n## Objective\n\nExecute implementation with a strict one-case TDD cadence, using explicit review gates and deterministic diffs.\n\n## Preconditions\n\n- Plan and TDD TODO list are already agreed.\n- We will start from an existing TODO item.\n\n## Invocation\n\nWhen starting work, the user says:\n\n- `$workflow に従って、{XX} の {YY} を実装していこう`\n\n## TDD Loop (One Case Only)\n\n1. Pick exactly one TODO case (state the TODO id/title explicitly).\n2. **Red**: add or adjust one failing test for the case.\n3. Ask the user to review the test intent and failing result.\n4. **Green**: implement the minimum code required to pass the test.\n5. Ask the user to review the implementation.\n6. **Refactor** while keeping tests green.\n7. Ask the user to review the refactor.\n8. **Plan Update (before commit)**:\n   - Reflect the implemented behavior in the plan.\n   - Mark the TODO case as completed.\n   - Adjust acceptance criteria if clarified during implementation.\n   - Record any design decision discovered during the case.\n9. **Quality Gate (before commit)**:\n   - run `lint`\n   - run `format`\n   - run `knip`\n   - if any fail: fix minimally, keep scope constrained to the same TODO case.\n10. **Commit the case**.\n11. Move to the next TODO case.\n\n## Guardrails\n\n- Do not batch multiple TODO cases in one cycle.\n- TODO must follow t-wada style, classical style TDD.\n  - Behavior-first.\n  - Outside-in thinking only when needed.\n  - Prefer state verification over interaction verification.\n  - No unnecessary mocking.\n- Each TODO must represent a single observable behavior.\n- Test cases must be written structurally.\n\n  Use the following structure:\n  - XXをするYY\n    - XX のとき YY となる\n\n- Test case names must be written in Japanese.\n- Test names must describe behavior (condition + result), not method names.\n- One test = one behavior.\n- Do not test multiple branches in a single test.\n- Avoid implementation detail assertions.\n- Keep each step observable and explain why the change is needed.\n- Prefer minimal deterministic diffs.\n- Pause coding and return to discussion if disagreement appears.\n- If scope changes, stop and re-align TODO/acceptance before continuing.\n- Do not use English identifiers in test names unless domain terminology requires it.\n\n- The plan must be updated before every commit.\n- Implementation and plan must remain consistent.\n- No commit without plan alignment.\n\n## Commit Rules\n\n- Commit only after completing Red → Green → Refactor and passing the Quality Gate.\n- Use short imperative commit messages with prefixes such as `test`, `fix`, `refactor`, `docs`, `add`.\n- Keep unrelated changes out of the commit.\n","md",[43,206,207,213,218,224,229,236,242,247,253,258,264,269,275,280,290,298,303,309,314,320,325,334,339,345,350,359,372,381,393,402,414,423,435,444,452,460,468,479,490,500,510,518,530,539,544,550,555,563,571,580,588,596,604,612,620,625,631,639,648,653,661,669,677,685,693,701,709,717,725,733,738,746,754,762,767,773,778,786,820],{"__ignoreMap":173},[177,208,209],{"class":179,"line":180},[177,210,212],{"class":211},"surfw","---\n",[177,214,215],{"class":179,"line":187},[177,216,217],{"class":190},"name: workflow\n",[177,219,221],{"class":179,"line":220},3,[177,222,223],{"class":190},"description: Shared collaboration workflow for implementing one TODO case at a time (t-wada style classical TDD). Assumes plan and TODO list are already agreed. Includes explicit review gates and pre-commit quality checks (lint/format/knip).\n",[177,225,227],{"class":179,"line":226},4,[177,228,212],{"class":211},[177,230,232],{"class":179,"line":231},5,[177,233,235],{"emptyLinePlaceholder":234},true,"\n",[177,237,239],{"class":179,"line":238},6,[177,240,241],{"class":211},"# Workflow\n",[177,243,245],{"class":179,"line":244},7,[177,246,235],{"emptyLinePlaceholder":234},[177,248,250],{"class":179,"line":249},8,[177,251,252],{"class":211},"## Objective\n",[177,254,256],{"class":179,"line":255},9,[177,257,235],{"emptyLinePlaceholder":234},[177,259,261],{"class":179,"line":260},10,[177,262,263],{"class":190},"Execute implementation with a strict one-case TDD cadence, using explicit review gates and deterministic diffs.\n",[177,265,267],{"class":179,"line":266},11,[177,268,235],{"emptyLinePlaceholder":234},[177,270,272],{"class":179,"line":271},12,[177,273,274],{"class":211},"## Preconditions\n",[177,276,278],{"class":179,"line":277},13,[177,279,235],{"emptyLinePlaceholder":234},[177,281,283,287],{"class":179,"line":282},14,[177,284,286],{"class":285},"sqxcx","-",[177,288,289],{"class":190}," Plan and TDD TODO list are already agreed.\n",[177,291,293,295],{"class":179,"line":292},15,[177,294,286],{"class":285},[177,296,297],{"class":190}," We will start from an existing TODO item.\n",[177,299,301],{"class":179,"line":300},16,[177,302,235],{"emptyLinePlaceholder":234},[177,304,306],{"class":179,"line":305},17,[177,307,308],{"class":211},"## Invocation\n",[177,310,312],{"class":179,"line":311},18,[177,313,235],{"emptyLinePlaceholder":234},[177,315,317],{"class":179,"line":316},19,[177,318,319],{"class":190},"When starting work, the user says:\n",[177,321,323],{"class":179,"line":322},20,[177,324,235],{"emptyLinePlaceholder":234},[177,326,328,330],{"class":179,"line":327},21,[177,329,286],{"class":285},[177,331,333],{"class":332},"sYu0t"," `$workflow に従って、{XX} の {YY} を実装していこう`\n",[177,335,337],{"class":179,"line":336},22,[177,338,235],{"emptyLinePlaceholder":234},[177,340,342],{"class":179,"line":341},23,[177,343,344],{"class":211},"## TDD Loop (One Case Only)\n",[177,346,348],{"class":179,"line":347},24,[177,349,235],{"emptyLinePlaceholder":234},[177,351,353,356],{"class":179,"line":352},25,[177,354,355],{"class":285},"1.",[177,357,358],{"class":190}," Pick exactly one TODO case (state the TODO id/title explicitly).\n",[177,360,362,365,369],{"class":179,"line":361},26,[177,363,364],{"class":285},"2.",[177,366,368],{"class":367},"sbYKK"," **Red**",[177,370,371],{"class":190},": add or adjust one failing test for the case.\n",[177,373,375,378],{"class":179,"line":374},27,[177,376,377],{"class":285},"3.",[177,379,380],{"class":190}," Ask the user to review the test intent and failing result.\n",[177,382,384,387,390],{"class":179,"line":383},28,[177,385,386],{"class":285},"4.",[177,388,389],{"class":367}," **Green**",[177,391,392],{"class":190},": implement the minimum code required to pass the test.\n",[177,394,396,399],{"class":179,"line":395},29,[177,397,398],{"class":285},"5.",[177,400,401],{"class":190}," Ask the user to review the implementation.\n",[177,403,405,408,411],{"class":179,"line":404},30,[177,406,407],{"class":285},"6.",[177,409,410],{"class":367}," **Refactor**",[177,412,413],{"class":190}," while keeping tests green.\n",[177,415,417,420],{"class":179,"line":416},31,[177,418,419],{"class":285},"7.",[177,421,422],{"class":190}," Ask the user to review the refactor.\n",[177,424,426,429,432],{"class":179,"line":425},32,[177,427,428],{"class":285},"8.",[177,430,431],{"class":367}," **Plan Update (before commit)**",[177,433,434],{"class":190},":\n",[177,436,438,441],{"class":179,"line":437},33,[177,439,440],{"class":285},"   -",[177,442,443],{"class":190}," Reflect the implemented behavior in the plan.\n",[177,445,447,449],{"class":179,"line":446},34,[177,448,440],{"class":285},[177,450,451],{"class":190}," Mark the TODO case as completed.\n",[177,453,455,457],{"class":179,"line":454},35,[177,456,440],{"class":285},[177,458,459],{"class":190}," Adjust acceptance criteria if clarified during implementation.\n",[177,461,463,465],{"class":179,"line":462},36,[177,464,440],{"class":285},[177,466,467],{"class":190}," Record any design decision discovered during the case.\n",[177,469,471,474,477],{"class":179,"line":470},37,[177,472,473],{"class":285},"9.",[177,475,476],{"class":367}," **Quality Gate (before commit)**",[177,478,434],{"class":190},[177,480,482,484,487],{"class":179,"line":481},38,[177,483,440],{"class":285},[177,485,486],{"class":190}," run ",[177,488,489],{"class":332},"`lint`\n",[177,491,493,495,497],{"class":179,"line":492},39,[177,494,440],{"class":285},[177,496,486],{"class":190},[177,498,499],{"class":332},"`format`\n",[177,501,503,505,507],{"class":179,"line":502},40,[177,504,440],{"class":285},[177,506,486],{"class":190},[177,508,509],{"class":332},"`knip`\n",[177,511,513,515],{"class":179,"line":512},41,[177,514,440],{"class":285},[177,516,517],{"class":190}," if any fail: fix minimally, keep scope constrained to the same TODO case.\n",[177,519,521,524,527],{"class":179,"line":520},42,[177,522,523],{"class":285},"10.",[177,525,526],{"class":367}," **Commit the case**",[177,528,529],{"class":190},".\n",[177,531,533,536],{"class":179,"line":532},43,[177,534,535],{"class":285},"11.",[177,537,538],{"class":190}," Move to the next TODO case.\n",[177,540,542],{"class":179,"line":541},44,[177,543,235],{"emptyLinePlaceholder":234},[177,545,547],{"class":179,"line":546},45,[177,548,549],{"class":211},"## Guardrails\n",[177,551,553],{"class":179,"line":552},46,[177,554,235],{"emptyLinePlaceholder":234},[177,556,558,560],{"class":179,"line":557},47,[177,559,286],{"class":285},[177,561,562],{"class":190}," Do not batch multiple TODO cases in one cycle.\n",[177,564,566,568],{"class":179,"line":565},48,[177,567,286],{"class":285},[177,569,570],{"class":190}," TODO must follow t-wada style, classical style TDD.\n",[177,572,574,577],{"class":179,"line":573},49,[177,575,576],{"class":285},"  -",[177,578,579],{"class":190}," Behavior-first.\n",[177,581,583,585],{"class":179,"line":582},50,[177,584,576],{"class":285},[177,586,587],{"class":190}," Outside-in thinking only when needed.\n",[177,589,591,593],{"class":179,"line":590},51,[177,592,576],{"class":285},[177,594,595],{"class":190}," Prefer state verification over interaction verification.\n",[177,597,599,601],{"class":179,"line":598},52,[177,600,576],{"class":285},[177,602,603],{"class":190}," No unnecessary mocking.\n",[177,605,607,609],{"class":179,"line":606},53,[177,608,286],{"class":285},[177,610,611],{"class":190}," Each TODO must represent a single observable behavior.\n",[177,613,615,617],{"class":179,"line":614},54,[177,616,286],{"class":285},[177,618,619],{"class":190}," Test cases must be written structurally.\n",[177,621,623],{"class":179,"line":622},55,[177,624,235],{"emptyLinePlaceholder":234},[177,626,628],{"class":179,"line":627},56,[177,629,630],{"class":190},"  Use the following structure:\n",[177,632,634,636],{"class":179,"line":633},57,[177,635,576],{"class":285},[177,637,638],{"class":190}," XXをするYY\n",[177,640,642,645],{"class":179,"line":641},58,[177,643,644],{"class":285},"    -",[177,646,647],{"class":190}," XX のとき YY となる\n",[177,649,651],{"class":179,"line":650},59,[177,652,235],{"emptyLinePlaceholder":234},[177,654,656,658],{"class":179,"line":655},60,[177,657,286],{"class":285},[177,659,660],{"class":190}," Test case names must be written in Japanese.\n",[177,662,664,666],{"class":179,"line":663},61,[177,665,286],{"class":285},[177,667,668],{"class":190}," Test names must describe behavior (condition + result), not method names.\n",[177,670,672,674],{"class":179,"line":671},62,[177,673,286],{"class":285},[177,675,676],{"class":190}," One test = one behavior.\n",[177,678,680,682],{"class":179,"line":679},63,[177,681,286],{"class":285},[177,683,684],{"class":190}," Do not test multiple branches in a single test.\n",[177,686,688,690],{"class":179,"line":687},64,[177,689,286],{"class":285},[177,691,692],{"class":190}," Avoid implementation detail assertions.\n",[177,694,696,698],{"class":179,"line":695},65,[177,697,286],{"class":285},[177,699,700],{"class":190}," Keep each step observable and explain why the change is needed.\n",[177,702,704,706],{"class":179,"line":703},66,[177,705,286],{"class":285},[177,707,708],{"class":190}," Prefer minimal deterministic diffs.\n",[177,710,712,714],{"class":179,"line":711},67,[177,713,286],{"class":285},[177,715,716],{"class":190}," Pause coding and return to discussion if disagreement appears.\n",[177,718,720,722],{"class":179,"line":719},68,[177,721,286],{"class":285},[177,723,724],{"class":190}," If scope changes, stop and re-align TODO/acceptance before continuing.\n",[177,726,728,730],{"class":179,"line":727},69,[177,729,286],{"class":285},[177,731,732],{"class":190}," Do not use English identifiers in test names unless domain terminology requires it.\n",[177,734,736],{"class":179,"line":735},70,[177,737,235],{"emptyLinePlaceholder":234},[177,739,741,743],{"class":179,"line":740},71,[177,742,286],{"class":285},[177,744,745],{"class":190}," The plan must be updated before every commit.\n",[177,747,749,751],{"class":179,"line":748},72,[177,750,286],{"class":285},[177,752,753],{"class":190}," Implementation and plan must remain consistent.\n",[177,755,757,759],{"class":179,"line":756},73,[177,758,286],{"class":285},[177,760,761],{"class":190}," No commit without plan alignment.\n",[177,763,765],{"class":179,"line":764},74,[177,766,235],{"emptyLinePlaceholder":234},[177,768,770],{"class":179,"line":769},75,[177,771,772],{"class":211},"## Commit Rules\n",[177,774,776],{"class":179,"line":775},76,[177,777,235],{"emptyLinePlaceholder":234},[177,779,781,783],{"class":179,"line":780},77,[177,782,286],{"class":285},[177,784,785],{"class":190}," Commit only after completing Red → Green → Refactor and passing the Quality Gate.\n",[177,787,789,791,794,797,800,803,805,808,810,813,815,818],{"class":179,"line":788},78,[177,790,286],{"class":285},[177,792,793],{"class":190}," Use short imperative commit messages with prefixes such as ",[177,795,796],{"class":332},"`test`",[177,798,799],{"class":190},", ",[177,801,802],{"class":332},"`fix`",[177,804,799],{"class":190},[177,806,807],{"class":332},"`refactor`",[177,809,799],{"class":190},[177,811,812],{"class":332},"`docs`",[177,814,799],{"class":190},[177,816,817],{"class":332},"`add`",[177,819,529],{"class":190},[177,821,823,825],{"class":179,"line":822},79,[177,824,286],{"class":285},[177,826,827],{"class":190}," Keep unrelated changes out of the commit.\n",[10,829,830,831,834],{},"効果的だと感じる文面は、",[43,832,833],{},"TODO must follow t-wada style, classical style TDD.","。",[21,836,837],{"id":837},"意識してること",[25,839,840,848,856,864],{},[28,841,842,843],{},"粒度の異なる計画書を作成して、コミット前に更新する\n",[32,844,845],{},[28,846,847],{},"進捗把握がしやすくなる",[28,849,850,851],{},"1テストケース単位でコミットすることでPR粒度を小さくする\n",[32,852,853],{},[28,854,855],{},"やりとりの頻度は増えるが、レビュー負荷が少なくなる",[28,857,858,859],{},"テストコードを重点的にレビューする\n",[32,860,861],{},[28,862,863],{},"テストコードを正しいガードレールに仕上げることを意識する",[28,865,866,867],{},"最初にシステムが満たすべき要件を自分で書いておく\n",[32,868,869,872,875],{},[28,870,871],{},"一番重要",[28,873,874],{},"事前に考えて抜いておくと、AIが書いたコードの妥当性をスムーズに判断できる",[28,876,877],{},"都度planで計画を立てるときにも、自分の手である程度要件を書いてからplanに投げる",[21,879,880],{"id":880},"悩み",[32,882,883,894],{},[28,884,885,886],{},"計画書はすぐ陳腐化する\n",[32,887,888,891],{},[28,889,890],{},"作業完了までは計画書を削除し、その際に意思決定をADRとして残すほうがいいかも",[28,892,893],{},"AIに読ませたり更新させる場合は少ない文章のほうがいいし",[28,895,896,897],{},"業務では実践できていない\n",[32,898,899,907],{},[28,900,901,902],{},"お金関係や規模の大きいシステム・チーム開発では上述のワークフローは使えていない\n",[32,903,904],{},[28,905,906],{},"プロダクションコードめちゃくちゃレビューしてる",[28,908,909],{},"あくまでも個人での開発や厳密さを要求されない部分でのフロー",[911,912,913],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .surfw, html code.shiki .surfw{--shiki-default:#005CC5;--shiki-default-font-weight:bold}html pre.shiki code .sqxcx, html code.shiki .sqxcx{--shiki-default:#E36209}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html pre.shiki code .sbYKK, html code.shiki .sbYKK{--shiki-default:#24292E;--shiki-default-font-weight:bold}",{"title":173,"searchDepth":187,"depth":187,"links":915},[916,917,918,919,920,923,924],{"id":23,"depth":187,"text":23},{"id":61,"depth":187,"text":61},{"id":74,"depth":187,"text":74},{"id":129,"depth":187,"text":129},{"id":137,"depth":187,"text":137,"children":921},[922],{"id":195,"depth":220,"text":196},{"id":837,"depth":187,"text":837},{"id":880,"depth":187,"text":880},"2026-02-20T00:00:00.000Z","2026/02/20時点で良い感触のワークフロー。","tech",{},null,"/articles/workflow-2026-02",{"title":5,"description":932},"2026/02/20時点で良い感触のワークフロー",{"loc":930,"lastmod":934},"2026-02-23","articles/workflow-2026-02",[937,938],"codex","workflow","2026-02-23T00:00:00.000Z","kxOYzKEEzFWdYAsT7erVhaQ7USBD192NkddJ2lLf5AY",[942,947],{"title":943,"path":944,"stem":945,"date":946,"children":-1},"WebStormでプロジェクトを開くと既存ウインドウが置き換わってしまう挙動を変える","/articles/webstorm-new-window","articles/webstorm-new-window","2026-02-27T00:00:00.000Z",{"title":948,"path":949,"stem":950,"date":951,"children":-1},"Codex CLI が git操作できないと言ってくる","/articles/codex-cli-has-not-xcode-lisence","articles/codex-cli-has-not-xcode-lisence","2026-02-12T00:00:00.000Z",1772952405473]