Skip to content

Latest commit

 

History

History
201 lines (160 loc) · 25.3 KB

File metadata and controls

201 lines (160 loc) · 25.3 KB

Codeer.LowCode.Blazor.Starter - Claude Code 向けガイド

このリポジトリは Codeer.LowCode.Blazor(Blazor 向けローコードフレームワーク、NuGet 配布の商用製品)で アプリケーションを始めるためのビルド可能な完成形。リポジトリでは Source/Hosts/ 配下のフォルダ 1 つ=ホストアプリ 1 種類(セットアップで顧客の作業フォルダに書き出されるのは Cookie ホスト 1 つで、Source/ 直下にプロジェクトが並ぶ)。

用語: ホスト=デザインプロジェクト(画面・データ・スクリプト=ローコードで作る中身)を動かす C# アプリケーション。 このリポジトリにあるのはホスト。デザインプロジェクトはデザイナ(またはテンプレート CLI)で作り、ホストの DesignFileDirectory にデプロイする。 中身は Visual Studio テンプレートが LowCodeApp という名前で生成する結果そのもの(フレームワークは NuGet 参照)。

最初にやること(空フォルダから始めたとき)

ユーザーが「この URL(リポジトリ)を見て指示に従って」「セットアップして」と言ってきて、まだビルドも起動もしていない状態なら、 ClaudeCodeForDeveloper/claude-code-setup.md を読んで、その手順を上から実行する(環境確認 → 取得 → ビルド → デザインプロジェクト作成 → Claude Code ワークスペース展開 → サーバーとデザイナの起動)。質問は最小限、既定値で一本道。

このフォルダで Claude Code ができること(優先順)

セットアップ後のフォルダ構成。ホストを触る人はリポジトリのルートで、デザインを作る人は DesignProjects/<デザイン名>/ Claude Code を起動する。 ルートで起動してもデザインは編集できる(.claude/settings.local.json に同じ許可があり、フックが各デザインワークスペースの自動更新を代行する)。

