この文書は、globalThis.__mikuprojectCoreApi の import / export 公開方針について、現時点の判断経緯を簡潔に残すためのメモである。
確定仕様の置き場は README.md と docs/architecture.md と docs/spec.md とし、この文書はそれらの補助メモとして扱う。
利用者向けの導線整理は docs/import-export-workflows.md を参照する。
mikuproject は MS Project XML を意味の基軸として扱う。
- 正本:
MS Project XML - 内部中立表現:
ProjectModel - 補助交換形式:
XLSX,mikuproject_workbook_json - 派生表示 / AI 向け表現:
WBS XLSX,Markdown,SVG,Mermaid,aiViews
外部再利用向けには、single-file web app 向けの既存 global を維持しつつ、集約入口として globalThis.__mikuprojectCoreApi を公開する。
Node / CLI 側では、scripts/lib/core-api-loader.mjs が globalThis.__mikuprojectXmlDom も初期化する。これにより、msproject-xml と excel-io の XML parse / serialize はブラウザ DOM 直依存ではなく、CLI では @xmldom/xmldom 優先、未導入時は jsdom フォールバックで動く。
主要交換形式の export は、現時点では format ごとの公開面をそのまま使う整理とする。
msProject.exportToXml(model)xlsx.exportWorkbook(model)workbookJson.exportDocument(model)
この段階では、exportExternal(...) のような統一 export 入口は持たない。
理由:
- 現状でも利用側の負担が大きくない
- 返り値の型が format ごとに自然に異なる
WBS XLSXやSVGなど派生出力まで同列に混ぜると責務が広がりやすい
したがって、export 側はまず現状維持で十分と判断する。
主要交換形式の import も、現時点では format ごとの公開面を持つ。
msProject.importFromXml(text)xlsx.decodeWorkbook(bytes)xlsx.importAsProjectModel(workbook)xlsx.importIntoProjectModel(workbook, baseModel)workbookJson.importAsProjectModel(document)workbookJson.importIntoProjectModel(document, baseModel)patchJson.applyToProjectModel(document, baseModel)importAiJsonDocument(document, options)
このうち XLSX については、core API 上でも次を公開する。
xlsx.decodeWorkbook(bytes)xlsx.encodeWorkbook(workbook)xlsx.exportWorkbook(model)xlsx.importAsProjectModel(workbook)xlsx.importIntoProjectModel(workbook, baseModel)
importExternal(...) を first cut として追加した。
api.importExternal({
source: { format: "xlsx", bytes },
mode: "replace"
});
api.importExternal({
source: { format: "xlsx", bytes },
mode: "merge",
baseModel
});first cut の対象と対応 mode は次のとおり。
ms_project_xml:replacexlsx:replace,mergeworkbook_json:replace,mergeproject_draft_view:replacepatch_json:patch
不正な組み合わせは core API 側で明示的に reject する。
reject 例:
ms_project_xml + mergeは reject するpatch_json + replaceは reject するxlsx + patchは reject するworkbook_json + patchは reject するmergeでbaseModelがない場合は reject する- reject 時の error 文言は
importExternal: format=...とmode=...を含め、期待する mode とbaseModel要否が分かる形に寄せる
import 側は、利用側が format ごとの分岐を毎回持ちやすいため、統一入口の価値が export より高い。
importExternal(...) では、text / bytes / document / workbook のような物理媒体ではなく、replace / merge / patch のような操作意味を前面に出す設計を採る。
formatとoperationを分離できるXLSX / XML / workbook JSON / patch JSONを同じ入口で扱えるbaseModelが必要な場面をmodeと組み合わせて自然に表現できるimportAiJsonDocument()の責務を壊さずに済む
importAiJsonDocument() は名前の通り、AI JSON 系の共通入口として残す。
ここへ XLSX や MS Project XML を直接入れ始めると、
- API 名と責務がずれる
- binary / text / JSON の境界が曖昧になる
- 将来の保守で利用者が混乱しやすい
そのため、統一 import 入口が必要なら importAiJsonDocument() を拡張するのではなく、別に importExternal(...) のような上位 API を足す方針を優先する。
xlsx.*を含む format-specific API は維持する- import 側は、
importExternal(...)を上位 API として使えるようにする - export 側は、まず現状維持で十分とする
- ただし report / presentation outputs については、
report.*配下に format-specific export を追加してよい WBS XLSX/Markdown/SVG/Mermaid/aiViewsは、主要交換形式の統一 export と無理に同列化しない
CLI を追加する場合も、core API の責務分離をそのまま保つ。
ai: AI との契約や spec を扱うstate: state の生成・更新を扱うexport:workbook-json/xml/xlsxのような主要交換形式を扱うreport:wbs-xlsx/wbs-markdown/mermaid/daily-svg/weekly-svg/monthly-calendar-svgのような派生出力を扱う
first cut の候補は次とする。
mikuproject ai specmikuproject ai export project-overviewmikuproject ai export task-editmikuproject ai export phase-detailmikuproject ai export bundlemikuproject ai detect-kindmikuproject ai validate-patchmikuproject state from-draftmikuproject state summarizemikuproject state diffmikuproject state apply-patchmikuproject export workbook-jsonmikuproject export xmlmikuproject export xlsx
report 系は first cut から分離し、次段候補として扱う。
補足:
mikuproject ai export task-editはmikuproject_workbook_jsonを入力とし、task_edit_viewを stdout または--outへ出力するmikuproject ai export phase-detailはmikuproject_workbook_jsonを入力とし、phase_detail_viewを stdout または--outへ出力するmikuproject ai export bundleはmikuproject_workbook_jsonを入力とし、ai_projection_bundleを stdout または--outへ出力するbundleはai export配下に残し、主用途は調査 / デバッグ / 比較検証とするtask-editは--select auto|first-task|uid、phase-detailは--select auto|first-phase|uidを受ける--selectは現時点ではtask-edit/phase-detail専用とし、project-overviewには広げないbundle/detect-kind/validate-patch/state summarize/state diffは現時点で--selectを持たないexport phase-detailの主オプションは--phase-uid/--mode/--root-task-uid/--max-depthとするmikuproject ai validate-patchは--stateとpatch_jsonを受け、dry-run apply ベースの validation を返すmikuproject ai detect-kindは JSON document の kind 判定を返すmikuproject state summarize/state diffは state 確認系の補助コマンドとする--in -と--out -を受け、標準入力 / 標準出力を明示的に指定できる- 同一コマンドで標準入力を読む入力オプションは 1 つだけとする
--in pathが最優先、--in -は明示 stdin、--in省略時だけ暗黙 stdin を使う--out pathが最優先、--out -または--out省略時は stdout を使うai export/detect-kind/validate-patch/state summarize/state diff/state apply-patch/export/reportは--diagnostics text|jsonを受けられるjsondiagnostics は少なくともdiagnostics_version/ok/command/context/status/exit_code/warning_count/error_count/io/warnings/errorsを共通キーとして持ち、追加メタ情報をコマンド別に載せるjsondiagnostics はstatusも共通キーとし、少なくともsuccess/warning/noop/errorを使う--diagnostics json指定時は、usage error や処理失敗でも stderr に JSON diagnostics を返す- warning-only は
status=warning/exit_code=0、no-op はstatus=noop/exit_code=0、usage error はexit_code=2、processing error はexit_code=1とする - 異常系 diagnostics では
error_type=usage_error|processing_errorを返せる - 異常系 diagnostics では
error_codeに安定識別子を返せる - 異常系 diagnostics では top-level に
error_detailsを返せる - 異常系 diagnostics の
errors[]要素にもcodeを返せる - 異常系 diagnostics の
errors[]要素にはdetailsを返せる - 主要な usage error は文言推定ではなく、CLI 側で安定した
error_codeを直接付与する - 主要な processing error も、kind mismatch や detect-kind failure などは安定した
error_codeを直接付与する - JSON parse failure も
invalid_json_inputとして安定したerror_code/details.contextを返す ioには、各入力がfile/stdin/stdin_implicitのどれだったかと、出力先がstdout/fileのどちらかを載せる- この
ioは正常系だけでなく、--diagnostics jsonの異常系 diagnostics にも載せる - 異常系の
ioでも、コマンド形からstdin_implicitを推定して返す scripts/cli-ai-workflow-example.mjsで、CLI を使った局所 projection 取得から patch validate / apply / diff までの最小例を示すscripts/cli-ai-stdio-example.mjsで、--in -/--out -を使った stdio ベースの最小例を示す