@quire-io/quire-cli 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.
- package/CHANGES.md +33 -0
- package/LICENSE +15 -0
- package/README.md +69 -0
- package/dist/cli.js +209 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/chat.js +200 -0
- package/dist/commands/chat.js.map +1 -0
- package/dist/commands/colors.js +34 -0
- package/dist/commands/colors.js.map +1 -0
- package/dist/commands/comment.js +128 -0
- package/dist/commands/comment.js.map +1 -0
- package/dist/commands/doc.js +139 -0
- package/dist/commands/doc.js.map +1 -0
- package/dist/commands/insight.js +234 -0
- package/dist/commands/insight.js.map +1 -0
- package/dist/commands/login.js +78 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logout.js +25 -0
- package/dist/commands/logout.js.map +1 -0
- package/dist/commands/mine.js +61 -0
- package/dist/commands/mine.js.map +1 -0
- package/dist/commands/notify.js +25 -0
- package/dist/commands/notify.js.map +1 -0
- package/dist/commands/org.js +99 -0
- package/dist/commands/org.js.map +1 -0
- package/dist/commands/partner.js +36 -0
- package/dist/commands/partner.js.map +1 -0
- package/dist/commands/project.js +346 -0
- package/dist/commands/project.js.map +1 -0
- package/dist/commands/resolve.js +61 -0
- package/dist/commands/resolve.js.map +1 -0
- package/dist/commands/status.js +130 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/sublist.js +143 -0
- package/dist/commands/sublist.js.map +1 -0
- package/dist/commands/tag.js +108 -0
- package/dist/commands/tag.js.map +1 -0
- package/dist/commands/task.js +767 -0
- package/dist/commands/task.js.map +1 -0
- package/dist/commands/undo.js +64 -0
- package/dist/commands/undo.js.map +1 -0
- package/dist/commands/user.js +24 -0
- package/dist/commands/user.js.map +1 -0
- package/dist/commands/whoami.js +34 -0
- package/dist/commands/whoami.js.map +1 -0
- package/dist/config.js +37 -0
- package/dist/config.js.map +1 -0
- package/dist/credentials.js +28 -0
- package/dist/credentials.js.map +1 -0
- package/dist/errors.js +56 -0
- package/dist/errors.js.map +1 -0
- package/dist/log.js +37 -0
- package/dist/log.js.map +1 -0
- package/dist/oauth/config.js +22 -0
- package/dist/oauth/config.js.map +1 -0
- package/dist/oauth/loopback.js +101 -0
- package/dist/oauth/loopback.js.map +1 -0
- package/dist/oauth/pkce.js +16 -0
- package/dist/oauth/pkce.js.map +1 -0
- package/dist/options.js +2 -0
- package/dist/options.js.map +1 -0
- package/dist/output/colors.js +77 -0
- package/dist/output/colors.js.map +1 -0
- package/dist/output/columns.js +22 -0
- package/dist/output/columns.js.map +1 -0
- package/dist/output/keyvalue.js +18 -0
- package/dist/output/keyvalue.js.map +1 -0
- package/dist/output/render.js +30 -0
- package/dist/output/render.js.map +1 -0
- package/dist/output/table.js +35 -0
- package/dist/output/table.js.map +1 -0
- package/dist/quire-client.js +74 -0
- package/dist/quire-client.js.map +1 -0
- package/dist/util/attach-input.js +65 -0
- package/dist/util/attach-input.js.map +1 -0
- package/dist/util/bulk-input.js +80 -0
- package/dist/util/bulk-input.js.map +1 -0
- package/dist/util/confirm.js +31 -0
- package/dist/util/confirm.js.map +1 -0
- package/dist/util/field-flags.js +52 -0
- package/dist/util/field-flags.js.map +1 -0
- package/dist/util/open-url.js +39 -0
- package/dist/util/open-url.js.map +1 -0
- package/dist/util/recurrence.js +53 -0
- package/dist/util/recurrence.js.map +1 -0
- package/dist/util/retry-after.js +56 -0
- package/dist/util/retry-after.js.map +1 -0
- package/dist/util/task-id.js +34 -0
- package/dist/util/task-id.js.map +1 -0
- package/dist/util/text-input.js +26 -0
- package/dist/util/text-input.js.map +1 -0
- package/dist/version.js +19 -0
- package/dist/version.js.map +1 -0
- package/package.json +62 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recurrence.js","sourceRoot":"","sources":["../../src/util/recurrence.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAS/C,MAAM,WAAW,GAAG,CAAC,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAU,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,KAAsB;IACpD,MAAM,OAAO,GACX,KAAK,CAAC,cAAc,KAAK,SAAS;QAClC,KAAK,CAAC,kBAAkB,KAAK,SAAS;QACtC,KAAK,CAAC,mBAAmB,KAAK,SAAS;QACvC,KAAK,CAAC,eAAe,KAAK,SAAS,CAAC;IACtC,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAC;IAE/B,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,EAAE,WAAW,EAAE,CAAC;IACjD,IAAI,CAAC,IAAI,IAAI,CAAE,WAAiC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,eAAe,CACvB,+FAA+F,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,KAAK,CAAC,cAAc,IAAI,EAAE,GAAG,CAC9J,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC3C,MAAM,IAAI,eAAe,CAAC,8EAA8E,CAAC,CAAC;IAC5G,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,QAAQ,IAAI,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,eAAe,CAAC,0DAA0D,KAAK,CAAC,kBAAkB,GAAG,CAAC,CAAC;IACnH,CAAC;IAED,MAAM,UAAU,GAAoB;QAClC,IAAI,EAAE,IAA+B;QACrC,QAAQ;KACT,CAAC;IAEF,IAAI,KAAK,CAAC,mBAAmB,KAAK,SAAS,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,KAAK,CAAC,mBAAmB;aACnC,KAAK,CAAC,GAAG,CAAC;aACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACtC,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,eAAe,CAAC,sEAAsE,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAChI,CAAC;QACD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,eAAe,CAAC,qEAAqE,KAAK,CAAC,mBAAmB,GAAG,CAAC,CAAC;YAC/H,CAAC;QACH,CAAC;QACD,UAAU,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAE,IAAI,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,CAAC;IAED,IAAI,KAAK,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACxC,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,eAAe,CAAC;IAC3C,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Retry-once-on-429 helper. Wraps any async function: on a Quire 429
|
|
3
|
+
* "rate limited" error, parses the retry-after value from the error
|
|
4
|
+
* message (set by `@quire-io/api-client`'s `formatQuireError`), waits,
|
|
5
|
+
* and retries one time. Above the cap (default 60s) or when the wait
|
|
6
|
+
* value is unparseable, throws a `CliError` with exit code 2.
|
|
7
|
+
*
|
|
8
|
+
* 429 means the server did no work, so retrying is always idempotent —
|
|
9
|
+
* the wrapped function can be a single GET, a single write, or a
|
|
10
|
+
* multi-step action; either way replaying it is safe.
|
|
11
|
+
*
|
|
12
|
+
* Implementation note: the api-client throws a plain `Error` for 4xx
|
|
13
|
+
* responses, encoding the retry-after value into the message text. We
|
|
14
|
+
* detect 429s by message-prefix and parse the wait value out. If the
|
|
15
|
+
* api-client ever exposes a typed `QuireRateLimitedError` we'd switch
|
|
16
|
+
* to that — but for now message-matching is the only API surface.
|
|
17
|
+
*/
|
|
18
|
+
import { CliError, ExitCode } from "../errors.js";
|
|
19
|
+
const DEFAULT_CAP_SEC = 60;
|
|
20
|
+
const RATE_LIMITED_PREFIX = "Quire API error 429";
|
|
21
|
+
// Matches "retry after 30s" / "retry after 1m 30s" / "retry after 2m"
|
|
22
|
+
const RETRY_AFTER_PATTERN = /retry after (?:(\d+)m\s*)?(\d+)?s?/i;
|
|
23
|
+
function parseRetryAfterSec(message) {
|
|
24
|
+
const m = RETRY_AFTER_PATTERN.exec(message);
|
|
25
|
+
if (!m)
|
|
26
|
+
return null;
|
|
27
|
+
const minutes = m[1] ? Number.parseInt(m[1], 10) : 0;
|
|
28
|
+
const seconds = m[2] ? Number.parseInt(m[2], 10) : 0;
|
|
29
|
+
const total = minutes * 60 + seconds;
|
|
30
|
+
return total > 0 ? total : null;
|
|
31
|
+
}
|
|
32
|
+
function isRateLimited(err) {
|
|
33
|
+
return err instanceof Error && err.message.startsWith(RATE_LIMITED_PREFIX);
|
|
34
|
+
}
|
|
35
|
+
const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
|
|
36
|
+
export async function withRetryOn429(fn, opts = {}) {
|
|
37
|
+
const cap = opts.capSec ?? DEFAULT_CAP_SEC;
|
|
38
|
+
try {
|
|
39
|
+
return await fn();
|
|
40
|
+
}
|
|
41
|
+
catch (err) {
|
|
42
|
+
if (!isRateLimited(err))
|
|
43
|
+
throw err;
|
|
44
|
+
const waitSec = parseRetryAfterSec(err.message);
|
|
45
|
+
if (waitSec === null) {
|
|
46
|
+
throw new CliError("Quire API rate limited; retry in 60s+ (precise wait time unavailable)", ExitCode.ApiError);
|
|
47
|
+
}
|
|
48
|
+
if (waitSec > cap) {
|
|
49
|
+
throw new CliError(`Quire API rate limited; retry in ${waitSec}s`, ExitCode.ApiError);
|
|
50
|
+
}
|
|
51
|
+
opts.onRetry?.(waitSec);
|
|
52
|
+
await sleep(waitSec * 1000);
|
|
53
|
+
return await fn();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
//# sourceMappingURL=retry-after.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retry-after.js","sourceRoot":"","sources":["../../src/util/retry-after.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAElD,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,mBAAmB,GAAG,qBAAqB,CAAC;AAClD,sEAAsE;AACtE,MAAM,mBAAmB,GAAG,qCAAqC,CAAC;AAElE,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,MAAM,KAAK,GAAG,OAAO,GAAG,EAAE,GAAG,OAAO,CAAC;IACrC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;AAClC,CAAC;AAED,SAAS,aAAa,CAAC,GAAY;IACjC,OAAO,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,EAAU,EAAiB,EAAE,CAC1C,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAoB,EACpB,OAAiE,EAAE;IAEnE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,IAAI,eAAe,CAAC;IAC3C,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAAE,MAAM,GAAG,CAAC;QACnC,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChD,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACrB,MAAM,IAAI,QAAQ,CAChB,uEAAuE,EACvE,QAAQ,CAAC,QAAQ,CAClB,CAAC;QACJ,CAAC;QACD,IAAI,OAAO,GAAG,GAAG,EAAE,CAAC;YAClB,MAAM,IAAI,QAAQ,CAChB,oCAAoC,OAAO,GAAG,EAC9C,QAAQ,CAAC,QAAQ,CAClB,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;QACxB,MAAM,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAC5B,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { looksLikeOid, parseQuireUrl } from "@quire-io/api-client";
|
|
2
|
+
import { ValidationError } from "../errors.js";
|
|
3
|
+
/**
|
|
4
|
+
* Resolve a user-supplied task identifier into a Quire task OID. Accepted
|
|
5
|
+
* forms:
|
|
6
|
+
* - bare OID (passes `looksLikeOid`)
|
|
7
|
+
* - `project-slug/#408` or `project-slug/408`
|
|
8
|
+
* - full Quire task URL (parsed via `parseQuireUrl`)
|
|
9
|
+
*
|
|
10
|
+
* Bare numeric IDs like `#408` aren't accepted because they're ambiguous
|
|
11
|
+
* — they need a project context to disambiguate. Surfaced as a clean
|
|
12
|
+
* `ValidationError` so the caller exits 3 with a helpful message.
|
|
13
|
+
*/
|
|
14
|
+
export async function resolveTaskOid(client, input) {
|
|
15
|
+
if (looksLikeOid(input))
|
|
16
|
+
return input;
|
|
17
|
+
if (/^https?:\/\//i.test(input)) {
|
|
18
|
+
const parsed = parseQuireUrl(input);
|
|
19
|
+
if (parsed?.kind === "task") {
|
|
20
|
+
const task = await client.getTaskByProjectAndId(parsed.projectId, parsed.taskId);
|
|
21
|
+
return task.oid;
|
|
22
|
+
}
|
|
23
|
+
throw new ValidationError(`URL is not a Quire task: "${input}"`);
|
|
24
|
+
}
|
|
25
|
+
const slugMatch = input.match(/^([^/]+)\/#?(\d+)$/);
|
|
26
|
+
if (slugMatch) {
|
|
27
|
+
const projectId = slugMatch[1];
|
|
28
|
+
const taskId = slugMatch[2];
|
|
29
|
+
const task = await client.getTaskByProjectAndId(projectId, taskId);
|
|
30
|
+
return task.oid;
|
|
31
|
+
}
|
|
32
|
+
throw new ValidationError(`Cannot resolve task: "${input}". Expected a task OID, "project-slug/#408", or a full Quire task URL.`);
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=task-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-id.js","sourceRoot":"","sources":["../../src/util/task-id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,MAAmB,EAAE,KAAa;IACrE,IAAI,YAAY,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAEtC,IAAI,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,MAAM,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;YACjF,OAAO,IAAI,CAAC,GAAG,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,eAAe,CAAC,6BAA6B,KAAK,GAAG,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC;IACpD,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,SAAS,GAAG,SAAS,CAAC,CAAC,CAAW,CAAC;QACzC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAW,CAAC;QACtC,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;QACnE,OAAO,IAAI,CAAC,GAAG,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,eAAe,CACvB,yBAAyB,KAAK,wEAAwE,CACvG,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a `--text`-style flag value into actual text. Three forms:
|
|
4
|
+
*
|
|
5
|
+
* - `-` → read all of stdin until EOF
|
|
6
|
+
* - `@/path/file` → read the file at that path
|
|
7
|
+
* - anything else → use as a literal string
|
|
8
|
+
*
|
|
9
|
+
* Mirrors how `gh` and `kubectl` handle text-input flags so users can
|
|
10
|
+
* `cat long.md | quire comment add … --text -` or
|
|
11
|
+
* `quire comment add … --text @notes.md` for long descriptions.
|
|
12
|
+
*/
|
|
13
|
+
export async function resolveTextInput(value) {
|
|
14
|
+
if (value === "-") {
|
|
15
|
+
const chunks = [];
|
|
16
|
+
for await (const chunk of process.stdin) {
|
|
17
|
+
chunks.push(chunk);
|
|
18
|
+
}
|
|
19
|
+
return Buffer.concat(chunks).toString("utf8");
|
|
20
|
+
}
|
|
21
|
+
if (value.startsWith("@")) {
|
|
22
|
+
return readFileSync(value.slice(1), "utf8");
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=text-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"text-input.js","sourceRoot":"","sources":["../../src/util/text-input.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAa;IAClD,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;QAClB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YACxC,MAAM,CAAC,IAAI,CAAC,KAAe,CAAC,CAAC;QAC/B,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IACD,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/version.js
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
// In a Node SEA / esbuild bundle, `process.env.QUIRE_CLI_VERSION` is
|
|
5
|
+
// substituted as a string literal at build time (see scripts/build-sea.mjs).
|
|
6
|
+
// In dev runs via `tsx` or `node dist/cli.js`, the env var is undefined, so
|
|
7
|
+
// we fall back to reading package.json next to the running file.
|
|
8
|
+
const BUILD_TIME_VERSION = process.env.QUIRE_CLI_VERSION;
|
|
9
|
+
export function readVersion() {
|
|
10
|
+
if (BUILD_TIME_VERSION !== undefined && BUILD_TIME_VERSION !== "") {
|
|
11
|
+
return BUILD_TIME_VERSION;
|
|
12
|
+
}
|
|
13
|
+
// package.json sits one level up from dist/cli.js (built) or src/cli.ts (dev via tsx).
|
|
14
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
15
|
+
const pkgPath = join(here, "..", "package.json");
|
|
16
|
+
const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
17
|
+
return pkg.version;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,qEAAqE;AACrE,6EAA6E;AAC7E,4EAA4E;AAC5E,iEAAiE;AACjE,MAAM,kBAAkB,GAAuB,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;AAE7E,MAAM,UAAU,WAAW;IACzB,IAAI,kBAAkB,KAAK,SAAS,IAAI,kBAAkB,KAAK,EAAE,EAAE,CAAC;QAClE,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IACD,uFAAuF;IACvF,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;IACjD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAwB,CAAC;IAC7E,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@quire-io/quire-cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Command-line interface for the Quire API.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"publishConfig": {
|
|
7
|
+
"access": "public"
|
|
8
|
+
},
|
|
9
|
+
"bin": {
|
|
10
|
+
"quire": "./dist/cli.js"
|
|
11
|
+
},
|
|
12
|
+
"main": "./dist/cli.js",
|
|
13
|
+
"files": [
|
|
14
|
+
"dist",
|
|
15
|
+
"README.md",
|
|
16
|
+
"LICENSE",
|
|
17
|
+
"CHANGES.md"
|
|
18
|
+
],
|
|
19
|
+
"engines": {
|
|
20
|
+
"node": ">=20"
|
|
21
|
+
},
|
|
22
|
+
"scripts": {
|
|
23
|
+
"dev": "tsx src/cli.ts",
|
|
24
|
+
"build": "tsc",
|
|
25
|
+
"start": "node dist/cli.js",
|
|
26
|
+
"typecheck": "tsc --noEmit",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test:watch": "vitest",
|
|
29
|
+
"test:live": "vitest run --config vitest.live.config.ts",
|
|
30
|
+
"package": "node scripts/build-sea.mjs",
|
|
31
|
+
"prepublishOnly": "npm run typecheck && npm test && npm run build"
|
|
32
|
+
},
|
|
33
|
+
"keywords": [
|
|
34
|
+
"quire",
|
|
35
|
+
"cli",
|
|
36
|
+
"task-management",
|
|
37
|
+
"productivity",
|
|
38
|
+
"api"
|
|
39
|
+
],
|
|
40
|
+
"license": "ISC",
|
|
41
|
+
"author": "Potix Corporation",
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "git+https://github.com/quire-io/quire-cli.git"
|
|
45
|
+
},
|
|
46
|
+
"homepage": "https://github.com/quire-io/quire-cli#readme",
|
|
47
|
+
"bugs": {
|
|
48
|
+
"url": "https://github.com/quire-io/quire-cli/issues"
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"@quire-io/api-client": "^0.1.3",
|
|
52
|
+
"commander": "^12.1.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@types/node": "^20.14.0",
|
|
56
|
+
"esbuild": "^0.28.0",
|
|
57
|
+
"postject": "^1.0.0-alpha.6",
|
|
58
|
+
"tsx": "^4.19.0",
|
|
59
|
+
"typescript": "^5.6.0",
|
|
60
|
+
"vitest": "^4.1.5"
|
|
61
|
+
}
|
|
62
|
+
}
|