@ouro.bot/cli 0.1.0-alpha.13 → 0.1.0-alpha.131
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/AdoptionSpecialist.ouro/psyche/SOUL.md +2 -2
- package/AdoptionSpecialist.ouro/psyche/identities/monty.md +2 -2
- package/README.md +147 -205
- package/changelog.json +814 -0
- package/dist/heart/active-work.js +622 -0
- package/dist/heart/bridges/manager.js +358 -0
- package/dist/heart/bridges/state-machine.js +135 -0
- package/dist/heart/bridges/store.js +123 -0
- package/dist/heart/commitments.js +105 -0
- package/dist/heart/config.js +66 -21
- package/dist/heart/core.js +518 -100
- package/dist/heart/cross-chat-delivery.js +146 -0
- package/dist/heart/daemon/agent-discovery.js +81 -0
- package/dist/heart/daemon/auth-flow.js +457 -0
- package/dist/heart/daemon/daemon-cli.js +1516 -195
- package/dist/heart/daemon/daemon-entry.js +43 -2
- package/dist/heart/daemon/daemon-runtime-sync.js +212 -0
- package/dist/heart/daemon/daemon.js +261 -1
- package/dist/heart/daemon/hatch-animation.js +10 -3
- package/dist/heart/daemon/hatch-flow.js +7 -72
- package/dist/heart/daemon/hooks/bundle-meta.js +92 -0
- package/dist/heart/daemon/launchd.js +159 -0
- package/dist/heart/daemon/log-tailer.js +4 -3
- package/dist/heart/daemon/message-router.js +17 -8
- package/dist/heart/daemon/ouro-bot-global-installer.js +128 -0
- package/dist/heart/daemon/ouro-path-installer.js +57 -29
- package/dist/heart/daemon/ouro-version-manager.js +171 -0
- package/dist/heart/daemon/process-manager.js +13 -0
- package/dist/heart/daemon/run-hooks.js +37 -0
- package/dist/heart/daemon/runtime-logging.js +58 -15
- package/dist/heart/daemon/runtime-metadata.js +219 -0
- package/dist/heart/daemon/runtime-mode.js +67 -0
- package/dist/heart/daemon/sense-manager.js +50 -2
- package/dist/heart/daemon/skill-management-installer.js +94 -0
- package/dist/heart/daemon/socket-client.js +202 -0
- package/dist/heart/daemon/specialist-orchestrator.js +2 -2
- package/dist/heart/daemon/specialist-prompt.js +7 -4
- package/dist/heart/daemon/specialist-tools.js +52 -3
- package/dist/heart/daemon/staged-restart.js +114 -0
- package/dist/heart/daemon/thoughts.js +507 -0
- package/dist/heart/daemon/update-checker.js +111 -0
- package/dist/heart/daemon/update-hooks.js +138 -0
- package/dist/heart/daemon/wrapper-publish-guard.js +86 -0
- package/dist/heart/delegation.js +62 -0
- package/dist/heart/identity.js +64 -21
- package/dist/heart/kicks.js +1 -19
- package/dist/heart/model-capabilities.js +48 -0
- package/dist/heart/obligations.js +197 -0
- package/dist/heart/progress-story.js +42 -0
- package/dist/heart/provider-failover.js +88 -0
- package/dist/heart/provider-ping.js +159 -0
- package/dist/heart/providers/anthropic-token.js +163 -0
- package/dist/heart/providers/anthropic.js +195 -34
- package/dist/heart/providers/azure.js +115 -9
- package/dist/heart/providers/github-copilot.js +157 -0
- package/dist/heart/providers/minimax.js +33 -3
- package/dist/heart/providers/openai-codex.js +49 -14
- package/dist/heart/safe-workspace.js +381 -0
- package/dist/heart/session-activity.js +173 -0
- package/dist/heart/session-recall.js +216 -0
- package/dist/heart/streaming.js +108 -24
- package/dist/heart/target-resolution.js +123 -0
- package/dist/heart/tool-loop.js +194 -0
- package/dist/heart/turn-coordinator.js +28 -0
- package/dist/mind/associative-recall.js +14 -2
- package/dist/mind/bundle-manifest.js +12 -0
- package/dist/mind/context.js +60 -14
- package/dist/mind/first-impressions.js +16 -2
- package/dist/mind/friends/channel.js +35 -0
- package/dist/mind/friends/group-context.js +144 -0
- package/dist/mind/friends/store-file.js +19 -0
- package/dist/mind/friends/trust-explanation.js +74 -0
- package/dist/mind/friends/types.js +8 -0
- package/dist/mind/memory.js +27 -26
- package/dist/mind/obligation-steering.js +221 -0
- package/dist/mind/pending.js +76 -9
- package/dist/mind/phrases.js +1 -0
- package/dist/mind/prompt.js +456 -77
- package/dist/mind/token-estimate.js +8 -12
- package/dist/nerves/cli-logging.js +15 -2
- package/dist/nerves/coverage/run-artifacts.js +1 -1
- package/dist/nerves/index.js +12 -0
- package/dist/nerves/runtime.js +5 -1
- package/dist/repertoire/ado-client.js +4 -2
- package/dist/repertoire/coding/context-pack.js +254 -0
- package/dist/repertoire/coding/feedback.js +301 -0
- package/dist/repertoire/coding/index.js +4 -1
- package/dist/repertoire/coding/manager.js +210 -4
- package/dist/repertoire/coding/spawner.js +39 -9
- package/dist/repertoire/coding/tools.js +171 -4
- package/dist/repertoire/data/ado-endpoints.json +188 -0
- package/dist/repertoire/guardrails.js +290 -0
- package/dist/repertoire/mcp-client.js +254 -0
- package/dist/repertoire/mcp-manager.js +198 -0
- package/dist/repertoire/skills.js +3 -26
- package/dist/repertoire/tasks/board.js +12 -0
- package/dist/repertoire/tasks/index.js +23 -9
- package/dist/repertoire/tasks/transitions.js +1 -2
- package/dist/repertoire/tools-base.js +925 -250
- package/dist/repertoire/tools-bluebubbles.js +93 -0
- package/dist/repertoire/tools-teams.js +58 -25
- package/dist/repertoire/tools.js +106 -53
- package/dist/senses/bluebubbles-client.js +210 -5
- package/dist/senses/bluebubbles-entry.js +2 -0
- package/dist/senses/bluebubbles-inbound-log.js +109 -0
- package/dist/senses/bluebubbles-media.js +339 -0
- package/dist/senses/bluebubbles-model.js +12 -4
- package/dist/senses/bluebubbles-mutation-log.js +45 -5
- package/dist/senses/bluebubbles-runtime-state.js +109 -0
- package/dist/senses/bluebubbles-session-cleanup.js +72 -0
- package/dist/senses/bluebubbles.js +915 -45
- package/dist/senses/cli-layout.js +187 -0
- package/dist/senses/cli.js +374 -131
- package/dist/senses/continuity.js +94 -0
- package/dist/senses/debug-activity.js +154 -0
- package/dist/senses/inner-dialog-worker.js +47 -18
- package/dist/senses/inner-dialog.js +388 -83
- package/dist/senses/pipeline.js +444 -0
- package/dist/senses/teams.js +607 -129
- package/dist/senses/trust-gate.js +112 -2
- package/package.json +9 -3
- package/subagents/README.md +4 -70
- package/dist/heart/daemon/subagent-installer.js +0 -134
- package/subagents/work-doer.md +0 -233
- package/subagents/work-merger.md +0 -624
- package/subagents/work-planner.md +0 -373
|
@@ -2,6 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.codingToolDefinitions = void 0;
|
|
4
4
|
const index_1 = require("./index");
|
|
5
|
+
const context_pack_1 = require("./context-pack");
|
|
6
|
+
const identity_1 = require("../../heart/identity");
|
|
7
|
+
const obligations_1 = require("../../heart/obligations");
|
|
5
8
|
const runtime_1 = require("../../nerves/runtime");
|
|
6
9
|
const RUNNERS = ["claude", "codex"];
|
|
7
10
|
function requireArg(args, key) {
|
|
@@ -29,6 +32,79 @@ function emitCodingToolEvent(toolName) {
|
|
|
29
32
|
meta: { toolName },
|
|
30
33
|
});
|
|
31
34
|
}
|
|
35
|
+
function sameOriginSession(left, right) {
|
|
36
|
+
if (!left && !right)
|
|
37
|
+
return true;
|
|
38
|
+
if (!left || !right)
|
|
39
|
+
return false;
|
|
40
|
+
return left.friendId === right.friendId && left.channel === right.channel && left.key === right.key;
|
|
41
|
+
}
|
|
42
|
+
function matchesReusableCodingSession(session, request) {
|
|
43
|
+
if (session.status !== "spawning" && session.status !== "running" && session.status !== "waiting_input" && session.status !== "stalled") {
|
|
44
|
+
return false;
|
|
45
|
+
}
|
|
46
|
+
const scopeMatches = request.scopeFile ? session.scopeFile === request.scopeFile : true;
|
|
47
|
+
const stateMatches = request.stateFile ? session.stateFile === request.stateFile : true;
|
|
48
|
+
return (session.runner === request.runner &&
|
|
49
|
+
session.workdir === request.workdir &&
|
|
50
|
+
session.taskRef === request.taskRef &&
|
|
51
|
+
scopeMatches &&
|
|
52
|
+
stateMatches &&
|
|
53
|
+
session.obligationId === request.obligationId &&
|
|
54
|
+
sameOriginSession(request.originSession, session.originSession));
|
|
55
|
+
}
|
|
56
|
+
function latestSessionFirst(left, right) {
|
|
57
|
+
const lastActivityDelta = Date.parse(right.lastActivityAt) - Date.parse(left.lastActivityAt);
|
|
58
|
+
if (lastActivityDelta !== 0)
|
|
59
|
+
return lastActivityDelta;
|
|
60
|
+
return right.id.localeCompare(left.id);
|
|
61
|
+
}
|
|
62
|
+
function findReusableCodingSession(sessions, request) {
|
|
63
|
+
const matches = sessions.filter((session) => matchesReusableCodingSession(session, request)).sort(latestSessionFirst);
|
|
64
|
+
return matches[0] ?? null;
|
|
65
|
+
}
|
|
66
|
+
function isLiveCodingStatus(status) {
|
|
67
|
+
return status === "spawning" || status === "running" || status === "waiting_input" || status === "stalled";
|
|
68
|
+
}
|
|
69
|
+
function rankCodingStatusSession(session, currentSession) {
|
|
70
|
+
return sameOriginSession({
|
|
71
|
+
friendId: currentSession.friendId,
|
|
72
|
+
channel: currentSession.channel,
|
|
73
|
+
key: currentSession.key,
|
|
74
|
+
}, session.originSession)
|
|
75
|
+
? 0
|
|
76
|
+
: 1;
|
|
77
|
+
}
|
|
78
|
+
function selectCodingStatusSessions(sessions, currentSession) {
|
|
79
|
+
if (sessions.length === 0)
|
|
80
|
+
return [];
|
|
81
|
+
if (!currentSession) {
|
|
82
|
+
return sessions;
|
|
83
|
+
}
|
|
84
|
+
const activeSessions = sessions.filter((session) => isLiveCodingStatus(session.status)).sort(latestSessionFirst);
|
|
85
|
+
if (activeSessions.length > 0) {
|
|
86
|
+
return activeSessions.sort((left, right) => {
|
|
87
|
+
const rankDelta = rankCodingStatusSession(left, currentSession) - rankCodingStatusSession(right, currentSession);
|
|
88
|
+
if (rankDelta !== 0)
|
|
89
|
+
return rankDelta;
|
|
90
|
+
return latestSessionFirst(left, right);
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
const matchingClosedSessions = sessions
|
|
94
|
+
.filter((session) => sameOriginSession({
|
|
95
|
+
friendId: currentSession.friendId,
|
|
96
|
+
channel: currentSession.channel,
|
|
97
|
+
key: currentSession.key,
|
|
98
|
+
}, session.originSession))
|
|
99
|
+
.sort(latestSessionFirst);
|
|
100
|
+
if (matchingClosedSessions.length > 0) {
|
|
101
|
+
return matchingClosedSessions;
|
|
102
|
+
}
|
|
103
|
+
return [...sessions].sort(latestSessionFirst);
|
|
104
|
+
}
|
|
105
|
+
function buildCodingObligationContent(taskRef) {
|
|
106
|
+
return `finish ${taskRef} and bring the result back`;
|
|
107
|
+
}
|
|
32
108
|
const codingSpawnTool = {
|
|
33
109
|
type: "function",
|
|
34
110
|
function: {
|
|
@@ -61,6 +137,20 @@ const codingStatusTool = {
|
|
|
61
137
|
},
|
|
62
138
|
},
|
|
63
139
|
};
|
|
140
|
+
const codingTailTool = {
|
|
141
|
+
type: "function",
|
|
142
|
+
function: {
|
|
143
|
+
name: "coding_tail",
|
|
144
|
+
description: "show recent stdout/stderr tail for a coding session in a readable format",
|
|
145
|
+
parameters: {
|
|
146
|
+
type: "object",
|
|
147
|
+
properties: {
|
|
148
|
+
sessionId: { type: "string" },
|
|
149
|
+
},
|
|
150
|
+
required: ["sessionId"],
|
|
151
|
+
},
|
|
152
|
+
},
|
|
153
|
+
};
|
|
64
154
|
const codingSendInputTool = {
|
|
65
155
|
type: "function",
|
|
66
156
|
function: {
|
|
@@ -93,7 +183,7 @@ const codingKillTool = {
|
|
|
93
183
|
exports.codingToolDefinitions = [
|
|
94
184
|
{
|
|
95
185
|
tool: codingSpawnTool,
|
|
96
|
-
handler: async (args) => {
|
|
186
|
+
handler: async (args, ctx) => {
|
|
97
187
|
emitCodingToolEvent("coding_spawn");
|
|
98
188
|
const rawRunner = requireArg(args, "runner");
|
|
99
189
|
if (!rawRunner)
|
|
@@ -116,24 +206,88 @@ exports.codingToolDefinitions = [
|
|
|
116
206
|
prompt,
|
|
117
207
|
taskRef,
|
|
118
208
|
};
|
|
209
|
+
if (ctx?.currentSession && ctx.currentSession.channel !== "inner") {
|
|
210
|
+
request.originSession = {
|
|
211
|
+
friendId: ctx.currentSession.friendId,
|
|
212
|
+
channel: ctx.currentSession.channel,
|
|
213
|
+
key: ctx.currentSession.key,
|
|
214
|
+
};
|
|
215
|
+
const obligation = (0, obligations_1.findPendingObligationForOrigin)((0, identity_1.getAgentRoot)(), request.originSession);
|
|
216
|
+
if (obligation) {
|
|
217
|
+
request.obligationId = obligation.id;
|
|
218
|
+
}
|
|
219
|
+
}
|
|
119
220
|
const scopeFile = optionalArg(args, "scopeFile");
|
|
120
221
|
if (scopeFile)
|
|
121
222
|
request.scopeFile = scopeFile;
|
|
122
223
|
const stateFile = optionalArg(args, "stateFile");
|
|
123
224
|
if (stateFile)
|
|
124
225
|
request.stateFile = stateFile;
|
|
125
|
-
const
|
|
226
|
+
const manager = (0, index_1.getCodingSessionManager)();
|
|
227
|
+
const existingSessions = manager.listSessions();
|
|
228
|
+
const existingSession = findReusableCodingSession(existingSessions, request);
|
|
229
|
+
if (existingSession) {
|
|
230
|
+
(0, runtime_1.emitNervesEvent)({
|
|
231
|
+
component: "repertoire",
|
|
232
|
+
event: "repertoire.coding_session_reused",
|
|
233
|
+
message: "reused active coding session",
|
|
234
|
+
meta: { id: existingSession.id, runner: existingSession.runner, taskRef: existingSession.taskRef },
|
|
235
|
+
});
|
|
236
|
+
if (ctx?.codingFeedback) {
|
|
237
|
+
(0, index_1.attachCodingSessionFeedback)(manager, existingSession, ctx.codingFeedback);
|
|
238
|
+
}
|
|
239
|
+
return JSON.stringify({ ...existingSession, reused: true });
|
|
240
|
+
}
|
|
241
|
+
if (request.originSession && !request.obligationId) {
|
|
242
|
+
const created = (0, obligations_1.createObligation)((0, identity_1.getAgentRoot)(), {
|
|
243
|
+
origin: request.originSession,
|
|
244
|
+
content: buildCodingObligationContent(taskRef),
|
|
245
|
+
});
|
|
246
|
+
request.obligationId = created.id;
|
|
247
|
+
}
|
|
248
|
+
if (!request.scopeFile || !request.stateFile) {
|
|
249
|
+
const generated = (0, context_pack_1.prepareCodingContextPack)({
|
|
250
|
+
request: { ...request },
|
|
251
|
+
existingSessions,
|
|
252
|
+
activeWorkFrame: ctx?.activeWorkFrame,
|
|
253
|
+
});
|
|
254
|
+
if (!request.scopeFile)
|
|
255
|
+
request.scopeFile = generated.scopeFile;
|
|
256
|
+
if (!request.stateFile)
|
|
257
|
+
request.stateFile = generated.stateFile;
|
|
258
|
+
}
|
|
259
|
+
const session = await manager.spawnSession(request);
|
|
260
|
+
if (session.obligationId) {
|
|
261
|
+
(0, obligations_1.advanceObligation)((0, identity_1.getAgentRoot)(), session.obligationId, {
|
|
262
|
+
status: "investigating",
|
|
263
|
+
currentSurface: { kind: "coding", label: `${session.runner} ${session.id}` },
|
|
264
|
+
latestNote: session.originSession
|
|
265
|
+
? `coding session started for ${session.originSession.channel}/${session.originSession.key}`
|
|
266
|
+
: "coding session started",
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
if (args.runner === "codex" && args.taskRef) {
|
|
270
|
+
(0, runtime_1.emitNervesEvent)({
|
|
271
|
+
component: "repertoire",
|
|
272
|
+
event: "repertoire.coding_codex_spawned",
|
|
273
|
+
message: "spawned codex coding session",
|
|
274
|
+
meta: { sessionId: session.id, taskRef: args.taskRef },
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
if (ctx?.codingFeedback) {
|
|
278
|
+
(0, index_1.attachCodingSessionFeedback)(manager, session, ctx.codingFeedback);
|
|
279
|
+
}
|
|
126
280
|
return JSON.stringify(session);
|
|
127
281
|
},
|
|
128
282
|
},
|
|
129
283
|
{
|
|
130
284
|
tool: codingStatusTool,
|
|
131
|
-
handler: (args) => {
|
|
285
|
+
handler: (args, ctx) => {
|
|
132
286
|
emitCodingToolEvent("coding_status");
|
|
133
287
|
const manager = (0, index_1.getCodingSessionManager)();
|
|
134
288
|
const sessionId = requireArg(args, "sessionId");
|
|
135
289
|
if (!sessionId) {
|
|
136
|
-
return JSON.stringify(manager.listSessions());
|
|
290
|
+
return JSON.stringify(selectCodingStatusSessions(manager.listSessions(), ctx?.currentSession));
|
|
137
291
|
}
|
|
138
292
|
const session = manager.getSession(sessionId);
|
|
139
293
|
if (!session)
|
|
@@ -141,6 +295,19 @@ exports.codingToolDefinitions = [
|
|
|
141
295
|
return JSON.stringify(session);
|
|
142
296
|
},
|
|
143
297
|
},
|
|
298
|
+
{
|
|
299
|
+
tool: codingTailTool,
|
|
300
|
+
handler: (args) => {
|
|
301
|
+
emitCodingToolEvent("coding_tail");
|
|
302
|
+
const sessionId = requireArg(args, "sessionId");
|
|
303
|
+
if (!sessionId)
|
|
304
|
+
return "sessionId is required";
|
|
305
|
+
const session = (0, index_1.getCodingSessionManager)().getSession(sessionId);
|
|
306
|
+
if (!session)
|
|
307
|
+
return `session not found: ${sessionId}`;
|
|
308
|
+
return (0, index_1.formatCodingTail)(session);
|
|
309
|
+
},
|
|
310
|
+
},
|
|
144
311
|
{
|
|
145
312
|
tool: codingSendInputTool,
|
|
146
313
|
handler: (args) => {
|
|
@@ -35,6 +35,12 @@
|
|
|
35
35
|
"description": "Delete a work item (moves to recycle bin)",
|
|
36
36
|
"params": "destroy (boolean, permanently delete)"
|
|
37
37
|
},
|
|
38
|
+
{
|
|
39
|
+
"path": "/{project}/_apis/wit/workitemtypes",
|
|
40
|
+
"method": "GET",
|
|
41
|
+
"description": "List all work item types available in a project (Bug, Task, Epic, User Story, etc.)",
|
|
42
|
+
"params": ""
|
|
43
|
+
},
|
|
38
44
|
{
|
|
39
45
|
"path": "/_apis/git/repositories",
|
|
40
46
|
"method": "GET",
|
|
@@ -118,5 +124,187 @@
|
|
|
118
124
|
"method": "GET",
|
|
119
125
|
"description": "List saved work item queries (shared and personal)",
|
|
120
126
|
"params": "$depth, $expand"
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
"path": "/_apis/groupentitlements?api-version=7.1",
|
|
130
|
+
"method": "GET",
|
|
131
|
+
"host": "vsaex.dev.azure.com",
|
|
132
|
+
"description": "List group entitlements (group rules that auto-assign licenses). Use host vsaex.dev.azure.com.",
|
|
133
|
+
"params": ""
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"path": "/_apis/groupentitlements?api-version=7.1",
|
|
137
|
+
"method": "POST",
|
|
138
|
+
"host": "vsaex.dev.azure.com",
|
|
139
|
+
"description": "Create a group entitlement rule — maps an AAD group to an access level (e.g. Basic) and project membership. All members of the AAD group automatically get the specified license. Use host vsaex.dev.azure.com. This is the best way to bulk-provision users.",
|
|
140
|
+
"params": "body: { group: { origin: 'aad', originId: '<AAD-group-object-id>', subjectKind: 'group' }, licenseRule: { licensingSource: 'account', accountLicenseType: 'express', licenseDisplayName: 'Basic' }, projectEntitlements: [{ group: { groupType: 'projectContributor' }, projectRef: { id: '<project-id>' } }] }"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"path": "/_apis/groupentitlements/{groupId}?api-version=7.1",
|
|
144
|
+
"method": "GET",
|
|
145
|
+
"host": "vsaex.dev.azure.com",
|
|
146
|
+
"description": "Get a specific group entitlement by ID. Use host vsaex.dev.azure.com.",
|
|
147
|
+
"params": ""
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
"path": "/_apis/groupentitlements/{groupId}?api-version=7.1",
|
|
151
|
+
"method": "PATCH",
|
|
152
|
+
"host": "vsaex.dev.azure.com",
|
|
153
|
+
"description": "Update a group entitlement (change license rule, project access). Use host vsaex.dev.azure.com.",
|
|
154
|
+
"params": "JSON Patch array: [{op, path, value}]"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"path": "/_apis/groupentitlements/{groupId}?api-version=7.1",
|
|
158
|
+
"method": "DELETE",
|
|
159
|
+
"host": "vsaex.dev.azure.com",
|
|
160
|
+
"description": "Delete a group entitlement rule. Use host vsaex.dev.azure.com.",
|
|
161
|
+
"params": ""
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
"path": "/_apis/memberentitlementmanagement/memberentitlements?api-version=7.1-preview.3",
|
|
165
|
+
"method": "GET",
|
|
166
|
+
"host": "vsapm.dev.azure.com",
|
|
167
|
+
"description": "List individual member entitlements (users and their access levels). Use host vsapm.dev.azure.com. For bulk provisioning, prefer the Group Entitlements API on vsaex.dev.azure.com instead.",
|
|
168
|
+
"params": "$top, $skip, $filter, $orderBy, $select"
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
"path": "/_apis/memberentitlementmanagement/memberentitlements?api-version=7.1-preview.3",
|
|
172
|
+
"method": "POST",
|
|
173
|
+
"host": "vsapm.dev.azure.com",
|
|
174
|
+
"description": "Add a single member entitlement. Use host vsapm.dev.azure.com. For bulk provisioning, prefer the Group Entitlements API on vsaex.dev.azure.com instead.",
|
|
175
|
+
"params": "body: { accessLevel: { accountLicenseType: 'express'|'stakeholder', licensingSource: 'account' }, user: { principalName: 'user@domain.com', subjectKind: 'user' }, projectEntitlements: [{ group: { groupType: 'projectContributor' }, projectRef: { id: projectId } }] }"
|
|
176
|
+
},
|
|
177
|
+
{
|
|
178
|
+
"path": "/_apis/memberentitlementmanagement/memberentitlements/{memberId}?api-version=7.1-preview.3",
|
|
179
|
+
"method": "PATCH",
|
|
180
|
+
"host": "vsapm.dev.azure.com",
|
|
181
|
+
"description": "Update a member entitlement (change access level, project access). Use host vsapm.dev.azure.com.",
|
|
182
|
+
"params": "JSON Patch array: [{op, path, value}]"
|
|
183
|
+
},
|
|
184
|
+
{
|
|
185
|
+
"path": "/_apis/memberentitlementmanagement/memberentitlements/{memberId}?api-version=7.1-preview.3",
|
|
186
|
+
"method": "DELETE",
|
|
187
|
+
"host": "vsapm.dev.azure.com",
|
|
188
|
+
"description": "Remove a member entitlement (revoke user access). Use host vsapm.dev.azure.com.",
|
|
189
|
+
"params": ""
|
|
190
|
+
},
|
|
191
|
+
{
|
|
192
|
+
"path": "/_apis/graph/users?api-version=7.1-preview.1",
|
|
193
|
+
"method": "GET",
|
|
194
|
+
"host": "vssps.dev.azure.com",
|
|
195
|
+
"description": "List users in the organization (Graph API). Use host vssps.dev.azure.com. IMPORTANT: include the full path with api-version as shown.",
|
|
196
|
+
"params": "subjectTypes (aad, msa, etc.), continuationToken"
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
"path": "/_apis/graph/groups?api-version=7.1-preview.1",
|
|
200
|
+
"method": "GET",
|
|
201
|
+
"host": "vssps.dev.azure.com",
|
|
202
|
+
"description": "List groups in the organization. Use host vssps.dev.azure.com. IMPORTANT: include the full path with api-version as shown.",
|
|
203
|
+
"params": "subjectTypes, continuationToken"
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
"path": "/_apis/graph/memberships/{subjectDescriptor}?api-version=7.1-preview.1",
|
|
207
|
+
"method": "GET",
|
|
208
|
+
"host": "vssps.dev.azure.com",
|
|
209
|
+
"description": "List group memberships for a user or group. Use host vssps.dev.azure.com. IMPORTANT: include the full path with api-version as shown.",
|
|
210
|
+
"params": "direction (up = groups user belongs to, down = members of group)"
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"path": "/_apis/graph/memberships/{subjectDescriptor}/{containerDescriptor}?api-version=7.1-preview.1",
|
|
214
|
+
"method": "PUT",
|
|
215
|
+
"host": "vssps.dev.azure.com",
|
|
216
|
+
"description": "Add a user to a group. Use host vssps.dev.azure.com. IMPORTANT: include the full path with api-version as shown.",
|
|
217
|
+
"params": ""
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
"path": "/_apis/graph/memberships/{subjectDescriptor}/{containerDescriptor}?api-version=7.1-preview.1",
|
|
221
|
+
"method": "DELETE",
|
|
222
|
+
"host": "vssps.dev.azure.com",
|
|
223
|
+
"description": "Remove a user from a group. Use host vssps.dev.azure.com. IMPORTANT: include the full path with api-version as shown.",
|
|
224
|
+
"params": ""
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
"path": "/_apis/projects/{projectId}/teams",
|
|
228
|
+
"method": "GET",
|
|
229
|
+
"description": "List teams in a project",
|
|
230
|
+
"params": "$top, $skip"
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"path": "/_apis/projects/{projectId}/teams/{teamId}",
|
|
234
|
+
"method": "GET",
|
|
235
|
+
"description": "Get a specific team by ID",
|
|
236
|
+
"params": ""
|
|
237
|
+
},
|
|
238
|
+
{
|
|
239
|
+
"path": "/_apis/projects/{projectId}/teams",
|
|
240
|
+
"method": "POST",
|
|
241
|
+
"description": "Create a new team in a project",
|
|
242
|
+
"params": "name, description"
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
"path": "/_apis/projects/{projectId}/teams/{teamId}/members",
|
|
246
|
+
"method": "GET",
|
|
247
|
+
"description": "List members of a team",
|
|
248
|
+
"params": "$top, $skip"
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
"path": "/{project}/{team}/_apis/work/teamsettings/iterations",
|
|
252
|
+
"method": "GET",
|
|
253
|
+
"description": "List iterations (sprints) for a team",
|
|
254
|
+
"params": "$timeframe (current, past, future)"
|
|
255
|
+
},
|
|
256
|
+
{
|
|
257
|
+
"path": "/{project}/{team}/_apis/work/teamsettings/iterations",
|
|
258
|
+
"method": "POST",
|
|
259
|
+
"description": "Add an iteration to a team's sprint schedule",
|
|
260
|
+
"params": "id (iteration node ID)"
|
|
261
|
+
},
|
|
262
|
+
{
|
|
263
|
+
"path": "/{project}/{team}/_apis/work/teamsettings/iterations/{iterationId}",
|
|
264
|
+
"method": "DELETE",
|
|
265
|
+
"description": "Remove an iteration from a team's sprint schedule",
|
|
266
|
+
"params": ""
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
"path": "/{project}/_apis/wit/classificationnodes/iterations",
|
|
270
|
+
"method": "GET",
|
|
271
|
+
"description": "List iteration path tree (project-level iteration nodes)",
|
|
272
|
+
"params": "$depth"
|
|
273
|
+
},
|
|
274
|
+
{
|
|
275
|
+
"path": "/{project}/_apis/wit/classificationnodes/iterations",
|
|
276
|
+
"method": "POST",
|
|
277
|
+
"description": "Create a new iteration node (sprint)",
|
|
278
|
+
"params": "name, attributes: { startDate, finishDate }"
|
|
279
|
+
},
|
|
280
|
+
{
|
|
281
|
+
"path": "/{project}/_apis/wit/classificationnodes/areas",
|
|
282
|
+
"method": "GET",
|
|
283
|
+
"description": "List area path tree (project-level area nodes)",
|
|
284
|
+
"params": "$depth"
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
"path": "/{project}/_apis/wit/classificationnodes/areas",
|
|
288
|
+
"method": "POST",
|
|
289
|
+
"description": "Create a new area path node",
|
|
290
|
+
"params": "name"
|
|
291
|
+
},
|
|
292
|
+
{
|
|
293
|
+
"path": "/{project}/_apis/wit/classificationnodes/{structureGroup}/{path}",
|
|
294
|
+
"method": "DELETE",
|
|
295
|
+
"description": "Delete a classification node (area or iteration). structureGroup is 'areas' or 'iterations'.",
|
|
296
|
+
"params": "$reclassifyId (move items to this node before deleting)"
|
|
297
|
+
},
|
|
298
|
+
{
|
|
299
|
+
"path": "/_apis/hooks/subscriptions",
|
|
300
|
+
"method": "GET",
|
|
301
|
+
"description": "List service hook subscriptions (webhooks for events)",
|
|
302
|
+
"params": ""
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
"path": "/_apis/hooks/subscriptions",
|
|
306
|
+
"method": "POST",
|
|
307
|
+
"description": "Create a service hook subscription (webhook)",
|
|
308
|
+
"params": "publisherId, eventType, consumerId, consumerActionId, publisherInputs, consumerInputs"
|
|
121
309
|
}
|
|
122
310
|
]
|