fieldsmith 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.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +843 -0
  3. package/assets/fonts/DotGothic16.ttf +0 -0
  4. package/assets/fonts/OFL.txt +93 -0
  5. package/dist/cli/exit.js +37 -0
  6. package/dist/cli/exit.js.map +1 -0
  7. package/dist/cli/index.js +699 -0
  8. package/dist/cli/index.js.map +1 -0
  9. package/dist/cli/output.js +61 -0
  10. package/dist/cli/output.js.map +1 -0
  11. package/dist/cli/progress.js +83 -0
  12. package/dist/cli/progress.js.map +1 -0
  13. package/dist/cli/promptInput.js +57 -0
  14. package/dist/cli/promptInput.js.map +1 -0
  15. package/dist/cli/schema.js +140 -0
  16. package/dist/cli/schema.js.map +1 -0
  17. package/dist/config.js +149 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/icon/emojiFont.js +163 -0
  20. package/dist/icon/emojiFont.js.map +1 -0
  21. package/dist/icon/render.js +136 -0
  22. package/dist/icon/render.js.map +1 -0
  23. package/dist/kintone/client.js +157 -0
  24. package/dist/kintone/client.js.map +1 -0
  25. package/dist/kintone/deploy.js +519 -0
  26. package/dist/kintone/deploy.js.map +1 -0
  27. package/dist/kintone/oauth.js +156 -0
  28. package/dist/kintone/oauth.js.map +1 -0
  29. package/dist/kintone/tokenStore.js +87 -0
  30. package/dist/kintone/tokenStore.js.map +1 -0
  31. package/dist/llm/generate.js +317 -0
  32. package/dist/llm/generate.js.map +1 -0
  33. package/dist/llm/prompt.js +142 -0
  34. package/dist/llm/prompt.js.map +1 -0
  35. package/dist/spec/appSpec.js +283 -0
  36. package/dist/spec/appSpec.js.map +1 -0
  37. package/dist/spec/diff.js +218 -0
  38. package/dist/spec/diff.js.map +1 -0
  39. package/dist/spec/fieldSpec.js +353 -0
  40. package/dist/spec/fieldSpec.js.map +1 -0
  41. package/dist/spec/fromKintone.js +230 -0
  42. package/dist/spec/fromKintone.js.map +1 -0
  43. package/dist/spec/layout.js +215 -0
  44. package/dist/spec/layout.js.map +1 -0
  45. package/dist/spec/toKintone.js +170 -0
  46. package/dist/spec/toKintone.js.map +1 -0
  47. package/package.json +59 -0
