<feed xmlns='http://www.w3.org/2005/Atom'>
<title>pearl/.gitignore, branch main</title>
<subtitle>Pearl Edits and Reflects Linear — manage Linear.app issues as org-mode in Emacs
</subtitle>
<id>https://git.cjennings.net/pearl/atom?h=main</id>
<link rel='self' href='https://git.cjennings.net/pearl/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/'/>
<updated>2026-07-09T11:44:21+00:00</updated>
<entry>
<title>chore: ignore the generated task archive</title>
<updated>2026-07-09T11:44:21+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-07-09T11:44:21+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=5e609dcea19b0f776ee887bb41ac10a02194f281'/>
<id>urn:sha1:5e609dcea19b0f776ee887bb41ac10a02194f281</id>
<content type='text'>
</content>
</entry>
<entry>
<title>chore: gitignore .claude, CLAUDE.md, AGENTS.md</title>
<updated>2026-06-16T04:13:02+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-16T04:13:02+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=8d69468b8f0a2366dd99e66763d74d059e5379b0'/>
<id>urn:sha1:8d69468b8f0a2366dd99e66763d74d059e5379b0</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(scripts): import an org backlog into the Pearl workspace</title>
<updated>2026-06-07T04:53:52+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-07T04:53:52+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=fef03a1f4f19c45a31928989aecb4ff8a47cea4a'/>
<id>urn:sha1:fef03a1f4f19c45a31928989aecb4ff8a47cea4a</id>
<content type='text'>
I had 44 open tasks in the org backlog and no way to get them into Linear short of typing each one in by hand. This adds a script that reads the level-2 TODO/DOING headings under the "Pearl Open Work" section and creates one issue per task.

The priority cookie maps to Linear priority, a [#D] "someday" task lands in Icebox and the rest in Backlog, tags become labels (missing ones created), and the heading body becomes the description. The discuss/next/cleanup/pearl workflow tags are dropped rather than turned into labels. It skips a task whose title already exists, so a re-run only fills in what's missing, and the two umbrella headings plus the Resolved section are left out.

Same shape as the seed script: a pure parser and mapper with no I/O, behind a thin GraphQL client that's the only network boundary, so a fake transport routing on the operation name covers the import end to end. 8 tests across parse, mapping, and the import flow.
</content>
</entry>
<entry>
<title>feat(scripts): add a Linear workspace seed script</title>
<updated>2026-06-06T22:11:06+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-06-06T22:11:06+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=d8f60b1f86732b12e419d483a091634c31eb66c6'/>
<id>urn:sha1:d8f60b1f86732b12e419d483a091634c31eb66c6</id>
<content type='text'>
scripts/seed_pearl_workspace.py stands up the Pearl dogfooding conventions in a Linear workspace: a "Pearl" team whose columns are the six Agile states (icebox, triage queue, backlog, in-progress, done, cancelled), a "Pearl" project, and three Custom Views (Pearl Open Issues, Pearl Icebox, Pearl Inbox). It's idempotent: it snapshots the workspace, plans only what's missing by name, and re-running creates nothing. Reusable for us and for end-users standing up the same setup.

The six columns are typed so pearl's own grouped view reproduces the board order. icebox, triage queue, and backlog are all the backlog Linear type with ascending positions, so pearl's (state-type, position) ordering lays them out in sequence. The rest take the started, completed, and canceled types.

Two limits the Linear API forced, both verified by schema introspection first. CustomViewCreateInput has no grouping field, so Pearl Open Issues is created with its filter and grouped by category later, in pearl (pearl-set-grouping) or the Linear UI. And teamCreate seeds its own default columns, so the script adds the six and reports the leftovers to tidy in the UI rather than auto-archiving, since a team's default state can't always be archived safely.

The logic splits into a pure planner and a thin GraphQL client. The planner is unit-tested without mocks, the client and orchestration through a fake transport. 14 tests cover the targets, planning, idempotence, and the leftover report, and the snapshot queries ran live against a real workspace. The personal API key stays in a gitignored apikey.txt, never in the repo.
</content>
</entry>
<entry>
<title>chore: gitignore the local inbox/ directory</title>
<updated>2026-05-26T05:48:01+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-26T05:48:01+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=23e4157530cff4ed95e6a9473f8ef9434d453b42'/>
<id>urn:sha1:23e4157530cff4ed95e6a9473f8ef9434d453b42</id>
<content type='text'>
inbox/ holds cross-agent message drops and wrap-up lint follow-ups — local workflow state, the same class as .ai/ and todo.org. Keep it out of the tracked tree.
</content>
</entry>
<entry>
<title>feat: pearl — manage Linear issues from org-mode</title>
<updated>2026-05-24T18:44:34+00:00</updated>
<author>
<name>Craig Jennings</name>
<email>c@cjennings.net</email>
</author>
<published>2026-05-24T18:44:34+00:00</published>
<link rel='alternate' type='text/html' href='https://git.cjennings.net/pearl/commit/?id=b081d62276378b3168c92c06153fd59db0589535'/>
<id>urn:sha1:b081d62276378b3168c92c06153fd59db0589535</id>
<content type='text'>
Pearl fetches Linear issues into an org file and syncs edits back. It covers list / custom views / saved queries, per-issue and bulk rendering with comments inline, conflict-aware sync of descriptions, titles, and comments, field commands for priority / state / assignee / labels, and a transient dispatch menu. The render folds to a scannable outline and nests issues under a sortable parent.

Based on and inspired by Gael Blanchemain's linear-emacs.
</content>
</entry>
</feed>
