@mycompbox/compbox-mcp 1.21.4 → 1.21.5
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/index.js +151 -105
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -2946,6 +2946,14 @@ var ApiClient = class {
|
|
|
2946
2946
|
throw error;
|
|
2947
2947
|
}
|
|
2948
2948
|
}
|
|
2949
|
+
/**
|
|
2950
|
+
* The cloud a project deploys to: its own choice, or the organization's
|
|
2951
|
+
* default (veena-gcp style). `cloudConnectionId: null` on a team does NOT mean
|
|
2952
|
+
* "no cloud" — it means "follows the org default"; this resolves it.
|
|
2953
|
+
*/
|
|
2954
|
+
async getProjectCloud(teamId) {
|
|
2955
|
+
return this.request("GET", `/api/v1/teams/${encodeURIComponent(teamId)}/cloud`);
|
|
2956
|
+
}
|
|
2949
2957
|
// ---------------------------------------------------------------------------
|
|
2950
2958
|
// Personal Scope Methods
|
|
2951
2959
|
// ---------------------------------------------------------------------------
|
|
@@ -10506,6 +10514,7 @@ function isUuid(value) {
|
|
|
10506
10514
|
}
|
|
10507
10515
|
|
|
10508
10516
|
// src/tools/teams.ts
|
|
10517
|
+
import { z as z20 } from "zod";
|
|
10509
10518
|
function registerTeamTools(server2) {
|
|
10510
10519
|
server2.registerTool(
|
|
10511
10520
|
"compbox__list_teams",
|
|
@@ -10535,22 +10544,59 @@ function registerTeamTools(server2) {
|
|
|
10535
10544
|
}
|
|
10536
10545
|
}
|
|
10537
10546
|
);
|
|
10547
|
+
server2.registerTool(
|
|
10548
|
+
"compbox__get_project_cloud",
|
|
10549
|
+
{
|
|
10550
|
+
description: "Get the cloud a project (team) deploys to: provider (gcp/aws/azure), cloud project or account ID, region and deploy identity, and whether it is the project's own choice or the organization's default. A team's cloudConnectionId of null means it FOLLOWS THE ORG DEFAULT, not that it has no cloud; always call this before planning hosting, databases or deployment. Returns cloud: null only when the organization has no cloud connected.",
|
|
10551
|
+
inputSchema: {
|
|
10552
|
+
team: z20.string().min(1).describe("The project/team: UUID, name or key (e.g. 'SAISUD').")
|
|
10553
|
+
}
|
|
10554
|
+
},
|
|
10555
|
+
async (input) => {
|
|
10556
|
+
try {
|
|
10557
|
+
const apiClient = getApiClient();
|
|
10558
|
+
const found = await apiClient.getTeam(input.team);
|
|
10559
|
+
if (!found) {
|
|
10560
|
+
return createErrorResponse(new Error(`Team '${input.team}' not found`));
|
|
10561
|
+
}
|
|
10562
|
+
const { data } = await apiClient.getProjectCloud(found.data.id);
|
|
10563
|
+
const cloud = data.cloud;
|
|
10564
|
+
return createResponse({
|
|
10565
|
+
team: { id: found.data.id, name: found.data.name, key: found.data.key },
|
|
10566
|
+
hasCloud: cloud !== null,
|
|
10567
|
+
source: cloud === null ? "none" : data.isInherited ? "organization-default" : "project-choice",
|
|
10568
|
+
cloud: cloud && {
|
|
10569
|
+
name: cloud.name,
|
|
10570
|
+
provider: cloud.provider,
|
|
10571
|
+
projectId: cloud.projectId,
|
|
10572
|
+
region: cloud.region,
|
|
10573
|
+
serviceAccountEmail: cloud.serviceAccountEmail,
|
|
10574
|
+
stateStore: cloud.stateStore,
|
|
10575
|
+
consoleUrl: cloud.consoleUrl
|
|
10576
|
+
},
|
|
10577
|
+
guidance: cloud === null ? "No cloud is connected. An organization admin can connect one in Settings -> Cloud; until then don't assume a hosting provider." : `Plan hosting, databases and storage on ${cloud.provider.toUpperCase()} (${cloud.projectId}, ${cloud.region}). CompBox stacks deploy through GitHub Actions with keyless sign-in, so never plan stored cloud keys.`
|
|
10578
|
+
});
|
|
10579
|
+
} catch (error) {
|
|
10580
|
+
return createErrorResponse(error);
|
|
10581
|
+
}
|
|
10582
|
+
}
|
|
10583
|
+
);
|
|
10538
10584
|
}
|
|
10539
10585
|
|
|
10540
10586
|
// src/tools/team-hierarchy.ts
|
|
10541
|
-
import { z as
|
|
10587
|
+
import { z as z21 } from "zod";
|
|
10542
10588
|
var createTeamChildSchema = {
|
|
10543
|
-
parentId:
|
|
10544
|
-
name:
|
|
10545
|
-
key:
|
|
10546
|
-
level:
|
|
10589
|
+
parentId: z21.string().uuid().describe("The UUID of the parent team that will own the new child team."),
|
|
10590
|
+
name: z21.string().min(1).max(255).describe("Display name for the child team."),
|
|
10591
|
+
key: z21.string().min(1).max(10).regex(/^[A-Z][A-Z0-9-]*$/).describe("Unique team key for the child team. Must start with an uppercase letter and contain only uppercase letters, digits, or hyphens."),
|
|
10592
|
+
level: z21.enum(["group", "product-line", "product", "discipline"]).describe("Hierarchy level for the child team (required).")
|
|
10547
10593
|
};
|
|
10548
10594
|
var getTeamPathSchema = {
|
|
10549
|
-
teamId:
|
|
10595
|
+
teamId: z21.string().uuid().describe("The UUID of the team whose ordered ancestor path should be returned.")
|
|
10550
10596
|
};
|
|
10551
10597
|
var moveTeamSchema = {
|
|
10552
|
-
teamId:
|
|
10553
|
-
newParentId:
|
|
10598
|
+
teamId: z21.string().uuid().describe("The UUID of the team to move within the hierarchy."),
|
|
10599
|
+
newParentId: z21.string().uuid().nullable().describe("The UUID of the new parent team. Pass null to move the team to the root level.")
|
|
10554
10600
|
};
|
|
10555
10601
|
function registerTeamHierarchyTools(server2) {
|
|
10556
10602
|
server2.registerTool(
|
|
@@ -10650,7 +10696,7 @@ function registerTeamHierarchyTools(server2) {
|
|
|
10650
10696
|
|
|
10651
10697
|
// src/tools/composite.ts
|
|
10652
10698
|
init_dist();
|
|
10653
|
-
import { z as
|
|
10699
|
+
import { z as z22 } from "zod";
|
|
10654
10700
|
var COMPOSITE_TIMEOUT_MS = 12e4;
|
|
10655
10701
|
function withTimeout(promise, ms, operationName) {
|
|
10656
10702
|
return new Promise((resolve, reject) => {
|
|
@@ -10676,41 +10722,41 @@ function withTimeout(promise, ms, operationName) {
|
|
|
10676
10722
|
var estimatedComplexityValues = ["trivial", "simple", "moderate", "complex"];
|
|
10677
10723
|
var estimatedEffortValues = ["trivial", "small", "medium", "large", "xl"];
|
|
10678
10724
|
var riskLevelValues = ["low", "medium", "high"];
|
|
10679
|
-
var externalLinkSchema =
|
|
10680
|
-
url:
|
|
10681
|
-
title:
|
|
10725
|
+
var externalLinkSchema = z22.object({
|
|
10726
|
+
url: z22.string().describe("URL of the external resource"),
|
|
10727
|
+
title: z22.string().describe("Display title for the link")
|
|
10682
10728
|
});
|
|
10683
|
-
var structuredDescSchema =
|
|
10684
|
-
summary:
|
|
10685
|
-
aiInstructions:
|
|
10686
|
-
acceptanceCriteria:
|
|
10687
|
-
filesInvolved:
|
|
10688
|
-
functionsToModify:
|
|
10689
|
-
testingStrategy:
|
|
10690
|
-
testFiles:
|
|
10691
|
-
relatedItemIds:
|
|
10692
|
-
externalLinks:
|
|
10693
|
-
technicalNotes:
|
|
10694
|
-
riskLevel:
|
|
10695
|
-
estimatedEffort:
|
|
10729
|
+
var structuredDescSchema = z22.object({
|
|
10730
|
+
summary: z22.string().describe("Brief human-readable summary (required)"),
|
|
10731
|
+
aiInstructions: z22.string().optional().describe("Specific instructions for AI agents implementing this item"),
|
|
10732
|
+
acceptanceCriteria: z22.array(z22.string()).optional().describe("List of acceptance criteria that must be met"),
|
|
10733
|
+
filesInvolved: z22.array(z22.string()).optional().describe("File paths that will be involved in this work"),
|
|
10734
|
+
functionsToModify: z22.array(z22.string()).optional().describe("Functions to modify in format 'filePath:functionName'"),
|
|
10735
|
+
testingStrategy: z22.string().optional().describe("Description of how this work should be tested"),
|
|
10736
|
+
testFiles: z22.array(z22.string()).optional().describe("Test file paths"),
|
|
10737
|
+
relatedItemIds: z22.array(z22.string()).optional().describe("Related feature or task identifiers"),
|
|
10738
|
+
externalLinks: z22.array(externalLinkSchema).optional().describe("External documentation or reference links"),
|
|
10739
|
+
technicalNotes: z22.string().optional().describe("Technical implementation notes or constraints"),
|
|
10740
|
+
riskLevel: z22.enum(riskLevelValues).optional().describe("Risk level assessment: low, medium, or high"),
|
|
10741
|
+
estimatedEffort: z22.enum(estimatedEffortValues).optional().describe("Effort estimate: trivial, small, medium, large, or xl")
|
|
10696
10742
|
});
|
|
10697
|
-
var compositeTaskSchema =
|
|
10698
|
-
title:
|
|
10699
|
-
executionOrder:
|
|
10700
|
-
estimatedComplexity:
|
|
10743
|
+
var compositeTaskSchema = z22.object({
|
|
10744
|
+
title: z22.string().min(1).max(500).describe("Task title (required)"),
|
|
10745
|
+
executionOrder: z22.number().int().positive().optional().describe("Execution order within the feature (1, 2, 3...). Lower numbers first."),
|
|
10746
|
+
estimatedComplexity: z22.enum(estimatedComplexityValues).optional().describe("Complexity: trivial (<1hr), simple (1-4hr), moderate (1-3d), complex (>3d)"),
|
|
10701
10747
|
structuredDesc: structuredDescSchema.optional().describe("Structured description with summary, aiInstructions, acceptanceCriteria, etc.")
|
|
10702
10748
|
});
|
|
10703
|
-
var compositeFeatureSchema =
|
|
10704
|
-
title:
|
|
10705
|
-
executionOrder:
|
|
10706
|
-
estimatedComplexity:
|
|
10707
|
-
canParallelize:
|
|
10708
|
-
parallelGroup:
|
|
10709
|
-
dependencies:
|
|
10749
|
+
var compositeFeatureSchema = z22.object({
|
|
10750
|
+
title: z22.string().min(1).max(500).describe("Feature title (required)"),
|
|
10751
|
+
executionOrder: z22.number().int().positive().describe("Execution order within the epic (required). Lower numbers first."),
|
|
10752
|
+
estimatedComplexity: z22.enum(estimatedComplexityValues).describe("Complexity (required): trivial, simple, moderate, or complex"),
|
|
10753
|
+
canParallelize: z22.boolean().optional().describe("Whether this feature can run alongside other features in parallel"),
|
|
10754
|
+
parallelGroup: z22.string().max(100).optional().describe("Group identifier for features that can run together"),
|
|
10755
|
+
dependencies: z22.array(z22.number().int().min(0)).optional().describe(
|
|
10710
10756
|
"Array of 0-based indices referencing earlier features in this array that must complete first"
|
|
10711
10757
|
),
|
|
10712
10758
|
structuredDesc: structuredDescSchema.optional().describe("Structured description with summary, aiInstructions, acceptanceCriteria, etc."),
|
|
10713
|
-
tasks:
|
|
10759
|
+
tasks: z22.array(compositeTaskSchema).min(1).describe("Array of tasks for this feature (at least 1 required)")
|
|
10714
10760
|
});
|
|
10715
10761
|
function registerCompositeTools(server2) {
|
|
10716
10762
|
server2.registerTool(
|
|
@@ -10740,19 +10786,19 @@ Use this instead of individual create calls when building a complete implementat
|
|
|
10740
10786
|
|
|
10741
10787
|
Optionally pass epicRequestId to link this epic to an approved Epic Request.`,
|
|
10742
10788
|
inputSchema: {
|
|
10743
|
-
name:
|
|
10744
|
-
team:
|
|
10745
|
-
description:
|
|
10746
|
-
icon:
|
|
10747
|
-
color:
|
|
10748
|
-
epicRequestId:
|
|
10789
|
+
name: z22.string().min(1).max(255).describe("Epic name (required)"),
|
|
10790
|
+
team: z22.string().min(1).describe("Team ID, name, or key (required). Use compbox__list_teams to find available teams."),
|
|
10791
|
+
description: z22.string().max(DESCRIPTION_MAX).optional().describe("Epic description"),
|
|
10792
|
+
icon: z22.string().max(50).optional().describe("Icon identifier (e.g., 'rocket', 'star')"),
|
|
10793
|
+
color: z22.string().max(20).optional().describe("Hex color code (e.g., '#FF5733')"),
|
|
10794
|
+
epicRequestId: z22.string().uuid().optional().describe(
|
|
10749
10795
|
"UUID of an Epic Request to link to this epic. When provided without deferConversion, the Epic Request will be marked as converted. With deferConversion: true, conversion is skipped (ER must be in 'planning' status)."
|
|
10750
10796
|
),
|
|
10751
|
-
bypassGovernance:
|
|
10752
|
-
deferConversion:
|
|
10797
|
+
bypassGovernance: z22.boolean().optional(),
|
|
10798
|
+
deferConversion: z22.boolean().optional().describe(
|
|
10753
10799
|
"When true, governance accepts 'planning' status and skips auto-conversion of the Epic Request. Used by the planner pipeline which handles conversion in its final VERIFY stage."
|
|
10754
10800
|
),
|
|
10755
|
-
features:
|
|
10801
|
+
features: z22.array(compositeFeatureSchema).min(1).describe(
|
|
10756
10802
|
"Array of features to create. Each feature must have at least 1 task. Features are created in order, so dependencies must reference earlier indices (0-based)."
|
|
10757
10803
|
)
|
|
10758
10804
|
}
|
|
@@ -10848,19 +10894,19 @@ Optionally pass epicRequestId to link this epic to an approved Epic Request.`,
|
|
|
10848
10894
|
{
|
|
10849
10895
|
description: "Run all validations for a task and mark it complete if all pass.\n\nThis composite tool combines:\n- compbox__run_all_validations\n- compbox__complete_work (if validations pass)\n\nBehavior:\n- Runs all validation checks defined on the task\n- If ALL validations pass, marks the task as complete with the provided summary\n- If ANY validation fails, returns the failure details WITHOUT completing the task\n- If no validations are defined, completes the task immediately\n\nUse this at the end of implementing a task to ensure all acceptance criteria are met before marking it done.",
|
|
10850
10896
|
inputSchema: {
|
|
10851
|
-
taskId:
|
|
10897
|
+
taskId: z22.string().describe(
|
|
10852
10898
|
"The task identifier. Accepts UUID or human-readable identifier (e.g., 'COM-123-1')."
|
|
10853
10899
|
),
|
|
10854
|
-
summary:
|
|
10900
|
+
summary: z22.string().max(5e3).optional().describe(
|
|
10855
10901
|
"Summary of work completed. Will be logged as an AI note when the task is marked complete."
|
|
10856
10902
|
),
|
|
10857
|
-
workingDirectory:
|
|
10903
|
+
workingDirectory: z22.string().max(1e3).optional().describe(
|
|
10858
10904
|
"Working directory for running validation commands. Defaults to current working directory."
|
|
10859
10905
|
),
|
|
10860
|
-
stopOnFirstFailure:
|
|
10906
|
+
stopOnFirstFailure: z22.boolean().optional().describe(
|
|
10861
10907
|
"If true, stops running validations after the first failure. Default is false (run all)."
|
|
10862
10908
|
),
|
|
10863
|
-
skipValidations:
|
|
10909
|
+
skipValidations: z22.boolean().optional().describe(
|
|
10864
10910
|
"If true, skips running validations and completes the task immediately. Use with caution - only for tasks where validations are not applicable."
|
|
10865
10911
|
)
|
|
10866
10912
|
}
|
|
@@ -10973,17 +11019,17 @@ Optionally pass epicRequestId to link this epic to an approved Epic Request.`,
|
|
|
10973
11019
|
}
|
|
10974
11020
|
|
|
10975
11021
|
// src/tools/workflow.ts
|
|
10976
|
-
import { z as
|
|
11022
|
+
import { z as z23 } from "zod";
|
|
10977
11023
|
function registerWorkflowTools(server2) {
|
|
10978
11024
|
server2.registerTool(
|
|
10979
11025
|
"compbox__get_next_required_action",
|
|
10980
11026
|
{
|
|
10981
11027
|
description: "Analyze current work item state and suggest the next required action to maintain compliance with CompBox best practices. Returns prioritized list of suggestions with tool names and example parameters.\n\nUse this when you're unsure what to do next with a feature, task, or epic to ensure proper workflow compliance and tracking.",
|
|
10982
11028
|
inputSchema: {
|
|
10983
|
-
itemId:
|
|
11029
|
+
itemId: z23.string().describe(
|
|
10984
11030
|
"The feature, task, or epic identifier. Accepts UUID or human-readable identifier (e.g., 'COM-123' for features, 'COM-123-1' for tasks). Epics use UUID, identifier (e.g., 'ENG-E1'), or exact name."
|
|
10985
11031
|
),
|
|
10986
|
-
itemType:
|
|
11032
|
+
itemType: z23.enum(["feature", "task", "epic"]).describe(
|
|
10987
11033
|
"Whether this is a 'feature', 'task', or 'epic'."
|
|
10988
11034
|
)
|
|
10989
11035
|
}
|
|
@@ -11184,7 +11230,7 @@ function registerWorkflowTools(server2) {
|
|
|
11184
11230
|
{
|
|
11185
11231
|
description: "Get the current state of an AI session and allowed state transitions. The session state machine tracks workflow progress through states: STARTED \u2192 PLANNING \u2192 IMPLEMENTING \u2192 VALIDATING \u2192 COMPLETING.\n\nUse this to understand where you are in the workflow and what transitions are allowed.",
|
|
11186
11232
|
inputSchema: {
|
|
11187
|
-
sessionId:
|
|
11233
|
+
sessionId: z23.string().describe(
|
|
11188
11234
|
"The session ID to query. Get this from compbox__start_session or compbox__get_active_session."
|
|
11189
11235
|
)
|
|
11190
11236
|
}
|
|
@@ -11214,17 +11260,17 @@ function registerWorkflowTools(server2) {
|
|
|
11214
11260
|
// src/tools/project-flags.ts
|
|
11215
11261
|
import * as fs from "fs/promises";
|
|
11216
11262
|
import * as path from "path";
|
|
11217
|
-
import { z as
|
|
11263
|
+
import { z as z24 } from "zod";
|
|
11218
11264
|
function registerProjectFlagTools(server2) {
|
|
11219
11265
|
server2.registerTool(
|
|
11220
11266
|
"compbox__mark_docs_audit_complete",
|
|
11221
11267
|
{
|
|
11222
11268
|
description: "Mark a project's documentation audit as complete by writing the .compbox/docs-audit.json sentinel file. This creates the .compbox/ directory if needed and writes a JSON file that prevents the Request Formulator from prompting about documentation audits on future invocations. Use this when a user confirms their project is already documented.",
|
|
11223
|
-
inputSchema:
|
|
11224
|
-
projectRoot:
|
|
11269
|
+
inputSchema: z24.object({
|
|
11270
|
+
projectRoot: z24.string().optional().describe(
|
|
11225
11271
|
"Project root directory (default: current working directory)"
|
|
11226
11272
|
),
|
|
11227
|
-
epicRequestId:
|
|
11273
|
+
epicRequestId: z24.string().optional().describe(
|
|
11228
11274
|
"Optional Epic Request ID if the audit was completed via a CompBox epic request"
|
|
11229
11275
|
)
|
|
11230
11276
|
})
|
|
@@ -11276,7 +11322,7 @@ function registerProjectFlagTools(server2) {
|
|
|
11276
11322
|
}
|
|
11277
11323
|
|
|
11278
11324
|
// src/tools/changelog.ts
|
|
11279
|
-
import { z as
|
|
11325
|
+
import { z as z25 } from "zod";
|
|
11280
11326
|
var entityTypes = ["epic", "feature", "task"];
|
|
11281
11327
|
function registerChangelogTools(server2) {
|
|
11282
11328
|
server2.registerTool(
|
|
@@ -11284,31 +11330,31 @@ function registerChangelogTools(server2) {
|
|
|
11284
11330
|
{
|
|
11285
11331
|
description: "Query entity change history with formatted output. Returns field-level changes showing what was modified, when, and by whom. Each entry shows 'field: oldValue \u2192 newValue'. Useful for understanding how an entity evolved over time or tracking specific field changes.\n\nUse cases:\n- See all changes to a feature or task\n- Track status changes over time\n- Find who changed a specific field\n- Audit changes within a date range\n- Review epic-wide changes across all features/tasks",
|
|
11286
11332
|
inputSchema: {
|
|
11287
|
-
entityType:
|
|
11333
|
+
entityType: z25.enum(entityTypes).describe(
|
|
11288
11334
|
"Type of entity to query (required). 'epic' for epic changes, 'feature' for feature changes, 'task' for task changes."
|
|
11289
11335
|
),
|
|
11290
|
-
entityId:
|
|
11336
|
+
entityId: z25.string().describe(
|
|
11291
11337
|
"UUID of the entity to query (required). The specific epic, feature, or task ID."
|
|
11292
11338
|
),
|
|
11293
|
-
epicId:
|
|
11339
|
+
epicId: z25.string().uuid().optional().describe(
|
|
11294
11340
|
"Filter by epic ID (optional). Accepts UUID or identifier (e.g., 'ENG-E1'). When provided, only returns changes for entities within this epic. Useful for narrowing down results in a multi-epic query."
|
|
11295
11341
|
),
|
|
11296
|
-
field:
|
|
11342
|
+
field: z25.string().max(255).optional().describe(
|
|
11297
11343
|
"Filter by specific field name (optional). Examples: 'statusId', 'title', 'assigneeId', 'description'. Only changes to this field will be returned."
|
|
11298
11344
|
),
|
|
11299
|
-
changedBy:
|
|
11345
|
+
changedBy: z25.string().uuid().optional().describe(
|
|
11300
11346
|
"Filter by user ID who made the change (optional). Only returns changes made by this user."
|
|
11301
11347
|
),
|
|
11302
|
-
since:
|
|
11348
|
+
since: z25.string().optional().describe(
|
|
11303
11349
|
"Filter changes on or after this date (optional). Accepts ISO-8601 date (e.g., '2024-01-15') or duration (e.g., '-P7D' for last 7 days, '-P1M' for last month)."
|
|
11304
11350
|
),
|
|
11305
|
-
until:
|
|
11351
|
+
until: z25.string().optional().describe(
|
|
11306
11352
|
"Filter changes before this date (optional). Accepts ISO-8601 date format."
|
|
11307
11353
|
),
|
|
11308
|
-
limit:
|
|
11354
|
+
limit: z25.number().int().min(1).max(100).optional().describe(
|
|
11309
11355
|
"Maximum number of entries to return (default: 20, max: 100)."
|
|
11310
11356
|
),
|
|
11311
|
-
cursor:
|
|
11357
|
+
cursor: z25.string().optional().describe(
|
|
11312
11358
|
"Pagination cursor from a previous response. Pass this to fetch the next page of results."
|
|
11313
11359
|
)
|
|
11314
11360
|
}
|
|
@@ -11361,7 +11407,7 @@ function registerChangelogTools(server2) {
|
|
|
11361
11407
|
}
|
|
11362
11408
|
|
|
11363
11409
|
// src/tools/sessions.ts
|
|
11364
|
-
import { z as
|
|
11410
|
+
import { z as z26 } from "zod";
|
|
11365
11411
|
import * as fs2 from "fs";
|
|
11366
11412
|
import * as path2 from "path";
|
|
11367
11413
|
function readLocalManifest() {
|
|
@@ -11422,13 +11468,13 @@ function registerSessionTools(server2) {
|
|
|
11422
11468
|
{
|
|
11423
11469
|
description: "Start a new AI session for an epic. Creates a session record, abandons any existing active session, and returns the previous session's handoff data plus epic progress. Call this at the START of any work session to properly track AI activity. Optionally scope the session to a specific feature within the epic by providing featureId.",
|
|
11424
11470
|
inputSchema: {
|
|
11425
|
-
epicId:
|
|
11471
|
+
epicId: z26.string().describe(
|
|
11426
11472
|
"The epic to start a session for. Accepts epic ID (UUID), identifier (e.g., 'ENG-E1'), or exact epic name."
|
|
11427
11473
|
),
|
|
11428
|
-
externalId:
|
|
11474
|
+
externalId: z26.string().optional().describe(
|
|
11429
11475
|
"Optional external session identifier (e.g., from Copilot or another AI tool)."
|
|
11430
11476
|
),
|
|
11431
|
-
featureId:
|
|
11477
|
+
featureId: z26.string().uuid().optional().describe(
|
|
11432
11478
|
"Optional feature ID (UUID) to scope this session to a specific feature within the epic. When provided, the session tracks work on a single feature. Omit for epic-wide sessions (default behavior)."
|
|
11433
11479
|
)
|
|
11434
11480
|
}
|
|
@@ -11456,19 +11502,19 @@ function registerSessionTools(server2) {
|
|
|
11456
11502
|
{
|
|
11457
11503
|
description: "End the active AI session for an epic with handoff data. Records summary, next steps, blockers, and decisions for the next session. Call this at the END of a work session. If the session was feature-scoped, the response includes featureId indicating which feature was targeted.",
|
|
11458
11504
|
inputSchema: {
|
|
11459
|
-
epicId:
|
|
11505
|
+
epicId: z26.string().describe(
|
|
11460
11506
|
"The epic whose active session to end. Accepts epic ID (UUID), identifier (e.g., 'ENG-E1'), or exact epic name."
|
|
11461
11507
|
),
|
|
11462
|
-
summary:
|
|
11463
|
-
nextSteps:
|
|
11464
|
-
blockers:
|
|
11465
|
-
decisions:
|
|
11466
|
-
|
|
11467
|
-
decision:
|
|
11468
|
-
rationale:
|
|
11508
|
+
summary: z26.string().describe("Summary of work completed during this session."),
|
|
11509
|
+
nextSteps: z26.array(z26.string()).optional().describe("Recommended next actions for the successor session."),
|
|
11510
|
+
blockers: z26.array(z26.string()).optional().describe("Blockers encountered during this session."),
|
|
11511
|
+
decisions: z26.array(
|
|
11512
|
+
z26.object({
|
|
11513
|
+
decision: z26.string(),
|
|
11514
|
+
rationale: z26.string().optional()
|
|
11469
11515
|
})
|
|
11470
11516
|
).optional().describe("Key decisions made during this session with rationale."),
|
|
11471
|
-
contextBlob:
|
|
11517
|
+
contextBlob: z26.string().optional().describe("Optional free-form context blob for the next session.")
|
|
11472
11518
|
}
|
|
11473
11519
|
},
|
|
11474
11520
|
async (input) => {
|
|
@@ -11492,7 +11538,7 @@ function registerSessionTools(server2) {
|
|
|
11492
11538
|
{
|
|
11493
11539
|
description: "Check if there is an active AI session for an epic. Returns the session if active, or null.",
|
|
11494
11540
|
inputSchema: {
|
|
11495
|
-
epicId:
|
|
11541
|
+
epicId: z26.string().describe(
|
|
11496
11542
|
"The epic to check. Accepts epic ID (UUID), identifier (e.g., 'ENG-E1'), or exact epic name."
|
|
11497
11543
|
)
|
|
11498
11544
|
}
|
|
@@ -11512,7 +11558,7 @@ function registerSessionTools(server2) {
|
|
|
11512
11558
|
{
|
|
11513
11559
|
description: "Get the last completed session for an epic. Returns previous session handoff data without starting a new session. Use this to review what happened in the previous session.",
|
|
11514
11560
|
inputSchema: {
|
|
11515
|
-
epicId:
|
|
11561
|
+
epicId: z26.string().describe(
|
|
11516
11562
|
"The epic to query. Accepts epic ID (UUID), identifier (e.g., 'ENG-E1'), or exact epic name."
|
|
11517
11563
|
)
|
|
11518
11564
|
}
|
|
@@ -11532,10 +11578,10 @@ function registerSessionTools(server2) {
|
|
|
11532
11578
|
{
|
|
11533
11579
|
description: "Get the history of AI sessions for an epic. Returns past sessions ordered by most recent first.",
|
|
11534
11580
|
inputSchema: {
|
|
11535
|
-
epicId:
|
|
11581
|
+
epicId: z26.string().describe(
|
|
11536
11582
|
"The epic to query. Accepts epic ID (UUID), identifier (e.g., 'ENG-E1'), or exact epic name."
|
|
11537
11583
|
),
|
|
11538
|
-
limit:
|
|
11584
|
+
limit: z26.number().int().min(1).max(100).optional().describe("Maximum number of sessions to return (default: 10, max: 100).")
|
|
11539
11585
|
}
|
|
11540
11586
|
},
|
|
11541
11587
|
async (input) => {
|
|
@@ -11554,7 +11600,7 @@ function registerSessionTools(server2) {
|
|
|
11554
11600
|
}
|
|
11555
11601
|
|
|
11556
11602
|
// src/tools/compliance.ts
|
|
11557
|
-
import { z as
|
|
11603
|
+
import { z as z27 } from "zod";
|
|
11558
11604
|
var TIER_EMOJI = {
|
|
11559
11605
|
pass: "\u2705",
|
|
11560
11606
|
advisory: "\u26A0\uFE0F",
|
|
@@ -11625,7 +11671,7 @@ function registerComplianceTools(server2) {
|
|
|
11625
11671
|
{
|
|
11626
11672
|
description: "Trigger a compliance audit for an Epic Request. Evaluates the epic request against compliance rules and returns a detailed score with dimension breakdown and issues. The audit result is persisted on the epic request for future reference.",
|
|
11627
11673
|
inputSchema: {
|
|
11628
|
-
id:
|
|
11674
|
+
id: z27.string().min(1).describe(
|
|
11629
11675
|
"The epic request to audit. Accepts UUID or identifier (e.g., 'ER-1')."
|
|
11630
11676
|
)
|
|
11631
11677
|
}
|
|
@@ -11647,7 +11693,7 @@ function registerComplianceTools(server2) {
|
|
|
11647
11693
|
{
|
|
11648
11694
|
description: "Trigger a full compliance audit for an Epic. Evaluates the epic and all its features and tasks against compliance rules. Returns a detailed score with dimension breakdown and issues. The audit result is persisted on the epic for future reference.",
|
|
11649
11695
|
inputSchema: {
|
|
11650
|
-
id:
|
|
11696
|
+
id: z27.string().min(1).describe(
|
|
11651
11697
|
"The epic to audit. Accepts UUID, identifier (e.g., 'ENG-E1'), or exact name."
|
|
11652
11698
|
)
|
|
11653
11699
|
}
|
|
@@ -11684,20 +11730,20 @@ function registerComplianceTools(server2) {
|
|
|
11684
11730
|
}
|
|
11685
11731
|
|
|
11686
11732
|
// src/tools/skill-packs/manage.ts
|
|
11687
|
-
import { z as
|
|
11733
|
+
import { z as z30 } from "zod";
|
|
11688
11734
|
|
|
11689
11735
|
// src/tools/skill-packs/get-manifest.ts
|
|
11690
|
-
import { z as
|
|
11736
|
+
import { z as z28 } from "zod";
|
|
11691
11737
|
function registerGetPackManifestTool(server2) {
|
|
11692
11738
|
server2.registerTool(
|
|
11693
11739
|
"compbox__get_pack_manifest",
|
|
11694
11740
|
{
|
|
11695
11741
|
description: "Get the detailed manifest for a specific version of a skill pack.\n\nThe manifest describes the pack's contents including:\n- Agents: AI agents included in the pack\n- Skills: Individual skills/capabilities\n- Instructions: Documentation and usage guides\n- Dependencies: Other packs this pack depends on\n\nUse this to understand what a skill pack contains before installing it, or to see the details of an installed pack's current version.",
|
|
11696
11742
|
inputSchema: {
|
|
11697
|
-
id:
|
|
11743
|
+
id: z28.string().describe(
|
|
11698
11744
|
"Skill pack ID or name (e.g., '@mycompbox/planning' or UUID)"
|
|
11699
11745
|
),
|
|
11700
|
-
version:
|
|
11746
|
+
version: z28.string().optional().describe(
|
|
11701
11747
|
"Specific version to get manifest for (e.g., '1.2.3'). If not provided, uses latest stable version."
|
|
11702
11748
|
)
|
|
11703
11749
|
}
|
|
@@ -11787,7 +11833,7 @@ function registerGetPackManifestTool(server2) {
|
|
|
11787
11833
|
}
|
|
11788
11834
|
|
|
11789
11835
|
// src/tools/skill-packs/sync-local.ts
|
|
11790
|
-
import { z as
|
|
11836
|
+
import { z as z29 } from "zod";
|
|
11791
11837
|
import * as fs3 from "fs/promises";
|
|
11792
11838
|
import * as path3 from "path";
|
|
11793
11839
|
import { existsSync } from "fs";
|
|
@@ -11797,7 +11843,7 @@ function registerSyncLocalPacksTool(server2) {
|
|
|
11797
11843
|
{
|
|
11798
11844
|
description: "Detect drift between local skill pack installations and the registry.\n\nThis tool compares:\n1. .compbox/manifest.json (local installation record)\n2. Actual files in .github/ (agents, skills, instructions, presets)\n3. Database registry (what's officially installed)\n\nReports:\n- **Untracked files**: Files exist locally but not in manifest\n- **Missing files**: Files in manifest but not on filesystem\n- **Registry mismatches**: Local manifest differs from database registry\n- **Version differences**: Installed version vs. available version\n\nUse this to audit local installations and identify cleanup/sync needs.",
|
|
11799
11845
|
inputSchema: {
|
|
11800
|
-
projectRoot:
|
|
11846
|
+
projectRoot: z29.string().optional().describe(
|
|
11801
11847
|
"Project root directory (default: current working directory). Must contain .compbox/ and .github/ directories."
|
|
11802
11848
|
)
|
|
11803
11849
|
}
|
|
@@ -11989,21 +12035,21 @@ function registerSkillPackTools(server2) {
|
|
|
11989
12035
|
"compbox__manage_skill_packs",
|
|
11990
12036
|
{
|
|
11991
12037
|
description: "Manage Skill Packs with action-based routing. This composite tool provides 5 actions:\n\n**list** - List available skill packs from the registry (supports filtering by official/search)\n**get** - Get details about a specific skill pack by ID or name\n**install** - Install a skill pack by ID/name and version\n**update** - Update an installed skill pack to a new version (or 'latest')\n**list_installed** - List all installed skill packs with their status\n\nUse this to discover, install, and manage skill packs during AI sessions.",
|
|
11992
|
-
inputSchema:
|
|
11993
|
-
action:
|
|
12038
|
+
inputSchema: z30.object({
|
|
12039
|
+
action: z30.enum(["list", "get", "install", "update", "list_installed"]).describe(
|
|
11994
12040
|
"The action to perform: 'list' (browse registry), 'get' (pack details), 'install', 'update', or 'list_installed' (your installed packs)"
|
|
11995
12041
|
),
|
|
11996
12042
|
// Used by: list, get, install, update
|
|
11997
|
-
id:
|
|
12043
|
+
id: z30.string().optional().describe("Skill pack ID or name (e.g., '@mycompbox/planning'). Required for get/install/update actions."),
|
|
11998
12044
|
// Used by: list
|
|
11999
|
-
cursor:
|
|
12000
|
-
limit:
|
|
12001
|
-
isOfficial:
|
|
12002
|
-
query:
|
|
12045
|
+
cursor: z30.string().optional().describe("Pagination cursor from previous response (list action only)"),
|
|
12046
|
+
limit: z30.number().int().min(1).max(100).optional().describe("Maximum results per page, default 20, max 100 (list action only)"),
|
|
12047
|
+
isOfficial: z30.boolean().optional().describe("Filter by official packs (list action only)"),
|
|
12048
|
+
query: z30.string().optional().describe("Search query to filter by name (list action only)"),
|
|
12003
12049
|
// Used by: get
|
|
12004
|
-
includeVersions:
|
|
12050
|
+
includeVersions: z30.boolean().optional().describe("Include all versions in response (get action only)"),
|
|
12005
12051
|
// Used by: install, update
|
|
12006
|
-
version:
|
|
12052
|
+
version: z30.string().optional().describe("Version to install/update to (e.g., '1.2.3' or 'latest'). Required for install/update actions.")
|
|
12007
12053
|
})
|
|
12008
12054
|
},
|
|
12009
12055
|
async (input) => {
|
|
@@ -12289,7 +12335,7 @@ function withLegacyToolCallRewrite(transport) {
|
|
|
12289
12335
|
var SERVER_NAME = "compbox-mcp";
|
|
12290
12336
|
function resolveServerVersion() {
|
|
12291
12337
|
if (true) {
|
|
12292
|
-
return "1.21.
|
|
12338
|
+
return "1.21.5";
|
|
12293
12339
|
}
|
|
12294
12340
|
const require2 = createRequire(import.meta.url);
|
|
12295
12341
|
for (const candidate of ["../package.json", "./package.json"]) {
|