kokoro-baton 0.0.0-stage → 0.1.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.

Potentially problematic release.


This version of kokoro-baton might be problematic. Click here for more details.

Files changed (4) hide show
  1. package/LICENSE +91 -0
  2. package/README.md +80 -2
  3. package/dist/cli.js +348 -0
  4. package/package.json +29 -4
package/LICENSE ADDED
@@ -0,0 +1,91 @@
1
+ Required Notice: Copyright 2026 Kokoro OS / 千田正憲 (Masanori Chida) (https://usekokoro.com)
2
+
3
+ # PolyForm Shield License 1.0.0
4
+
5
+ <https://polyformproject.org/licenses/shield/1.0.0>
6
+
7
+ ## Acceptance
8
+
9
+ In order to get any license under these terms, you must agree to them as both strict obligations and conditions to all your licenses.
10
+
11
+ ## Copyright License
12
+
13
+ The licensor grants you a copyright license for the software to do everything you might do with the software that would otherwise infringe the licensor's copyright in it for any permitted purpose. However, you may only distribute the software according to [Distribution License](#distribution-license) and make changes or new works based on the software according to [Changes and New Works License](#changes-and-new-works-license).
14
+
15
+ ## Distribution License
16
+
17
+ The licensor grants you an additional copyright license to distribute copies of the software. Your license to distribute covers distributing the software with changes and new works permitted by [Changes and New Works License](#changes-and-new-works-license).
18
+
19
+ ## Notices
20
+
21
+ You must ensure that anyone who gets a copy of any part of the software from you also gets a copy of these terms or the URL for them above, as well as copies of any plain-text lines beginning with `Required Notice:` that the licensor provided with the software. For example:
22
+
23
+ > Required Notice: Copyright Yoyodyne, Inc. (http://example.com)
24
+
25
+ ## Changes and New Works License
26
+
27
+ The licensor grants you an additional copyright license to make changes and new works based on the software for any permitted purpose.
28
+
29
+ ## Patent License
30
+
31
+ The licensor grants you a patent license for the software that covers patent claims the licensor can license, or becomes able to license, that you would infringe by using the software.
32
+
33
+ ## Noncompete
34
+
35
+ Any purpose is a permitted purpose, except for providing any product that competes with the software or any product the licensor or any of its affiliates provides using the software.
36
+
37
+ ## Competition
38
+
39
+ Goods and services compete even when they provide functionality through different kinds of interfaces or for different technical platforms. Applications can compete with services, libraries with plugins, frameworks with development tools, and so on, even if they're written in different programming languages or for different computer architectures. Goods and services compete even when provided free of charge. If you market a product as a practical substitute for the software or another product, it definitely competes.
40
+
41
+ ## New Products
42
+
43
+ If you are using the software to provide a product that does not compete, but the licensor or any of its affiliates brings your product into competition by providing a new version of the software or another product using the software, you may continue using versions of the software available under these terms beforehand to provide your competing product, but not any later versions.
44
+
45
+ ## Discontinued Products
46
+
47
+ You may begin using the software to compete with a product or service that the licensor or any of its affiliates has stopped providing, unless the licensor includes a plain-text line beginning with `Licensor Line of Business:` with the software that mentions that line of business. For example:
48
+
49
+ > Licensor Line of Business: YoyodyneCMS Content Management System (http://example.com/cms)
50
+
51
+ ## Sales of Business
52
+
53
+ If the licensor or any of its affiliates sells a line of business developing the software or using the software to provide a product, the buyer can also enforce [Noncompete](#noncompete) for that product.
54
+
55
+ ## Fair Use
56
+
57
+ You may have "fair use" rights for the software under the law. These terms do not limit them.
58
+
59
+ ## No Other Rights
60
+
61
+ These terms do not allow you to sublicense or transfer any of your licenses to anyone else, or prevent the licensor from granting licenses to anyone else. These terms do not imply any other licenses.
62
+
63
+ ## Patent Defense
64
+
65
+ If you make any written claim that the software infringes or contributes to infringement of any patent, your patent license for the software granted under these terms ends immediately. If your company makes such a claim, your patent license ends immediately for work on behalf of your company.
66
+
67
+ ## Violations
68
+
69
+ The first time you are notified in writing that you have violated any of these terms, or done anything with the software not covered by your licenses, your licenses can nonetheless continue if you come into full compliance with these terms, and take practical steps to correct past violations, within 32 days of receiving notice. Otherwise, all your licenses end immediately.
70
+
71
+ ## No Liability
72
+
73
+ ***As far as the law allows, the software comes as is, without any warranty or condition, and the licensor will not be liable to you for any damages arising out of these terms or the use or nature of the software, under any kind of legal claim.***
74
+
75
+ ## Definitions
76
+
77
+ The **licensor** is the individual or entity offering these terms, and the **software** is the software the licensor makes available under these terms.
78
+
79
+ A **product** can be a good or service, or a combination of them.
80
+
81
+ **You** refers to the individual or entity agreeing to these terms.
82
+
83
+ **Your company** is any legal entity, sole proprietorship, or other kind of organization that you work for, plus all its affiliates.
84
+
85
+ **Affiliates** means the other organizations than an organization has control over, is under the control of, or is under common control with.
86
+
87
+ **Control** means ownership of substantially all the assets of an entity, or the power to direct its management and policies by vote, contract, or otherwise. Control can be direct or indirect.
88
+
89
+ **Your licenses** are all the licenses granted to you for the software under these terms.
90
+
91
+ **Use** means anything you do with the software requiring one of your licenses.
package/README.md CHANGED
@@ -1,3 +1,81 @@
1
- # Temporary Holding Version
1
+ # kokoro-baton
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Decide before you build.** Answer a few choice-based questions in your terminal and get a spec file (`kokoro-spec.md`) to hand to your AI coding tool.
4
+
5
+ ```bash
6
+ export ANTHROPIC_API_KEY=sk-ant-...
7
+ npx kokoro-baton "A flashcard app: English on the front, meaning on the back"
8
+ ```
9
+
10
+ ### Can I ask my AI to run it?
11
+
12
+ - **The questions: no.** They are for *you* to answer — an AI running it would answer them itself. Run `npx kokoro-baton "..."` yourself in a terminal.
13
+ - **Checking a spec you already have (`gaps`): yes.** Ask your AI coding tool (Claude Code etc.):
14
+
15
+ ```
16
+ Run npx kokoro-baton gaps kokoro-spec.md in this project and show me the result.
17
+ ```
18
+
19
+ **Needs your Anthropic API key on your machine** (`ANTHROPIC_API_KEY`). Set it once in your system's environment variables, then restart your AI tool — Windows: search "environment variables" in Settings; macOS/Linux: add `export ANTHROPIC_API_KEY=...` to `~/.zshrc` or `~/.bashrc`. ★Do not paste your key into the AI chat — it stays in the conversation history.
20
+
21
+ - **Free, no sign-up.** It runs on *your* Anthropic API key — AI costs (a fraction of a cent per round) are billed to that key.
22
+ - It asks what is still undecided — storage, what happens when empty, deleting, how many items — as **choices with consequences**, not open questions.
23
+ - It writes `kokoro-spec.md`: what you decided (core vs. later), what is still undecided, risky combinations to check first, and **how to check each decision after it is built**.
24
+ - Then: give the spec to Claude Code (or any AI), and run [`npx kokoro-aegis .`](https://www.npmjs.com/package/kokoro-aegis) to get a checklist of what you decided.
25
+
26
+ **Language:** English or Japanese — the questions, the options and the spec file all follow your system language. Force one with `--lang en` or `--lang ja`.
27
+
28
+ **How it works:** this tool only shows questions and collects your answers. The questioning itself runs on Kokoro OS (`/api/v1/baton/…`) with your key; nothing about your idea is stored on the server.
29
+
30
+ ### Already have a spec? Check what it doesn't answer
31
+
32
+ ```bash
33
+ npx kokoro-baton gaps my-spec.md
34
+ ```
35
+
36
+ Reads a spec you already wrote (any Markdown or text, or a `kokoro-spec.md`) and reports, for 5 points that every app has to decide, whether the spec answers them: where data is saved, the order of lists, empty or invalid input, confirmation before deleting, and who decides the contents of selectable items. Each point is marked **answered / not answered / not in this app**, so "nothing missing" is never just a silent empty list.
37
+
38
+ ### After building
39
+
40
+ - `npx kokoro-aegis .` — a hand-check table of what you decided, with no AI ([kokoro-aegis](https://www.npmjs.com/package/kokoro-aegis)).
41
+ - `npx kokoro-polish` — optional: have Claude Fable read your `check.html` and write a list of fixes ([kokoro-polish](https://www.npmjs.com/package/kokoro-polish)).
42
+
43
+ ## License
44
+
45
+ [PolyForm Shield 1.0.0](https://polyformproject.org/licenses/shield/1.0.0) — free to use for any purpose, including at work and commercially. You may not use it to build a product that competes with it.
46
+
47
+ ---
48
+
49
+ ## 日本語
50
+
51
+ **作る前に決める道具です。** ターミナルで選択肢つきの問いに答えると、AI に渡す指示書(`kokoro-spec.md`)ができます。
52
+
53
+ ```bash
54
+ npx kokoro-baton "英単語を覚えるカードを作りたい"
55
+ ```
56
+
57
+ ### AI に頼めますか?
58
+
59
+ - **問いに答える部分:頼めません。** 問いは、あなたが答えるものです。AI に動かしてもらうと、AI が代わりに答えてしまいます。ターミナルで自分で動かすか、画面の Baton を使ってください。
60
+ - **もう書いた仕様を確かめる部分(`gaps`):頼めます。** Claude Code などの AI に、こう頼んでください。
61
+
62
+ ```
63
+ このプロジェクトのフォルダで npx kokoro-baton gaps kokoro-spec.md を実行して、結果を見せてください。
64
+ ```
65
+
66
+ **あなたの Anthropic の API キーが、パソコンに入っている必要があります**(`ANTHROPIC_API_KEY`)。一度だけ入れておき、AI の道具を開き直してください。Windows:設定で「環境変数」と検索 →「アカウントの環境変数を編集」で新しく足す。Mac:`~/.zshrc` に `export ANTHROPIC_API_KEY=...` を足す。★キーを AI との会話に貼らないでください(会話の記録に残ります)。
67
+
68
+ - **無料・登録なし。** あなたの Anthropic の API キー(`ANTHROPIC_API_KEY`)で動き、AI の費用はそのキーに付きます(1 回あたり 1 円未満)。
69
+ - まだ決まっていないこと(保存のしかた・空のとき・消すとき・何件くらいか など)を、**選ぶとどうなるかつきの選択肢**で聞きます。
70
+ - 答え終わると `kokoro-spec.md` を書き出します。決めたこと(コアとあとで作るもの)・まだ決めていないこと・先に確かめたほうがいい組み合わせ・**決めたことごとの確かめ方**が入ります。
71
+ - できた指示書を Claude Code などに渡して作ってもらい、[`npx kokoro-aegis .`](https://www.npmjs.com/package/kokoro-aegis) で、決めたとおりかを確かめる表を出せます。
72
+ - この道具は、問いを出して答えを集めるだけです。問いを作る部分は Kokoro OS のサーバーで、あなたのキーを使って動きます。アイデアの中身はサーバーに残しません。
73
+ - **言葉**:日本語か英語。問い・選択肢・指示書のどれも、パソコンの言語の設定に合わせます。`--lang ja` / `--lang en` で決めることもできます。
74
+ - **もう仕様を書いてあるなら**:`npx kokoro-baton gaps 仕様のファイル` で、どの作品でも決めておくべき 5 つ(保存場所・並び順・空や変な入力・消すときの確認・選べる項目の中身を誰が決めるか)に、その仕様が答えているかを見られます。5 つそれぞれに「答えている/答えていない/このアプリには無い」が付きます。
75
+ - 画面で決めたいときは [Kokoro OS の Baton](https://usekokoro.com/kokoro-baton) を使えます。
76
+
77
+ **作ったあとで**
78
+ - `npx kokoro-aegis .` … 決めたとおりかを確かめる表を出します(AI は使いません)。
79
+ - `npx kokoro-polish` … 選んだときだけ、Claude Fable に check.html を読ませて「直してほしいことの紙」を作ります([kokoro-polish](https://www.npmjs.com/package/kokoro-polish))。
80
+
81
+ **使ってよい範囲**:PolyForm Shield 1.0.0。仕事でも商売でも自由に使えます。これと競合する製品を作るために使うことはできません。
package/dist/cli.js ADDED
@@ -0,0 +1,348 @@
1
+ #!/usr/bin/env node
2
+ "use strict";var tn=Object.create;var q=Object.defineProperty;var sn=Object.getOwnPropertyDescriptor;var rn=Object.getOwnPropertyNames;var an=Object.getPrototypeOf,cn=Object.prototype.hasOwnProperty;var ln=(n,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of rn(e))!cn.call(n,t)&&t!==o&&q(n,t,{get:()=>e[t],enumerable:!(r=sn(e,t))||r.enumerable});return n};var j=(n,e,o)=>(o=n!=null?tn(an(n)):{},ln(e||!n||!n.__esModule?q(o,"default",{value:n,enumerable:!0}):o,n));var k=j(require("node:fs")),T=j(require("node:path")),G=j(require("node:readline")),A=require("node:process"),X=j(require("node:os"));var v=n=>process.env[n]?.trim()||"";function H(n){let e=v("KOKORO_API_KEY"),o=v("ANTHROPIC_API_KEY");return e&&o?{\u7A2E\u985E:"\u81EA\u524D\uFF0BKokoro",\u898B\u51FA\u3057:{"x-kokoro-api-key":e,"x-anthropic-api-key":o}}:e&&n==="Kokoro\u3082"?{\u7A2E\u985E:"Kokoro",\u898B\u51FA\u3057:{"x-kokoro-api-key":e}}:o?{\u7A2E\u985E:"\u81EA\u524D",\u898B\u51FA\u3057:{"x-anthropic-api-key":o}}:null}function L(n,e){let o=!!v("KOKORO_API_KEY"),r=!!v("ANTHROPIC_API_KEY");return n==="\u81EA\u524D\u3060\u3051"&&o&&!r?e==="en"?"This step does not accept a Kokoro key alone yet. Also set your own Anthropic key in ANTHROPIC_API_KEY and run again (AI costs go to that key; a fee is taken from your Kokoro balance).":"\u3053\u306E\u6BB5\u306F\u3001\u307E\u3060 Kokoro \u306E\u30AD\u30FC\u3060\u3051\u3067\u306F\u52D5\u304D\u307E\u305B\u3093\u3002\u3054\u81EA\u5206\u306E Anthropic \u306E\u30AD\u30FC\u3082 ANTHROPIC_API_KEY \u306B\u5165\u308C\u3066\u304B\u3089\u3001\u3082\u3046\u4E00\u5EA6\u52D5\u304B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08AI \u306E\u8CBB\u7528\u306F\u305D\u306E\u30AD\u30FC\u306B\u3001\u624B\u6570\u6599\u306F Kokoro \u306E\u6B8B\u9AD8\u304B\u3089\uFF09\u3002":e==="en"?"No key found. Set ANTHROPIC_API_KEY (your own Anthropic key; AI costs go to that key, Kokoro OS charges nothing), then run again.":"\u30AD\u30FC\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093\u3002ANTHROPIC_API_KEY\uFF08\u3054\u81EA\u5206\u306E Anthropic \u306E\u30AD\u30FC\u30FBAI \u306E\u8CBB\u7528\u306F\u305D\u306E\u30AD\u30FC\u306B\u4ED8\u304D\u3001Kokoro OS \u306F\u6599\u91D1\u3092\u3044\u305F\u3060\u304D\u307E\u305B\u3093\uFF09\u3092\u5165\u308C\u3066\u304B\u3089\u3001\u3082\u3046\u4E00\u5EA6\u52D5\u304B\u3057\u3066\u304F\u3060\u3055\u3044\u3002"}function B(n,e){return n.\u7A2E\u985E==="Kokoro"?e==="en"?"Paying with your Kokoro key (AI costs from your Kokoro balance). To pay AI costs with your own Anthropic key, also set ANTHROPIC_API_KEY.":"Kokoro \u306E\u30AD\u30FC\u3067\u6255\u3044\u307E\u3059\uFF08AI \u306E\u8CBB\u7528\u3082 Kokoro \u306E\u6B8B\u9AD8\u304B\u3089\uFF09\u3002AI \u306E\u8CBB\u7528\u3092\u3054\u81EA\u5206\u306E Anthropic \u306E\u30AD\u30FC\u3067\u6255\u3046\u3068\u304D\u306F\u3001ANTHROPIC_API_KEY \u3082\u5165\u308C\u3066\u304F\u3060\u3055\u3044\u3002":n.\u7A2E\u985E==="\u81EA\u524D\uFF0BKokoro"?e==="en"?"AI costs go to your Anthropic key (ANTHROPIC_API_KEY). If a Kokoro fee applies, it is taken from your Kokoro balance (KOKORO_API_KEY) and shown after each call.":"AI \u306E\u8CBB\u7528\u306F\u3054\u81EA\u5206\u306E Anthropic \u306E\u30AD\u30FC\uFF08ANTHROPIC_API_KEY\uFF09\u306B\u4ED8\u304D\u307E\u3059\u3002Kokoro \u306E\u624B\u6570\u6599\u304C\u304B\u304B\u308B\u3068\u304D\u306F\u3001Kokoro \u306E\u6B8B\u9AD8\uFF08KOKORO_API_KEY\uFF09\u304B\u3089\u5F15\u3044\u3066\u3001\u547C\u3076\u305F\u3073\u306B\u984D\u3092\u51FA\u3057\u307E\u3059\u3002":e==="en"?"Paying AI costs with your Anthropic key (ANTHROPIC_API_KEY).":"AI \u306E\u8CBB\u7528\u306F\u3001\u3054\u81EA\u5206\u306E Anthropic \u306E\u30AD\u30FC\uFF08ANTHROPIC_API_KEY\uFF09\u3067\u6255\u3044\u307E\u3059\u3002"}var un={slide:{ja:{\u983C\u307F:"\u6307\u793A\u66F8 kokoro-spec.md\uFF08\u4E0A\u304B\u3089\u898B\u4E0B\u308D\u3059\u751F\u304D\u6B8B\u308A\u30A2\u30AF\u30B7\u30E7\u30F3\u30B2\u30FC\u30E0\u30FB\u7D04 3 \u4E07\u5B57\uFF09",markdown:`---
3
+ marp: true
4
+ paginate: true
5
+ ---
6
+
7
+ # \u6575\u304C\u8FEB\u3063\u3066\u304F\u308B\uFF0C\u6B66\u5668\u3092\u9078\u3093\u3067\u6483\u3064
8
+
9
+ \u4E0A\u304B\u3089\u898B\u4E0B\u308D\u3059\u30A2\u30AF\u30B7\u30E7\u30F3\u30B2\u30FC\u30E0\u3002\u6B66\u5668\u3092\u9078\u3093\u3067\u6575\u3092\u5012\u3059\uFF0C\u3067\u304D\u308B\u3060\u3051\u9577\u304F\u751F\u304D\u6B8B\u308B\u3002\u30D6\u30E9\u30A6\u30B6\u3067 1 \u679A\u306E HTML \u3067\u904A\u3079\u308B\u3002
10
+
11
+ <!--
12
+ \u3053\u306E\u30B2\u30FC\u30E0\u306E\u6838\u306F\u300C\u6B66\u5668\u3054\u3068\u306B\u7570\u306A\u308B\u653B\u6483\u7BC4\u56F2\u3068\u653B\u6483\u901F\u5EA6\u3067\uFF0C\u6575\u3092\u5012\u3059\u6C17\u6301\u3061\u3088\u3055\u300D\u3067\u3059\u3002\u898B\u305F\u76EE\u3067\u306F\u306A\u304F\uFF0C\u305D\u306E\u624B\u89E6\u308A\u3092\u6700\u521D\u306B\u5B8C\u6210\u3055\u305B\u307E\u3059\u3002
13
+ -->
14
+
15
+ ---
16
+
17
+ ## \u6B66\u5668\u3092\u9078\u3093\u3067\u3082\uFF0C\u5B9F\u611F\u304C\u7121\u3044
18
+
19
+ \u77ED\u5263\u30FB\u65A7\u30FB\u5F13 \u2015\u2015 \u9078\u3093\u3060\u6B66\u5668\u3067\uFF0C\u672C\u5F53\u306B\u4F55\u304C\u5909\u308F\u3063\u3066\u3044\u308B\u306E\u304B\u5206\u304B\u3089\u306A\u3044\u3002\u6575\u3092\u5012\u3059\u307E\u3067\u306E\u6D41\u308C\u304C\u9055\u3046\u3053\u3068\u3092\uFF0C\u4F53\u3067\u611F\u3058\u305F\u3044\u3002
20
+
21
+ <!--
22
+ \u3044\u307E\u8003\u3048\u3066\u3044\u308B\u306E\u306F\u300C\u653B\u6483\u7BC4\u56F2\u3068\u653B\u6483\u901F\u5EA6\u306F\u9055\u3046\u300D\u3068\u3044\u3046\u4ED5\u69D8\u3067\u3059\u3002\u3051\u308C\u3069\u3082\uFF0C\u305D\u308C\u304C\u753B\u9762\u3067\u660E\u78BA\u306B\u898B\u3048\u3066\uFF0C\u89E6\u3063\u305F\u3068\u304D\u9055\u3046\u624B\u89E6\u308A\u306B\u306A\u3063\u3066\u3044\u306A\u3051\u308C\u3070\uFF0C\u9078\u3093\u3060\u610F\u5473\u304C\u3042\u308A\u307E\u305B\u3093\u3002
23
+ -->
24
+
25
+ ---
26
+
27
+ ## 3 \u7A2E\u985E\u306E\u6B66\u5668\u3092\u4F5C\u308B\u3002\u7BC4\u56F2\u3082\u901F\u3055\u3082\uFF0C\u5927\u304D\u304F\u7570\u306A\u308B
28
+
29
+ \u77ED\u5263\uFF1A\u7BC4\u56F2 50px\u30FB\u653B\u6483 1 \u79D2 / \u65A7\uFF1A\u7BC4\u56F2 100px\u30FB\u653B\u6483 1.5 \u79D2 / \u5F13\uFF1A\u7BC4\u56F2 150px\u30FB\u653B\u6483 0.5 \u79D2\u3002\u9078\u3093\u3060\u3068\u304D\uFF0C\u305D\u306E\u5DEE\u304C\u5206\u304B\u308B\u3088\u3046\u306B\u3002
30
+
31
+ <!--
32
+ \u91CD\u8981\u306A\u306E\u306F\u300C\u5DEE\u304C\u5927\u304D\u3044\u300D\u3053\u3068\u3067\u3059\u3002\u534A\u5F84\u306E\u9055\u3044\uFF0C\u6575\u304C\u6D88\u3048\u308B\u307E\u3067\u306E\u6642\u9593\uFF0C\u653B\u6483\u304C\u5F53\u305F\u308B\u30DA\u30FC\u30B9 \u2015\u2015 \u3059\u3079\u3066\u3092\u904A\u3093\u3067\u3044\u308B\u9593\u305A\u3063\u3068\u898B\u3048\u308B\u5F62\u3067\u51FA\u3057\u307E\u3059\u3002\u30B2\u30FC\u30E0\u958B\u59CB\u6642\u306B\u9078\u3093\u3060\u6B66\u5668\u306E\u60C5\u5831\u3092\u53F3\u4E0A\u306B\u5E38\u6642\u8868\u793A\u3002
33
+ -->
34
+
35
+ ---
36
+
37
+ ## \u6575\u306E\u6D41\u308C\u306B\u5408\u308F\u305B\u3066\uFF0C\u6B66\u5668\u3092\u4F7F\u3044\u5206\u3051\u305F\u304F\u306A\u308B
38
+
39
+ \u6575\u306E\u6570\u304C\u5897\u3048\u308B\uFF0C\u6575\u306E\u901F\u3055\u304C\u4E0A\u304C\u308B\u3002\u305D\u308C\u306B\u5BFE\u3057\u3066\u300C\u3053\u306E\u6B66\u5668\u306A\u3089\u300D\u300C\u4ECA\u306A\u3089\u300D\u3068\uFF0C\u5224\u65AD\u3057\u3066\u9078\u3076\u9762\u767D\u3055\u3002\u6642\u9593\u304C\u7D4C\u3064\u306B\u3064\u308C\u96E3\u3057\u304F\u306A\u308B\u4E2D\u3067\uFF0C\u751F\u304D\u6B8B\u308B\u5FEB\u611F\u3002
40
+
41
+ <!--
42
+ \u904A\u3073\u306A\u304C\u3089\u300C\u7BC4\u56F2\u306E\u5E83\u3055\u304C\u6709\u5229\u306A\u5C40\u9762\u300D\u300C\u901F\u3055\u304C\u5FC5\u8981\u306A\u5C40\u9762\u300D\u304C\u81EA\u7136\u306B\u51FA\u3066\u304F\u308B\u3088\u3046\u306B\u8A2D\u8A08\u3057\u307E\u3059\u3002\u96E3\u6613\u5EA6\u306F 30 \u79D2\u3054\u3068\uFF0C\u307E\u305F\u306F\u6575\u306E\u6570\u3067\u6BB5\u968E\u7684\u306B\u4E0A\u3052\u3066\u3044\u304F\u3002\u6575\u306F\u5168\u65B9\u5411\u304B\u3089\u51FA\u73FE\u3057\uFF0C2\uFF5E3 \u7A2E\u985E\u304C\u7570\u306A\u308B\u901F\u3055\u3067\u8FEB\u3063\u3066\u304F\u308B\u3002
43
+ -->
44
+
45
+ ---
46
+
47
+ ## \u9078\u3093\u3060\u6B66\u5668\u304C\uFF0C\u672C\u5F53\u306B\u9055\u3046\u3002\u305D\u308C\u304C\u6C17\u6301\u3061\u3044\u3044
48
+
49
+ \u30AD\u30FC\u30DC\u30FC\u30C9\u3067\u52D5\u304F\uFF0C\u6575\u306B\u8FD1\u3065\u304F\u3068\u81EA\u52D5\u3067\u653B\u6483\u3002HP \u304C\u6E1B\u3063\u3066\u30B2\u30FC\u30E0\u30AA\u30FC\u30D0\u30FC\u3002\u6642\u9593\u304C\u51FA\u3066\u3044\u308B\u3002 \u2015\u2015 \u5168\u90E8\u304C\u6B66\u5668\u306E\u9078\u629E\u306B\u3064\u306A\u304C\u308B\u3002
50
+
51
+ <!--
52
+ \u6700\u5F8C\u306B\u899A\u3048\u3066\u307B\u3057\u3044\u306E\u306F\u300C\u898B\u305F\u76EE\u3067\u306F\u306A\u304F\uFF0C\u624B\u89E6\u308A\u3092\u5B8C\u6210\u3055\u305B\u308B\u300D\u3068\u3044\u3046\u3053\u3068\u3067\u3059\u3002\u6B66\u5668\u3092\u9078\u3093\u3060\u77AC\u9593\u304B\u3089\uFF0C\u6575\u3068\u306E\u8DDD\u96E2\u306E\u53D6\u308A\u65B9\u30FB\u6575\u304C\u6D88\u3048\u308B\u30B9\u30D4\u30FC\u30C9\u30FB\u6B21\u306E\u6575\u307E\u3067\u306E\u9593\u9694 \u2015\u2015 \u5168\u90E8\u304C\u9055\u3046\u3002\u305D\u306E\u9055\u3044\u3092\u904A\u3093\u3067\u3044\u3066\u81EA\u7136\u306B\u611F\u3058\u3089\u308C\u308B\u3053\u3068\u3002
53
+ -->
54
+
55
+ ---
56
+
57
+ ## \u307E\u305A\u6700\u5C0F\u7248\u3067\u8A66\u3059\u3002\u898B\u305F\u76EE\u306F\u5F8C\u56DE\u3057
58
+
59
+ \u7B2C 1 \u6BB5\u968E\uFF1A\u30B3\u30A2\u3060\u3051\u4F5C\u308B\u3002UI \u306F\u78E8\u304B\u306A\u3044\u3002\u624B\u89E6\u308A\u304C\u5B8C\u6210\u3057\u305F\u3089\u898B\u305B\u3066\u304F\u3060\u3055\u3044\u3002\u305D\u3053\u304B\u3089\u76F4\u3057\u307E\u3059\u3002
60
+
61
+ <!--
62
+ \u8272\u3092\u5857\u308B\u30FB\u80CC\u666F\u3092\u4F5C\u308B \u2015\u2015 \u305D\u308C\u306F\u5168\u90E8\u3042\u3068\u3067\u3059\u3002\u3044\u307E\u5927\u4E8B\u306A\u306E\u306F\u300C\u6575\u3092\u5012\u3059\u3053\u3068\u306E\u6C17\u6301\u3061\u3088\u3055\u300D\u3060\u3051\u3002\u305D\u308C\u304C\u5B9F\u73FE\u3067\u304D\u305F\u3089\uFF0C\u6B21\u306E\u6BB5\u968E\u306B\u9032\u307F\u307E\u3059\u3002
63
+ -->
64
+ `},en:{\u983C\u307F:"Announcement for next week's study session. Topic: how to build a simple household budget app. Thursday 7pm, online, free, beginners welcome.",markdown:`---
65
+ marp: true
66
+ paginate: true
67
+ ---
68
+
69
+ # Build Your First Budget App
70
+
71
+ Next Thursday \xB7 7pm \xB7 Online \xB7 Free
72
+
73
+ <!--
74
+ We're hosting a hands-on session next week where you'll learn to build a simple budget app from scratch. No coding experience needed\u2014if you can follow along, you're in. It's a short evening, but you'll walk away with working code.
75
+ -->
76
+
77
+ ---
78
+
79
+ ## Why This Matters
80
+
81
+ Managing money feels complicated. Apps exist, but how do they work?
82
+
83
+ <!--
84
+ Most people use budget apps but never look under the hood. This session flips that: you'll see the mechanics yourself, understand how data flows, and realize it's not magic\u2014just logic.
85
+ -->
86
+
87
+ ---
88
+
89
+ ## What We'll Build
90
+
91
+ A working budget app \xB7 Input income & expenses \xB7 See your balance
92
+
93
+ <!--
94
+ We'll code a simple app that takes income and spending, stores it, and shows your current balance. Step by step, no jumping around. You'll have real, runnable code by the end.
95
+ -->
96
+
97
+ ---
98
+
99
+ ## What You Get
100
+
101
+ Working knowledge of app basics \xB7 Confidence to build more
102
+
103
+ <!--
104
+ You'll understand how apps store and display data. That foundation opens doors to learning more complex apps later. Plus, you can show it to friends or use it yourself.
105
+ -->
106
+
107
+ ---
108
+
109
+ ## One Word
110
+
111
+ Learn by making, not by watching.
112
+
113
+ <!--
114
+ This isn't a lecture. You'll write code and see it work in real time. That's how it sticks\u2014and how you actually learn.
115
+ -->
116
+
117
+ ---
118
+
119
+ ## Join Us
120
+
121
+ Thursday 7pm \xB7 Sign up now \xB7 Bring a laptop
122
+
123
+ <!--
124
+ It's free, online, and open to everyone. All you need is a device and curiosity. See you there.
125
+ -->
126
+ `}},kami:{ja:{\u983C\u307F:"\u308A\u3093\u3054\u30FB\u307F\u304B\u3093\u30FB\u30D0\u30CA\u30CA\u306E\u6804\u990A\uFF08100g \u3042\u305F\u308A\u306E\u30AB\u30ED\u30EA\u30FC\u30FB\u30D3\u30BF\u30DF\u30F3 C\u30FB\u98DF\u7269\u7E4A\u7DAD\uFF09\u3092\u6BD4\u3079\u308B",markdown:`# \u679C\u7269\u306E\u6804\u990A\u6BD4\u8F03\uFF08100g \u3042\u305F\u308A\uFF09
127
+
128
+ \u308A\u3093\u3054\u30FB\u307F\u304B\u3093\u30FB\u30D0\u30CA\u30CA\u306E100g \u3042\u305F\u308A\u306E\u30AB\u30ED\u30EA\u30FC\u30FB\u30D3\u30BF\u30DF\u30F3 C\u30FB\u98DF\u7269\u7E4A\u7DAD\u3092\u6BD4\u8F03\u3057\u305F\u8868\u3002
129
+
130
+ | \u679C\u7269 | \u30AB\u30ED\u30EA\u30FC\uFF08kcal\uFF09 | \u30D3\u30BF\u30DF\u30F3 C\uFF08mg\uFF09 | \u98DF\u7269\u7E4A\u7DAD\uFF08g\uFF09 |
131
+ | --- | --- | --- | --- |
132
+ | \u308A\u3093\u3054 | 61 | 4 | 1.5 |
133
+ | \u307F\u304B\u3093 | 45 | 33 | 1.6 |
134
+ | \u30D0\u30CA\u30CA | 89 | 16 | 1.1 |
135
+ `,csv:`\u679C\u7269,\u30AB\u30ED\u30EA\u30FC\uFF08kcal\uFF09,\u30D3\u30BF\u30DF\u30F3 C\uFF08mg\uFF09,\u98DF\u7269\u7E4A\u7DAD\uFF08g\uFF09\r
136
+ \u308A\u3093\u3054,61,4,1.5\r
137
+ \u307F\u304B\u3093,45,33,1.6\r
138
+ \u30D0\u30CA\u30CA,89,16,1.1\r
139
+ `},en:{\u983C\u307F:"Compare apples, oranges and bananas: calories, vitamin C and fiber per 100 g",markdown:`# Nutritional Comparison of Apples, Oranges, and Bananas
140
+
141
+ Nutritional content per 100g for three common fruits. Bananas are highest in calories, oranges excel in vitamin C, and all three provide similar fiber content.
142
+
143
+ | Fruit | Calories (kcal) | Vitamin C (mg) | Fiber (g) |
144
+ | --- | --- | --- | --- |
145
+ | Apple | 52 | 5.7 | 2.4 |
146
+ | Orange | 47 | 53.2 | 2.4 |
147
+ | Banana | 89 | 8.7 | 2.6 |
148
+
149
+ **How columns were worked out**
150
+
151
+ - Calories (kcal): per 100g
152
+ - Vitamin C (mg): per 100g
153
+ - Fiber (g): per 100g
154
+ `,csv:`Fruit,Calories (kcal),Vitamin C (mg),Fiber (g)\r
155
+ Apple,52,5.7,2.4\r
156
+ Orange,47,53.2,2.4\r
157
+ Banana,89,8.7,2.6\r
158
+ `}},writer:{ja:{\u983C\u307F:"\u6765\u9031\u306E\u5B9A\u4F8B\u306F\u6728\u66DC15\u6642\u304B\u3089\u3002\u8B70\u984C\u306F\u3075\u305F\u3064\u3002\u65B0\u3057\u3044\u30A2\u30D7\u30EA\u306E\u540D\u524D\u30923\u6848\u304B\u3089\u6C7A\u3081\u308B\u3053\u3068\u3001\u516C\u958B\u65E5\u3092\u6C7A\u3081\u308B\u3053\u3068\u3002\u516C\u958B\u65E5\u306F11\u6708\u4E2D\u65EC\u3067\u8ABF\u6574\u4E2D\u3002\u5C71\u7530\u3055\u3093\u304C\u540D\u524D\u306E\u6848\u3092\u307E\u3068\u3081\u3066\u304F\u308B\u3002\uFF08--format minutes\uFF09",markdown:`# \u6765\u9031\u306E\u5B9A\u4F8B \u8B70\u4E8B\u9332
159
+
160
+ ### \u57FA\u672C\u60C5\u5831
161
+
162
+ \u65E5\u6642\uFF1A\u6765\u9031\u6728\u66DC15\u6642
163
+
164
+ \u5834\u6240\uFF1A[\u8981\u8FFD\u8A18: \u958B\u50AC\u5834\u6240]
165
+
166
+ \u51FA\u5E2D\u8005\uFF1A[\u8981\u8FFD\u8A18: \u51FA\u5E2D\u8005\u540D]
167
+
168
+ \u8A18\u9332\u8005\uFF1A[\u8981\u8FFD\u8A18: \u8A18\u9332\u8005\u540D]
169
+
170
+ ## \u8B70\u984C
171
+
172
+ 1. \u65B0\u3057\u3044\u30A2\u30D7\u30EA\u306E\u540D\u524D\u30923\u6848\u304B\u3089\u6C7A\u3081\u308B\u3053\u3068
173
+ 2. \u516C\u958B\u65E5\u3092\u6C7A\u3081\u308B\u3053\u3068
174
+
175
+ ### \u8B70\u984C1: \u65B0\u3057\u3044\u30A2\u30D7\u30EA\u306E\u540D\u524D\u30923\u6848\u304B\u3089\u6C7A\u3081\u308B\u3053\u3068
176
+
177
+ \u5C71\u7530\u3055\u3093\u304C\u540D\u524D\u306E\u6848\u3092\u307E\u3068\u3081\u3066\u304F\u308B\u3002
178
+
179
+ ### \u8B70\u984C2: \u516C\u958B\u65E5\u3092\u6C7A\u3081\u308B\u3053\u3068
180
+
181
+ \u516C\u958B\u65E5\u306F11\u6708\u4E2D\u65EC\u3067\u8ABF\u6574\u4E2D\u3002
182
+
183
+ ## \u30A2\u30AF\u30B7\u30E7\u30F3\u30A2\u30A4\u30C6\u30E0
184
+
185
+ - \u5C71\u7530\u3055\u3093 / \u65B0\u3057\u3044\u30A2\u30D7\u30EA\u306E\u540D\u524D\u306E\u6848\u3092\u307E\u3068\u3081\u308B / \u6765\u9031\u6728\u66DC15\u6642\u307E\u3067\u306B
186
+ `},en:{\u983C\u307F:"Next weekly meeting is Thursday at 3pm. Two topics: pick the new app name from three ideas, and set the launch date. Launch is being planned for mid-November. Yamada will bring the name ideas. (--format minutes)",markdown:`# Weekly Meeting
187
+
188
+ ### Basic Information
189
+
190
+ Date: Thursday at 3pm
191
+
192
+ Attendees: [\u8981\u8FFD\u8A18: \u51FA\u5E2D\u8005\u540D]
193
+
194
+ Recorder: [\u8981\u8FFD\u8A18: \u8A18\u9332\u8005\u540D]
195
+
196
+ ## Agenda
197
+
198
+ 1. Pick the new app name from three ideas
199
+ 2. Set the launch date
200
+
201
+ ### Topic 1: Pick the new app name from three ideas
202
+
203
+ Yamada will bring the name ideas.
204
+
205
+ ### Topic 2: Set the launch date
206
+
207
+ Launch is being planned for mid-November.
208
+
209
+ ## Action Items
210
+
211
+ - Yamada: Bring the name ideas to Thursday meeting
212
+
213
+ ### Next Meeting
214
+
215
+ Thursday at 3pm
216
+ `}},baton:{ja:{\u983C\u307F:"\u4E0A\u304B\u3089\u898B\u4E0B\u308D\u3059\u30A2\u30AF\u30B7\u30E7\u30F3\u30B2\u30FC\u30E0\u3002\u8FEB\u3063\u3066\u304F\u308B\u6575\u3092\u5012\u3057\u306A\u304C\u3089\u3001\u3067\u304D\u308B\u3060\u3051\u9577\u304F\u751F\u304D\u6B8B\u308B\u3002\u6700\u521D\u306B\u6B66\u5668\u3092\u9078\u3079\u308B\u3002\u30D6\u30E9\u30A6\u30B6\u3067\u904A\u3079\u308B 1 \u679A\u306E HTML \u3067\u4F5C\u308A\u305F\u3044\u3002\uFF08\u3053\u306E\u3042\u3068\u554F\u3044\u306B 3 \u56DE\u7B54\u3048\u3066\u3001\u5408\u683C\u306E\u6848\u3092\u9078\u3093\u3060\uFF09",markdown:`# \u4F5C\u3063\u3066\u307B\u3057\u3044\u3082\u306E
217
+
218
+ \u4E0A\u304B\u3089\u898B\u4E0B\u308D\u3059\u30A2\u30AF\u30B7\u30E7\u30F3\u30B2\u30FC\u30E0\u3002\u8FEB\u3063\u3066\u304F\u308B\u6575\u3092\u5012\u3057\u306A\u304C\u3089\u3001\u3067\u304D\u308B\u3060\u3051\u9577\u304F\u751F\u304D\u6B8B\u308B\u3002\u6700\u521D\u306B\u6B66\u5668\u3092\u9078\u3079\u308B\u3002\u30D6\u30E9\u30A6\u30B6\u3067\u904A\u3079\u308B 1 \u679A\u306E HTML \u3067\u4F5C\u308A\u305F\u3044\u3002
219
+
220
+ ## \u2605\u3053\u308C\u304C\u3067\u304D\u305F\u3089\u5408\u683C
221
+
222
+ \u77ED\u5263\u30FB\u65A7\u30FB\u5F13\u306E 3 \u3064\u306E\u6B66\u5668\u304B\u3089\u9078\u3093\u3067\u3001\u305D\u308C\u305E\u308C\u306E\u653B\u6483\u7BC4\u56F2\u3068\u653B\u6483\u901F\u5EA6\u306E\u9055\u3044\u3092\u611F\u3058\u306A\u304C\u3089\u6575\u3092\u5012\u3059\u3002\u6642\u9593\u304C\u7D4C\u3064\u306B\u3064\u308C\u3001\u6575\u304C\u5897\u3048\u3066\u901F\u304F\u306A\u308B\u3002
223
+
224
+ \u203B\u3053\u306E\u4E00\u6587\u306F\u3001Baton \u304C\u51FA\u3057\u305F\u6848\u304B\u3089\u9078\u3093\u3060\u3082\u306E\u3067\u3059\u3002
225
+
226
+ \u2605**\u3053\u308C\u304C\u3001\u3053\u306E\u9053\u5177\u306E\u3044\u3061\u3070\u3093\u5927\u4E8B\u306A\u3068\u3053\u308D\u3067\u3059\u3002**
227
+ \u3053\u3053\u304C\u6C17\u6301\u3061\u3088\u304F\u52D5\u304F\u307E\u3067\u306F\u3001\u307B\u304B\u3092\u4F5C\u308A\u8FBC\u307E\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
228
+
229
+ ## \u524D\u63D0 \u2015 \u4F7F\u3046\u4EBA\u30FB\u5834\u9762\uFF08\u89E6\u3063\u3066\u78BA\u304B\u3081\u308B\u884C\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09
230
+
231
+ **\u8AB0\u304C\u30FB\u3069\u3093\u306A\u5834\u9762\u3067\u30FB\u3069\u308C\u304F\u3089\u3044\u4F7F\u3046\u304B\u3002**\u4F5C\u308A\u65B9\u3092\u6C7A\u3081\u308B\u624B\u304C\u304B\u308A\u306B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
232
+ \u30A2\u30D7\u30EA\u3092\u89E6\u3063\u3066\u3082\u78BA\u304B\u3081\u3088\u3046\u304C\u306A\u3044\u306E\u3067\u3001\u78BA\u304B\u3081\u308B\u8868\u306B\u306F\u8F09\u305B\u307E\u305B\u3093\u3002
233
+
234
+ - \u753B\u9762\u306E\u5927\u304D\u3055\u306F\u3001\u3069\u306E\u304F\u3089\u3044\u3092\u60F3\u5B9A\u3057\u3066\u3044\u307E\u3059\u304B: **\u30D1\u30BD\u30B3\u30F3\u306E\u753B\u9762\uFF08\u5E45 800px \u4EE5\u4E0A\uFF09**
235
+ - \u6575\u306E\u7A2E\u985E\u306F\u4F55\u7A2E\u985E\u3044\u307E\u3059\u304B: **2\uFF5E3\u7A2E\u985E**
236
+
237
+ ## \u6C7A\u307E\u3063\u3066\u3044\u308B\u3053\u3068 \u2015 \u30B3\u30A2\uFF08\u4F53\u9A13\uFF09
238
+
239
+ **\u3053\u306E\u9053\u5177\u3092\u4F7F\u3063\u3066\u3044\u308B\u3001\u3044\u3061\u3070\u3093\u77ED\u3044\u6642\u9593\u306B\u8D77\u304D\u308B\u3053\u3068\u3002**
240
+ \u307E\u305A\u3053\u3053\u3060\u3051\u3092\u4F5C\u308A\u307E\u3059\u3002
241
+
242
+ - \u6575\u306F\u3069\u306E\u30DA\u30FC\u30B9\u3067\u8FEB\u3063\u3066\u304D\u307E\u3059\u304B: **\u6642\u9593\u7D4C\u904E\u3068\u3068\u3082\u306B\u3001\u6BB5\u968E\u7684\u306B\u96E3\u3057\u304F\u306A\u308B**
243
+ - \u6575\u3092\u5012\u3059\u306B\u306F\u3001\u3069\u3046\u64CD\u4F5C\u3057\u307E\u3059\u304B: **\u6575\u306B\u8FD1\u3065\u304F\u3068\u81EA\u52D5\u3067\u653B\u6483\u3059\u308B**
244
+ - \u653B\u6483\u306E\u7BC4\u56F2\u306F\u3001\u3069\u306E\u6B66\u5668\u3092\u9078\u3093\u3067\u3082\u540C\u3058\u3067\u3059\u304B: **\u9078\u3093\u3060\u6B66\u5668\u3067\u7BC4\u56F2\u304C\u5909\u308F\u308B**
245
+ - \u30D7\u30EC\u30A4\u30E4\u30FC\u304C\u6575\u306B\u5F53\u305F\u308B\u3068\u3069\u3046\u306A\u308A\u307E\u3059\u304B: **\u5F53\u305F\u308B\u305F\u3073\u306BHP \u304C\u6E1B\u308A\u30010 \u306B\u306A\u308B\u3068\u30B2\u30FC\u30E0\u30AA\u30FC\u30D0\u30FC**
246
+ - \u30B2\u30FC\u30E0\u30AA\u30FC\u30D0\u30FC\u306B\u306A\u3063\u305F\u3089\u3001\u6B21\u306F\u4F55\u304C\u3067\u304D\u307E\u3059\u304B: **\u3082\u3046\u4E00\u5EA6\u3001\u6B66\u5668\u3092\u9078\u3093\u3067\u304B\u3089\u518D\u30B9\u30BF\u30FC\u30C8**
247
+ - \u30B9\u30B3\u30A2\uFF08\u751F\u304D\u6B8B\u3063\u305F\u6642\u9593\u3084\u30B9\u30B3\u30A2\uFF09\u3092\u753B\u9762\u306B\u8868\u793A\u3057\u307E\u3059\u304B: **\u5E38\u306B\u8868\u793A\u3059\u308B**
248
+ - \u30AD\u30FC\u64CD\u4F5C\u3068\u30DE\u30A6\u30B9\u64CD\u4F5C\u3001\u3069\u3061\u3089\u3067\u52D5\u304B\u3057\u307E\u3059\u304B: **\u30AD\u30FC\u30DC\u30FC\u30C9\uFF08\u77E2\u5370\u30AD\u30FC\u3084 WASD\uFF09**
249
+ - \u6B66\u5668\u306E\u9055\u3044\u306F\u3001\u653B\u6483\u7BC4\u56F2\u3060\u3051\u3067\u3059\u304B: **\u7BC4\u56F2\u3068\u3001\u6575\u3092\u5012\u3059\u901F\u3055\uFF08\u653B\u6483\u529B\uFF09\u3082\u9055\u3046**
250
+ - \u6575\u306F\u4F55\u65B9\u5411\u304B\u3089\u8FEB\u3063\u3066\u304D\u307E\u3059\u304B: **\u753B\u9762\u306E\u5168\u65B9\u5411\u304B\u3089**
251
+ - \u6575\u304C\u5012\u3055\u308C\u305F\u3068\u304D\u3001\u6575\u306E\u4F53\u304C\u6D88\u3048\u308B\u307E\u3067\u306E\u6642\u9593\u306F: **\u5C11\u3057\u6B8B\u3063\u3066\u304B\u3089\u6D88\u3048\u308B\uFF080.5\u79D2\u306A\u3069\uFF09**
252
+ - \u6575\u306F\u3059\u3079\u3066\u540C\u3058\u901F\u3055\u3067\u8FEB\u3063\u3066\u304D\u307E\u3059\u304B: **\u6575\u306E\u7A2E\u985E\u3067\u901F\u3055\u304C\u9055\u3046**
253
+ - \u30B2\u30FC\u30E0\u3092\u4E00\u6642\u505C\u6B62\u3067\u304D\u307E\u3059\u304B: **\u30AD\u30FC\u3092\u62BC\u3059\u3068\u4E00\u6642\u505C\u6B62\u3067\u304D\u308B**
254
+ - \u96E3\u3057\u304F\u306A\u308B\u30DA\u30FC\u30B9\u306F\u3001\u3069\u306E\u304F\u3089\u3044\u306E\u901F\u3055\u3067\u3059\u304B: **30\u79D2\u3054\u3068\u3001\u307E\u305F\u306F\u6575\u306E\u6570\u3067\u6BB5\u968E\u7684\u306B**
255
+ - \u6B66\u5668\u306F\u4F55\u7A2E\u985E\u304B\u3089\u9078\u3079\u307E\u3059\u304B: **3\u7A2E\u985E**
256
+ - \u30B2\u30FC\u30E0\u958B\u59CB\u6642\u306B\u3001\u9078\u3093\u3060\u6B66\u5668\u306E\u60C5\u5831\uFF08\u7BC4\u56F2\u3084\u653B\u6483\u529B\uFF09\u3092\u753B\u9762\u306B\u8868\u793A\u3057\u307E\u3059\u304B: **\u8868\u793A\u3059\u308B**
257
+ - \u6575\u304C\u540C\u6642\u306B\u753B\u9762\u4E0A\u306B\u4F55\u4F53\u304F\u3089\u3044\u3044\u307E\u3059\u304B: **\u6570\u5341\u4F53\u4EE5\u4E0A**
258
+ - \u96E3\u6613\u5EA6\u304C\u4E0A\u304C\u308B\u3068\u304D\u3001\u6575\u306E\u6570\u3092\u5897\u3084\u3057\u307E\u3059\u304B\u3001\u6575\u306E\u30B9\u30D4\u30FC\u30C9\u3092\u4E0A\u3052\u307E\u3059\u304B\u3001\u305D\u308C\u3068\u3082\u4E21\u65B9\u3067\u3059\u304B: **\u4E21\u65B9\u5897\u3084\u3059**
259
+ - \u6B66\u5668\u3054\u3068\u306E\u653B\u6483\u7BC4\u56F2\u306E\u9055\u3044\u3092\u3001\u6570\u5B57\u3067\u6559\u3048\u3066\u3082\u3089\u3048\u307E\u3059\u304B\uFF08\u4F8B\uFF1A\u5E83\u3044\uFF1D\u534A\u5F84100px\u3001\u72ED\u3044\uFF1D\u534A\u5F8450px\uFF09: **\u5927\u304D\u304F\u7570\u306A\u308B\uFF08\u4F8B\uFF1A\u534A\u5F8450px vs 100px\uFF09**
260
+ - \u6B66\u5668\u306E\u653B\u6483\u901F\u5EA6\uFF08\u6575\u3092\u5012\u3059\u307E\u3067\u306E\u6642\u9593\uFF09\u306E\u9055\u3044\u3092\u3001\u6570\u5B57\u3067\u6559\u3048\u3066\u3082\u3089\u3048\u307E\u3059\u304B: **\u901F\u3044\u6B66\u5668\u306F0.5\u79D2\u3001\u9045\u3044\u6B66\u5668\u306F1\u79D2\u306A\u3069\u3001\u660E\u78BA\u306B\u7570\u306A\u308B**
261
+ - \u30B2\u30FC\u30E0\u753B\u9762\u306E\u80CC\u666F\u306F\u3001\u4F55\u304B\u8868\u793A\u3057\u307E\u3059\u304B\uFF08\u4F8B\uFF1A\u30B0\u30EA\u30C3\u30C9\u3001\u5730\u9762\u306E\u30C6\u30AF\u30B9\u30C1\u30E3\u3001\u4F55\u3082\u306A\u3044\uFF09: **\u30B0\u30EA\u30C3\u30C9\u3084\u5E8A\u306E\u30C6\u30AF\u30B9\u30C1\u30E3\u3092\u8868\u793A**
262
+
263
+ \uFF08\u3053\u3053\u307E\u3067\u304C\u629C\u7C8B\u3067\u3059\u3002\u5B9F\u7269\u306B\u306F\u3001\u3053\u306E\u3042\u3068\u300C\u307E\u3060\u6C7A\u307E\u3063\u3066\u3044\u306A\u3044\u3053\u3068\u300D\u300C\u8ABF\u6574\u3059\u308B\u6570\u306E\u7F6E\u304D\u5834\u6240\u300D\u300C\u4F5C\u308B\u9806\u756A\u300D\u300C\u78BA\u304B\u3081\u65B9\u300D\u306A\u3069\u306E\u7BC0\u304C\u7D9A\u304D\u307E\u3059\u3002\uFF09
264
+ `}}};function pn(n,e){let o=un[n];return{\u898B\u672C:o[e]??o.ja,\u8A00\u8449:o[e]?e:"ja"}}function W(n,e,o,r,t){return r==="en"?["This is a SAMPLE. No AI was run, nothing was sent, and it cost nothing.",`Request used for this sample: ${e}`,...t?["(This sample is only available in Japanese.)"]:[],`Wrote: ${o.join(", ")}`,`To make your own, set ANTHROPIC_API_KEY (your own Anthropic key) and run: ${n.en}`].join(`
265
+ `):["\u3053\u308C\u306F\u898B\u672C\u3067\u3059\u3002AI \u306F\u52D5\u3044\u3066\u3044\u307E\u305B\u3093\uFF08\u3069\u3053\u306B\u3082\u9001\u3063\u3066\u3044\u307E\u305B\u3093\u30FB\u8CBB\u7528 0\uFF09\u3002",`\u3053\u306E\u898B\u672C\u306E\u983C\u307F: ${e}`,`\u66F8\u3044\u305F\u30D5\u30A1\u30A4\u30EB: ${o.join("\u3001")}`,`\u81EA\u5206\u306E\u983C\u307F\u3067\u4F5C\u308B\u3068\u304D\u306F\u3001ANTHROPIC_API_KEY\uFF08\u3054\u81EA\u5206\u306E Anthropic \u306E\u30AD\u30FC\uFF09\u3092\u5165\u308C\u3066\u304B\u3089: ${n.ja}`].join(`
266
+ `)}function F(n,e,o,r){let{\u898B\u672C:t,\u8A00\u8449:i}=pn(n,e),a=n==="baton"?"kokoro-spec":`kokoro-${n}`,h=e==="en"?"-sample":"\uFF08\u898B\u672C\uFF09",u=g=>{let c=`${a}${h}${g}`;for(let w=2;r(c);w+=1)c=`${a}${h}-${w}${g}`;return c},s=[],p=u(".md");if(o(p,t.markdown),s.push(p),t.csv){let g=u(".csv");o(g,"\uFEFF"+t.csv),s.push(g)}return{\u66F8\u3044\u305F:s,\u898B\u672C:t,\u65E5\u672C\u8A9E\u3060\u3051:i!==e}}function M(n,e){return e==="en"?`To see a sample first (no key, no cost): ${n} --demo`:`\u307E\u305A\u898B\u672C\u3092\u898B\u308B\u3068\u304D\u306F\uFF08\u30AD\u30FC\u4E0D\u8981\u30FB\u8CBB\u7528 0\uFF09: ${n} --demo`}function gn(n,e="ja",o){let r=Y(n,o);return r.length?e==="en"?`
267
+ ## \u2605The requester's design laws \u2014 follow these for the look
268
+
269
+ These are look rules the requester decided themselves (not an AI's taste).
270
+ - Values and decisions the requester wrote in "Decisions made while building" win over these laws
271
+ - Decisions made by a tool (AI) lose to these laws. If they clash, follow the law
272
+ - If a law must be broken, say which one and why. Never break one silently
273
+
274
+ `+r.map((t,i)=>`${i+1}. ${t.\u6587}`).join(`
275
+ `)+`
276
+ `:`
277
+ ## \u2605\u4F9D\u983C\u3057\u305F\u4EBA\u306E\u30C7\u30B6\u30A4\u30F3\u306E\u6CD5\u5247 \u2015 \u898B\u305F\u76EE\u306F\u3053\u308C\u306B\u6CBF\u3063\u3066\u304F\u3060\u3055\u3044
278
+
279
+ \u4F9D\u983C\u3057\u305F\u4EBA\u304C\u81EA\u5206\u3067\u6C7A\u3081\u305F\u3001\u898B\u305F\u76EE\u306E\u6C7A\u307E\u308A\u3067\u3059\uFF08AI \u306E\u597D\u307F\u3067\u306F\u3042\u308A\u307E\u305B\u3093\uFF09\u3002
280
+ - \u4F9D\u983C\u3057\u305F\u4EBA\u304C\u300C\u4F5C\u308A\u306A\u304C\u3089\u6C7A\u3081\u305F\u3053\u3068\u300D\u306B\u66F8\u3044\u305F\u5024\u3084\u6C7A\u5B9A\u306F\u3001\u3053\u306E\u6CD5\u5247\u3088\u308A\u5F37\u3044
281
+ - \u9053\u5177\uFF08AI\uFF09\u304C\u6C7A\u3081\u305F\u3053\u3068\u306F\u3001\u3053\u306E\u6CD5\u5247\u306B\u8CA0\u3051\u308B\u3002\u3076\u3064\u304B\u3063\u305F\u3089\u6CD5\u5247\u306B\u5408\u308F\u305B\u308B
282
+ - \u3069\u3046\u3057\u3066\u3082\u6CD5\u5247\u3092\u7834\u308B\u3068\u304D\u306F\u3001\u3069\u306E\u6CD5\u5247\u3092\u30FB\u306A\u305C\u7834\u3063\u305F\u304B\u3092\u66F8\u304F\u3002\u9ED9\u3063\u3066\u7834\u3089\u306A\u3044
283
+
284
+ `+r.map((t,i)=>`${i+1}. ${t.\u6587}`).join(`
285
+ `)+`
286
+ `:""}var R=n=>n.filter(e=>e.\u5370==="\u25CB"&&e.\u6587.trim()),Y=(n,e)=>R(n).filter(o=>!e?.has(o.id)),dn=/^## ★(依頼した人のデザインの法則|The requester's design laws)/m;function D(n,e,o="ja",r){let t=n,i=t.search(dn);if(i>=0){let u=t.slice(i+3).search(/^## /m);t=t.slice(0,i).replace(/\s*$/,`
287
+ `)+(u<0?"":t.slice(i+3+u))}let a=gn(e,o,r);if(!a)return t;let h=t.search(/^## ★(作りながら決めたこと|Decisions made while building)/m);return h<0?`${t.replace(/\s*$/,"")}
288
+ ${a}`:`${t.slice(0,h).replace(/\s*$/,"")}
289
+ ${a}
290
+ ${t.slice(h)}`}var z=[".kokoro","laws.md"],hn={"\u25CB":"\u25CB",o:"\u25CB",O:"\u25CB","?":"?","\uFF1F":"?","\xD7":"\xD7",x:"\xD7",X:"\xD7"};function Q(n){let e=[];for(let o of n.replace(/\r\n/g,`
291
+ `).split(`
292
+ `)){let t=o.replace(/\\([!-/:-@[-`{-~])/g,"$1").match(/^\s*[-*]\s*\[\s*(○|o|O|\?|?|×|x|X)\s*\]\s*(.+?)\s*(?:<!--([\s\S]*?)-->)?\s*$/);if(!t)continue;let i=t[2].trim();if(!i)continue;let a=Object.fromEntries((t[3]??"").split(";").map(u=>u.split("=")).filter(u=>u.length>=2).map(([u,...s])=>[u.trim(),s.join("=").trim()])),h=["\u672C\u4EBA","AI \u306E\u5019\u88DC","\u53D6\u308A\u8FBC\u307F"].find(u=>u===a.\u4F5C\u3063\u305F)??"\u672C\u4EBA";e.push({id:a.id||`\u7D19:${i}`,\u6587:i,\u51FA\u3069\u3053\u308D:a.\u51FA\u3069\u3053\u308D||"\u7D19\u306B\u66F8\u3044\u305F",\u5370:hn[t[1]],\u4F5C\u3063\u305F:h,\u65E5:a.\u65E5||""})}return e}function mn(n){return n==="en"?`## \u2605After building \u2014 make the checks and documents with the tools
293
+
294
+ When the checks in "Before saying it is done" have passed and the build is finished, run these in this folder, in this order.
295
+
296
+ 1. **First, run the steps that use no AI (no cost \u2014 you may run them without asking):**
297
+ \`\`\`
298
+ npx kokoro-pipeline after . --only params,aegis --yes
299
+ \`\`\`
300
+ This makes the parameter table (the tunable numbers) and the hands-on check list (aegis-report.md).
301
+ 2. **Ask me before running the steps that use AI.** They are billed to my Anthropic API key (spec for people, one spec per system checked against the code, and a code review \u2014 about $2\u20132.70 in total, an estimate).
302
+ Ask "may I run these at this cost?", and only when I say yes:
303
+ \`\`\`
304
+ npx kokoro-pipeline after . --only spec-doc,system-docs,polish --yes
305
+ \`\`\`
306
+ \u2605Do not run them before I say yes.
307
+ 3. When it finishes, show me the summary (what was made, what was skipped, what stopped) as it is.
308
+ `:`## \u2605\u4F5C\u308A\u7D42\u308F\u3063\u305F\u3089 \u2015 \u78BA\u304B\u3081\u3068\u66F8\u985E\u3092\u9053\u5177\u3067\u4F5C\u3063\u3066\u304F\u3060\u3055\u3044
309
+
310
+ \u300C\u3067\u304D\u305F\u3068\u8A00\u3046\u524D\u306B\u300D\u306E\u78BA\u304B\u3081\u304C\u6E08\u3093\u3067\u4F5C\u308A\u7D42\u308F\u3063\u305F\u3089\u3001\u3053\u306E\u30D5\u30A9\u30EB\u30C0\u3067\u3001\u6B21\u306E\u9806\u306B\u52D5\u304B\u3057\u3066\u304F\u3060\u3055\u3044\u3002
311
+
312
+ 1. **\u307E\u305A\u3001AI \u3092\u4F7F\u308F\u306A\u3044\u5206\u3092\u52D5\u304B\u3057\u3066\u304F\u3060\u3055\u3044\uFF08\u8CBB\u7528\u306F\u304B\u304B\u308A\u307E\u305B\u3093\u3002\u805E\u304B\u305A\u306B\u52D5\u304B\u3057\u3066\u304B\u307E\u3044\u307E\u305B\u3093\uFF09:**
313
+ \`\`\`
314
+ npx kokoro-pipeline after . --only params,aegis --yes
315
+ \`\`\`
316
+ \u30D1\u30E9\u30E1\u30FC\u30BF\u8868\uFF08\u8ABF\u6574\u3059\u308B\u6570\u306E\u8868\uFF09\u3068\u3001\u624B\u3067\u78BA\u304B\u3081\u308B\u8868\uFF08aegis-report.md\uFF09\u304C\u3067\u304D\u307E\u3059\u3002
317
+ 2. **AI \u3092\u4F7F\u3046\u5206\u306F\u3001\u52D5\u304B\u3059\u524D\u306B\u5FC5\u305A\u79C1\u306B\u805E\u3044\u3066\u304F\u3060\u3055\u3044\u3002** \u79C1\u306E Anthropic \u306E\u30AD\u30FC\u3067\u8CBB\u7528\u304C\u304B\u304B\u308A\u307E\u3059\uFF08\u4EBA\u304C\u8AAD\u3080\u4ED5\u69D8\u66F8\u30FB\u4ED5\u7D44\u307F\u306E\u4ED5\u69D8\u66F8\u3068\u7167\u3089\u3057\u5408\u308F\u305B\u30FB\u7814\u78E8\u3067\u3001\u5408\u308F\u305B\u3066\u7D04 300\u301C400 \u5186\u306E\u898B\u8FBC\u307F\uFF09\u3002
318
+ \u300C\u3053\u306E\u8CBB\u7528\u3067\u52D5\u304B\u3057\u3066\u3088\u3044\u304B\u300D\u3092\u805E\u3044\u3066\u3001\u79C1\u304C\u3088\u3044\u3068\u8A00\u3063\u305F\u3089:
319
+ \`\`\`
320
+ npx kokoro-pipeline after . --only spec-doc,system-docs,polish --yes
321
+ \`\`\`
322
+ \u2605\u79C1\u304C\u3088\u3044\u3068\u8A00\u3046\u524D\u306B\u52D5\u304B\u3055\u306A\u3044\u3067\u304F\u3060\u3055\u3044\u3002
323
+ 3. \u7D42\u308F\u3063\u305F\u3089\u3001\u307E\u3068\u3081\uFF08\u3067\u304D\u305F\u3082\u306E\u30FB\u98DB\u3070\u3057\u305F\u6BB5\u30FB\u6B62\u307E\u3063\u305F\u6BB5\uFF09\u3092\u3001\u305D\u306E\u307E\u307E\u79C1\u306B\u898B\u305B\u3066\u304F\u3060\u3055\u3044\u3002
324
+ `}var fn=/^## (できたと言う前に|Before saying it is done)\s*$/m,kn=/^## ★(作り終わったら|After building)/m;function U(n,e){if(kn.test(n))return n;let o=mn(e),r=n.search(fn);if(r<0)return`${n.replace(/\s*$/,"")}
325
+
326
+ ${o}`;let t=n.slice(r+3).search(/^## /m),i=t<0?n.length:r+3+t;return`${n.slice(0,i).replace(/\s*$/,"")}
327
+
328
+ ${o}
329
+ ${n.slice(i)}`}var Z="0.1.0",wn=(process.env.KOKORO_API_BASE||"https://usekokoro.com").replace(/\/+$/,""),d=(()=>{let n=process.argv.indexOf("--lang"),e=n>=0?process.argv[n+1]:"";return e==="ja"||e==="en"?e:(process.env.LANG||process.env.LC_ALL||Intl.DateTimeFormat().resolvedOptions().locale||"").toLowerCase().startsWith("ja")?"ja":"en"})(),l={ja:{\u4F55\u3092\u4F5C\u308B:"\u4F5C\u308A\u305F\u3044\u3082\u306E\u3092\u66F8\u3044\u3066\u304F\u3060\u3055\u3044: ",\u898B\u3066\u3044\u307E\u3059:"\u78BA\u304B\u3081\u3066\u3044\u307E\u3059\u2026",\u65AD\u308B:n=>`\u3053\u306E\u4F9D\u983C\u306F\u4F5C\u308C\u307E\u305B\u3093: ${n}`,\u8868\u3067:n=>`\uFF08\u53C2\u8003\uFF09\u30A2\u30D7\u30EA\u3067\u306A\u304F\u8868\u3067\u8DB3\u308A\u308B\u304B\u3082\u3057\u308C\u307E\u305B\u3093: ${n}`,\u554F\u3044\u3092\u51FA\u3059:"\u6C7A\u307E\u3063\u3066\u3044\u306A\u3044\u70B9\u3092\u51FA\u3057\u3066\u3044\u307E\u3059\u2026",\u3082\u3046\u7121\u3044:"\u3053\u308C\u4EE5\u4E0A\u3001\u51FA\u3059\u554F\u3044\u306F\u3042\u308A\u307E\u305B\u3093\u3002",\u9078\u3073\u65B9:"\u756A\u53F7\u3067\u9078\u3076\uFF0Fw \u3067\u81EA\u5206\u3067\u66F8\u304F\uFF0Fs \u3067\u6C7A\u3081\u305A\u306B\u6B8B\u3059\uFF0Fq \u3067\u554F\u3044\u3092\u7D42\u3048\u308B",\u81EA\u5206\u3067:"\u7B54\u3048\u3092\u66F8\u3044\u3066\u304F\u3060\u3055\u3044: ",\u524D\u63D0:"\uFF3B\u524D\u63D0\uFF3D",\u63A7\u3048\u3081:"\uFF08\u8FF7\u3063\u305F\u3089\u3001\u3053\u308C\uFF09",\u7D9A\u3051\u308B:n=>`${n} \u4EF6\u6C7A\u3081\u307E\u3057\u305F\u3002\u7D9A\u3051\u3066\u6B21\u306E\u554F\u3044\u3092\u51FA\u3057\u307E\u3059\u304B\uFF1F\uFF081 \u56DE 0.5 \u5186\u307B\u3069\uFF09[y/n] `,\u5408\u683C:"\u300C\u3053\u308C\u304C\u3067\u304D\u305F\u3089\u5408\u683C\u300D\u306E\u6848\u3092\u51FA\u3057\u3066\u3044\u307E\u3059\u2026",\u5408\u683C\u9078\u3076:"\u756A\u53F7\u3067\u9078\u3076\uFF0Fw \u3067\u81EA\u5206\u3067\u66F8\u304F\uFF0Fs \u3067\u98DB\u3070\u3059",\u66F8\u3044\u3066\u3044\u307E\u3059:"\u6307\u793A\u66F8\u3092\u7D44\u307F\u7ACB\u3066\u3066\u3044\u307E\u3059\uFF08\u5371\u306A\u3044\u7D44\u307F\u5408\u308F\u305B\u30FB\u78BA\u304B\u3081\u65B9\u3082\u5165\u308C\u307E\u3059\uFF09\u2026",\u4E0A\u66F8\u304D:n=>`${n} \u306F\u3082\u3046\u3042\u308A\u307E\u3059\u3002\u4E0A\u66F8\u304D\u3057\u307E\u3059\u304B\uFF1F [y/n] `,\u66F8\u3044\u305F:n=>`\u66F8\u304D\u307E\u3057\u305F: ${n}`,\u6B21:n=>`\u6B21\u306F:
330
+ 1. ${n} \u3092\u3001AI\uFF08Claude Code \u306A\u3069\uFF09\u306B\u6E21\u3057\u3066\u4F5C\u3063\u3066\u3082\u3089\u3046
331
+ 2. \u4F5C\u308A\u7D42\u308F\u3063\u305F\u3089\u3001\u4F5C\u3063\u305F AI \u304C npx kokoro-pipeline \u3067\u8868\u3068\u66F8\u985E\u3092\u4F5C\u308A\u307E\u3059\uFF08AI \u3092\u4F7F\u3046\u6BB5\u306F\u3001\u8CBB\u7528\u3092\u8A00\u3063\u3066\u3042\u306A\u305F\u306B\u805E\u304D\u307E\u3059\u30FB\u6307\u793A\u66F8\u306E\u300C\u4F5C\u308A\u7D42\u308F\u3063\u305F\u3089\u300D\u306E\u7BC0\uFF09
332
+ \u753B\u9762\u3067\u6C7A\u3081\u305F\u3044\u3068\u304D\u306F: https://usekokoro.com/kokoro-baton`,\u5931\u6557:n=>`\u6B62\u307E\u308A\u307E\u3057\u305F: ${n}`,\u4F7F\u3044\u65B9:`\u4F7F\u3044\u65B9: npx kokoro-baton "\u4F5C\u308A\u305F\u3044\u3082\u306E" [--out kokoro-spec.md] [--lang ja|en]
333
+ npx kokoro-baton gaps [\u4ED5\u69D8\u306E\u30D5\u30A1\u30A4\u30EB\uFF08\u7121\u3051\u308C\u3070 kokoro-spec.md\uFF09] [--lang ja|en]`,\u4ED5\u69D8\u304C\u7121\u3044:n=>`\u4ED5\u69D8\u306E\u30D5\u30A1\u30A4\u30EB\u304C\u898B\u3064\u304B\u308A\u307E\u305B\u3093: ${n}`,\u7A74\u3092\u898B\u308B:n=>`${n} \u304C\u7B54\u3048\u3066\u3044\u306A\u3044\u70B9\u3092\u898B\u3066\u3044\u307E\u3059\u2026`,\u5370:{answered:"\u7B54\u3048\u3066\u3044\u308B",missing:"\u7B54\u3048\u3066\u3044\u306A\u3044",not_applicable:"\u3053\u306E\u30A2\u30D7\u30EA\u306B\u306F\u7121\u3044"},\u7A74\u306A\u3057:"5 \u3064\u3068\u3082\u3001\u7B54\u3048\u3066\u3044\u308B\u304B\u3001\u3053\u306E\u30A2\u30D7\u30EA\u306B\u306F\u7121\u3044\u70B9\u3067\u3057\u305F\u3002",\u7A74\u3042\u308A:n=>`${n} \u70B9\u3001\u307E\u3060\u7B54\u3048\u3066\u3044\u307E\u305B\u3093\u3002\u4F5C\u308B\u524D\u306B\u6C7A\u3081\u308B\u306A\u3089: npx kokoro-baton "\u4F5C\u308A\u305F\u3044\u3082\u306E"`},en:{\u4F55\u3092\u4F5C\u308B:"What do you want to build? ",\u898B\u3066\u3044\u307E\u3059:"Checking\u2026",\u65AD\u308B:n=>`This request cannot be built: ${n}`,\u8868\u3067:n=>`(FYI) A spreadsheet may be enough instead of an app: ${n}`,\u554F\u3044\u3092\u51FA\u3059:"Finding what is still undecided\u2026",\u3082\u3046\u7121\u3044:"No more questions.",\u9078\u3073\u65B9:"Pick a number / w to write your own / s to leave undecided / q to stop asking",\u81EA\u5206\u3067:"Your answer: ",\u524D\u63D0:"[premise] ",\u63A7\u3048\u3081:" (if unsure, this one)",\u7D9A\u3051\u308B:n=>`${n} decided. Ask the next round of questions? (about $0.004) [y/n] `,\u5408\u683C:'Proposing "done when\u2026" criteria\u2026',\u5408\u683C\u9078\u3076:"Pick a number / w to write your own / s to skip",\u66F8\u3044\u3066\u3044\u307E\u3059:"Building the spec (with risky combinations and how to check)\u2026",\u4E0A\u66F8\u304D:n=>`${n} already exists. Overwrite? [y/n] `,\u66F8\u3044\u305F:n=>`Written: ${n}`,\u6B21:n=>`Next:
334
+ 1. Give ${n} to your AI (Claude Code etc.) to build it
335
+ 2. When it is built, your AI runs npx kokoro-pipeline to make the checklists and documents (it asks you, with the cost, before the steps that use AI \u2014 see "After building" in the spec)`,\u5931\u6557:n=>`Stopped: ${n}`,\u4F7F\u3044\u65B9:`Usage: npx kokoro-baton "what you want to build" [--out kokoro-spec.md] [--lang ja|en]
336
+ npx kokoro-baton gaps [spec file (default kokoro-spec.md)] [--lang ja|en]`,\u4ED5\u69D8\u304C\u7121\u3044:n=>`Spec file not found: ${n}`,\u7A74\u3092\u898B\u308B:n=>`Checking what ${n} does not answer\u2026`,\u5370:{answered:"answered",missing:"NOT answered",not_applicable:"not in this app"},\u7A74\u306A\u3057:"All 5 points are either answered or not part of this app.",\u7A74\u3042\u308A:n=>`${n} point(s) not answered yet. To decide them before building: npx kokoro-baton "what you want to build"`}}[d],x={\u5186:0,\u6B8B\u9AD8:null},J=()=>x.\u6B8B\u9AD8==null?null:d==="en"?`This run: \xA5${Math.round(x.\u5186*100)/100} \xB7 Kokoro balance: \xA5${Math.round(x.\u6B8B\u9AD8*100)/100}`:`\u3053\u306E\u52D5\u304D\u3067 ${Math.round(x.\u5186*100)/100} \u5186 \u30FB Kokoro \u306E\u6B8B\u9AD8 ${Math.round(x.\u6B8B\u9AD8*100)/100} \u5186`;async function K(n,e,o,r=90){let i=await fetch(`${wn}/api/v1/${["check","questions","pass","spec","laws"].includes(n)?`baton/${n}`:n}`,{method:"POST",headers:{"Content-Type":"application/json",...o.\u898B\u51FA\u3057,"user-agent":`kokoro-baton/${Z}`},body:JSON.stringify({...e,lang:d}),signal:AbortSignal.timeout(r*1e3)}),a=await i.json().catch(()=>({}));if(!i.ok){let u=typeof a.error=="string"?a.error:a.error?.message;throw new Error(u||`HTTP ${i.status}`)}let h=a.billing;return h&&typeof h.charged_yen=="number"&&(x.\u5186+=h.charged_yen,x.\u6B8B\u9AD8=h.balance_yen??null),a}async function yn(){let n=process.argv.slice(2);if(n.includes("--version")||n.includes("-v")){console.log(Z);return}if(n.includes("--help")||n.includes("-h")){console.log(l.\u4F7F\u3044\u65B9);return}if(n.includes("--demo")){let s=F("baton",d,(p,g)=>k.default.writeFileSync(p,g),p=>k.default.existsSync(p));console.log(W({ja:'npx kokoro-baton "\u4F5C\u308A\u305F\u3044\u3082\u306E"',en:'npx kokoro-baton "what you want to build"'},s.\u898B\u672C.\u983C\u307F,s.\u66F8\u3044\u305F,d,s.\u65E5\u672C\u8A9E\u3060\u3051));return}let e=H("Kokoro\u3082");e||(console.error(L("Kokoro\u3082",d)),console.error(M("npx kokoro-baton",d)),process.exit(1)),console.log(B(e,d));let o=new Set(["--out","--lang"].map(s=>n.indexOf(s)+1).filter(s=>s>0));if(n[0]==="gaps"){let s=T.default.resolve(n.find((c,w)=>w>0&&!c.startsWith("--")&&!o.has(w))??"kokoro-spec.md");k.default.existsSync(s)||(console.error(l.\u4ED5\u69D8\u304C\u7121\u3044(s)),process.exit(1)),console.log(l.\u7A74\u3092\u898B\u308B(T.default.basename(s)));let p=await K("spec/gaps",{spec:k.default.readFileSync(s,"utf8")},e);console.log("");for(let c of p.points)console.log(`${c.verdict==="missing"?"\u2717":c.verdict==="answered"?"\u2713":"\u2013"} ${c.point} \u2014 ${l.\u5370[c.verdict]??c.verdict}`),c.missing&&console.log(` ${c.missing}`);console.log(`
337
+ `+(p.missing.length?l.\u7A74\u3042\u308A(p.missing.length):l.\u7A74\u306A\u3057));let g=J();g&&console.log(g);return}let r=T.default.resolve(n.includes("--out")?n[n.indexOf("--out")+1]:"kokoro-spec.md"),t=G.default.createInterface({input:A.stdin,output:A.stdout,terminal:!!A.stdin.isTTY}),i=[],a=null,h=!1;t.on("line",s=>{if(a){let p=a;a=null,p(s)}else i.push(s)}),t.on("close",()=>{if(h=!0,a){let s=a;a=null,s(null)}});let u=s=>new Promise((p,g)=>{if(A.stdout.write(s),A.stdin.isTTY||A.stdout.write(`
338
+ `),i.length){p(i.shift());return}if(h){g(new Error(d==="en"?"input ended":"\u5165\u529B\u304C\u7D42\u308F\u308A\u307E\u3057\u305F"));return}a=c=>c===null?g(new Error(d==="en"?"input ended":"\u5165\u529B\u304C\u7D42\u308F\u308A\u307E\u3057\u305F")):p(c)});try{let s=n.filter((m,f)=>!m.startsWith("--")&&!o.has(f)).join(" ").trim();for(s&&k.default.existsSync(s)&&k.default.statSync(s).isFile()&&(s=k.default.readFileSync(s,"utf8").trim());!s;)s=(await u(l.\u4F55\u3092\u4F5C\u308B)).trim();let p=[],g=[];console.log(l.\u898B\u3066\u3044\u307E\u3059);let c=await K("check",{idea:s},e);if(c.refuse){console.log(l.\u65AD\u308B(c.refuse));return}if(c.tableIsEnough&&console.log(l.\u8868\u3067(c.tableIsEnough)),c.purposeQuestion){let m=await V(u,{question:c.purposeQuestion.question,premise:!0,options:c.purposeQuestion.options.map(f=>({label:f,effect:""}))});m&&m!=="q"&&p.push({question:c.purposeQuestion.question,answer:m,premise:!0})}for(let m=0;m<8;m+=1){console.log(`
339
+ `+l.\u554F\u3044\u3092\u51FA\u3059);let f=await K("questions",{idea:s,decided:p},e);if(!f.questions.length){console.log(l.\u3082\u3046\u7121\u3044);break}g=[];let y=!1;for(let $ of f.questions){if(y){g.push($);continue}let I=await V(u,$);if(I==="q"){y=!0,g.push($);continue}I?p.push({question:$.question,answer:I,...$.premise?{premise:!0}:{}}):g.push($)}if(y||!(await u(`
340
+ `+l.\u7D9A\u3051\u308B(p.length))).trim().toLowerCase().startsWith("y"))break}console.log(`
341
+ `+l.\u5408\u683C);let w=await K("pass",{idea:s,decided:p},e),O="",E="";if(w.proposals.length){w.proposals.forEach((y,b)=>console.log(` ${b+1}. ${y.text}`)),console.log(` (${l.\u5408\u683C\u9078\u3076})`);let m=(await u("> ")).trim(),f=Number(m);f>=1&&f<=w.proposals.length?(O=w.proposals[f-1].text,E=O):m.toLowerCase()==="w"&&(O=(await u(l.\u81EA\u5206\u3067)).trim())}console.log(`
342
+ `+l.\u66F8\u3044\u3066\u3044\u307E\u3059);let nn=await K("spec",{idea:s,decided:p,undecided:g,passCriterion:O,passCriterionProposal:E},e);if(k.default.existsSync(r)&&!(await u(l.\u4E0A\u66F8\u304D(r))).trim().toLowerCase().startsWith("y"))return;let P=nn.spec;try{let m=T.default.join(process.env.KOKORO_HOME||X.default.homedir(),...z);if(k.default.existsSync(m)){let f=Q(k.default.readFileSync(m,"utf8")),y=R(f),b=new Set;if(y.length)try{let C=await K("laws",{idea:s,decided:p,laws:y.map(S=>({id:S.id,text:S.\u6587}))},e,60);C.unread?console.log(d==="en"?"Could not check which design laws fit, so all [\u25CB] laws are included.":"\u6CD5\u5247\u304C\u5F53\u3066\u306F\u307E\u308B\u304B\u3092\u78BA\u304B\u3081\u3089\u308C\u306A\u304B\u3063\u305F\u306E\u3067\u3001\u25CB \u306E\u6CD5\u5247\u3092\u5168\u90E8\u5165\u308C\u307E\u3059\u3002"):C.excluded.length&&(console.log(d==="en"?`
343
+ These design laws do not seem to fit what you are building:`:`
344
+ \u4ECA\u4F5C\u308B\u3082\u306E\u306B\u5F53\u3066\u306F\u307E\u3089\u306A\u3044\u3068\u898B\u305F\u6CD5\u5247:`),C.excluded.forEach((_,en)=>console.log(` ${en+1}. ${y.find(on=>on.id===_.id)?.\u6587??_.id}
345
+ \u2192 ${_.reason}`)),(await u(d==="en"?"Leave these out? [Y/n] ":"\u3053\u308C\u3089\u3092\u5916\u3057\u307E\u3059\u304B\uFF1F [Y/n] ")).trim().toLowerCase().startsWith("n")||(b=new Set(C.excluded.map(_=>_.id))))}catch{console.log(d==="en"?"Could not check which design laws fit, so all [\u25CB] laws are included.":"\u6CD5\u5247\u304C\u5F53\u3066\u306F\u307E\u308B\u304B\u3092\u78BA\u304B\u3081\u3089\u308C\u306A\u304B\u3063\u305F\u306E\u3067\u3001\u25CB \u306E\u6CD5\u5247\u3092\u5168\u90E8\u5165\u308C\u307E\u3059\u3002")}let $=Y(f,b),I=$.length;I&&(P=D(P,$,d),console.log(d==="en"?`Added ${I} design laws from ${m}${b.size?` (left out ${b.size} that do not fit)`:""}`:`\u30C7\u30B6\u30A4\u30F3\u306E\u6CD5\u5247 ${I} \u500B\u3092\u5165\u308C\u307E\u3057\u305F\uFF08${m}${b.size?`\u30FB\u5F53\u3066\u306F\u307E\u3089\u306A\u3044 ${b.size} \u500B\u3092\u5916\u3057\u307E\u3057\u305F`:""}\uFF09`))}}catch{}P=U(P,d),k.default.writeFileSync(r,P),console.log(`
346
+ `+l.\u66F8\u3044\u305F(r)),console.log(l.\u6B21(T.default.basename(r)));let N=J();N&&console.log(N)}finally{t.close()}}async function V(n,e){for(console.log(`
347
+ ${e.premise?l.\u524D\u63D0:""}${e.question}`),e.options.forEach((o,r)=>console.log(` ${r+1}. ${o.label}${o.cautious?l.\u63A7\u3048\u3081:""}${o.effect?`
348
+ \u2192 ${o.effect}`:""}`)),console.log(` (${l.\u9078\u3073\u65B9})`);;){let o=(await n("> ")).trim(),r=Number(o);if(r>=1&&r<=e.options.length)return e.options[r-1].label;if(o.toLowerCase()==="w"){let t=(await n(l.\u81EA\u5206\u3067)).trim();if(t)return t;continue}if(o.toLowerCase()==="s"||o==="")return"";if(o.toLowerCase()==="q")return"q"}}yn().catch(n=>{console.error(l.\u5931\u6557(n instanceof Error?n.message:String(n))),process.exit(1)});
package/package.json CHANGED
@@ -1,6 +1,31 @@
1
1
  {
2
2
  "name": "kokoro-baton",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "0.1.0",
4
+ "description": "Decide before you build: answer a few choice-based questions and get a spec file (kokoro-spec.md) to hand to your AI coding tool. Uses your own Anthropic API key. Free, no sign-up.",
5
+ "homepage": "https://github.com/xmichinokux/kokoro-os-tools#readme",
6
+ "bin": {
7
+ "kokoro-baton": "dist/cli.js"
8
+ },
9
+ "files": [
10
+ "dist/cli.js",
11
+ "README.md",
12
+ "LICENSE"
13
+ ],
14
+ "engines": {
15
+ "node": ">=22"
16
+ },
17
+ "keywords": [
18
+ "spec",
19
+ "requirements",
20
+ "ai-coding",
21
+ "claude-code",
22
+ "planning",
23
+ "kokoro-os"
24
+ ],
25
+ "license": "PolyForm-Shield-1.0.0",
26
+ "author": "Masanori Chida (Kokoro OS)",
27
+ "scripts": {
28
+ "build": "node build.mjs",
29
+ "prepublishOnly": "node build.mjs"
30
+ }
31
+ }