@@ -0,0 +1,215 @@
1
+ /**
2
+ * フォームレイアウトの組み立て。
3
+ *
4
+ * kintone にフィールドを追加すると、既定では 1 行に 1 つずつ縦に並ぶ。
5
+ * 似た性質のフィールドを横に並べたほうが、記入する人にとって見通しが良い。
6
+ *
7
+ * まとめ方の基準は 2 段構え。
8
+ * 1. フィールドに `group` (「書誌情報」「貸出」など意味のまとまり) があればそれを使う
9
+ * 2. 無ければフィールド型の系統で代用する
10
+ *
11
+ * `group` は意味の判断が要るので、`plan` / `create` ではモデルが付ける。
12
+ * デプロイ層は付いた結果を使うだけで、判断はしない。
13
+ *
14
+ * どちらの場合も **並び順は変えない**ので、AppSpec に書いた順序の意図は保たれる。
15
+ */
16
+ /**
17
+ * フィールドの系統。同じ系統どうしだけを横に並べる。
18
+ * ここに無い型 (複数行テキスト、リッチエディター、添付ファイルなど) は
19
+ * 幅を取るか背が高くなるため、常に単独行にする。
20
+ */
21
+ const FIELD_FAMILY = {
22
+ SINGLE_LINE_TEXT: "テキスト",
23
+ LINK: "テキスト",
24
+ NUMBER: "数値",
25
+ CALC: "数値",
26
+ DROP_DOWN: "選択",
27
+ RADIO_BUTTON: "選択",
28
+ CHECK_BOX: "選択",
29
+ MULTI_SELECT: "選択",
30
+ DATE: "日時",
31
+ TIME: "日時",
32
+ DATETIME: "日時",
33
+ USER_SELECT: "ユーザー",
34
+ ORGANIZATION_SELECT: "ユーザー",
35
+ GROUP_SELECT: "ユーザー",
36
+ RECORD_NUMBER: "自動項目",
37
+ CREATOR: "自動項目",
38
+ MODIFIER: "自動項目",
39
+ CREATED_TIME: "自動項目",
40
+ UPDATED_TIME: "自動項目",
41
+ };
42
+ /** 1 行にまとめられる上限の既定値。 */
43
+ export const DEFAULT_MAX_PER_ROW = 3;
44
+ /** そのフィールドが属する系統。単独行にすべきものは null。 */
45
+ export function familyOf(type) {
46
+ return FIELD_FAMILY[type] ?? null;
47
+ }
48
+ /**
49
+ * そのフィールドをまとめる基準。単独行にすべきものは null。
50
+ *
51
+ * 幅や高さを取る型は、意味のまとまりがあっても横に並べない
52
+ * (見た目の制約は意味とは別の話なので)。
53
+ */
54
+ export function groupKeyOf(field, groups = {}) {
55
+ const family = familyOf(field.type);
56
+ if (family === null)
57
+ return null;
58
+ const group = groups[field.code];
59
+ return group === undefined || group === "" ? family : `group:${group}`;
60
+ }
61
+ /**
62
+ * フィールドの並びを、系統ごとに最大 maxPerRow 個までの行にまとめる。
63
+ *
64
+ * 並び順は保つ。系統が変わったところ、単独行にすべき型が来たところ、
65
+ * 上限に達したところで行を切る。
66
+ */
67
+ export function groupIntoRows(fields, options = {}) {
68
+ const maxPerRow = Math.max(1, options.maxPerRow ?? DEFAULT_MAX_PER_ROW);
69
+ const rows = [];
70
+ let current = [];
71
+ let currentFamily = null;
72
+ const flush = () => {
73
+ if (current.length > 0)
74
+ rows.push(current);
75
+ current = [];
76
+ currentFamily = null;
77
+ };
78
+ for (const field of fields) {
79
+ const key = groupKeyOf(field, options.groups);
80
+ // 単独行にすべき型は、前後と混ぜずにそれだけの行にする。
81
+ if (key === null) {
82
+ flush();
83
+ rows.push([field]);
84
+ continue;
85
+ }
86
+ if (key !== currentFamily || current.length >= maxPerRow) {
87
+ flush();
88
+ currentFamily = key;
89
+ }
90
+ current.push(field);
91
+ }
92
+ flush();
93
+ return rows;
94
+ }
95
+ /**
96
+ * kintone から取得した既存のレイアウトを並べ替える。
97
+ *
98
+ * GROUP と SUBTABLE の行はそのまま残す (中身の構造が別なので触らない)。
99
+ * 連続する ROW だけをいったん平らにして、系統ごとにまとめ直す。
100
+ */
101
+ export function regroupLayout(layout, options = {}) {
102
+ const result = [];
103
+ let pending = [];
104
+ const flushPending = () => {
105
+ for (const row of groupIntoRows(pending, options)) {
106
+ result.push({ type: "ROW", fields: row });
107
+ }
108
+ pending = [];
109
+ };
110
+ for (const row of layout) {
111
+ if (row.type === "ROW") {
112
+ const fields = row.fields;
113
+ if (Array.isArray(fields)) {
114
+ pending.push(...fields);
115
+ }
116
+ continue;
117
+ }
118
+ // GROUP / SUBTABLE の前後で行の連続は途切れる。
119
+ flushPending();
120
+ result.push(row);
121
+ }
122
+ flushPending();
123
+ return result;
124
+ }
125
+ /** 並べ替えの結果を人が読める形にする (--dry-run と進捗表示で使う)。 */
126
+ export function describeRows(rows) {
127
+ return rows.map((row) => row.map((field) => field.code).join(" | "));
128
+ }
129
+ /**
130
+ * 削除候補グループのフィールドコード。
131
+ * 毎回同じコードを使うことで、更新を繰り返してもグループが増えない。
132
+ */
133
+ export const ORPHAN_GROUP_CODE = "_削除候補";
134
+ export const ORPHAN_GROUP_LABEL = "削除候補";
135
+ /** レイアウトから、そのフィールドコードを取り除く。空になった行は落とす。 */
136
+ function withoutFields(layout, remove) {
137
+ const result = [];
138
+ for (const row of layout) {
139
+ if (row.type === "ROW") {
140
+ const fields = (row.fields ?? []).filter((field) => !remove.has(field.code));
141
+ if (fields.length > 0)
142
+ result.push({ type: "ROW", fields });
143
+ continue;
144
+ }
145
+ if (row.type === "GROUP") {
146
+ const nested = withoutFields((row.layout ?? []), remove);
147
+ result.push({ ...row, type: "GROUP", layout: nested });
148
+ continue;
149
+ }
150
+ result.push(row);
151
+ }
152
+ return result;
153
+ }
154
+ /** レイアウトに載っているフィールドを、入れ子も含めて集める。 */
155
+ export function collectLayoutFields(layout) {
156
+ const fields = [];
157
+ for (const row of layout) {
158
+ const own = row.fields;
159
+ if (row.type === "ROW" && Array.isArray(own))
160
+ fields.push(...own);
161
+ const nested = row.layout;
162
+ if (Array.isArray(nested))
163
+ fields.push(...collectLayoutFields(nested));
164
+ }
165
+ return fields;
166
+ }
167
+ /**
168
+ * 更新後のフォームレイアウトを組み立てる。
169
+ *
170
+ * レイアウト変更 API は「フォーム上のすべてのフィールド」の指定を求めるので、
171
+ * 現在のレイアウトを起点に、載せ替えと退避を行う。
172
+ *
173
+ * 削除候補のフィールドは**消さずに**、畳んだグループへ移す。
174
+ * 逆に、削除候補グループの中にあったフィールドが目標に戻ってきたら、外に出す。
175
+ */
176
+ export function buildUpdatedLayout(input) {
177
+ const orphans = new Set(input.orphans);
178
+ const desiredCodes = new Set(input.desired.map((field) => field.code));
179
+ // 既存の削除候補グループの中身を把握する。目標に戻ったものは外へ出す。
180
+ const existingGroup = input.current.find((row) => row.type === "GROUP" && row.code === ORPHAN_GROUP_CODE);
181
+ const parked = existingGroup === undefined
182
+ ? []
183
+ : collectLayoutFields((existingGroup.layout ?? []));
184
+ const revived = parked.filter((field) => desiredCodes.has(field.code));
185
+ // 型が分かるように、退避するフィールドの情報を現在のレイアウトから拾っておく。
186
+ const known = new Map(collectLayoutFields(input.current).map((field) => [field.code, field]));
187
+ // 削除候補グループと、そこへ入るもの・戻るものを、いったん全部どかす。
188
+ const removed = new Set([...orphans, ...parked.map((field) => field.code)]);
189
+ let base = withoutFields(input.current.filter((row) => !(row.type === "GROUP" && row.code === ORPHAN_GROUP_CODE)), removed);
190
+ if (input.regroup) {
191
+ // ROW は目標の並びで作り直す。GROUP / SUBTABLE はそのまま残す。
192
+ const others = base.filter((row) => row.type !== "ROW");
193
+ const rows = groupIntoRows(input.desired.filter((field) => !orphans.has(field.code)), {
194
+ ...(input.maxPerRow === undefined ? {} : { maxPerRow: input.maxPerRow }),
195
+ ...(input.groups === undefined ? {} : { groups: input.groups }),
196
+ }).map((row) => ({ type: "ROW", fields: row }));
197
+ base = [...rows, ...others];
198
+ }
199
+ else {
200
+ // 手を触れない場合でも、戻ってきたフィールドは行として足す必要がある。
201
+ base = [...base, ...revived.map((field) => ({ type: "ROW", fields: [field] }))];
202
+ }
203
+ const parkedNow = [...orphans].map((code) => known.get(code) ?? { code, type: "SINGLE_LINE_TEXT" });
204
+ if (parkedNow.length === 0)
205
+ return base;
206
+ return [
207
+ ...base,
208
+ {
209
+ type: "GROUP",
210
+ code: ORPHAN_GROUP_CODE,
211
+ layout: parkedNow.map((field) => ({ type: "ROW", fields: [field] })),
212
+ },
213
+ ];
214
+ }
215
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/spec/layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ import { BUILT_IN_FIELD_CODES, resolveFieldCode, } from "./appSpec.js";
2
+ import { isOptionFieldType } from "./fieldSpec.js";
3
+ export function toKintonePayloads(spec) {
4
+ return {
5
+ appName: spec.name,
6
+ properties: toFieldProperties(spec.fields),
7
+ settings: toAppSettings(spec),
8
+ views: spec.views === undefined ? null : toViews(spec.views),
9
+ };
10
+ }
11
+ /**
12
+ * FieldSpec[] を kintone の properties に変換する。
13
+ * properties のキーはフィールドコードと一致している必要がある。
14
+ */
15
+ export function toFieldProperties(fields) {
16
+ const properties = {};
17
+ for (const field of fields) {
18
+ const code = resolveFieldCode(field);
19
+ properties[code] = toFieldProperty(field, code);
20
+ }
21
+ return properties;
22
+ }
23
+ function toFieldProperty(field, code) {
24
+ const property = {
25
+ type: field.type,
26
+ code,
27
+ label: field.label,
28
+ };
29
+ setIfDefined(property, "required", field.required);
30
+ setIfDefined(property, "unique", field.unique);
31
+ setIfDefined(property, "noLabel", field.noLabel);
32
+ if (isOptionFieldType(field.type)) {
33
+ const optionField = field;
34
+ property["options"] = toOptions(optionField.options);
35
+ if (optionField.defaultValue !== undefined) {
36
+ // kintone は複数選択系の defaultValue を配列で受け取る。
37
+ const multiSelect = field.type === "CHECK_BOX" || field.type === "MULTI_SELECT";
38
+ property["defaultValue"] = multiSelect
39
+ ? toArray(optionField.defaultValue)
40
+ : optionField.defaultValue;
41
+ }
42
+ return property;
43
+ }
44
+ switch (field.type) {
45
+ case "SINGLE_LINE_TEXT":
46
+ setIfDefined(property, "defaultValue", field.defaultValue);
47
+ setIfDefined(property, "minLength", toStringOrUndefined(field.minLength));
48
+ setIfDefined(property, "maxLength", toStringOrUndefined(field.maxLength));
49
+ break;
50
+ case "MULTI_LINE_TEXT":
51
+ case "RICH_TEXT":
52
+ setIfDefined(property, "defaultValue", field.defaultValue);
53
+ break;
54
+ case "NUMBER":
55
+ setIfDefined(property, "defaultValue", toStringOrUndefined(field.defaultValue));
56
+ setIfDefined(property, "minValue", toStringOrUndefined(field.minValue));
57
+ setIfDefined(property, "maxValue", toStringOrUndefined(field.maxValue));
58
+ setIfDefined(property, "digit", field.digit);
59
+ setIfDefined(property, "displayScale", toStringOrUndefined(field.displayScale));
60
+ setIfDefined(property, "unit", field.unit);
61
+ setIfDefined(property, "unitPosition", field.unitPosition);
62
+ break;
63
+ case "CALC":
64
+ property["expression"] = field.expression;
65
+ setIfDefined(property, "format", field.format);
66
+ setIfDefined(property, "displayScale", toStringOrUndefined(field.displayScale));
67
+ setIfDefined(property, "unit", field.unit);
68
+ setIfDefined(property, "unitPosition", field.unitPosition);
69
+ setIfDefined(property, "hideExpression", field.hideExpression);
70
+ break;
71
+ case "DATE":
72
+ case "TIME":
73
+ case "DATETIME":
74
+ setIfDefined(property, "defaultNowValue", field.defaultNowValue);
75
+ setIfDefined(property, "defaultValue", field.defaultValue);
76
+ break;
77
+ case "LINK":
78
+ property["protocol"] = field.protocol;
79
+ setIfDefined(property, "defaultValue", field.defaultValue);
80
+ setIfDefined(property, "maxLength", toStringOrUndefined(field.maxLength));
81
+ break;
82
+ case "USER_SELECT":
83
+ case "ORGANIZATION_SELECT":
84
+ case "GROUP_SELECT":
85
+ setIfDefined(property, "entities", field.entities);
86
+ setIfDefined(property, "defaultValue", field.defaultValue);
87
+ break;
88
+ case "FILE":
89
+ setIfDefined(property, "thumbnailSize", field.thumbnailSize);
90
+ break;
91
+ }
92
+ return property;
93
+ }
94
+ /**
95
+ * 選択肢の配列を kintone の options 形式に変換する。
96
+ * kintone は `{ ラベル: { label, index } }` を要求し、index は文字列でなければならない。
97
+ */
98
+ export function toOptions(options) {
99
+ const result = {};
100
+ options.forEach((label, index) => {
101
+ result[label] = { label, index: String(index) };
102
+ });
103
+ return result;
104
+ }
105
+ /** 一般設定・アプリ説明・テーマを kintone の一般設定変更 API のパラメータに変換する。 */
106
+ export function toAppSettings(spec) {
107
+ const settings = {};
108
+ setIfDefined(settings, "description", spec.description);
109
+ setIfDefined(settings, "theme", spec.theme);
110
+ const general = spec.settings;
111
+ if (general !== undefined) {
112
+ if (general.titleFieldCode !== undefined) {
113
+ settings["titleField"] = { selectionMode: "MANUAL", code: general.titleFieldCode };
114
+ }
115
+ setIfDefined(settings, "enableComments", general.enableComments);
116
+ setIfDefined(settings, "enableThumbnails", general.enableThumbnails);
117
+ setIfDefined(settings, "enableBulkDeletion", general.enableBulkDeletion);
118
+ setIfDefined(settings, "enableDuplicateRecord", general.enableDuplicateRecord);
119
+ setIfDefined(settings, "enableInlineRecordEditing", general.enableInlineRecordEditing);
120
+ setIfDefined(settings, "firstMonthOfFiscalYear", toStringOrUndefined(general.firstMonthOfFiscalYear));
121
+ }
122
+ return Object.keys(settings).length > 0 ? settings : null;
123
+ }
124
+ /**
125
+ * ViewSpec[] を kintone の views 形式に変換する。
126
+ * views のキーは一覧名で、index は表示順を表す文字列。
127
+ */
128
+ export function toViews(views) {
129
+ const result = {};
130
+ views.forEach((view, index) => {
131
+ const entry = {
132
+ index: String(index),
133
+ type: view.type,
134
+ name: view.name,
135
+ };
136
+ if (view.type === "LIST") {
137
+ setIfDefined(entry, "fields", view.fields);
138
+ }
139
+ else {
140
+ setIfDefined(entry, "date", view.date);
141
+ setIfDefined(entry, "title", view.title);
142
+ }
143
+ setIfDefined(entry, "filterCond", view.filterCond);
144
+ setIfDefined(entry, "sort", view.sort);
145
+ setIfDefined(entry, "pager", view.pager);
146
+ setIfDefined(entry, "device", view.device);
147
+ result[view.name] = entry;
148
+ });
149
+ return result;
150
+ }
151
+ /** 一覧の fields に指定できるフィールドコードの集合 (spec 由来 + 組み込み)。 */
152
+ export function selectableFieldCodes(spec) {
153
+ const codes = new Set(BUILT_IN_FIELD_CODES);
154
+ for (const field of spec.fields) {
155
+ codes.add(resolveFieldCode(field));
156
+ }
157
+ return codes;
158
+ }
159
+ function setIfDefined(target, key, value) {
160
+ if (value !== undefined) {
161
+ target[key] = value;
162
+ }
163
+ }
164
+ function toStringOrUndefined(value) {
165
+ return value === undefined ? undefined : String(value);
166
+ }
167
+ function toArray(value) {
168
+ return Array.isArray(value) ? value : [value];
169
+ }
170
+ //# sourceMappingURL=toKintone.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toKintone.js","sourceRoot":"","sources":["../../src/spec/toKintone.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,59 @@
1
+ {
2
+ "name": "fieldsmith",
3
+ "version": "0.1.0",
4
+ "description": "AppSpec (JSON) から kintone アプリを何度でも作る CLI。AppSpec は要件の文章からも作れる",
5
+ "keywords": [
6
+ "kintone",
7
+ "cli",
8
+ "codegen",
9
+ "claude",
10
+ "anthropic",
11
+ "infrastructure-as-code"
12
+ ],
13
+ "license": "MIT",
14
+ "author": "Daisuke Motohashi",
15
+ "homepage": "https://github.com/motohasystem/fieldsmith#readme",
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/motohasystem/fieldsmith.git"
19
+ },
20
+ "bugs": {
21
+ "url": "https://github.com/motohasystem/fieldsmith/issues"
22
+ },
23
+ "type": "module",
24
+ "bin": {
25
+ "fieldsmith": "./dist/cli/index.js"
26
+ },
27
+ "files": [
28
+ "dist",
29
+ "assets"
30
+ ],
31
+ "engines": {
32
+ "node": ">=20"
33
+ },
34
+ "scripts": {
35
+ "build": "tsc -p tsconfig.build.json",
36
+ "typecheck": "tsc --noEmit",
37
+ "test": "vitest run",
38
+ "test:watch": "vitest",
39
+ "fieldsmith": "tsx src/cli/index.ts",
40
+ "e2e:manual": "tsx scripts/e2e-manual.ts",
41
+ "prepublishOnly": "npm run build",
42
+ "prepare": "npm run build"
43
+ },
44
+ "dependencies": {
45
+ "@anthropic-ai/sdk": "^0.117.1",
46
+ "@kintone/rest-api-client": "^5.7.5",
47
+ "@resvg/resvg-js": "^2.6.2",
48
+ "commander": "^14.0.1",
49
+ "zod": "^3.25.76",
50
+ "zod-to-json-schema": "^3.25.2"
51
+ },
52
+ "devDependencies": {
53
+ "@types/node": "^24.5.2",
54
+ "msw": "^2.11.3",
55
+ "tsx": "^4.20.6",
56
+ "typescript": "^5.9.2",
57
+ "vitest": "^3.2.4"
58
+ }
59
+ }