looply-cli 0.5.23 → 0.5.25

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.
@@ -0,0 +1,203 @@
1
+ "use strict";
2
+ /**
3
+ * WHAT A TICKET SAYS, FOR A PERSON WHO TESTS THE PRODUCT, NOT ONE WHO BUILDS LOOPLY.
4
+ *
5
+ * Looply's internal reasons are written for its own log: "no ready items: the
6
+ * queue holds 1 stale, 1 closed … Run `looply scan`". The run log may keep them.
7
+ * What goes to the server for a person — the reason a pursuit settled, and a
8
+ * branch delivery's note, both of which AutoRyn puts on the ticket — is read by
9
+ * a QA tester. TAB-B-61 (2026-10-17) carried both of the strings above onto a
10
+ * ticket word for word.
11
+ *
12
+ * So these turn an internal reason into a ticket sentence. Pure: no I/O, and
13
+ * every known reason is matched by its fixed words, with a general clean-up
14
+ * for anything else. A ticket never gets a backticked command, Looply's
15
+ * internal nouns (queue, items, stale, closed, ordinal, grant, round, KEY 2), or
16
+ * a raw check name like `admin:vitest` — it gets "admin tests".
17
+ */
18
+ Object.defineProperty(exports, "__esModule", { value: true });
19
+ exports.NO_CI_SHIP_NOTE = exports.NOTHING_YET_SENTENCE = exports.FINISHED_SENTENCE = exports.DECIDE_SENTENCE = exports.NOTHING_LEFT_TO_WORK_ON = exports.REPLAN_SENTENCE = void 0;
20
+ exports.plainCheckName = plainCheckName;
21
+ exports.describeChecks = describeChecks;
22
+ exports.plainWords = plainWords;
23
+ exports.ticketSentence = ticketSentence;
24
+ exports.ticketDeliveryNote = ticketDeliveryNote;
25
+ /** A plan whose every step was set aside, retried by the next try (not a person's question). */
26
+ exports.REPLAN_SENTENCE = 'every step Looply planned for this ticket was already done, no longer fitted the code, or could not go ahead yet, ' +
27
+ 'so its next try checks the ticket against the code again and plans what is still missing';
28
+ /**
29
+ * A run's own reason when a plan left nothing to work on and nothing waits on a person: plain,
30
+ * because it becomes the last thing a run said, which an ending may quote on the ticket.
31
+ */
32
+ exports.NOTHING_LEFT_TO_WORK_ON = 'nothing Looply planned is left to work on: every step was already done, no longer fitted the code, or could not go ahead yet, ' +
33
+ 'so the next try checks the ticket against the code again and plans what is still missing';
34
+ /** Planned work a person must explain before it can be done. */
35
+ exports.DECIDE_SENTENCE = 'some of the work Looply planned is unclear, and a person needs to say what it should mean';
36
+ /** All the planned work finished, without the second check saying the ticket is met. */
37
+ exports.FINISHED_SENTENCE = 'all the work Looply planned for this ticket is finished';
38
+ /** Nothing could start yet. */
39
+ exports.NOTHING_YET_SENTENCE = 'Looply had no work it could start on yet';
40
+ /** Under ship to test with no CI, while Looply's own checks are what the merge waits on. */
41
+ exports.NO_CI_SHIP_NOTE = "merging once Looply's own checks pass — this repository has no CI";
42
+ const CHECK_KINDS = [
43
+ [/^(vitest|jest|mocha|test|tests|unit|spec|specs)$/i, 'tests'],
44
+ [/^(e2e|playwright|cypress)$/i, 'end-to-end tests'],
45
+ [/^(tsc|typecheck|types|type-check)$/i, 'typecheck'],
46
+ [/^(lint|eslint)$/i, 'lint'],
47
+ [/^(build|vite)$/i, 'build'],
48
+ ];
49
+ /** A gate step's name as a person reads it: `admin:vitest` → "admin tests", `tsc` → "typecheck". */
50
+ function plainCheckName(name) {
51
+ const kind = (word) => CHECK_KINDS.find(([re]) => re.test(word))?.[1] ?? null;
52
+ const at = name.indexOf(':');
53
+ if (at > 0) {
54
+ const area = name.slice(0, at);
55
+ const what = name.slice(at + 1);
56
+ return `${area} ${kind(what) ?? what}`;
57
+ }
58
+ return kind(name) ?? name;
59
+ }
60
+ function list(names) {
61
+ return names.map(plainCheckName).join(', ');
62
+ }
63
+ /**
64
+ * Looply's own checks for a delivery, said plainly: "Looply's checks passed (typecheck, admin
65
+ * tests); 2 checks did not apply to this change". Null when there are none to name.
66
+ */
67
+ function describeChecks(checks) {
68
+ const entries = Object.entries(checks ?? {});
69
+ if (entries.length === 0)
70
+ return null;
71
+ const passed = entries.filter(([, o]) => o === 'passed').map(([n]) => n);
72
+ const failed = entries.filter(([, o]) => o !== 'passed' && o !== 'skipped').map(([n]) => n);
73
+ const skipped = entries.filter(([, o]) => o === 'skipped').length;
74
+ const parts = [];
75
+ if (failed.length === 0) {
76
+ if (passed.length > 0)
77
+ parts.push(`Looply's checks passed (${list(passed)})`);
78
+ }
79
+ else {
80
+ if (passed.length > 0)
81
+ parts.push(`Looply's checks: ${list(passed)} passed`);
82
+ parts.push(`${list(failed)} did not pass`);
83
+ }
84
+ if (skipped > 0)
85
+ parts.push(`${skipped} check${skipped === 1 ? '' : 's'} did not apply to this change`);
86
+ return parts.join('; ');
87
+ }
88
+ const STATE_WORDS = {
89
+ stale: 'out of date',
90
+ closed: 'finished',
91
+ duplicate: 'repeated',
92
+ blocked: 'waiting',
93
+ draft: 'unchecked',
94
+ verifying: 'being checked',
95
+ split: 'split up',
96
+ done: 'done',
97
+ ready: 'ready',
98
+ 'in progress': 'in progress',
99
+ };
100
+ function capitalise(s) {
101
+ return s === '' ? s : s[0].toUpperCase() + s.slice(1);
102
+ }
103
+ /**
104
+ * The general clean-up for a reason no rule below knows: drop sentences that tell a developer to
105
+ * run a command, and put Looply's internal nouns into plain words.
106
+ */
107
+ function plainWords(text) {
108
+ let s = text.replace(/\s+/g, ' ').trim();
109
+ // A sentence that is advice to run a command is for a developer at a terminal: dropped whole.
110
+ s = s
111
+ .split(/(?<=[.!?])\s+/)
112
+ .filter((sentence) => !/`looply\b|\blooply (scan|queue|verify|run|deliver|goal|doctor)\b/i.test(sentence))
113
+ .join(' ');
114
+ // Check names, backticked or not: `admin:vitest` → admin tests.
115
+ s = s.replace(/`?\b([a-z][\w-]*):([a-z][\w-]*)\b`?/gi, (m, area, what) => /^(https?|gol|itm|run|aut|cmd|prj)$/i.test(area) ? m : plainCheckName(`${area}:${what}`));
116
+ s = s.replace(/`([^`]*)`/g, '$1');
117
+ s = s.replace(/\bKEY ?2\b/gi, 'the second check').replace(/\bKEY ?1\b/gi, 'the first check');
118
+ s = s.replace(/\b(the )?second key\b/gi, 'the second check');
119
+ s = s.replace(/\blooply\/run-[\w-]+/g, 'an earlier Looply change');
120
+ s = s.replace(/\s*\(goal gol_\w+\)/g, '');
121
+ // "1 stale, 1 closed": counts of internal states.
122
+ s = s.replace(/\b(\d+) (in progress|stale|closed|duplicate|blocked|draft|verifying|split|done|ready)\b/gi, (_m, n, st) => `${n} ${STATE_WORDS[st.toLowerCase()] ?? st}`);
123
+ s = s.replace(/\bno ready items\b/gi, 'nothing ready to work on');
124
+ s = s.replace(/\bthe queue holds\b/gi, 'the planned work is');
125
+ s = s.replace(/\b(the |a |this )?queue\b/gi, 'the planned work');
126
+ s = s.replace(/\bitems\b/gi, 'pieces of work').replace(/\bitem\b/gi, 'piece of work');
127
+ s = s.replace(/\bstale\b/gi, 'out of date');
128
+ s = s.replace(/\bordinals?\b/gi, 'number');
129
+ s = s.replace(/\bgrants?\b/gi, 'allowance');
130
+ s = s.replace(/\brounds\b/gi, 'attempts').replace(/\bround\b/gi, 'attempt');
131
+ return s.replace(/\s+/g, ' ').replace(/\s+([.,;:])/g, '$1').trim();
132
+ }
133
+ /**
134
+ * An internal reason (a run's refusal, a halt, the last run's note) as a ticket sentence.
135
+ * Known reasons get a sentence written for them; anything else gets `plainWords`.
136
+ */
137
+ function ticketSentence(internal) {
138
+ const s = internal.replace(/\s+/g, ' ').trim();
139
+ if (/^nothing in the first plan is ready to work on\b/i.test(s))
140
+ return exports.REPLAN_SENTENCE;
141
+ const stalled = /^nothing here can move without you\s*[—-]+\s*no ready items: the queue holds ([^.]*)\./i.exec(s);
142
+ if (stalled !== null)
143
+ return /\b(draft|verifying)\b/i.test(stalled[1]) ? exports.DECIDE_SENTENCE : exports.REPLAN_SENTENCE;
144
+ if (/^nothing Looply planned is left to work on\b/i.test(s))
145
+ return exports.REPLAN_SENTENCE;
146
+ if (/^this goal's work is done\s*[—-]+\s*no ready items/i.test(s))
147
+ return exports.FINISHED_SENTENCE;
148
+ if (/^nothing to do\s*[—-]+\s*no ready items/i.test(s))
149
+ return exports.NOTHING_YET_SENTENCE;
150
+ return plainWords(s);
151
+ }
152
+ /** How a delivery note parked for want of CI begins (`branch-delivery.ts`'s `NO_CI_NOTE`). */
153
+ const NO_CI = 'not merged: no CI checks report on this pull request';
154
+ const NO_CI_PLAIN = 'Not merged yet: this repository has no CI checks on its pull requests';
155
+ /**
156
+ * A branch delivery's note as the ticket's audit line says it. The stored note stays as written
157
+ * (the run log and the delivery's own rules read it); only what is sent to the server is this.
158
+ */
159
+ function ticketDeliveryNote(note, checks) {
160
+ if (note === null)
161
+ return null;
162
+ const s = note.replace(/\s+/g, ' ').trim();
163
+ if (s === '')
164
+ return null;
165
+ const said = describeChecks(checks);
166
+ if (s.startsWith(NO_CI)) {
167
+ if (/did not all pass/.test(s)) {
168
+ const failed = Object.entries(checks ?? {}).filter(([, o]) => o !== 'passed' && o !== 'skipped').map(([n]) => n);
169
+ return (`${NO_CI_PLAIN}, and not all of Looply's own checks passed` +
170
+ (failed.length > 0 ? ` (${list(failed)} did not pass)` : '') +
171
+ ', so a person needs to merge it.');
172
+ }
173
+ if (/different commit/.test(s)) {
174
+ return `${NO_CI_PLAIN}, and Looply's own checks ran on an earlier version of this change than the one in the pull request, so a person needs to merge it.`;
175
+ }
176
+ return `${NO_CI_PLAIN}, so a person needs to merge it.`;
177
+ }
178
+ if (s.startsWith("merged on Looply's own checks")) {
179
+ return `Merged: ${said ?? "Looply's own checks passed"}. This repository has no CI, so Looply's own checks were used.`;
180
+ }
181
+ if (s === 'its own checks hold; merging once the checks allow') {
182
+ return `${said ?? "Looply's own checks passed"}; merging it now — this repository has no CI.`;
183
+ }
184
+ if (s === exports.NO_CI_SHIP_NOTE)
185
+ return `${capitalise(exports.NO_CI_SHIP_NOTE)}.`;
186
+ if (s === 'approved to ship by a person; merging once the checks allow') {
187
+ return 'A person approved it to ship; Looply merges it once its checks allow.';
188
+ }
189
+ if (/^waiting for \S+ to merge first$/.test(s))
190
+ return 'Waiting for the earlier change this one builds on to be merged first.';
191
+ const retargeted = /^\S+ merged; retargeted to (\S+)$/.exec(s);
192
+ if (retargeted !== null)
193
+ return `The earlier change this one built on was merged, so it now goes into ${retargeted[1]}.`;
194
+ const pending = /^not merged: still waiting for (.+) after a day; a person merges$/.exec(s);
195
+ if (pending !== null)
196
+ return `Not merged: the pull request's checks (${pending[1]}) had still not finished after a day, so a person needs to merge it.`;
197
+ const red = /^not merged: (.+) failed$/.exec(s);
198
+ if (red !== null)
199
+ return `Not merged: these checks failed on the pull request: ${red[1]}.`;
200
+ const out = capitalise(plainWords(s));
201
+ return /[.!?…]$/.test(out) ? out : `${out}.`;
202
+ }
203
+ //# sourceMappingURL=ticket-words.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ticket-words.js","sourceRoot":"","sources":["../src/ticket-words.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "looply-cli",
3
- "version": "0.5.23",
3
+ "version": "0.5.25",
4
4
  "description": "Leave your coding agent running. looply picks the work, holds the rails, and proves every change before it is kept.",
5
5
  "license": "MIT",
6
6
  "bin": {
@@ -32,7 +32,7 @@
32
32
  "prepublishOnly": "npm run build"
33
33
  },
34
34
  "dependencies": {
35
- "@looply/core": "0.5.23",
35
+ "@looply/core": "0.5.25",
36
36
  "pdfjs-dist": "5.6.205",
37
37
  "qrcode-terminal": "^0.12.0",
38
38
  "yaml": "^2.5.1"