データモデル
Nolto ではサーバーにある roadmap が進捗の正本です。1つのプロジェクトに複数の roadmap を置け、それぞれを slug で区別します。CLI の手元の JSON は nolto roadmap path [slug] が返すリポジトリの外のキャッシュで、Git では管理しません。サーバーは roadmap、集計値、関連文書、生成済みの表示用 artifact を保持します。
Organization
組織の admin は、その組織が所有するすべてのプロジェクトで暗黙的に owner として扱われます。組織の member は、明示的に project_members 行を持つプロジェクトだけにアクセスできます(自動加入はありません)。
| field | 型 | 説明 |
|---|---|---|
id | UUID | 組織 ID |
name | string | 表示名(1〜80 文字) |
role | admin | member | 自分の役割 |
plan | free | pro | 有効なプラン。Pro は Stripe 契約または運営による付与 |
planSource | stripe | owner | none | プランの出所 |
memberCount / pendingInvitationCount / projectCount | integer | メンバー数・招待中(未失効)・プロジェクト数 |
limits | object | maxOrgMembers / maxProjects(null = 無制限) |
Free の組織はメンバー(招待中を含む)3 名・アクティブなプロジェクト 3 件まで。1 人が管理者になれる組織は 10 件までです。
Project
project は roadmap の共有範囲と権限の単位です。
| field | 型 | 説明 |
|---|---|---|
id | UUID | Nolto project ID |
name | string | 表示名 |
repository_url | string? | Git repository URL |
org_id | UUID? | 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 | 型 | 説明 |
|---|---|---|
schemaVersion | 1 | 2 | 3 | 現行は 3。version 1 は次回更新時に移行対象 |
project | object | リポジトリ内で使う project metadata |
updatedAt | date-time? | サーバーが管理するため、手元の JSON には書きません。旧形式(version 2)のファイルに残っている場合は RFC 3339 形式で、timezone offset(Z または ±HH:MM)が必須 |
currentTaskId | string? | 現在進行中の task ID。ユーザーごとにサーバーが管理するため、手元の JSON には書きません |
summary | string | リポジトリ側の短い説明 |
phases | Phase[] | phase の配列 |
サーバーは task_total、task_done、task_blocked を payload から再計算します。
Phase
| field | 型 | 説明 |
|---|---|---|
id | string | roadmap 内で一意の ID |
title | string | phase 名 |
status | RoadmapStatus | task 状態から導出される状態 |
plan | string? | repository-relative な Markdown path |
tasks | Task[] | task の配列 |
phase status は task から導出されます。すべて完了なら done、進行中があれば in-progress、blocked のみがあれば blocked、着手前なら todo です。
Task
| field | 型 | 説明 |
|---|---|---|
id | string | roadmap 内で一意の ID |
title | string | task 名 |
status | RoadmapStatus | 現在の状態 |
startedAt | date-time? | 着手時刻。updatedAt と同じ RFC 3339 形式 |
completedAt | date-time? | 完了時刻。updatedAt と同じ RFC 3339 形式 |
note | string? | 短いメモ |
dependsOn | string[]? | 依存 task ID。各 item は ^[a-z0-9][a-z0-9._-]*$ に一致する string で、重複不可 |
issues | string[]? | 同一 project の課題キー。^[A-Z][A-Z0-9]{1,9}-[1-9][0-9]{0,8}$ に一致する大文字文字列、重複不可、空配列可。task のみ。未知キーは同期時に警告してスキップ |
plan | string? | repository-relative な Markdown path |
RoadmapStatus は todo、in-progress、done、blocked の4種類です。
Plan document
Phase または Task の plan が参照する Markdown を CLI が読み込み、roadmap と同時に同期します。
| field | 説明 |
|---|---|
path | repository-relative path |
task_id | 文書を参照した phase または task ID |
content | Markdown 本文 |
content_hash | sha256: 付き content hash |
render_status | 整形処理の状態(success / failed / 未生成) |
render_payload | 検証済みの Plan UI blocks JSON |
render_source_hash | artifact 生成時の 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 | 型 | 説明 |
|---|---|---|
id | UUID | 課題 ID |
number | integer | project 内の連番(1 始まり) |
key | string | <project key>-<number> |
subject | string | 件名(1〜255 文字) |
body | string | 本文(Markdown、100,000 文字まで。詳細取得のみ) |
priority | high | normal | low | 優先度 |
type | IssueTypeRef | 種別(id、name、color) |
status | IssueStatusRef | 状態(id、name、color、isClosed) |
assignee | IssueRef? | 担当者(id、`email: string |
createdBy | IssueRef? | 登録者 |
categories | IssueCategoryRef[] | カテゴリ(複数) |
dueDate | date? | 期限日(YYYY-MM-DD) |
closedAt | date-time? | isClosed な状態になった時刻 |
parent | IssueParentRef? | 親課題(id、number、key、subject、status)。1 階層のみ |
childCount | integer | 直下の子課題数 |
commentCount | integer | 本文のあるコメント数(履歴のみの行は除く) |
createdAt / updatedAt | date-time | 作成 / 更新時刻 |
isClosed な状態の課題が「完了」です。一覧の既定は完了を除外し、closed=include / only で切り替えます。
種別・状態・カテゴリ
project ごとのマスタです。種別と状態には色(#rrggbb)と既定フラグがあり、状態には isClosed があります。
| field | 型 | 説明 |
|---|---|---|
id | UUID | |
name | string | 1〜50 文字。同じ project 内で一意 |
color | string | #rrggbb(種別・状態のみ) |
sortOrder | integer | 表示順(0〜1000)。ボードの列順にもなります |
isDefault | boolean | 新規課題の既定(種別・状態のみ。各 1 つ) |
isClosed | boolean | この状態を「完了」として扱う(状態のみ) |
使用中の項目を削除するときは付け替え先(replaceWithId)を指定します。既定の項目と最後の 1 件は削除できません。
コメントと履歴
コメントとフィールド変更は同じ行に記録されます。フィールドだけを変えた場合は本文が空の履歴行、コメント付きで変えた場合は本文と changes の両方を持つ行になります。
| field | 型 | 説明 |
|---|---|---|
id | UUID | |
author | IssueRef? | 投稿者 |
body | string | Markdown。履歴のみの行は空文字 |
changes | IssueChange[]? | field(subject / body / type / status / priority / assignee / due_date / categories / parent)、from / to(ID や値)、fromLabel / toLabel(表示名) |
attachments | Attachment[] | このコメントに紐付いた添付 |
createdAt / updatedAt | date-time |
本文中の [@表示名](mention:<userId>) はメンションで、Web UI ではチップとして表示されます。
添付
| field | 型 | 説明 |
|---|---|---|
id | UUID | |
filename / size / mime | string / integer / string | アップロード時の申告値。size はバイト |
status | pending | ready | deleted | pending = URL 発行済み、ready = アップロード完了、deleted = 削除済み |
entityType / entityId | string? / UUID? | 紐付け先(issue / issue_comment)。未紐付けの添付は 24 時間後に削除されます |
createdAt / completedAt | date-time |
本文からは (画像)または [name](attachment:<id>) で参照します。
保存済みフィルタ
| field | 型 | 説明 |
|---|---|---|
id | UUID | |
name | string | 1〜40 文字。同じ作成者内で一意 |
query | SavedIssueQuery | 一覧の絞り込み条件(page を除く)。assignee: "me" は見る人ごとに解決 |
isShared | boolean | project のメンバー全員に見せる |
createdBy | IssueRef? | 作成者 |
updatedAt | date-time |
プラン表示
worker は plan document を個別に claim し、最大3回まで整形を試みます。render_status が success で render_payload の検証に成功すると、プラン画面で整形ビューと Markdown を切り替えられます。処理中は生成中の案内を表示し、失敗または不正な artifact の場合は Markdown 原文を表示します。
サーバーの roadmap が正本です。CLI の手元の JSON はそのキャッシュで、リポジトリには roadmap のファイルを置きません。