@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.
- package/README.md +11 -3
- package/aops-assets-release/aops-assets.json.gz +0 -0
- package/aops-assets-release/disciplines/build-review-chat/SKILL.md +33 -0
- package/aops-assets-release/disciplines/coordinator-loop/SKILL.md +33 -0
- package/aops-assets-release/disciplines/design-first-consensus/SKILL.md +30 -0
- package/aops-assets-release/disciplines/solo-pm-loop/SKILL.md +31 -0
- package/aops-assets-release/docs/user-guides/agentspace-user-guide.md +384 -0
- package/aops-assets-release/docs/user-guides/aops-cli-user-guide.md +2067 -0
- package/aops-assets-release/docs/user-guides/chatv3-user-guide.md +500 -0
- package/aops-assets-release/docs/user-guides/docman-user-guide.md +1009 -0
- package/aops-assets-release/docs/user-guides/projectman-user-guide.md +763 -0
- package/aops-assets-release/docs/user-guides/tasker-user-guide.md +244 -0
- package/aops-assets-release/release.json +6 -0
- package/aops-assets-release/roles/coordinator/ROLE.md +28 -0
- package/aops-assets-release/roles/implementer/ROLE.md +27 -0
- package/aops-assets-release/roles/reviewer/ROLE.md +27 -0
- package/aops-assets-release/skills/aops/SKILL.md +112 -0
- package/aops-assets-release/skills/aops-bootstrapper-authoring/SKILL.md +245 -0
- package/aops-assets-release/skills/aops-cli-agentspace/SKILL.md +186 -0
- package/aops-assets-release/skills/aops-cli-board-lifecycle/SKILL.md +64 -0
- package/aops-assets-release/skills/aops-cli-chat/SKILL.md +204 -0
- package/aops-assets-release/skills/aops-cli-collab/SKILL.md +42 -0
- package/aops-assets-release/skills/aops-cli-core/SKILL.md +219 -0
- package/aops-assets-release/skills/aops-cli-discuss/SKILL.md +172 -0
- package/aops-assets-release/skills/aops-cli-docman/SKILL.md +192 -0
- package/aops-assets-release/skills/aops-cli-fileman/SKILL.md +169 -0
- package/aops-assets-release/skills/aops-cli-mission/SKILL.md +128 -0
- package/aops-assets-release/skills/aops-cli-operator-brief/SKILL.md +67 -0
- package/aops-assets-release/skills/aops-cli-projectman/SKILL.md +235 -0
- package/aops-assets-release/skills/aops-cli-sugar-authoring/SKILL.md +188 -0
- package/aops-assets-release/skills/aops-cli-tasker/SKILL.md +108 -0
- package/aops-assets-release/skills/aops-cli-tooling-agent/SKILL.md +112 -0
- package/aops-assets-release/skills/aops-cli-view/SKILL.md +210 -0
- package/aops-assets-release/skills/aops-collaborative-work/SKILL.md +304 -0
- package/aops-assets-release/skills/aops-interactive/SKILL.md +70 -0
- package/aops-assets-release/skills/aops-loop-interactive/SKILL.md +314 -0
- package/aops-assets-release/skills/aops-working-disciplines/SKILL.md +310 -0
- package/aops-assets-release/skills/feature-retirement-flow/SKILL.md +126 -0
- package/assets/skills/aops-install/SKILL.md +18 -17
- package/dist/commands/assets.js +93 -1264
- package/dist/commands/community-server.js +27 -8
- package/dist/commands/community-setup.js +1 -2
- package/dist/commands/discuss.js +1 -1
- package/dist/commands/doc.js +88 -27
- package/dist/commands/docs.js +68 -0
- package/dist/commands/global-update.js +28 -0
- package/dist/commands/init.js +3 -1
- package/dist/commands/loop.js +6379 -0
- package/dist/commands/memory.js +2 -1
- package/dist/commands/pm/index.js +11 -9
- package/dist/commands/pm/projectman.js +33 -2
- package/dist/commands/project.js +6 -6
- package/dist/commands/prompt.js +1 -1
- package/dist/commands/repo-sync.js +92 -27
- package/dist/commands/runner.js +257 -0
- package/dist/commands/skill.js +1 -1
- package/dist/commands/start.js +1 -1
- package/dist/commands/tasker.js +361 -0
- package/dist/commands/view.js +53 -9
- package/dist/lib/commercial-setup-readiness-adapter.js +0 -1
- package/dist/lib/community-migration-snapshot.js +7 -9
- package/dist/lib/community-native-database-recovery.js +5 -14
- package/dist/lib/community-native-lifecycle.js +13 -0
- package/dist/lib/setup-agent-assets-bridge.js +28 -148
- package/dist/lib/setup-agent-assets-release.js +16 -44
- package/dist/lib/setup-init-orchestrator.js +11 -15
- package/dist/lib/simple-agent-assets.js +447 -0
- package/dist/lib/user-guide-sections.js +488 -0
- package/dist/main.js +10 -2
- package/dist/seeds/agents-md.js +3 -3
- package/dist/utils/agents-md.js +1 -1
- package/dist/utils/guide-paths.js +7 -7
- package/dist/utils/hosted-workspace.js +2 -1
- package/dist/utils/repo-first-storage.js +26 -1
- package/dist/utils/session-state.js +2 -7
- package/launchers/aops-cockpit.sh +0 -0
- package/launchers/aops-server.sh +0 -0
- package/package.json +67 -35
- package/THIRD_PARTY_NOTICES +0 -16169
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/SKILL.md +0 -47
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/agentspace/SKILL.md +0 -72
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/aops-cli-core/SKILL.md +0 -110
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/chatv3/SKILL.md +0 -59
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/collaborative-work/SKILL.md +0 -81
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/discuss/SKILL.md +0 -66
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/docman/SKILL.md +0 -75
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/projectman/SKILL.md +0 -92
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/sys/SKILL.md +0 -36
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/view/SKILL.md +0 -58
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/references/working-disciplines/SKILL.md +0 -66
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/agent-assets.md +0 -81
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/agentspace.md +0 -183
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/aops-cli.md +0 -1108
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/aops-system.md +0 -102
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/chatv3.md +0 -113
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/docman.md +0 -223
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/projectman.md +0 -233
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/sys.md +0 -94
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/files/user-guides/working-disciplines.md +0 -482
- package/agent-assets-release/agent-assets/core/bc42dd7792dbe66040e99a7ef3d80b3bc788c72b369b5a065cf936aef29f53fb/manifest.json +0 -117
- package/agent-assets-release/agent-assets/gateway/aops/SKILL.md +0 -14
- package/agent-assets-release/agent-assets/inventory.json +0 -29
- package/agent-assets-release/agent-assets/projection.json +0 -8
- package/agent-assets-release/agent-assets-release.json +0 -171
- package/agent-assets-release/agent-assets-release.sigstore.json +0 -67
- package/assets/agent-assets/core/SKILL.md +0 -47
- package/assets/agent-assets/core/references/agentspace/SKILL.md +0 -72
- package/assets/agent-assets/core/references/aops-cli-core/SKILL.md +0 -110
- package/assets/agent-assets/core/references/chatv3/SKILL.md +0 -59
- package/assets/agent-assets/core/references/collaborative-work/SKILL.md +0 -81
- package/assets/agent-assets/core/references/discuss/SKILL.md +0 -66
- package/assets/agent-assets/core/references/docman/SKILL.md +0 -75
- package/assets/agent-assets/core/references/projectman/SKILL.md +0 -92
- package/assets/agent-assets/core/references/sys/SKILL.md +0 -36
- package/assets/agent-assets/core/references/view/SKILL.md +0 -58
- package/assets/agent-assets/core/references/working-disciplines/SKILL.md +0 -66
- package/assets/agent-assets/core/user-guides/agent-assets.md +0 -81
- package/assets/agent-assets/core/user-guides/agentspace.md +0 -183
- package/assets/agent-assets/core/user-guides/aops-cli.md +0 -1108
- package/assets/agent-assets/core/user-guides/aops-system.md +0 -102
- package/assets/agent-assets/core/user-guides/chatv3.md +0 -113
- package/assets/agent-assets/core/user-guides/docman.md +0 -223
- package/assets/agent-assets/core/user-guides/projectman.md +0 -233
- package/assets/agent-assets/core/user-guides/sys.md +0 -94
- package/assets/agent-assets/core/user-guides/working-disciplines.md +0 -482
- package/assets/agent-assets/gateway/aops/SKILL.md +0 -14
- package/dist/lib/agent-assets/gateway.js +0 -15
- package/dist/lib/agent-assets/guards.js +0 -23
- package/dist/lib/agent-assets/hosted-discovery.js +0 -148
- package/dist/lib/agent-assets/hosted-package-input.js +0 -154
- package/dist/lib/agent-assets/legacy-pointer-migration.js +0 -677
- package/dist/lib/agent-assets/native-fs.js +0 -589
- package/dist/lib/agent-assets/roots.js +0 -45
- package/dist/lib/agent-assets/runtime-binding-reader.js +0 -545
- package/dist/lib/agent-assets/runtime-targets.js +0 -50
- package/dist/lib/agent-assets/store-reader.js +0 -1212
- package/dist/lib/agent-assets/store-writer.js +0 -1484
- package/native/bin/darwin-arm64/aops-agent-assets-fs +0 -0
- package/native/bin/darwin-x64/aops-agent-assets-fs +0 -0
- package/native/bin/linux-arm64/aops-agent-assets-fs +0 -0
- package/native/bin/linux-x64/aops-agent-assets-fs +0 -0
- package/native/bin/win32-x64/aops-agent-assets-fs.exe +0 -0
- package/native/manifest.json +0 -49
- package/native/qualifications/win32-x64.json +0 -23
- package/native/tui/darwin-arm64/aops-tui +0 -0
- package/native/tui/linux-x64/aops-tui +0 -0
- package/native/tui/win32-x64/aops-tui.exe +0 -0
package/dist/commands/memory.js
CHANGED
|
@@ -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,
|
|
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
|
|
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
|
|
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',
|
package/dist/commands/project.js
CHANGED
|
@@ -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,
|
package/dist/commands/prompt.js
CHANGED
|
@@ -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, '
|
|
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, '
|
|
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
|
-
|
|
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 =
|
|
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
|
-
...
|
|
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:
|
|
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
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
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/**`
|
|
1894
|
-
'
|
|
1895
|
-
'Hosted
|
|
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;
|