linmux 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.
Files changed (118) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +240 -0
  3. package/bin/run.js +4 -0
  4. package/dist/commands/comment/create.js +94 -0
  5. package/dist/commands/comment/delete.js +74 -0
  6. package/dist/commands/comment/list.js +84 -0
  7. package/dist/commands/comment/update.js +80 -0
  8. package/dist/commands/cycle/current.js +78 -0
  9. package/dist/commands/cycle/list.js +84 -0
  10. package/dist/commands/cycle/move.js +91 -0
  11. package/dist/commands/describe.js +65 -0
  12. package/dist/commands/graphql/index.js +92 -0
  13. package/dist/commands/install-skill.js +54 -0
  14. package/dist/commands/issue/archive.js +75 -0
  15. package/dist/commands/issue/create.js +115 -0
  16. package/dist/commands/issue/get.js +84 -0
  17. package/dist/commands/issue/list.js +93 -0
  18. package/dist/commands/issue/purge.js +81 -0
  19. package/dist/commands/issue/search.js +109 -0
  20. package/dist/commands/issue/transition.js +91 -0
  21. package/dist/commands/issue/trash.js +75 -0
  22. package/dist/commands/issue/update.js +126 -0
  23. package/dist/commands/label/create.js +91 -0
  24. package/dist/commands/label/list.js +76 -0
  25. package/dist/commands/list-tools.js +47 -0
  26. package/dist/commands/me.js +71 -0
  27. package/dist/commands/project/create.js +101 -0
  28. package/dist/commands/project/get.js +83 -0
  29. package/dist/commands/project/list.js +75 -0
  30. package/dist/commands/project/update-status.js +99 -0
  31. package/dist/commands/project/update.js +99 -0
  32. package/dist/commands/raw/batch.js +85 -0
  33. package/dist/commands/raw/index.js +72 -0
  34. package/dist/commands/schema.js +69 -0
  35. package/dist/commands/state/list.js +77 -0
  36. package/dist/commands/team/get.js +73 -0
  37. package/dist/commands/team/list.js +73 -0
  38. package/dist/commands/whoami.js +71 -0
  39. package/dist/commands/workspace/add.js +97 -0
  40. package/dist/commands/workspace/list.js +47 -0
  41. package/dist/commands/workspace/remove.js +63 -0
  42. package/dist/commands/workspace/replace-token.js +89 -0
  43. package/dist/commands/workspace/use.js +54 -0
  44. package/dist/core/client/factory.js +28 -0
  45. package/dist/core/client/index.js +2 -0
  46. package/dist/core/config/index.js +4 -0
  47. package/dist/core/config/paths.js +30 -0
  48. package/dist/core/config/schema.js +36 -0
  49. package/dist/core/config/store.js +149 -0
  50. package/dist/core/errors/error.js +142 -0
  51. package/dist/core/errors/exit-codes.js +70 -0
  52. package/dist/core/output/envelope.js +53 -0
  53. package/dist/core/output/format.js +42 -0
  54. package/dist/core/output/index.js +3 -0
  55. package/dist/core/pagination/flags.js +29 -0
  56. package/dist/core/pagination/index.js +2 -0
  57. package/dist/core/projection/presets.js +116 -0
  58. package/dist/core/projection/project.js +282 -0
  59. package/dist/core/redact/redact.js +45 -0
  60. package/dist/core/resolvers/cycle.js +60 -0
  61. package/dist/core/resolvers/index.js +7 -0
  62. package/dist/core/resolvers/label.js +54 -0
  63. package/dist/core/resolvers/project-status.js +42 -0
  64. package/dist/core/resolvers/project.js +43 -0
  65. package/dist/core/resolvers/state.js +46 -0
  66. package/dist/core/resolvers/team.js +50 -0
  67. package/dist/core/transport/fetch-interceptor.js +109 -0
  68. package/dist/core/transport/index.js +3 -0
  69. package/dist/core/transport/rate-limit.js +167 -0
  70. package/dist/core/workspace/resolver.js +70 -0
  71. package/dist/core/workspace/write-guard.js +43 -0
  72. package/dist/generated/graphql.js +89428 -0
  73. package/dist/generated/operations.js +3013 -0
  74. package/dist/lib/comment-create-runtime.js +96 -0
  75. package/dist/lib/comment-delete-runtime.js +46 -0
  76. package/dist/lib/comment-list-runtime.js +182 -0
  77. package/dist/lib/comment-update-runtime.js +93 -0
  78. package/dist/lib/cycle-current-runtime.js +90 -0
  79. package/dist/lib/cycle-list-runtime.js +151 -0
  80. package/dist/lib/cycle-move-runtime.js +142 -0
  81. package/dist/lib/describe-runtime.js +180 -0
  82. package/dist/lib/filter-heuristics.js +59 -0
  83. package/dist/lib/graphql-runtime.js +202 -0
  84. package/dist/lib/include-fragments.js +73 -0
  85. package/dist/lib/install-skill-runtime.js +228 -0
  86. package/dist/lib/introspection-registry.js +488 -0
  87. package/dist/lib/issue-archive-runtime.js +89 -0
  88. package/dist/lib/issue-create-runtime.js +175 -0
  89. package/dist/lib/issue-get-runtime.js +153 -0
  90. package/dist/lib/issue-list-runtime.js +164 -0
  91. package/dist/lib/issue-purge-runtime.js +89 -0
  92. package/dist/lib/issue-search-runtime.js +114 -0
  93. package/dist/lib/issue-transition-runtime.js +131 -0
  94. package/dist/lib/issue-trash-runtime.js +84 -0
  95. package/dist/lib/issue-update-runtime.js +164 -0
  96. package/dist/lib/label-create-runtime.js +113 -0
  97. package/dist/lib/label-list-runtime.js +97 -0
  98. package/dist/lib/levenshtein.js +42 -0
  99. package/dist/lib/list-tools-runtime.js +38 -0
  100. package/dist/lib/me-runtime.js +55 -0
  101. package/dist/lib/project-create-runtime.js +103 -0
  102. package/dist/lib/project-get-runtime.js +134 -0
  103. package/dist/lib/project-list-runtime.js +84 -0
  104. package/dist/lib/project-update-runtime.js +110 -0
  105. package/dist/lib/project-update-status-runtime.js +91 -0
  106. package/dist/lib/raw-batch-runtime.js +229 -0
  107. package/dist/lib/raw-runtime.js +171 -0
  108. package/dist/lib/schema-loader.js +41 -0
  109. package/dist/lib/schema-runtime.js +65 -0
  110. package/dist/lib/state-list-runtime.js +93 -0
  111. package/dist/lib/team-get-runtime.js +55 -0
  112. package/dist/lib/team-list-runtime.js +52 -0
  113. package/dist/lib/workspace-runtime.js +112 -0
  114. package/dist/operations/_registry.zod.js +5337 -0
  115. package/oclif.manifest.json +3631 -0
  116. package/package.json +99 -0
  117. package/schema.graphql +30772 -0
  118. package/skills/linmux/SKILL.md +186 -0
