# Gantt Chart Generator

> Use this skill whenever the user asks to visualize a project schedule, timeline, Gantt chart, or phase/task breakdown over time. It gives the agent a prebuilt, parameterized gantt() function so Gantt charts are produced instantly and consistently — with colour-coded groups, completion overlays, a today reference line, and auto-scaled date axes — instead of hand-writing matplotlib each time.

- Skill: `kody-w/gantt-chart-generator` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add kody-w/gantt-chart-generator`
- Raw SKILL.md: https://api.skillmd.com/api/skills/kody-w/gantt-chart-generator/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: kody-w (https://skillmd.com/u/kody-w)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/kody-w/gantt-chart-generator

---


Generate horizontal Gantt charts from schedule data via the bundled `scripts/gantt.py` toolkit.
The `gantt()` function accepts a DataFrame or file path plus column names, and saves a PNG (returning the path).
It handles theming, date parsing, bar colour-coding, completion overlays, today-line, legend, and saving.

## Instructions

1. Provide the data source: a pandas DataFrame, or a path to a `.csv` / `.tsv` / `.json` file.
   - One row = one task / phase.
   - Required columns: a **phase/task name** column, a **start date** column, and either an **end date** column OR a **duration-in-days** column.

2. Import and call `gantt()`:

```python
import sys
sys.path.insert(0, "scripts")   # adjust path to where gantt.py is deployed
from gantt import gantt

# Basic — start + end columns
gantt("schedule.csv", phase="Phase", start="Start", end="End",
      title="Project Schedule", out="gantt.png")

# Group colour-coding + today line
gantt(df, phase="phase", start="planned_start", end="planned_end",
      group="project", today=True, out="schedule.png")

# Duration instead of end date
gantt(df, phase="task", start="start_date", duration="days",
      out="schedule.png")

# Completion % hatch overlay
gantt(df, phase="Phase", start="Start", end="End",
      completion="PctDone", out="gantt.png")
