データモデル

Nolto ではサーバーにある roadmap が進捗の正本です。1つのプロジェクトに複数の roadmap を置け、それぞれを slug で区別します。CLI の手元の JSON は nolto roadmap path [slug] が返すリポジトリの外のキャッシュで、Git では管理しません。サーバーは roadmap、集計値、関連文書、生成済みの表示用 artifact を保持します。

Organization

組織の admin は、その組織が所有するすべてのプロジェクトで暗黙的に owner として扱われます。組織の member は、明示的に project_members 行を持つプロジェクトだけにアクセスできます(自動加入はありません)。

field型説明
idUUID組織 ID
namestring表示名(1〜80 文字)
roleadmin | member自分の役割
planfree | pro有効なプラン。Pro は Stripe 契約または運営による付与
planSourcestripe | owner | noneプランの出所
memberCount / pendingInvitationCount / projectCountintegerメンバー数・招待中(未失効)・プロジェクト数
limitsobjectmaxOrgMembers / maxProjects(null = 無制限)

Free の組織はメンバー(招待中を含む)3 名・アクティブなプロジェクト 3 件まで。1 人が管理者になれる組織は 10 件までです。

Project

project は roadmap の共有範囲と権限の単位です。

field型説明
idUUIDNolto project ID
namestring表示名
repository_urlstring?Git repository URL
org_idUUID?organization project の場合に設定(Free の組織も可)
featureScope(roadmap | issues | wiki | files | settings)[]?自分の利用可能機能。null は全機能

リポジトリ側の nolto.json が project ID を保持します。roadmap slug は、キャッシュの JSON ファイル名と同じです。

Roadmap

{
  "schemaVersion": 3,
  "project": {
    "id": "my-app",
    "name": "My App",
    "repository": "https://github.com/example/my-app"
  },
  "summary": "認証改善を進行中",
  "phases": []
}
field型説明
schemaVersion1 | 2 | 3現行は 3。version 1 は次回更新時に移行対象
projectobjectリポジトリ内で使う project metadata
updatedAtdate-time?サーバーが管理するため、手元の JSON には書きません。旧形式(version 2)のファイルに残っている場合は RFC 3339 形式で、timezone offset(Z または ±HH:MM)が必須
currentTaskIdstring?現在進行中の task ID。ユーザーごとにサーバーが管理するため、手元の JSON には書きません
summarystringリポジトリ側の短い説明
phasesPhase[]phase の配列

サーバーは task_total、task_done、task_blocked を payload から再計算します。

Phase

field型説明
idstringroadmap 内で一意の ID
titlestringphase 名
statusRoadmapStatustask 状態から導出される状態
planstring?repository-relative な Markdown path
tasksTask[]task の配列

phase status は task から導出されます。すべて完了なら done、進行中があれば in-progress、blocked のみがあれば blocked、着手前なら todo です。

Task

field型説明
idstringroadmap 内で一意の ID
titlestringtask 名
statusRoadmapStatus現在の状態
startedAtdate-time?着手時刻。updatedAt と同じ RFC 3339 形式
completedAtdate-time?完了時刻。updatedAt と同じ RFC 3339 形式
notestring?短いメモ
dependsOnstring[]?依存 task ID。各 item は ^[a-z0-9][a-z0-9._-]*$ に一致する string で、重複不可
issuesstring[]?同一 project の課題キー。^[A-Z][A-Z0-9]{1,9}-[1-9][0-9]{0,8}$ に一致する大文字文字列、重複不可、空配列可。task のみ。未知キーは同期時に警告してスキップ
planstring?repository-relative な Markdown path

RoadmapStatus は todo、in-progress、done、blocked の4種類です。

Plan document

Phase または Task の plan が参照する Markdown を CLI が読み込み、roadmap と同時に同期します。

field説明
pathrepository-relative path
task_id文書を参照した phase または task ID
contentMarkdown 本文
content_hashsha256: 付き content hash
render_status整形処理の状態(success / failed / 未生成)
render_payload検証済みの Plan UI blocks JSON
render_source_hashartifact 生成時の content hash

