Repository navigation
Expand file tree
/
Copy pathpyproject.toml
More file actions
77 lines (70 loc) · 3.84 KB
/
Copy pathpyproject.toml
File metadata and controls
77 lines (70 loc) · 3.84 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
[project]
name = "red"
version = "0.1.0"
description = "Talk to a technical project manager, get a reviewed Linear project, then let Forman turn it into issues."
requires-python = ">=3.11"
license = "MIT"
license-files = ["LICENSE"]
dependencies = [
"claude-agent-sdk>=0.1.0",
# Forman master as of the turn-limit reading: a session that ran out of turns
# is classified on the flag the CLI sets rather than on the text of the
# exception its deliberate non-zero exit raises, and `names_turn_limit` is
# exported for anyone else holding that text. Red holds it directly - the
# relay drafter reads `run.error` and shows it to a person waiting at a
# prompt, so without this a lookup that was simply too short reported itself
# to them as the wording of a subprocess exit.
# Before that, cross-push ordering: blocked_by and blocks may now name
# a ticket that already exists, not only an index into the batch being
# drafted, and both directions are recorded. Red depends on this more than on
# anything else here - it files one slice per push_interactive call, so every
# dependency between slices points at tickets an earlier call created. Until
# this, that reference was dropped without a word and a whole project landed
# on the board with no ordering on it, leaving `forman pull` to choose by
# priority and identifier alone and start the third slice first.
# Before that, the provenance label: `forman pull` now only selects
# tickets carrying Forman's own label, so everything a client creates has to
# be stamped with it. Red depends on this directly - build_clients passes
# settings.label, and without it every project Red files would be invisible
# to the pull phase, which is the entire point of the handoff.
# Before that, the resumed clock: forman.progress puts the live line
# back when the answer is submitted rather than when the agent next does
# something. Red is where that gap hurt most - the relay hands every one of
# Forman's questions to a person, so every answer they typed was followed by
# a silent terminal for as long as it took to be read.
# Before that, the cursor walk: forman.linear_graphql.paginate, which
# Red's project queries page through. Red needs this one directly - find()
# reading back None for a project that exists on the second page is exactly
# the silent misfiling linear_projects.py was written to prevent.
# Before that, the session lockdown: agents are held to the toolset
# their contract names and cut off from inherited MCP servers. Red depends on
# that directly - its brief, redraft and relay agents are all read-only, and
# before this they were handed Bash and whatever MCP config the machine had,
# which meant a drafting agent could reach Linear without passing the gate.
# Earlier commits carry forman.progress (the live display and the type-ahead
# guard, shared by both CLIs) and on_activity through run_conversation and
# push_interactive, which is what lets both halves of Red show that an agent
# is working rather than hung.
# Further back is the merge of #2, which first carried forman.review (spelled
# foreman.review), the seam Red is built on. Pinned to a SHA rather than to
# master: nothing in Forman is exported from __init__ and it makes no
# stability promise, so tracking a branch would make Red depend on whatever
# happened to be pushed. Bump this deliberately.
"forman @ git+https://github.com/asinglesprinkle/Forman@db6c796ff71765ec5e956a3f43898a3b346e8862",
]
[project.optional-dependencies]
dev = ["pytest>=8.0", "ruff"]
[project.scripts]
red = "red.cli:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.hatch.build.targets.wheel]
packages = ["src/red"]
[tool.hatch.metadata]
allow-direct-references = true
[tool.pytest.ini_options]
testpaths = ["tests"]
pythonpath = ["src"]
[tool.ruff]
target-version = "py311"