@aopslabs/aops 0.3.31 → 0.3.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (147) hide show
  1. package/README.md +11 -3
  2. package/aops-assets-release/aops-assets.json.gz +0 -0
  3. package/aops-assets-release/disciplines/build-review-chat/SKILL.md +33 -0
  4. package/aops-assets-release/disciplines/coordinator-loop/SKILL.md +33 -0
  5. package/aops-assets-release/disciplines/design-first-consensus/SKILL.md +30 -0
  6. package/aops-assets-release/disciplines/solo-pm-loop/SKILL.md +31 -0
  7. package/aops-assets-release/docs/user-guides/agentspace-user-guide.md +384 -0
  8. package/aops-assets-release/docs/user-guides/aops-cli-user-guide.md +2067 -0
  9. package/aops-assets-release/docs/user-guides/chatv3-user-guide.md +500 -0
  10. package/aops-assets-release/docs/user-guides/docman-user-guide.md +1009 -0
  11. package/aops-assets-release/docs/user-guides/projectman-user-guide.md +763 -0
  12. package/aops-assets-release/docs/user-guides/tasker-user-guide.md +244 -0
  13. package/aops-assets-release/release.json +6 -0
  14. package/aops-assets-release/roles/coordinator/ROLE.md +28 -0
  15. package/aops-assets-release/roles/implementer/ROLE.md +27 -0
  16. package/aops-assets-release/roles/reviewer/ROLE.md +27 -0
  17. package/aops-assets-release/skills/aops/SKILL.md +112 -0
  18. package/aops-assets-release/skills/aops-bootstrapper-authoring/SKILL.md +245 -0
  19. package/aops-assets-release/skills/aops-cli-agentspace/SKILL.md +186 -0
  20. package/aops-assets-release/skills/aops-cli-board-lifecycle/SKILL.md +64 -0
  21. package/aops-assets-release/skills/aops-cli-chat/SKILL.md +204 -0
  22. package/aops-assets-release/skills/aops-cli-collab/SKILL.md +42 -0
  23. package/aops-assets-release/skills/aops-cli-core/SKILL.md +219 -0
  24. package/aops-assets-release/skills/aops-cli-discuss/SKILL.md +172 -0
  25. package/aops-assets-release/skills/aops-cli-docman/SKILL.md +192 -0
  26. package/aops-assets-release/skills/aops-cli-fileman/SKILL.md +169 -0
  27. package/aops-assets-release/skills/aops-cli-mission/SKILL.md +128 -0
  28. package/aops-assets-release/skills/aops-cli-operator-brief/SKILL.md +67 -0
  29. package/aops-assets-release/skills/aops-cli-projectman/SKILL.md +235 -0
  30. package/aops-assets-release/skills/aops-cli-sugar-authoring/SKILL.md +188 -0
  31. package/aops-assets-release/skills/aops-cli-tasker/SKILL.md +108 -0
  32. package/aops-assets-release/skills/aops-cli-tooling-agent/SKILL.md +112 -0
  33. package/aops-assets-release/skills/aops-cli-view/SKILL.md +210 -0
  34. package/aops-assets-release/skills/aops-collaborative-work/SKILL.md +304 -0
  35. package/aops-assets-release/skills/aops-interactive/SKILL.md +70 -0
  36. package/aops-assets-release/skills/aops-loop-interactive/SKILL.md +314 -0
  37. package/aops-assets-release/skills/aops-working-disciplines/SKILL.md +310 -0
  38. package/aops-assets-release/skills/feature-retirement-flow/SKILL.md +126 -0
  39. package/assets/skills/aops-install/SKILL.md +18 -17
  40. package/dist/commands/assets.js +93 -1264
  41. package/dist/commands/community-server.js +27 -8
  42. package/dist/commands/community-setup.js +1 -2
  43. package/dist/commands/discuss.js +1 -1
  44. package/dist/commands/doc.js +88 -27
  45. package/dist/commands/docs.js +68 -0
  46. package/dist/commands/global-update.js +28 -0
  47. package/dist/commands/init.js +3 -1
  48. package/dist/commands/loop.js +6379 -0
  49. package/dist/commands/memory.js +2 -1
  50. package/dist/commands/pm/index.js +11 -9
  51. package/dist/commands/pm/projectman.js +33 -2
  52. package/dist/commands/project.js +6 -6
  53. package/dist/commands/prompt.js +1 -1
  54. package/dist/commands/repo-sync.js +92 -27
  55. package/dist/commands/runner.js +257 -0
  56. package/dist/commands/skill.js +1 -1
  57. package/dist/commands/start.js +1 -1
  58. package/dist/commands/tasker.js +361 -0
  59. package/dist/commands/view.js +53 -9
  60. package/dist/lib/commercial-setup-readiness-adapter.js +0 -1
  61. package/dist/lib/community-migration-snapshot.js +7 -9
  62. package/dist/lib/community-native-database-recovery.js +5 -14
  63. package/dist/lib/community-native-lifecycle.js +13 -0
  64. package/dist/lib/setup-agent-assets-bridge.js +28 -148
  65. package/dist/lib/setup-agent-assets-release.js +16 -44
  66. package/dist/lib/setup-init-orchestrator.js +11 -15
  67. package/dist/lib/simple-agent-assets.js +447 -0
  68. package/dist/lib/user-guide-sections.js +488 -0
  69. package/dist/main.js +10 -2
  70. package/dist/seeds/agents-md.js +3 -3
  71. package/dist/utils/agents-md.js +1 -1
  72. package/dist/utils/guide-paths.js +7 -7
  73. package/dist/utils/hosted-workspace.js +2 -1
  74. package/dist/utils/repo-first-storage.js +26 -1
  75. package/dist/utils/session-state.js +2 -7
  76. package/launchers/aops-cockpit.sh +0 -0
  77. package/launchers/aops-server.sh +0 -0
  78. package/package.json +67 -35
  79. package/THIRD_PARTY_NOTICES +0 -16169
  80. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/SKILL.md +0 -47
  81. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/agentspace/SKILL.md +0 -72
  82. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/aops-cli-core/SKILL.md +0 -110
  83. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/chatv3/SKILL.md +0 -59
  84. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/collaborative-work/SKILL.md +0 -81
  85. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/discuss/SKILL.md +0 -66
  86. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/docman/SKILL.md +0 -75
  87. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/projectman/SKILL.md +0 -92
  88. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/sys/SKILL.md +0 -36
  89. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/view/SKILL.md +0 -58
  90. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/working-disciplines/SKILL.md +0 -66
  91. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/agent-assets.md +0 -81
  92. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/agentspace.md +0 -183
  93. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/aops-cli.md +0 -1108
  94. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/aops-system.md +0 -102
  95. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/chatv3.md +0 -113
  96. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/docman.md +0 -223
  97. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/projectman.md +0 -233
  98. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/sys.md +0 -94
  99. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/working-disciplines.md +0 -482
  100. package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/manifest.json +0 -117
  101. package/agent-assets-release/agent-assets/gateway/aops/SKILL.md +0 -14
  102. package/agent-assets-release/agent-assets/inventory.json +0 -29
  103. package/agent-assets-release/agent-assets/projection.json +0 -8
  104. package/agent-assets-release/agent-assets-release.json +0 -171
  105. package/agent-assets-release/agent-assets-release.sigstore.json +0 -67
  106. package/assets/agent-assets/core/SKILL.md +0 -47
  107. package/assets/agent-assets/core/references/agentspace/SKILL.md +0 -72
  108. package/assets/agent-assets/core/references/aops-cli-core/SKILL.md +0 -110
  109. package/assets/agent-assets/core/references/chatv3/SKILL.md +0 -59
  110. package/assets/agent-assets/core/references/collaborative-work/SKILL.md +0 -81
  111. package/assets/agent-assets/core/references/discuss/SKILL.md +0 -66
  112. package/assets/agent-assets/core/references/docman/SKILL.md +0 -75
  113. package/assets/agent-assets/core/references/projectman/SKILL.md +0 -92
  114. package/assets/agent-assets/core/references/sys/SKILL.md +0 -36
  115. package/assets/agent-assets/core/references/view/SKILL.md +0 -58
  116. package/assets/agent-assets/core/references/working-disciplines/SKILL.md +0 -66
  117. package/assets/agent-assets/core/user-guides/agent-assets.md +0 -81
  118. package/assets/agent-assets/core/user-guides/agentspace.md +0 -183
  119. package/assets/agent-assets/core/user-guides/aops-cli.md +0 -1108
  120. package/assets/agent-assets/core/user-guides/aops-system.md +0 -102
  121. package/assets/agent-assets/core/user-guides/chatv3.md +0 -113
  122. package/assets/agent-assets/core/user-guides/docman.md +0 -223
  123. package/assets/agent-assets/core/user-guides/projectman.md +0 -233
  124. package/assets/agent-assets/core/user-guides/sys.md +0 -94
  125. package/assets/agent-assets/core/user-guides/working-disciplines.md +0 -482
  126. package/assets/agent-assets/gateway/aops/SKILL.md +0 -14
  127. package/dist/lib/agent-assets/gateway.js +0 -15
  128. package/dist/lib/agent-assets/guards.js +0 -23
  129. package/dist/lib/agent-assets/hosted-discovery.js +0 -148
  130. package/dist/lib/agent-assets/hosted-package-input.js +0 -154
  131. package/dist/lib/agent-assets/legacy-pointer-migration.js +0 -677
  132. package/dist/lib/agent-assets/native-fs.js +0 -589
  133. package/dist/lib/agent-assets/roots.js +0 -45
  134. package/dist/lib/agent-assets/runtime-binding-reader.js +0 -545
  135. package/dist/lib/agent-assets/runtime-targets.js +0 -50
  136. package/dist/lib/agent-assets/store-reader.js +0 -1212
  137. package/dist/lib/agent-assets/store-writer.js +0 -1484
  138. package/native/bin/darwin-arm64/aops-agent-assets-fs +0 -0
  139. package/native/bin/darwin-x64/aops-agent-assets-fs +0 -0
  140. package/native/bin/linux-arm64/aops-agent-assets-fs +0 -0
  141. package/native/bin/linux-x64/aops-agent-assets-fs +0 -0
  142. package/native/bin/win32-x64/aops-agent-assets-fs.exe +0 -0
  143. package/native/manifest.json +0 -49
  144. package/native/qualifications/win32-x64.json +0 -23
  145. package/native/tui/darwin-arm64/aops-tui +0 -0
  146. package/native/tui/linux-x64/aops-tui +0 -0
  147. package/native/tui/win32-x64/aops-tui.exe +0 -0