同じ path の content hash が変わると既存 artifact は無効化され、再生成対象になります。

課題

課題は project ごとに採番され、project key(^[A-Z][A-Z0-9]{1,9}$、例 NOLTO)と番号でキー NOLTO-12 になります。key は project の設定画面で owner / admin が設定し、課題を 1 件でも作ると変更できません。課題機能は project ごとに有効化されます。

Issue

field型説明
idUUID課題 ID
numberintegerproject 内の連番(1 始まり)
keystring<project key>-<number>
subjectstring件名(1〜255 文字)
bodystring本文(Markdown、100,000 文字まで。詳細取得のみ)
priorityhigh | normal | low優先度
typeIssueTypeRef種別(id、name、color)
statusIssueStatusRef状態(id、name、color、isClosed)
assigneeIssueRef?担当者(id、`email: string
createdByIssueRef?登録者
categoriesIssueCategoryRef[]カテゴリ(複数)
dueDatedate?期限日(YYYY-MM-DD)
closedAtdate-time?isClosed な状態になった時刻
parentIssueParentRef?親課題(id、number、key、subject、status)。1 階層のみ
childCountinteger直下の子課題数
commentCountinteger本文のあるコメント数(履歴のみの行は除く)
createdAt / updatedAtdate-time作成 / 更新時刻

isClosed な状態の課題が「完了」です。一覧の既定は完了を除外し、closed=include / only で切り替えます。

種別・状態・カテゴリ

project ごとのマスタです。種別と状態には色(#rrggbb)と既定フラグがあり、状態には isClosed があります。

field型説明
idUUID
namestring1〜50 文字。同じ project 内で一意
colorstring#rrggbb(種別・状態のみ)
sortOrderinteger表示順(0〜1000)。ボードの列順にもなります
isDefaultboolean新規課題の既定(種別・状態のみ。各 1 つ)
isClosedbooleanこの状態を「完了」として扱う(状態のみ)

使用中の項目を削除するときは付け替え先(replaceWithId)を指定します。既定の項目と最後の 1 件は削除できません。

コメントと履歴

コメントとフィールド変更は同じ行に記録されます。フィールドだけを変えた場合は本文が空の履歴行、コメント付きで変えた場合は本文と changes の両方を持つ行になります。

field型説明
idUUID
authorIssueRef?投稿者
bodystringMarkdown。履歴のみの行は空文字
changesIssueChange[]?field(subject / body / type / status / priority / assignee / due_date / categories / parent)、from / to(ID や値)、fromLabel / toLabel(表示名)
attachmentsAttachment[]このコメントに紐付いた添付
createdAt / updatedAtdate-time

本文中の [@表示名](mention:<userId>) はメンションで、Web UI ではチップとして表示されます。

添付

field型説明
idUUID
filename / size / mimestring / integer / stringアップロード時の申告値。size はバイト
statuspending | ready | deletedpending = URL 発行済み、ready = アップロード完了、deleted = 削除済み
entityType / entityIdstring? / UUID?紐付け先(issue / issue_comment)。未紐付けの添付は 24 時間後に削除されます
createdAt / completedAtdate-time

本文からは ![name](attachment:<id>)(画像)または [name](attachment:<id>) で参照します。

保存済みフィルタ

field型説明
idUUID
namestring1〜40 文字。同じ作成者内で一意
querySavedIssueQuery一覧の絞り込み条件(page を除く)。assignee: "me" は見る人ごとに解決
isSharedbooleanproject のメンバー全員に見せる
createdByIssueRef?作成者
updatedAtdate-time

プラン表示

worker は plan document を個別に claim し、最大3回まで整形を試みます。render_status が success で render_payload の検証に成功すると、プラン画面で整形ビューと Markdown を切り替えられます。処理中は生成中の案内を表示し、失敗または不正な artifact の場合は Markdown 原文を表示します。

ℹ️

サーバーの roadmap が正本です。CLI の手元の JSON はそのキャッシュで、リポジトリには roadmap のファイルを置きません。