@phamvuhoang/otto-core 0.3.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.
Files changed (45) hide show
  1. package/dist/cli-help.d.ts +16 -3
  2. package/dist/cli-help.d.ts.map +1 -1
  3. package/dist/cli-help.js +14 -4
  4. package/dist/cli-help.js.map +1 -1
  5. package/dist/index.d.ts +5 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +5 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/linear-api.d.ts +161 -0
  10. package/dist/linear-api.d.ts.map +1 -0
  11. package/dist/linear-api.js +288 -0
  12. package/dist/linear-api.js.map +1 -0
  13. package/dist/linear-auth.d.ts +42 -0
  14. package/dist/linear-auth.d.ts.map +1 -0
  15. package/dist/linear-auth.js +115 -0
  16. package/dist/linear-auth.js.map +1 -0
  17. package/dist/linear-cli.d.ts +37 -0
  18. package/dist/linear-cli.d.ts.map +1 -0
  19. package/dist/linear-cli.js +176 -0
  20. package/dist/linear-cli.js.map +1 -0
  21. package/dist/linear-main.d.ts +5 -0
  22. package/dist/linear-main.d.ts.map +1 -0
  23. package/dist/linear-main.js +27 -0
  24. package/dist/linear-main.js.map +1 -0
  25. package/dist/preflight.d.ts +3 -0
  26. package/dist/preflight.d.ts.map +1 -1
  27. package/dist/preflight.js +13 -1
  28. package/dist/preflight.js.map +1 -1
  29. package/dist/run-bin.d.ts +21 -1
  30. package/dist/run-bin.d.ts.map +1 -1
  31. package/dist/run-bin.js +12 -6
  32. package/dist/run-bin.js.map +1 -1
  33. package/dist/stages.d.ts +10 -0
  34. package/dist/stages.d.ts.map +1 -1
  35. package/dist/stages.js +10 -0
  36. package/dist/stages.js.map +1 -1
  37. package/dist/watch.d.ts +37 -2
  38. package/dist/watch.d.ts.map +1 -1
  39. package/dist/watch.js +39 -4
  40. package/dist/watch.js.map +1 -1
  41. package/package.json +1 -1
  42. package/templates/linear-completion.md +17 -0
  43. package/templates/linearafk-issue.md +31 -0
  44. package/templates/linearafk.md +29 -0
  45. package/templates/linearprompt.md +39 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-api.js","sourceRoot":"","sources":["../src/linear-api.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ import { type LinearViewer } from "./linear-api.js";
