@phamvuhoang/otto-core 0.2.0 → 0.4.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/dist/cli-help.d.ts +16 -3
- package/dist/cli-help.d.ts.map +1 -1
- package/dist/cli-help.js +14 -4
- package/dist/cli-help.js.map +1 -1
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/linear-api.d.ts +161 -0
- package/dist/linear-api.d.ts.map +1 -0
- package/dist/linear-api.js +288 -0
- package/dist/linear-api.js.map +1 -0
- package/dist/linear-auth.d.ts +42 -0
- package/dist/linear-auth.d.ts.map +1 -0
- package/dist/linear-auth.js +115 -0
- package/dist/linear-auth.js.map +1 -0
- package/dist/linear-cli.d.ts +37 -0
- package/dist/linear-cli.d.ts.map +1 -0
- package/dist/linear-cli.js +176 -0
- package/dist/linear-cli.js.map +1 -0
- package/dist/linear-main.d.ts +5 -0
- package/dist/linear-main.d.ts.map +1 -0
- package/dist/linear-main.js +27 -0
- package/dist/linear-main.js.map +1 -0
- package/dist/loop.d.ts +2 -0
- package/dist/loop.d.ts.map +1 -1
- package/dist/loop.js +79 -5
- package/dist/loop.js.map +1 -1
- package/dist/preflight.d.ts +3 -0
- package/dist/preflight.d.ts.map +1 -1
- package/dist/preflight.js +13 -1
- package/dist/preflight.js.map +1 -1
- package/dist/run-bin.d.ts +21 -1
- package/dist/run-bin.d.ts.map +1 -1
- package/dist/run-bin.js +12 -6
- package/dist/run-bin.js.map +1 -1
- package/dist/stages.d.ts +10 -0
- package/dist/stages.d.ts.map +1 -1
- package/dist/stages.js +10 -0
- package/dist/stages.js.map +1 -1
- package/dist/watch.d.ts +53 -4
- package/dist/watch.d.ts.map +1 -1
- package/dist/watch.js +76 -11
- package/dist/watch.js.map +1 -1
- package/package.json +1 -1
- package/templates/ghprompt-workflow.md +6 -3
- package/templates/linear-completion.md +17 -0
- package/templates/linearafk-issue.md +31 -0
- package/templates/linearafk.md +29 -0
- package/templates/linearprompt.md +39 -0
- package/templates/prompt.md +4 -0
package/dist/preflight.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type LinearAuth } from "./linear-api.js";
|
|
1
2
|
/** One prerequisite check rendered by `--print-config`. */
|
|
2
3
|
export type PreflightResult = {
|
|
3
4
|
label: string;
|
|
@@ -15,6 +16,8 @@ export type PreflightProbes = {
|
|
|
15
16
|
pathExists: (p: string) => boolean;
|
|
16
17
|
/** Home directory holding credential files. */
|
|
17
18
|
home: string;
|
|
19
|
+
/** Resolve the stored/env Linear credential (for otto-linear-afk), or null. */
|
|
20
|
+
linearAuth: () => LinearAuth | null;
|
|
18
21
|
};
|
|
19
22
|
/**
|
|
20
23
|
* Minimal `which`: walk PATH (honouring PATHEXT on Windows, like render.ts's
|
package/dist/preflight.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAIA,2DAA2D;AAC3D,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,0EAA0E;IAC1E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC5C,oCAAoC;IACpC,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"preflight.d.ts","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAErE,2DAA2D;AAC3D,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7E;;;GAGG;AACH,MAAM,MAAM,eAAe,GAAG;IAC5B,0EAA0E;IAC1E,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC5C,oCAAoC;IACpC,UAAU,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IACnC,+CAA+C;IAC/C,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,UAAU,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC;CACrC,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,IAAI,CAaf;AASD;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,IAAI,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,EAC3C,MAAM,GAAE,eAA+B,GACtC,eAAe,EAAE,CAqDnB"}
|
package/dist/preflight.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { existsSync } from "node:fs";
|
|
2
2
|
import { homedir } from "node:os";
|
|
3
3
|
import { delimiter, join } from "node:path";
|
|
4
|
+
import { resolveLinearAuth } from "./linear-api.js";
|
|
4
5
|
/**
|
|
5
6
|
* Minimal `which`: walk PATH (honouring PATHEXT on Windows, like render.ts's
|
|
6
7
|
* shell resolution) and return the first matching executable, or null.
|
|
@@ -24,6 +25,7 @@ const defaultProbes = {
|
|
|
24
25
|
resolveBin: (name) => whichBin(name),
|
|
25
26
|
pathExists: existsSync,
|
|
26
27
|
home: homedir(),
|
|
28
|
+
linearAuth: () => resolveLinearAuth(),
|
|
27
29
|
};
|
|
28
30
|
/**
|
|
29
31
|
* Diagnose the prerequisites a run needs before any paid `claude` invocation:
|
|
@@ -31,7 +33,7 @@ const defaultProbes = {
|
|
|
31
33
|
* otto-ghafk — the `gh` CLI and its credentials. Reports only; never throws.
|
|
32
34
|
*/
|
|
33
35
|
export function runPreflight(opts, probes = defaultProbes) {
|
|
34
|
-
const { resolveBin, pathExists, home } = probes;
|
|
36
|
+
const { resolveBin, pathExists, home, linearAuth } = probes;
|
|
35
37
|
const results = [];
|
|
36
38
|
const claude = resolveBin("claude");
|
|
37
39
|
results.push({
|
|
@@ -65,6 +67,16 @@ export function runPreflight(opts, probes = defaultProbes) {
|
|
|
65
67
|
detail: ghAuth ? "credentials found" : "run `gh auth login`",
|
|
66
68
|
});
|
|
67
69
|
}
|
|
70
|
+
if (opts.bin === "otto-linear-afk") {
|
|
71
|
+
const auth = linearAuth();
|
|
72
|
+
results.push({
|
|
73
|
+
label: "linear auth",
|
|
74
|
+
ok: auth != null,
|
|
75
|
+
detail: auth
|
|
76
|
+
? `credentials found (${auth.source})`
|
|
77
|
+
: "run `otto-linear-auth login`",
|
|
78
|
+
});
|
|
79
|
+
}
|
|
68
80
|
return results;
|
|
69
81
|
}
|
|
70
82
|
//# sourceMappingURL=preflight.js.map
|
package/dist/preflight.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"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"}
|
package/dist/run-bin.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Stage } from "./stages.js";
|
|
2
|
+
import type { PollResult, WatchProvider } from "./watch.js";
|
|
2
3
|
export type RunBinConfig = {
|
|
3
4
|
/** Bin name for usage/version/config output (e.g. "otto-afk"). */
|
|
4
5
|
bin: string;
|
|
@@ -15,8 +16,21 @@ export type RunBinConfig = {
|
|
|
15
16
|
*/
|
|
16
17
|
takesInputArg: boolean;
|
|
17
18
|
cliVersion?: string;
|
|
18
|
-
/** Whether this bin supports --watch.
|
|
19
|
+
/** Whether this bin supports --watch. otto-ghafk + otto-linear-afk set this. */
|
|
19
20
|
supportsWatch?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Provider-specific watch poller. Omitted → runWatch's default gh poller
|
|
23
|
+
* (otto-ghafk); otto-linear-afk passes a Linear poller. May be async.
|
|
24
|
+
*/
|
|
25
|
+
watchPoll?: (label: string, cwd: string) => PollResult | Promise<PollResult>;
|
|
26
|
+
/** Provider-specific watch poll/auth messaging; omitted → gh. */
|
|
27
|
+
watchProvider?: WatchProvider;
|
|
28
|
+
/**
|
|
29
|
+
* Resolve the label that gates a --watch run. Omitted → `OTTO_WATCH_LABEL`
|
|
30
|
+
* (otto-ghafk). otto-linear-afk resolves `OTTO_LINEAR_LABEL` so watch polls
|
|
31
|
+
* the same labelled set its implementer selects.
|
|
32
|
+
*/
|
|
33
|
+
resolveWatchLabel?: () => string;
|
|
20
34
|
/** Alternate gate stage used when --issue is set. Only otto-ghafk sets this. */
|
|
21
35
|
issueStage?: Stage;
|
|
22
36
|
/** Single read-only gate stage used when --verify is set. Only otto-afk sets this. */
|
|
@@ -25,6 +39,12 @@ export type RunBinConfig = {
|
|
|
25
39
|
applyReviewStage?: Stage;
|
|
26
40
|
/** Run mode identifier threaded into runLoop state (e.g. "afk" / "ghafk"). */
|
|
27
41
|
mode: string;
|
|
42
|
+
/**
|
|
43
|
+
* How to validate/normalize a `--issue` value. Defaults to the GitHub number
|
|
44
|
+
* ref; otto-linear-afk injects a Linear parser. The result must be shell-safe
|
|
45
|
+
* (it becomes OTTO_ISSUE, read by the issue template's static command).
|
|
46
|
+
*/
|
|
47
|
+
parseIssue?: (raw: string) => number | string;
|
|
28
48
|
};
|
|
29
49
|
/**
|
|
30
50
|
* Shared entry for the AFK bins: parse flags, handle --version/--help/--print-config,
|
package/dist/run-bin.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-bin.d.ts","sourceRoot":"","sources":["../src/run-bin.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"run-bin.d.ts","sourceRoot":"","sources":["../src/run-bin.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,MAAM,YAAY,GAAG;IACzB,kEAAkE;IAClE,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAC;IACd,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,4CAA4C;IAC5C,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC5B;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,gFAAgF;IAChF,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7E,iEAAiE;IACjE,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAC;IACjC,gFAAgF;IAChF,UAAU,CAAC,EAAE,KAAK,CAAC;IACnB,sFAAsF;IACtF,WAAW,CAAC,EAAE,KAAK,CAAC;IACpB,2EAA2E;IAC3E,gBAAgB,CAAC,EAAE,KAAK,CAAC;IACzB,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAC;CAC/C,CAAC;AAyBF;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgP7E"}
|
package/dist/run-bin.js
CHANGED
|
@@ -34,7 +34,7 @@ function ensureStateGitignored(workspaceDir) {
|
|
|
34
34
|
* optionally fork into the background (--detach), then drive runLoop.
|
|
35
35
|
*/
|
|
36
36
|
export async function runBin(argv, cfg) {
|
|
37
|
-
const flags = parseFlags(argv);
|
|
37
|
+
const flags = parseFlags(argv, { parseIssue: cfg.parseIssue });
|
|
38
38
|
if (flags.version) {
|
|
39
39
|
printVersion(cfg.bin, cfg.cliVersion);
|
|
40
40
|
return;
|
|
@@ -102,7 +102,7 @@ export async function runBin(argv, cfg) {
|
|
|
102
102
|
return;
|
|
103
103
|
}
|
|
104
104
|
if (flags.issue != null && !cfg.issueStage) {
|
|
105
|
-
console.error("--issue is only supported by otto-ghafk");
|
|
105
|
+
console.error("--issue is only supported by otto-ghafk and otto-linear-afk");
|
|
106
106
|
process.exit(1);
|
|
107
107
|
}
|
|
108
108
|
const modeCount = (flags.issue != null ? 1 : 0) +
|
|
@@ -158,8 +158,10 @@ export async function runBin(argv, cfg) {
|
|
|
158
158
|
console.error("--issue cannot be combined with --watch");
|
|
159
159
|
process.exit(1);
|
|
160
160
|
}
|
|
161
|
-
// Validated positive integer
|
|
162
|
-
//
|
|
161
|
+
// Validated by cfg.parseIssue (GitHub positive integer / Linear ref) — both
|
|
162
|
+
// admit only shell-safe chars, so it is safe for the static
|
|
163
|
+
// `gh issue view "$OTTO_ISSUE"` / `otto-linear view "$OTTO_ISSUE"` commands
|
|
164
|
+
// in the issue templates. See render.ts.
|
|
163
165
|
process.env.OTTO_ISSUE = String(flags.issue);
|
|
164
166
|
}
|
|
165
167
|
const stages = flags.verify
|
|
@@ -198,7 +200,7 @@ export async function runBin(argv, cfg) {
|
|
|
198
200
|
ensureStateGitignored(effectiveWorkspaceDir);
|
|
199
201
|
if (flags.watch) {
|
|
200
202
|
if (!cfg.supportsWatch) {
|
|
201
|
-
console.error("--watch is only supported by otto-ghafk");
|
|
203
|
+
console.error("--watch is only supported by otto-ghafk and otto-linear-afk");
|
|
202
204
|
process.exit(1);
|
|
203
205
|
}
|
|
204
206
|
const { runWatch } = await import("./watch.js");
|
|
@@ -208,7 +210,9 @@ export async function runBin(argv, cfg) {
|
|
|
208
210
|
workspaceDir: effectiveWorkspaceDir,
|
|
209
211
|
packageDir,
|
|
210
212
|
watchIntervalSec: flags.watchIntervalSec ?? 300,
|
|
211
|
-
watchLabel:
|
|
213
|
+
watchLabel: cfg.resolveWatchLabel?.() ||
|
|
214
|
+
process.env.OTTO_WATCH_LABEL?.trim() ||
|
|
215
|
+
"otto",
|
|
212
216
|
budgetUsd: flags.budget,
|
|
213
217
|
cooldownMs: flags.cooldownMs,
|
|
214
218
|
maxRetries: flags.maxRetries,
|
|
@@ -216,6 +220,8 @@ export async function runBin(argv, cfg) {
|
|
|
216
220
|
notify: flags.notify,
|
|
217
221
|
bin: cfg.bin,
|
|
218
222
|
cliVersion: cfg.cliVersion,
|
|
223
|
+
pollIssues: cfg.watchPoll,
|
|
224
|
+
provider: cfg.watchProvider,
|
|
219
225
|
});
|
|
220
226
|
return;
|
|
221
227
|
}
|
package/dist/run-bin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-bin.js","sourceRoot":"","sources":["../src/run-bin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,UAAU,EACV,eAAe,EACf,WAAW,EACX,SAAS,EACT,YAAY,GACb,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"run-bin.js","sourceRoot":"","sources":["../src/run-bin.ts"],"names":[],"mappings":"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"}
|
package/dist/stages.d.ts
CHANGED
|
@@ -19,6 +19,16 @@ export declare const STAGES: {
|
|
|
19
19
|
template: string;
|
|
20
20
|
permissionMode: string;
|
|
21
21
|
};
|
|
22
|
+
linearImplementer: {
|
|
23
|
+
name: string;
|
|
24
|
+
template: string;
|
|
25
|
+
permissionMode: string;
|
|
26
|
+
};
|
|
27
|
+
linearIssueImplementer: {
|
|
28
|
+
name: string;
|
|
29
|
+
template: string;
|
|
30
|
+
permissionMode: string;
|
|
31
|
+
};
|
|
22
32
|
verifier: {
|
|
23
33
|
name: string;
|
|
24
34
|
template: string;
|
package/dist/stages.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stages.d.ts","sourceRoot":"","sources":["../src/stages.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAOF,eAAO,MAAM,MAAM
|
|
1
|
+
{"version":3,"file":"stages.d.ts","sourceRoot":"","sources":["../src/stages.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,KAAK,GAAG;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,CAAC;AAOF,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyClB,CAAC"}
|
package/dist/stages.js
CHANGED
|
@@ -19,6 +19,16 @@ export const STAGES = {
|
|
|
19
19
|
template: "ghafk-issue.md",
|
|
20
20
|
permissionMode: "bypassPermissions",
|
|
21
21
|
},
|
|
22
|
+
linearImplementer: {
|
|
23
|
+
name: "linear-implementer",
|
|
24
|
+
template: "linearafk.md",
|
|
25
|
+
permissionMode: "bypassPermissions",
|
|
26
|
+
},
|
|
27
|
+
linearIssueImplementer: {
|
|
28
|
+
name: "linear-issue-implementer",
|
|
29
|
+
template: "linearafk-issue.md",
|
|
30
|
+
permissionMode: "bypassPermissions",
|
|
31
|
+
},
|
|
22
32
|
verifier: {
|
|
23
33
|
name: "verifier",
|
|
24
34
|
template: "verify.md",
|
package/dist/stages.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"stages.js","sourceRoot":"","sources":["../src/stages.ts"],"names":[],"mappings":"AAMA,gFAAgF;AAChF,8EAA8E;AAC9E,iFAAiF;AACjF,kFAAkF;AAClF,gFAAgF;AAChF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,mBAAmB;KACpB;IACjB,gBAAgB,EAAE;QAChB,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,mBAAmB;KACpB;IACjB,qBAAqB,EAAE;QACrB,IAAI,EAAE,yBAAyB;QAC/B,QAAQ,EAAE,gBAAgB;QAC1B,cAAc,EAAE,mBAAmB;KACpB;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,WAAW;QACrB,cAAc,EAAE,mBAAmB;KACpB;IACjB,sBAAsB,EAAE;QACtB,IAAI,EAAE,0BAA0B;QAChC,QAAQ,EAAE,iBAAiB;QAC3B,cAAc,EAAE,mBAAmB;KACpB;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,WAAW;QACrB,cAAc,EAAE,mBAAmB;KACpB;CAClB,CAAC"}
|
|
1
|
+
{"version":3,"file":"stages.js","sourceRoot":"","sources":["../src/stages.ts"],"names":[],"mappings":"AAMA,gFAAgF;AAChF,8EAA8E;AAC9E,iFAAiF;AACjF,kFAAkF;AAClF,gFAAgF;AAChF,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,WAAW,EAAE;QACX,IAAI,EAAE,aAAa;QACnB,QAAQ,EAAE,QAAQ;QAClB,cAAc,EAAE,mBAAmB;KACpB;IACjB,gBAAgB,EAAE;QAChB,IAAI,EAAE,mBAAmB;QACzB,QAAQ,EAAE,UAAU;QACpB,cAAc,EAAE,mBAAmB;KACpB;IACjB,qBAAqB,EAAE;QACrB,IAAI,EAAE,yBAAyB;QAC/B,QAAQ,EAAE,gBAAgB;QAC1B,cAAc,EAAE,mBAAmB;KACpB;IACjB,iBAAiB,EAAE;QACjB,IAAI,EAAE,oBAAoB;QAC1B,QAAQ,EAAE,cAAc;QACxB,cAAc,EAAE,mBAAmB;KACpB;IACjB,sBAAsB,EAAE;QACtB,IAAI,EAAE,0BAA0B;QAChC,QAAQ,EAAE,oBAAoB;QAC9B,cAAc,EAAE,mBAAmB;KACpB;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,WAAW;QACrB,cAAc,EAAE,mBAAmB;KACpB;IACjB,sBAAsB,EAAE;QACtB,IAAI,EAAE,0BAA0B;QAChC,QAAQ,EAAE,iBAAiB;QAC3B,cAAc,EAAE,mBAAmB;KACpB;IACjB,QAAQ,EAAE;QACR,IAAI,EAAE,UAAU;QAChB,QAAQ,EAAE,WAAW;QACrB,cAAc,EAAE,mBAAmB;KACpB;CAClB,CAAC"}
|
package/dist/watch.d.ts
CHANGED
|
@@ -1,6 +1,50 @@
|
|
|
1
|
+
import { type LinearAuth, type LinearClient } from "./linear-api.js";
|
|
1
2
|
import type { Stage } from "./stages.js";
|
|
2
|
-
/**
|
|
3
|
-
|
|
3
|
+
/**
|
|
4
|
+
* Outcome of one issue poll. Distinguishes a real idle queue (`ok` with
|
|
5
|
+
* `count: 0`) from a broken poll (`!ok`) so the daemon can say *why* it is not
|
|
6
|
+
* working — an empty queue and a failed/unauthenticated `gh` are very different
|
|
7
|
+
* states for a maintainer reading the log.
|
|
8
|
+
*/
|
|
9
|
+
export type PollResult = {
|
|
10
|
+
ok: true;
|
|
11
|
+
count: number;
|
|
12
|
+
} | {
|
|
13
|
+
ok: false;
|
|
14
|
+
auth: boolean;
|
|
15
|
+
detail: string;
|
|
16
|
+
};
|
|
17
|
+
/** Poll open issues carrying `label`, via gh. Never throws. */
|
|
18
|
+
export declare function pollOpenIssues(label: string, cwd: string): PollResult;
|
|
19
|
+
/**
|
|
20
|
+
* Injectable deps for {@link pollLinearIssues}, so poll classification is
|
|
21
|
+
* unit-testable without a real credential file or network. Auth is re-resolved
|
|
22
|
+
* each poll (default `resolveLinearAuth`) so a mid-watch re-login is picked up.
|
|
23
|
+
*/
|
|
24
|
+
export type LinearPollDeps = {
|
|
25
|
+
label: string;
|
|
26
|
+
team?: string;
|
|
27
|
+
limit?: number;
|
|
28
|
+
/** Resolve the Linear credential; defaults to env/file precedence. */
|
|
29
|
+
resolveAuth?: () => LinearAuth | null;
|
|
30
|
+
/** Build a client from a token; defaults to the real GraphQL client. */
|
|
31
|
+
makeClient?: (token: string) => Pick<LinearClient, "listIssues">;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* Poll open Linear issues carrying `label` (count only, no comments). Never
|
|
35
|
+
* throws — mirrors {@link pollOpenIssues}. A missing credential or a Linear
|
|
36
|
+
* `auth`-kind error is reported as `auth: true` so the daemon can print a
|
|
37
|
+
* re-login hint distinctly from a transient request/network failure.
|
|
38
|
+
*/
|
|
39
|
+
export declare function pollLinearIssues(deps: LinearPollDeps): Promise<PollResult>;
|
|
40
|
+
/**
|
|
41
|
+
* Provider-specific bits of the watch UX: the noun used in poll lines and the
|
|
42
|
+
* command that re-authenticates. Defaults to GitHub's `gh`.
|
|
43
|
+
*/
|
|
44
|
+
export type WatchProvider = {
|
|
45
|
+
name: string;
|
|
46
|
+
authCmd: string;
|
|
47
|
+
};
|
|
4
48
|
export type RunWatchOptions = {
|
|
5
49
|
stages: [Stage, ...Stage[]];
|
|
6
50
|
iterations: number;
|
|
@@ -15,8 +59,13 @@ export type RunWatchOptions = {
|
|
|
15
59
|
notify?: boolean;
|
|
16
60
|
bin?: string;
|
|
17
61
|
cliVersion?: string;
|
|
18
|
-
/**
|
|
19
|
-
|
|
62
|
+
/**
|
|
63
|
+
* Poller for open labelled issues. Defaults to the gh poller; otto-linear-afk
|
|
64
|
+
* passes a Linear poller. May be async. Injectable for tests too.
|
|
65
|
+
*/
|
|
66
|
+
pollIssues?: (label: string, cwd: string) => PollResult | Promise<PollResult>;
|
|
67
|
+
/** Provider-specific poll/auth messaging; defaults to gh. */
|
|
68
|
+
provider?: WatchProvider;
|
|
20
69
|
};
|
|
21
70
|
export declare function runWatch(opts: RunWatchOptions): Promise<void>;
|
|
22
71
|
//# sourceMappingURL=watch.d.ts.map
|
package/dist/watch.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"watch.d.ts","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAEA,OAAO,EAIL,KAAK,UAAU,EACf,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAazB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,MAAM,UAAU,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC3B;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEjD,+DAA+D;AAC/D,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,UAAU,CAqCrE;AAED;;;;GAIG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,sEAAsE;IACtE,WAAW,CAAC,EAAE,MAAM,UAAU,GAAG,IAAI,CAAC;IACtC,wEAAwE;IACxE,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;CAClE,CAAC;AAEF;;;;;GAKG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,cAAc,GAAG,OAAO,CAAC,UAAU,CAAC,CAwBhF;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAI9D,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9E,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,aAAa,CAAC;CAC1B,CAAC;AAEF,wBAAsB,QAAQ,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CA6GnE"}
|
package/dist/watch.js
CHANGED
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
2
|
import { acquire } from "./keepalive.js";
|
|
3
|
+
import { createLinearClient, resolveLinearAuth, LinearApiError, } from "./linear-api.js";
|
|
3
4
|
import { runLoop } from "./loop.js";
|
|
4
5
|
import { notifyComplete, notifyError } from "./notify.js";
|
|
5
6
|
import { sleep } from "./pacing.js";
|
|
6
7
|
import { bold, dim, greenOut, boldOut, dimOut, SYM_OUT, USE_COLOR, } from "./stream-render.js";
|
|
7
|
-
/**
|
|
8
|
-
export function
|
|
8
|
+
/** Poll open issues carrying `label`, via gh. Never throws. */
|
|
9
|
+
export function pollOpenIssues(label, cwd) {
|
|
9
10
|
try {
|
|
10
11
|
// execFileSync (no shell) so `label` is passed as a literal argv entry — a
|
|
11
12
|
// value like `$(rm -rf ~)` can never be shell-evaluated. See SECURITY.md.
|
|
13
|
+
// stderr is piped (not ignored) so a failure's message can be classified.
|
|
12
14
|
const out = execFileSync("gh", [
|
|
13
15
|
"issue",
|
|
14
16
|
"list",
|
|
@@ -18,17 +20,58 @@ export function openIssueCount(label, cwd) {
|
|
|
18
20
|
label,
|
|
19
21
|
"--json",
|
|
20
22
|
"number",
|
|
21
|
-
], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "
|
|
23
|
+
], { cwd, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] });
|
|
22
24
|
const arr = JSON.parse(out);
|
|
23
|
-
return Array.isArray(arr) ? arr.length : 0;
|
|
25
|
+
return { ok: true, count: Array.isArray(arr) ? arr.length : 0 };
|
|
24
26
|
}
|
|
25
|
-
catch {
|
|
26
|
-
|
|
27
|
-
|
|
27
|
+
catch (err) {
|
|
28
|
+
const stderr = String(err?.stderr ?? err?.message ?? "");
|
|
29
|
+
// `gh` prints an auth hint ("gh auth login" / "not logged" / 401) when the
|
|
30
|
+
// user is unauthenticated — treat those as auth failures, everything else
|
|
31
|
+
// (network, gh missing, malformed output) as a generic poll failure.
|
|
32
|
+
const auth = /auth login|not logged|unauthenticated|credential|\b401\b/i.test(stderr);
|
|
33
|
+
const detail = stderr
|
|
34
|
+
.split("\n")
|
|
35
|
+
.map((l) => l.trim())
|
|
36
|
+
.find(Boolean) ?? "";
|
|
37
|
+
return { ok: false, auth, detail };
|
|
28
38
|
}
|
|
29
39
|
}
|
|
40
|
+
/**
|
|
41
|
+
* Poll open Linear issues carrying `label` (count only, no comments). Never
|
|
42
|
+
* throws — mirrors {@link pollOpenIssues}. A missing credential or a Linear
|
|
43
|
+
* `auth`-kind error is reported as `auth: true` so the daemon can print a
|
|
44
|
+
* re-login hint distinctly from a transient request/network failure.
|
|
45
|
+
*/
|
|
46
|
+
export async function pollLinearIssues(deps) {
|
|
47
|
+
const auth = (deps.resolveAuth ?? (() => resolveLinearAuth()))();
|
|
48
|
+
if (!auth) {
|
|
49
|
+
return {
|
|
50
|
+
ok: false,
|
|
51
|
+
auth: true,
|
|
52
|
+
detail: "no Linear API key — run 'otto-linear-auth login'",
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
try {
|
|
56
|
+
const client = (deps.makeClient ??
|
|
57
|
+
((t) => createLinearClient({ token: t })))(auth.token);
|
|
58
|
+
const issues = await client.listIssues({
|
|
59
|
+
label: deps.label,
|
|
60
|
+
team: deps.team,
|
|
61
|
+
limit: deps.limit ?? 50,
|
|
62
|
+
});
|
|
63
|
+
return { ok: true, count: issues.length };
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
if (err instanceof LinearApiError) {
|
|
67
|
+
return { ok: false, auth: err.kind === "auth", detail: err.message };
|
|
68
|
+
}
|
|
69
|
+
return { ok: false, auth: false, detail: err.message };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
const GH_PROVIDER = { name: "gh", authCmd: "gh auth login" };
|
|
30
73
|
export async function runWatch(opts) {
|
|
31
|
-
const { stages, iterations, workspaceDir, packageDir, watchIntervalSec, watchLabel, budgetUsd, cooldownMs, maxRetries, reviewLenses, notify = false, bin = "otto-ghafk",
|
|
74
|
+
const { stages, iterations, workspaceDir, packageDir, watchIntervalSec, watchLabel, budgetUsd, cooldownMs, maxRetries, reviewLenses, notify = false, bin = "otto-ghafk", pollIssues = pollOpenIssues, provider = GH_PROVIDER, } = opts;
|
|
32
75
|
const releaser = acquire({ reason: `${bin} watch` });
|
|
33
76
|
let released = false;
|
|
34
77
|
const releaseOnce = () => {
|
|
@@ -51,6 +94,11 @@ export async function runWatch(opts) {
|
|
|
51
94
|
process.on("SIGTERM", onSigterm);
|
|
52
95
|
process.stderr.write(`${USE_COLOR ? dim("watching") + " " + bold(`label:${watchLabel} every ${watchIntervalSec}s`) : `watching label:${watchLabel} every ${watchIntervalSec}s`}\n`);
|
|
53
96
|
let cumulativeCost = 0;
|
|
97
|
+
// Track idle state so the "no open issues" line prints only on the
|
|
98
|
+
// idle→busy→idle transition, not on every empty poll — otherwise an
|
|
99
|
+
// overnight watch floods the detached log with ~1 identical line per poll
|
|
100
|
+
// and buries the auth/poll-failure signal this is built to surface.
|
|
101
|
+
let wasIdle = false;
|
|
54
102
|
try {
|
|
55
103
|
for (;;) {
|
|
56
104
|
if (budgetUsd != null && cumulativeCost >= budgetUsd) {
|
|
@@ -59,9 +107,20 @@ export async function runWatch(opts) {
|
|
|
59
107
|
notifyComplete(0, false);
|
|
60
108
|
return;
|
|
61
109
|
}
|
|
62
|
-
const
|
|
63
|
-
if (
|
|
64
|
-
|
|
110
|
+
const poll = await pollIssues(watchLabel, workspaceDir);
|
|
111
|
+
if (!poll.ok) {
|
|
112
|
+
// Broken poll — say *why*, distinctly from an idle queue, and keep
|
|
113
|
+
// polling (auth may get fixed / a transient failure may clear).
|
|
114
|
+
wasIdle = false;
|
|
115
|
+
const suffix = poll.detail ? ` — ${poll.detail}` : "";
|
|
116
|
+
const why = poll.auth
|
|
117
|
+
? `${provider.name} not authenticated — run '${provider.authCmd}' (label ${watchLabel})${suffix}`
|
|
118
|
+
: `${provider.name} issue poll failed (label ${watchLabel})${suffix}`;
|
|
119
|
+
process.stderr.write(`${dim(why)}\n`);
|
|
120
|
+
}
|
|
121
|
+
else if (poll.count > 0) {
|
|
122
|
+
wasIdle = false;
|
|
123
|
+
process.stderr.write(`${dim(`${poll.count} open issue(s) labelled ${watchLabel} — running loop`)}\n`);
|
|
65
124
|
const remaining = budgetUsd != null ? budgetUsd - cumulativeCost : undefined;
|
|
66
125
|
const outcome = await runLoop({
|
|
67
126
|
stages,
|
|
@@ -81,6 +140,12 @@ export async function runWatch(opts) {
|
|
|
81
140
|
cumulativeCost += outcome.costUsd;
|
|
82
141
|
process.stderr.write(`${dim(`watch run done — cumulative $${cumulativeCost.toFixed(2)}`)}\n`);
|
|
83
142
|
}
|
|
143
|
+
else if (!wasIdle) {
|
|
144
|
+
// First empty poll after activity — announce idle once, then stay quiet
|
|
145
|
+
// until the queue becomes non-empty (or a poll fails) and idles again.
|
|
146
|
+
wasIdle = true;
|
|
147
|
+
process.stderr.write(`${dim(`no open issues labelled ${watchLabel} — idle, next poll in ${watchIntervalSec}s`)}\n`);
|
|
148
|
+
}
|
|
84
149
|
await sleep(watchIntervalSec * 1000, daemonAbort.signal);
|
|
85
150
|
}
|
|
86
151
|
}
|
package/dist/watch.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,OAAO,EAAiB,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACpC,OAAO,EACL,IAAI,EACJ,GAAG,EACH,QAAQ,EACR,OAAO,EACP,MAAM,EACN,OAAO,EACP,SAAS,GACV,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"watch.js","sourceRoot":"","sources":["../src/watch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -50,11 +50,14 @@ Make a single `git commit -am` with a short message:
|
|
|
50
50
|
- Optional body (≤3 bullets): key decision, blocker for next iteration
|
|
51
51
|
- No file lists (git tracks them), no `Co-Authored-By`
|
|
52
52
|
|
|
53
|
-
# THE
|
|
53
|
+
# FINISHING THE RUN
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
Committing the code is NOT necessarily the end of the run. How work "ships" depends on THIS repo's conventions — consult `<learnings>` / `./.otto/LEARNINGS.md`:
|
|
56
56
|
|
|
57
|
-
If the task is not complete, leave a comment on the
|
|
57
|
+
- **If the repo ships via pull request:** keep ALL work for this issue on the SAME feature branch — later review-fix rounds commit onto it too; never spin up a second branch per round. When the work is complete, `git push` that branch and open (or refresh) a single PR into the default branch. Do NOT close the issue yourself — it closes when the PR merges. If the task is not complete, leave a comment on the issue with what was done.
|
|
58
|
+
- **Otherwise (the repo's convention is commit-to-branch, no PR):** if complete, close the original GitHub issue; if not, leave a comment with what was done.
|
|
59
|
+
|
|
60
|
+
When unsure which applies, prefer leaving the issue OPEN and surfacing the branch — never close an issue whose work has not landed on the default branch.
|
|
58
61
|
|
|
59
62
|
# LEARNINGS
|
|
60
63
|
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# COMPLETION (Linear)
|
|
2
|
+
|
|
3
|
+
Apply the FINISHING guidance above using the bundled `otto-linear` helper for
|
|
4
|
+
every Linear write — never raw GraphQL, and never `gh`:
|
|
5
|
+
|
|
6
|
+
- **Comment** with branch/PR status or what was done: write the body to a file,
|
|
7
|
+
then `otto-linear comment <ref> --body-file <path>`.
|
|
8
|
+
- **PR-based repo (this repo's convention):** comment branch/PR info on the
|
|
9
|
+
Linear issue and leave it OPEN — a human moves it to done when the PR merges.
|
|
10
|
+
Do NOT move the issue yourself.
|
|
11
|
+
- **Commit-to-branch repo (no PR):** once the work has landed, move the issue to
|
|
12
|
+
a completed state with `otto-linear done <ref>`. It resolves the target via
|
|
13
|
+
`OTTO_LINEAR_DONE_STATE` (by name), else the team's first `completed`-type
|
|
14
|
+
state. If it cannot resolve one and exits non-zero, comment instead and leave
|
|
15
|
+
the issue for a human to move.
|
|
16
|
+
|
|
17
|
+
When unsure which convention applies, comment and leave the issue OPEN.
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
<commits>
|
|
2
|
+
|
|
3
|
+
!?`git log -n 5 --format="%H%n%ad%n%B---" --date=short|||No commits found`
|
|
4
|
+
|
|
5
|
+
</commits>
|
|
6
|
+
|
|
7
|
+
<learnings>
|
|
8
|
+
|
|
9
|
+
!?`cat ./.otto/LEARNINGS.md|||_No learnings recorded yet._`
|
|
10
|
+
|
|
11
|
+
</learnings>
|
|
12
|
+
|
|
13
|
+
<issue>
|
|
14
|
+
|
|
15
|
+
Working on Linear issue {{ INPUTS }}.
|
|
16
|
+
|
|
17
|
+
Full issue detail (body + comments) spilled to: @spill?:issue.json=`otto-linear view "$OTTO_ISSUE"|||{}`
|
|
18
|
+
|
|
19
|
+
`Read` that file to get the full body and comments before acting on the issue.
|
|
20
|
+
|
|
21
|
+
</issue>
|
|
22
|
+
|
|
23
|
+
# THE TASK
|
|
24
|
+
|
|
25
|
+
Work **only** on Linear issue {{ INPUTS }} (shown above). Do not list, triage, or pick from any other open issues — this run is scoped to a single issue.
|
|
26
|
+
|
|
27
|
+
If Linear issue {{ INPUTS }} is already complete (done, or there is no work left to do), output <promise>NO MORE TASKS</promise>.
|
|
28
|
+
|
|
29
|
+
@include:ghprompt-workflow.md
|
|
30
|
+
|
|
31
|
+
@include:linear-completion.md
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{{ RESUME }}
|
|
2
|
+
|
|
3
|
+
<commits>
|
|
4
|
+
|
|
5
|
+
!?`git log -n 5 --format="%H%n%ad%n%B---" --date=short|||No commits found`
|
|
6
|
+
|
|
7
|
+
</commits>
|
|
8
|
+
|
|
9
|
+
<learnings>
|
|
10
|
+
|
|
11
|
+
!?`cat ./.otto/LEARNINGS.md|||_No learnings recorded yet._`
|
|
12
|
+
|
|
13
|
+
</learnings>
|
|
14
|
+
|
|
15
|
+
<issues-summary>
|
|
16
|
+
|
|
17
|
+
`otto-linear list --limit 50`
|
|
18
|
+
|
|
19
|
+
</issues-summary>
|
|
20
|
+
|
|
21
|
+
<issues-full-file>
|
|
22
|
+
|
|
23
|
+
Full issue bodies + comments spilled to: @spill?:issues.json=`otto-linear dump --limit 50|||[]`
|
|
24
|
+
|
|
25
|
+
Read that file with `Read` (use `offset`/`limit` if it is large) to get bodies and comments before picking a task. The `<issues-summary>` block above is the lean index for triage.
|
|
26
|
+
|
|
27
|
+
</issues-full-file>
|
|
28
|
+
|
|
29
|
+
@include:linearprompt.md
|