orbitmap 0.4.2 → 0.4.3
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/README.md +60 -13
- package/dist/adapters/cloud.d.ts +53 -21
- package/dist/adapters/cloud.js +95 -29
- package/dist/adapters/cloud.js.map +1 -1
- package/dist/adapters/factory.d.ts +3 -0
- package/dist/adapters/factory.js +8 -1
- package/dist/adapters/factory.js.map +1 -1
- package/dist/adapters/local/adapter.d.ts +0 -20
- package/dist/adapters/local/adapter.js +0 -18
- package/dist/adapters/local/adapter.js.map +1 -1
- package/dist/adapters/local/context.d.ts +1 -1
- package/dist/adapters/local/context.js +10 -2
- package/dist/adapters/local/context.js.map +1 -1
- package/dist/adapters/local/entities/tasks.d.ts +9 -1
- package/dist/adapters/local/entities/tasks.js +47 -5
- package/dist/adapters/local/entities/tasks.js.map +1 -1
- package/dist/adapters/local/entities/work-items.d.ts +14 -30
- package/dist/adapters/local/entities/work-items.js +63 -47
- package/dist/adapters/local/entities/work-items.js.map +1 -1
- package/dist/adapters/local/rules.d.ts +4 -4
- package/dist/adapters/local/rules.js +4 -19
- package/dist/adapters/local/rules.js.map +1 -1
- package/dist/adapters/local/shapes.d.ts +27 -7
- package/dist/adapters/local/shapes.js +41 -5
- package/dist/adapters/local/shapes.js.map +1 -1
- package/dist/adapters/local/store.d.ts +55 -6
- package/dist/adapters/local/store.js +122 -8
- package/dist/adapters/local/store.js.map +1 -1
- package/dist/adapters/local/types.d.ts +9 -2
- package/dist/adapters/local/types.js +9 -2
- package/dist/adapters/local/types.js.map +1 -1
- package/dist/adapters/types.d.ts +7 -20
- package/dist/agent-instructions.d.ts +21 -8
- package/dist/agent-instructions.js +91 -35
- package/dist/agent-instructions.js.map +1 -1
- package/dist/area-directories.d.ts +75 -0
- package/dist/area-directories.js +162 -0
- package/dist/area-directories.js.map +1 -0
- package/dist/area-grouping.d.ts +55 -0
- package/dist/area-grouping.js +72 -0
- package/dist/area-grouping.js.map +1 -0
- package/dist/commands/areas.js +30 -2
- package/dist/commands/areas.js.map +1 -1
- package/dist/commands/assign.d.ts +1 -0
- package/dist/commands/assign.js +2 -0
- package/dist/commands/assign.js.map +1 -1
- package/dist/commands/context.d.ts +95 -0
- package/dist/commands/context.js +104 -2
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/create.d.ts +1 -0
- package/dist/commands/create.js +19 -14
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dep.js +5 -8
- package/dist/commands/dep.js.map +1 -1
- package/dist/commands/doc-import.d.ts +1 -0
- package/dist/commands/doc-import.js +8 -26
- package/dist/commands/doc-import.js.map +1 -1
- package/dist/commands/doc-patch.js +16 -52
- package/dist/commands/doc-patch.js.map +1 -1
- package/dist/commands/doc-share.js +4 -0
- package/dist/commands/doc-share.js.map +1 -1
- package/dist/commands/doc-update.js +4 -8
- package/dist/commands/doc-update.js.map +1 -1
- package/dist/commands/doc.js +7 -12
- package/dist/commands/doc.js.map +1 -1
- package/dist/commands/docs-cache.js +23 -10
- package/dist/commands/docs-cache.js.map +1 -1
- package/dist/commands/docs.js +29 -10
- package/dist/commands/docs.js.map +1 -1
- package/dist/commands/get.js +4 -10
- package/dist/commands/get.js.map +1 -1
- package/dist/commands/ideas.d.ts +3 -1
- package/dist/commands/ideas.js +26 -49
- package/dist/commands/ideas.js.map +1 -1
- package/dist/commands/init.d.ts +24 -1
- package/dist/commands/init.js +0 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/intent.js +10 -14
- package/dist/commands/intent.js.map +1 -1
- package/dist/commands/issues.d.ts +3 -1
- package/dist/commands/issues.js +47 -72
- package/dist/commands/issues.js.map +1 -1
- package/dist/commands/log.d.ts +1 -0
- package/dist/commands/log.js +18 -17
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/mission.js +3 -12
- package/dist/commands/mission.js.map +1 -1
- package/dist/commands/orbit.d.ts +7 -1
- package/dist/commands/orbit.js +13 -24
- package/dist/commands/orbit.js.map +1 -1
- package/dist/commands/setup-agent.d.ts +97 -4
- package/dist/commands/setup-agent.js +265 -38
- package/dist/commands/setup-agent.js.map +1 -1
- package/dist/commands/setup-mcp.d.ts +2 -0
- package/dist/commands/setup-mcp.js +17 -40
- package/dist/commands/setup-mcp.js.map +1 -1
- package/dist/commands/start.d.ts +43 -0
- package/dist/commands/start.js +158 -3
- package/dist/commands/start.js.map +1 -1
- package/dist/commands/status.d.ts +1 -0
- package/dist/commands/status.js +5 -15
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/subtask.d.ts +1 -0
- package/dist/commands/subtask.js +9 -2
- package/dist/commands/subtask.js.map +1 -1
- package/dist/commands/task-edit-content.js +4 -8
- package/dist/commands/task-edit-content.js.map +1 -1
- package/dist/commands/task.d.ts +7 -0
- package/dist/commands/task.js +5 -2
- package/dist/commands/task.js.map +1 -1
- package/dist/commands/tasks.d.ts +35 -0
- package/dist/commands/tasks.js +45 -9
- package/dist/commands/tasks.js.map +1 -1
- package/dist/commands/vibes.d.ts +3 -1
- package/dist/commands/vibes.js +41 -31
- package/dist/commands/vibes.js.map +1 -1
- package/dist/config.d.ts +11 -0
- package/dist/config.js +14 -1
- package/dist/config.js.map +1 -1
- package/dist/doc-cache.d.ts +74 -5
- package/dist/doc-cache.js +106 -22
- package/dist/doc-cache.js.map +1 -1
- package/dist/enums.d.ts +26 -0
- package/dist/enums.js +53 -0
- package/dist/enums.js.map +1 -0
- package/dist/errors.d.ts +67 -0
- package/dist/errors.js +82 -0
- package/dist/errors.js.map +1 -1
- package/dist/index.js +134 -56
- package/dist/index.js.map +1 -1
- package/dist/mcp-config.d.ts +42 -1
- package/dist/mcp-config.js +82 -2
- package/dist/mcp-config.js.map +1 -1
- package/dist/oauth.js +10 -10
- package/dist/output.d.ts +12 -0
- package/dist/output.js +39 -1
- package/dist/output.js.map +1 -1
- package/dist/paths.d.ts +40 -0
- package/dist/paths.js +174 -9
- package/dist/paths.js.map +1 -1
- package/dist/project-config.d.ts +42 -1
- package/dist/project-config.js +51 -0
- package/dist/project-config.js.map +1 -1
- package/dist/workspace-resolve.d.ts +179 -9
- package/dist/workspace-resolve.js +288 -20
- package/dist/workspace-resolve.js.map +1 -1
- package/dist/write-target.d.ts +56 -0
- package/dist/write-target.js +170 -0
- package/dist/write-target.js.map +1 -0
- package/package.json +1 -1
- package/dist/commands/create-project.d.ts +0 -6
- package/dist/commands/create-project.js +0 -28
- package/dist/commands/create-project.js.map +0 -1
- package/dist/commands/projects.d.ts +0 -3
- package/dist/commands/projects.js +0 -28
- package/dist/commands/projects.js.map +0 -1
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
1
|
import readline from 'node:readline';
|
|
4
2
|
import { validateProfile } from '../oauth.js';
|
|
5
3
|
import { ensureGitignore } from '../doc-cache.js';
|
|
6
|
-
import { buildOrbitmapBlock, maskBlockForPrint, MCP_FILE, } from '../mcp-config.js';
|
|
4
|
+
import { buildOrbitmapBlock, maskBlockForPrint, upsertMcpServerBlock, MCP_FILE, } from '../mcp-config.js';
|
|
7
5
|
async function prompt(question, defaultValue) {
|
|
8
6
|
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
9
7
|
return new Promise((resolve) => {
|
|
@@ -52,27 +50,6 @@ async function promptAuthMethod() {
|
|
|
52
50
|
console.log('Please enter 1 or 2.');
|
|
53
51
|
}
|
|
54
52
|
}
|
|
55
|
-
function loadMcpConfig(filePath) {
|
|
56
|
-
if (!fs.existsSync(filePath)) {
|
|
57
|
-
return { config: { mcpServers: {} }, existed: false };
|
|
58
|
-
}
|
|
59
|
-
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
60
|
-
let parsed;
|
|
61
|
-
try {
|
|
62
|
-
parsed = JSON.parse(raw);
|
|
63
|
-
}
|
|
64
|
-
catch (e) {
|
|
65
|
-
throw new Error(`Failed to parse ${filePath}: ${e.message}`);
|
|
66
|
-
}
|
|
67
|
-
if (typeof parsed !== 'object' || parsed === null || Array.isArray(parsed)) {
|
|
68
|
-
throw new Error(`${filePath} does not contain a JSON object.`);
|
|
69
|
-
}
|
|
70
|
-
const config = parsed;
|
|
71
|
-
if (typeof config.mcpServers !== 'object' || config.mcpServers === null || Array.isArray(config.mcpServers)) {
|
|
72
|
-
config.mcpServers = {};
|
|
73
|
-
}
|
|
74
|
-
return { config, existed: true };
|
|
75
|
-
}
|
|
76
53
|
export async function setupMcpCommand(options = {}) {
|
|
77
54
|
if (options.token && options.oauth) {
|
|
78
55
|
console.error('Error: --token and --oauth are mutually exclusive.');
|
|
@@ -110,50 +87,50 @@ export async function setupMcpCommand(options = {}) {
|
|
|
110
87
|
}
|
|
111
88
|
}
|
|
112
89
|
}
|
|
113
|
-
|
|
114
|
-
|
|
90
|
+
// The context the block pins is the workspace; an area is only ever written when the user
|
|
91
|
+
// asked for one explicitly (`--area`). Prompting happens only when neither was given, so a
|
|
92
|
+
// scripted `--area`-only invocation keeps producing exactly the block it always did.
|
|
93
|
+
const areaSlug = options.area || '';
|
|
94
|
+
let workspace = options.workspaceId || '';
|
|
95
|
+
if (!workspace && !areaSlug) {
|
|
115
96
|
if (authMode === 'token') {
|
|
116
|
-
|
|
117
|
-
if (!
|
|
118
|
-
console.error('Error:
|
|
97
|
+
workspace = await prompt('Workspace (slug or UUID)');
|
|
98
|
+
if (!workspace) {
|
|
99
|
+
console.error('Error: Workspace is required for API key auth.');
|
|
119
100
|
process.exitCode = 1;
|
|
120
101
|
return;
|
|
121
102
|
}
|
|
122
103
|
}
|
|
123
104
|
else {
|
|
124
|
-
|
|
105
|
+
workspace = await prompt('Workspace (slug or UUID, optional, press Enter to skip)');
|
|
125
106
|
}
|
|
126
107
|
}
|
|
127
108
|
const block = buildOrbitmapBlock({
|
|
128
109
|
profile,
|
|
129
110
|
token,
|
|
111
|
+
workspace: workspace || undefined,
|
|
130
112
|
areaSlug: areaSlug || undefined,
|
|
131
113
|
});
|
|
132
114
|
const cwd = process.cwd();
|
|
133
|
-
|
|
134
|
-
let config;
|
|
135
|
-
let existed;
|
|
115
|
+
let written;
|
|
136
116
|
try {
|
|
137
|
-
|
|
117
|
+
written = upsertMcpServerBlock(cwd, block);
|
|
138
118
|
}
|
|
139
119
|
catch (error) {
|
|
140
120
|
console.error(error.message);
|
|
141
121
|
process.exitCode = 1;
|
|
142
122
|
return;
|
|
143
123
|
}
|
|
144
|
-
|
|
145
|
-
config.mcpServers = { ...config.mcpServers, orbitmap: block };
|
|
146
|
-
fs.writeFileSync(mcpFilePath, JSON.stringify(config, null, 2) + '\n', 'utf-8');
|
|
147
|
-
if (replaced) {
|
|
124
|
+
if (written.replaced) {
|
|
148
125
|
console.log('replaced existing orbitmap entry');
|
|
149
126
|
}
|
|
150
|
-
else if (
|
|
127
|
+
else if (!written.created) {
|
|
151
128
|
console.log(`Updated ${MCP_FILE} (added orbitmap entry).`);
|
|
152
129
|
}
|
|
153
130
|
else {
|
|
154
131
|
console.log(`Created ${MCP_FILE} with orbitmap entry.`);
|
|
155
132
|
}
|
|
156
|
-
console.log(`\nFile: ${
|
|
133
|
+
console.log(`\nFile: ${written.file}`);
|
|
157
134
|
console.log(`Profile: ${profile} | URL: ${block.url}`);
|
|
158
135
|
console.log('\n"orbitmap": ' + JSON.stringify(maskBlockForPrint(block), null, 2));
|
|
159
136
|
if (authMode === 'token') {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/commands/setup-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"setup-mcp.js","sourceRoot":"","sources":["../../src/commands/setup-mcp.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,eAAe,EAAgB,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,QAAQ,GAET,MAAM,kBAAkB,CAAC;AAE1B,KAAK,UAAU,MAAM,CAAC,QAAgB,EAAE,YAAqB;IAC3D,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,MAAM,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YAC/C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,YAAY,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,QAAgB;IAC1C,MAAM,EAAE,GAAG,QAAQ,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAEtF,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,GAAG,QAAQ,IAAI,EAAE,CAAC,MAAM,EAAE,EAAE;YACtC,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAC5D,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CACtB,KAA0B,EAC1B,YAA8D,EAC9D,EAAiC,EACxB,EAAE;gBACX,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,GAAG,QAAQ,IAAI,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;oBACjG,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,IAAI,OAAO,YAAY,KAAK,UAAU,EAAE,CAAC;oBACvC,OAAO,SAAS,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;gBACxC,CAAC;gBACD,OAAO,SAAS,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAC5C,CAAC,CAAgC,CAAC;YAElC,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,GAAG,SAAS,CAAC;gBACjC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAE1B,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAC5C,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,OAAO,CAAC;QACnC,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,OAAO,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAOlC,EAAE;IACJ,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,GAAY,MAAM,CAAC;IAC9B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC;YACH,OAAO,GAAG,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC7C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;YACrB,OAAO;QACT,CAAC;IACH,CAAC;IAED,IAAI,QAA2B,CAAC;IAChC,IAAI,KAAyB,CAAC;IAE9B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,QAAQ,GAAG,OAAO,CAAC;QACnB,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IACxB,CAAC;SAAM,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QACzB,QAAQ,GAAG,OAAO,CAAC;IACrB,CAAC;SAAM,CAAC;QACN,QAAQ,GAAG,MAAM,gBAAgB,EAAE,CAAC;QACpC,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,KAAK,GAAG,MAAM,YAAY,CAAC,eAAe,CAAC,CAAC;YAC5C,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;gBACnD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;IAED,0FAA0F;IAC1F,2FAA2F;IAC3F,qFAAqF;IACrF,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC;IACpC,IAAI,SAAS,GAAG,OAAO,CAAC,WAAW,IAAI,EAAE,CAAC;IAE1C,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;YACzB,SAAS,GAAG,MAAM,MAAM,CAAC,0BAA0B,CAAC,CAAC;YACrD,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,KAAK,CAAC,gDAAgD,CAAC,CAAC;gBAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;gBACrB,OAAO;YACT,CAAC;QACH,CAAC;aAAM,CAAC;YACN,SAAS,GAAG,MAAM,MAAM,CAAC,yDAAyD,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,kBAAkB,CAAC;QAC/B,OAAO;QACP,KAAK;QACL,SAAS,EAAE,SAAS,IAAI,SAAS;QACjC,QAAQ,EAAE,QAAQ,IAAI,SAAS;KAChC,CAAC,CAAC;IAEH,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAE1B,IAAI,OAAuB,CAAC;IAC5B,IAAI,CAAC;QACH,OAAO,GAAG,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC7C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,0BAA0B,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,WAAW,QAAQ,uBAAuB,CAAC,CAAC;IAC1D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACvC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,WAAW,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,SAAS,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAElF,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,mFAAmF;QACnF,iFAAiF;QACjF,2EAA2E;QAC3E,oFAAoF;QACpF,8EAA8E;QAC9E,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;QAC/C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,OAAO,CAAC,GAAG,CAAC,SAAS,QAAQ,8CAA8C,CAAC,CAAC;QAC/E,CAAC;IACH,CAAC;AACH,CAAC"}
|
package/dist/commands/start.d.ts
CHANGED
|
@@ -1,4 +1,47 @@
|
|
|
1
|
+
import type { WorkspaceAdapter } from '../adapters/types.js';
|
|
2
|
+
/** Why this task, in a shape an agent can branch on as well as print. */
|
|
3
|
+
export interface WorkSelection {
|
|
4
|
+
basis: 'mission' | 'intent' | 'priority';
|
|
5
|
+
reason: string;
|
|
6
|
+
task: string;
|
|
7
|
+
area?: string | null;
|
|
8
|
+
mission?: {
|
|
9
|
+
id?: string;
|
|
10
|
+
number?: string;
|
|
11
|
+
name: string;
|
|
12
|
+
} | null;
|
|
13
|
+
intent?: {
|
|
14
|
+
id?: string;
|
|
15
|
+
number?: string;
|
|
16
|
+
name: string;
|
|
17
|
+
} | null;
|
|
18
|
+
}
|
|
1
19
|
export declare function startCommand(taskId: string | undefined, options: {
|
|
2
20
|
json: boolean;
|
|
3
21
|
area?: string;
|
|
4
22
|
}): Promise<void>;
|
|
23
|
+
/** What `orbitmap start` (with no argument) concluded before touching anything. */
|
|
24
|
+
export type WorkOutcome = {
|
|
25
|
+
kind: 'selected';
|
|
26
|
+
selection: WorkSelection;
|
|
27
|
+
}
|
|
28
|
+
/** Nothing startable — with everything needed to say where we looked. */
|
|
29
|
+
| {
|
|
30
|
+
kind: 'nothing';
|
|
31
|
+
workspace: string | null;
|
|
32
|
+
areas: string[];
|
|
33
|
+
scope: string;
|
|
34
|
+
}
|
|
35
|
+
/** The lookups themselves failed; the caller decides whether that is fatal. */
|
|
36
|
+
| {
|
|
37
|
+
kind: 'lookup-failed';
|
|
38
|
+
error: unknown;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Decide what to work on, plan first: active mission → open intent → priority order.
|
|
42
|
+
*
|
|
43
|
+
* Reads only (`GET /tasks` + `GET /context`), so a caller may discard the answer. Both calls
|
|
44
|
+
* are made with whatever scope the adapter resolved — at the workspace root that is the
|
|
45
|
+
* workspace-wide listing, which is exactly the pool this command should be choosing from.
|
|
46
|
+
*/
|
|
47
|
+
export declare function planWork(client: WorkspaceAdapter): Promise<WorkOutcome>;
|
package/dist/commands/start.js
CHANGED
|
@@ -1,11 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `orbitmap start [task]`.
|
|
3
|
+
*
|
|
4
|
+
* With a task reference nothing changed. Without one the CLI no longer takes "the next task
|
|
5
|
+
* in the queue" as the answer (TS-jt6q36): what an agent should work on comes from the
|
|
6
|
+
* *plan* — the active mission first, then the open intents, and only then raw priority
|
|
7
|
+
* order. One `GET /context` (which now carries `active_mission` and `open_intents`) plus the
|
|
8
|
+
* task listing is enough to decide, and the choice is always explained, because a pick an
|
|
9
|
+
* agent cannot justify is a pick it cannot argue with.
|
|
10
|
+
*/
|
|
1
11
|
import { createAdapter } from '../adapters/factory.js';
|
|
12
|
+
import { confirmWriteTarget } from '../write-target.js';
|
|
2
13
|
import { formatOutput, printError } from '../output.js';
|
|
3
14
|
import { printTaskDetail } from './task.js';
|
|
4
|
-
import { cleanupCache } from '../doc-cache.js';
|
|
15
|
+
import { cleanupCache, resolveDocCache } from '../doc-cache.js';
|
|
5
16
|
export async function startCommand(taskId, options) {
|
|
6
17
|
try {
|
|
18
|
+
await confirmWriteTarget('start task', options, 'existing');
|
|
7
19
|
const client = await createAdapter(options.area);
|
|
8
|
-
|
|
20
|
+
let selection;
|
|
21
|
+
if (!taskId) {
|
|
22
|
+
const outcome = await planWork(client);
|
|
23
|
+
if (outcome.kind === 'selected') {
|
|
24
|
+
selection = outcome.selection;
|
|
25
|
+
}
|
|
26
|
+
else if (!(await client.getDefaultArea())) {
|
|
27
|
+
// No area resolved anywhere: `POST /tasks/start` is area-scoped, so handing the pick
|
|
28
|
+
// back to the server here could only produce AREA_CONTEXT_REQUIRED — the very error
|
|
29
|
+
// this command was supposed to stop producing at the workspace root. Either we know
|
|
30
|
+
// why nothing is startable and say so, or the lookup itself failed and that error is
|
|
31
|
+
// the honest answer.
|
|
32
|
+
if (outcome.kind === 'lookup-failed')
|
|
33
|
+
throw outcome.error;
|
|
34
|
+
reportNothingToStart(outcome, options.json);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
// With an area in hand the historical fallback still applies: let the server auto-pick
|
|
38
|
+
// (it knows about assignment and rule 8), including its own "nothing todo" message.
|
|
39
|
+
}
|
|
40
|
+
const response = (await client.startTask(taskId ?? selection?.task));
|
|
41
|
+
if (selection)
|
|
42
|
+
response.selection = selection;
|
|
9
43
|
if (options.json) {
|
|
10
44
|
console.log(formatOutput(response, true));
|
|
11
45
|
return;
|
|
@@ -14,6 +48,8 @@ export async function startCommand(taskId, options) {
|
|
|
14
48
|
console.log(response.meta?.message ?? 'No todo tasks available.');
|
|
15
49
|
return;
|
|
16
50
|
}
|
|
51
|
+
if (selection)
|
|
52
|
+
console.log(`Why this task: ${selection.reason}\n`);
|
|
17
53
|
console.log('Task started!\n');
|
|
18
54
|
printTaskDetail({ data: response.data });
|
|
19
55
|
// Auto-cleanup cached docs silently
|
|
@@ -23,7 +59,7 @@ export async function startCommand(taskId, options) {
|
|
|
23
59
|
...(response.data.workspace_knowledge ?? []).map((d) => d.slug),
|
|
24
60
|
];
|
|
25
61
|
if (slugs.length > 0) {
|
|
26
|
-
cleanupCache(slugs);
|
|
62
|
+
cleanupCache(slugs, await resolveDocCache({ area: options.area }));
|
|
27
63
|
}
|
|
28
64
|
}
|
|
29
65
|
catch {
|
|
@@ -35,4 +71,123 @@ export async function startCommand(taskId, options) {
|
|
|
35
71
|
process.exitCode = 1;
|
|
36
72
|
}
|
|
37
73
|
}
|
|
74
|
+
/**
|
|
75
|
+
* Decide what to work on, plan first: active mission → open intent → priority order.
|
|
76
|
+
*
|
|
77
|
+
* Reads only (`GET /tasks` + `GET /context`), so a caller may discard the answer. Both calls
|
|
78
|
+
* are made with whatever scope the adapter resolved — at the workspace root that is the
|
|
79
|
+
* workspace-wide listing, which is exactly the pool this command should be choosing from.
|
|
80
|
+
*/
|
|
81
|
+
export async function planWork(client) {
|
|
82
|
+
let candidates;
|
|
83
|
+
let context;
|
|
84
|
+
let workspace = null;
|
|
85
|
+
try {
|
|
86
|
+
const [tasks, ctx] = await Promise.all([
|
|
87
|
+
client.getTasks({ status: 'todo' }),
|
|
88
|
+
client.getContext(),
|
|
89
|
+
]);
|
|
90
|
+
candidates = tasks.data ?? [];
|
|
91
|
+
context = ctx.data ?? {};
|
|
92
|
+
workspace = tasks.meta?.workspace?.slug ?? null;
|
|
93
|
+
}
|
|
94
|
+
catch (error) {
|
|
95
|
+
return { kind: 'lookup-failed', error };
|
|
96
|
+
}
|
|
97
|
+
// A task whose dependencies are unmet cannot be worked on — it would only get in front of
|
|
98
|
+
// one that can. Kept as a fallback so a fully blocked backlog still yields a choice.
|
|
99
|
+
const ready = candidates.filter((task) => (task.blocked_by ?? []).length === 0);
|
|
100
|
+
const pool = ready.length > 0 ? ready : candidates;
|
|
101
|
+
if (pool.length === 0) {
|
|
102
|
+
const areas = [
|
|
103
|
+
...new Set([
|
|
104
|
+
...(context.areas ?? []).map((area) => area.slug),
|
|
105
|
+
...candidates.map((task) => task.area?.slug).filter((slug) => !!slug),
|
|
106
|
+
]),
|
|
107
|
+
];
|
|
108
|
+
return { kind: 'nothing', workspace, areas, scope: workspace ? 'workspace' : 'area' };
|
|
109
|
+
}
|
|
110
|
+
const mission = context.active_mission ?? null;
|
|
111
|
+
if (mission) {
|
|
112
|
+
const match = pool.find((task) => matches(task.mission_id, mission.id, mission.display_number));
|
|
113
|
+
if (match) {
|
|
114
|
+
return selected(match, 'mission', {
|
|
115
|
+
mission: { id: mission.id, number: mission.display_number, name: mission.name },
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
for (const intent of context.open_intents ?? []) {
|
|
120
|
+
const number = intent.number ?? intent.display_number;
|
|
121
|
+
const match = pool.find((task) => matches(task.intent_id, intent.id, number));
|
|
122
|
+
if (match) {
|
|
123
|
+
return selected(match, 'intent', {
|
|
124
|
+
intent: { id: intent.id, number, name: intent.name },
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Nothing planned matches: the listing is already in the server's priority order, so its
|
|
129
|
+
// head *is* "the next task in the queue" — now said out loud rather than implied.
|
|
130
|
+
return selected(pool[0], 'priority', {});
|
|
131
|
+
}
|
|
132
|
+
function selected(task, basis, links) {
|
|
133
|
+
return { kind: 'selected', selection: describe(task, basis, links) };
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* "Nothing to start", said where the search actually happened.
|
|
137
|
+
*
|
|
138
|
+
* The old code printed the server's area-scoped "No todo tasks available", which at the
|
|
139
|
+
* workspace root named a scope the command had not even searched.
|
|
140
|
+
*/
|
|
141
|
+
function reportNothingToStart(outcome, jsonMode) {
|
|
142
|
+
const where = outcome.workspace ? `workspace \`${outcome.workspace}\`` : 'this workspace';
|
|
143
|
+
const areas = outcome.areas.length > 0
|
|
144
|
+
? ` Areas searched: ${outcome.areas.join(', ')}.`
|
|
145
|
+
: '';
|
|
146
|
+
const message = `No startable work in ${where}: no task with status \`todo\` is available to you ` +
|
|
147
|
+
`across its areas.${areas} Run \`orbitmap tasks\` to see everything, or name a task ` +
|
|
148
|
+
'explicitly with `orbitmap start <TS-…>`.';
|
|
149
|
+
if (jsonMode) {
|
|
150
|
+
console.log(formatOutput({
|
|
151
|
+
data: null,
|
|
152
|
+
meta: {
|
|
153
|
+
message,
|
|
154
|
+
scope: 'workspace',
|
|
155
|
+
workspace: outcome.workspace,
|
|
156
|
+
areas_searched: outcome.areas,
|
|
157
|
+
},
|
|
158
|
+
}, true));
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
console.log(message);
|
|
162
|
+
}
|
|
163
|
+
function matches(value, ...accepted) {
|
|
164
|
+
if (!value)
|
|
165
|
+
return false;
|
|
166
|
+
return accepted.some((candidate) => candidate !== undefined && candidate === value);
|
|
167
|
+
}
|
|
168
|
+
function describe(task, basis, links) {
|
|
169
|
+
const ref = task.display_number ?? task.task_number;
|
|
170
|
+
const where = task.area ? ` [${task.area.slug}]` : '';
|
|
171
|
+
const label = `${ref}${where} "${task.title}"`;
|
|
172
|
+
const reason = basis === 'mission'
|
|
173
|
+
? `${label} — it belongs to the active mission ${describeLink(links.mission)}.`
|
|
174
|
+
: basis === 'intent'
|
|
175
|
+
? `${label} — it belongs to the open intent ${describeLink(links.intent)}; ` +
|
|
176
|
+
'no task of the active mission was available.'
|
|
177
|
+
: `${label} — no task of the active mission or of an open intent was available, ` +
|
|
178
|
+
`so the next one in priority order was taken (priority: ${task.priority ?? 'n/a'}).`;
|
|
179
|
+
return {
|
|
180
|
+
basis,
|
|
181
|
+
reason,
|
|
182
|
+
task: ref,
|
|
183
|
+
area: task.area?.slug ?? null,
|
|
184
|
+
mission: links.mission ?? null,
|
|
185
|
+
intent: links.intent ?? null,
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
function describeLink(link) {
|
|
189
|
+
if (!link)
|
|
190
|
+
return '(unknown)';
|
|
191
|
+
return link.number ? `${link.number} "${link.name}"` : `"${link.name}"`;
|
|
192
|
+
}
|
|
38
193
|
//# sourceMappingURL=start.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"start.js","sourceRoot":"","sources":["../../src/commands/start.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/status.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createAdapter } from '../adapters/factory.js';
|
|
2
|
-
import {
|
|
2
|
+
import { confirmWriteTarget } from '../write-target.js';
|
|
3
|
+
import { formatOutput, printError, printSuccess, printValidationError } from '../output.js';
|
|
3
4
|
const VALID_STATUSES = [
|
|
4
5
|
'backlog',
|
|
5
6
|
'todo',
|
|
@@ -13,27 +14,16 @@ const VALID_DELIVERY_STATUSES = ['on_branch', 'merged', 'released'];
|
|
|
13
14
|
export async function statusCommand(taskId, status, options) {
|
|
14
15
|
if (!VALID_STATUSES.includes(status)) {
|
|
15
16
|
const msg = `Invalid status "${status}". Valid: ${VALID_STATUSES.join(', ')}`;
|
|
16
|
-
|
|
17
|
-
console.error(JSON.stringify({ error: { message: msg } }));
|
|
18
|
-
}
|
|
19
|
-
else {
|
|
20
|
-
console.error(`Error: ${msg}`);
|
|
21
|
-
}
|
|
22
|
-
process.exitCode = 1;
|
|
17
|
+
printValidationError(msg, options.json);
|
|
23
18
|
return;
|
|
24
19
|
}
|
|
25
20
|
if (options.delivery && !VALID_DELIVERY_STATUSES.includes(options.delivery)) {
|
|
26
21
|
const msg = `Invalid delivery status "${options.delivery}". Valid: ${VALID_DELIVERY_STATUSES.join(', ')}`;
|
|
27
|
-
|
|
28
|
-
console.error(JSON.stringify({ error: { message: msg } }));
|
|
29
|
-
}
|
|
30
|
-
else {
|
|
31
|
-
console.error(`Error: ${msg}`);
|
|
32
|
-
}
|
|
33
|
-
process.exitCode = 1;
|
|
22
|
+
printValidationError(msg, options.json);
|
|
34
23
|
return;
|
|
35
24
|
}
|
|
36
25
|
try {
|
|
26
|
+
await confirmWriteTarget('update task status', options);
|
|
37
27
|
const client = await createAdapter(options.area);
|
|
38
28
|
const response = (await client.updateTaskStatus(taskId, status, options.delivery, options.force));
|
|
39
29
|
if (options.json) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE5F,MAAM,cAAc,GAAG;IACrB,SAAS;IACT,MAAM;IACN,aAAa;IACb,WAAW;IACX,gBAAgB;IAChB,MAAM;IACN,SAAS;CACV,CAAC;AAEF,MAAM,uBAAuB,GAAG,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;AAWpE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAc,EACd,MAAc,EACd,OAA4F;IAE5F,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,mBAAmB,MAAM,aAAa,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9E,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC,uBAAuB,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC5E,MAAM,GAAG,GAAG,4BAA4B,OAAO,CAAC,QAAQ,aAAa,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1G,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC;QACxD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAC7C,MAAM,EACN,MAAM,EACN,OAAO,CAAC,QAAQ,EAChB,OAAO,CAAC,KAAK,CACd,CAAmB,CAAC;QAErB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,IAAI,GAAG,GAAG,sBAAsB,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC;QACzD,IAAI,QAAQ,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;YAClC,GAAG,IAAI,cAAc,QAAQ,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC;QACxD,CAAC;QACD,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAC3B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/commands/subtask.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { createAdapter } from '../adapters/factory.js';
|
|
2
|
+
import { confirmWriteTarget } from '../write-target.js';
|
|
2
3
|
import { formatOutput, printError, printSuccess } from '../output.js';
|
|
3
4
|
export async function subtaskCommand(parentId, title, options) {
|
|
4
5
|
try {
|
|
6
|
+
await confirmWriteTarget('create subtask', options);
|
|
5
7
|
const client = await createAdapter(options.area);
|
|
6
8
|
const response = (await client.createSubtasks(parentId, [
|
|
7
9
|
{
|
|
@@ -15,8 +17,13 @@ export async function subtaskCommand(parentId, title, options) {
|
|
|
15
17
|
console.log(formatOutput(response, true));
|
|
16
18
|
return;
|
|
17
19
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
+
// Printed only the title and the status before, so the thing just created could not be
|
|
21
|
+
// addressed by any command (TS-adanc8). `created_subtasks` carries no `display_number`
|
|
22
|
+
// — neither provider-side nor in LocalAdapter — so this falls back to the uuid, which
|
|
23
|
+
// every task command accepts. Prefer the display number the moment it is served.
|
|
24
|
+
const sub = response.data.created_subtasks[0];
|
|
25
|
+
const ref = sub.display_number ?? (sub.task_number ? `TS-${sub.task_number}` : sub.id);
|
|
26
|
+
printSuccess(`Subtask created: ${sub.title} [${ref}] (${sub.status})`, false);
|
|
20
27
|
}
|
|
21
28
|
catch (error) {
|
|
22
29
|
printError(error, options.json);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subtask.js","sourceRoot":"","sources":["../../src/commands/subtask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"subtask.js","sourceRoot":"","sources":["../../src/commands/subtask.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAkBtE,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,QAAgB,EAChB,KAAa,EACb,OAOC;IAED,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,cAAc,CAAC,QAAQ,EAAE;YACtD;gBACE,KAAK;gBACL,WAAW,EAAE,OAAO,CAAC,IAAI;gBACzB,QAAQ,EAAE,OAAO,CAAC,QAAQ;gBAC1B,gBAAgB,EAAE,OAAO,CAAC,MAAM;aACjC;SACF,CAAC,CAAoB,CAAC;QAEvB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,uFAAuF;QACvF,uFAAuF;QACvF,sFAAsF;QACtF,iFAAiF;QACjF,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,GAAG,CAAC,cAAc,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvF,YAAY,CAAC,oBAAoB,GAAG,CAAC,KAAK,KAAK,GAAG,MAAM,GAAG,CAAC,MAAM,GAAG,EAAE,KAAK,CAAC,CAAC;IAChF,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
|
@@ -1,18 +1,14 @@
|
|
|
1
1
|
import { createAdapter } from '../adapters/factory.js';
|
|
2
|
-
import {
|
|
2
|
+
import { confirmWriteTarget } from '../write-target.js';
|
|
3
|
+
import { formatOutput, printError, printSuccess, printValidationError } from '../output.js';
|
|
3
4
|
export async function taskEditContentCommand(taskId, options) {
|
|
4
5
|
if (!options.title && !options.description && !options.agentInstructions) {
|
|
5
6
|
const msg = 'At least one of --title, --description, or --agent-instructions must be provided.';
|
|
6
|
-
|
|
7
|
-
console.error(JSON.stringify({ error: { message: msg } }));
|
|
8
|
-
}
|
|
9
|
-
else {
|
|
10
|
-
console.error(`Error: ${msg}`);
|
|
11
|
-
}
|
|
12
|
-
process.exitCode = 1;
|
|
7
|
+
printValidationError(msg, options.json);
|
|
13
8
|
return;
|
|
14
9
|
}
|
|
15
10
|
try {
|
|
11
|
+
await confirmWriteTarget('edit task content', options, 'existing');
|
|
16
12
|
const client = await createAdapter(options.area);
|
|
17
13
|
const body = {};
|
|
18
14
|
if (options.title)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-edit-content.js","sourceRoot":"","sources":["../../src/commands/task-edit-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"task-edit-content.js","sourceRoot":"","sources":["../../src/commands/task-edit-content.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAe5F,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,MAAc,EACd,OAMC;IAED,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,WAAW,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;QACzE,MAAM,GAAG,GAAG,mFAAmF,CAAC;QAChG,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,kBAAkB,CAAC,mBAAmB,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QACnE,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAEjD,MAAM,IAAI,GAA0E,EAAE,CAAC;QACvF,IAAI,OAAO,CAAC,KAAK;YAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;QAC9C,IAAI,OAAO,CAAC,WAAW;YAAE,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAChE,IAAI,OAAO,CAAC,iBAAiB;YAAE,IAAI,CAAC,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;QAEnF,MAAM,QAAQ,GAAG,CAAC,MAAM,MAAM,CAAC,eAAe,CAAC,MAAM,EAAE,IAAI,CAAC,CAAwB,CAAC;QAErF,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC;YAC1C,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxF,YAAY,CAAC,yBAAyB,MAAM,IAAI,EAAE,KAAK,CAAC,CAAC;QAEzD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;QAChC,IAAI,IAAI,EAAE,CAAC;YACT,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;YACtC,IAAI,IAAI,CAAC,WAAW;gBAAE,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;YACtE,IAAI,IAAI,CAAC,kBAAkB;gBAAE,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC;AACH,CAAC"}
|
package/dist/commands/task.d.ts
CHANGED
|
@@ -48,6 +48,13 @@ interface TaskDetailResponse {
|
|
|
48
48
|
status: string;
|
|
49
49
|
priority: string;
|
|
50
50
|
sort_order: number;
|
|
51
|
+
/**
|
|
52
|
+
* The provider selects only id/title/status/priority/sort_order for subtasks, so
|
|
53
|
+
* these are absent today and the Number column falls back to the uuid — which every
|
|
54
|
+
* task command accepts. Optional so it upgrades itself once they are served.
|
|
55
|
+
*/
|
|
56
|
+
task_number?: string;
|
|
57
|
+
display_number?: string;
|
|
51
58
|
}>;
|
|
52
59
|
area: {
|
|
53
60
|
name: string;
|
package/dist/commands/task.js
CHANGED
|
@@ -37,8 +37,11 @@ export function printTaskDetail(response) {
|
|
|
37
37
|
}
|
|
38
38
|
if (subtasks.length > 0) {
|
|
39
39
|
console.log(`\nSubtasks (${subtasks.length}):`);
|
|
40
|
-
|
|
41
|
-
|
|
40
|
+
// Was `1..n`, an ordinal that no command accepts — a listed subtask could not be
|
|
41
|
+
// started, logged against or closed without going to `--json` for its id (TS-adanc8).
|
|
42
|
+
// A subtask IS a task, so its display number works everywhere `TS-` does.
|
|
43
|
+
console.log(formatTable(['Number', 'Title', 'Status', 'Priority'], subtasks.map((s) => [
|
|
44
|
+
s.display_number ?? (s.task_number ? `TS-${s.task_number}` : s.id),
|
|
42
45
|
s.title,
|
|
43
46
|
s.status,
|
|
44
47
|
s.priority,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"task.js","sourceRoot":"","sources":["../../src/commands/task.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/tasks.d.ts
CHANGED
|
@@ -1,3 +1,25 @@
|
|
|
1
|
+
/** The `area` block workspace-scoped rows carry (absent in the area-scoped listing). */
|
|
2
|
+
export interface TaskArea {
|
|
3
|
+
id: string;
|
|
4
|
+
slug: string;
|
|
5
|
+
name: string;
|
|
6
|
+
}
|
|
7
|
+
export interface TaskItem {
|
|
8
|
+
id: string;
|
|
9
|
+
title: string;
|
|
10
|
+
description: string | null;
|
|
11
|
+
status: string;
|
|
12
|
+
priority: string;
|
|
13
|
+
delivery_status: string | null;
|
|
14
|
+
branch_name: string | null;
|
|
15
|
+
sort_order: number;
|
|
16
|
+
estimated_effort: string | null;
|
|
17
|
+
created_at: string;
|
|
18
|
+
task_number: string;
|
|
19
|
+
display_number: string;
|
|
20
|
+
/** Workspace scope only — see {@link TaskArea}. */
|
|
21
|
+
area?: TaskArea | null;
|
|
22
|
+
}
|
|
1
23
|
export declare function tasksCommand(options: {
|
|
2
24
|
json: boolean;
|
|
3
25
|
area?: string;
|
|
@@ -5,3 +27,16 @@ export declare function tasksCommand(options: {
|
|
|
5
27
|
priority?: string;
|
|
6
28
|
orbit?: string;
|
|
7
29
|
}): Promise<void>;
|
|
30
|
+
export interface TaskAreaGroup {
|
|
31
|
+
label: string;
|
|
32
|
+
slug: string | null;
|
|
33
|
+
tasks: TaskItem[];
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Rows folded into one group per area, in arrival order; area-less rows land in one bucket.
|
|
37
|
+
*
|
|
38
|
+
* The fold itself now lives in `area-grouping.ts`, shared with the issue/idea/vibe/document
|
|
39
|
+
* listings that grew the same need (TS-adanc8). This keeps the task-shaped result (`tasks`,
|
|
40
|
+
* not `rows`) that callers and tests already use.
|
|
41
|
+
*/
|
|
42
|
+
export declare function groupTasksByArea(tasks: TaskItem[]): TaskAreaGroup[];
|