<ROOT>/
├── CLAUDE.md                        ← この文書 (ホスト側の説明・作業ルール)
├── .claude/                         ← Claude Code の設定。settings.json (共通・コミット済み) と settings.local.json (デザイナ exe パス入りの許可・フック。developer-workspace が生成。gitignore)
├── ClaudeCodeForDeveloper/          ← ホスト (C#) を触る Claude Code 向けの文書
│   ├── claude-code-setup.md         ←   セットアップ手順 (コミット済み・Claude Code が実行する)
│   ├── _specs/                      ←   ライブラリの拡張点リファレンス (デザイナの developer-workspace が生成。gitignore)
│   └── _hooks/                      ←   ルート用フック (DesignProjects/*/ のワークスペースを巡回して最新化。同上)
├── Source/                          ← ホストのソース (C#: LowCodeApp.sln / Server / Client / Client.Shared / Designer / LicenseRegisterCli)。最後の手段
├── DesignProjects/                  ← デザインプロジェクト (画面・データ・スクリプト)。1 フォルダ = 1 デザイン
│   └── <デザイン名>/                ←   Claude Code ワークスペース (デザイン担当者はここで起動)
│       ├── CLAUDE.md                ←     デザイン作業の規約 (デザイナが生成)
│       ├── ClaudeCodeForDesigner/   ←     デザインの作り方・仕様・カタログ (デザイナが自動生成。手で編集しない)
│       ├── Project.md               ←     このデザイン固有のルール (ユーザー所有。守る)
│       ├── ddl/  docs/              ←     テーブル定義 SQL / このデザイン固有の文書
│       └── design/                  ←     デザイン本体 (app.clprj / Modules / PageFrames …)。デザイナが開く・デプロイされる範囲
├── Local/                           ← ローカル実行用 (Data = SQLite / Designs = デプロイ先 App.zip / Storages / Font)
└── .vscode/                         ← VS Code の起動・ビルド設定 (Visual Studio が無い環境向け)
  1. 画面・データ構造・業務ルールの追加変更 → DesignProjects/<デザイン名>/design/ を編集する(ローコード)。 やり方は そのフォルダの CLAUDE.mdClaudeCodeForDesigner/CLAUDE.md着手前に必ず読む。ルートで起動した Claude Code がデザインを触るときも同じ)。 デザインの変更に C# の再ビルドは要らない。反映はデザイナの「送信」か CLI の deploy
  2. 設定で表せないことだけスクリプト(*.mod.cs)。最小限に。 スクリプトを書く前に「既存フィールド/プロパティで代替できないか」を必ず問う
  3. C#(このリポジトリの Source/)を触るのは最後の手段。 フィールド型そのものが無い・性能をコードで改善したい・独自 API / 外部連携が要る、 などローコードの範囲で不可能と確定したときだけ。やり方は下の「ホストのカスタマイズ」と ClaudeCodeForDeveloper/_specs/HostCustomization.md

サンプルを土台にしない・頼まれていないものを作らない: ユーザーのアプリは Empty から作った DesignProjects/Project/(セットアップ既定。フォルダはリネームしてよい)。 サンプル集(DesignProjects/PatternShowcase/)はユーザーが希望したときだけ別のデザインプロジェクトとして展開し、そこに増築しない。参考実装は各ワークスペースの ClaudeCodeForDesigner/_samples/ に常にある。 既存のデザインがサンプル由来なのにユーザーが自分のアプリを求めたら、空のプロジェクトから作り直すことを提案して確認する(下の「デザインプロジェクトの切り替え」)。

自動テスト (Selenium): ユーザーが求めたら DesignProjects/<デザイン名>/ClaudeCodeForDesigner/Docs/SeleniumTestGuide.md の手順で。デザイナの selenium-test-init がテストプロジェクトの雛形(WebDriverManager / DataManager / ログイン / スモークテスト)を展開し、pageobject が PageObject を生成する。テスト対象はユーザーのデザインプロジェクトで、置き場は Source/LowCodeApp.SeleniumTestLowCodeApp.sln に追加する)。

リポジトリには同じ雛形のコピー `Source/Hosts/Common/LowCodeApp.SeleniumTest` が各 Web バリアントの `LowCodeApp.sln` に入っている(ホスト自身のテスト用。VSIX・export-app には含めない)。

ClaudeCodeForDeveloper/_specs/ が無い(セットアップ前・パッケージ更新後)なら developer-workspace、デザインプロジェクトの ClaudeCodeForDesigner/ が無いなら claude-workspace で展開する(コマンドは ClaudeCodeForDeveloper/claude-code-setup.md の Step 5 / Step 7)。

バリアントの選び方

公開しているホストは 2 つ。既定は Cookie(Visual Studio テンプレート名も接尾辞なしの Codeer.LowCode.Blazor)。

フォルダ 用途 選ぶ基準
Source/Hosts/Cookie/ Web(WASM クライアント + ASP.NET Core サーバー)、Cookie 認証(ユーザーテーブルでパスワード検証) 業務アプリの既定。Entra ID / OIDC / TOTP など独自の認証を組むときもここを土台にする(cookie スキームと [Authorize]、現在ユーザー解決はそのまま使え、ログインの発行方法だけ差し替える)
Source/Hosts/Maui/ Cookie + .NET MAUI(Android/iOS)クライアント スマホアプリとして配布したい。デザイン変更はストア更新なしで反映される

Source/Hosts/ にはほかに Normal(認証なし)/ Wpf WinForms(デスクトップ単体)/ MultiTenant(マルチテナント)も保守用に置いてあるが、 テンプレートとしては提供していない。ユーザーに勧めない(認証なしが要るときは下の「認証を外す」)。

認証を外す(前段のリバースプロキシや Easy Auth で守られている等、ログイン画面が要らないとき)

Cookie から引き算する。触るのは 6 か所: Server/CookieAuthentication.cs(cookie スキームの登録。Program.cs の呼び出しごと)、 Server/Controllers/AccountController.csServer/PasswordCheckUser.cs(+ appsettings*.jsonPasswordCheckUserTableInfoSystemConfig の該当プロパティ)、 各 Controller の [Authorize]Client/wwwroot/login.htmlClient/LoginInfo.csProgram.cs / NavigationService.cs のログイン遷移)、 Services/DataService.cs の現在ユーザー解決(前段認証のヘッダから取るか固定値にする)。

差分の正解は `Source/Hosts/Normal/` にあるので、迷ったら `git diff --no-index Source/Hosts/Cookie/LowCodeApp.Server Source/Hosts/Normal/LowCodeApp.Server` で見比べる。

共通の構成

  • LowCodeApp.Server(デスクトップは LowCodeApp.Wpf / LowCodeApp.WinForms): サーバー。Program.csSystemConfig に appsettings を流し込み、 Controller(ModuleDataController 等)が API を出す。DB は Codeer.LowCode.Blazor.DbAccess
    • Services/CustomizedModuleDataIO.cs — 保存・更新・一括 INSERT のフック(パスワードハッシュはここ)
    • Services/FileStorageTable.cs — appsettings の保存先設定 → IFileStorage(FileSystem / Azure Blob / S3)
    • Services/MailSenderTable.cs — 送信インフラ名 → IMailSender(Smtp / GraphApi / Gmail)
    • Services/DataService.cs — 1 リクエスト分の DB アクセス・現在ユーザー(IAuthenticationContext
    • Controllers/TestAPIController.cs — 独自 Web API を足すときの雛形
  • LowCodeApp.Client: Blazor WebAssembly。Pages/LowCodePage.razor がローコードページのホスト
  • LowCodeApp.Client.Shared: クライアント共通サービス(AppInfoService/ModuleDataService/NavigationServiceBase)。 Web・デスクトップ・モバイルで共有。独自フィールド型・ProCode コンポーネント・スクリプト用サービスはここに置く (Server / Client / Designer の 3 プロセスすべてから参照されているため)。Samples/ に ProCode とコードビハインドの実例
  • LowCodeApp.Designer: ビジュアルデザイナ(WPF)。デザインファイル(JSON/SQL/C# スクリプト)を編集する。 App.xaml.cs が拡張の登録場所(テンプレート・ツールメニュー・スクリプト型・AI チャット)。 exe は Source/Hosts/Common/LowCodeApp.Designer/bin/Debug/net8.0-windows/LowCodeApp.Designer.exe。 GUI を出さない CLI(designcheck / sql / rename-* / template-create / deploy / api / claude-workspace …)を持つ。 GUI サブシステムの exe なので PowerShell からは Start-Process -Wait で呼び、結果は --out の JSON で受ける
  • LowCodeApp.Maui(Maui のみ): MAUI クライアント。README.md に接続先・証明書・起動手順

ビルドと起動(Visual Studio が無くてもよい)

dotnet build Source/Hosts/Cookie/LowCodeApp.sln                                   # 初回は NuGet 復元で数分
dotnet run --project Source/Hosts/Cookie/LowCodeApp.Server --launch-profile https  # https://localhost:7137
Source/Hosts/Common/LowCodeApp.Designer/bin/Debug/net8.0-windows/LowCodeApp.Designer.exe DesignProjects/<デザイン名>/design   # 引数のフォルダのプロジェクトを開いて起動
  • 前提: .NET 10 SDK(Visual Studio 2026 に同梱)。リポジトリのホストは .NET 8(フレームワークの対象)。export-app が書き出すアプリは net10.0 と最新パッケージに上げる。
  • Visual Studio 2026: LowCodeApp.sln を開き LowCodeApp.Server を F5。デザイナは LowCodeApp.Designer を「新しいインスタンスを開始」
  • VS Code: ルートの .vscode/launch.jsonServer / Designer 構成がある(Cookie と DesignProjects/Project/design。デザインプロジェクトをリネームしたら Project を置換する)。拡張は C# Dev Kit
  • サーバーは Claude Code が勝手に再起動しない(ユーザーが VS / VS Code で起動していることが多い)。再起動が必要なときはその旨を伝える
  • C# を変えたら Server / Designer の再ビルドと再起動が必要。デザインの変更はデプロイだけで反映(スクリプト変更はサーバー再起動)

appsettings リファレンス(appsettings.json / appsettings.Development.json

Program.cs が読んで Services/SystemConfig.cs に入れる。接続文字列・鍵など秘密情報は appsettings.Development.json(gitignore 対象)か環境変数appsettings.json には名前と種別だけ書く。

キー 意味
ConnectionStrings:<Name> string DataSources[].Name と同名で接続文字列。SQLite なら Data Source=<パス>;、PostgreSQL なら Host=...;Username=...;Password=...;Database=... 等(Npgsql / SqlClient / MySqlConnector / Oracle の書式)
DataSources[] { Name, DataSourceType } データソース。DataSourceTypeSQLite / PostgreSQL / SQLServer / MySQL / Oracle。デザインプロジェクトの designer.settings.jsonDataSources[].Name と一致させる。テンプレの既定には標準テンプレート 6 種のデータソース名(SampleSQLite / PatternsSQLite / Inventory / Sfa / ProjectManagement)が入っている
DesignFileDirectory string デザイン(App.zip)を読むフォルダ。デザイナのデプロイ先と同じにする
FontFileDirectory string PDF 出力用フォント。Local/Font に Noto Sans JP(NotoSansJP.ttf = 通常 / NotoSansJP#b.ttf = 太字。SIL Open Font License、OFL.txt 同梱)が入っている。他のフォントを足すときも <名前>.ttf / <名前>#b.ttf の組で置く
FileSystemStorages[] { Name, Directory } FileField の保存先(ローカルフォルダ)。designer.settings.jsonFileStorageNamesName を一致させる
AzureBlobStorages[] / S3Storages[] / FileStorages[] 保存先の他方式。項目は api --type Codeer.LowCode.Blazor.Extras.Server.FileManagement.AzureBlobStorageSettings --assembly <Server の bin にある Codeer.LowCode.Blazor.Extras.Server.dll のパス> で確認
TemporaryFileTableInfo[] { DataSourceName, Table, GuidColumn, CreatedDateTimeColumn } アップロード一時ファイルの管理テーブル(データソースごと)
UseHotReload bool デザイン変更を SignalR でブラウザに即反映(開発時 true)
CanScriptDebug bool ブラウザでスクリプトのデバッグ情報を出す(開発時 true)
SqlLog bool 実行 SQL をログに出す
IsLicenseAutoUpdate bool ライセンスの自動更新。DomainLicense(string)はドメイン単位ライセンスのキー。トライアルは何も設定しなくても動く
Mail { DefaultInfraName, DefaultBulkInfraName, HistoryModuleName } メール送信の既定インフラ名(MailSenderTable のキー)と送信履歴モジュール
Smtp / GraphApi / Gmail 送信インフラごとの設定。項目は api --type Codeer.LowCode.Blazor.Extras.Server.Mail.SmtpSettings --assembly <同上の dll パス> 等で確認
AISettings { OpenAIEndPoint, OpenAIKey, ChatModel, DocumentAnalysisEndPoint, DocumentAnalysisKey } AI 文書解析(Azure OpenAI / Document Intelligence)。未使用なら空
PasswordCheckUserTableInfo(Cookie) { TableName, IdColumn, UserNameColumn, HashColumn, SaltColumn } ログイン検証に使うユーザーテーブルの列。テンプレ既定は app_users。初回起動時にユーザーが 0 件なら admin/admin を作る
Logging / AllowedHosts ASP.NET Core 標準

DB を SQLite から PostgreSQL 等に変える手順: ① appsettings.jsonDataSources[].DataSourceType を変える ② appsettings.Development.json の接続文字列を差し替える ③ デザインプロジェクト側 DesignProjects/<デザイン名>/design/designer.settings.jsonDataSourceTypedesigner.settings.Development.json の接続文字列も同じに ④ テーブルはデザイナの Tools メニュー(DDL 生成)か CCFD の sql CLI で作る。DB プロバイダは Codeer.LowCode.Blazor.DbAccess に同梱済みで追加パッケージは不要。

デザインプロジェクトの切り替え(サンプル集の追加・表示・削除)

ホストが配信するデザインは 1 つ(DesignFileDirectoryApp.zip)。デザインプロジェクトは DesignProjects/ にいくつ置いてもよいが、 サーバーが読むのは最後にデプロイしたもの。

  • 表示を切り替える: 見たいデザインを deploy "DesignProjects/<名>/design" --out Local/deploy.json でデプロイし直す(App.zip が上書きされる。サーバー再起動は不要、ホットリロードで反映)。標準テンプレートどうしなら接続文字列の変更は要らない(ホストの appsettings に全テンプレートのデータソースが入っている)
  • サンプル集を追加する(ユーザーが「サンプルを見たい」と言ったとき): template-create --name PatternShowcase --out-dir DesignProjects/PatternShowcase/design --data-dir Local/Data --deploy-dir Local/Designs --out Local/tc.jsonclaude-workspace DesignProjects/PatternShowcase --project design。これで表示はサンプルに切り替わるので、ユーザーのアプリに戻すときは上の deploy
  • サンプル集を消す: デザイナを終了 → DesignProjects/PatternShowcase/ を削除 → Local/Data/sqlite_patterns_v*.db を削除 → ユーザーのアプリを deploy し直す

新しいデザインプロジェクトを作って切り替える手順(DESIGNER_EXE = Source/Hosts/Common/LowCodeApp.Designer/bin/Debug/net8.0-windows/LowCodeApp.Designer.exe。GUI 系 exe なので Start-Process -Wait + --out):

  1. 作る: template-create --name Empty --out-dir DesignProjects/<アプリ名>/design --data-dir Local/Data --deploy-dir Local/Designs --out Local/tc.json (テンプレートはすべて Cookie 認証向けで AppUser と admin/admin を含む。template-list で一覧。テンプレート付属の SQLite が Local/Data に置かれ、design/designer.settings.Development.json の接続文字列がそこを指し、Local/Designs/App.zipこの新しいデザインで上書きされる)
  2. ワークスペースを展開: claude-workspace DesignProjects/<アプリ名> --project design --out Local/cw.jsonCLAUDE.md / ClaudeCodeForDesigner/ / Project.md / ddl/ / docs/ ができる)
  3. サーバーの appsettings.Development.jsonConnectionStrings を確認する。標準テンプレートのデータソース名(SampleSQLite / PatternsSQLite / Inventory / Sfa / ProjectManagement)と DB ファイル名は既に入っているので、標準テンプレートから作ったデザインなら変更不要。自前のデータソース名や DB にしたときだけ、DataSources[]appsettings.json)と接続文字列を足す。サーバーを再起動
  4. 以後のデザイン作業は DesignProjects/<アプリ名>/ で Claude Code を起動して行う。.vscode/launch.json の Designer 構成のフォルダも差し替える

ホストのカスタマイズ(C#・最後の手段)

やり方の詳細と正確な API は ClaudeCodeForDeveloper/_specs/HostCustomization.md(デザイナの developer-workspace が生成。ライブラリ側の拡張点。無ければ Start-Process -WaitLowCodeApp.Designer.exe developer-workspace <ROOT> --out <json> を実行して生成する)。 シグネチャは推測せず LowCodeApp.Designer.exe api --type <FullName> --out <md> で確認する(Start-Process -Wait で呼ぶ)。デザイナに載っていないサーバー側ライブラリ(Codeer.LowCode.Blazor.Extras.Server / Codeer.LowCode.Blazor.DbAccess)は --assembly に Server の bin/Debug/net10.0/ にある dll のパスを渡す。

やりたいこと 場所
独自フィールド型 LowCodeApp.Client.Shared に 4 ファイル(XxxFieldDesign / XxxFieldData / XxxField / XxxFieldComponent.razor)。登録不要(リフレクション検出)。デザイナのプレビューに CSS を出すには App.xaml.csBlazorRuntime.InstallBundleCss("LowCodeApp.Client.Shared")(既に呼んでいる)
画面の一部を Blazor で書く / スクリプトの代わりに C# Client.Shared/Samples/ProCodeComponentSample.razor(ProCodeField)/ CodeBehindSample.cs(コードビハインド。クラス名=モジュール名)を写す
スクリプトから呼べるサービス・型 Client.Shared/Services/AppInfoService.csDesigner/App.xaml.cs の両方で ScriptRuntimeTypeManager.AddService / AddType
保存・更新時の処理 Server/Services/CustomizedModuleDataIO.cs の override
独自 Web API Server/Controllers/ に Controller を追加(TestAPIController が雛形)。スクリプトからは Extras の WebApiService で呼ぶ(_script_catalog.md に載る)
ファイル保存先・メール送信の独自実装 IFileStorageFileStorageTableIMailSenderMailSenderTable に 1 行
デザイナのメニュー・チェック・テンプレート Designer/App.xaml.csDesignerEnvironment.AddMainMenu / AddCustomDesignCheckHandler / ProjectCatalog.Add)。テンプレート・headless verb の登録は base.OnStartup(e) より前

Claude Code が作業するときの原則

  • テンプレのソースは自由に書き換えてよい。 接着コードであり、ユーザーの所有物。守るべき境界は「NuGet パッケージの中」だけ
  • ライブラリで済むことを自前実装しない。 メール・承認・Excel/PDF・ファイル保存(S3/Azure)・AI 連携などは Codeer.LowCode.Blazor.Extras / Extras.Server にある。まず該当パッケージの API を探す(api --assembly Codeer.LowCode.Blazor.Extras / api --assembly <Server の bin の Codeer.LowCode.Blazor.Extras.Server.dll>
  • 秘密情報を書かない。 接続文字列・API キーは appsettings.Development.json か環境変数。コミットに含めない。 appsettings.Development.json / DesignProjects/*/design/designer.settings.Development.json の中身は、セットアップ手順で必要なとき以外は読まない
  • ビルドが通る状態で止める。 C# を触ったら dotnet build Source/Hosts/Cookie/LowCodeApp.sln を最後に実行する
  • リネームは LowCodeApp の一括置換(ファイル名・フォルダ名・中身)。x:Class*.styles.css のリンクも対象

初回セットアップの手順(手動で行う場合の要約。Claude Code は ClaudeCodeForDeveloper/claude-code-setup.md)

  1. サーバープロジェクトの appsettings.Development.json: 接続文字列、DesignFileDirectoryFileSystemStorages。 既定は C:\Codeer.LowCode.Blazor.Local\... を指す
  2. LowCodeApp.Designer を起動してデザインプロジェクトを作る(テンプレートから選べる)か、 LowCodeApp.Designer.exe template-create --name <テンプレ> --out-dir DesignProjects\<デザイン名>\design --data-dir <Local\Data> --deploy-dir <DesignFileDirectory>
  3. サーバーを起動。Source/Hosts/Cookie/ は初回起動時に admin/admin のユーザーが自動作成される
4. `Source/Hosts/Maui/` はサーバーを先に起動してからアプリを起動(`LowCodeApp.Maui/README.md`)

このリポジトリの性質(保守者向け)

保守の手順(sln の再生成・VSIX・本体リポへのデバッグ用コピー)は MAINTAINERS.md。要点だけ: このリポジトリがテンプレートの正本。 プロジェクトはそれぞれ 1 か所にだけある:Source/Hosts/Common/*(全バリアント共通)と Source/Hosts/<Variant>/LowCodeApp.<Own>。各バリアントの LowCodeApp.slnSource/Tools/StarterTool assemble の生成物で手で編集しない。 タグ=フレームワークのバージョン。git diff v1.3.20 v1.3.23 -- Source/Hosts/Cookie/ で追従差分が見える。