@@ -2597,6 +2597,7 @@ function applyMemoryContextOptions(cmd) {
2597
2597
  cmd.option('--scope-id <id>', 'Canonical owner scope override');
2598
2598
  cmd.option('--project-id <id>', 'Project id used to resolve scope and memory ownership');
2599
2599
  cmd.option('--project-name <name>', 'Project name override for repo-aware scope resolution');
2600
+ cmd.option('--project-slug <slug>', 'Project slug override for repo-aware scope resolution');
2600
2601
  cmd.option('--tenant-id <id>', 'Tenant id header (x-tenant-id)');
2601
2602
  cmd.option('--locale <locale>', 'Locale header (x-locale)');
2602
2603
  cmd.option('--fallback-locale <locale>', 'Fallback locale header (x-fallback-locale)');
@@ -3120,7 +3121,7 @@ Advanced surface:
3120
3121
  'AI/automation varsayilani short memory olmalidir; durable `note` ve sticky `rule` yalnizca operator/human acikca isterse yazilmalidir.',
3121
3122
  '`--mode` kickoff/resume/decision/blocker/closeout/rule kisayollaridir; `note` icin `--kind note --durability short|durable|sticky` kullan.',
3122
3123
  "PowerShell icinde @file content pointerlarini tirnakla yaz: `--content '@tmp/checkpoint.md'`.",
3123
- 'Memory backend SERVER-FIRST hosted Agentspace memory-item ops uzerindendir (create/write/read hepsi hosted); local `.aops/agentspace/memory` source-of-truth DEGIL, yalnizca read-only file-search cache.',
3124
+ 'Memory backend SERVER-FIRST hosted Agentspace memory-item ops uzerindendir (create/write/read hepsi hosted); local `.aops-cache/agentspace/memory` source-of-truth DEGIL, yalnizca read-only file-search cache.',
3124
3125
  '`handoff` gorunumu canonical `resume` kayitlarinin alias\'idir.',
3125
3126
  '--content zorunludur; @file ile dosyadan okunur (or paste inline); uzun canonical icerik yerine --next-read-ref/--source-ref ile pointer ver.',
3126
3127
  'Soft TTL silme yapmaz; expired memory tutulur ama retrieval tarafinda asagi itilir.',
@@ -402,6 +402,7 @@ function addIssueCommands(cmd) {
402
402
  .option('--severity <value>', 'Optional issue severity filter')
403
403
  .option('--source <value>', 'Optional issue source filter')
404
404
  .option('--tag <value>', 'Repeatable issue tag filter', collectRepeatedOption, [])
405
+ .option('--limit <count>', 'Optional positive maximum result count')
405
406
  .action(async (options) => {
406
407
  await runPmIssueList(options);
407
408
  }));
@@ -461,10 +462,11 @@ function addFeedbackCommands(cmd) {
461
462
  .option('--sprint <id>', 'Optional sprint id filter')
462
463
  .option('--utask <id>', 'Optional sprint microtask id filter')
463
464
  .option('--status <value>', 'Optional feedback status filter')
464
- .option('--type <value>', 'Optional feedback type filter')
465
+ .option('--type <value>', 'Optional feedback type filter: refactor, bug, improvement, warning, observation, other')
465
466
  .option('--severity <value>', 'Optional feedback severity filter')
466
- .option('--source <value>', 'Optional feedback source filter')
467
+ .option('--source <value>', 'Optional feedback source filter: human, agent, automation')
467
468
  .option('--tag <value>', 'Repeatable feedback tag filter', collectRepeatedOption, [])
469
+ .option('--limit <count>', 'Optional positive maximum result count')
468
470
  .action(async (options) => {
469
471
  await runPmFeedbackList(options);
470
472
  }));
@@ -481,9 +483,9 @@ function addFeedbackCommands(cmd) {
481
483
  .requiredOption('--title <title>', 'Feedback title')
482
484
  .option('--description <text>', 'Feedback description')
483
485
  .option('--status <value>', 'Initial feedback status')
484
- .option('--type <value>', 'Feedback type')
486
+ .option('--type <value>', 'Feedback type: refactor, bug, improvement, warning, observation, other')
485
487
  .option('--severity <value>', 'Feedback severity')
486
- .option('--source <value>', 'Feedback source')
488
+ .option('--source <value>', 'Feedback source: human, agent, automation')
487
489
  .option('--task <id>', 'Linked kanban task id')
488
490
  .option('--sprint <id>', 'Linked sprint id')
489
491
  .option('--utask <id>', 'Linked sprint microtask id')
@@ -499,9 +501,9 @@ function addFeedbackCommands(cmd) {
499
501
  .option('--title <title>', 'Updated feedback title')
500
502
  .option('--description <text>', 'Updated feedback description')
501
503
  .option('--status <value>', 'Updated feedback status')
502
- .option('--type <value>', 'Updated feedback type')
504
+ .option('--type <value>', 'Updated feedback type: refactor, bug, improvement, warning, observation, other')
503
505
  .option('--severity <value>', 'Updated feedback severity')
504
- .option('--source <value>', 'Updated feedback source')
506
+ .option('--source <value>', 'Updated feedback source: human, agent, automation')
505
507
  .option('--task <id>', 'Updated kanban task id link')
506
508
  .option('--sprint <id>', 'Updated sprint id link')
507
509
  .option('--utask <id>', 'Updated sprint microtask id link')
@@ -533,7 +535,7 @@ function addReviewRequestCommands(cmd) {
533
535
  .option('--utask <id>', 'Optional sprint microtask id filter')
534
536
  .option('--status <value>', 'Optional review-request status filter')
535
537
  .option('--priority <value>', 'Optional review-request priority filter')
536
- .option('--source <value>', 'Optional review-request source filter')
538
+ .option('--source <value>', 'Optional review-request source filter: human, agent, automation, collab')
537
539
  .option('--target-agent <id>', 'Optional reviewer agent filter')
538
540
  .option('--target-slot <slot>', 'Optional reviewer role slot filter')
539
541
  .option('--parent <id>', 'Optional parent review-request id filter')
@@ -559,7 +561,7 @@ function addReviewRequestCommands(cmd) {
559
561
  .option('--reference <value>', 'Repeatable reference pointer', collectRepeatedOption, [])
560
562
  .option('--status <value>', 'Initial status: requested, in_review, responded, accepted, changes_requested, closed, cancelled')
561
563
  .option('--priority <value>', 'Priority: low, medium, high, critical (default medium)')
562
- .option('--source <value>', 'Source: agent, operator, collab, sync, import, manual')
564
+ .option('--source <value>', 'Source: human, agent, automation, collab')
563
565
  .option('--task <id>', 'Linked kanban task id')
564
566
  .option('--sprint <id>', 'Linked sprint id')
565
567
  .option('--utask <id>', 'Linked sprint microtask id')
@@ -581,7 +583,7 @@ function addReviewRequestCommands(cmd) {
581
583
  .option('--instructions <text>', 'Updated reviewer instructions')
582
584
  .option('--reference <value>', 'Repeatable reference pointer patch', collectRepeatedOption, [])
583
585
  .option('--priority <value>', 'Updated priority')
584
- .option('--source <value>', 'Updated source')
586
+ .option('--source <value>', 'Updated source: human, agent, automation, collab')
585
587
  .option('--task <id>', 'Updated kanban task id link')
586
588
  .option('--sprint <id>', 'Updated sprint id link')
587
589
  .option('--utask <id>', 'Updated sprint microtask id link')
@@ -1856,6 +1856,15 @@ function parseOptionalInteger(value, label) {
1856
1856
  }
1857
1857
  return normalized;
1858
1858
  }
1859
+ function parseOptionalPositiveInteger(value, label) {
1860
+ if (value === undefined || value === null || value === '')
1861
+ return undefined;
1862
+ const parsed = typeof value === 'number' ? value : Number(String(value));
1863
+ if (!Number.isInteger(parsed) || parsed <= 0) {
1864
+ throw new Error(`${label} must be a positive integer.`);
1865
+ }
1866
+ return parsed;
1867
+ }
1859
1868
  function buildCommandEnvelope(params) {
1860
1869
  return {
1861
1870
  command: params.command,
@@ -5342,6 +5351,7 @@ export async function runPmIssueList(options = {}) {
5342
5351
  const severity = normalizeNonEmpty(options.severity);
5343
5352
  const source = normalizeNonEmpty(options.source);
5344
5353
  const tags = normalizeArrayValues(options.tag);
5354
+ const limit = parseOptionalPositiveInteger(options.limit, '--limit');
5345
5355
  if (status)
5346
5356
  input.status = status;
5347
5357
  if (severity)
@@ -5350,10 +5360,20 @@ export async function runPmIssueList(options = {}) {
5350
5360
  input.source = source;
5351
5361
  if (tags)
5352
5362
  input.tags = tags;
5353
- const payload = await invokeProjectmanTool(execution, options, {
5363
+ const rawPayload = await invokeProjectmanTool(execution, options, {
5354
5364
  toolId: 'projectman.issue.list',
5355
5365
  input,
5356
5366
  });
5367
+ const records = toRecordArray(unwrapHostedToolResult(rawPayload));
5368
+ const visibleRecords = limit === undefined ? records : records.slice(0, limit);
5369
+ const payload = {
5370
+ response: {
5371
+ data: visibleRecords,
5372
+ count: records.length,
5373
+ shown: visibleRecords.length,
5374
+ hasMore: visibleRecords.length < records.length,
5375
+ },
5376
+ };
5357
5377
  emitCommandResult(options, {
5358
5378
  command: 'pm.issue.list',
5359
5379
  toolId: 'projectman.issue.list',
@@ -5570,6 +5590,7 @@ export async function runPmFeedbackList(options = {}) {
5570
5590
  const severity = normalizeNonEmpty(options.severity);
5571
5591
  const source = normalizeNonEmpty(options.source);
5572
5592
  const tags = normalizeArrayValues(options.tag);
5593
+ const limit = parseOptionalPositiveInteger(options.limit, '--limit');
5573
5594
  if (status)
5574
5595
  input.status = status;
5575
5596
  if (type)
@@ -5580,10 +5601,20 @@ export async function runPmFeedbackList(options = {}) {
5580
5601
  input.source = source;
5581
5602
  if (tags)
5582
5603
  input.tags = tags;
5583
- const payload = await invokeProjectmanTool(execution, options, {
5604
+ const rawPayload = await invokeProjectmanTool(execution, options, {
5584
5605
  toolId: 'projectman.feedback.list',
5585
5606
  input,
5586
5607
  });
5608
+ const records = toRecordArray(unwrapHostedToolResult(rawPayload));
5609
+ const visibleRecords = limit === undefined ? records : records.slice(0, limit);
5610
+ const payload = {
5611
+ response: {
5612
+ data: visibleRecords,
5613
+ count: records.length,
5614
+ shown: visibleRecords.length,
5615
+ hasMore: visibleRecords.length < records.length,
5616
+ },
5617
+ };
5587
5618
  emitCommandResult(options, {
5588
5619
  command: 'pm.feedback.list',
5589
5620
  toolId: 'projectman.feedback.list',
@@ -236,8 +236,8 @@ function normalizeMigrationLocalRoot(value) {
236
236
  if (normalized === '.' || normalized.startsWith('../') || normalized === '..') {
237
237
  throw new Error('--local-root must stay inside the repo.');
238
238
  }
239
- if (!normalized.startsWith('.aops/projects/')) {
240
- throw new Error('--local-root must be under .aops/projects/<slug>.');
239
+ if (!normalized.startsWith('.aops-cache/projects/')) {
240
+ throw new Error('--local-root must be under .aops-cache/projects/<slug>.');
241
241
  }
242
242
  return normalized;
243
243
  }
@@ -514,7 +514,7 @@ async function applyLocalRootMigration(params) {
514
514
  }
515
515
  const repoRoot = params.plan.repoRoot;
516
516
  const archiveRoot = path.join(repoRoot, params.plan.archiveRoot);
517
- const tempTargetRoot = path.join(repoRoot, '.aops', 'projects', `.tmp-${params.plan.projectSlug}-migrate-${path.basename(params.plan.archiveRoot)}`);
517
+ const tempTargetRoot = path.join(repoRoot, '.aops-cache', 'projects', `.tmp-${params.plan.projectSlug}-migrate-${path.basename(params.plan.archiveRoot)}`);
518
518
  const targetRoot = path.join(repoRoot, params.plan.localRoot);
519
519
  const sourceProjectman = path.join(repoRoot, '.aops', 'projectman');
520
520
  const sourceAgentspace = path.join(repoRoot, '.aops', 'agentspace');
@@ -1045,9 +1045,9 @@ export function makeProjectCommand() {
1045
1045
  await runProjectLink(options);
1046
1046
  });
1047
1047
  applyProjectContextOptions(cmd.command('migrate-local-root')
1048
- .description('Plan or apply flat .aops projectman/agentspace migration into .aops/projects/<slug>')
1048
+ .description('Plan or apply flat .aops projectman/agentspace migration into .aops-cache/projects/<slug>')
1049
1049
  .requiredOption('--project-slug <slug>', 'Repo project slug to migrate')
1050
- .requiredOption('--local-root <path>', 'Target local root, normally .aops/projects/<slug>')
1050
+ .requiredOption('--local-root <path>', 'Target local root, normally .aops-cache/projects/<slug>')
1051
1051
  .option('--dry-run', 'Build the migration summary without mutating files')
1052
1052
  .option('--apply', 'Apply the migration after dry-run review')
1053
1053
  .option('--confirm', 'Required with --apply because flat roots are moved to an archive')
@@ -1066,7 +1066,7 @@ export function makeProjectCommand() {
1066
1066
  'aops-cli project create --name "Demo Project" --apply --json',
1067
1067
  'aops-cli project update --id <project-id> --project-type app --apply --json',
1068
1068
  'aops-cli project link --slug aops-cockpit --mode hosted-only --apply --json',
1069
- 'aops-cli project migrate-local-root --project-slug aops --local-root .aops/projects/aops --dry-run --json',
1069
+ 'aops-cli project migrate-local-root --project-slug aops --local-root .aops-cache/projects/aops --dry-run --json',
1070
1070
  'aops-cli project links list --json',
1071
1071
  ],
1072
1072
  guide: GUIDE_PATHS.agentspace,
@@ -1015,7 +1015,7 @@ export function makePromptCommand() {
1015
1015
  guide: GUIDE_PATHS.agentspace,
1016
1016
  notes: [
1017
1017
  'Canonical reusable prompt truth lives in aops-server/DB; create/update/publish through these prompt commands.',
1018
- '.aops/hosted/prompts/** is a read-only repo mirror refreshed by sync pull/bootstrap, not an authoring source.',
1018
+ '.aops-cache/hosted/prompts/** is a read-only repo mirror refreshed by sync pull/bootstrap, not an authoring source.',
1019
1019
  'Prompt version list/inspect/current are curated read surfaces and do not require --apply; use --summary unless you need full prompt-version content.',
1020
1020
  'When --version is omitted, the CLI resolves the next version number from existing prompt versions.',
1021
1021
  ],
@@ -12,6 +12,7 @@ import { parseFrontmatterDocument, readLocalMemoryEntries, rebuildLocalMemoryWor
12
12
  import { readExperienceItems, rebuildExperienceWorkspace, } from '../utils/experience-workspace.js';
13
13
  import { resolveOwnerScopeIdFromProjectRecord, resolveProjectBindingContext, } from '../utils/project-context.js';
14
14
  import { collectRepoFirstSyncRecords, rebuildProjectmanViews, resolveRepoFirstAgentspacePaths, resolveRepoFirstProjectmanPaths, } from '../utils/repo-first-projectman.js';
15
+ import { ensureAopsPrivatePathsIgnored, resolveAopsCacheRoot, resolveRepoFirstWorkspaceRelativeRoot } from '../utils/repo-first-storage.js';
15
16
  import { loadAopsRepoConfig, loadAopsRepoConfigReadOnly, readAopsRepoConfigReadOnly, } from '../utils/repo-config.js';
16
17
  import { hostedProjectKey, rebuildHostedWorkspace, syncHostedMirrorKind, } from '../utils/hosted-workspace.js';
17
18
  import { GUIDE_PATHS } from '../utils/guide-paths.js';
@@ -558,7 +559,7 @@ function emit(options, envelope, fallback) {
558
559
  console.log(JSON.stringify(envelope.result ?? envelope, null, 2));
559
560
  }
560
561
  async function writeState(repoRoot, payload) {
561
- const statePath = path.join(repoRoot, '.aops', 'sync', 'state.json');
562
+ const statePath = path.join(resolveAopsCacheRoot(repoRoot), 'sync', 'state.json');
562
563
  await fs.mkdir(path.dirname(statePath), { recursive: true });
563
564
  const previous = await readState(repoRoot);
564
565
  await writeFileWithRetry(statePath, `${JSON.stringify({
@@ -570,7 +571,7 @@ async function writeState(repoRoot, payload) {
570
571
  return statePath;
571
572
  }
572
573
  async function readState(repoRoot) {
573
- const statePath = path.join(repoRoot, '.aops', 'sync', 'state.json');
574
+ const statePath = path.join(resolveAopsCacheRoot(repoRoot), 'sync', 'state.json');
574
575
  try {
575
576
  const parsed = JSON.parse(await fs.readFile(statePath, 'utf8'));
576
577
  return isRecord(parsed) ? parsed : {};
@@ -580,19 +581,7 @@ async function readState(repoRoot) {
580
581
  }
581
582
  }
582
583
  async function ensureGitignore(repoRoot) {
583
- const gitignorePath = path.join(repoRoot, '.gitignore');
584
- const entry = '.aops/sync/state.json';
585
- let content = '';
586
- try {
587
- content = await fs.readFile(gitignorePath, 'utf8');
588
- }
589
- catch {
590
- content = '';
591
- }
592
- if (content.split(/\r?\n/).includes(entry))
593
- return;
594
- const next = `${content.trimEnd()}${content.trimEnd() ? '\n' : ''}${entry}\n`;
595
- await writeFileWithRetry(gitignorePath, next, 'utf8');
584
+ await ensureAopsPrivatePathsIgnored(repoRoot);
596
585
  }
597
586
  function commonFrontmatter(params) {
598
587
  const now = new Date().toISOString();
@@ -613,6 +602,70 @@ function commonFrontmatter(params) {
613
602
  storage: 'local-cache',
614
603
  });
615
604
  }
605
+ function markdownHeading(value, fallback) {
606
+ return normalizeNonEmpty(value)?.replace(/\s+/g, ' ') ?? fallback;
607
+ }
608
+ function progressLabel(value) {
609
+ if (!isRecord(value))
610
+ return undefined;
611
+ const completed = numberField(value.completed);
612
+ const actionable = numberField(value.actionable);
613
+ const total = numberField(value.total);
614
+ const ratio = typeof value.ratio === 'number' && Number.isFinite(value.ratio)
615
+ ? `${Math.round(value.ratio * 100)}%`
616
+ : undefined;
617
+ const count = completed !== undefined && (actionable ?? total) !== undefined
618
+ ? `${completed}/${actionable ?? total}`
619
+ : undefined;
620
+ if (count && ratio)
621
+ return `${count} (${ratio})`;
622
+ return count ?? ratio;
623
+ }
624
+ export function renderSprintMirrorBody(sprint) {
625
+ const lines = [`# ${markdownHeading(sprint.name ?? sprint.title, 'Untitled sprint')}`, '', '## Phases'];
626
+ const phases = toRecordArray(sprint.phases);
627
+ if (phases.length === 0) {
628
+ lines.push('', '_No phases._');
629
+ return `${lines.join('\n')}\n`;
630
+ }
631
+ phases.forEach((phase, phaseIndex) => {
632
+ lines.push('', `### ${phaseIndex + 1}. ${markdownHeading(phase.name, `Phase ${phaseIndex + 1}`)}`);
633
+ const phaseMeta = [
634
+ ['ID', normalizeNonEmpty(phase.id)],
635
+ ['Status', normalizeNonEmpty(phase.status)],
636
+ ['Progress', progressLabel(phase.progress)],
637
+ ];
638
+ for (const [label, value] of phaseMeta) {
639
+ if (value)
640
+ lines.push(`- ${label}: ${value}`);
641
+ }
642
+ const description = normalizeNonEmpty(phase.description);
643
+ if (description)
644
+ lines.push('', description);
645
+ lines.push('', '#### Microtasks');
646
+ const microtasks = toRecordArray(phase.microtasks);
647
+ if (microtasks.length === 0) {
648
+ lines.push('', '_No microtasks._');
649
+ return;
650
+ }
651
+ microtasks.forEach((microtask, microtaskIndex) => {
652
+ lines.push('', `##### ${microtaskIndex + 1}. ${markdownHeading(microtask.title, `Microtask ${microtaskIndex + 1}`)}`);
653
+ const microtaskMeta = [
654
+ ['ID', normalizeNonEmpty(microtask.id)],
655
+ ['Status', normalizeNonEmpty(microtask.status)],
656
+ ['Position', numberField(microtask.position)?.toString()],
657
+ ];
658
+ for (const [label, value] of microtaskMeta) {
659
+ if (value)
660
+ lines.push(`- ${label}: ${value}`);
661
+ }
662
+ const notes = normalizeNonEmpty(microtask.notes);
663
+ if (notes)
664
+ lines.push('', '**Notes**', '', notes);
665
+ });
666
+ });
667
+ return `${lines.join('\n')}\n`;
668
+ }
616
669
  async function writeProjectmanSeedFile(params) {
617
670
  const remoteId = normalizeNonEmpty(params.remote.id);
618
671
  const existing = remoteId ? await findRecordByRemoteId(params.dir, remoteId) : null;
@@ -622,7 +675,12 @@ async function writeProjectmanSeedFile(params) {
622
675
  const localId = normalizeNonEmpty(existing?.frontmatter.localId) ?? randomUUID();
623
676
  const title = normalizeNonEmpty(params.remote[params.titleKey]) ?? normalizeNonEmpty(params.remote.name) ?? normalizeNonEmpty(params.remote.title) ?? localId;
624
677
  const filePath = existing?.filePath ?? path.join(params.dir, `${slugify(title)}-${localId.slice(0, 8)}.md`);
625
- const body = `# ${title}\n`;
678
+ const body = params.entityType === 'projectman.sprint'
679
+ ? renderSprintMirrorBody(params.remote)
680
+ : `# ${title}\n`;
681
+ const remoteFrontmatter = params.entityType === 'projectman.sprint'
682
+ ? Object.fromEntries(Object.entries(params.remote).filter(([key]) => key !== 'phases'))
683
+ : params.remote;
626
684
  const frontmatter = withBaseHash({
627
685
  ...commonFrontmatter({
628
686
  entityType: params.entityType,
@@ -632,7 +690,7 @@ async function writeProjectmanSeedFile(params) {
632
690
  remoteId,
633
691
  remoteUpdatedAt: normalizeNonEmpty(params.remote.updatedAt),
634
692
  }),
635
- ...params.remote,
693
+ ...remoteFrontmatter,
636
694
  id: localId,
637
695
  localId,
638
696
  remoteId,
@@ -707,6 +765,7 @@ async function writeUtaskSeedFile(params) {
707
765
  phaseId: normalizeNonEmpty(params.phase.localId) ?? normalizeNonEmpty(params.phase.id),
708
766
  phaseRemoteId: normalizeNonEmpty(params.phase.remoteId) ?? normalizeNonEmpty(params.phase.id),
709
767
  phaseName: normalizeNonEmpty(params.phase.name),
768
+ phasePosition: numberField(params.phase.position),
710
769
  title,
711
770
  status: normalizeNonEmpty(params.microtask.status) ?? 'todo',
712
771
  position: numberField(params.microtask.position),
@@ -1210,7 +1269,11 @@ async function collectSyncPullData(options, command, context, apiState) {
1210
1269
  filesWritten.push(...await writeUtaskSeedFilesFromSprint({
1211
1270
  repoRoot: context.repoRoot,
1212
1271
  localRoot: context.localRoot,
1213
- sprint: sprintRecord.frontmatter,
1272
+ sprint: {
1273
+ ...row,
1274
+ ...sprintRecord.frontmatter,
1275
+ phases: row.phases,
1276
+ },
1214
1277
  projectId,
1215
1278
  scopeId,
1216
1279
  idsAreRemote: true,
@@ -1790,6 +1853,7 @@ async function runSyncRebuildViews(options) {
1790
1853
  items: memoryItems,
1791
1854
  });
1792
1855
  await rebuildHostedWorkspace(context.repoRoot);
1856
+ const workspaceRoot = resolveRepoFirstWorkspaceRelativeRoot(context);
1793
1857
  emit(options, {
1794
1858
  command: 'sync.rebuild-views',
1795
1859
  surface: 'hosted-cache-sync',
@@ -1798,10 +1862,10 @@ async function runSyncRebuildViews(options) {
1798
1862
  ok: true,
1799
1863
  data: {
1800
1864
  views: [
1801
- '.aops/projectman/views/index.md',
1802
- '.aops/agentspace/experience/index.md',
1803
- '.aops/agentspace/memory/index.md',
1804
- '.aops/hosted/index.md',
1865
+ `${workspaceRoot}/projectman/views/index.md`,
1866
+ `${workspaceRoot}/agentspace/experience/index.md`,
1867
+ `${workspaceRoot}/agentspace/memory/index.md`,
1868
+ '.aops-cache/hosted/index.md',
1805
1869
  ],
1806
1870
  },
1807
1871
  },
@@ -1886,13 +1950,14 @@ export function makeSyncCommand() {
1886
1950
  'aops-cli sync pull --apply --json',
1887
1951
  'aops-cli sync pull --all-projects --apply --json',
1888
1952
  'aops-cli sync pull --apply --hosted-project-slug aops --json',
1889
- 'aops-cli sync resolve --path .aops/projectman/sprints/demo.md --prefer remote --json',
1953
+ 'aops-cli sync resolve --path .aops-cache/projectman/sprints/demo.md --prefer remote --json',
1890
1954
  ],
1891
1955
  guide: GUIDE_PATHS.operator,
1892
1956
  notes: [
1893
- 'Server-first: hosted server state is the single source of truth. `.aops/**` source files are a read-only local cache refreshed by `sync pull`/`sync bootstrap`; there is no `sync push` (write to hosted state with the hosted CLI/domain ops).',
1894
- 'Hosted reusable prompts/skills stay single-source on the server; sync pull/bootstrap only mirror them into `.aops/hosted/**` as read-only local context.',
1895
- 'Hosted Docman documents and guide mirrors use `aops-cli doc mirror pull --out-dir ./.aops/docman`; `sync pull` does not refresh `.aops/docman/**`.',
1957
+ 'Server-first: hosted server state is the single source of truth. `.aops-cache/**` files are a generated read-only local cache refreshed by `sync pull`/`sync bootstrap`; there is no `sync push` (write to hosted state with the hosted CLI/domain ops).',
1958
+ '`.aops/aops.config.json` is private repo metadata; both `/.aops/` and `/.aops-cache/` are ignored so public repositories do not publish operator state.',
1959
+ 'Hosted reusable prompts/skills stay single-source on the server; sync pull/bootstrap only mirror them into `.aops-cache/hosted/**` as read-only local context.',
1960
+ 'Hosted Docman documents and guide mirrors use `aops-cli doc mirror pull --out-dir ./.aops-cache/docman`; `sync pull` does not refresh `.aops-cache/docman/**`.',
1896
1961
  '`sync status` and `sync diff` accept repeatable selective scope flags: --board, --task, --sprint, --issue, --feedback, --review-request, and --record.',
1897
1962
  'Board/task/sprint selection expands to related Projectman records and linked Agentspace memory/experience context. `--record` matches local path, localId, remoteId, slug, name, or title.',
1898
1963
  '`--all-projects` runs status/diff/pull/bootstrap once per repo-config project (server-first; no authoring-mode split), skips only projects without a localRoot in a multi-project repo, and reports project-level errors without fail-fast.',
@@ -1900,7 +1965,7 @@ export function makeSyncCommand() {
1900
1965
  'Hosted writes are the source of truth, so the local cache never replays back. If a cache file drifts, re-run `sync pull` to refresh it from the server; `sync resolve --prefer remote` re-adopts a single record from hosted state.',
1901
1966
  'Browser/cockpit surfaces must never assume the remote aops-server machine has the repo. Use `aops-cli sync sidecar --allow-origin <cockpit-origin>` on the client machine to expose a localhost-only read-only status/diff bridge.',
1902
1967
  '`localId` is UUIDv4. `remoteId` is filled after hosted sync/bootstrap.',
1903
- '.aops/sync/state.json is local machine sync state and is ignored by git.',
1968
+ '.aops-cache/sync/state.json is local machine sync state and is ignored by git.',
1904
1969
  ],
1905
1970
  }));
1906
1971
  return cmd;