@rex0220/print-craft-authoring-tools 1.2.0 → 1.3.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.
- package/README.md +2 -1
- package/SECURITY.md +2 -2
- package/dist/cli.mjs +2 -2
- package/dist/core.mjs +3422 -0
- package/dist/types/_print-craft/src/authoring/api.d.ts +3 -0
- package/dist/types/_print-craft/src/config/load.d.ts +4 -0
- package/dist/types/_print-craft/src/config/schema.d.ts +5 -0
- package/dist/types/commands/buttons.d.ts +19 -0
- package/dist/types/commands/diff.d.ts +6 -0
- package/dist/types/commands/fields.d.ts +54 -0
- package/dist/types/commands/normalize.d.ts +40 -0
- package/dist/types/commands/preview.d.ts +39 -0
- package/dist/types/commands/pull.d.ts +36 -0
- package/dist/types/commands/record.d.ts +63 -0
- package/dist/types/commands/records.d.ts +36 -0
- package/dist/types/commands/save.d.ts +50 -0
- package/dist/types/commands/take.d.ts +19 -0
- package/dist/types/commit-file.d.ts +38 -0
- package/dist/types/context.d.ts +10 -0
- package/dist/types/core.d.ts +32 -0
- package/dist/types/engine.d.ts +64 -0
- package/dist/types/env.d.ts +50 -0
- package/dist/types/kintone-rest.d.ts +65 -0
- package/dist/types/kintone-url.d.ts +11 -0
- package/dist/types/meta.d.ts +30 -0
- package/dist/types/normalize/checks.d.ts +58 -0
- package/dist/types/normalize/css-check.d.ts +53 -0
- package/dist/types/normalize/derive.d.ts +30 -0
- package/dist/types/normalize/findings.d.ts +21 -0
- package/dist/types/normalize/html-check.d.ts +23 -0
- package/dist/types/normalize/line-diff.d.ts +8 -0
- package/dist/types/normalize/model.d.ts +36 -0
- package/dist/types/normalize/policy.d.ts +29 -0
- package/dist/types/normalize/size.d.ts +16 -0
- package/dist/types/paths.d.ts +7 -0
- package/dist/types/permission.d.ts +21 -0
- package/dist/types/plugin-zip.d.ts +53 -0
- package/dist/types/preview/render.d.ts +82 -0
- package/dist/types/safe-path.d.ts +24 -0
- package/dist/types/workspace.d.ts +84 -0
- package/package.json +10 -2
package/README.md
CHANGED
|
@@ -22,6 +22,7 @@ Projects/
|
|
|
22
22
|
- `src/engine.ts` … zip のエンジンと authoring API を happy-dom + スタブで動かす。照合(プラグイン ID、印刷屋の版、API の版と pluginVersion、API のキーと型)
|
|
23
23
|
- `src/kintone-url.ts` … 接続先の検証(`*.cybozu.com` / `*.kintone.com` / `*.cybozu.cn`、ユーザー情報・パス・ポート無し)
|
|
24
24
|
- `src/context.ts` … 作業の文脈(作業フォルダーの実際のパスと環境変数)。CLI は起動時に一度だけ作り、中核には引数で渡す(print-craft MCP も同じ中核を呼ぶ)
|
|
25
|
+
- `src/core.ts` … 共通の中核の入口(npm の `@rex0220/print-craft-authoring-tools/core`。print-craft MCP が使う。2026-10-09 Takashi「B」: 別のパッケージにしない。版は CLI と同じ)。`scripts/build.mjs` が `dist/core.mjs`(ESM。happy-dom は依存のまま)と `dist/types/`(型。印刷屋の型は代わりの型 `scripts/types-stub/` に置き換える。型の検査は本物の型で行う)を作る。CLI と `dev-paths.ts` は出さない。出す名前を消すときは `CORE_API_VERSION` を上げる
|
|
25
26
|
- `src/paths.ts` / `src/dev-paths.ts` … tools の置き場所(環境変数を読まない。中核から使う)/ 開発とビルドのときだけ使う場所の探し方(隣の print-craft、kit、rexgrid。`PCRAFT_PRINT_CRAFT_ROOT` などの環境変数を読む。import するのは `cli.ts` と scripts/・試験だけ)
|
|
26
27
|
- `src/commit-file.ts` … ファイルの確定(新しいファイルはハードリンクで、上書きしない)、所有者の印付きのロック、片付け(save / pull / take が使う)
|
|
27
28
|
- `src/permission.ts` … `kintone/` の下を変える前の許可(`environments.json` の `role`。本番は読み取りだけ、未分類は何も変えない)
|
|
@@ -30,7 +31,7 @@ Projects/
|
|
|
30
31
|
- `src/commands/` … 各コマンド。`save.ts` は保存の約束(新しい設定の保存、ボタン 1 つの差し替え。print-craft MCP の保存のツールの本体)、`records.ts` はレコードを数件・形だけで見る(print-craft MCP の kintone_list_records)。`src/normalize/` … 派生値の生成、検査(HTML / CSS の allowlist、policy、大きさ)、行の差分。`src/preview/` … 帳票 HTML(sandbox + CSP + DOM の無害化)
|
|
31
32
|
- `src/meta.ts` … tools の版、扱う印刷屋(プラグイン ID `PRINT_CRAFT_PLUGIN_ID`、版の下限 `MIN_PLUGIN_VERSION`)、API の版(`SUPPORTED_API_VERSIONS`)、API の契約(`REQUIRED_API`)
|
|
32
33
|
- `scripts/vendor.mjs` … moment 2.24.0 を CDN から `vendor/` に取る(`vendor/moment.json` の SHA-256 と照合)
|
|
33
|
-
- `scripts/build.mjs` … esbuild で `dist/cli.mjs`(Node 20、ESM。印刷屋 / kit
|
|
34
|
+
- `scripts/build.mjs` … esbuild で `dist/cli.mjs`(Node 20、ESM。印刷屋 / kit のコードが入ったら失敗)と中核の入口 `dist/core.mjs`・型 `dist/types/`(型の検査 → 宣言 → 読み込む側の設定で使えるかを確かめる)
|
|
34
35
|
- `scripts/gen-schema-manifest.mjs` … `docs/schema-manifest.json` と `docs/defaults/*.json`(API の CONFIG_SCHEMA から)
|
|
35
36
|
- `scripts/gen-functions.mjs` … `functions.json`(関数の分類)。`scripts/gen-function-list.mjs` … `docs/関数一覧.md` ほか(lib の説明表 p.desc から)
|
|
36
37
|
- `test/` … `node --test`(src の .ts を直接読む。`test/helpers.mjs` が fixture の zip を PCRAFT_PLUGIN_ZIP に置く)
|
package/SECURITY.md
CHANGED
|
@@ -27,12 +27,12 @@
|
|
|
27
27
|
- **kintone 以外とは通信しない。** `normalize` / `preview` / `diff` / `buttons` / `version` と、`fields` / `record` の `--summary` はネットワークを使わない。利用状況の送信(テレメトリ)は無い
|
|
28
28
|
- **認証情報を出力しない。** `.env` または OS の環境変数から読み、API トークン・パスワード・ユーザー名は画面・ファイル・エラーの文言に出さない。エラーの文言は HTTP の状態と kintone のエラーコードと固定のヒントだけ(サーバーの message は出さない)。出すのは接続先の URL と「API トークン / ログインユーザー」の区別だけ
|
|
29
29
|
- **レコードの値を標準出力に出さない。** `record` は項目の数とテーブルの行数だけ表示し、値は `records/<app>-<id>.json` に書く(テンプレートの `.gitignore` でコミット対象外)。`--fields-from` で設定が使う項目だけに絞れる。`record --summary` も形(文字数・行数・数値の桁・件数・添付の種類)だけで、値・ファイル名・ユーザー名は出さない
|
|
30
|
-
- **印刷屋の zip でなければ実行しない(fail closed)。** 外側の zip の `PUBKEY`(kintone のプラグインの公開鍵)から出るプラグイン ID が印刷屋のもの(`src/meta.ts` の `PRINT_CRAFT_PLUGIN_ID`)で、`manifest.json` の版が Ver.6 以上の整数で、authoring API があるときだけ zip のコードを実行する。違えば **コードを実行する前に止まる**。実行した後に、API の版(`SUPPORTED_API_VERSIONS`)、API の印刷屋の版と manifest の版の一致、tools が使う API のキーと型を確かめる。**`SIGNATURE`(kintone の署名)は検証しない**ので、本物の zip の `PUBKEY` を写して中身を差し替えた zip は止められない(1.1.0。2026-10-08。1.0.0 までは 4 ファイルの SHA-256 を既知のリリースと照合していたが、印刷屋の zip が変わるたびに tools の公開が要った)。zip の読み取りでは、外側と中身の大きさ・entry の数・展開後の大きさの上限、central directory と local header の名前の一致、CRC-32、同名 entry の重複を確かめる(zip bomb と改変の対策)。公開ビルド(npm の `dist/cli.mjs
|
|
30
|
+
- **印刷屋の zip でなければ実行しない(fail closed)。** 外側の zip の `PUBKEY`(kintone のプラグインの公開鍵)から出るプラグイン ID が印刷屋のもの(`src/meta.ts` の `PRINT_CRAFT_PLUGIN_ID`)で、`manifest.json` の版が Ver.6 以上の整数で、authoring API があるときだけ zip のコードを実行する。違えば **コードを実行する前に止まる**。実行した後に、API の版(`SUPPORTED_API_VERSIONS`)、API の印刷屋の版と manifest の版の一致、tools が使う API のキーと型を確かめる。**`SIGNATURE`(kintone の署名)は検証しない**ので、本物の zip の `PUBKEY` を写して中身を差し替えた zip は止められない(1.1.0。2026-10-08。1.0.0 までは 4 ファイルの SHA-256 を既知のリリースと照合していたが、印刷屋の zip が変わるたびに tools の公開が要った)。zip の読み取りでは、外側と中身の大きさ・entry の数・展開後の大きさの上限、central directory と local header の名前の一致、CRC-32、同名 entry の重複を確かめる(zip bomb と改変の対策)。公開ビルド(npm の `dist/cli.mjs` と、print-craft MCP が使う中核の入口 `dist/core.mjs`。どちらも印刷屋 / kit のコードを含まないことをビルドで確かめる。中核の入口は CLI と開発用の `dev-paths.ts` も含まない)が読むのは `PCRAFT_PLUGIN_ZIP` の zip だけで、`node_modules` や隣のフォルダーのファイルは読まない(開発者がソースから動かし、環境変数 `PCRAFT_ALLOW_DEV_PLUGIN=1` を置いたときだけ、隣の print-craft の `prod/` を警告付きで読む)
|
|
31
31
|
- **印刷屋のコードを含まない。** エンジンと API は利用者の zip からメモリへ読むだけで、コピーや書き出しはしない。ビルドは、npm に入る `dist/cli.mjs` に印刷屋 / plugin-config-kit / rexgrid の実行コードが混ざっていないことを検査する
|
|
32
32
|
- **CLI が読む・書く場所を限る。** 読むのは作業フォルダーの中のファイルだけ(`.env` と `node_modules` は読まない)、書くのは `fields/` `records/` `settings/` `temp/` `out/` `kintone/` の下だけ(realpath で判定。junction / symlink で外へは出られない。Windows の予約名は使わない)。`.env`、`policy/authoring-policy.json`、印刷屋の zip の場所(`PCRAFT_PLUGIN_ZIP`)は作業フォルダーのものに固定で、`--env` / `--policy` / `--plugin-zip` のようなオプションは無い。iframe の同一オリジンの判定は `.env` の `KINTONE_BASE_URL` **だけ**を使い、AI が書き換えられる `fields/*.json` の値は使わない(`.env` に接続先が無ければ iframe は使えない)。パスの検査から書き込みまでの間にリンクが差し替えられる競合(TOCTOU)は残るが、AI と同じ OS ユーザーの範囲の話であり、この tools では防がない
|
|
33
33
|
- **本番の環境は読み取りだけ(`environments.json` の `role`)。** `kintone/` の下を変える直前に `environments.json` を読み直し、本番(`production`)のフォルダーは新しい名前のダウンロード / pull を足すことだけ、開発(`development`)はダウンロード / pull のファイルの書き換えだけを拒否、`role` の無い環境・`environments.json` が無いのに `kintone/` の下・どの環境か決まらないフォルダー(構成 2 で `apps` に無い番号)は何も変えない(`src/permission.ts`)。`--env`(AI が付けられる引数)では決めない
|
|
34
34
|
- **作業フォルダーと環境変数は起動時に一度だけ決める。** 作業フォルダーは実際のパス(symlink / junction を解いたもの)にしてから使い、中核は `process.cwd()` / `process.env` を既定の値として読まない(`src/context.ts`。印刷屋の zip と開発中の読み込み元も引数で受け取る)。環境変数を読むのは `src/cli.ts` と開発用の場所の探し方 `src/dev-paths.ts` だけで、`dev-paths.ts` を import するのは `cli.ts` だけ(`test/core-boundary.test.mjs` で確かめる)。OS の環境変数(print-craft MCP では設定項目)の `PCRAFT_PLUGIN_ZIP` は絶対パスだけ。外側の引用符を外すのは場所と URL だけ(認証情報は外さない)
|
|
35
|
-
- **設定の保存は normalize を通ったときだけ確定する**(`src/commands/save.ts`。print-craft MCP の保存のツールの本体)。normalize → 書く先のパス・`role`・ダウンロードのファイルを確かめる(normalize の間に本番に変わったフォルダーには一時ファイルもロックも作らない)→ 同じフォルダーの一時ファイル → 確定先のロック(隣の `.<名前>.pcraft-lock` に所有者の印。普通のファイルでなければ取らない。60 秒より古いものは固有の名前に付け替えてから回収する。外すのは自分の印のロックだけ)→ 確定の直前に書く先のパス(途中で symlink に差し替えられていないか)・`role`・ダウンロードのファイル・digest・ロックがまだ自分のものかを確かめ直す → 確定。新しい設定は `expectedAbsent: true` が要り、ハードリンクで確定する(同じ名前があれば失敗する = 確かめた後に作られたファイルも上書きしない)。既存の設定は名前の付け替えで確定し、読んだ時点の digest が違えば書かない。項目定義は、アプリのフォルダーの中なら同じフォルダーの `fields.json` だけ(別のファイルを渡すと拒否)。入力(`content` / `replacement`)は UTF-8 で 256 KiB まで。一時ファイルとロックの片付けは別々に試し(Windows の EPERM / EBUSY は短く待ってやり直す)、確定の後の片付けの失敗は保存の失敗にしない(結果に添える)(`src/commit-file.ts
|
|
35
|
+
- **設定の保存は normalize を通ったときだけ確定する**(`src/commands/save.ts`。print-craft MCP の保存のツールの本体)。normalize → 書く先のパス・`role`・ダウンロードのファイルを確かめる(normalize の間に本番に変わったフォルダーには一時ファイルもロックも作らない)→ 書く先のフォルダーが無ければ作る → 同じフォルダーの一時ファイル → 確定先のロック(隣の `.<名前>.pcraft-lock` に所有者の印。普通のファイルでなければ取らない。60 秒より古いものは固有の名前に付け替えてから回収する。外すのは自分の印のロックだけ)→ 確定の直前に書く先のパス(途中で symlink に差し替えられていないか)・`role`・ダウンロードのファイル・digest・ロックがまだ自分のものかを確かめ直す → 確定。新しい設定は `expectedAbsent: true` が要り、ハードリンクで確定する(同じ名前があれば失敗する = 確かめた後に作られたファイルも上書きしない)。既存の設定は名前の付け替えで確定し、読んだ時点の digest が違えば書かない。項目定義は、アプリのフォルダーの中なら同じフォルダーの `fields.json` だけ(別のファイルを渡すと拒否)。入力(`content` / `replacement`)は UTF-8 で 256 KiB まで。一時ファイルとロックの片付けは別々に試し(Windows の EPERM / EBUSY は短く待ってやり直す)、確定の後の片付けの失敗は保存の失敗にしない(結果に添える)(`src/commit-file.ts`)。結果の状態は ok / invalid(normalize のエラー、入力の誤り)/ conflict / denied(書けない場所、本番、ダウンロードのファイル、作業フォルダーの外)/ failed(読み書きの失敗など想定外)で、`code` に誤りの種類
|
|
36
36
|
- **ダウンロード / pull のファイルは新しいファイルとしてだけ置く。** `pull`(`environments.json` のときと、`--force` の無いとき。`environments.json` のときは `--force` を使えない)と `take` は、同じフォルダーの一時ファイルからハードリンクで確定し、確定の直前に書く先のパスと許可を確かめ直す(確かめた後に同じ名前のファイルができても上書きしない)。`take` は置けてから inbox の元を消す(消せなければ「置いたが inbox に残った」と返す)
|
|
37
37
|
- **`normalize` は許可した書き方だけ通す(allowlist)。** 要素は文章・表・画像の要素だけ、属性は共通の属性(class / id / style …)と要素ごとの属性(img の src / srcset / alt、td の colspan …)と `data-*` / `aria-*` だけで、一覧に無い要素・属性、`on*` 属性、インラインの `<svg>` / `<math>`、`<script>` `<object>` `<embed>` `<link>` `<base>` `<meta>` `<form>` 系、`<template>` などはエラー。URL は Chrome の URL パーサーと同じ前処理(タブ・改行・制御文字を捨てる、`\` は `/`)をしてから `https:` / `data:image/` / 置き換えタグ / 相対だけを通す(`a` の `href` は `data:` も不可、`iframe` は利用者の kintone と同じオリジンだけ)。CSS はコメントを外してエスケープを復号してから、`url()` / `image-set()` / `image()` / `src()` / `@import` の URL を分類し、`@import` / `expression(` / `behavior:` / `-moz-binding:` を止める。属性値の `${式}` はエラー。**kintone 以外への読み込みとスクリプトは印刷屋 Ver.6 が描画の前に除く**(共通の設定「外部参照」`externalRefs: "block"`。帳票の HTML / CSS を DOMParser で DOM 化して、外部へ向く URL 属性・CSS の `url()` / `@import`・`script` などの要素・`on*` 属性を外してから画面に入れる)ので、tools はそれを前提にする: `"block"` の設定の HTML / CSS のテンプレートにある外部 URL は**エラー**(帳票に出ない。添付ファイルか `data:image/` にする)。`"allow"`(Ver.5 と同じく何も除かない。自己責任。キーが無い Ver.5 の設定も印刷屋は `allow` で動くので tools も `allow` とみなす)は、利用者が AI の書けない `policy/authoring-policy.json` の `allowExternalRefs` にその設定ファイルを書いていなければ**エラー**。`allow` の設定の外部 URL と、外部参照の設定に関わらず Web フォント(印刷屋は除かない)は `allowExternal`(形を検証する)で承認し、承認済みは情報、無ければ**警告**。帳票の行の**計算式が作る HTML** は静的に追い切れない(計算式のインタープリターを tools に二重に持たない。Codex レビュー 5 回の結論)ので**警告だけ**: HTML を作る関数の使用、`TAG` の要素名や `ATTR` / `STYLE` / `BATTR` の値が定数でない、文字列の定数に HTML / CSS があれば HTML / CSS と同じ検査を警告として出す。`${式}` の安全判定は式全体で行い、`&` でつないだ項がすべて安全なときだけ警告しない。エラーがあれば書き戻さない
|
|
38
38
|
- **`preview` の HTML は閉じている。** 帳票は `sandbox=""` だけの iframe に `srcdoc` で入れ、外側と帳票の両方の文書に CSP(帳票は `default-src 'none'; img-src data:; style-src 'unsafe-inline'; font-src data:; connect-src 'none'; frame-src 'none'; object-src 'none'; base-uri 'none'; form-action 'none'`)。CSS は `<` を CSS のエスケープ(`\3c`)にして `</style>` で文書を壊せないようにし、描いた DOM から `script` / `meta` / `link` / `form` 系 / `iframe` / `object` / `embed` / SVG のアニメーション要素と、`on*` 属性・`href`(文書内の `#` 以外)・`srcdoc` などを外す(レコードの値が `TABLE_HTML` などで HTML として入る経路があるため)。画像は印刷屋のダミー画像。Web フォントは、配信元が承認済み(Google Fonts は既定、他は `policy/authoring-policy.json` の `allowExternal`)のときだけ帳票の文書に `<link>` を入れ、CSP の `style-src` / `font-src` にその配信元(Google Fonts は `fonts.googleapis.com` と `fonts.gstatic.com`)を足す。これが preview の唯一の外部通信で、送るのは設定に書いた固定の URL だけ(レコードの値は入らない)。未承認なら読まない(OS の書体)。出力には**レコードの値が入る**ので `out/` はコミット対象外
|
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
/*! @rex0220/print-craft-authoring-tools 1.
|
|
2
|
+
/*! @rex0220/print-craft-authoring-tools 1.3.0 (c) rex0220. MIT License. 計算式エンジンと印刷屋のコードは利用者の印刷屋プラグインの zip から読む(このファイルには含まれない)。commit 5abbe71. */
|
|
3
3
|
|
|
4
4
|
// src/cli.ts
|
|
5
5
|
import { existsSync as existsSync8, mkdirSync as mkdirSync2, readFileSync as readFileSync10, writeFileSync as writeFileSync2 } from "node:fs";
|
|
@@ -523,7 +523,7 @@ function devMeta() {
|
|
|
523
523
|
return { toolsVersion: pkg.version, pluginId: PRINT_CRAFT_PLUGIN_ID, minPluginVersion: MIN_PLUGIN_VERSION, supportedApiVersions: [...SUPPORTED_API_VERSIONS], commit: gitCommit(AUTHORING_ROOT), builtAt: "", mode: "dev" };
|
|
524
524
|
}
|
|
525
525
|
function toolsMeta() {
|
|
526
|
-
if (true) return JSON.parse('{"toolsVersion":"1.
|
|
526
|
+
if (true) return JSON.parse('{"toolsVersion":"1.3.0","pluginId":"lcapkanpjdabgphknkabojmcfhonhkhp","minPluginVersion":6,"supportedApiVersions":[1,2],"commit":"5abbe71","builtAt":"2026-10-09T13:34:14.744Z","mode":"build"}');
|
|
527
527
|
return devMeta();
|
|
528
528
|
}
|
|
529
529
|
|