@uchibeke/gallivant 0.2.0 → 0.3.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/README.md +120 -60
- package/SECURITY.md +9 -0
- package/bin/gallivant.mjs +41 -14
- package/bin/promote-bitbucket.mjs +40 -0
- package/bin/task-pr.mjs +9 -0
- package/bin/task-review.mjs +15 -0
- package/docs/README.md +6 -2
- package/docs/agent-setup.md +55 -41
- package/docs/architecture.md +11 -3
- package/docs/bitbucket-promotion.md +69 -0
- package/docs/bitbucket-review.md +330 -0
- package/docs/chains.md +30 -1
- package/docs/codex-cloud.md +7 -0
- package/docs/codex-review.md +50 -0
- package/docs/commands.md +103 -14
- package/docs/config.md +45 -13
- package/docs/execution.md +1 -1
- package/docs/first-party-review.md +266 -0
- package/docs/git-hosts.md +294 -0
- package/docs/guardrails.md +56 -0
- package/docs/install.md +137 -67
- package/docs/launch.md +7 -4
- package/docs/network-recovery.md +9 -0
- package/docs/openai-agents.md +3 -2
- package/docs/prd.md +23 -2
- package/docs/preparation.md +2 -2
- package/docs/release-qualification.md +1 -1
- package/docs/releasing.md +46 -22
- package/docs/task-delivery.md +5 -5
- package/docs/task-profiles.md +537 -0
- package/docs/tasks.md +59 -197
- package/lib/attribution.mjs +7 -3
- package/lib/block.mjs +10 -1
- package/lib/chains.mjs +101 -30
- package/lib/codex_cloud.mjs +2 -1
- package/lib/codex_cloud_input.mjs +15 -6
- package/lib/codex_cloud_result.mjs +1 -1
- package/lib/commands/doctor.mjs +22 -453
- package/lib/commands/init.mjs +281 -28
- package/lib/commands/register.mjs +81 -13
- package/lib/commands/resume.mjs +5 -1
- package/lib/commands/review.mjs +66 -0
- package/lib/commands/serve.mjs +8 -0
- package/lib/commands/start.mjs +30 -11
- package/lib/commands/status.mjs +18 -2
- package/lib/commands/task.mjs +9 -1
- package/lib/commands/up.mjs +19 -11
- package/lib/commands/why.mjs +7 -3
- package/lib/config.mjs +42 -9
- package/lib/context.mjs +28 -21
- package/lib/control.mjs +21 -6
- package/lib/credential.mjs +20 -14
- package/lib/deliverable.mjs +2 -0
- package/lib/events.mjs +96 -53
- package/lib/execution.mjs +132 -11
- package/lib/execution_preparation.mjs +16 -1
- package/lib/execution_result.mjs +26 -5
- package/lib/first_party_review.mjs +618 -0
- package/lib/fs.mjs +10 -3
- package/lib/gh.mjs +144 -56
- package/lib/git.mjs +133 -32
- package/lib/git_diff.mjs +121 -0
- package/lib/harness.mjs +14 -10
- package/lib/host_contract.mjs +71 -0
- package/lib/host_definitions.mjs +22 -0
- package/lib/hosts/bitbucket.mjs +553 -0
- package/lib/hosts/bitbucket_contract.mjs +57 -0
- package/lib/hosts/bitbucket_credential.mjs +62 -0
- package/lib/hosts/bitbucket_review.mjs +44 -0
- package/lib/hosts/bitbucket_review_producer.mjs +50 -0
- package/lib/hosts/github.mjs +57 -0
- package/lib/hosts/github_contract.mjs +27 -0
- package/lib/hosts/github_doctor.mjs +482 -0
- package/lib/hosts/github_review_summary.mjs +38 -0
- package/lib/hosts/transport_doctor.mjs +35 -0
- package/lib/hosts.mjs +130 -0
- package/lib/learning_qualification.mjs +1 -1
- package/lib/notify.mjs +1 -1
- package/lib/openai_agents_input.mjs +7 -2
- package/lib/openai_agents_sources.mjs +16 -8
- package/lib/plugin_package.mjs +13 -1
- package/lib/pr_operation.mjs +41 -0
- package/lib/prd.mjs +18 -3
- package/lib/preparation_codex.mjs +6 -1
- package/lib/probe.mjs +6 -4
- package/lib/process.mjs +24 -0
- package/lib/promotion.mjs +132 -0
- package/lib/promotion_git.mjs +63 -0
- package/lib/prompt.mjs +16 -13
- package/lib/provider_health.mjs +14 -3
- package/lib/repository.mjs +68 -0
- package/lib/repository_preflight.mjs +11 -0
- package/lib/review_evaluation.mjs +25 -0
- package/lib/review_evidence.mjs +500 -0
- package/lib/review_history.mjs +73 -0
- package/lib/review_image.mjs +145 -0
- package/lib/review_link.mjs +12 -0
- package/lib/review_policy.mjs +132 -0
- package/lib/review_policy_contract.mjs +18 -0
- package/lib/review_state.mjs +13 -0
- package/lib/review_visual.mjs +94 -0
- package/lib/runtime-environment.mjs +6 -0
- package/lib/runtime_node.mjs +3 -2
- package/lib/runtime_state.mjs +39 -5
- package/lib/sources/prd.mjs +6 -3
- package/lib/state.mjs +137 -24
- package/lib/task_completion.mjs +7 -3
- package/lib/task_contract.mjs +201 -27
- package/lib/task_delivery.mjs +9 -2
- package/lib/task_delivery_contract.mjs +13 -9
- package/lib/task_delivery_view.mjs +18 -2
- package/lib/task_environment.mjs +13 -1
- package/lib/task_limits.mjs +13 -0
- package/lib/task_model_config.mjs +99 -0
- package/lib/task_model_route.mjs +243 -0
- package/lib/task_prepare.mjs +21 -8
- package/lib/task_profile.mjs +1875 -0
- package/lib/task_repository_context.mjs +65 -0
- package/lib/tasks.mjs +252 -51
- package/lib/tick.mjs +373 -98
- package/lib/time.mjs +1 -0
- package/lib/tracker/pages.mjs +19 -5
- package/lib/tracker/review.mjs +21 -0
- package/lib/tracker_process.mjs +8 -1
- package/lib/verification_sandbox.mjs +2 -1
- package/lib/work_artifacts.mjs +79 -0
- package/npm-shrinkwrap.json +12 -3
- package/package.json +9 -3
- package/templates/plugin/task-delivery.SKILL.md +17 -10
- package/templates/plugin/task-intake-contract.json +18 -0
- package/templates/plugin/task-profile-requests.mjs +1448 -0
- package/templates/tracker/tracker.css +3 -0
- package/templates/tracker/tracker.js +38 -0
|
@@ -299,3 +299,6 @@ dl.facts code { background: var(--gv-bench); padding: 1px 6px; border-radius: 6p
|
|
|
299
299
|
.ll.h, .ll.skip { color: var(--gv-subtle); font-size: 11px; padding-bottom: 8px; margin-bottom: 6px; border-bottom: 1px dashed var(--gv-line); }
|
|
300
300
|
@media (max-width: 700px) { .ll.t { grid-template-columns: 1fr; gap: 0; } .ll.t .n { text-align: left; } }
|
|
301
301
|
.note { font-size: 12px; color: var(--gv-subtle); margin: 8px 0 0; font-family: var(--gv-mono); }
|
|
302
|
+
#review-activity { margin: 24px 0; }
|
|
303
|
+
#review-activity-log { max-height: 12rem; overflow-y: auto; font-family: var(--gv-mono); font-size: 12px; overflow-wrap: anywhere; }
|
|
304
|
+
#review-activity-log p { margin: 6px 0; }
|
|
@@ -12,6 +12,43 @@
|
|
|
12
12
|
// and cannot be told at build time where it lives.
|
|
13
13
|
const BASE = document.body.dataset.base || "";
|
|
14
14
|
|
|
15
|
+
// A live, bounded status feed; it never opens raw reviewer output or submits work.
|
|
16
|
+
const reviewActivity = document.getElementById("review-activity");
|
|
17
|
+
if (reviewActivity) {
|
|
18
|
+
const log = document.getElementById("review-activity-log"), status = document.getElementById("review-activity-state");
|
|
19
|
+
const url = `${BASE}/api/run/review-activity?id=${encodeURIComponent(reviewActivity.dataset.entry)}`;
|
|
20
|
+
let previous = log.firstElementChild?.textContent || "";
|
|
21
|
+
const pollReview = async () => {
|
|
22
|
+
try {
|
|
23
|
+
const response = await fetch(url, { cache: "no-store" });
|
|
24
|
+
if (!response.ok) throw new Error("Review status unavailable");
|
|
25
|
+
const data = await response.json();
|
|
26
|
+
if (typeof data.message !== "string") throw new Error("Review status unavailable");
|
|
27
|
+
if (data.message !== previous) {
|
|
28
|
+
const line = document.createElement("p");
|
|
29
|
+
line.textContent = `${new Date().toLocaleTimeString()} — ${data.message}`;
|
|
30
|
+
log.appendChild(line); previous = data.message;
|
|
31
|
+
while (log.childElementCount > 40) log.firstElementChild.remove();
|
|
32
|
+
}
|
|
33
|
+
status.textContent = "Updates every 10 seconds while this page is open.";
|
|
34
|
+
} catch { status.textContent = "Review status unavailable; retrying."; }
|
|
35
|
+
setTimeout(pollReview, 10_000);
|
|
36
|
+
};
|
|
37
|
+
pollReview();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Relative times must age while the dashboard stays open.
|
|
41
|
+
const relativeTimes = document.querySelectorAll?.("time[data-relative-time]") || [];
|
|
42
|
+
if (relativeTimes.length) {
|
|
43
|
+
const refreshTimes = () => relativeTimes.forEach(el => {
|
|
44
|
+
const at = Date.parse(el.getAttribute("datetime"));
|
|
45
|
+
if (!Number.isFinite(at)) { el.textContent = "unknown"; return; }
|
|
46
|
+
const ms = Math.max(0, Date.now() - at), minutes = Math.round(ms / 60_000), hours = Math.round(minutes / 60);
|
|
47
|
+
el.textContent = ms < 45_000 ? "just now" : minutes < 60 ? `${minutes}m ago` : hours < 48 ? `${hours}h ago` : `${Math.round(hours / 24)}d ago`;
|
|
48
|
+
});
|
|
49
|
+
refreshTimes(); setInterval(refreshTimes, 30_000);
|
|
50
|
+
}
|
|
51
|
+
|
|
15
52
|
// Fixed actions and messages share delivery, but only Send message reads the composer's draft.
|
|
16
53
|
const runControls = document.getElementById("run-controls");
|
|
17
54
|
if (runControls) {
|
|
@@ -127,6 +164,7 @@ if (side) {
|
|
|
127
164
|
}
|
|
128
165
|
g.hidden = rows.length > 0 && hits === 0;
|
|
129
166
|
g.classList.toggle("closed", !!shut[g.dataset.group]);
|
|
167
|
+
g.querySelector("h3")?.setAttribute("aria-expanded", String(!shut[g.dataset.group]));
|
|
130
168
|
const tally = g.querySelector("h3 small");
|
|
131
169
|
if (tally) tally.textContent = term ? hits + "/" + rows.length : String(rows.length);
|
|
132
170
|
shown += hits;
|