@julioborges/gantry 1.0.6 → 1.1.0
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.
- package/.agents/skills/gantry/SKILL.md +15 -1
- package/.agents/skills/gantry/capabilities/codex.json +4 -3
- package/.agents/skills/gantry/dashboard/static/app.js +776 -30
- package/.agents/skills/gantry/dashboard/static/history.html +180 -0
- package/.agents/skills/gantry/dashboard/static/index.html +95 -0
- package/.agents/skills/gantry/dashboard/static/style.css +708 -0
- package/.agents/skills/gantry/reference/plan-workflow.md +13 -0
- package/.agents/skills/gantry/reference/round-workflow.md +90 -2
- package/.agents/skills/gantry/scripts/common.py +3 -0
- package/.agents/skills/gantry/scripts/dashboard.py +664 -11
- package/.agents/skills/gantry/scripts/discovery.py +117 -8
- package/.agents/skills/gantry/scripts/execution.py +131 -14
- package/.agents/skills/gantry/scripts/plan.py +658 -0
- package/.agents/skills/gantry/scripts/result.py +56 -1
- package/.agents/skills/gantry/scripts/runlog.py +2 -1
- package/.agents/skills/gantry/scripts/setup.py +101 -8
- package/.agents/skills/gantry/scripts/wait_gate.py +179 -0
- package/.agents/skills/gantry-dashboard/SKILL.md +21 -2
- package/.agents/skills/gantry-plan/SKILL.md +104 -0
- package/.agents/skills/gantry-setup/SKILL.md +9 -3
- package/README.md +125 -98
- package/package.json +2 -1
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="en" class="dark">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="utf-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Gantry Execution History // Standalone View</title>
|
|
7
|
+
<link rel="stylesheet" href="/style.css" />
|
|
8
|
+
</head>
|
|
9
|
+
<body class="industrial-grid">
|
|
10
|
+
<header class="rig-header">
|
|
11
|
+
<div class="header-inner">
|
|
12
|
+
<div class="brand-group">
|
|
13
|
+
<div class="brand-mark">
|
|
14
|
+
<span class="diamond"></span>
|
|
15
|
+
<span class="brand-title">GANTRY<span class="accent">::</span>HISTORY</span>
|
|
16
|
+
</div>
|
|
17
|
+
<span id="history-issue-badge" class="telemetry-badge">STANDALONE VIEW</span>
|
|
18
|
+
</div>
|
|
19
|
+
<div class="header-status">
|
|
20
|
+
<span class="status-indicator"></span>
|
|
21
|
+
<span class="status-text">FULL EXECUTION TIMELINE</span>
|
|
22
|
+
</div>
|
|
23
|
+
</div>
|
|
24
|
+
</header>
|
|
25
|
+
|
|
26
|
+
<div class="status-strip">
|
|
27
|
+
<div class="status-strip-inner">
|
|
28
|
+
<div class="status-strip-left">
|
|
29
|
+
<span class="signal-dot"></span>
|
|
30
|
+
<span id="history-header-issue">ISSUE: -</span>
|
|
31
|
+
</div>
|
|
32
|
+
<div class="status-strip-badges">
|
|
33
|
+
<span id="history-meta-unit" class="badge-tag">UNIT: -</span>
|
|
34
|
+
<span id="history-meta-run" class="badge-tag">RUN: -</span>
|
|
35
|
+
<span id="history-meta-phase" class="badge-tag accent-tag">PHASE: -</span>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
|
|
40
|
+
<main class="dashboard-main">
|
|
41
|
+
<div class="swimlane">
|
|
42
|
+
<div class="swimlane-header">
|
|
43
|
+
<div class="swimlane-title-group">
|
|
44
|
+
<h2>CHRONOLOGICAL EXECUTION TIMELINE & GATE VERDICTS</h2>
|
|
45
|
+
</div>
|
|
46
|
+
</div>
|
|
47
|
+
<div style="padding: 1.5rem;">
|
|
48
|
+
<div id="history-transcript-container" class="transcript-stream">
|
|
49
|
+
<div class="transcript-loading">Loading execution history...</div>
|
|
50
|
+
</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
</main>
|
|
54
|
+
|
|
55
|
+
<footer class="rig-footer">
|
|
56
|
+
<div class="footer-inner">
|
|
57
|
+
<div class="footer-left">
|
|
58
|
+
<span class="accent-diamond">◆</span>
|
|
59
|
+
<span>GANTRY AGENTIC SDLC</span>
|
|
60
|
+
<span>|</span>
|
|
61
|
+
<span>DETAILED EXECUTION TIMELINE</span>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
</footer>
|
|
65
|
+
|
|
66
|
+
<script>
|
|
67
|
+
(function () {
|
|
68
|
+
const params = new URLSearchParams(window.location.search);
|
|
69
|
+
const unit = params.get("unit") || "";
|
|
70
|
+
const run = params.get("run") || "";
|
|
71
|
+
const issue = params.get("issue") || "";
|
|
72
|
+
|
|
73
|
+
document.getElementById("history-header-issue").textContent = "ISSUE: " + (issue || "UNKNOWN");
|
|
74
|
+
document.getElementById("history-meta-unit").textContent = "UNIT: " + (unit || "-");
|
|
75
|
+
document.getElementById("history-meta-run").textContent = "RUN: " + (run || "-");
|
|
76
|
+
|
|
77
|
+
const container = document.getElementById("history-transcript-container");
|
|
78
|
+
|
|
79
|
+
function formatDiff(content) {
|
|
80
|
+
const div = document.createElement("div");
|
|
81
|
+
div.className = "diff-record";
|
|
82
|
+
const title = document.createElement("div");
|
|
83
|
+
title.className = "tool-name";
|
|
84
|
+
title.textContent = "CODE CHANGES / DIFF";
|
|
85
|
+
div.appendChild(title);
|
|
86
|
+
|
|
87
|
+
const pre = document.createElement("pre");
|
|
88
|
+
pre.className = "diff-content";
|
|
89
|
+
(content || "").split("\n").forEach(function (line) {
|
|
90
|
+
const span = document.createElement("span");
|
|
91
|
+
if (line.startsWith("+")) span.className = "diff-line-add";
|
|
92
|
+
else if (line.startsWith("-")) span.className = "diff-line-del";
|
|
93
|
+
else if (line.startsWith("@@") || line.startsWith("diff")) span.className = "diff-line-info";
|
|
94
|
+
span.textContent = line + "\n";
|
|
95
|
+
pre.appendChild(span);
|
|
96
|
+
});
|
|
97
|
+
div.appendChild(pre);
|
|
98
|
+
return div;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function renderSteps(steps) {
|
|
102
|
+
container.innerHTML = "";
|
|
103
|
+
if (!steps || steps.length === 0) {
|
|
104
|
+
container.innerHTML = '<div class="transcript-loading">No transcript steps recorded yet.</div>';
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
steps.forEach(function (step, index) {
|
|
109
|
+
const stepWrapper = document.createElement("div");
|
|
110
|
+
stepWrapper.style.marginBottom = "1rem";
|
|
111
|
+
|
|
112
|
+
// Step marker
|
|
113
|
+
const stepBadge = document.createElement("span");
|
|
114
|
+
stepBadge.className = "badge tier";
|
|
115
|
+
stepBadge.textContent = "STEP #" + (step.step_index != null ? step.step_index : index);
|
|
116
|
+
stepWrapper.appendChild(stepBadge);
|
|
117
|
+
|
|
118
|
+
if (step.thinking) {
|
|
119
|
+
const block = document.createElement("div");
|
|
120
|
+
block.className = "thinking-block";
|
|
121
|
+
block.style.marginTop = "0.5rem";
|
|
122
|
+
const header = document.createElement("div");
|
|
123
|
+
header.className = "thinking-header";
|
|
124
|
+
header.innerHTML = '<span>MODEL REASONING (THINKING)</span><span class="thinking-toggle">[-] COLLAPSE</span>';
|
|
125
|
+
const content = document.createElement("div");
|
|
126
|
+
content.className = "thinking-content";
|
|
127
|
+
content.textContent = step.thinking;
|
|
128
|
+
header.addEventListener("click", function () {
|
|
129
|
+
content.classList.toggle("collapsed");
|
|
130
|
+
header.querySelector(".thinking-toggle").textContent = content.classList.contains("collapsed") ? "[+] EXPAND" : "[-] COLLAPSE";
|
|
131
|
+
});
|
|
132
|
+
block.appendChild(header);
|
|
133
|
+
block.appendChild(content);
|
|
134
|
+
stepWrapper.appendChild(block);
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (step.tool_calls && Array.isArray(step.tool_calls)) {
|
|
138
|
+
step.tool_calls.forEach(function (tool) {
|
|
139
|
+
const toolEl = document.createElement("div");
|
|
140
|
+
toolEl.className = "tool-record";
|
|
141
|
+
toolEl.style.marginTop = "0.5rem";
|
|
142
|
+
toolEl.innerHTML = '<div class="tool-name">TOOL: ' + (tool.name || "unknown") + '</div>';
|
|
143
|
+
if (tool.args) {
|
|
144
|
+
const argsEl = document.createElement("pre");
|
|
145
|
+
argsEl.className = "tool-args";
|
|
146
|
+
argsEl.textContent = JSON.stringify(tool.args, null, 2);
|
|
147
|
+
toolEl.appendChild(argsEl);
|
|
148
|
+
}
|
|
149
|
+
stepWrapper.appendChild(toolEl);
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
if (step.content && typeof step.content === "string") {
|
|
154
|
+
if (step.content.includes("diff --git") || step.content.includes("+added line") || step.content.includes("--- a/")) {
|
|
155
|
+
stepWrapper.appendChild(formatDiff(step.content));
|
|
156
|
+
} else if (step.content.trim()) {
|
|
157
|
+
const msgEl = document.createElement("div");
|
|
158
|
+
msgEl.className = "tool-args";
|
|
159
|
+
msgEl.style.marginTop = "0.5rem";
|
|
160
|
+
msgEl.textContent = step.content;
|
|
161
|
+
stepWrapper.appendChild(msgEl);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
container.appendChild(stepWrapper);
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
if (unit && run && issue) {
|
|
170
|
+
fetch("/api/runs/" + encodeURIComponent(unit) + "/" + encodeURIComponent(run) + "/issues/" + encodeURIComponent(issue) + "/transcript")
|
|
171
|
+
.then(function (r) { return r.json(); })
|
|
172
|
+
.then(function (data) { renderSteps(data.steps || []); })
|
|
173
|
+
.catch(function () { container.innerHTML = '<div class="transcript-loading">Failed to load transcript.</div>'; });
|
|
174
|
+
} else {
|
|
175
|
+
container.innerHTML = '<div class="transcript-loading">Missing unit, run, or issue query parameter.</div>';
|
|
176
|
+
}
|
|
177
|
+
})();
|
|
178
|
+
</script>
|
|
179
|
+
</body>
|
|
180
|
+
</html>
|
|
@@ -17,6 +17,15 @@
|
|
|
17
17
|
</div>
|
|
18
18
|
<span class="telemetry-badge">v1.0.4 [STANDBY]</span>
|
|
19
19
|
</div>
|
|
20
|
+
<div class="header-controls">
|
|
21
|
+
<div class="project-selector-group">
|
|
22
|
+
<label for="project-select" class="selector-label">PROJECT:</label>
|
|
23
|
+
<select id="project-select" class="project-select" aria-label="Select Project">
|
|
24
|
+
<option value="ALL">ALL</option>
|
|
25
|
+
</select>
|
|
26
|
+
</div>
|
|
27
|
+
<button id="btn-shutdown" class="btn-shutdown" type="button" aria-label="Shutdown Server">SHUTDOWN</button>
|
|
28
|
+
</div>
|
|
20
29
|
<div class="header-status">
|
|
21
30
|
<span class="status-indicator"></span>
|
|
22
31
|
<span class="status-text">LOOPBACK TELEMETRY // READ-ONLY</span>
|
|
@@ -44,6 +53,92 @@
|
|
|
44
53
|
<div id="swimlanes"></div>
|
|
45
54
|
</main>
|
|
46
55
|
|
|
56
|
+
<!-- Execution Detail Modal -->
|
|
57
|
+
<div id="execution-modal" class="modal-backdrop hidden" role="dialog" aria-modal="true" aria-labelledby="modal-issue-title">
|
|
58
|
+
<div class="modal-dialog">
|
|
59
|
+
<div class="modal-header">
|
|
60
|
+
<div class="modal-header-left">
|
|
61
|
+
<span class="modal-diamond"></span>
|
|
62
|
+
<h2 id="modal-issue-title" class="modal-title">EXECUTION DETAILS</h2>
|
|
63
|
+
<span id="modal-phase-badge" class="badge"></span>
|
|
64
|
+
<span id="modal-activity-badge" class="badge live"></span>
|
|
65
|
+
</div>
|
|
66
|
+
<button id="modal-close-btn" class="modal-close" aria-label="Close modal">×</button>
|
|
67
|
+
</div>
|
|
68
|
+
<div class="modal-meta-strip">
|
|
69
|
+
<span id="modal-meta-project" class="meta-item">PROJECT: -</span>
|
|
70
|
+
<span id="modal-meta-unit" class="meta-item">UNIT: -</span>
|
|
71
|
+
<span id="modal-meta-run" class="meta-item">RUN: -</span>
|
|
72
|
+
<span id="modal-meta-branch" class="meta-item">BRANCH: -</span>
|
|
73
|
+
</div>
|
|
74
|
+
<div id="modal-phase-durations" class="modal-durations-strip">
|
|
75
|
+
<div class="duration-item"><span class="duration-label">Plan:</span><span id="dur-plan" class="duration-value">-</span></div>
|
|
76
|
+
<div class="duration-item"><span class="duration-label">Implement:</span><span id="dur-implement" class="duration-value">-</span></div>
|
|
77
|
+
<div class="duration-item"><span class="duration-label">Review:</span><span id="dur-review" class="duration-value">-</span></div>
|
|
78
|
+
<div class="duration-item"><span class="duration-label">Critic:</span><span id="dur-critic" class="duration-value">-</span></div>
|
|
79
|
+
<div class="duration-item"><span class="duration-label">Integrate:</span><span id="dur-integrate" class="duration-value">-</span></div>
|
|
80
|
+
<div class="duration-item total-item"><span class="duration-label">Total:</span><span id="dur-total" class="duration-value">-</span></div>
|
|
81
|
+
</div>
|
|
82
|
+
<div id="modal-gate-alert" class="gate-alert hidden">
|
|
83
|
+
<div class="gate-alert-content">
|
|
84
|
+
<span class="gate-alert-icon">⚠️</span>
|
|
85
|
+
<span id="modal-gate-alert-text">Critic verificado com sucesso. Aguardando aprovação do operador para iniciar Integração.</span>
|
|
86
|
+
</div>
|
|
87
|
+
<button id="modal-approve-btn" class="btn-approve-gate" type="button">Aprovar Gate</button>
|
|
88
|
+
</div>
|
|
89
|
+
<div class="modal-tabs">
|
|
90
|
+
<button id="tab-btn-gates" class="modal-tab active" type="button" data-tab="gates">Pareceres dos Gates</button>
|
|
91
|
+
<button id="tab-btn-history" class="modal-tab" type="button" data-tab="history">Histórico Completo</button>
|
|
92
|
+
</div>
|
|
93
|
+
<div class="modal-body">
|
|
94
|
+
<div id="tab-content-gates" class="tab-pane active">
|
|
95
|
+
<div id="gates-container" class="gates-container">
|
|
96
|
+
<div class="transcript-loading">Carregando pareceres dos gates...</div>
|
|
97
|
+
</div>
|
|
98
|
+
</div>
|
|
99
|
+
<div id="tab-content-history" class="tab-pane hidden">
|
|
100
|
+
<div class="history-toolbar">
|
|
101
|
+
<span class="history-hint">Passos, ferramentas e logs do transcript</span>
|
|
102
|
+
<button id="btn-popout-history" class="btn-popout" type="button">Abrir em Nova Janela ↗</button>
|
|
103
|
+
</div>
|
|
104
|
+
<div id="modal-transcript-container" class="transcript-stream">
|
|
105
|
+
<div class="transcript-loading">Awaiting transcript events...</div>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
</div>
|
|
109
|
+
</div>
|
|
110
|
+
</div>
|
|
111
|
+
|
|
112
|
+
<!-- Shutdown Confirmation Modal -->
|
|
113
|
+
<div id="shutdown-modal" class="modal-backdrop hidden" role="dialog" aria-modal="true" aria-labelledby="shutdown-modal-title">
|
|
114
|
+
<div class="modal-dialog modal-dialog-sm">
|
|
115
|
+
<div class="modal-header">
|
|
116
|
+
<div class="modal-header-left">
|
|
117
|
+
<span class="modal-diamond alert-diamond"></span>
|
|
118
|
+
<h2 id="shutdown-modal-title" class="modal-title">SHUTDOWN SERVER</h2>
|
|
119
|
+
</div>
|
|
120
|
+
<button id="shutdown-close-btn" class="modal-close" aria-label="Close modal">×</button>
|
|
121
|
+
</div>
|
|
122
|
+
<div class="modal-body">
|
|
123
|
+
<p class="shutdown-message">Are you sure you want to shut down the Gantry dashboard server? Active state polling will stop and the server process will terminate.</p>
|
|
124
|
+
</div>
|
|
125
|
+
<div class="modal-footer">
|
|
126
|
+
<button id="shutdown-cancel-btn" class="btn-secondary" type="button">CANCEL</button>
|
|
127
|
+
<button id="shutdown-confirm-btn" class="btn-danger" type="button">CONFIRM SHUTDOWN</button>
|
|
128
|
+
</div>
|
|
129
|
+
</div>
|
|
130
|
+
</div>
|
|
131
|
+
|
|
132
|
+
<!-- Server Stopped Overlay / Banner -->
|
|
133
|
+
<div id="server-stopped-overlay" class="stopped-overlay hidden" role="alert">
|
|
134
|
+
<div class="stopped-card">
|
|
135
|
+
<span class="stopped-icon">⏹</span>
|
|
136
|
+
<h2 class="stopped-heading">SERVER STOPPED</h2>
|
|
137
|
+
<p class="stopped-subtext">DISCONNECTED // DAEMON TERMINATED</p>
|
|
138
|
+
<div class="stopped-hint">Restart via CLI: <code>python3 .agents/skills/gantry/scripts/dashboard.py start --daemon</code></div>
|
|
139
|
+
</div>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
47
142
|
<!-- Telemetry Footer -->
|
|
48
143
|
<footer class="rig-footer">
|
|
49
144
|
<div class="footer-inner">
|