looply-cli 0.5.18 → 0.5.19
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/dist/.src-hash +1 -1
- package/dist/branch-delivery-wiring.d.ts.map +1 -1
- package/dist/branch-delivery-wiring.js +5 -1
- package/dist/branch-delivery-wiring.js.map +1 -1
- package/dist/branch-delivery.d.ts +4 -1
- package/dist/branch-delivery.d.ts.map +1 -1
- package/dist/branch-delivery.js +9 -0
- package/dist/branch-delivery.js.map +1 -1
- package/dist/bug-repro.d.ts +234 -0
- package/dist/bug-repro.d.ts.map +1 -0
- package/dist/bug-repro.js +533 -0
- package/dist/bug-repro.js.map +1 -0
- package/dist/pursuit-ending.d.ts.map +1 -1
- package/dist/pursuit-ending.js +3 -1
- package/dist/pursuit-ending.js.map +1 -1
- package/dist/run-cmd.d.ts.map +1 -1
- package/dist/run-cmd.js +72 -5
- package/dist/run-cmd.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,234 @@
|
|
|
1
|
+
import type { ReproductionReport, ReproductionRun } from '@looply/core';
|
|
2
|
+
import type { AgentInvoke } from './agent-exec';
|
|
3
|
+
import type { CommandResult, CommandRunner } from './gate';
|
|
4
|
+
import type { GoalGapOutcome } from './goal-gap';
|
|
5
|
+
/**
|
|
6
|
+
* BUG TICKETS ARE REPRODUCTION-FIRST.
|
|
7
|
+
*
|
|
8
|
+
* Owner's roadmap, 2026-10-16. For a bug, the first thing Looply does is show
|
|
9
|
+
* the bug: an agent writes ONE failing test (or a scripted repro) from the
|
|
10
|
+
* ticket's words and screenshots, and the MACHINE runs it on the base tree. A
|
|
11
|
+
* red run that actually ran that test is the evidence; it is recorded before
|
|
12
|
+
* any plan exists. The fix must then turn the same test green — checked by the
|
|
13
|
+
* machine at the delivered tree, not taken from anybody's word — and the test
|
|
14
|
+
* stays in the suite as the regression guard. The pull request and the ticket
|
|
15
|
+
* say "reproduced: <test>, failed before, passes now".
|
|
16
|
+
*
|
|
17
|
+
* When the bug cannot be shown, Looply asks ONE precise question on the ticket
|
|
18
|
+
* (which page or table, what was clicked, what was seen) before spending any
|
|
19
|
+
* fix attempt. That is a genuine question about the work. It asks at most once:
|
|
20
|
+
* a goal that already carries the person's answer goes on to fix without a
|
|
21
|
+
* reproduction rather than asking again.
|
|
22
|
+
*
|
|
23
|
+
* WHAT IS NEVER A REASON TO ASK. A command that could not run (a missing tool,
|
|
24
|
+
* a sandbox denial, a timeout), an agent that failed, or a repository with no
|
|
25
|
+
* way to run one test: those are the machine's problem, not the reporter's, and
|
|
26
|
+
* the goal goes on without a reproduction.
|
|
27
|
+
*
|
|
28
|
+
* The agent that writes the test has the implementer's tools (read, write), and
|
|
29
|
+
* no shell: it cannot run anything, so it cannot claim a red run. The tree is
|
|
30
|
+
* reset after the red run, so planning and the first round start from the base
|
|
31
|
+
* tree exactly as before; the test's text travels to them in the goal's words.
|
|
32
|
+
*/
|
|
33
|
+
/** The agent call that writes the test. Planning's own bound is ten minutes; this is smaller. */
|
|
34
|
+
export declare const REPRO_AGENT_TIMEOUT_MS: number;
|
|
35
|
+
/** One run of one test. */
|
|
36
|
+
export declare const REPRO_RUN_TIMEOUT_MS: number;
|
|
37
|
+
/** The most of the test's text carried into the plan and every round. */
|
|
38
|
+
export declare const REPRO_BRIEF_MAX_CHARS = 12000;
|
|
39
|
+
/** Where downloaded ticket attachments sit while the test is written. Removed with the reset. */
|
|
40
|
+
export declare const TICKET_FILES_DIR = ".looply-ticket";
|
|
41
|
+
/** The question asked when the bug did not show and the agent did not word a better one. */
|
|
42
|
+
export declare const DEFAULT_REPRO_QUESTION = "I couldn't make this bug happen. Which page or table is it on, what exactly did you click or enter, and what did you see instead of what you expected?";
|
|
43
|
+
/**
|
|
44
|
+
* Whether a goal is a bug. AutoRyn writes `Ticket type: bug`; a goal created
|
|
45
|
+
* before that line existed still names its ticket key, and AutoRyn bug keys are
|
|
46
|
+
* `<PROJECT>-B-<n>`. A person writing a goal by hand can start it with "Bug:".
|
|
47
|
+
*/
|
|
48
|
+
export declare function isBugGoal(text: string): boolean;
|
|
49
|
+
/** The https links the goal lists under its attachments heading (AutoRyn's `Screenshots and attachments:`). */
|
|
50
|
+
export declare function ticketAttachments(text: string): string[];
|
|
51
|
+
/** Whether the goal already carries a person's answer to a question Looply asked on the ticket. */
|
|
52
|
+
export declare function ticketWasAnswered(text: string): boolean;
|
|
53
|
+
export type ReproAnswer = {
|
|
54
|
+
kind: 'test';
|
|
55
|
+
file: string;
|
|
56
|
+
test: string;
|
|
57
|
+
command: string;
|
|
58
|
+
} | {
|
|
59
|
+
kind: 'question';
|
|
60
|
+
question: string;
|
|
61
|
+
} | {
|
|
62
|
+
kind: 'skip';
|
|
63
|
+
because: string;
|
|
64
|
+
};
|
|
65
|
+
export declare function buildReproPrompt(input: {
|
|
66
|
+
projectName: string;
|
|
67
|
+
goalText: string;
|
|
68
|
+
gates: ReadonlyArray<{
|
|
69
|
+
name: string;
|
|
70
|
+
run: string;
|
|
71
|
+
}>;
|
|
72
|
+
/** Repository paths of the ticket's attachments, downloaded for this step. */
|
|
73
|
+
attachments: readonly string[];
|
|
74
|
+
}): string;
|
|
75
|
+
/** The agent's answer, read from the END (the prompt's own examples come first in an echo), or null. */
|
|
76
|
+
export declare function extractReproAnswer(transcript: string): ReproAnswer | null;
|
|
77
|
+
export type RunJudgement = {
|
|
78
|
+
verdict: 'red';
|
|
79
|
+
} | {
|
|
80
|
+
verdict: 'green';
|
|
81
|
+
}
|
|
82
|
+
/** It did not run the test: a timeout, a runner that could not start, or a failure that never mentions it. */
|
|
83
|
+
| {
|
|
84
|
+
verdict: 'not-run';
|
|
85
|
+
because: string;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* What one run of the test says. RED needs more than a non-zero exit: the
|
|
89
|
+
* output must name the test or its file, or the failure could be a missing
|
|
90
|
+
* tool or a syntax error elsewhere — a red that shows nothing about the bug.
|
|
91
|
+
*/
|
|
92
|
+
export declare function judgeRun(result: CommandResult, repro: {
|
|
93
|
+
test: string;
|
|
94
|
+
file: string;
|
|
95
|
+
}): RunJudgement;
|
|
96
|
+
export interface ReproRun extends ReproductionRun {
|
|
97
|
+
/** The end of the run's output, for a person reading the record. */
|
|
98
|
+
tail: string;
|
|
99
|
+
}
|
|
100
|
+
export interface ReproRecord {
|
|
101
|
+
schema: 1;
|
|
102
|
+
goalId: string;
|
|
103
|
+
goalVersion: number;
|
|
104
|
+
at: string;
|
|
105
|
+
/**
|
|
106
|
+
* reproduced — the test ran red on the base tree; the fix must turn it green
|
|
107
|
+
* question — the bug did not show; a person is asked before any fix
|
|
108
|
+
* not-reproduced — the bug did not show, the person already answered once; fixing without one
|
|
109
|
+
* skipped — no reproduction could be attempted (the machine's problem, not the person's)
|
|
110
|
+
*/
|
|
111
|
+
outcome: 'reproduced' | 'question' | 'not-reproduced' | 'skipped';
|
|
112
|
+
because?: string;
|
|
113
|
+
question?: string;
|
|
114
|
+
test?: string;
|
|
115
|
+
file?: string;
|
|
116
|
+
command?: string;
|
|
117
|
+
/** What the agent wrote, as it wrote it — the plan and every round are shown this. */
|
|
118
|
+
files?: Array<{
|
|
119
|
+
path: string;
|
|
120
|
+
content: string;
|
|
121
|
+
}>;
|
|
122
|
+
failedBefore?: ReproRun;
|
|
123
|
+
passesNow?: ReproRun | null;
|
|
124
|
+
/** The last check at a delivered tree that did not come back green. */
|
|
125
|
+
lastCheck?: ReproRun & {
|
|
126
|
+
verdict: 'red' | 'missing' | 'not-run';
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
/** One file per goal version, under the PROJECT's state, so every checkout of the project reads the same one. */
|
|
130
|
+
export declare class ReproStore {
|
|
131
|
+
private readonly stateDir;
|
|
132
|
+
constructor(stateDir: string);
|
|
133
|
+
private dir;
|
|
134
|
+
private path;
|
|
135
|
+
read(goalId: string, goalVersion: number): ReproRecord | null;
|
|
136
|
+
/** The newest version's record for a goal — what its delivery reports. */
|
|
137
|
+
latest(goalId: string): ReproRecord | null;
|
|
138
|
+
write(r: ReproRecord): void;
|
|
139
|
+
}
|
|
140
|
+
export interface ReproDeps {
|
|
141
|
+
/** An agent with write tools and no shell (the implementer's transport). */
|
|
142
|
+
invoke: AgentInvoke;
|
|
143
|
+
/** Runs one command in the checkout, the way the gates run (contained). */
|
|
144
|
+
run: CommandRunner;
|
|
145
|
+
git: {
|
|
146
|
+
changedEntries(): Promise<Array<{
|
|
147
|
+
path: string;
|
|
148
|
+
status: string;
|
|
149
|
+
}>>;
|
|
150
|
+
headSha(): Promise<string>;
|
|
151
|
+
/** Back to HEAD: tracked changes reset, untracked files removed, `.looply` spared. */
|
|
152
|
+
discard(): Promise<void>;
|
|
153
|
+
};
|
|
154
|
+
/** A repository-relative path's text, or null. */
|
|
155
|
+
readFile(path: string): string | null;
|
|
156
|
+
/** Saves one attachment into the checkout; returns its repository path, or null when it could not be fetched. */
|
|
157
|
+
download?(url: string, index: number): Promise<string | null>;
|
|
158
|
+
now(): Date;
|
|
159
|
+
log(line: string): void;
|
|
160
|
+
}
|
|
161
|
+
export interface ReproInput {
|
|
162
|
+
goalId: string;
|
|
163
|
+
goalVersion: number;
|
|
164
|
+
goalText: string;
|
|
165
|
+
projectName: string;
|
|
166
|
+
gates: ReadonlyArray<{
|
|
167
|
+
name: string;
|
|
168
|
+
run: string;
|
|
169
|
+
}>;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Write the test, run it on the base tree, reset the tree. Never throws: every
|
|
173
|
+
* failure is a record, and only a bug that did not show becomes a question.
|
|
174
|
+
* The caller must have a clean tree (it is checked, and a dirty one is skipped,
|
|
175
|
+
* never reset — that work is somebody's).
|
|
176
|
+
*/
|
|
177
|
+
export declare function reproduceBug(input: ReproInput, deps: ReproDeps): Promise<ReproRecord>;
|
|
178
|
+
/** The block a reproduced bug adds to the goal's words, or '' for any other outcome. */
|
|
179
|
+
export declare function reproductionBrief(r: ReproRecord | null): string;
|
|
180
|
+
/** The goal's words with the reproduction attached, for the plan, the goal check and the rounds. */
|
|
181
|
+
export declare function withReproduction(goalText: string, r: ReproRecord | null): string;
|
|
182
|
+
/** The sentence for the ticket and the end of the run when a question is asked. */
|
|
183
|
+
export declare function reproQuestion(r: ReproRecord): string;
|
|
184
|
+
export type GreenCheck = {
|
|
185
|
+
state: 'green';
|
|
186
|
+
run: ReproRun;
|
|
187
|
+
} | {
|
|
188
|
+
state: 'red';
|
|
189
|
+
run: ReproRun;
|
|
190
|
+
}
|
|
191
|
+
/** The test is gone, renamed, or its file is. */
|
|
192
|
+
| {
|
|
193
|
+
state: 'missing';
|
|
194
|
+
because: string;
|
|
195
|
+
} | {
|
|
196
|
+
state: 'not-run';
|
|
197
|
+
because: string;
|
|
198
|
+
run: ReproRun;
|
|
199
|
+
};
|
|
200
|
+
/** Run the recorded test at the current tree. Never throws. */
|
|
201
|
+
export declare function checkReproGreen(r: ReproRecord, deps: Pick<ReproDeps, 'run' | 'readFile' | 'now'> & {
|
|
202
|
+
headSha(): Promise<string>;
|
|
203
|
+
}): Promise<GreenCheck>;
|
|
204
|
+
/**
|
|
205
|
+
* THE GOAL CHECK, WITH THE MACHINE'S OWN QUESTION ADDED: does the reproduction
|
|
206
|
+
* test pass now? Asked only when the evaluator says the goal is met. A test
|
|
207
|
+
* that still fails, or was removed, turns "met" into one named gap, so Looply
|
|
208
|
+
* plans the fix again instead of finishing. A test that could not be run is
|
|
209
|
+
* logged and does not block (the machine's problem, not the work's); the
|
|
210
|
+
* report then says "not yet passing".
|
|
211
|
+
*
|
|
212
|
+
* The run must leave the tree as it found it: the goal check refuses an
|
|
213
|
+
* evaluation that changed the repository, so anything the test run wrote is
|
|
214
|
+
* reset — but only when the tree was clean before it, so an evaluator that
|
|
215
|
+
* changed something is still caught.
|
|
216
|
+
*/
|
|
217
|
+
export declare function evaluateWithReproduction(outcome: GoalGapOutcome, r: ReproRecord | null, deps: Pick<ReproDeps, 'run' | 'readFile' | 'now' | 'log'> & {
|
|
218
|
+
headSha(): Promise<string>;
|
|
219
|
+
changedPaths(): Promise<readonly string[]>;
|
|
220
|
+
discard(): Promise<void>;
|
|
221
|
+
store: Pick<ReproStore, 'write'>;
|
|
222
|
+
}): Promise<GoalGapOutcome>;
|
|
223
|
+
/** The report the pull request, the server and AutoRyn carry, or null when nothing was reproduced. */
|
|
224
|
+
export declare function reproductionReport(r: ReproRecord | null): ReproductionReport | null;
|
|
225
|
+
/** A repository-relative reader rooted at the checkout. */
|
|
226
|
+
export declare function checkoutReader(cwd: string): (path: string) => string | null;
|
|
227
|
+
/**
|
|
228
|
+
* Fetch one ticket attachment into `<checkout>/.looply-ticket/`. https only,
|
|
229
|
+
* images, PDFs and text only, at most 5 MB, 20 seconds. A link that needs a
|
|
230
|
+
* sign-in or answers anything else is simply not saved; its address is still
|
|
231
|
+
* in the goal's words.
|
|
232
|
+
*/
|
|
233
|
+
export declare function nodeAttachmentDownloader(cwd: string, fetchFn?: typeof fetch): (url: string, index: number) => Promise<string | null>;
|
|
234
|
+
//# sourceMappingURL=bug-repro.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bug-repro.d.ts","sourceRoot":"","sources":["../src/bug-repro.ts"],"names":[],"mappings":"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"}
|