cruo-agent 0.1.2 → 0.1.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/dist/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.3
package/dist/cli.js CHANGED
@@ -15185,7 +15185,7 @@ var init_zod = __esm({
15185
15185
  });
15186
15186
 
15187
15187
  // ../../packages/core/dist/schemas.js
15188
- var stateCategory, issuePriority, memberRole, projectKey, createProjectInput, createIssueInput, updateIssueInput, moveIssueInput, workflowStateInput, listIssuesFilter;
15188
+ var stateCategory, issuePriority, memberRole, projectKey, createProjectInput, estimateHours, createIssueInput, updateIssueInput, moveIssueInput, workflowStateInput, listIssuesFilter;
15189
15189
  var init_schemas3 = __esm({
15190
15190
  "../../packages/core/dist/schemas.js"() {
15191
15191
  "use strict";
@@ -15213,6 +15213,7 @@ var init_schemas3 = __esm({
15213
15213
  description: external_exports.string().trim().max(2e3).optional(),
15214
15214
  leadId: external_exports.string().uuid().optional()
15215
15215
  });
15216
+ estimateHours = external_exports.number().positive().max(9999).multipleOf(0.01).nullish();
15216
15217
  createIssueInput = external_exports.object({
15217
15218
  projectId: external_exports.string().uuid(),
15218
15219
  title: external_exports.string().trim().min(1).max(300),
@@ -15223,6 +15224,7 @@ var init_schemas3 = __esm({
15223
15224
  parentId: external_exports.string().uuid().nullish(),
15224
15225
  dueDate: external_exports.string().date().nullish(),
15225
15226
  // YYYY-MM-DD
15227
+ estimateHours,
15226
15228
  labelIds: external_exports.array(external_exports.string().uuid()).optional()
15227
15229
  });
15228
15230
  updateIssueInput = external_exports.object({
@@ -15230,7 +15232,8 @@ var init_schemas3 = __esm({
15230
15232
  description: external_exports.string().trim().max(2e4).nullish(),
15231
15233
  priority: issuePriority.optional(),
15232
15234
  assigneeId: external_exports.string().uuid().nullish(),
15233
- dueDate: external_exports.string().date().nullish()
15235
+ dueDate: external_exports.string().date().nullish(),
15236
+ estimateHours
15234
15237
  });
15235
15238
  moveIssueInput = external_exports.object({
15236
15239
  issueId: external_exports.string().uuid(),
@@ -15288,6 +15291,13 @@ var init_identity = __esm({
15288
15291
  }
15289
15292
  });
15290
15293
 
15294
+ // ../../packages/core/dist/effort.js
15295
+ var init_effort = __esm({
15296
+ "../../packages/core/dist/effort.js"() {
15297
+ "use strict";
15298
+ }
15299
+ });
15300
+
15291
15301
  // ../../packages/core/dist/plans.js
15292
15302
  var init_plans = __esm({
15293
15303
  "../../packages/core/dist/plans.js"() {
@@ -15339,6 +15349,7 @@ var init_dist = __esm({
15339
15349
  init_schemas3();
15340
15350
  init_rank();
15341
15351
  init_identity();
15352
+ init_effort();
15342
15353
  init_plans();
15343
15354
  init_mcp_connect();
15344
15355
  init_tree();
@@ -46450,8 +46461,18 @@ function systemPrompt(ctx, identity, worktree) {
46450
46461
  `survives. A run that ends with uncommitted changes has produced nothing,`,
46451
46462
  `however good the changes were.`,
46452
46463
  ``,
46453
- `Do not push, and do not merge into any other branch. Publishing is done`,
46454
- `for you after you exit, by the process that started you.`
46464
+ `Do not push, and do not merge into any other branch. That is not a`,
46465
+ `matter of trust \u2014 you have no push tool, and nothing in this loop`,
46466
+ `merges anything (\`CRA-88\`). Releasing is a person's job.`,
46467
+ ...options.push ? [
46468
+ `Your branch is published for you after you exit, by the process`,
46469
+ `that started you. It is pushed, not merged: somebody still has`,
46470
+ `to review and land it.`
46471
+ ] : [
46472
+ `Your branch stays on this machine. Nothing publishes it, so say`,
46473
+ `on the card which branch holds the work \u2014 that name is the only`,
46474
+ `way anyone finds it.`
46475
+ ]
46455
46476
  ] : [],
46456
46477
  ``,
46457
46478
  `You act on the board through the Cruo MCP tools. Start with get_issue to read the`,
@@ -46811,6 +46832,7 @@ async function main() {
46811
46832
  const swept = await sweep(worktreeConfig, options.harnessTimeoutMs + options.prepareTimeout);
46812
46833
  if (swept.length) log(` swept ${swept.length} worktree(s) left by an earlier run: ${swept.join(", ")}`);
46813
46834
  if (options.push) log(` publishing to ${options.pushRemote} after any run that commits`);
46835
+ else log(` --push is off: branches stay on this machine and reach no remote`);
46814
46836
  if (options.allow === "mcp__cruo") {
46815
46837
  log(`! --worktree with the default --allow gives the harness a checkout it cannot read.`);
46816
46838
  log(` Widen it, e.g. --allow "mcp__cruo,Read,Glob,Grep,Edit,Write,Bash(git:*),Bash(pnpm:*)"`);
package/dist/index.js CHANGED
@@ -34897,6 +34897,7 @@ var createProjectInput = external_exports.object({
34897
34897
  description: external_exports.string().trim().max(2e3).optional(),
34898
34898
  leadId: external_exports.string().uuid().optional()
34899
34899
  });
34900
+ var estimateHours = external_exports.number().positive().max(9999).multipleOf(0.01).nullish();
34900
34901
  var createIssueInput = external_exports.object({
34901
34902
  projectId: external_exports.string().uuid(),
34902
34903
  title: external_exports.string().trim().min(1).max(300),
@@ -34907,6 +34908,7 @@ var createIssueInput = external_exports.object({
34907
34908
  parentId: external_exports.string().uuid().nullish(),
34908
34909
  dueDate: external_exports.string().date().nullish(),
34909
34910
  // YYYY-MM-DD
34911
+ estimateHours,
34910
34912
  labelIds: external_exports.array(external_exports.string().uuid()).optional()
34911
34913
  });
34912
34914
  var updateIssueInput = external_exports.object({
@@ -34914,7 +34916,8 @@ var updateIssueInput = external_exports.object({
34914
34916
  description: external_exports.string().trim().max(2e4).nullish(),
34915
34917
  priority: issuePriority.optional(),
34916
34918
  assigneeId: external_exports.string().uuid().nullish(),
34917
- dueDate: external_exports.string().date().nullish()
34919
+ dueDate: external_exports.string().date().nullish(),
34920
+ estimateHours
34918
34921
  });
34919
34922
  var moveIssueInput = external_exports.object({
34920
34923
  issueId: external_exports.string().uuid(),
@@ -53389,6 +53392,9 @@ function issueDetail(project, issue2, opts = {}) {
53389
53392
  ];
53390
53393
  if (issue2.start_date || issue2.due_date)
53391
53394
  lines.push(`Schedule: ${issue2.start_date ?? "\u2014"} \u2192 ${issue2.due_date ?? "\u2014"}`);
53395
+ lines.push(
53396
+ issue2.estimate_hours == null ? "Estimate: none \u2014 nobody has sized this yet" : `Estimate: ${issue2.estimate_hours}h`
53397
+ );
53392
53398
  if (opts.labels && opts.labels.length)
53393
53399
  lines.push(`Labels: ${opts.labels.map((l) => l.name).join(", ")}`);
53394
53400
  if (opts.parent)
@@ -53420,6 +53426,7 @@ var FIELD_LABEL = {
53420
53426
  status_id: "status",
53421
53427
  parent_id: "parent",
53422
53428
  due_date: "due date",
53429
+ estimate_hours: "estimate",
53423
53430
  start_date: "start date",
53424
53431
  board_rank: "board position",
53425
53432
  gantt_pos: "gantt position"
@@ -53778,6 +53785,7 @@ function registerTools(server, getContext2, options = {}) {
53778
53785
  priority: issuePriority.optional(),
53779
53786
  assignee: external_exports.string().optional().describe("Member email, name, or 'me'"),
53780
53787
  due_date: external_exports.string().optional().describe("YYYY-MM-DD"),
53788
+ estimate_hours: external_exports.number().positive().max(9999).optional().describe("Estimated effort in hours. Omit if you do not know \u2014 an absent estimate reads as unestimated, which is not the same as free."),
53781
53789
  labels: external_exports.array(external_exports.string()).optional().describe("Label names to apply"),
53782
53790
  parent: external_exports.string().optional().describe("Make this a sub-issue of an issue in the same project, e.g. CRU-14")
53783
53791
  }
@@ -53808,6 +53816,7 @@ function registerTools(server, getContext2, options = {}) {
53808
53816
  assignee_id: assignee?.id ?? null,
53809
53817
  parent_id: parentId,
53810
53818
  due_date: args.due_date?.trim() || null,
53819
+ estimate_hours: args.estimate_hours ?? null,
53811
53820
  board_rank: rank,
53812
53821
  gantt_pos: ganttPos,
53813
53822
  created_by: ctx.userId
@@ -53836,7 +53845,7 @@ function registerTools(server, getContext2, options = {}) {
53836
53845
  "update_issue",
53837
53846
  {
53838
53847
  title: "Update issue",
53839
- description: "Update an issue's title, description, priority, assignee, due date, or parent. Use assignee 'none', due_date '', or parent 'none' to clear.",
53848
+ description: "Update an issue's title, description, priority, assignee, due date, estimate, or parent. Use assignee 'none', due_date '', estimate_hours 0, or parent 'none' to clear.",
53840
53849
  inputSchema: {
53841
53850
  issue: external_exports.string().describe("Issue reference, e.g. CRU-14"),
53842
53851
  title: external_exports.string().min(1).max(300).optional(),
@@ -53844,6 +53853,7 @@ function registerTools(server, getContext2, options = {}) {
53844
53853
  priority: issuePriority.optional(),
53845
53854
  assignee: external_exports.string().optional().describe("Member email/name/'me', or 'none' to clear"),
53846
53855
  due_date: external_exports.string().optional().describe("YYYY-MM-DD, or '' to clear"),
53856
+ estimate_hours: external_exports.number().min(0).max(9999).optional().describe("Estimated effort in hours; 0 clears it back to unestimated"),
53847
53857
  parent: external_exports.string().optional().describe(
53848
53858
  "Issue reference of the parent (same project), e.g. CRU-14, or 'none' to make it top-level"
53849
53859
  )
@@ -53856,6 +53866,8 @@ function registerTools(server, getContext2, options = {}) {
53856
53866
  if (args.description !== void 0) patch.description = String(args.description).trim() || null;
53857
53867
  if (args.priority !== void 0) patch.priority = args.priority;
53858
53868
  if (args.due_date !== void 0) patch.due_date = String(args.due_date).trim() || null;
53869
+ if (args.estimate_hours !== void 0)
53870
+ patch.estimate_hours = args.estimate_hours > 0 ? args.estimate_hours : null;
53859
53871
  if (args.assignee !== void 0) {
53860
53872
  patch.assignee_id = await resolveAssigneeArg(ctx, args.assignee, project);
53861
53873
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cruo-agent",
3
- "version": "0.1.2",
3
+ "version": "0.1.3",
4
4
  "description": "Run a Cruo agent: it watches your board, picks up the cards you assign it, and works them.",
5
5
  "license": "MIT",
6
6
  "homepage": "https://cruo.space/docs#agents",