チケット接続データ(開発中)
概要
現在開発中です。 対応する開発版PROとMyMemMCP補助アプリの「チケット → 接続と参照先」で使うデータです。GitHub・Backlogの接続アカウントと、各MyMemプロジェクトの参照先を端末内へ保存します。チケット本文・コメントを同期保存するデータではありません。
保存先は補助アプリのprofiles/<profile>/ticket-connections.jsonです。ChromeのDuckDBとは別のJSONで、プロファイルごとに分離します。schema_version: 1、revision、accounts、bindingsを持ち、専用のファイル権限と一括置換で保存します。通常バックアップZIP formatVersion 6には含まれません。 DuckDBの51表510列・既存制約・索引・ビュー・SQLは変更しません。
保存項目と画面の関係
| 保存物・項目 | 型・内容 | 参照する画面・他のデータとの関係 |
|---|---|---|
schema_version | 整数。現在は1 | 補助アプリが形式を確認。不明な版は上書きせず拒否 |
revision | 1以上の整数 | 接続設定の同時編集を検出。一時公開とページ情報もこの改訂へ束縛 |
accounts[].id・name・provider | 文字列。接続ID、表示名、github/backlog | 「接続アカウント」。同じ接続を複数MyMemプロジェクトから利用可能 |
domain | Backlogのホスト名の文字列。GitHubでは省略 | 認証情報の送信先を登録したスペースへ固定 |
auth_source | 文字列。token、github_cli、external_mcp。省略はトークン方式 | OS保管、GitHub CLI、既存Backlog MCP接続から認証方法を選ぶ |
credential_stored | 真偽値。認証方法が設定済みであることを示す表示項目 | 秘密値ではなく、接続確認の成功やAPI権限を保証する項目でもない |
secret_ref | OS保管への参照文字列。手動で登録したトークン方式だけで使用 | 生のトークン・APIキーをJSONへ保存しない。画面やMCP結果には返さない |
login | GitHub CLIで確認したログイン名の文字列 | 後からCLIの有効アカウントが変わった場合の取り違えを拒否 |
external_server_id・external_revision | 既存Backlog MCP接続IDの文字列と改訂整数 | 同じプロファイルの既存MCP接続へ関連付け。元接続の資格情報は複製しない |
bindings[].id | 紐付けIDの文字列 | MCPのconnection_id。アカウントIDそのものや任意URLではない |
project_id | MyMem Project IDの文字列 | DuckDBのプロジェクトとIDで対応。別保存先のためSQLの外部キー制約は作らない |
account_id | 接続アカウントIDの文字列 | 同じJSONのaccounts[].idへ関連付け。使用中のアカウントは削除を拒否 |
kind・target | 文字列。github_repoとowner/repo、github_projectとProjects Node ID、backlog_projectと数値IDの文字列表現 | 元サービスへの読取先を固定。AIから指定先の変更はできない |
key | Backlogのプロジェクトキーの文字列 | 課題キーとプロジェクトIDを両方照合する |
title・url | 参照先の表示名とHTTPS URLの文字列 | 一覧の見出し・元サービスを開くリンク |
view・view_filter | 任意のビュー番号整数と登録時のフィルター文字列 | GitHub Projectsのビューを指定した場合だけ使用。「ビューを変更」で同じボード内の参照範囲を更新。取得時の未確認の条件変更は拒否 |
接続は最大32件、紐付けは最大256件で、保存時のJSON全体は96KiBまでです。画面への設定応答もサイズ上限の対象です。
任意項目は該当する方式でだけ保存します。旧い環境でこのJSONがない場合は空の接続一覧から開始し、既存MCP設定・DuckDBを変更しません。JSONを古い補助アプリへ戻しても、旧版がこのチケット参照に対応したことにはなりません。
ビュー変更では既存のbindings[].id・project_id・account_id・ボードのtargetを維持し、title・url・view・view_filterを確認した内容へ更新します。revisionが進み、既存の一時公開とページ情報は無効になります。保存形式は1のままで、新しい列・JSON項目の追加や既存ファイルの移行はありません。上の参照用SQLも同じ項目を使用します。
秘密情報と一時データ
手動登録のトークンは、既存MyMemMCPと同じOS資格情報保管を利用します。JSONにはプロファイル・接続IDで分離した参照だけが残ります。GitHub CLI方式ではCLI自身の認証を使い、トークンの抽出・再保存を行いません。既存Backlog方式では元接続の改訂と送信先を毎回確認します。
最長8時間のMCP公開は補助アプリのメモリ上だけに保存します。project_id・設定改訂・期限を照合し、停止や変更後は進行中の読み取り結果も返しません。署名付きのページ情報もメモリ上の鍵・Project・設定改訂・Tool・条件・接続先・AIの許可に束縛し、2分で失効します。再起動時はどちらも使えなくなります。
GitHubのビュー候補、列の名前・順序・色は取得時にサービスから読み、チケット一覧のタブへ表示します。列定義は検索応答のboard.statusesとして返す一時データで、この接続JSONやDuckDB、通常バックアップへ保存しません。サービスタブ・ステータスタブの選択も接続JSONを変更しません。
別タブへ引き継ぐチケット画面
ChromeサイドバーでOption+クリックするときは、既存の作業画面保存を完了してから新しいタブへ引き継ぎます。保存先は**Chromeのstorage.session**で、キーの接頭辞はmymem.workspace.surface-session.v2.です。接続JSONやMCPの参照許可とは別で、ブラウザーのセッション内の表示復元に使います。
| 作業画面の項目 | 内容・他のデータとの関係 |
|---|---|
snapshot.tab.data.workspaceState.provider | 選択中のgithubまたはbacklog。見出し行のサービスタブに対応 |
searchQuery | 適用済み検索語の文字列。最大500文字 |
statusByBinding | 紐付けIDをキーに、allまたはstatus:状態名を保存するオブジェクト。接続JSONのbindings[].idに対応 |
workspaceState.ticketState | プロジェクト内チケットタブの同じ表示設定。既存のプロジェクト・チケットタブの選択と一緒に引き継ぐ |
追加項目はいずれも任意です。旧い作業画面に項目がなくても従来の初期表示で開けます。Workspace snapshotの版1とsurface sessionの版2を維持し、旧い記録を書き換える移行はありません。チケット本文・コメント・取得した一覧・認証情報はこの表示設定へ保存しません。storage.sessionは通常バックアップZIPやTask Journalのexportに含めず、DuckDBの列・制約・参照用SQLは変わりません。
Portalには端末のtickets:readと同意したAIの権限を保存します。チケットのアカウント・参照先一覧・資格情報・本文をPortalへ永続複製しません。端末権限への追加・削除時は改訂を進め、既存AIの同意を無効にします。保存形式の版は既存の1を維持します。AI接続の登録情報も参照してください。
バックアップ・移行
通常ZIPとTask Journalのexportに、このJSON・OSの資格情報・GitHub CLI認証は入りません。チケット設定を移行する専用のexport/import UIも現在はありません。別の端末やプロファイルでは接続と参照先を設定し直します。JSONだけをコピーしてもOSの資格情報は移りません。
通常ZIPからMyMem Projectを復元することと、端末側のチケット接続を復元することは別です。元Projectとの対応はproject_idで判断し、移行先のProject一覧と参照先を確認してください。JSONをDuckDBのテーブルとして追加したり、既存バックアップを新形式へ書き換える必要はありません。
架空データのSQL例
次は開発確認用の架空JSONだけをDuckDBで読む例です。通常ZIPにこのファイルが入るわけではなく、OSの資格情報を取り出す例でもありません。
fictional-ticket-connections.jsonは専用の架空データです。
WITH settings AS (
SELECT content::JSON AS j
FROM read_text('fictional-ticket-connections.json')
)
SELECT json_extract(j, '$.schema_version')::INTEGER AS schema_version,
json_extract(j, '$.revision')::BIGINT AS revision
FROM settings;
WITH settings AS (
SELECT content::JSON AS j
FROM read_text('fictional-ticket-connections.json')
), accounts AS (
SELECT value FROM settings, json_each(j, '$.accounts')
), bindings AS (
SELECT value FROM settings, json_each(j, '$.bindings')
)
SELECT b.value->>'project_id' AS mymem_project_id,
a.value->>'name' AS connection_name,
a.value->>'provider' AS provider,
b.value->>'title' AS source_title,
b.value->>'url' AS source_url
FROM bindings b
JOIN accounts a ON (a.value->>'id') = (b.value->>'account_id');
別タブへ引き継ぐ表示設定を確認する場合は、次のように架空のfictional-ticket-workspace.jsonを読みます。通常ZIPにこのJSONが入るわけではなく、Chromeのセッションを直接読むSQLでもありません。
WITH workspace AS (
SELECT content::JSON AS j
FROM read_text('fictional-ticket-workspace.json')
)
SELECT json_extract(j, '$.version')::INTEGER AS session_version,
json_extract_string(j, '$.snapshot.tab.data.workspaceState.ticketState.provider') AS provider,
json_extract_string(j, '$.snapshot.tab.data.workspaceState.ticketState.searchQuery') AS search_query,
json_extract(j, '$.snapshot.tab.data.workspaceState.ticketState.statusByBinding') AS status_by_binding
FROM workspace;