```

3. See `references/cheatsheet.md` for full parameter reference and CLI examples.

## Bundled files
- `scripts/gantt.py`      — the full toolkit (load_data, apply_theme, save_fig, gantt, CLI)
- `references/cheatsheet.md` — parameter quick-reference and copy-paste examples
- `assets/sample_schedule.csv` — demo dataset that exercises every feature

## Defaults & behaviour
- Colorblind-friendly palette (matches chart-builder skill for visual consistency).
- Date axis auto-scales: weekly ticks ≤90 days, monthly ≤365 days, bi-monthly beyond.
- Bars ordered top-to-bottom matching input row order.
- Rows with missing phase or start values are silently dropped before drawing.
- Output PNG at 150 DPI by default.
- Provide `end` OR `duration` — not both; `end` takes priority if both are present.

<!-- toaster:generated:begin -->

## Run this — do not improvise

This capability's deterministic implementation is a RAPP single-file agent, linked beside this file as `gantt_chart_generator_agent.py` and embedded as the fenced Python below (sha256 301a1e3447da6048…; a byte-exact copy is also vaulted in the capsule comment at the end of this file). On a host with sandbox execution, run the linked file directly — if it is missing, write the fence contents verbatim to `gantt_chart_generator_agent.py` first:

```bash
python3 gantt_chart_generator_agent.py '{"key": "value"}'      # arguments as one JSON object
echo '{"key": "value"}' | python3 gantt_chart_generator_agent.py   # or on stdin
python3 gantt_chart_generator_agent.py --tool                      # emit the JSON tool contract
```

Treat stdout as a tool result. If it reports missing or unresolved inputs, stop and collect them. If it returns `steps`, execute those steps in order exactly as returned; if it returns `instructions`, follow them with the supplied inputs. Otherwise use the result verbatim. Do not invent behavior beyond that output. On a host without code execution, treat the Parameters schema and the code below as the exact specification and never paraphrase a step. Never edit inside the generated markers; a converter-equipped host can instead restore the original file checksum-verified with the installed `rapp-agent-converter/scripts/toast.py convert SKILL.md --to agent`.

````python  # rapp:deterministic
"""GanttChartGenerator -- Use this skill whenever the user asks to visualize a project schedule, timeline, Gantt chart, or phase/task breakdown over time. It gives the agent a prebuilt, parameterized gantt() function so Gantt charts are produced instantly and consistently — with colour-coded groups, completion overlays, a today reference line, and auto-scaled date axes — instead of hand-writing matplotlib each time.

Generated by the rapp skill from gantt-chart-generator. The RCI capsule at the bottom of this file carries the full original; `toast.py convert` restores it byte-exact."""

import json
import re
import sys

try:
    from agents.basic_agent import BasicAgent
except ImportError:  # running OUTSIDE a brainstem -- stay executable anyway.
    class BasicAgent:  # noqa: D101 - minimal stand-in, same contract
        def __init__(self, name=None, metadata=None):
            if name:
                self.name = name
            if metadata:
                self.metadata = metadata

        def perform(self, **kwargs):
            return "Not implemented."

        def system_context(self):
            return None

        def to_tool(self):
            return {"type": "function", "function": {
                "name": self.name,
                "description": self.metadata.get("description", ""),
                "parameters": self.metadata.get("parameters", {})}}

# The procedural layer, verbatim from the source capability.
INSTRUCTIONS = 'Generate horizontal Gantt charts from schedule data via the bundled `scripts/gantt.py` toolkit.\nThe `gantt()` function accepts a DataFrame or file path plus column names, and saves a PNG (returning the path).\nIt handles theming, date parsing, bar colour-coding, completion overlays, today-line, legend, and saving.\n\n## Instructions\n\n1. Provide the data source: a pandas DataFrame, or a path to a `.csv` / `.tsv` / `.json` file.\n   - One row = one task / phase.\n   - Required columns: a **phase/task name** column, a **start date** column, and either an **end date** column OR a **duration-in-days** column.\n\n2. Import and call `gantt()`:\n\n```python\nimport sys\nsys.path.insert(0, "scripts")   # adjust path to where gantt.py is deployed\nfrom gantt import gantt\n\n# Basic — start + end columns\ngantt("schedule.csv", phase="Phase", start="Start", end="End",\n      title="Project Schedule", out="gantt.png")\n\n# Group colour-coding + today line\ngantt(df, phase="phase", start="planned_start", end="planned_end",\n      group="project", today=True, out="schedule.png")\n\n# Duration instead of end date\ngantt(df, phase="task", start="start_date", duration="days",\n      out="schedule.png")\n\n# Completion % hatch overlay\ngantt(df, phase="Phase", start="Start", end="End",\n      completion="PctDone", out="gantt.png")\n```\n\n3. See `references/cheatsheet.md` for full parameter reference and CLI examples.\n\n## Bundled files\n- `scripts/gantt.py`      — the full toolkit (load_data, apply_theme, save_fig, gantt, CLI)\n- `references/cheatsheet.md` — parameter quick-reference and copy-paste examples\n- `assets/sample_schedule.csv` — demo dataset that exercises every feature\n\n## Defaults & behaviour\n- Colorblind-friendly palette (matches chart-builder skill for visual consistency).\n- Date axis auto-scales: weekly ticks ≤90 days, monthly ≤365 days, bi-monthly beyond.\n- Bars ordered top-to-bottom matching input row order.\n- Rows with missing phase or start values are silently dropped before drawing.\n- Output PNG at 150 DPI by default.\n- Provide `end` OR `duration` — not both; `end` takes priority if both are present.'

# Ordered commands lifted verbatim from the capability's own documentation.
STEPS = []


class GanttChartGeneratorAgent(BasicAgent):
    def __init__(self):
        self.name = 'GanttChartGenerator'
        self.metadata = {
          "name": "GanttChartGenerator",
          "description": "Use this skill whenever the user asks to visualize a project schedule, timeline, Gantt chart, or phase/task breakdown over time. It gives the agent a prebuilt, parameterized gantt() function so Gantt charts are produced instantly and consistently \u2014 with colour-coded groups, completion overlays, a today reference line, and auto-scaled date axes \u2014 instead of hand-writing matplotlib each time.",
          "parameters": {
            "type": "object",
            "properties": {},
            "required": []
          }
        }
        super().__init__(name=self.name, metadata=self.metadata)

    def perform(self, **kwargs):  # toaster:generated-perform
        return json.dumps({"status": "ok", "instructions": INSTRUCTIONS,
                           "inputs": kwargs,
                           "note": "Prose-only capability: follow INSTRUCTIONS "
                                   "with the given inputs."}, indent=2)

if __name__ == "__main__":
    #     echo '{"arg": "value"}' | python3 gantt_chart_generator_agent.py
    #     python3 gantt_chart_generator_agent.py '{"arg": "value"}'
    #     python3 gantt_chart_generator_agent.py --tool          # emit the JSON tool contract
    _a = sys.argv[1:]
    if _a and _a[0] == "--tool":
        print(json.dumps(GanttChartGeneratorAgent().to_tool(), indent=2))
    else:
        _raw = _a[0] if _a else (sys.stdin.read().strip() or "{}")
        print(GanttChartGeneratorAgent().perform(**json.loads(_raw)))

# rci-capsule:v1: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
````

<!-- toaster:generated:end -->

<!-- rci-capsule:v1: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 -->

