@rex0220/formula-authoring-tools 0.0.0-stage → 0.2.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.
Files changed (48) hide show
  1. package/LICENSE +27 -0
  2. package/README.md +62 -2
  3. package/SECURITY.md +46 -0
  4. package/THIRD_PARTY_NOTICES.md +45 -0
  5. package/dist/cli.mjs +3824 -0
  6. package/dist/core.mjs +3786 -0
  7. package/dist/eval-worker.mjs +1324 -0
  8. package/dist/types/_formula/src/authoring/api.d.ts +3 -0
  9. package/dist/types/commands/calc.d.ts +71 -0
  10. package/dist/types/commands/diff.d.ts +18 -0
  11. package/dist/types/commands/fields.d.ts +80 -0
  12. package/dist/types/commands/normalize.d.ts +75 -0
  13. package/dist/types/commands/pull.d.ts +38 -0
  14. package/dist/types/commands/record.d.ts +55 -0
  15. package/dist/types/commands/records.d.ts +36 -0
  16. package/dist/types/commands/save.d.ts +82 -0
  17. package/dist/types/commands/summary.d.ts +27 -0
  18. package/dist/types/commands/take.d.ts +18 -0
  19. package/dist/types/commands/users.d.ts +55 -0
  20. package/dist/types/commit-file.d.ts +38 -0
  21. package/dist/types/connections.d.ts +106 -0
  22. package/dist/types/context.d.ts +10 -0
  23. package/dist/types/core.d.ts +40 -0
  24. package/dist/types/engine.d.ts +114 -0
  25. package/dist/types/env.d.ts +54 -0
  26. package/dist/types/input.d.ts +17 -0
  27. package/dist/types/json-error.d.ts +8 -0
  28. package/dist/types/kintone-rest.d.ts +82 -0
  29. package/dist/types/kintone-url.d.ts +11 -0
  30. package/dist/types/meta.d.ts +33 -0
  31. package/dist/types/normalize/findings.d.ts +21 -0
  32. package/dist/types/normalize/model.d.ts +82 -0
  33. package/dist/types/normalize/policy.d.ts +11 -0
  34. package/dist/types/paths.d.ts +7 -0
  35. package/dist/types/permission-error.d.ts +3 -0
  36. package/dist/types/permission.d.ts +10 -0
  37. package/dist/types/plugin-zip.d.ts +77 -0
  38. package/dist/types/safe-path.d.ts +25 -0
  39. package/dist/types/scan.d.ts +34 -0
  40. package/dist/types/users/default-users.d.ts +64 -0
  41. package/dist/types/users/index.d.ts +37 -0
  42. package/dist/types/worker/eval-job.d.ts +84 -0
  43. package/dist/types/worker/eval-run.d.ts +2 -0
  44. package/dist/types/worker/run.d.ts +21 -0
  45. package/dist/types/workspace.d.ts +126 -0
  46. package/package.json +56 -4
  47. package/vendor/moment-with-locales.min.js +1 -0
  48. package/vendor/moment.json +6 -0
