@struktoai/mirage-core
Version:
A Unified Virtual Filesystem For AI Agents
32 lines • 5.98 kB
TypeScript
import { LinearAccessor } from '../../accessor/linear.ts';
import { LinearConfig } from '../../core/linear/config.ts';
import type { FileStat, PathSpec } from '../../types.ts';
import { type DirListing } from '../../types.ts';
import { BaseVFS } from '../base.ts';
import type { RedactedSchema } from '../secrets.ts';
import type { ConfigState, Handed } from '../types.ts';
export declare const VFS_MD = "```text\n{prefix}\n teams/\n <team-key>__<team-name>__<team-id>/\n team.json\n members/\n <display-name>__<user-id>.json\n issues/\n <issue-key>__<issue-id>/\n issue.json\n comments.jsonl\n projects/\n <name>__<project-id>.json\n cycles/\n <name>__<cycle-id>.json\n documents/\n <title>__<document-id>.json\n```\n\n- `ls` directories first to discover exact names.\n- Every entity-named segment is `<sanitized-human-readable>__<id>`. The\n human-readable part is sanitized, so don't construct it; `ls` the\n parent directory instead.\n- The id is the last `__`-separated segment:\n\n```text\n{prefix}/teams/STR__Strukto-ai__<team-id>/ -> <team-id>\n{prefix}/teams/.../issues/STR-42__<issue-id>/ -> <issue-id>\n{prefix}/teams/.../members/Alice__<user-id>.json -> <user-id>\n```\n\nAll `cat` output is normalized by Mirage (snake_case keys), not the raw\nLinear GraphQL response. The shapes:\n\n`team.json`:\n\n```jsonc\n{\n \"team_id\": \"...\", \"team_key\": \"STR\", \"team_name\": \"Strukto\",\n \"name\": \"...\", \"description\": \"...\", \"timezone\": \"...\",\n \"updated_at\": \"...\",\n \"states\": [\n { \"state_id\": \"...\", \"state_name\": \"Todo\", \"type\": \"unstarted\" },\n ... // one element per workflow state\n ]\n}\n```\n\n`issue.json`:\n\n```jsonc\n{\n \"issue_id\": \"...\", \"issue_key\": \"STR-42\",\n \"title\": \"...\", \"description\": \"...\",\n \"team_id\": \"...\", \"team_key\": \"...\", \"team_name\": \"...\",\n \"project_id\": \"...\", \"project_name\": \"...\",\n \"cycle_id\": \"...\", \"cycle_name\": \"...\", \"cycle_number\": 7,\n \"state_id\": \"...\", \"state_name\": \"In Progress\",\n \"assignee_id\": \"...\", \"assignee_email\": \"...\", \"assignee_name\": \"...\",\n \"creator_id\": \"...\", \"creator_email\": \"...\", \"creator_name\": \"...\",\n \"priority\": 2, // 0=none 1=urgent 2=high 3=medium 4=low\n \"label_ids\": [\"...\"],\n \"label_names\": [\"bug\", \"frontend\"],\n \"created_at\": \"...\", \"updated_at\": \"...\", \"url\": \"...\"\n}\n```\n\n`comments.jsonl`, one normalized comment per line:\n\n```jsonc\n{ \"comment_id\": \"...\", \"issue_id\": \"...\", \"issue_key\": \"STR-42\",\n \"user_id\": \"...\", \"user_email\": \"...\", \"user_name\": \"...\",\n \"body\": \"...\", \"created_at\": \"...\", \"updated_at\": \"...\",\n \"url\": \"...\" }\n```\n\nA project (`projects/<name>__<project-id>.json`):\n\n```jsonc\n{\n \"project_id\": \"...\", \"team_id\": \"...\",\n \"name\": \"...\", \"description\": \"...\", \"state\": \"started\",\n \"lead_id\": \"...\", \"updated_at\": \"...\", \"url\": \"...\",\n \"issue_count\": 12,\n \"issues\": [\n { \"issue_id\": \"...\", \"issue_key\": \"STR-42\", \"title\": \"...\",\n \"state_id\": \"...\", \"state_name\": \"In Progress\", \"url\": \"...\" }\n ]\n}\n```\n\nA cycle (`cycles/<name>__<cycle-id>.json`):\n\n```jsonc\n{\n \"cycle_id\": \"...\", \"team_id\": \"...\",\n \"name\": \"...\", \"number\": 7,\n \"starts_at\": \"...\", \"ends_at\": \"...\",\n \"updated_at\": \"...\", \"url\": \"...\"\n}\n```\n\nA member (`members/<display-name>__<user-id>.json`):\n\n```jsonc\n{\n \"user_id\": \"...\", \"name\": \"...\", \"display_name\": \"...\",\n \"email\": \"...\", \"is_active\": true, \"is_admin\": false,\n \"updated_at\": \"...\", \"url\": \"...\"\n}\n```\n\nA document (`documents/<title>__<document-id>.json`):\n\n```jsonc\n{\n \"document_id\": \"...\", \"title\": \"...\", \"content\": \"...\",\n \"project_id\": \"...\", \"project_name\": \"...\",\n \"creator_id\": \"...\", \"creator_name\": \"...\", \"creator_email\": \"...\",\n \"created_at\": \"...\", \"updated_at\": \"...\", \"url\": \"...\"\n}\n```\n\nUseful `jq` paths:\n\n```jq\n.issue_key # issue.json\n.state_name # issue.json\n.assignee_email # issue.json\n.label_names[] # issue.json\n.issues[] | select(.state_name == \"In Progress\") # a project\n.states[].state_name # team.json\n[inputs] | length # comments.jsonl: count\n[inputs | select(.user_email == \"x\")] | length # comments.jsonl\n```\n\nTo act on issues (list, get, create, update, assign, transition,\ncomments, projects, cycles, labels, users, documents, search), use the\n`linear` CLI if installed (`linear --help`).";
export declare class LinearVFS extends BaseVFS {
readonly handed: {
readonly readdir: readonly ["entry"];
readonly read: readonly ["parent"];
readonly stat: readonly ["entry"];
};
readonly name: string;
readonly cachesReads: boolean;
readonly sizesAlwaysKnown: boolean;
vfsMd: string;
readonly config: LinearConfig;
readonly accessor: LinearAccessor;
readonly searchable: readonly string[];
constructor(config: LinearConfig);
filesContaining(path: PathSpec, text: string, opts: {
wholeWord: boolean;
ignoreCase: boolean;
}): Promise<PathSpec[] | null>;
readdir(path: PathSpec, handed?: Handed): Promise<FileStat[] | DirListing>;
read(path: PathSpec, handed?: Handed): Promise<Uint8Array>;
stat(path: PathSpec, handed?: Handed): Promise<FileStat>;
getState(): Promise<ConfigState<RedactedSchema<typeof LinearConfig>>>;
}
//# sourceMappingURL=linear.d.ts.map