Project Planner
A small planning system that lets you define project plans and tasks in either YAML or Python.
A plan can include optional top-level project metadata:
portfolio: portfolio or parent program name.project: high-level project name.managers: list of manager names.pocs: list of point-of-contact names.summary: high-level plan summary.fiscal_range_beginandfiscal_range_end: optional fiscal year range covered by the plan, for example27through31.execution: execution metadata. It can be a mapping withoverviewtext andsections, where each section haslabel,description, and an optional stableidfor task links. The older flat list of sections is still accepted.
Each task supports these fields:
id: required string task id. Must contain only letters, numbers, or underscores, with no spaces.label: required string display name for the task.site: optional site or institution label.bnr: optional budget and reporting identifier.cost: optional task cost label, for example$100K.funding statusorfunding_status: optional funding state label.type: optional task type label.tags: optional comma-separated string or list of task tags.project: required string project name.execution_section: optional ID of a section underexecution.sections. Linked tasks use that section's label and position for activity headings and task numbers in exports. An unknown ID is rejected.description: required string describing the task.start: required fiscal period string inM{month}Q{quarter}FY{year}format, wheremonthis1to3within the quarter.deadline: required fiscal period string inM{month}Q{quarter}FY{year}format, wheremonthis1to3within the quarter.completed: optional fiscal period string for work that is already complete. A task withstatus: completeandcompletedmay omit planning-only fields:start,deadline,expected duration,milestone,priority,dependencies, andrisk. Withoutcompleted, these fields are required.expected durationorexpected_duration: required positive whole number of months.milestone: required string milestone name.priority: required string priority label such aslow,medium,high, orurgent.status: required string status. Allowed values arepending,active,ongoing,blocked, andcomplete.dependencies: required list of task ids. Each dependency must reference another taskid.risk: required risk entry or list of risk entries. Each entry hastype,level, andmitigation, and may includedescription;levelmust below,medium,high, orextreme.funding: optional mapping of fiscal year to funding level, for examplefy27: 50K. A task is treated as unfunded for fiscal years not present in this mapping.
A task can also be a multi-part task by using parts instead of the per-task
schedule fields on the parent. Parent fields such as project, execution_section, site, bnr,
type, tags, and funding are inherited by each part, while each part
provides its own id, label, description, start, deadline,
expected duration, milestone, priority, status, dependencies, and
risk. Part ids are expanded as {parent_id}_{part_id}. Dependencies inside a
multi-part task can reference sibling part ids, and dependencies from other
tasks can reference the parent id to depend on all expanded parts. Parent-level
funding inherited by multiple parts is counted once in fiscal-year totals.
Quick start
Run from this directory:
planner validate planner/examples/tasks.yaml
planner list planner/examples/tasks.yaml
planner summary planner/examples/tasks.yaml
planner schedule planner/examples/tasks.yaml
planner export-docx planner/examples/tasks.yaml /tmp/plan.docx
planner export-svg planner/examples/tasks.yaml /tmp/plan.svg
If you set TUXFAN_PLANNER_DATAFILE, the CLI uses that file by default:
export TUXFAN_PLANNER_DATAFILE=planner/examples/tasks.yaml
planner validate
planner list
planner export-docx /tmp/plan.docx
planner export-svg /tmp/plan.svg
If you set TUXFAN_PLANNER_EXPORT_OPTIONS, the export commands use that file by default:
export TUXFAN_PLANNER_EXPORT_OPTIONS=planner/examples/export-options.yaml
planner export-docx planner/examples/tasks.yaml /tmp/plan.docx
You can also install it locally:
python3 -m pip install -e .
planner list planner/examples/tasks.yaml
The legacy tuxfan-planner command remains available as an alias.
Run planner --help to see the current values of both planner environment
variables alongside the command help.
Shell completion
The CLI can print completion scripts for bash, zsh, and fish:
planner completion bash
planner completion zsh
planner completion fish
For a one-session bash setup:
source <(planner completion bash)
The generated completion supports the basic planner subcommands, the
tuxfan-planner alias, file path completion for task and output arguments, and
--export-options for export commands.
Documentation
Sphinx documentation lives in docs/. See the
developer setup and checks for the current dependency and HTML
build commands.
On GitHub, the Documentation workflow builds the same Sphinx output and
publishes it to the gh-pages branch. Configure the repository Pages settings
to serve from the gh-pages branch root.
Updating the virtual environment
Follow Install or upgrade dependencies
in the developer guide to update the root .venv and check the result.
YAML format
Top-level can be either a list of tasks or a mapping with a tasks key. The mapping form can also include plan-level metadata such as portfolio, project, managers, pocs, summary, fiscal_range_begin, fiscal_range_end, and execution.
portfolio: Advanced Simulation and Computing
project: Task-Parallel Project
managers:
- Alice Example
pocs:
- Casey Example, PI
summary: >
High-level planning context for the task collection.
fiscal_range_begin: 27
fiscal_range_end: 29
execution:
overview: >
Overall execution context for the plan.
sections:
- id: deliverable_a
label: Deliverable A
description: >
Narrative execution detail for this deliverable.
tasks:
- id: DraftArchitecture
label: Draft architecture
bnr: DP1518130
cost: $100K
funding status: funded
site: LANL
type: labor
tags:
- architecture
project: Planning System
execution_section: deliverable_a
description: Produce the first architecture draft.
start: M1Q3FY26
deadline: M2Q3FY26
expected duration: 2
milestone: Design
priority: high
status: complete
dependencies: []
risk:
- type: scope
level: medium
description: Integration requirements may change during implementation.
mitigation: Review the architecture with stakeholders before implementation starts.
funding:
fy27: 50K
fy29: 100K
- id: BuildParser
label: Build parser
project: Planning System
description: Load task definitions from YAML and Python files.
start: M2Q3FY26
deadline: M2Q3FY26
expected_duration: 1
milestone: Implementation
priority: high
status: pending
dependencies:
- DraftArchitecture
risk:
- type: integration
level: medium
mitigation: Add schema validation tests for both YAML and Python task sources.
- id: MultiYearDelivery
label: Multi-year delivery
site: LANL
project: Planning System
funding:
fy27: 50K
fy28: 100K
parts:
- id: A
label: First phase
description: Complete the first phase.
start: M1Q1FY27
deadline: M3Q2FY27
expected duration: 6
milestone: Phase A
priority: high
status: active
dependencies: []
risk:
- type: schedule
level: low
mitigation: Review progress monthly.
- id: B
label: Second phase
description: Complete the second phase.
start: M1Q3FY27
deadline: M3Q4FY28
expected duration: 18
milestone: Phase B
priority: medium
status: pending
dependencies:
- A
risk:
- type: technical
level: medium
mitigation: Keep integration tests current.
Python format
Define PLAN or plan in a .py file for metadata plus tasks. The legacy TASKS or tasks list still works.
PLAN = {
"portfolio": "Advanced Simulation and Computing",
"project": "Task-Parallel Project",
"managers": ["Alice Example"],
"pocs": ["Casey Example, PI"],
"summary": "High-level planning context for the task collection.",
"fiscal_range_begin": 27,
"fiscal_range_end": 29,
"execution": {
"overview": "Overall execution context for the plan.",
"sections": [
{
"id": "deliverable_a",
"label": "Deliverable A",
"description": "Narrative execution detail for this deliverable.",
}
],
},
"tasks": [
{
"id": "DraftArchitecture",
"label": "Draft architecture",
"bnr": "DP1518130",
"cost": "$100K",
"funding_status": "funded",
"site": "LANL",
"type": "labor",
"tags": ["architecture"],
"project": "Planning System",
"execution_section": "deliverable_a",
"description": "Produce the first architecture draft.",
"start": "M1Q3FY26",
"deadline": "M2Q3FY26",
"expected_duration": 2,
"milestone": "Design",
"priority": "high",
"status": "complete",
"dependencies": [],
"risk": [
{
"type": "scope",
"level": "medium",
"mitigation": "Review the architecture with stakeholders before implementation starts.",
}
],
"funding": {"fy27": "50K", "fy29": "100K"},
}
],
}
Status values
Use one of:
pendingactiveongoingblockedcomplete
Fiscal period values
start and deadline must use M{month}Q{quarter}FY{year}:
monthis1to3within the quarterquarteris1to4yearis a 2-digit fiscal year, for exampleFY26
Fiscal years begin on October 1:
Q1= October through DecemberQ2= January through MarchQ3= April through JuneQ4= July through September
Examples:
M1Q1FY26= October 2025M2Q3FY26= May 2026M3Q4FY26= September 2026
Commands
validate: checks required fields, invalid status values, invalid fiscal period or duration values, invalid ids, duplicate ids, missing dependencies, and dependency cycleslist: prints task details in deadline order by default, including fiscal start and deadline values and expected duration in monthssummary: groups tasks by project and milestone and prints funding totals when task funding is presentschedule: prints tasks in dependency order and marks them asREADY,BLOCKED,ACTIVE, orCOMPLETEexport-docx: generates a Word document with the schedule and a detailed task table. Use--export-options PATHorTUXFAN_PLANNER_EXPORT_OPTIONSto control which optional task attributes appear in the summary table and in the per-task narrative metadata. The table starts on a new page with its section headings. When fiscal years are configured, it includes one column per fiscal year with each task's funding level or a blank cell when the task is not funded in that year, plus a final total row.export-svg: generates a graphical SVG plan with the same activity letters and task numbers as Word. It shows configured fiscal-year funding totals, completion years, and dependency task numbers. Fill color reflects status, border color uses the Word risk colors, and an accent bar reflects priority. Export options select which optional task attributes appear on cards; custom column labels and alignment apply only to Word.
Export options
Export options files can be YAML, YML, or Python. The current supported settings are task_table_attributes and task_table_columns, which control the optional task attribute columns included in the Word export summary table and the attributes shown on SVG task cards. Custom labels and alignment apply only to Word. The .docx table always starts with an unlabeled column containing generated task numbers; it does not include a Project column. An Activity A, Activity B, etc. row precedes each activity's tasks, which appear in numeric task order. When tasks link to execution sections, the activity row includes the section label and its letter follows section order (for example, Activity B: Specialization Work with Task B.1). Unlinked tasks follow in project-based groups; plans without links keep their existing project-based grouping. Each activity label occupies one left-aligned cell spanning the table. The column header repeats only when the table continues onto another page; Activity rows appear at their normal group transitions. All table cells center their content vertically. Fiscal-year columns are added automatically when plan fiscal years are configured, with a final Total Funding row that sums each year and counts inherited multipart funding once. For completed tasks, those columns become one green-filled cell labeled with the completion year (for example, Completed FY26) when a completed period is available, or Completed otherwise; the other cells remain black on white. The other task metadata columns and per-task attribute narrative are limited to the attributes listed here.
In the Word risk mitigation section, the bold risk label is green for low, yellow for medium, orange for high, and deep red for extreme. Mitigation text remains black.
Top-level Word section labels, including Tasks:, are bold and underlined.
Supported attribute names:
bnrcostfundingorfunding_statussitetypetags
Simple YAML:
task_table_attributes:
- site
- bnr
- funding
- tags
Shorthand YAML with custom labels:
task_table_attributes:
- bnr: BNR
- funding: Status
- tags: Keywords
Recommended explicit YAML when you need labels or alignment:
task_table_columns:
- attribute: bnr
label: BNR
- attribute: funding
label: Status
- attribute: tags
label: Keywords
Supported column alignment values:
leftcenterright
alignment is optional and defaults to center.
Example CLI usage:
planner export-docx planner/examples/tasks.yaml /tmp/plan.docx --export-options planner/examples/export-options.yaml
Metadata
Release files for tuxfan-planner 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| tuxfan_planner-0.2.0.tar.gz | 43.3 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tuxfan_planner-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 72.8 kB
Release files / tuxfan_planner-0.2.0.tar.gz
| Download URL | tuxfan_planner-0.2.0.tar.gz |
|---|---|
| Size | 43.3 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1baa14b78303b8e9891b2b115aefcc97d93a32994c50e8d2f0dc4a72162d4eb8
|
|
BLAKE2b-256 checksum How to use checksums |
6338b2348259f7aac277d60441d50d684202cc8e074d75754a60978535215ddb
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Release files / tuxfan_planner-0.2.0-py3-none-any.whl
| Download URL | tuxfan_planner-0.2.0-py3-none-any.whl |
|---|---|
| Size | 29.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
cc64a65e9872cd68609b8900feec3d6981ede21cfc1604bda958def9165651bc
|
|
BLAKE2b-256 checksum How to use checksums |
5ddcd679abaa251bff9c51b475993cb7b2da4b35cb99c5280db5834a504aa4d4
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.8
|
Security for tuxfan-planner 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.