package/LICENSE ADDED
@@ -0,0 +1,27 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 rex0220
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ ---
24
+
25
+ この tools は印刷屋プラグイン(rex0220 Print craft)の計算式エンジンと設定画面・帳票のコードを
26
+ 含みません。それらは利用者が持つ印刷屋プラグインの zip から実行時に読み込まれ、印刷屋プラグインの
27
+ 利用規約に従います。tools はそれらを複製・再配布しません。
package/README.md CHANGED
@@ -1,3 +1,63 @@
1
- # Temporary Holding Version
1
+ # formula authoring tools(開発メモ)
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
+ 計算式プラグイン(rex0220 formula)の設定 JSON を AI で作る・確かめるための tools。npm パッケージ `@rex0220/formula-authoring-tools`(MIT。版は計算式プラグインの版と独立。扱う計算式プラグインはプラグイン ID と版の下限(Ver.101 以降)で決まり、`version` コマンドが出す)のソース。リポジトリのルートがテンプレート(利用者が "Use this template" で使う側)。計画と決定は formula(非公開)の `doc/internal/オーサリングツール_実装計画.md`。
4
+
5
+ **tools は計算式プラグインのコードを含まない。** 計算式エンジン(`desktop_js/KintoneFormula.min.js`)と計算式プラグインの設定画面のコード + plugin-config-kit(`config_js/formula-authoring-api.js`。Ver.101 から zip に同梱。formula の `src/authoring/api.ts`)は、利用者の zip(`.env` の `FORMULA_PLUGIN_ZIP`)から実行のたびにメモリに読む(`src/plugin-zip.ts`、`src/engine.ts`)。zip の `PUBKEY` から出るプラグイン ID が計算式プラグインのもの(`src/meta.ts` の `FORMULA_PLUGIN_ID`)でなければ実行せずに止まる(fail closed。`SIGNATURE` は検証しない。`SECURITY.md`)。開発中にソースから動かすとき(`node src/cli.ts …`)だけ、環境変数 `FORMULA_ALLOW_DEV_PLUGIN=1` を置けば隣の formula の `prod/` からも読める(この場合はプラグイン ID を確かめず、警告を出して続く。ビルドした `dist/cli.mjs` では読まない)。ビルド(`scripts/build.mjs`)は bundle に計算式プラグイン / kit のコードが入っていないことを確かめて止まる。
6
+
7
+ **ビルドとテストには、隣に計算式プラグインのリポジトリ(非公開)と plugin-config-kit / rexgrid が要る**(`package.json` の devDependencies が `file:` で参照する。型の import と、テストの fixture の zip `formula/dist/formula-plugin101.zip` のため。公開レジストリの tools を使うだけなら要らない)。
8
+
9
+ ```
10
+ Projects/
11
+ plugin-config-kit/
12
+ rexgrid/
13
+ kintone-plugin/
14
+ formula/ ← 型を import。テストは dist/formula-plugin101.zip を利用者の zip の代わりに読む
15
+ formula-authoring/ ← このリポジトリ(ルート = テンプレート、tools/ = パッケージ)
16
+ ```
17
+
18
+ ## 構成
19
+
20
+ - `src/cli.ts` … `formula-authoring <command>`(version / fields / record / records / pull / summary / diff / users / normalize / calc、接続のファイルがあるときの take / edit / files)。読むのは cwd の中、書くのは fields/ records/ settings/ temp/ users/ kintone/ の下だけ(`src/safe-path.ts`。kintone/ の下は `src/permission.ts` の許可も)。`.env` / policy / zip / 接続のファイルの場所は固定
21
+ - `src/plugin-zip.ts` … 計算式プラグインの zip(contents.zip の 2 層)を Node の zlib だけで読む。大きさ・entry 数・展開後の上限、CRC-32、名前の一致、重複を検査
22
+ - `src/engine.ts` … zip のエンジン(`KintoneFormula.min.js` → `bignumber` → `rex0220_decimal` → `moment-timezone` → `formula-authoring-api.js` の順)と authoring API を happy-dom + ダミー層(ログインユーザー、アプリ番号、ルックアップ先、ユーザー情報、sink の記録)で動かす。照合(プラグイン ID、版、API の版、API のキーと型)。走査の間は `dq`(評価)を遮断する(`blockDq`)
23
+ - `src/scan.ts` … 計算式の字面の走査(関数、識別子、文字列と、それを引数に持つ関数)。評価しない
24
+ - `src/commands/normalize.ts` … 設定画面と同じ手順の検査(生の JSON の未知のキー → normalizeSource → 走査(副作用 / 文脈 / イベント / ユーザー情報)→ checkFormula / deriveSemantic → 循環 → 大きさ)と既定値を補った封筒。`src/normalize/` … 規則(findings)、policy、型、差分
25
+ - `src/commands/calc.ts` … 取得したレコードに設定を当てる模擬(authoring API の `calcRecord`。イベント、ログインユーザー、ユーザー情報、文脈の fail-closed、sink の拒否)。`src/worker/` … 評価を Worker で動かし時間上限で止める
26
+ - `src/users/` … ユーザー情報のテストデータ(既定の架空の 10 人)と `users/*.json` の形。`src/commands/users.ts` … User API からの取得(全部 / `--only-referenced` = 式が参照するコードとその所属だけ)
27
+ - `src/connections.ts` / `src/workspace.ts` / `src/permission.ts` / `src/commit-file.ts` … kintone の接続のファイル(kSQL の `ksql.config.json` と同じ形。profile、`tokenMap`、`userApiToken`)、`kintone/<profile>/<番号>-<アプリ名>/` のフォルダーと印 `.formula-app.json`、kintone/ の下を変える許可、ファイルの確定とロック(print-craft-authoring tools 2.0.0 の写し)
28
+ - `src/env.ts` / `src/kintone-rest.ts` / `src/kintone-url.ts` … `.env`(kintone 公式 MCP と同じ `KINTONE_*` + `FORMULA_PLUGIN_ZIP` / `FORMULA_KINTONE_CONFIG` / `FORMULA_USER_API_TOKEN`)、GET 専用・許可 API 固定・送信先固定の REST(kintone REST API と User API)
29
+ - `src/meta.ts` … tools の版、扱う計算式プラグイン(プラグイン ID `FORMULA_PLUGIN_ID`、封筒の `FORMULA_CONFIG_PLUGIN_ID`、版の下限 `MIN_PLUGIN_VERSION`)、API の版(`SUPPORTED_API_VERSIONS`)、API の契約(`REQUIRED_API`)
30
+ - `src/commands/save.ts` … 保存の約束(formula MCP の `fml_save_settings` / `fml_update_fields` の本体。CLI は使わない)。新しい設定は同じ名前があれば保存しない、既存の設定は `fml_summary` の digest を照合して項目の行(`fieldcode`)を複数まとめて差し替える。normalize は Worker で行い、エラーがあれば確定しない。確定はロック付き(`commit-file.ts`)
31
+ - `src/core.ts` … 共通の中核の入口(npm の `@rex0220/formula-authoring-tools/core`。formula MCP が使う。`CORE_API_VERSION` 2)。`scripts/build.mjs` が `dist/core.mjs` と `dist/types/` を作る。MCP が使う名前は `test/core-exports.test.mjs` で固定する
32
+ - `scripts/vendor.mjs` … moment 2.24.0 を CDN から `vendor/` に取る(`vendor/moment.json` の SHA-256 と照合)。`scripts/build.mjs` … esbuild で `dist/cli.mjs` / `dist/eval-worker.mjs` / `dist/core.mjs`。`scripts/gen-docs.mjs` … `docs/`(設定ファイル仕様、関数一覧、functions.json、schema-manifest、既定のテストデータ)と `samples/users.json` を zip から機械生成
33
+ - `pending/` … print-craft から写してまだ計算式用にしていないもの(`diff.ts` / `normalize.ts` は計算式用の `src/commands/` が別にあるので使っていない)。npm には入らない
34
+ - `test/` … `node --test`(src の .ts を直接読む。`test/helpers.mjs` が fixture の zip を読む。`test/fixtures/formula/` はテスト用アプリ 2305 の項目定義と設定)
35
+
36
+ ## 使い方(開発)
37
+
38
+ 公開パッケージの実行は Node 20 以上。**ビルドとテストは Node 22.6 以上**(型の除去で `.ts` を直接読む)。
39
+
40
+ ```
41
+ cd tools
42
+ npm install # happy-dom、esbuild、typescript と、隣の formula / plugin-config-kit / rexgrid への参照
43
+ npm run vendor # 初回。moment を vendor/ に
44
+ npm test
45
+ npm run check # tsc
46
+ npm run build # dist/cli.mjs、dist/eval-worker.mjs、dist/core.mjs(prepack でも走る)
47
+ FORMULA_PLUGIN_ZIP=../../formula/dist/formula-plugin101.zip node dist/cli.mjs version
48
+ npm run gen-docs # zip から docs/ を作り直す(test/docs-sync.test.mjs が一致を確かめる)
49
+ npm pack --dry-run # 公開前に中身を確かめる(dist、vendor、LICENSE、THIRD_PARTY_NOTICES、SECURITY、README だけ)
50
+ ```
51
+
52
+ ## 決まり
53
+
54
+ - 計算式プラグインの関数は `engine.api`(zip の authoring API)経由で使う。`src/` から formula を import するのは **型だけ**(`import type`)。実行コードを import すると build が止まる
55
+ - 計算式プラグインの `AUTHORING_API_VERSION` が上がったら、tools の `SUPPORTED_API_VERSIONS` に足し(古い版は利用者が残っている間は外さない)、`REQUIRED_API` を合わせて tools の新しい版として公開する。zip の中身が変わっただけ・版を上げただけなら tools の公開は要らない(プラグイン ID で読む)。tools の版は計算式プラグインの版と独立(semver)
56
+ - kintone への書き込みは行わない。HTTP 層は GET 専用で、送れるパスと送信先を固定する
57
+ - CLI に `.env` / policy / zip / 接続のファイルの場所を変えるオプションを足さない(AI が書けるファイルを読ませない)。書き込み先を増やすなら `src/safe-path.ts` の `WRITE_ROOTS`
58
+ - `vendor/*.js`、`dist/`、`node_modules/` はコミットしない
59
+
60
+ ## 履歴
61
+
62
+ - 0.2.0(2026-10): formula MCP のための中核の入口(`CORE_API_VERSION` 2。CLI の動きは変えない)。`core` に workspace / connections / permission / commit-file / take / users の参照コード / JSON の誤りの文 / 行のキーを追加。`src/commands/save.ts`(`saveNewSettings` / `updateFields`)。`runEval` の `workerFile`(Worker の入口の絶対パス)と `captureOutput`(Worker の標準出力・標準エラーを親に流さず受け取る)、`loadEngine` の `vendorDir`(moment の置き場所)。評価の結果に `findings` と calc のレコードごとの行
63
+ - 0.1.0(2026-10): 最初の公開。version / fields / record / records / pull / summary / diff / users / normalize / calc / take / edit / files。扱う計算式プラグイン Ver.101 以降、authoring API 1
package/SECURITY.md ADDED
@@ -0,0 +1,46 @@
1
+ # セキュリティ(@rex0220/formula-authoring-tools と formula-authoring テンプレート)
2
+
3
+ ## 脆弱性の報告
4
+
5
+ - GitHub リポジトリ [rex0220/formula-authoring](https://github.com/rex0220/formula-authoring) の **Security → Report a vulnerability**(非公開の報告)で知らせてください。公開の Issue には書かないでください
6
+ - 報告には、tools の版(`npx @rex0220/formula-authoring-tools version`)、再現する設定 JSON(レコードの値と認証情報を除いたもの)、期待した動きを添えてください
7
+ - 対応するのは tools の最新の版です。修正は新しい版として npm と GitHub に出し、`tools/README.md` の履歴に書きます
8
+
9
+ ## 範囲
10
+
11
+ | 対象 | 報告先 |
12
+ | :--- | :--- |
13
+ | tools(`formula-authoring` の version / fields / record / records / pull / summary / diff / users / normalize / calc / take / edit / files)、テンプレート(CLAUDE.md、`.claude/settings.json`、`.mcp.json`、docs) | このリポジトリ |
14
+ | 計算式プラグイン本体(zip の中の計算式エンジン、設定画面、authoring API) | 計算式プラグインの配布元(製品紹介: https://qiita.com/rex0220/items/ae83c6d5ce50ff7a9a73 ) |
15
+ | kintone 公式 MCP サーバー(`@kintone/mcp-server`) | [kintone/mcp-server](https://github.com/kintone/mcp-server) |
16
+
17
+ ## 前提(信頼の境界)
18
+
19
+ - テンプレートでは AI(Claude Code)が `npx @rex0220/formula-authoring-tools …` を確認なしに実行でき、`settings/` `fields/` `records/` `temp/` `kintone/` に書けます。AI は `.env` と `policy/` を書けず、`records/` `users/` を読めません(`.claude/settings.json`)。tools はこの前提で、**AI が書けるファイルを認証情報・承認・実行コードとして読まない**ように作ってあります
20
+ - 利用者が置く計算式プラグインの zip の中のコード(計算式エンジン、設定画面のコード、authoring API)は、tools を動かした **OS ユーザーと同じ権限の Node のプロセスで実行**されます。happy-dom の window は DOM の代用で、セキュリティの境界(sandbox)ではありません。`calc` と `normalize` の評価は Worker スレッドで動かし時間の上限で止めますが、Worker も同じ権限です
21
+
22
+ ## tools が守ること
23
+
24
+ - **kintone には GET しか送らない。** 呼べる API は `app`、`app/form/fields`、`app/form/layout`、`app/views`、`record`、`records`、`app/plugin/config` と、その preview 版に固定している(ゲストスペースの `/k/guest/<id>/v1/` も同じ一覧)。それ以外のパスやメソッドは送信前に止まる。`app/plugin/config`(`pull`)は kintone の API ラボ「アプリに追加されているプラグインの設定情報を取得する」で、計算式プラグインのプラグイン ID(zip の公開鍵から)の設定だけを読む。同じ API ラボの設定の変更(PUT)は呼ばない。**受け取る本文に API ごとの上限**(アプリの情報 64 KiB、項目定義・レイアウト・レコード 8 MiB、一覧・プラグインの設定 2 MiB)があり、超えたら読み切らずに止める
25
+ - **User API(cybozu.com 共通)も GET だけ。** `users --pull` が呼ぶのは `users`、`organizations`、`groups`、`organization/users`、`group/users`、`user/organizations`、`user/groups` だけ。認証は cybozu.com 共通管理の API トークン(`Authorization: Bearer`。`FORMULA_USER_API_TOKEN` か profile の `userApiToken`)かログインユーザーで、アプリの API トークンでは呼ばない。cybozu.com 共通の API トークンは kintone の API には使わない。呼び出しの回数に上限(既定 300。`--max`)がある。`--only-referenced` は設定の式が文字列で参照するコードとその所属だけを取る
26
+ - **kintone の接続のファイル(`FORMULA_KINTONE_CONFIG`)の場所は CLI から指定できない。** 場所は OS の環境変数(絶対パス)か `.env` だけで、`--profile` で選べるのは接続のファイルの profile の名前だけ。接続のファイルは作業フォルダーの外のときだけ使う(指定のパスも実際のパスも。作業フォルダーの中の symlink も断る)。開いたファイルが普通のファイルで 256 KiB 以下かを確かめてから読み、読み込みの途中で変わったら使わない。認証はその profile のそのアプリの `tokenMap` か、ログイン名とパスワードだけで、kSQL の環境変数の上書き(`KSQL_*`)と OS の `KINTONE_*` は読まない。評価の文脈の接続先には profile の `baseUrl` を使い、`kintone/<profile>/` のフォルダー名(AI が作れる)は使わない。**接続のファイルと、そこが名前を書いた環境変数は、Claude Code の AI が Read / Bash で読める(許可の確認は出る)。受け入れた危険で、閲覧だけの API トークンを勧める**
27
+ - **送信先は kintone のドメインだけ。** `KINTONE_BASE_URL` は `https://<サブドメイン>.cybozu.com` / `.kintone.com` / `.cybozu.cn`(`*.s.cybozu.com` を含む)だけを受け付け、ユーザー情報(`user@`)・ポート・パス・クエリが付いた URL は使わない。URL は `new URL(path, base)` で組み、送信直前にも origin が同じか確かめる
28
+ - **kintone 以外とは通信しない。** `normalize` / `calc` / `summary` / `diff` / `version` / `users --summary` と、`fields` / `record` の `--summary` はネットワークを使わない。利用状況の送信(テレメトリ)は無い。計算式の評価中に計算式エンジンが kintone の API(`kintone.api`)やユーザー情報の取得を呼ぼうとしても、ダミー層が受けて外には出さない
29
+ - **認証情報を出力しない。** `.env` または OS の環境変数か接続のファイルから読み、API トークン・パスワード・ユーザー名は画面・ファイル・エラーの文言に出さない。エラーの文言は HTTP の状態と kintone のエラーコードと固定のヒントだけ。出すのは接続先の URL と「API トークン / cybozu.com 共通の API トークン / ログインユーザー」の区別、接続のファイルの名前と profile の名前だけ
30
+ - **レコードの値と個人情報を標準出力に出さない(`calc` を除く)。** `record` は項目の数とテーブルの行数だけ表示し、値は `records/<app>-<id>.json`(POSIX の権限 0o600 = 本人だけが読める。Windows ではユーザーフォルダーの ACL に依る)に書く。`record --summary` も形だけ。`users --pull` も `users/<ホスト>.json`(0o600)に書き、`users --summary` は人数だけ。**例外は `calc`**: 確かめのために、変わる項目の前後の値(レコードの値を含む)を標準出力に出す。Claude Code の AI はこれを読む(テンプレートの手順は、AI が `calc` の結果を見て要件どおりかを確かめる前提)
31
+ - **計算式プラグインの zip でなければ実行しない(fail closed)。** 外側の zip の `PUBKEY`(kintone のプラグインの公開鍵)から出るプラグイン ID が計算式プラグインのもの(`src/meta.ts` の `FORMULA_PLUGIN_ID`)で、`manifest.json` の版が Ver.101 以上の整数で、authoring API があるときだけ zip のコードを実行する。違えば **コードを実行する前に止まる**。実行した後に、API の版(`SUPPORTED_API_VERSIONS`)、API のプラグイン名(`FORMULA_CONFIG_PLUGIN_ID`)、tools が使う API のキーと型を確かめる。**`SIGNATURE`(kintone の署名)は検証しない**ので、本物の zip の `PUBKEY` を写して中身を差し替えた zip は止められない。zip の読み取りでは、外側と中身の大きさ・entry の数・展開後の大きさの上限、central directory と local header の名前の一致、CRC-32、同名 entry の重複を確かめる(zip bomb と改変の対策)。公開ビルド(`dist/cli.mjs`、`dist/eval-worker.mjs`、`dist/core.mjs`。計算式プラグイン / kit のコードを含まないことをビルドで確かめる)が読むのは `FORMULA_PLUGIN_ZIP` の zip だけで、`node_modules` や隣のフォルダーのファイルは読まない
32
+ - **計算式を評価する前に字面を走査し、副作用の関数は承認が無ければ評価しない。** `normalize` は評価(`dq`)の前に全部の式を走査し、kintone への書き込み・クリップボード・画面の操作に当たる関数(`FUNCTION_TAGS` の sideEffect: FSET / FSET_TADD / BUTTON / DIALOG / CLIPBORD_WRITE)があれば、利用者が AI の書けない `policy/authoring-policy.json` の `allowFunctions` で承認していない限りエラーで止める(走査の間は `dq` を遮断して、評価が先に走らないことを保証する)。承認した上で `calc` を動かしても、エンジンのダミー層は書き込みに当たる呼び出し(`kintone.api` の PUT / POST、クリップボード、イベントの登録)を**記録するだけで実行せず**、呼ばれたレコードの結果は採らない(終了コード 1)。EV_SET(テスト用)が設定にあればエラー
33
+ - **評価は Worker で動かし、時間の上限で止める。** `normalize` / `calc` の評価は Worker スレッドで動かし、既定 60 秒(`--timeout`、上限 600)で terminate する(無限ループの式でも CLI が返る)。zip を読むのも Worker の中
34
+ - **文脈が足りなければ名指しで止める(fail-closed)。** 接続先の URL が無いのに `APP_URL`、ルックアップ先が決まらないのに `LOOKUP_GETID`、ログインユーザーが決まらないのに `LOGIN_*` / 引数なしの `UINFO()` などを使う式は、`calc` がダミーの値で計算せずに止まる。`--app` と設定の appId、fields と records のアプリ・レコード番号が食い違えば止まる
35
+ - **CLI が読む・書く場所を限る。** 読むのは作業フォルダーの中のファイルだけ(`.env` と `node_modules` と `.git` は読まない)、書くのは `fields/` `records/` `settings/` `temp/` `users/` `kintone/` の下だけ(realpath で判定。junction / symlink で外へは出られない。Windows の予約名は使わない)。一覧を作るフォルダー(`kintone/` と profile のフォルダー、アプリのフォルダーと `records/`、`inbox/`)も、実体が作業フォルダーの外を指していれば一覧しない。`.env`、`policy/authoring-policy.json`、zip の場所(`FORMULA_PLUGIN_ZIP`)、接続のファイルの場所は作業フォルダーのものに固定で、`--env` / `--policy` / `--plugin-zip` のようなオプションは無い。パスの検査から書き込みまでの間にリンクが差し替えられる競合(TOCTOU)は残るが、AI と同じ OS ユーザーの範囲の話であり、この tools では防がない
36
+ - **`kintone/` の下は接続のファイルの profile の形のときだけ変える。** 変えるのは、接続のファイルにある profile のフォルダーで、アプリのフォルダーの印(`.formula-app.json`。フォルダーを作るときだけ置く)が今の接続のこのアプリのものとき。印の無い・壊れた・別の接続のフォルダーは読みも書きもしない。ダウンロード / pull のファイルは書き換えない(`edit` で `-edit.json` に写す)。変える直前に接続のファイルを読み直し、選んだ profile の接続(接続先、ゲストスペース、認証と資格情報の指紋)が呼び出しの初めと違えば止める。ダウンロード / pull のファイル(`pull`、`take`)は同じフォルダーの一時ファイルからハードリンクで確定し、確かめた後に同じ名前ができても上書きしない。1 接続の形では `kintone/` の下を読みも書きもしない
37
+ - **作業フォルダーと環境変数は起動時に一度だけ決める。** 作業フォルダーは実際のパス(symlink / junction を解いたもの)にしてから使い、中核は `process.cwd()` / `process.env` を既定の値として読まない。OS の環境変数の `FORMULA_PLUGIN_ZIP` / `FORMULA_KINTONE_CONFIG` は絶対パスだけ。外側の引用符を外すのは場所と URL だけ(認証情報は外さない)
38
+ - **`normalize` は設定画面と同じ規則で検査する。** 生の JSON の未知のキー(入れ子も)はエラー(設定画面は黙って捨てる)、封筒(`pluginID`、`PluginVersion`、`appId`)、今のアプリに無い項目、型、ランクの範囲、計算式の評価の誤り、循環、保存値の大きさ(内部番号の分を上乗せ)。エラーがあれば書き出さない
39
+
40
+ ## tools がしないこと(利用者が守ること)
41
+
42
+ - **zip は計算式プラグインの配布元から入手したものを使う。** 出所の分からない zip を `FORMULA_PLUGIN_ZIP` に書かない。tools はプラグイン ID だけを見るので、中身を差し替えた zip を見分けられない(その zip のコードがこの PC の権限で動く)
43
+ - `calc` は模擬で、実機の結果と同じとは限らない(イベント、ログインユーザー、ユーザー情報、ルックアップ先はダミーかテストデータ)。**アップロードする前に `diff` の差分を人が見て、反映した後は実機で確かめる**
44
+ - kintone への書き込みは、テンプレートの `.claude/settings.json` が kintone MCP の書き込みツールを拒否し、CLAUDE.md が禁じているが、最終的な担保はサーバー側の権限(**レコード閲覧だけの API トークン**か、閲覧権限だけのアカウント)。設定・権限・API トークンの管理は利用者の責任
45
+ - `.env`(認証情報)と接続のファイルはコミットしない。設定 JSON にはアプリ番号・項目コード・業務用語が入るので、設定を置くリポジトリは **private** にする。`records/` と `users/` は作業が終わったら消す
46
+ - 依存パッケージ(`happy-dom`、同梱の `moment`)の脆弱性は `npm audit` と新しい版への更新で対応する。第三者のソフトウェアの一覧は `THIRD_PARTY_NOTICES.md`
@@ -0,0 +1,45 @@
1
+ # Third-party notices
2
+
3
+ `@rex0220/formula-authoring-tools` が同梱または依存する第三者のソフトウェアと、そのライセンス。
4
+
5
+ ## 同梱(`vendor/`)
6
+
7
+ ### moment 2.24.0(`vendor/moment-with-locales.min.js`)
8
+
9
+ 計算式プラグインが manifest で読み込む CDN(https://js.cybozu.com/momentjs/2.24.0/moment-with-locales.min.js)と同じファイルを、tools のビルド時に取得して同梱しています(`vendor/moment.json` の SHA-256 で照合)。
10
+
11
+ ```
12
+ Copyright (c) JS Foundation and other contributors
13
+
14
+ Permission is hereby granted, free of charge, to any person
15
+ obtaining a copy of this software and associated documentation
16
+ files (the "Software"), to deal in the Software without
17
+ restriction, including without limitation the rights to use,
18
+ copy, modify, merge, publish, distribute, sublicense, and/or sell
19
+ copies of the Software, and to permit persons to whom the
20
+ Software is furnished to do so, subject to the following
21
+ conditions:
22
+
23
+ The above copyright notice and this permission notice shall be
24
+ included in all copies or substantial portions of the Software.
25
+
26
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
27
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
28
+ OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
29
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
30
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
31
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
32
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
33
+ OTHER DEALINGS IN THE SOFTWARE.
34
+ ```
35
+
36
+ ## 依存(npm が入れる)
37
+
38
+ ### happy-dom(MIT)
39
+
40
+ Copyright (c) 2019 David Ortner (capricorn86). https://github.com/capricorn86/happy-dom/blob/master/LICENSE
41
+
42
+ ## 利用者の計算式プラグインの zip から実行時に読むもの(tools には含まれない)
43
+
44
+ - `KintoneFormula.min.js`(計算式エンジン)、`formula-authoring-api.js`(計算式プラグインの設定画面のコードと plugin-config-kit) … rex0220。計算式プラグインの利用規約に従う
45
+ - `bignumber.min.js`(bignumber.js、MIT。Copyright (c) 2019 Michael Mclaughlin)、`rex0220_decimal.min.js`(decimal.js、MIT。Copyright (c) 2022 Michael Mclaughlin)、`moment-timezone-with-data.min.js`(moment-timezone、MIT。Copyright (c) JS Foundation and other contributors) … 計算式プラグインに同梱されているものをそのまま実行する