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 +3 -0
- tix/__main__.py +29 -0
- tix/templates/_CHILD-TEMPLATE.md +20 -0
- tix/templates/_EPIC-TEMPLATE.md +42 -0
- tix/templates/_TEMPLATE.md +33 -0
- tix/tui.py +1183 -0
- tix_cli-0.1.0.dist-info/METADATA +191 -0
- tix_cli-0.1.0.dist-info/RECORD +11 -0
- tix_cli-0.1.0.dist-info/WHEEL +4 -0
- tix_cli-0.1.0.dist-info/entry_points.txt +2 -0
- tix_cli-0.1.0.dist-info/licenses/LICENSE +21 -0
tix/__init__.py
ADDED
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 -->
|