app
Adom Gantt
Public Made by Adomby adom
Interactive Gantt chart viewer for project timelines, with a table view and an analytics page over the same data. Data-driven, dark by default with a print-friendly light mode, and fully editable in the browser: drag bars to move or resize, multi-select and batch-shift dates, manage dependency arrows inline, reorder rows, filter by phase, and undo. One click auto-schedules the whole plan so every dependency lines up finish-to-start on working days, skipping weekends and US federal holidays, push
← Commit history
0.30.1: plan.unify and plan.freight render as sentences in the changelog
4 files changed
+20−3
docs/BUILD-NOTES.md+8@@ -3,6 +3,14 @@ Decisions taken while building, and the places where the plan and the code disagreed. Newest first. +## Build notes, 2026-08-17 (0.30.1, the last two data events read like sentences)++`plan.unify` and `plan.freight` were both landing in the changelog as+`describeEvent`'s generic fallback. Same reasoning as 0.28.3: the changelog is+what the next agent reads, so an event it cannot read did not happen. Both render+properly now, and because `describeEvent` runs at READ time the two events already+on disk started reading correctly the moment this shipped.+ ## Build notes, 2026-08-14 (0.30.0, the sections editor) 0.29.0 made `phases[]` the truth about sections; this puts a door on it. A
package.json+1−1@@ -2,7 +2,7 @@ "slug": "adom-gantt", "title": "Adom Gantt", "type": "app",- "version": "0.30.0",+ "version": "0.30.1", "description": "Interactive Gantt chart viewer for project timelines, with a table view over the same data. Data-driven, dark by default with a print-friendly light mode, and fully editable in the browser: drag bars to move or resize, multi-select and batch-shift dates, manage dependency arrows inline, reorder rows, filter by phase, and undo. Toggle to the table for every task and milestone as a row with owner, deadline and status, filtered per owner and edited in place. Every edit is recorded in an append-only changelog so an AI can read what a human changed and build on it. Imports JSON, CSV, MS Project XML and Jira CSV; exports JSON, CSV, SVG and a self-contained HTML snapshot.", "main": "server.js", "bin": {
page.json+2−2@@ -2,7 +2,7 @@ "slug": "adom-gantt", "title": "Adom Gantt", "type": "app",- "version": "0.30.0",+ "version": "0.30.1", "description": "Interactive Gantt chart viewer for project timelines, with a table view over the same data. Data-driven, dark by default with a print-friendly light mode, and fully editable in the browser: drag bars to move or resize, multi-select and batch-shift dates, manage dependency arrows inline, reorder rows, filter by phase, and undo. Toggle to the table for every task and milestone as a row with owner, deadline and status, filtered per owner and edited in place. Every edit is recorded in an append-only changelog so an AI can read what a human changed and build on it. Imports JSON, CSV, MS Project XML and Jira CSV; exports JSON, CSV, SVG and a self-contained HTML snapshot.", "main": "server.js", "bin": {@@ -63,4 +63,4 @@ "name": "Drew Owens", "email": "[email protected]" }-}+}
server.js+9@@ -499,6 +499,15 @@ function describeEvent(e) { const kept = e.kept_drews_newer_edits ? `, keeping ${e.kept_drews_newer_edits} edit(s) made while it was being worked out` : ''; return `${who} re-scheduled the plan: ${e.tasks || 0} task(s) given new dates and ${e.reordered || 0} row(s) reordered so each lane reads top to bottom in the order the work happens. ${e.milestones_untouched || 0} milestone(s) were left exactly where they were, and ${ov} hand-set date(s) had to be overridden to keep a dependency or an anchor honest (listed in this event's "overrides")${kept}${via}`; }+ if (action === 'plan.unify') {+ const leads = e.leads && Object.keys(e.leads).length ? `, carrying the old header asides across as section leads (${Object.keys(e.leads).join(', ')})` : '';+ return `${who} made sections and phases one thing: ${e.phases || 0} section(s) now own their own headers, and ${e.groupsRetired || 0} group ROW(s) stopped being rows${leads}. Their uids (${(e.retiredUids || []).join(', ')}) are retired for good. The saved order went from ${e.orderBefore || 0} to ${e.orderAfter || 0} entries because headers are derived and no longer stored${via}`;+ }+ if (action === 'plan.freight') {+ const nm = Array.isArray(e.names) && e.names.length ? `: ${e.names.join('; ')}` : '';+ const en = Array.isArray(e.enriched) && e.enriched.length ? `. Enriched ${e.enriched.join(', ')} rather than duplicating what they already covered` : '';+ return `${who} added ${e.added || 0} Capitol delivery task(s) from the USCP research${nm}${en}. Source: ${e.source || 'USCP'}${via}`;+ } if (action === 'plan.sections') { const names = Array.isArray(e.names) && e.names.length ? `: ${e.names.join(', ')}` : ''; const rn = e.rename ? `. Renamed ${e.rename.uid} "${e.rename.from}" to "${e.rename.to}"` : '';