tix-cli 0.1.0__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
tix/__init__.py ADDED
@@ -0,0 +1,3 @@
1
+ """tix — keyboard-driven terminal ticket explorer for a tree of markdown briefs."""
2
+
3
+ __version__ = "0.1.0"
tix/__main__.py ADDED
@@ -0,0 +1,29 @@
1
+ """tix CLI entry point.
2
+
3
+ tix browse $TICKETS_DIR (default ~/.claude/tickets)
4
+ tix <project> cd into ./<project>, set TICKETS_DIR=<project>/.claude/tickets
5
+ """
6
+ import os
7
+ import sys
8
+ from pathlib import Path
9
+
10
+
11
+ def main(argv=None):
12
+ argv = list(sys.argv[1:] if argv is None else argv)
13
+
14
+ if argv and not argv[0].startswith("-"):
15
+ proj = argv.pop(0)
16
+ proj_dir = Path.cwd() / proj
17
+ if not proj_dir.is_dir():
18
+ print(f"tix: no project directory at {proj_dir}", file=sys.stderr)
19
+ return 1
20
+ os.chdir(proj_dir)
21
+ os.environ["TICKETS_DIR"] = str(proj_dir / ".claude" / "tickets")
22
+
23
+ from . import tui
24
+ sys.argv = ["tix", *argv]
25
+ return tui.main()
26
+
27
+
28
+ if __name__ == "__main__":
29
+ sys.exit(main())
@@ -0,0 +1,20 @@
1
+ ---
2
+ linear: # Linear ID once synced; empty = draft
3
+ title: <≤80 chars, action-oriented>
4
+ epic: <parent epic folder slug>
5
+ order: <NN — matches the filename prefix and the epic-stories id>
6
+ ---
7
+
8
+ ## Context
9
+ <2–4 sentences — this story's slice of the epic. Assume _epic.md is already read.>
10
+
11
+ ## Acceptance criteria
12
+ - <bulleted, each independently verifiable. Always include "Typecheck passes".>
13
+
14
+ ## Surface area
15
+ - **Mirror**: `<feature/file>` — one-line why it's the structural twin.
16
+ - **Files to start in** (≤8): `path — reason`.
17
+ - **Gotchas**: quoted project CLAUDE.md rules that apply.
18
+
19
+ ## Out of scope
20
+ - <explicit — what belongs to a sibling story, not this one>
@@ -0,0 +1,42 @@
1
+ ---
2
+ linear: # Linear epic ID once synced; empty = draft
3
+ title: <epic name, ≤80 chars>
4
+ status: open
5
+ area: integrations # integrations | platform | ops | tooling | spikes
6
+ created: <ISO-8601>
7
+ ---
8
+
9
+ ## Context
10
+ <why this epic exists — the problem, the trigger, the source.>
11
+
12
+ ## Goal
13
+ <one sentence — the end state when the epic is done.>
14
+
15
+ ## Acceptance criteria
16
+ <epic-level "done when" — the integration test for the whole thing, not per-story.>
17
+
18
+ ## Constraints
19
+ <non-negotiables; load-bearing facts every story inherits. None → "none.">
20
+
21
+ <!--
22
+ epic-stories: the authoritative ordered story list + dependency DAG.
23
+ A human confirms this block before any lane spawns. epic-parse.sh projects it
24
+ into scripts/ralph/prd.json at lane-spawn. Ralph executes it — it never decomposes.
25
+ id — matches the child filename, NN-<slug> (NN = execution order)
26
+ needs — story ids this one depends on; [] = ready immediately
27
+ context — the NN-<child>.md file carrying this story's deep detail
28
+ -->
29
+ <!-- epic-stories:start -->
30
+ stories:
31
+ - id: 01-<child-slug>
32
+ title: <story title>
33
+ needs: []
34
+ context: 01-<child-slug>.md
35
+ - id: 02-<child-slug>
36
+ title: <story title>
37
+ needs: [01-<child-slug>]
38
+ context: 02-<child-slug>.md
39
+ <!-- epic-stories:end -->
40
+
41
+ ## Local notes
42
+ <!-- lane / agent scratch — preserved across any later /sync-from-linear -->
@@ -0,0 +1,33 @@
1
+ ---
2
+ linear: # Linear ID once synced; empty = draft
3
+ title: <≤80 chars, action-oriented, no fluff>
4
+ status: draft # draft | open | active | done — cache, reconciled not hand-edited
5
+ epic: # parent epic folder slug, or empty
6
+ area: integrations # integrations | platform | ops | tooling | spikes
7
+ labels: []
8
+ created: <ISO-8601>
9
+ ---
10
+
11
+ ## Context
12
+ <2–4 sentences — why this exists. Quote the slack / email / customer / trace source.>
13
+
14
+ ## Acceptance criteria
15
+ - <bulleted, each independently verifiable>
16
+
17
+ ## Surface area
18
+ - **Mirror**: `<feature/file>` — one-line why it's the structural twin.
19
+ - **Files to start in** (≤8): `path — reason`.
20
+ - **Gotchas**: quoted project CLAUDE.md rules that apply.
21
+
22
+ ## Out of scope
23
+ - <explicit — better to over-list>
24
+
25
+ ## Open questions
26
+ - **Ambiguous**: <question + who to ask: teammate / customer / #eng-chat>
27
+ - **Risky**: <blast radius + rollback path>
28
+
29
+ ## Prerequisites
30
+ <env vars to set, accounts to provision, infra to stand up. None → "none.">
31
+
32
+ ## Local notes
33
+ <!-- lane / agent scratch — preserved across any later /sync-from-linear -->