proctolog 0.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +23 -0
- data/README.md +178 -0
- data/app/controllers/proctolog/acceptances_controller.rb +29 -0
- data/app/controllers/proctolog/application_controller.rb +32 -0
- data/app/controllers/proctolog/bursts_controller.rb +34 -0
- data/app/controllers/proctolog/choices_controller.rb +30 -0
- data/app/controllers/proctolog/code_reviews_controller.rb +26 -0
- data/app/controllers/proctolog/decisions_controller.rb +33 -0
- data/app/controllers/proctolog/entries_controller.rb +14 -0
- data/app/controllers/proctolog/evidence_controller.rb +23 -0
- data/app/controllers/proctolog/freshness_controller.rb +27 -0
- data/app/controllers/proctolog/good_to_go_controller.rb +29 -0
- data/app/controllers/proctolog/memberships_controller.rb +20 -0
- data/app/controllers/proctolog/mentions_controller.rb +16 -0
- data/app/controllers/proctolog/moments_controller.rb +26 -0
- data/app/controllers/proctolog/note_params.rb +24 -0
- data/app/controllers/proctolog/notes_controller.rb +56 -0
- data/app/controllers/proctolog/open_pull_requests_controller.rb +59 -0
- data/app/controllers/proctolog/pictures_controller.rb +27 -0
- data/app/controllers/proctolog/prompts_controller.rb +28 -0
- data/app/controllers/proctolog/pull_request_scoped.rb +21 -0
- data/app/controllers/proctolog/pull_requests_controller.rb +34 -0
- data/app/controllers/proctolog/put_away_controller.rb +19 -0
- data/app/controllers/proctolog/recordings_controller.rb +28 -0
- data/app/controllers/proctolog/rendered_pieces_controller.rb +11 -0
- data/app/controllers/proctolog/review_data_controller.rb +12 -0
- data/app/controllers/proctolog/rules_controller.rb +20 -0
- data/app/controllers/proctolog/scenario_notes_controller.rb +26 -0
- data/app/controllers/proctolog/scenario_scoped.rb +21 -0
- data/app/controllers/proctolog/scenarios_controller.rb +67 -0
- data/app/controllers/proctolog/sitting_servers_controller.rb +30 -0
- data/app/controllers/proctolog/waiting_controller.rb +14 -0
- data/app/controllers/proctolog/with_decisions.rb +28 -0
- data/app/helpers/proctolog/bursts_helper.rb +52 -0
- data/app/helpers/proctolog/decisions_helper.rb +102 -0
- data/app/helpers/proctolog/desk_helper.rb +61 -0
- data/app/helpers/proctolog/mentions_helper.rb +27 -0
- data/app/helpers/proctolog/open_pull_requests_helper.rb +31 -0
- data/app/helpers/proctolog/prompts_helper.rb +21 -0
- data/app/helpers/proctolog/pull_requests_helper.rb +67 -0
- data/app/helpers/proctolog/recordings_helper.rb +30 -0
- data/app/helpers/proctolog/rounds_helper.rb +27 -0
- data/app/helpers/proctolog/scenarios_helper.rb +123 -0
- data/app/helpers/proctolog/standings_helper.rb +80 -0
- data/app/jobs/proctolog/application_job.rb +8 -0
- data/app/jobs/proctolog/ask_for_release_job.rb +9 -0
- data/app/jobs/proctolog/fetch_pictures_ahead_job.rb +36 -0
- data/app/jobs/proctolog/prune_fresh_profiles_job.rb +9 -0
- data/app/jobs/proctolog/read_mentions_ahead_job.rb +12 -0
- data/app/models/proctolog/acceptance.rb +47 -0
- data/app/models/proctolog/app.rb +92 -0
- data/app/models/proctolog/browser.rb +42 -0
- data/app/models/proctolog/burst.rb +268 -0
- data/app/models/proctolog/burst_notices.rb +143 -0
- data/app/models/proctolog/chapters.rb +42 -0
- data/app/models/proctolog/check.rb +122 -0
- data/app/models/proctolog/choices.rb +112 -0
- data/app/models/proctolog/code_review.rb +251 -0
- data/app/models/proctolog/decision_record.rb +12 -0
- data/app/models/proctolog/decisions.rb +199 -0
- data/app/models/proctolog/description.rb +165 -0
- data/app/models/proctolog/difference.rb +138 -0
- data/app/models/proctolog/doctor.rb +127 -0
- data/app/models/proctolog/evidence.rb +29 -0
- data/app/models/proctolog/failure.rb +7 -0
- data/app/models/proctolog/focus.rb +48 -0
- data/app/models/proctolog/fresh_sitting.rb +35 -0
- data/app/models/proctolog/github.rb +353 -0
- data/app/models/proctolog/handover/brief.rb +138 -0
- data/app/models/proctolog/handover/layers.rb +128 -0
- data/app/models/proctolog/handover/places.rb +98 -0
- data/app/models/proctolog/handover/taken.rb +41 -0
- data/app/models/proctolog/handover/worklist.rb +35 -0
- data/app/models/proctolog/handover.rb +123 -0
- data/app/models/proctolog/housekeeping.rb +23 -0
- data/app/models/proctolog/kit.rb +36 -0
- data/app/models/proctolog/marks.rb +130 -0
- data/app/models/proctolog/membership.rb +91 -0
- data/app/models/proctolog/mentions.rb +117 -0
- data/app/models/proctolog/note.rb +94 -0
- data/app/models/proctolog/outside.rb +45 -0
- data/app/models/proctolog/overlay/brief.rb +52 -0
- data/app/models/proctolog/overlay/written.rb +33 -0
- data/app/models/proctolog/overlay.rb +87 -0
- data/app/models/proctolog/owner.rb +16 -0
- data/app/models/proctolog/pick.rb +47 -0
- data/app/models/proctolog/picture.rb +138 -0
- data/app/models/proctolog/pieces_rendering.rb +40 -0
- data/app/models/proctolog/project.rb +118 -0
- data/app/models/proctolog/pull_request.rb +89 -0
- data/app/models/proctolog/recording.rb +194 -0
- data/app/models/proctolog/release.rb +59 -0
- data/app/models/proctolog/rendering.rb +303 -0
- data/app/models/proctolog/reports.rb +66 -0
- data/app/models/proctolog/response_files.rb +55 -0
- data/app/models/proctolog/rounds.rb +305 -0
- data/app/models/proctolog/route.rb +151 -0
- data/app/models/proctolog/rules.rb +121 -0
- data/app/models/proctolog/scenario.rb +126 -0
- data/app/models/proctolog/server.rb +273 -0
- data/app/models/proctolog/since.rb +108 -0
- data/app/models/proctolog/size.rb +30 -0
- data/app/models/proctolog/standing.rb +132 -0
- data/app/models/proctolog/theme.rb +40 -0
- data/app/models/proctolog/unopened/numbers.rb +48 -0
- data/app/models/proctolog/unopened/opening.rb +88 -0
- data/app/models/proctolog/unopened.rb +203 -0
- data/app/models/proctolog/visit.rb +26 -0
- data/app/views/layouts/proctolog/application.html.erb +58 -0
- data/app/views/proctolog/acceptances/new.html.erb +34 -0
- data/app/views/proctolog/bursts/_line.html.erb +28 -0
- data/app/views/proctolog/bursts/_merged.html.erb +23 -0
- data/app/views/proctolog/bursts/_moved.html.erb +16 -0
- data/app/views/proctolog/bursts/_notices.html.erb +39 -0
- data/app/views/proctolog/bursts/_put_away.html.erb +11 -0
- data/app/views/proctolog/bursts/_rules.html.erb +27 -0
- data/app/views/proctolog/bursts/_side.html.erb +49 -0
- data/app/views/proctolog/bursts/_side_stop.html.erb +10 -0
- data/app/views/proctolog/bursts/show.html.erb +54 -0
- data/app/views/proctolog/code_reviews/show.html.erb +33 -0
- data/app/views/proctolog/decisions/_alternative.html.erb +5 -0
- data/app/views/proctolog/decisions/_beneath.html.erb +21 -0
- data/app/views/proctolog/decisions/_box.html.erb +27 -0
- data/app/views/proctolog/decisions/_choices.html.erb +9 -0
- data/app/views/proctolog/decisions/_draft_tools.html.erb +47 -0
- data/app/views/proctolog/decisions/_part.html.erb +61 -0
- data/app/views/proctolog/decisions/_round_data.html.erb +1 -0
- data/app/views/proctolog/decisions/_theme.html.erb +13 -0
- data/app/views/proctolog/decisions/index.html.erb +75 -0
- data/app/views/proctolog/notes/_card.html.erb +19 -0
- data/app/views/proctolog/notes/_template.html.erb +41 -0
- data/app/views/proctolog/open_pull_requests/_side.html.erb +30 -0
- data/app/views/proctolog/open_pull_requests/index.html.erb +106 -0
- data/app/views/proctolog/prompts/show.html.erb +41 -0
- data/app/views/proctolog/pull_requests/_connections.html.erb +65 -0
- data/app/views/proctolog/pull_requests/_finish.html.erb +42 -0
- data/app/views/proctolog/pull_requests/_margin.html.erb +33 -0
- data/app/views/proctolog/pull_requests/_note.html.erb +4 -0
- data/app/views/proctolog/pull_requests/_outline.html.erb +26 -0
- data/app/views/proctolog/pull_requests/_paragraphs.html.erb +9 -0
- data/app/views/proctolog/pull_requests/_scenarios.html.erb +16 -0
- data/app/views/proctolog/pull_requests/_since.html.erb +42 -0
- data/app/views/proctolog/pull_requests/_standing.html.erb +51 -0
- data/app/views/proctolog/pull_requests/_status.html.erb +5 -0
- data/app/views/proctolog/pull_requests/_try.html.erb +122 -0
- data/app/views/proctolog/pull_requests/show.html.erb +145 -0
- data/app/views/proctolog/recordings/_dialog.html.erb +26 -0
- data/app/views/proctolog/recordings/_list.html.erb +8 -0
- data/app/views/proctolog/recordings/_note.html.erb +22 -0
- data/app/views/proctolog/recordings/index.html.erb +33 -0
- data/app/views/proctolog/recordings/show.html.erb +118 -0
- data/app/views/proctolog/scenarios/_dialog.html.erb +22 -0
- data/app/views/proctolog/scenarios/_note.html.erb +18 -0
- data/app/views/proctolog/scenarios/_open.html.erb +9 -0
- data/app/views/proctolog/scenarios/_scenario.html.erb +48 -0
- data/app/views/proctolog/scenarios/_server.html.erb +20 -0
- data/app/views/proctolog/scenarios/index.html.erb +62 -0
- data/bin/proctolog +330 -0
- data/completions/_proctolog +143 -0
- data/config/application.rb +94 -0
- data/config/database.yml +16 -0
- data/config/environment.rb +6 -0
- data/config/initializers/grouse.rb +113 -0
- data/config/initializers/grouse_notes.rb +9 -0
- data/config/keys.yml +6 -0
- data/config/routes.rb +71 -0
- data/config/storage.yml +4 -0
- data/db/migrate/20261019213542_create_grouse_tables.grouse.rb +128 -0
- data/db/migrate/20261019213550_create_active_storage_tables.active_storage.rb +58 -0
- data/docs/manual/app.md +157 -0
- data/docs/manual/bursts.md +129 -0
- data/docs/manual/deciding.md +89 -0
- data/docs/manual/desk.png +0 -0
- data/docs/manual/films.md +20 -0
- data/docs/manual/handover.md +93 -0
- data/docs/manual/pr-format.md +75 -0
- data/docs/manual/reading.md +233 -0
- data/docs/manual/unopened.md +80 -0
- data/docs/manual/updates.md +55 -0
- data/lib/proctolog/installation.rb +125 -0
- data/lib/proctolog/version.rb +7 -0
- data/public/asking.js +50 -0
- data/public/code-review.js +40 -0
- data/public/cursor.js +292 -0
- data/public/decision-screenshots.js +97 -0
- data/public/decisions.css +949 -0
- data/public/decisions.js +1289 -0
- data/public/desk.css +582 -0
- data/public/desk.js +126 -0
- data/public/favicon.png +0 -0
- data/public/keys.js +228 -0
- data/public/mentions.js +389 -0
- data/public/messages.js +103 -0
- data/public/notes.js +731 -0
- data/public/pick.css +99 -0
- data/public/plaque.png +0 -0
- data/public/pr-number.js +11 -0
- data/public/prompt.css +46 -0
- data/public/prompt.js +16 -0
- data/public/pull_request.css +805 -0
- data/public/recording.css +379 -0
- data/public/recording.js +394 -0
- data/public/release.js +25 -0
- data/public/respond.css +260 -0
- data/public/respond.js +95 -0
- data/public/review-drafts.js +949 -0
- data/public/review-rounds.js +1447 -0
- data/public/scenarios.css +253 -0
- data/public/scenarios.js +36 -0
- data/public/schemas/proctolog-response-v1.json +101 -0
- data/public/side.js +133 -0
- data/public/standing.css +478 -0
- data/public/terminal-apl.svg +6 -0
- data/public/terminal-cuneiform.svg +3 -0
- data/public/terminal-grain-dots.svg +6 -0
- data/public/terminal-grain-weave.svg +6 -0
- data/public/terminal-grain-wedges.svg +6 -0
- data/public/terminal-shades.svg +3 -0
- data/public/terminal.css +4426 -0
- data/public/toast.js +26 -0
- data/public/try.js +124 -0
- data/public/viewer.js +808 -0
- data/public/words.js +81 -0
- data/skills/proctolog-handover/SKILL.md +77 -0
- data/skills/proctolog-pr-writing/SKILL.md +228 -0
- data/skills/proctolog-pr-writing/references/example-description.md +33 -0
- metadata +366 -0
data/public/toast.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// A sentence that answers a key: what it did, or why it did nothing. It shows
|
|
2
|
+
// above the key bar for a few seconds and is read out, then goes; the page is
|
|
3
|
+
// not moved by it. Each is kept, for m to show again (messages.js).
|
|
4
|
+
|
|
5
|
+
import { keep } from "./messages.js";
|
|
6
|
+
|
|
7
|
+
let region;
|
|
8
|
+
let fading;
|
|
9
|
+
|
|
10
|
+
export const toast = (message) => {
|
|
11
|
+
if (!message) return;
|
|
12
|
+
keep(message);
|
|
13
|
+
region ??= document.body.appendChild(
|
|
14
|
+
Object.assign(document.createElement("p"), {
|
|
15
|
+
className: "toast",
|
|
16
|
+
role: "status",
|
|
17
|
+
}),
|
|
18
|
+
);
|
|
19
|
+
region.textContent = message;
|
|
20
|
+
region.dataset.shown = "";
|
|
21
|
+
clearTimeout(fading);
|
|
22
|
+
fading = setTimeout(
|
|
23
|
+
() => delete region.dataset.shown,
|
|
24
|
+
Math.min(9000, 2600 + message.length * 45),
|
|
25
|
+
);
|
|
26
|
+
};
|
data/public/try.js
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
// Try it, beside a pull request. The server is started and stopped while the
|
|
2
|
+
// page stays where it is, and the panel is read again from the page whenever
|
|
3
|
+
// the server's state moves, so its buttons come alive once the app is up. A
|
|
4
|
+
// press that sets a scenario up says so while the app makes its state.
|
|
5
|
+
|
|
6
|
+
import { toast } from "./toast.js";
|
|
7
|
+
|
|
8
|
+
const PANEL = "[data-try]";
|
|
9
|
+
const panel = () => document.querySelector(PANEL);
|
|
10
|
+
|
|
11
|
+
let waiting;
|
|
12
|
+
|
|
13
|
+
// The panel as the page has it now, in place of the one shown, with the
|
|
14
|
+
// focus kept on the button it was on.
|
|
15
|
+
const refresh = async () => {
|
|
16
|
+
const response = await fetch(location.href, {
|
|
17
|
+
headers: { Accept: "text/html" },
|
|
18
|
+
}).catch(() => undefined);
|
|
19
|
+
if (!response?.ok) return;
|
|
20
|
+
const page = new DOMParser().parseFromString(
|
|
21
|
+
await response.text(),
|
|
22
|
+
"text/html",
|
|
23
|
+
);
|
|
24
|
+
const fresh = page.querySelector(PANEL);
|
|
25
|
+
const shown = panel();
|
|
26
|
+
if (!fresh || !shown) return;
|
|
27
|
+
const buttons = [...shown.querySelectorAll("button")];
|
|
28
|
+
const focused = buttons.indexOf(document.activeElement);
|
|
29
|
+
shown.replaceWith(fresh);
|
|
30
|
+
if (focused >= 0) fresh.querySelectorAll("button")[focused]?.focus();
|
|
31
|
+
watch();
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
// While the server starts, it is asked every two seconds whether it is up.
|
|
35
|
+
const watch = () => {
|
|
36
|
+
clearTimeout(waiting);
|
|
37
|
+
const shown = panel();
|
|
38
|
+
if (shown?.dataset.state !== "starting") return;
|
|
39
|
+
waiting = setTimeout(async () => {
|
|
40
|
+
const response = await fetch(shown.dataset.statusUrl, {
|
|
41
|
+
headers: { Accept: "application/json" },
|
|
42
|
+
}).catch(() => undefined);
|
|
43
|
+
const { state } = (await response?.json().catch(() => undefined)) ?? {};
|
|
44
|
+
if (state && state !== "starting") refresh();
|
|
45
|
+
else watch();
|
|
46
|
+
}, 2000);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
document.addEventListener("submit", async (event) => {
|
|
50
|
+
const form = event.target.closest?.(`${PANEL} form[data-server]`);
|
|
51
|
+
if (!form) return;
|
|
52
|
+
event.preventDefault();
|
|
53
|
+
form.querySelector("button").disabled = true;
|
|
54
|
+
const response = await fetch(form.action, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
body: new FormData(form),
|
|
57
|
+
headers: { Accept: "application/json" },
|
|
58
|
+
}).catch(() => undefined);
|
|
59
|
+
if (!response?.headers.get("content-type")?.includes("json"))
|
|
60
|
+
return form.submit();
|
|
61
|
+
const { notice, alert } = await response.json();
|
|
62
|
+
toast(alert ?? notice);
|
|
63
|
+
refresh();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
// Making a state can take a while, the app's runner booting first: the line
|
|
67
|
+
// under the scenario's button says so meanwhile. A scenario in your own
|
|
68
|
+
// Chrome goes on in a tab of its own, so this page has only to say where.
|
|
69
|
+
document.addEventListener("submit", (event) => {
|
|
70
|
+
const form = event.target.closest?.(`${PANEL} form[data-set-up]`);
|
|
71
|
+
if (!form) return;
|
|
72
|
+
const button = form.querySelector("button");
|
|
73
|
+
const how = form.closest("li").querySelector(".how");
|
|
74
|
+
const said = how.innerHTML;
|
|
75
|
+
const elsewhere = form.target === "_blank";
|
|
76
|
+
how.textContent = elsewhere
|
|
77
|
+
? "Setting up, in a new tab…"
|
|
78
|
+
: "Setting up: the app makes its state, then a Chrome opens…";
|
|
79
|
+
requestAnimationFrame(() => {
|
|
80
|
+
button.disabled = true;
|
|
81
|
+
});
|
|
82
|
+
if (elsewhere)
|
|
83
|
+
addEventListener(
|
|
84
|
+
"focus",
|
|
85
|
+
() => {
|
|
86
|
+
how.innerHTML = said;
|
|
87
|
+
button.disabled = false;
|
|
88
|
+
},
|
|
89
|
+
{ once: true },
|
|
90
|
+
);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Words to copy go to the clipboard at a press. Where the page may not write
|
|
94
|
+
// there, they are selected instead, for the owner's own Command-C.
|
|
95
|
+
document.addEventListener("click", async (event) => {
|
|
96
|
+
const button = event.target.closest?.(".copyable [data-copy]");
|
|
97
|
+
if (!button) return;
|
|
98
|
+
const words = button.closest(".copyable").querySelector("pre");
|
|
99
|
+
const copied = await navigator.clipboard
|
|
100
|
+
?.writeText(words.textContent)
|
|
101
|
+
.then(() => true)
|
|
102
|
+
.catch(() => false);
|
|
103
|
+
if (!copied) {
|
|
104
|
+
getSelection().selectAllChildren(words);
|
|
105
|
+
return toast("Selected: Command-C copies it.");
|
|
106
|
+
}
|
|
107
|
+
button.textContent = "copied";
|
|
108
|
+
setTimeout(() => {
|
|
109
|
+
button.textContent = "copy";
|
|
110
|
+
}, 1600);
|
|
111
|
+
});
|
|
112
|
+
|
|
113
|
+
// t goes to the panel: the first of its buttons that can be pressed.
|
|
114
|
+
export const tryIt = () => {
|
|
115
|
+
const button = panel()?.querySelector("button:not(:disabled)");
|
|
116
|
+
if (button) return button.focus();
|
|
117
|
+
toast(
|
|
118
|
+
panel()
|
|
119
|
+
? "Nothing in Try it can be pressed now."
|
|
120
|
+
: "This pull request has no scenarios.",
|
|
121
|
+
);
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
watch();
|