@@ -0,0 +1,76 @@
1
+ import { BASE_FLAGS, runCommand } from "../../lib/workspace-runtime.js";
2
+ import { PAGINATION_FLAGS } from "../../core/pagination/flags.js";
3
+ import "../../core/pagination/index.js";
4
+ import { labelListRuntime } from "../../lib/label-list-runtime.js";
5
+ import { Command, Flags } from "@oclif/core";
6
+ //#region src/commands/label/list.ts
7
+ /**
8
+ * `linmux label list` -- Phase 2 PLAN 02-09 Task 2, LBL-01.list.
9
+ *
10
+ * Read command. Lists issue labels either workspace-wide or scoped to one
11
+ * team via `--team` (UUID, key, or name). Implementation lives in
12
+ * `src/lib/label-list-runtime.ts`.
13
+ *
14
+ * Exports BOTH the default Command class AND a named `runLabelList(args)`
15
+ * function.
16
+ */
17
+ async function runLabelList(args) {
18
+ const runArgs = {
19
+ commandPath: "label list",
20
+ pretty: args.pretty,
21
+ handler: async (retryOpts) => {
22
+ const runtimeFlags = {};
23
+ if (args.workspace !== void 0) runtimeFlags.workspace = args.workspace;
24
+ if (args.fields !== void 0) runtimeFlags.fields = args.fields;
25
+ if (args.limit !== void 0) runtimeFlags.limit = args.limit;
26
+ if (args.cursor !== void 0) runtimeFlags.cursor = args.cursor;
27
+ if (args.team !== void 0) runtimeFlags.team = args.team;
28
+ const result = await labelListRuntime({
29
+ flags: runtimeFlags,
30
+ env: process.env,
31
+ retryOptsOverride: retryOpts
32
+ });
33
+ return {
34
+ data: result.data,
35
+ meta: result.meta
36
+ };
37
+ }
38
+ };
39
+ if (args.noMeta !== void 0) runArgs.noMeta = args.noMeta;
40
+ if (args.quiet !== void 0) runArgs.quiet = args.quiet;
41
+ if (args.retry !== void 0) runArgs.retry = args.retry;
42
+ return runCommand(runArgs);
43
+ }
44
+ var LabelList = class LabelList extends Command {
45
+ static description = "List Linear issue labels. Pass --team <UUID|key|name> to scope to one team.";
46
+ static enableJsonFlag = true;
47
+ static flags = {
48
+ ...BASE_FLAGS,
49
+ ...PAGINATION_FLAGS,
50
+ workspace: Flags.string({ description: "Workspace name (overrides active default and LINEAR_WORKSPACE)" }),
51
+ fields: Flags.string({
52
+ description: "Field preset (ids|defaults|full) or comma-separated list",
53
+ default: "defaults"
54
+ }),
55
+ team: Flags.string({ description: "Optional team filter (UUID, key, or name)" })
56
+ };
57
+ async run() {
58
+ const { flags } = await this.parse(LabelList);
59
+ const callArgs = { pretty: flags.pretty };
60
+ if (flags.workspace !== void 0) callArgs.workspace = flags.workspace;
61
+ if (flags.fields !== void 0) callArgs.fields = flags.fields;
62
+ if (flags.limit !== void 0) callArgs.limit = flags.limit;
63
+ if (flags.cursor !== void 0) callArgs.cursor = flags.cursor;
64
+ if (flags.team !== void 0) callArgs.team = flags.team;
65
+ if (flags.quiet !== void 0) callArgs.quiet = flags.quiet;
66
+ if (flags.noMeta !== void 0) callArgs.noMeta = flags.noMeta;
67
+ if (flags.retry !== void 0) callArgs.retry = flags.retry;
68
+ const out = await runLabelList(callArgs);
69
+ if (!flags.json) process.stdout.write(out.stdout);
70
+ if (out.stderr) process.stderr.write(out.stderr);
71
+ if (out.exitCode !== 0) process.exitCode = out.exitCode;
72
+ return JSON.parse(out.stdout);
73
+ }
74
+ };
75
+ //#endregion
76
+ export { LabelList as default, runLabelList };
@@ -0,0 +1,47 @@
1
+ import { BASE_FLAGS, runCommand } from "../lib/workspace-runtime.js";
2
+ import { listToolsRuntime } from "../lib/list-tools-runtime.js";
3
+ import { Command } from "@oclif/core";
4
+ //#region src/commands/list-tools.ts
5
+ /**
6
+ * `linmux list-tools` — Phase 4 PLAN 04-02, INT-01.
7
+ *
8
+ * Enumerates every curated and raw command, marking curated→raw mappings.
9
+ * Zero network calls — all data is assembled from static registries.
10
+ *
11
+ * Two-export pattern (S1): default oclif class + named `runListTools` wrapper.
12
+ */
13
+ async function runListTools(args) {
14
+ const runArgs = {
15
+ commandPath: "list-tools",
16
+ pretty: args.pretty,
17
+ handler: async (_retryOpts) => {
18
+ return {
19
+ data: (await listToolsRuntime({ flags: {} })).data,
20
+ meta: {}
21
+ };
22
+ }
23
+ };
24
+ if (args.noMeta !== void 0) runArgs.noMeta = args.noMeta;
25
+ if (args.quiet !== void 0) runArgs.quiet = args.quiet;
26
+ if (args.retry !== void 0) runArgs.retry = args.retry;
27
+ return runCommand(runArgs);
28
+ }
29
+ var ListTools = class ListTools extends Command {
30
+ static description = "Enumerate every curated and raw command with curated→raw mappings.";
31
+ static enableJsonFlag = true;
32
+ static flags = { ...BASE_FLAGS };
33
+ async run() {
34
+ const { flags } = await this.parse(ListTools);
35
+ const callArgs = { pretty: flags.pretty };
36
+ if (flags.quiet !== void 0) callArgs.quiet = flags.quiet;
37
+ if (flags.noMeta !== void 0) callArgs.noMeta = flags.noMeta;
38
+ if (flags.retry !== void 0) callArgs.retry = flags.retry;
39
+ const out = await runListTools(callArgs);
40
+ if (!flags.json) process.stdout.write(out.stdout);
41
+ if (out.stderr) process.stderr.write(out.stderr);
42
+ if (out.exitCode !== 0) process.exitCode = out.exitCode;
43
+ return JSON.parse(out.stdout);
44
+ }
45
+ };
46
+ //#endregion
47
+ export { ListTools as default, runListTools };
@@ -0,0 +1,71 @@
1
+ import { BASE_FLAGS, runCommand } from "../lib/workspace-runtime.js";
2
+ import { meRuntime } from "../lib/me-runtime.js";
3
+ import { Command, Flags } from "@oclif/core";
4
+ //#region src/commands/me.ts
5
+ /**
6
+ * `linmux me` -- Phase 2 PLAN 02-09 Task 1, WHO-01.
7
+ *
8
+ * Read command. Prints the resolved viewer (current user) and their
9
+ * organization for the active workspace. Shares `src/lib/me-runtime.ts`
10
+ * with `whoami` -- both commands emit IDENTICAL envelopes except for
11
+ * `meta.command` (`'me'` vs `'whoami'`). `whoami` exists purely for
12
+ * discoverability per CONTEXT § Specifics line 65.
13
+ *
14
+ * Exports BOTH the default Command class AND a named `runMe(args)`
15
+ * function.
16
+ */
17
+ async function runMe(args) {
18
+ const runArgs = {
19
+ commandPath: "me",
20
+ pretty: args.pretty,
21
+ handler: async (retryOpts) => {
22
+ const runtimeFlags = {};
23
+ if (args.workspace !== void 0) runtimeFlags.workspace = args.workspace;
24
+ if (args.fields !== void 0) runtimeFlags.fields = args.fields;
25
+ const meInput = {
26
+ flags: runtimeFlags,
27
+ env: process.env,
28
+ retryOptsOverride: retryOpts
29
+ };
30
+ if (args.loadConfigOverride !== void 0) meInput.loadConfigOverride = args.loadConfigOverride;
31
+ if (args.clientFactoryOverride !== void 0) meInput.clientFactoryOverride = args.clientFactoryOverride;
32
+ const result = await meRuntime(meInput);
33
+ return {
34
+ data: result.data,
35
+ meta: result.meta
36
+ };
37
+ }
38
+ };
39
+ if (args.noMeta !== void 0) runArgs.noMeta = args.noMeta;
40
+ if (args.quiet !== void 0) runArgs.quiet = args.quiet;
41
+ if (args.retry !== void 0) runArgs.retry = args.retry;
42
+ return runCommand(runArgs);
43
+ }
44
+ var Me = class Me extends Command {
45
+ static description = "Print the resolved viewer (user) and organization for the current workspace.";
46
+ static enableJsonFlag = true;
47
+ static flags = {
48
+ ...BASE_FLAGS,
49
+ workspace: Flags.string({ description: "Workspace name (overrides active default and LINEAR_WORKSPACE)" }),
50
+ fields: Flags.string({
51
+ description: "Field preset (ids|defaults|full) or comma-separated list",
52
+ default: "defaults"
53
+ })
54
+ };
55
+ async run() {
56
+ const { flags } = await this.parse(Me);
57
+ const callArgs = { pretty: flags.pretty };
58
+ if (flags.workspace !== void 0) callArgs.workspace = flags.workspace;
59
+ if (flags.fields !== void 0) callArgs.fields = flags.fields;
60
+ if (flags.quiet !== void 0) callArgs.quiet = flags.quiet;
61
+ if (flags.noMeta !== void 0) callArgs.noMeta = flags.noMeta;
62
+ if (flags.retry !== void 0) callArgs.retry = flags.retry;
63
+ const out = await runMe(callArgs);
64
+ if (!flags.json) process.stdout.write(out.stdout);
65
+ if (out.stderr) process.stderr.write(out.stderr);
66
+ if (out.exitCode !== 0) process.exitCode = out.exitCode;
67
+ return JSON.parse(out.stdout);
68
+ }
69
+ };
70
+ //#endregion
71
+ export { Me as default, runMe };
@@ -0,0 +1,101 @@
1
+ import { BASE_FLAGS, runCommand } from "../../lib/workspace-runtime.js";
2
+ import { projectCreateRuntime } from "../../lib/project-create-runtime.js";
3
+ import { Command, Flags } from "@oclif/core";
4
+ //#region src/commands/project/create.ts
5
+ /**
6
+ * `linmux project create` -- Phase 2 PLAN 02-07 Task 2, PRJ-01.create.
7
+ *
8
+ * Write command. Required: `--name` + `--teams` (comma-separated team
9
+ * keys/UUIDs/names; >=1). Optional: --description, --state, --lead,
10
+ * --start-date, --target-date.
11
+ *
12
+ * Implementation lives in `src/lib/project-create-runtime.ts` per the Phase 1
13
+ * PLAN-04 invariant. This file exports BOTH the oclif Command class AND a
14
+ * named `runProjectCreate(args)` async function so tests can call the runtime
15
+ * without spawning a subprocess.
16
+ */
17
+ async function runProjectCreate(args) {
18
+ const runArgs = {
19
+ commandPath: "project create",
20
+ pretty: args.pretty,
21
+ handler: async (retryOpts) => {
22
+ const runtimeFlags = {};
23
+ if (args.workspace !== void 0) runtimeFlags.workspace = args.workspace;
24
+ if (args.fields !== void 0) runtimeFlags.fields = args.fields;
25
+ if (args.allowActiveWorkspaceWrite !== void 0) runtimeFlags.allowActiveWorkspaceWrite = args.allowActiveWorkspaceWrite;
26
+ if (args.name !== void 0) runtimeFlags.name = args.name;
27
+ if (args.teams !== void 0) runtimeFlags.teams = args.teams;
28
+ if (args.description !== void 0) runtimeFlags.description = args.description;
29
+ if (args.state !== void 0) runtimeFlags.state = args.state;
30
+ if (args.lead !== void 0) runtimeFlags.lead = args.lead;
31
+ if (args.startDate !== void 0) runtimeFlags.startDate = args.startDate;
32
+ if (args.targetDate !== void 0) runtimeFlags.targetDate = args.targetDate;
33
+ const result = await projectCreateRuntime({
34
+ args: {},
35
+ flags: runtimeFlags,
36
+ env: process.env,
37
+ retryOptsOverride: retryOpts
38
+ });
39
+ return {
40
+ data: result.data,
41
+ meta: result.meta
42
+ };
43
+ }
44
+ };
45
+ if (args.noMeta !== void 0) runArgs.noMeta = args.noMeta;
46
+ if (args.quiet !== void 0) runArgs.quiet = args.quiet;
47
+ if (args.retry !== void 0) runArgs.retry = args.retry;
48
+ return runCommand(runArgs);
49
+ }
50
+ var ProjectCreate = class ProjectCreate extends Command {
51
+ static description = "Create a Linear project (--name + --teams required; --description, --state, --lead, --start-date, --target-date optional).";
52
+ static enableJsonFlag = true;
53
+ static flags = {
54
+ ...BASE_FLAGS,
55
+ workspace: Flags.string({ description: "Workspace name (overrides active default and LINEAR_WORKSPACE)" }),
56
+ "allow-active-workspace-write": Flags.boolean({ description: "Per-invocation opt-in to use the active default workspace for this write (WSP-06)" }),
57
+ fields: Flags.string({
58
+ description: "Field preset (ids|defaults|full) or comma-separated list",
59
+ default: "defaults"
60
+ }),
61
+ name: Flags.string({
62
+ required: true,
63
+ description: "Project name (required)"
64
+ }),
65
+ teams: Flags.string({
66
+ required: true,
67
+ description: "Comma-separated team keys (ENG), names (Engineering), or UUIDs; at least one required"
68
+ }),
69
+ description: Flags.string({ description: "Project description (markdown)" }),
70
+ state: Flags.string({ description: "Project state ('planned' | 'started' | 'paused' | 'completed' | 'canceled' | 'backlog')" }),
71
+ lead: Flags.string({ description: "\"me\", email, name, or user UUID" }),
72
+ "start-date": Flags.string({ description: "Project start date (ISO 8601, e.g. 2026-10-01)" }),
73
+ "target-date": Flags.string({ description: "Project target date (ISO 8601, e.g. 2026-12-31)" })
74
+ };
75
+ async run() {
76
+ const { flags } = await this.parse(ProjectCreate);
77
+ const callArgs = {
78
+ pretty: flags.pretty,
79
+ allowActiveWorkspaceWrite: flags["allow-active-workspace-write"]
80
+ };
81
+ if (flags.workspace !== void 0) callArgs.workspace = flags.workspace;
82
+ if (flags.fields !== void 0) callArgs.fields = flags.fields;
83
+ if (flags.name !== void 0) callArgs.name = flags.name;
84
+ if (flags.teams !== void 0) callArgs.teams = flags.teams;
85
+ if (flags.description !== void 0) callArgs.description = flags.description;
86
+ if (flags.state !== void 0) callArgs.state = flags.state;
87
+ if (flags.lead !== void 0) callArgs.lead = flags.lead;
88
+ if (flags["start-date"] !== void 0) callArgs.startDate = flags["start-date"];
89
+ if (flags["target-date"] !== void 0) callArgs.targetDate = flags["target-date"];
90
+ if (flags.quiet !== void 0) callArgs.quiet = flags.quiet;
91
+ if (flags.noMeta !== void 0) callArgs.noMeta = flags.noMeta;
92
+ if (flags.retry !== void 0) callArgs.retry = flags.retry;
93
+ const out = await runProjectCreate(callArgs);
94
+ if (!flags.json) process.stdout.write(out.stdout);
95
+ if (out.stderr) process.stderr.write(out.stderr);
96
+ if (out.exitCode !== 0) process.exitCode = out.exitCode;
97
+ return JSON.parse(out.stdout);
98
+ }
99
+ };
100
+ //#endregion
101
+ export { ProjectCreate as default, runProjectCreate };
@@ -0,0 +1,83 @@
1
+ import { BASE_FLAGS, runCommand } from "../../lib/workspace-runtime.js";
2
+ import { projectGetRuntime } from "../../lib/project-get-runtime.js";
3
+ import { Args, Command, Flags } from "@oclif/core";
4
+ //#region src/commands/project/get.ts
5
+ /**
6
+ * `linmux project get <ref>` -- Phase 2 PLAN 02-07 Task 1, PRJ-01.get.
7
+ *
8
+ * Single-entity read. Accepts a project name or UUID. UUIDs short-circuit
9
+ * resolveProjectId; names go through the workspace-scoped resolver from
10
+ * Plan 02-02. NO WSP-06 enforcement -- reads are allowed against the active
11
+ * default workspace.
12
+ *
13
+ * Implementation lives in `src/lib/project-get-runtime.ts` per the Phase 1
14
+ * PLAN-04 invariant. This file exports BOTH the oclif Command class AND a
15
+ * named `runProjectGet(args)` async function so tests can call the runtime
16
+ * without spawning a subprocess.
17
+ */
18
+ async function runProjectGet(args) {
19
+ const runArgs = {
20
+ commandPath: "project get",
21
+ pretty: args.pretty,
22
+ handler: async (retryOpts) => {
23
+ const runtimeFlags = {};
24
+ if (args.workspace !== void 0) runtimeFlags.workspace = args.workspace;
25
+ if (args.fields !== void 0) runtimeFlags.fields = args.fields;
26
+ if (args.include !== void 0) runtimeFlags.include = args.include;
27
+ const result = await projectGetRuntime({
28
+ args: { ref: args.ref },
29
+ flags: runtimeFlags,
30
+ env: process.env,
31
+ retryOptsOverride: retryOpts
32
+ });
33
+ return {
34
+ data: result.data,
35
+ meta: result.meta
36
+ };
37
+ }
38
+ };
39
+ if (args.noMeta !== void 0) runArgs.noMeta = args.noMeta;
40
+ if (args.quiet !== void 0) runArgs.quiet = args.quiet;
41
+ if (args.retry !== void 0) runArgs.retry = args.retry;
42
+ return runCommand(runArgs);
43
+ }
44
+ var ProjectGet = class ProjectGet extends Command {
45
+ static description = "Get a single Linear project by name or UUID.";
46
+ static enableJsonFlag = true;
47
+ static args = { ref: Args.string({
48
+ required: true,
49
+ description: "Project name or UUID"
50
+ }) };
51
+ static flags = {
52
+ ...BASE_FLAGS,
53
+ workspace: Flags.string({ description: "Workspace name (overrides active default and LINEAR_WORKSPACE)" }),
54
+ fields: Flags.string({
55
+ description: "Field preset (ids|defaults|full) or comma-separated list",
56
+ default: "defaults"
57
+ }),
58
+ include: Flags.string({
59
+ description: "Hydrate related entities in a single GraphQL round-trip (e.g. members, teams). Available: members, teams, projectMilestones, documents.",
60
+ multiple: true
61
+ })
62
+ };
63
+ async run() {
64
+ const { args, flags } = await this.parse(ProjectGet);
65
+ const callArgs = {
66
+ ref: args.ref,
67
+ pretty: flags.pretty
68
+ };
69
+ if (flags.workspace !== void 0) callArgs.workspace = flags.workspace;
70
+ if (flags.fields !== void 0) callArgs.fields = flags.fields;
71
+ if (flags.include !== void 0) callArgs.include = flags.include;
72
+ if (flags.quiet !== void 0) callArgs.quiet = flags.quiet;
73
+ if (flags.noMeta !== void 0) callArgs.noMeta = flags.noMeta;
74
+ if (flags.retry !== void 0) callArgs.retry = flags.retry;
75
+ const out = await runProjectGet(callArgs);
76
+ if (!flags.json) process.stdout.write(out.stdout);
77
+ if (out.stderr) process.stderr.write(out.stderr);
78
+ if (out.exitCode !== 0) process.exitCode = out.exitCode;
79
+ return JSON.parse(out.stdout);
80
+ }
81
+ };
82
+ //#endregion
83
+ export { ProjectGet as default, runProjectGet };
@@ -0,0 +1,75 @@
1
+ import { BASE_FLAGS, runCommand } from "../../lib/workspace-runtime.js";
2
+ import { PAGINATION_FLAGS } from "../../core/pagination/flags.js";
3
+ import "../../core/pagination/index.js";
4
+ import { projectListRuntime } from "../../lib/project-list-runtime.js";
5
+ import { Command, Flags } from "@oclif/core";
6
+ //#region src/commands/project/list.ts
7
+ /**
8
+ * `linmux project list` -- Phase 2 PLAN 02-07 Task 1, PRJ-01.list.
9
+ *
10
+ * Read command. Lists workspace-wide projects with --fields, --limit, and
11
+ * --cursor. NO WSP-06 enforcement -- reads are allowed against the active
12
+ * default workspace.
13
+ *
14
+ * Implementation lives in `src/lib/project-list-runtime.ts` per the Phase 1
15
+ * PLAN-04 invariant. This file exports BOTH the oclif Command class AND a
16
+ * named `runProjectList(args)` async function so tests can call the runtime
17
+ * without spawning a subprocess.
18
+ */
19
+ async function runProjectList(args) {
20
+ const runArgs = {
21
+ commandPath: "project list",
22
+ pretty: args.pretty,
23
+ handler: async (retryOpts) => {
24
+ const runtimeFlags = {};
25
+ if (args.workspace !== void 0) runtimeFlags.workspace = args.workspace;
26
+ if (args.fields !== void 0) runtimeFlags.fields = args.fields;
27
+ if (args.limit !== void 0) runtimeFlags.limit = args.limit;
28
+ if (args.cursor !== void 0) runtimeFlags.cursor = args.cursor;
29
+ const result = await projectListRuntime({
30
+ flags: runtimeFlags,
31
+ env: process.env,
32
+ retryOptsOverride: retryOpts
33
+ });
34
+ return {
35
+ data: result.data,
36
+ meta: result.meta
37
+ };
38
+ }
39
+ };
40
+ if (args.noMeta !== void 0) runArgs.noMeta = args.noMeta;
41
+ if (args.quiet !== void 0) runArgs.quiet = args.quiet;
42
+ if (args.retry !== void 0) runArgs.retry = args.retry;
43
+ return runCommand(runArgs);
44
+ }
45
+ var ProjectList = class ProjectList extends Command {
46
+ static description = "List Linear projects in the active workspace, with --fields, --limit, --cursor.";
47
+ static enableJsonFlag = true;
48
+ static flags = {
49
+ ...BASE_FLAGS,
50
+ ...PAGINATION_FLAGS,
51
+ workspace: Flags.string({ description: "Workspace name (overrides active default and LINEAR_WORKSPACE)" }),
52
+ fields: Flags.string({
53
+ description: "Field preset (ids|defaults|full) or comma-separated list",
54
+ default: "defaults"
55
+ })
56
+ };
57
+ async run() {
58
+ const { flags } = await this.parse(ProjectList);
59
+ const callArgs = { pretty: flags.pretty };
60
+ if (flags.workspace !== void 0) callArgs.workspace = flags.workspace;
61
+ if (flags.fields !== void 0) callArgs.fields = flags.fields;
62
+ if (flags.limit !== void 0) callArgs.limit = flags.limit;
63
+ if (flags.cursor !== void 0) callArgs.cursor = flags.cursor;
64
+ if (flags.quiet !== void 0) callArgs.quiet = flags.quiet;
65
+ if (flags.noMeta !== void 0) callArgs.noMeta = flags.noMeta;
66
+ if (flags.retry !== void 0) callArgs.retry = flags.retry;
67
+ const out = await runProjectList(callArgs);
68
+ if (!flags.json) process.stdout.write(out.stdout);
69
+ if (out.stderr) process.stderr.write(out.stderr);
70
+ if (out.exitCode !== 0) process.exitCode = out.exitCode;
71
+ return JSON.parse(out.stdout);
72
+ }
73
+ };
74
+ //#endregion
75
+ export { ProjectList as default, runProjectList };
@@ -0,0 +1,99 @@
1
+ import { BASE_FLAGS, runCommand } from "../../lib/workspace-runtime.js";
2
+ import { projectUpdateStatusRuntime } from "../../lib/project-update-status-runtime.js";
3
+ import { Args, Command, Flags } from "@oclif/core";
4
+ //#region src/commands/project/update-status.ts
5
+ /**
6
+ * `linmux project update-status <ref> <status>` --
7
+ * Phase 2 PLAN 02-07 Task 2, PRJ-01.update-status.
8
+ *
9
+ * **Multi-word command file**: oclif resolves
10
+ * `src/commands/project/update-status.ts` to `linmux project update-status`
11
+ * (filename-to-command separator is space; the dash inside the filename is
12
+ * preserved verbatim per RESEARCH 02-07 line 252).
13
+ *
14
+ * Sets a project's CURRENT status by calling
15
+ * `client.updateProject(projectId, { statusId })`. The SDK's status-
16
+ * DEFINITION mutator (an admin operation that would rename / recolor /
17
+ * reposition the status row workspace-wide) is explicitly NOT called from
18
+ * this code path -- see RESEARCH § Pitfall 5. The runtime file's header
19
+ * documents the trap; this command is the agent-meaningful "set this
20
+ * project to <status>" path.
21
+ *
22
+ * Implementation lives in `src/lib/project-update-status-runtime.ts` per the
23
+ * Phase 1 PLAN-04 invariant. This file exports BOTH the oclif Command class
24
+ * AND a named `runProjectUpdateStatus(args)` async function so tests can call
25
+ * the runtime without spawning a subprocess.
26
+ */
27
+ async function runProjectUpdateStatus(args) {
28
+ const runArgs = {
29
+ commandPath: "project update-status",
30
+ pretty: args.pretty,
31
+ handler: async (retryOpts) => {
32
+ const runtimeFlags = {};
33
+ if (args.workspace !== void 0) runtimeFlags.workspace = args.workspace;
34
+ if (args.fields !== void 0) runtimeFlags.fields = args.fields;
35
+ if (args.allowActiveWorkspaceWrite !== void 0) runtimeFlags.allowActiveWorkspaceWrite = args.allowActiveWorkspaceWrite;
36
+ const result = await projectUpdateStatusRuntime({
37
+ args: {
38
+ ref: args.ref,
39
+ status: args.status
40
+ },
41
+ flags: runtimeFlags,
42
+ env: process.env,
43
+ retryOptsOverride: retryOpts
44
+ });
45
+ return {
46
+ data: result.data,
47
+ meta: result.meta
48
+ };
49
+ }
50
+ };
51
+ if (args.noMeta !== void 0) runArgs.noMeta = args.noMeta;
52
+ if (args.quiet !== void 0) runArgs.quiet = args.quiet;
53
+ if (args.retry !== void 0) runArgs.retry = args.retry;
54
+ return runCommand(runArgs);
55
+ }
56
+ var ProjectUpdateStatus = class ProjectUpdateStatus extends Command {
57
+ static description = "Set a Linear project's current status (e.g. \"On Track\" -> \"At Risk\"). Calls updateProject({ statusId }); does NOT mutate the workspace-level status definition.";
58
+ static enableJsonFlag = true;
59
+ static args = {
60
+ ref: Args.string({
61
+ required: true,
62
+ description: "Project name or UUID"
63
+ }),
64
+ status: Args.string({
65
+ required: true,
66
+ description: "Status name (e.g. \"At Risk\") or UUID"
67
+ })
68
+ };
69
+ static flags = {
70
+ ...BASE_FLAGS,
71
+ workspace: Flags.string({ description: "Workspace name (overrides active default and LINEAR_WORKSPACE)" }),
72
+ "allow-active-workspace-write": Flags.boolean({ description: "Per-invocation opt-in to use the active default workspace for this write (WSP-06)" }),
73
+ fields: Flags.string({
74
+ description: "Field preset (ids|defaults|full) or comma-separated list",
75
+ default: "defaults"
76
+ })
77
+ };
78
+ async run() {
79
+ const { args, flags } = await this.parse(ProjectUpdateStatus);
80
+ const callArgs = {
81
+ ref: args.ref,
82
+ status: args.status,
83
+ pretty: flags.pretty,
84
+ allowActiveWorkspaceWrite: flags["allow-active-workspace-write"]
85
+ };
86
+ if (flags.workspace !== void 0) callArgs.workspace = flags.workspace;
87
+ if (flags.fields !== void 0) callArgs.fields = flags.fields;
88
+ if (flags.quiet !== void 0) callArgs.quiet = flags.quiet;
89
+ if (flags.noMeta !== void 0) callArgs.noMeta = flags.noMeta;
90
+ if (flags.retry !== void 0) callArgs.retry = flags.retry;
91
+ const out = await runProjectUpdateStatus(callArgs);
92
+ if (!flags.json) process.stdout.write(out.stdout);
93
+ if (out.stderr) process.stderr.write(out.stderr);
94
+ if (out.exitCode !== 0) process.exitCode = out.exitCode;
95
+ return JSON.parse(out.stdout);
96
+ }
97
+ };
98
+ //#endregion
99
+ export { ProjectUpdateStatus as default, runProjectUpdateStatus };
@@ -0,0 +1,99 @@
1
+ import { BASE_FLAGS, runCommand } from "../../lib/workspace-runtime.js";
2
+ import { projectUpdateRuntime } from "../../lib/project-update-runtime.js";
3
+ import { Args, Command, Flags } from "@oclif/core";
4
+ //#region src/commands/project/update.ts
5
+ /**
6
+ * `linmux project update <ref>` -- Phase 2 PLAN 02-07 Task 2,
7
+ * PRJ-01.update.
8
+ *
9
+ * Write command. Resolves a project ref (name or UUID) and applies any subset
10
+ * of partial field flags via `client.updateProject`. WSP-06 enforcement and
11
+ * VALIDATION_NO_FIELDS guard both run BEFORE any SDK call.
12
+ *
13
+ * NOTE: To change a project's CURRENT status, use the dedicated
14
+ * `linmux project update-status <ref> <status>` sub-command -- it
15
+ * routes through the same `updateProject({ statusId })` mutation, but the
16
+ * dedicated command keeps the load-bearing operation discoverable + the input
17
+ * shape un-ambiguous (per RESEARCH § Pitfall 5).
18
+ */
19
+ async function runProjectUpdate(args) {
20
+ const runArgs = {
21
+ commandPath: "project update",
22
+ pretty: args.pretty,
23
+ handler: async (retryOpts) => {
24
+ const runtimeFlags = {};
25
+ if (args.workspace !== void 0) runtimeFlags.workspace = args.workspace;
26
+ if (args.fields !== void 0) runtimeFlags.fields = args.fields;
27
+ if (args.allowActiveWorkspaceWrite !== void 0) runtimeFlags.allowActiveWorkspaceWrite = args.allowActiveWorkspaceWrite;
28
+ if (args.name !== void 0) runtimeFlags.name = args.name;
29
+ if (args.description !== void 0) runtimeFlags.description = args.description;
30
+ if (args.state !== void 0) runtimeFlags.state = args.state;
31
+ if (args.lead !== void 0) runtimeFlags.lead = args.lead;
32
+ if (args.startDate !== void 0) runtimeFlags.startDate = args.startDate;
33
+ if (args.targetDate !== void 0) runtimeFlags.targetDate = args.targetDate;
34
+ const result = await projectUpdateRuntime({
35
+ args: { ref: args.ref },
36
+ flags: runtimeFlags,
37
+ env: process.env,
38
+ retryOptsOverride: retryOpts
39
+ });
40
+ return {
41
+ data: result.data,
42
+ meta: result.meta
43
+ };
44
+ }
45
+ };
46
+ if (args.noMeta !== void 0) runArgs.noMeta = args.noMeta;
47
+ if (args.quiet !== void 0) runArgs.quiet = args.quiet;
48
+ if (args.retry !== void 0) runArgs.retry = args.retry;
49
+ return runCommand(runArgs);
50
+ }
51
+ var ProjectUpdate = class ProjectUpdate extends Command {
52
+ static description = "Update a Linear project. At least one field flag is required. Use `project update-status` to change the project's current status.";
53
+ static enableJsonFlag = true;
54
+ static args = { ref: Args.string({
55
+ required: true,
56
+ description: "Project name or UUID"
57
+ }) };
58
+ static flags = {
59
+ ...BASE_FLAGS,
60
+ workspace: Flags.string({ description: "Workspace name (overrides active default and LINEAR_WORKSPACE)" }),
61
+ "allow-active-workspace-write": Flags.boolean({ description: "Per-invocation opt-in to use the active default workspace for this write (WSP-06)" }),
62
+ fields: Flags.string({
63
+ description: "Field preset (ids|defaults|full) or comma-separated list",
64
+ default: "defaults"
65
+ }),
66
+ name: Flags.string({ description: "New project name" }),
67
+ description: Flags.string({ description: "New project description (markdown). Pass \"\" to clear." }),
68
+ state: Flags.string({ description: "Project state ('planned' | 'started' | 'paused' | 'completed' | 'canceled' | 'backlog')" }),
69
+ lead: Flags.string({ description: "\"me\", email, name, or user UUID" }),
70
+ "start-date": Flags.string({ description: "Project start date (ISO 8601, e.g. 2026-10-01)" }),
71
+ "target-date": Flags.string({ description: "Project target date (ISO 8601, e.g. 2026-12-31)" })
72
+ };
73
+ async run() {
74
+ const { args, flags } = await this.parse(ProjectUpdate);
75
+ const callArgs = {
76
+ ref: args.ref,
77
+ pretty: flags.pretty,
78
+ allowActiveWorkspaceWrite: flags["allow-active-workspace-write"]
79
+ };
80
+ if (flags.workspace !== void 0) callArgs.workspace = flags.workspace;
81
+ if (flags.fields !== void 0) callArgs.fields = flags.fields;
82
+ if (flags.name !== void 0) callArgs.name = flags.name;
83
+ if (flags.description !== void 0) callArgs.description = flags.description;
84
+ if (flags.state !== void 0) callArgs.state = flags.state;
85
+ if (flags.lead !== void 0) callArgs.lead = flags.lead;
86
+ if (flags["start-date"] !== void 0) callArgs.startDate = flags["start-date"];
87
+ if (flags["target-date"] !== void 0) callArgs.targetDate = flags["target-date"];
88
+ if (flags.quiet !== void 0) callArgs.quiet = flags.quiet;
89
+ if (flags.noMeta !== void 0) callArgs.noMeta = flags.noMeta;
90
+ if (flags.retry !== void 0) callArgs.retry = flags.retry;
91
+ const out = await runProjectUpdate(callArgs);
92
+ if (!flags.json) process.stdout.write(out.stdout);
93
+ if (out.stderr) process.stderr.write(out.stderr);
94
+ if (out.exitCode !== 0) process.exitCode = out.exitCode;
95
+ return JSON.parse(out.stdout);
96
+ }
97
+ };
98
+ //#endregion
99
+ export { ProjectUpdate as default, runProjectUpdate };