ken_nogi/ClaudePleasanter/営業積算システム/.claude/skills/pleasanter-site-spec/SKILL.md
Kenichiro NOGI 67cc3da6c8 up
2026-07-13 19:02:04 +09:00

267 lines
18 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: pleasanter-site-spec
description: Pleasanterのサイト設定JSONget-site-config.js / api-site-get の getsite レスポンスから、SiteSettingsを読み解いたMarkdown仕様書を生成し、Scripts/Styles/ServerScripts/Processesの抽出・編集・反映extract-site-config.js / build-desired-config.js / apply-site-config.jsを行う。また、技術仕様書とは別に業務担当者向けの概要書docs/site-{SiteId}_{サイト名}_overview.mdを作成し、md-to-pdf.jsでPDF化する。「仕様書を作って」「サイト仕様書」「SiteSettingsをドキュメント化」「スクリプトを抜き出して」「プロセス設定を直して反映して」「概要書を作って」「PDFにして」「site-spec」等の依頼で使う。
---
# Pleasanter サイト仕様書生成
`./siteSettingJsons/site-{SiteId}_latest.json``getsite` APIレスポンス、`Response.Data` 配下にサイト情報)と、
`./configs/site-{SiteId}_{サイト名}/``extract-site-config.js` による抽出済みScripts/Styles/ServerScripts/Processes
読み解き、`./docs/site-{SiteId}_{サイト名}_spec.md` として日本語のMarkdown仕様書を出力する。
この仕様書はClaudeが対話的に読み解いて執筆するものであり、機械的なテンプレート処理で自動生成するものではない
`generate-site-documentation.js` は過去に試みられた機械生成版で、サイト間の暗黙的な関連や業務的な類推まではできず
品質面の問題があったため現在のワークフローでは使用しない。削除はされていないが参照しないこと)。
## 入力の特定
1. ユーザーがJSONファイルパスやSiteIdを指定した場合はそれを使う。
2. 指定がなければ `./siteSettingJsons/site-*_latest.json` を探す。複数ある場合はユーザーに確認する。
3. `./siteSettingJsons/site-{SiteId}_latest.json` が無ければ、先に `node get-site-config.js` の実行を提案する
(エンドポイントは `/api/items/{SiteId}/getsite` を使うこと。`/api/items/{SiteId}/get` はアイテム一覧取得APIであり別物なので注意
## 出力ファイル
`./docs/site-{SiteId}_{サイト名}_spec.md`(サイト名は `configs/site-{SiteId}_{サイト名}/` のフォルダ名と揃える。既存があれば上書きしてよい)。
`docs/`フォルダが無ければ作成する。
## 仕様書の構成(この順番・見出しレベルを踏襲する)
```markdown
# サイト仕様書:{Title}SiteId: {SiteId}
- 取得元データ: [site-{SiteId}_latest.json](../siteSettingJsons/site-{SiteId}_latest.json)
- 取得日時: {UpdatedTime}(サイト更新日時)/設定バージョン `Ver: {Ver}`
## 1. サイト基本情報
TenantId, Title, ReferenceType, ParentId, InheritPermission, Publish,
DisableCrossSearch, Creator/Updator, CreatedTime, SiteSettings.Version を表形式で)
## 2. アクセス権限Permissions
Permissions配列を 種別/対象ID/権限レベル の表に分解。
「権限値はビットフラグの加算方式のため正確な意味は環境のロール定義に依存する」旨を注記)
## 3. 画面構成
### 3.1 一覧画面GridColumns
GridColumns配列を 順番/列名/表示ラベル の表に。ラベルはColumns配列から解決、
無ければ「項目種別の判定ルール」のデフォルト名を使う)
### 3.2 編集画面レイアウトEditorColumnHash / Sections
EditorColumnHashの各タブ配列を 順番/項目名(内部名)/ラベル名 の表に。
`_Section-N` はラベル名欄に「―(セクション「{LabelText}」開始)」と記載。
続けてSections配列を Id/ラベル/AllowExpand/Expand の表で示す)
### 3.3 タイトル表示TitleColumns / TitleSeparator
TitleColumns配列をTitleSeparatorで連結した式を明記
## 4. 項目定義Columns
Columns配列を 列名(内部)/種別/表示ラベル/説明・入力ガイド/備考 の表に。
種別は下記「項目種別の判定ルール」で推定。
備考にはNoWrap, FieldCss, ExtendedHtmlAfterControlの有無などを記載
### 4.1 項目ごとの補足HTMLExtendedHtmlAfterControl
(該当項目があれば 列名/色styleやclassから読み取れれば/内容 の表。無ければこの節は省略)
## 5. 作成・更新権限(フィールド単位)
PermissionForCreating / PermissionForUpdating を表で。無ければ「設定なし」と明記)
## 6. 集計設定Aggregations
存在する場合のみ。Id/GroupBy/Type/Target を表で)
## 7. 他サイト連携Links / ルックアップ)
(存在する場合のみ。起点列/参照先SiteId/参照先の値→自コピー先/JsonFormat を表で。
「参照先サイトの{From}列の値を、このサイトの{To}列にコピーする」という関係性を文章でも補足)
## 8. プロセス設定Processes
(存在する場合のみ。定義ファイルへのリンク configs/site-{SiteId}_{サイト名}/processes.json を明記した上で、
Id/Name・DisplayName/実行条件(CurrentStatus→ChangedStatus)/動作(OnClick等)/成功メッセージ を表で)
## 9. スタイルStyles
存在する場合のみ。Id/Title/適用範囲(New/Edit/Index等のフラグ)/ファイルへのリンクを表で。
CSS本体はMarkdownに貼らず、抽出済みファイルへのリンクのみとする
## 10. スクリプトScriptsサーバースクリプトServerScripts
存在する場合のみ。Id/Title/適用画面/ファイルへのリンクを表で。
スクリプト本体はMarkdownに貼らず、抽出済みファイルへのリンクのみとする。
概要は「何をするスクリプトか」を1〜2行で要約。
本文中にAPIキー・Webhook URL・パスワード等の秘密情報らしき文字列`API_KEY`, `SECRET`, `Bearer `,
URLに埋め込まれたトークン等を見つけた場合は、値そのものをMarkdownに転記せず、
「気になる点」に必ずセキュリティ上の指摘として記載する)
## 11. その他設定
NoDisplayIfReadOnly, HideLink, SectionLatestId, 各種ガイド文の設定有無, Commentsの使用有無など
---
## 気になる点(レビュー観点)
(プレースホルダーらしき文言、権限設定の偏り、項目単位の権限の抜け、
未設定のガイド文など、気づいた点を箇条書きで)
```
## 項目種別の判定ルールColumns内 ColumnName のプレフィックスから推定)
| プレフィックス/名前 | 種別 |
|---|---|
| ClassA〜Z | 文字列(分類) |
| Class001〜040等3桁連番 | 文字列(拡張分類)。`Hide: true`の場合が多く、他項目のルックアップ先の値を裏で保持する用途が多い |
| NumA〜Z | 数値 |
| DateA〜Z | 日付 |
| DescriptionA〜Z | 説明(複数行文字列) |
| CheckA〜Z | チェックボックス |
| AttachmentsA〜Z | 添付ファイル |
| Owner, Manager, Assignee等 | ユーザー選択 |
| Status | 状態 |
| {対象}IdResultId, IssueId等 | 自動採番ID |
| Title | タイトル |
| Comments | コメント欄 |
## 注意事項
- SiteSettingsに存在しない項目・空の設定例: `ClassHash`, `NumHash` などのラベル定義ハッシュが `{}`)は
「標準ラベルのまま」として仕様書に明記し、存在しないかのように省略しない。
- 表形式を基本とし、箇条書きより表を優先する(今回のレビューで「編集画面レイアウトは項目名とラベル名を併記」との
指摘を受けた経緯があるため、内部名とラベル名は必ず併記する)。
- 出力言語は日本語。
- 複数サイトが関連する仕様書(「関連するテーブルと合わせて」等の依頼)を作る場合は、対象サイトの`Links`設定だけでなく、
ServerScripts内で`items.Get(masterTableId)`のように直接SiteIdをハードコードして参照している「正式なLinks設定に現れない
暗黙的なテーブル参照」も洗い出し、別セクションとして明記する。あわせて`ParentId`を辿ってサイトツリー上の位置関係も
簡潔に図示するとレビューしやすい。
## 概要書(業務担当者向け機能説明)の生成
技術仕様書spec.mdとは別に、「概要書を作って」「機能的な説明がほしい」等の依頼があった場合は、
`ColumnName`ClassA, DateB, Class001等の内部コードやJSON設定値・スクリプト実装といった技術的要素を一切排除し、
ラベル名と業務フローのみで構成した概要書を作成する。
### 出力ファイル
`./docs/site-{SiteId}_{サイト名}_overview.md``siteSettingJsons/`・`configs/`ではなく`docs/`フォルダに置く。
これらは秘密情報を含み得るため`.gitignore`済みだが、`docs/`配下のspec.md・概要書・PDFは共有物としてGit管理対象にする想定
`docs/`フォルダが無ければ作成する。
### 概要書の構成
```markdown
# 概要書:{Title}
- 技術仕様(項目のシステム上の名称・設定値等)は [{spec.mdへのリンク}](./site-{SiteId}_{サイト名}_spec.md) を参照。
本書は業務担当者向けに、機能面のみを平易に説明するものです。
## 1. これは何か
業務的にこのサイトが何のためのものかを2〜4文で
## 2. 登場する情報(入力項目)
(分類/項目(ラベル名のみ)/内容 の表。ColumnNameは記載しない。Hide項目でも
業務上意味のあるもの(自動反映される裏項目等)は「内容」欄で触れる)
## 3. 業務の流れ(ボタン操作)
(操作/状態の変化(ラベル値同士、例:「新規作成→図確回覧」)/説明 の表。
Processesの内部処理・スクリプト名には触れず、「何が起きるか」を業務言葉で説明する
## 4. 通知される場面
Notificationsを「◯◯時に誰に何が届くか」という箇条書きに変換。メール本文・件名の技術的書式は転記しない
## 5. 関連する仕組み(マスタ連携)
Links・暗黙的テーブル参照を「◯◯マスタ何を自動反映するか」という業務目線の箇条書きに変換。
SiteIdやColumnNameは書かず、サイト名Titleとその役割のみ記載。
兄弟サイト同じ設計パターンの別サイトがあれば、違いを1文で触れる
```
### 作成時の注意
- 表内の「項目」列は必ずラベル名LabelTextのみ。ラベル未設定の項目は概要書には載せない業務上意味を説明できないため
- Statusの遷移は内部コード100/300/900等を書かず、ラベル値新規作成完了 等)同士の矢印で表現する。
- スクリプト内で見つけた秘密情報APIキー等は概要書には一切転記しないそもそも概要書はスクリプト実装に触れない
- 複数サイト分をまとめて依頼された場合、共通する業務フローは重複して書いてよいが、各サイト固有の違い(段階数の違い、
追加の管理項目など)を各概要書の末尾で明示し、他サイトとの差分が一目で分かるようにする。
## 複数サイトの全体関連図site-relations_overview.md
`config.json``SiteId` に複数サイトが列挙されている場合など、「全体の関連図を作って」「サイト間の連携をまとめて」
等の依頼があれば、個々のサイト仕様書とは別に `./docs/site-relations_overview.md` を作成する。対象は
`config.json``SiteId` に列挙された全サイト(または依頼で指定された範囲)。
### 出力ファイルと構成
`./docs/site-relations_overview.md`(同名`.pdf`も作成対象。以下を1枚で俯瞰できるようにまとめる。
```markdown
# サイト関連図:{システム名など}
## 1. サイトツリーParentId
`ParentId` を辿った親子関係を、簡易的なツリー表記かMermaid `graph` で図示。
ードにSiteIdとサイト名Titleを併記
## 2. サイト一覧
SiteId/サイト名/役割1行の表。概要書へのリンクも併記
## 3. 明示的な連携Links
(各サイトの`Links`設定を 起点サイト/起点列/参照先サイト/参照先の値→コピー先 の表にまとめる。
Idではなくサイト名で表現し、業務的に何を自動反映しているかも一言添える
## 4. 暗黙的な連携ServerScriptsのハードコード参照
ServerScripts内で`items.Get(SiteId)`等により直接SiteIdを指定して他サイトを参照している箇所を洗い出し、
起点サイト/参照先サイト/該当スクリプトファイル/目的(推測) の表にまとめる。
正式なLinks設定には現れないため、レビュー上重要な情報として明記する
```
### 作成時の注意
- 各サイトの `spec.md`7. 他サイト連携で洗い出した内容を集約すればよい。個別spec.mdより先に全サイト分の
spec.mdを作成しておくと効率的。
- サイト名はTitleを使い、SiteIdは補助情報として併記する概要書と違い、こちらは技術仕様書寄りの位置づけのため
SiteId自体は隠さなくてよい
## PDF化
概要書または他のMarkdownをPDF化する依頼があった場合は、プロジェクトルートの `md-to-pdf.js` を使う。
```
node md-to-pdf.js ./docs/site-{SiteId}_{サイト名}_spec.md ./docs/site-{SiteId}_{サイト名}_overview.md
```
- 追加npmパッケージ非依存本プロジェクトに`package.json`が無いことに合わせた設計。Markdown→HTML変換は
スクリプト内の簡易パーサ(見出し/表/太字/リンク/箇条書き/水平線/段落で行い、PDF化はOS標準のMicrosoft Edge
無ければGoogle Chromeのヘッドレス印刷機能を使う。
- 出力は入力と同じフォルダに`{同名}.pdf`中間HTMLは一時フォルダに作成し、変換後に自動削除
- 複数ファイルを一度に渡せる(`node md-to-pdf.js ./docs/*.md`)。
- **既知の落とし穴**: フォルダパスに`#`を含む場合(例: `#GitHub`)、素朴に`file://` + パス文字列を連結すると
`#`以降がURLフラグメントと誤認識され、無関係なページが開かれてPDFの中身が空別物になる。
`md-to-pdf.js`は`url.pathToFileURL()`で正しくエンコードしているため通常は問題にならないが、
同種のブラウザ自動化コードを新たに書く場合は同じ罠に注意する。
## 関連ツールScripts/Styles/ServerScripts/Processesの抽出・編集・反映
仕様書化とは別に、「スクリプトを個別ファイルに分けて」「プロセス設定を直して反映して」等の依頼では、
以下のツールチェーンを使う(詳細は `README.md` 参照)。
1. `node get-site-config.js``siteSettingJsons/site-{SiteId}_latest.json` を取得し、続けて自動的に抽出も行う
`extract-site-config.js` が内部から呼ばれ、`configs/site-{SiteId}_{サイト名}/` に以下を分割保存する。未取得なら先にこれを実行)
- `scripts/{Id}_{Title}.js`(クライアントスクリプト本体)
- `styles/{Id}_{Title}.css`(スタイル本体)
- `serverscripts/{Id}_{Title}.js`(サーバースクリプト本体)
- `html/{GuideName}.html`GridGuide等のガイドHTML。SiteSettingsではなくサイトデータ直下の項目
- `processes.json``SiteSettings.Processes` の定義ファイル、1ファイルにまとめる。分割しない
- `manifest.json`上記ファイルとId/Titleの対応表。再構成に必須
- 抽出だけをやり直したい場合(`latest.json`は既に取得済み)は `node extract-site-config.js` を単独実行してもよい
2. ユーザーの指示に従い、`scripts/*.js` 等の中身を直接編集する(`manifest.json` のId/メタ情報は変更しない)。
新規追加の場合は `manifest.json` に対応エントリ(`Id`は既存と重複しない値、`File`名)を追加してからファイルを作成する。
3. `node build-desired-config.js site-{SiteId}` … 分割ファイルを再構成し `desired_config.json` を生成(送信なし)。
フォルダ名はサイト名まで含む正式名(`site-{SiteId}_{サイト名}`)だが、`site-{SiteId}` の前方一致指定でも
`configs/`配下から自動解決される
4. `node apply-site-config.js` … ドライラン確認差分・送信Body・curlコマンド表示のみ、送信なし
5. 内容をユーザーに確認してもらい、問題なければ表示されたcurlコマンドをユーザー自身が手動実行する
### 厳守事項(安全設計)
- **`apply-site-config.js` は常にドライラン。Claude自身がAPIへ実送信することはしない**
`ENABLE_ACTUAL_SEND` を有効化する改修や、curlコマンドの代理実行も行わない
反映の最終実行はユーザー自身に委ねる。
- `build-desired-config.js` が作る `desired_config.json``Mode:"partial"``updatesitesettings`)専用。
Scripts/Styles/ServerScripts/Processes以外のサイト設定には触れない。
- ガイドHTML`html/*.html`)は `updatesitesettings` では反映できない(サイト直下の項目のため)。
反映が必要なら `Mode:"full"``updatesite`用の別JSONが要ることをユーザーに伝える。自動生成はしない。
- 抽出したスクリプト・サーバースクリプトの中に **APIキーやWebhook URL等の秘密情報がハードコードされている場合がある**
(実例あり)。抽出・編集作業でこれらの値を見つけたら、チャット上にそのまま貼り付けず、ユーザーに直接ファイルを確認してもらう。
また `siteSettingJsons/` フォルダ・`configs/` フォルダ・`config.json` は `.gitignore` 済みだが、誤ってコミットしないよう注意喚起する。