2
+ /**
3
+ * Injectable host surface for {@link runLinearAuth} so the credential tool stays
4
+ * pure-ish and unit-testable without touching the real home dir, stdin, or the
5
+ * network. {@link defaultLinearAuthDeps} wires up the host.
6
+ */
7
+ export type LinearAuthCliDeps = {
8
+ env: NodeJS.ProcessEnv;
9
+ /** Home directory holding the credential file. */
10
+ home: string;
11
+ /** Read a file's contents, or null if it is absent/unreadable. */
12
+ readFile: (path: string) => string | null;
13
+ /** Write `contents` to `path`, creating parent dirs, with the given mode. */
14
+ writeFile: (path: string, contents: string, mode: number) => void;
15
+ /** Delete `path`; return true if a file was actually removed. */
16
+ removeFile: (path: string) => boolean;
17
+ /** Read the API key the user pastes on stdin (login). */
18
+ readStdin: () => Promise<string>;
19
+ /** Print one line to stdout. */
20
+ out: (msg: string) => void;
21
+ /** Print one line to stderr. */
22
+ err: (msg: string) => void;
23
+ /** Live credential check for `status --verify-live`; injectable for tests. */
24
+ verify: (token: string) => Promise<LinearViewer>;
25
+ };
26
+ /** Host-wired defaults for {@link runLinearAuth}. */
27
+ export declare const defaultLinearAuthDeps: LinearAuthCliDeps;
28
+ /**
29
+ * Drive the `otto-linear-auth` credential tool. Resolves to the process exit
30
+ * code so the thin bin wrapper can `process.exit(code)`.
31
+ *
32
+ * - `login` — read a Linear personal API key from stdin and store it at
33
+ * `~/.config/otto/linear.json` (`0600`, outside any repo). The secret is
34
+ * never echoed back.
35
+ * - `status` — report whether a credential resolves (and from where, via
36
+ * {@link resolveLinearAuth}) without printing the token; `--verify-live`
37
+ * additionally calls the Linear API to confirm the key works.
38
+ * - `logout` — delete the stored credential file; warns if an env-var key
39
+ * still takes precedence.
40
+ */
41
+ export declare function runLinearAuth(argv: string[], deps?: LinearAuthCliDeps): Promise<number>;
42
+ //# sourceMappingURL=linear-auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-auth.d.ts","sourceRoot":"","sources":["../src/linear-auth.ts"],"names":[],"mappings":"AAUA,OAAO,EAKL,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAEzB;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC1C,6EAA6E;IAC7E,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,iEAAiE;IACjE,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IACtC,yDAAyD;IACzD,SAAS,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,gCAAgC;IAChC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,gCAAgC;IAChC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,8EAA8E;IAC9E,MAAM,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC,CAAC;CAClD,CAAC;AAUF,qDAAqD;AACrD,eAAO,MAAM,qBAAqB,EAAE,iBA6BnC,CAAC;AAKF;;;;;;;;;;;;GAYG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,iBAAyC,GAC9C,OAAO,CAAC,MAAM,CAAC,CA+DjB"}
@@ -0,0 +1,115 @@
1
+ import { homedir } from "node:os";
2
+ import { dirname } from "node:path";
3
+ import { chmodSync, mkdirSync, readFileSync, unlinkSync, writeFileSync, } from "node:fs";
4
+ import { createLinearClient, linearConfigPath, resolveLinearAuth, LinearApiError, } from "./linear-api.js";
5
+ async function readAllStdin() {
6
+ const chunks = [];
7
+ for await (const chunk of process.stdin) {
8
+ chunks.push(Buffer.from(chunk));
9
+ }
10
+ return Buffer.concat(chunks).toString("utf8");
11
+ }
12
+ /** Host-wired defaults for {@link runLinearAuth}. */
13
+ export const defaultLinearAuthDeps = {
14
+ env: process.env,
15
+ home: homedir(),
16
+ readFile: (p) => {
17
+ try {
18
+ return readFileSync(p, "utf8");
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ },
24
+ writeFile: (p, contents, mode) => {
25
+ mkdirSync(dirname(p), { recursive: true, mode: 0o700 });
26
+ writeFileSync(p, contents, { mode });
27
+ // `mode` above only applies when the file is created, so re-tighten an
28
+ // existing credential file whose perms may have drifted looser.
29
+ chmodSync(p, mode);
30
+ },
31
+ removeFile: (p) => {
32
+ try {
33
+ unlinkSync(p);
34
+ return true;
35
+ }
36
+ catch {
37
+ return false;
38
+ }
39
+ },
40
+ readStdin: readAllStdin,
41
+ out: (m) => process.stdout.write(`${m}\n`),
42
+ err: (m) => process.stderr.write(`${m}\n`),
43
+ verify: (token) => createLinearClient({ token }).whoami(),
44
+ };
45
+ const USAGE = "Usage: otto-linear-auth <login|status [--verify-live]|logout>";
46
+ /**
47
+ * Drive the `otto-linear-auth` credential tool. Resolves to the process exit
48
+ * code so the thin bin wrapper can `process.exit(code)`.
49
+ *
50
+ * - `login` — read a Linear personal API key from stdin and store it at
51
+ * `~/.config/otto/linear.json` (`0600`, outside any repo). The secret is
52
+ * never echoed back.
53
+ * - `status` — report whether a credential resolves (and from where, via
54
+ * {@link resolveLinearAuth}) without printing the token; `--verify-live`
55
+ * additionally calls the Linear API to confirm the key works.
56
+ * - `logout` — delete the stored credential file; warns if an env-var key
57
+ * still takes precedence.
58
+ */
59
+ export async function runLinearAuth(argv, deps = defaultLinearAuthDeps) {
60
+ const [sub, ...rest] = argv;
61
+ const path = linearConfigPath(deps.home);
62
+ switch (sub) {
63
+ case "login": {
64
+ const token = (await deps.readStdin()).trim();
65
+ if (!token) {
66
+ deps.err("No API key provided. Paste your Linear personal API key.");
67
+ return 1;
68
+ }
69
+ const body = JSON.stringify({ type: "apiKey", token }, null, 2);
70
+ deps.writeFile(path, `${body}\n`, 0o600);
71
+ deps.out(`Stored Linear API key at ${path} (0600).`);
72
+ return 0;
73
+ }
74
+ case "status": {
75
+ const auth = resolveLinearAuth({
76
+ env: deps.env,
77
+ readFile: deps.readFile,
78
+ home: deps.home,
79
+ });
80
+ if (!auth) {
81
+ deps.out("Linear auth: not found — run `otto-linear-auth login`.");
82
+ return 1;
83
+ }
84
+ deps.out(`Linear auth: found (source: ${auth.source}).`);
85
+ if (rest.includes("--verify-live")) {
86
+ try {
87
+ const me = await deps.verify(auth.token);
88
+ deps.out(`Verified live as ${me.name} <${me.email}>.`);
89
+ }
90
+ catch (e) {
91
+ const kind = e instanceof LinearApiError ? ` (${e.kind})` : "";
92
+ deps.err(`Live verification failed${kind}: ${e.message}`);
93
+ return 1;
94
+ }
95
+ }
96
+ return 0;
97
+ }
98
+ case "logout": {
99
+ const removed = deps.removeFile(path);
100
+ deps.out(removed
101
+ ? `Removed stored Linear credential at ${path}.`
102
+ : `No stored credential at ${path}; nothing to remove.`);
103
+ for (const name of ["OTTO_LINEAR_API_KEY", "LINEAR_API_KEY"]) {
104
+ if (deps.env[name]?.trim()) {
105
+ deps.out(`Note: ${name} is still set and takes precedence over the file.`);
106
+ }
107
+ }
108
+ return 0;
109
+ }
110
+ default:
111
+ deps.err(USAGE);
112
+ return 2;
113
+ }
114
+ }
115
+ //# sourceMappingURL=linear-auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-auth.js","sourceRoot":"","sources":["../src/linear-auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type LinearClient } from "./linear-api.js";
2
+ /**
3
+ * Injectable host surface for {@link runLinear} so the bundled `linear` helper
4
+ * stays pure-ish and unit-testable without touching the real home dir or the
5
+ * network. {@link defaultLinearCliDeps} wires up the host.
6
+ */
7
+ export type LinearCliDeps = {
8
+ env: NodeJS.ProcessEnv;
9
+ /** Home directory holding the credential file. */
10
+ home: string;
11
+ /** Read a file's contents, or null if it is absent/unreadable. */
12
+ readFile: (path: string) => string | null;
13
+ /** Print one line to stdout. */
14
+ out: (msg: string) => void;
15
+ /** Print one line to stderr. */
16
+ err: (msg: string) => void;
17
+ /** Build a Linear client for a resolved token; injectable for tests. */
18
+ makeClient: (token: string) => LinearClient;
19
+ };
20
+ /** Host-wired defaults for {@link runLinear}. */
21
+ export declare const defaultLinearCliDeps: LinearCliDeps;
22
+ /**
23
+ * Drive the bundled `linear` helper CLI — Otto's thin Linear counterpart to the
24
+ * system `gh`, used by the Linear templates and the agent. Resolves to the
25
+ * process exit code so the bin wrapper can `process.exit(code)`.
26
+ *
27
+ * - `list` — print labelled open issues (identifier/title/state/url).
28
+ * - `dump` — emit a JSON array of full issue detail (bodies + comments), for
29
+ * spilling into a prompt (parallel to `gh issue list --json …,body,comments`).
30
+ * - `view` — print one issue's full detail as JSON.
31
+ * - `comment` — add a comment to an issue from `--body-file`.
32
+ * - `done` — move an issue to a completed workflow state, resolved via
33
+ * `OTTO_LINEAR_DONE_STATE` (by name) else the team's first `completed`-type
34
+ * state; exits non-zero (no move) when the target state is ambiguous.
35
+ */
36
+ export declare function runLinear(argv: string[], deps?: LinearCliDeps): Promise<number>;
37
+ //# sourceMappingURL=linear-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-cli.d.ts","sourceRoot":"","sources":["../src/linear-cli.ts"],"names":[],"mappings":"AAGA,OAAO,EAML,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AAEzB;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,kDAAkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,kEAAkE;IAClE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC1C,gCAAgC;IAChC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,gCAAgC;IAChC,GAAG,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,wEAAwE;IACxE,UAAU,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,YAAY,CAAC;CAC7C,CAAC;AAEF,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,EAAE,aAalC,CAAC;AAqCF;;;;;;;;;;;;;GAaG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,aAAoC,GACzC,OAAO,CAAC,MAAM,CAAC,CAgIjB"}
@@ -0,0 +1,176 @@
1
+ import { homedir } from "node:os";
2
+ import { readFileSync } from "node:fs";
3
+ import { createLinearClient, parseLinearRef, resolveDoneState, resolveLinearAuth, LinearApiError, } from "./linear-api.js";
4
+ /** Host-wired defaults for {@link runLinear}. */
5
+ export const defaultLinearCliDeps = {
6
+ env: process.env,
7
+ home: homedir(),
8
+ readFile: (p) => {
9
+ try {
10
+ return readFileSync(p, "utf8");
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ },
16
+ out: (m) => process.stdout.write(`${m}\n`),
17
+ err: (m) => process.stderr.write(`${m}\n`),
18
+ makeClient: (token) => createLinearClient({ token }),
19
+ };
20
+ const USAGE = "Usage: linear <list|dump|view <ref>|comment <ref> --body-file <path>|done <ref>> [--label <name>] [--team <key>] [--limit <n>]";
21
+ /** Pull `--name <value>` flags out of argv, returning the flags + positionals. */
22
+ function parseFlags(argv) {
23
+ const flags = {};
24
+ const positionals = [];
25
+ for (let i = 0; i < argv.length; i++) {
26
+ const arg = argv[i];
27
+ if (arg.startsWith("--")) {
28
+ flags[arg.slice(2)] = argv[++i] ?? "";
29
+ }
30
+ else {
31
+ positionals.push(arg);
32
+ }
33
+ }
34
+ return { flags, positionals };
35
+ }
36
+ /** Resolve label/team/limit from flags, falling back to env then defaults. */
37
+ function listOptions(flags, env) {
38
+ const label = flags.label?.trim() || env.OTTO_LINEAR_LABEL?.trim() || "otto";
39
+ const team = flags.team?.trim() || env.OTTO_LINEAR_TEAM?.trim() || undefined;
40
+ const limit = flags.limit != null ? Number(flags.limit) : 50;
41
+ if (!Number.isInteger(limit) || limit <= 0) {
42
+ return { error: `--limit must be a positive integer, got: ${flags.limit}` };
43
+ }
44
+ return team ? { label, team, limit } : { label, limit };
45
+ }
46
+ /**
47
+ * Drive the bundled `linear` helper CLI — Otto's thin Linear counterpart to the
48
+ * system `gh`, used by the Linear templates and the agent. Resolves to the
49
+ * process exit code so the bin wrapper can `process.exit(code)`.
50
+ *
51
+ * - `list` — print labelled open issues (identifier/title/state/url).
52
+ * - `dump` — emit a JSON array of full issue detail (bodies + comments), for
53
+ * spilling into a prompt (parallel to `gh issue list --json …,body,comments`).
54
+ * - `view` — print one issue's full detail as JSON.
55
+ * - `comment` — add a comment to an issue from `--body-file`.
56
+ * - `done` — move an issue to a completed workflow state, resolved via
57
+ * `OTTO_LINEAR_DONE_STATE` (by name) else the team's first `completed`-type
58
+ * state; exits non-zero (no move) when the target state is ambiguous.
59
+ */
60
+ export async function runLinear(argv, deps = defaultLinearCliDeps) {
61
+ const [sub, ...rest] = argv;
62
+ const { flags, positionals } = parseFlags(rest);
63
+ // Validate args before touching credentials so usage errors stay exit 2.
64
+ let ref;
65
+ let listOpts;
66
+ switch (sub) {
67
+ case "list":
68
+ case "dump": {
69
+ const opts = listOptions(flags, deps.env);
70
+ if ("error" in opts) {
71
+ deps.err(opts.error);
72
+ return 2;
73
+ }
74
+ listOpts = opts;
75
+ break;
76
+ }
77
+ case "view":
78
+ case "comment":
79
+ case "done": {
80
+ if (positionals.length === 0) {
81
+ deps.err(USAGE);
82
+ return 2;
83
+ }
84
+ try {
85
+ ref = parseLinearRef(positionals[0]);
86
+ }
87
+ catch (e) {
88
+ deps.err(e.message);
89
+ return 2;
90
+ }
91
+ if (sub === "comment" && !flags["body-file"]) {
92
+ deps.err("comment requires --body-file <path>.");
93
+ return 2;
94
+ }
95
+ break;
96
+ }
97
+ default:
98
+ deps.err(USAGE);
99
+ return 2;
100
+ }
101
+ const auth = resolveLinearAuth({
102
+ env: deps.env,
103
+ readFile: deps.readFile,
104
+ home: deps.home,
105
+ });
106
+ if (!auth) {
107
+ deps.err("Linear auth: not found — run `otto-linear-auth login`.");
108
+ return 1;
109
+ }
110
+ const client = deps.makeClient(auth.token);
111
+ try {
112
+ switch (sub) {
113
+ case "list": {
114
+ const opts = listOpts;
115
+ const issues = await client.listIssues(opts);
116
+ if (issues.length === 0) {
117
+ deps.out(`No open Linear issues with label "${opts.label}".`);
118
+ return 0;
119
+ }
120
+ for (const i of issues) {
121
+ deps.out(`${i.identifier}\t${i.title}\t[${i.state}]\t${i.url}`);
122
+ }
123
+ return 0;
124
+ }
125
+ case "dump": {
126
+ const opts = listOpts;
127
+ const summaries = await client.listIssues(opts);
128
+ const details = [];
129
+ for (const s of summaries) {
130
+ details.push(await client.viewIssue({ kind: "identifier", identifier: s.identifier }));
131
+ }
132
+ deps.out(JSON.stringify(details, null, 2));
133
+ return 0;
134
+ }
135
+ case "view": {
136
+ const detail = await client.viewIssue(ref);
137
+ deps.out(JSON.stringify(detail, null, 2));
138
+ return 0;
139
+ }
140
+ case "comment": {
141
+ const body = deps.readFile(flags["body-file"]);
142
+ if (body == null) {
143
+ deps.err(`Could not read --body-file: ${flags["body-file"]}`);
144
+ return 2;
145
+ }
146
+ const issue = await client.viewIssue(ref);
147
+ await client.addComment(issue.id, body);
148
+ deps.out(`Commented on ${issue.identifier}.`);
149
+ return 0;
150
+ }
151
+ case "done": {
152
+ const issue = await client.viewIssue(ref);
153
+ const team = issue.identifier.split("-")[0];
154
+ const states = await client.listWorkflowStates(team);
155
+ const resolution = resolveDoneState(states, deps.env.OTTO_LINEAR_DONE_STATE);
156
+ if (resolution.kind === "ambiguous") {
157
+ deps.err(`Cannot move ${issue.identifier} to a done state: ${resolution.reason}. ` +
158
+ `Set OTTO_LINEAR_DONE_STATE or move it in Linear manually.`);
159
+ return 3;
160
+ }
161
+ const moved = await client.moveToDone(issue.id, resolution.state.id);
162
+ deps.out(`Moved ${issue.identifier} to ${moved.state}.`);
163
+ return 0;
164
+ }
165
+ default:
166
+ deps.err(USAGE);
167
+ return 2;
168
+ }
169
+ }
170
+ catch (e) {
171
+ const kind = e instanceof LinearApiError ? ` (${e.kind})` : "";
172
+ deps.err(`Linear error${kind}: ${e.message}`);
173
+ return 1;
174
+ }
175
+ }
176
+ //# sourceMappingURL=linear-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-cli.js","sourceRoot":"","sources":["../src/linear-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export type RunLinearAfkOptions = {
2
+ cliVersion?: string;
3
+ };
4
+ export declare function runLinearAfk(argv: string[], opts?: RunLinearAfkOptions): Promise<void>;
5
+ //# sourceMappingURL=linear-main.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-main.d.ts","sourceRoot":"","sources":["../src/linear-main.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,mBAAmB,GAAG;IAAE,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,27 @@
1
+ import { parseLinearIssueArg } from "./linear-api.js";
2
+ import { runBin } from "./run-bin.js";
3
+ import { STAGES } from "./stages.js";
4
+ import { pollLinearIssues } from "./watch.js";
5
+ export async function runLinearAfk(argv, opts = {}) {
6
+ await runBin(argv, {
7
+ bin: "otto-linear-afk",
8
+ usage: "<iterations>",
9
+ desc: "Linear-issue-driven Claude Code AFK loop",
10
+ stages: [STAGES.linearImplementer, STAGES.reviewer],
11
+ takesInputArg: false,
12
+ cliVersion: opts.cliVersion,
13
+ issueStage: STAGES.linearIssueImplementer,
14
+ parseIssue: parseLinearIssueArg,
15
+ mode: "linear",
16
+ supportsWatch: true,
17
+ // Poll the same labelled set the implementer selects (OTTO_LINEAR_LABEL),
18
+ // narrowed by OTTO_LINEAR_TEAM. The `label` arg is the resolved watch label.
19
+ watchPoll: (label) => pollLinearIssues({
20
+ label,
21
+ team: process.env.OTTO_LINEAR_TEAM?.trim() || undefined,
22
+ }),
23
+ watchProvider: { name: "Linear", authCmd: "otto-linear-auth login" },
24
+ resolveWatchLabel: () => process.env.OTTO_LINEAR_LABEL?.trim() || "otto",
25
+ });
26
+ }
27
+ //# sourceMappingURL=linear-main.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"linear-main.js","sourceRoot":"","sources":["../src/linear-main.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAI9C,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,IAAc,EACd,OAA4B,EAAE;IAE9B,MAAM,MAAM,CAAC,IAAI,EAAE;QACjB,GAAG,EAAE,iBAAiB;QACtB,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,0CAA0C;QAChD,MAAM,EAAE,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC;QACnD,aAAa,EAAE,KAAK;QACpB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,UAAU,EAAE,MAAM,CAAC,sBAAsB;QACzC,UAAU,EAAE,mBAAmB;QAC/B,IAAI,EAAE,QAAQ;QACd,aAAa,EAAE,IAAI;QACnB,0EAA0E;QAC1E,6EAA6E;QAC7E,SAAS,EAAE,CAAC,KAAK,EAAE,EAAE,CACnB,gBAAgB,CAAC;YACf,KAAK;YACL,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,SAAS;SACxD,CAAC;QACJ,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,wBAAwB,EAAE;QACpE,iBAAiB,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE,IAAI,MAAM;KACzE,CAAC,CAAC;AACL,CAAC"}
@@ -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
@@ -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;CACd,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,QAAQ,CACtB,IAAI,EAAE,MAAM,EACZ,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,MAAM,GAAG,IAAI,CAaf;AAQD;;;;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,CA0CnB"}
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
@@ -1 +1 @@
1
- {"version":3,"file":"preflight.js","sourceRoot":"","sources":["../src/preflight.ts"],"names":[],"mappings":"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"}
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. Only otto-ghafk sets this. */
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,
@@ -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;AAEzC,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,oEAAoE;IACpE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,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;CACd,CAAC;AAyBF;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuO7E"}
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"}