@aopslabs/aops 0.3.20 → 0.3.22
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/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/user-guides/projectman.md +14 -0
- package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/manifest.json +5 -5
- package/agent-assets-release/agent-assets/inventory.json +5 -5
- package/agent-assets-release/agent-assets/projection.json +1 -1
- package/agent-assets-release/agent-assets-release.json +36 -36
- package/agent-assets-release/agent-assets-release.sigstore.json +27 -21
- package/assets/agent-assets/core/user-guides/projectman.md +14 -0
- package/dist/commands/chat-wake-watch.js +369 -0
- package/dist/commands/chatv3.js +74 -1
- package/dist/commands/codex.js +161 -0
- package/dist/commands/pm/index.js +3 -3
- package/dist/commands/pm/projectman.js +131 -25
- package/dist/lib/agent-assets/native-fs.js +2 -2
- package/dist/lib/cli-error-format.js +32 -0
- package/dist/lib/community-diagnostic.js +9 -2
- package/dist/main.js +9 -2
- package/native/manifest.json +1 -1
- package/native/qualifications/win32-x64.json +1 -1
- package/native/tui/darwin-arm64/aops-tui +0 -0
- package/native/tui/win32-x64/aops-tui.exe +0 -0
- package/package.json +7 -5
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/agentspace/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/aops-cli-core/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/chatv3/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/collaborative-work/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/discuss/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/docman/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/mission/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/projectman/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/sys/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/view/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/references/working-disciplines/SKILL.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/user-guides/agent-assets.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/user-guides/agentspace.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/user-guides/aops-cli.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/user-guides/aops-system.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/user-guides/chatv3.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/user-guides/docman.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/user-guides/sys.md +0 -0
- /package/agent-assets-release/agent-assets/core/{387548b990d0cfef6a92805f39d18c2ae6b4bb6b1e42ea42e6c597ea7d207447 → 47516047e20f49d9df0f9c63f3ce98e96ee5b788baf13edf48613a2667edca3a}/files/user-guides/working-disciplines.md +0 -0
|
@@ -256,7 +256,7 @@ function addUtaskCommands(cmd) {
|
|
|
256
256
|
.requiredOption('--sprint <id>', 'Sprint id')
|
|
257
257
|
.requiredOption('--id <id>', 'Utask id')
|
|
258
258
|
.option('--title <title>', 'Updated utask title')
|
|
259
|
-
.option('--status <value>', 'Updated utask status')
|
|
259
|
+
.option('--status <value>', 'Updated utask status (canonical: completed; aliases: done, complete)')
|
|
260
260
|
.option('--notes <text>', 'Updated utask notes')
|
|
261
261
|
.option('--position <index>', 'Optional position override', (value) => Number.parseInt(String(value), 10)), { destructive: false })).action(async (options) => {
|
|
262
262
|
await runPmUtaskUpdate(options);
|
|
@@ -266,7 +266,7 @@ function addUtaskCommands(cmd) {
|
|
|
266
266
|
.description('Update only the lifecycle status of a sprint-bound utask')
|
|
267
267
|
.requiredOption('--sprint <id>', 'Sprint id')
|
|
268
268
|
.requiredOption('--id <id>', 'Utask id')
|
|
269
|
-
.requiredOption('--status <value>', 'Updated utask status'), { destructive: false }).action(async (options) => {
|
|
269
|
+
.requiredOption('--status <value>', 'Updated utask status (canonical: completed; aliases: done, complete)'), { destructive: false }).action(async (options) => {
|
|
270
270
|
await runPmUtaskSetStatus(options);
|
|
271
271
|
}));
|
|
272
272
|
applyPmContextOptions(applyWriteOptions(utask
|
|
@@ -344,7 +344,7 @@ function addSprintCommands(cmd) {
|
|
|
344
344
|
.command('set-status')
|
|
345
345
|
.description('Set all microtask statuses in a sprint to the target status, deriving the sprint-level status')
|
|
346
346
|
.requiredOption('--id <id>', 'Sprint id')
|
|
347
|
-
.requiredOption('--status <value>', 'Target status:
|
|
347
|
+
.requiredOption('--status <value>', 'Target status (canonical: completed; aliases: done, complete; plus todo, doing, cancelled, paused, blocked, postponed, in_review)'), { destructive: false }).action(async (options) => {
|
|
348
348
|
await runPmSprintSetStatus(options);
|
|
349
349
|
}));
|
|
350
350
|
applyPmContextOptions(applyWriteOptions(sprint
|
|
@@ -112,6 +112,10 @@ const PM_STATUS_AUDIT_CLASS_DEFINITIONS = [
|
|
|
112
112
|
class: 'archived_nonterminal',
|
|
113
113
|
description: 'Archived board/sprint visibility hides non-terminal work from active surfaces; advisory only, never auto-reconciled.',
|
|
114
114
|
},
|
|
115
|
+
{
|
|
116
|
+
class: 'review_scope_dangling',
|
|
117
|
+
description: 'Accepted review evidence references a sprint phase or microtask that no longer resolves in the current sprint plan.',
|
|
118
|
+
},
|
|
115
119
|
{
|
|
116
120
|
class: 'review_approved_pm_nonterminal',
|
|
117
121
|
description: 'Optional future cross-check: approved review evidence exists while PM entities remain non-terminal.',
|
|
@@ -394,10 +398,11 @@ function unwrapResultData(result) {
|
|
|
394
398
|
}
|
|
395
399
|
function normalizeMicrotaskStatusInput(value) {
|
|
396
400
|
const normalized = normalizeNonEmpty(value)?.toLowerCase() ?? 'todo';
|
|
397
|
-
|
|
398
|
-
|
|
401
|
+
const canonical = normalized === 'done' || normalized === 'complete' ? 'completed' : normalized;
|
|
402
|
+
if (!MICROTASK_STATUSES.has(canonical)) {
|
|
403
|
+
throw new Error(`Invalid --status "${value}". Expected one of: todo, doing, blocked, paused, in_review, completed, cancelled, postponed. Completion aliases: done, complete.`);
|
|
399
404
|
}
|
|
400
|
-
return
|
|
405
|
+
return canonical;
|
|
401
406
|
}
|
|
402
407
|
function normalizeKanbanTaskStatusColumnInput(value) {
|
|
403
408
|
const normalized = normalizeNonEmpty(value)?.toLowerCase();
|
|
@@ -1428,19 +1433,21 @@ function incrementAuditClassCount(byClass, className) {
|
|
|
1428
1433
|
byClass[className] = (byClass[className] ?? 0) + 1;
|
|
1429
1434
|
}
|
|
1430
1435
|
function pushAuditFinding(findings, finding) {
|
|
1436
|
+
const reviewRequestId = normalizeNonEmpty(finding.evidence?.reviewRequestId);
|
|
1431
1437
|
const taskId = normalizeNonEmpty(finding.task?.id);
|
|
1432
1438
|
const sprintIds = uniqueStringValues([
|
|
1433
1439
|
finding.sprint?.id,
|
|
1434
1440
|
...(finding.sprints ?? []).map((sprint) => sprint.id),
|
|
1435
1441
|
]).join(',');
|
|
1436
|
-
const key = `${finding.class}:${taskId ?? ''}:${sprintIds}:${finding.message}`;
|
|
1442
|
+
const key = `${finding.class}:${reviewRequestId ?? ''}:${taskId ?? ''}:${sprintIds}:${finding.message}`;
|
|
1437
1443
|
const existing = findings.some((entry) => {
|
|
1444
|
+
const entryReviewRequestId = normalizeNonEmpty(entry.evidence?.reviewRequestId);
|
|
1438
1445
|
const entryTaskId = normalizeNonEmpty(entry.task?.id);
|
|
1439
1446
|
const entrySprintIds = uniqueStringValues([
|
|
1440
1447
|
entry.sprint?.id,
|
|
1441
1448
|
...(entry.sprints ?? []).map((sprint) => sprint.id),
|
|
1442
1449
|
]).join(',');
|
|
1443
|
-
return `${entry.class}:${entryTaskId ?? ''}:${entrySprintIds}:${entry.message}` === key;
|
|
1450
|
+
return `${entry.class}:${entryReviewRequestId ?? ''}:${entryTaskId ?? ''}:${entrySprintIds}:${entry.message}` === key;
|
|
1444
1451
|
});
|
|
1445
1452
|
if (!existing)
|
|
1446
1453
|
findings.push(finding);
|
|
@@ -1477,7 +1484,7 @@ function pushArchivedNonterminalFinding(findings, params) {
|
|
|
1477
1484
|
}),
|
|
1478
1485
|
});
|
|
1479
1486
|
}
|
|
1480
|
-
function summarizePmStatusAudit(tasks, sprints, columnIndex, filters, nowMs = Date.now()) {
|
|
1487
|
+
function summarizePmStatusAudit(tasks, sprints, reviewRequests, columnIndex, filters, nowMs = Date.now()) {
|
|
1481
1488
|
const taskSummaries = tasks
|
|
1482
1489
|
.map((task) => summarizePmStatusTask(task, columnIndex))
|
|
1483
1490
|
.filter((task) => Boolean(task));
|
|
@@ -1716,6 +1723,66 @@ function summarizePmStatusAudit(tasks, sprints, columnIndex, filters, nowMs = Da
|
|
|
1716
1723
|
});
|
|
1717
1724
|
}
|
|
1718
1725
|
}
|
|
1726
|
+
const phaseIds = new Set();
|
|
1727
|
+
const microtaskIds = new Set();
|
|
1728
|
+
for (const sprint of sprints) {
|
|
1729
|
+
for (const phase of toRecordArray(sprint.phases)) {
|
|
1730
|
+
const phaseId = normalizeNonEmpty(phase.id);
|
|
1731
|
+
if (phaseId)
|
|
1732
|
+
phaseIds.add(phaseId);
|
|
1733
|
+
for (const microtask of toRecordArray(phase.microtasks)) {
|
|
1734
|
+
const microtaskId = normalizeNonEmpty(microtask.id);
|
|
1735
|
+
if (microtaskId)
|
|
1736
|
+
microtaskIds.add(microtaskId);
|
|
1737
|
+
}
|
|
1738
|
+
}
|
|
1739
|
+
}
|
|
1740
|
+
const acceptedReviews = reviewRequests.filter((review) => normalizeAuditToken(review.status) === 'accepted');
|
|
1741
|
+
const scopedAcceptedReviews = acceptedReviews.filter((review) => {
|
|
1742
|
+
const reviewTaskId = normalizeNonEmpty(review.kanbanTaskId);
|
|
1743
|
+
const reviewSprintId = normalizeNonEmpty(review.sprintId);
|
|
1744
|
+
if (filters.board || filters.task) {
|
|
1745
|
+
const matchesSelectedTask = Boolean(reviewTaskId && selectedTaskIds.has(reviewTaskId));
|
|
1746
|
+
const matchesSelectedSprint = Boolean(reviewSprintId && selectedSprintIds.has(reviewSprintId));
|
|
1747
|
+
if (!matchesSelectedTask && !matchesSelectedSprint)
|
|
1748
|
+
return false;
|
|
1749
|
+
}
|
|
1750
|
+
if (filters.sprint && (!reviewSprintId || !selectedSprintIds.has(reviewSprintId)))
|
|
1751
|
+
return false;
|
|
1752
|
+
return true;
|
|
1753
|
+
});
|
|
1754
|
+
let danglingReviewCount = 0;
|
|
1755
|
+
for (const review of scopedAcceptedReviews) {
|
|
1756
|
+
const missingReferences = [];
|
|
1757
|
+
const reviewScope = normalizeNonEmpty(review.reviewScope);
|
|
1758
|
+
const phaseMatch = reviewScope?.match(/^sprint-phase:([0-9a-f-]{36})(?:\/.*)?$/i);
|
|
1759
|
+
const scopedPhaseId = phaseMatch?.[1];
|
|
1760
|
+
if (scopedPhaseId && !phaseIds.has(scopedPhaseId)) {
|
|
1761
|
+
missingReferences.push({ kind: 'phase', id: scopedPhaseId });
|
|
1762
|
+
}
|
|
1763
|
+
const linkedMicrotaskId = normalizeNonEmpty(review.microTaskItemId);
|
|
1764
|
+
if (linkedMicrotaskId && !microtaskIds.has(linkedMicrotaskId)) {
|
|
1765
|
+
missingReferences.push({ kind: 'microtask', id: linkedMicrotaskId });
|
|
1766
|
+
}
|
|
1767
|
+
if (missingReferences.length === 0)
|
|
1768
|
+
continue;
|
|
1769
|
+
danglingReviewCount += 1;
|
|
1770
|
+
pushAuditFinding(findings, {
|
|
1771
|
+
class: 'review_scope_dangling',
|
|
1772
|
+
severity: 'warning',
|
|
1773
|
+
message: 'Accepted review evidence references a phase or microtask that no longer resolves.',
|
|
1774
|
+
suggestion: 'Backfill a deterministic current work-unit reference, or record an explicit irrecoverable historical-scope disposition without inventing identity.',
|
|
1775
|
+
evidence: compactPayload({
|
|
1776
|
+
reviewRequestId: normalizeNonEmpty(review.id),
|
|
1777
|
+
title: normalizeNonEmpty(review.title),
|
|
1778
|
+
status: normalizeNonEmpty(review.status),
|
|
1779
|
+
reviewScope,
|
|
1780
|
+
sprintId: normalizeNonEmpty(review.sprintId),
|
|
1781
|
+
microTaskItemId: linkedMicrotaskId,
|
|
1782
|
+
missingReferences,
|
|
1783
|
+
}),
|
|
1784
|
+
});
|
|
1785
|
+
}
|
|
1719
1786
|
const byClass = Object.fromEntries(PM_STATUS_AUDIT_CLASS_DEFINITIONS.map((definition) => [definition.class, 0]));
|
|
1720
1787
|
for (const finding of findings)
|
|
1721
1788
|
incrementAuditClassCount(byClass, finding.class);
|
|
@@ -1727,6 +1794,7 @@ function summarizePmStatusAudit(tasks, sprints, columnIndex, filters, nowMs = Da
|
|
|
1727
1794
|
hasFindings: findings.length > 0,
|
|
1728
1795
|
tasksAudited: selectedTaskIds.size,
|
|
1729
1796
|
sprintsAudited: selectedSprintIds.size,
|
|
1797
|
+
reviewsAudited: scopedAcceptedReviews.length,
|
|
1730
1798
|
byClass,
|
|
1731
1799
|
},
|
|
1732
1800
|
filters: compactPayload({
|
|
@@ -1736,9 +1804,11 @@ function summarizePmStatusAudit(tasks, sprints, columnIndex, filters, nowMs = Da
|
|
|
1736
1804
|
}),
|
|
1737
1805
|
taxonomy: PM_STATUS_AUDIT_CLASS_DEFINITIONS.map((definition) => ({ ...definition })),
|
|
1738
1806
|
reviewAudit: {
|
|
1739
|
-
enabled:
|
|
1740
|
-
class: '
|
|
1741
|
-
|
|
1807
|
+
enabled: true,
|
|
1808
|
+
class: 'review_scope_dangling',
|
|
1809
|
+
reviewsAudited: scopedAcceptedReviews.length,
|
|
1810
|
+
danglingReviewCount,
|
|
1811
|
+
acceptedOnly: true,
|
|
1742
1812
|
},
|
|
1743
1813
|
findings,
|
|
1744
1814
|
};
|
|
@@ -1905,10 +1975,17 @@ function buildOwnerScopedInput(resolvedContext, extra = {}) {
|
|
|
1905
1975
|
}
|
|
1906
1976
|
function buildGatewayOptions(options, resolvedContext) {
|
|
1907
1977
|
return {
|
|
1908
|
-
|
|
1978
|
+
apiBaseUrl: options.apiBaseUrl,
|
|
1979
|
+
accessToken: options.accessToken,
|
|
1980
|
+
refreshToken: options.refreshToken,
|
|
1981
|
+
timeoutMs: options.timeoutMs,
|
|
1982
|
+
tenantId: options.tenantId,
|
|
1983
|
+
locale: options.locale,
|
|
1984
|
+
fallbackLocale: options.fallbackLocale,
|
|
1909
1985
|
scopeId: resolvedContext.scopeId,
|
|
1910
1986
|
projectId: resolvedContext.projectId,
|
|
1911
1987
|
projectName: resolvedContext.projectName,
|
|
1988
|
+
scopeResolution: options.scopeResolution,
|
|
1912
1989
|
...preferProjectNameBinding(resolvedContext),
|
|
1913
1990
|
};
|
|
1914
1991
|
}
|
|
@@ -1925,6 +2002,10 @@ async function hydrateHostedProjectContext(apiState, options, resolvedContext) {
|
|
|
1925
2002
|
...buildGatewayOptions(options, resolvedContext),
|
|
1926
2003
|
toolId: 'agentspace.project.get-by-id',
|
|
1927
2004
|
input: { id: projectId },
|
|
2005
|
+
preview: false,
|
|
2006
|
+
apply: false,
|
|
2007
|
+
confirm: false,
|
|
2008
|
+
idempotencyKey: undefined,
|
|
1928
2009
|
});
|
|
1929
2010
|
const project = unwrapResultData(unwrapHostedToolResult(payload));
|
|
1930
2011
|
if (!isRecord(project)) {
|
|
@@ -1993,6 +2074,7 @@ async function invokeProjectmanReadTool(execution, options, params) {
|
|
|
1993
2074
|
preview: false,
|
|
1994
2075
|
apply: false,
|
|
1995
2076
|
confirm: false,
|
|
2077
|
+
idempotencyKey: undefined,
|
|
1996
2078
|
timeoutMs: options.timeoutMs,
|
|
1997
2079
|
});
|
|
1998
2080
|
}
|
|
@@ -2226,21 +2308,45 @@ async function resolveBoardColumnReference(execution, options, params) {
|
|
|
2226
2308
|
if (!trimmed) {
|
|
2227
2309
|
throw new Error('Column is required.');
|
|
2228
2310
|
}
|
|
2229
|
-
if (isUuidLike(trimmed)) {
|
|
2230
|
-
return { input: trimmed, id: trimmed };
|
|
2231
|
-
}
|
|
2232
2311
|
if (!params.boardId) {
|
|
2312
|
+
if (isUuidLike(trimmed)) {
|
|
2313
|
+
return { input: trimmed, id: trimmed };
|
|
2314
|
+
}
|
|
2233
2315
|
throw new Error('Board is required when resolving a column by exact name.');
|
|
2234
2316
|
}
|
|
2235
2317
|
const boardColumnsPayload = await invokeProjectmanReadTool(execution, options, {
|
|
2236
2318
|
toolId: 'projectman.kanban-board-column.list',
|
|
2237
2319
|
input: { board: params.boardId },
|
|
2238
2320
|
});
|
|
2321
|
+
const boardColumns = toRecordArray(unwrapHostedToolResult(boardColumnsPayload));
|
|
2322
|
+
if (isUuidLike(trimmed)) {
|
|
2323
|
+
const placementMatches = boardColumns.filter((placement) => extractEntityId(placement, ['id', 'boardColumnId']) === trimmed);
|
|
2324
|
+
if (placementMatches.length === 1) {
|
|
2325
|
+
return { input: trimmed, id: trimmed };
|
|
2326
|
+
}
|
|
2327
|
+
if (placementMatches.length > 1) {
|
|
2328
|
+
throw new Error(`Column placement id "${trimmed}" is ambiguous on the selected board.`);
|
|
2329
|
+
}
|
|
2330
|
+
const libraryColumnMatches = boardColumns.filter((placement) => extractEntityId(placement, ['columnId', 'column']) === trimmed);
|
|
2331
|
+
if (libraryColumnMatches.length === 1) {
|
|
2332
|
+
const placementId = extractEntityId(libraryColumnMatches[0], ['id', 'boardColumnId']);
|
|
2333
|
+
if (!placementId) {
|
|
2334
|
+
throw new Error(`Library column "${trimmed}" matched a board placement without an id.`);
|
|
2335
|
+
}
|
|
2336
|
+
return { input: trimmed, id: placementId, assumedId: false };
|
|
2337
|
+
}
|
|
2338
|
+
if (libraryColumnMatches.length > 1) {
|
|
2339
|
+
const candidates = libraryColumnMatches
|
|
2340
|
+
.map((placement) => extractEntityId(placement, ['id', 'boardColumnId']) ?? 'missing-id')
|
|
2341
|
+
.join(', ');
|
|
2342
|
+
throw new Error(`Library column "${trimmed}" is ambiguous on the selected board. Placements: ${candidates}.`);
|
|
2343
|
+
}
|
|
2344
|
+
return { input: trimmed, id: trimmed, assumedId: true };
|
|
2345
|
+
}
|
|
2239
2346
|
const columnLibraryPayload = await invokeProjectmanReadTool(execution, options, {
|
|
2240
2347
|
toolId: 'projectman.kanban-column.list',
|
|
2241
2348
|
input: trimmed.includes(' ') ? { name: trimmed } : { slug: trimmed },
|
|
2242
2349
|
});
|
|
2243
|
-
const boardColumns = toRecordArray(unwrapHostedToolResult(boardColumnsPayload));
|
|
2244
2350
|
const enrichedBoardColumns = await Promise.all(boardColumns.map(async (placement) => {
|
|
2245
2351
|
const columnId = extractEntityId(placement, ['columnId', 'column']);
|
|
2246
2352
|
if (!columnId) {
|
|
@@ -2317,10 +2423,7 @@ async function resolveBoardColumnReference(execution, options, params) {
|
|
|
2317
2423
|
.join(', ');
|
|
2318
2424
|
throw new Error(`Column "${trimmed}" is ambiguous on the selected board. Placements: ${candidates}.`);
|
|
2319
2425
|
}
|
|
2320
|
-
|
|
2321
|
-
throw new Error(`Column "${trimmed}" was not found on the selected board.`);
|
|
2322
|
-
}
|
|
2323
|
-
return { input: trimmed, id: trimmed, assumedId: true };
|
|
2426
|
+
throw new Error(`Column "${trimmed}" was not found on the selected board.`);
|
|
2324
2427
|
}
|
|
2325
2428
|
async function getProjectmanRecord(execution, options, toolId, id) {
|
|
2326
2429
|
try {
|
|
@@ -3863,6 +3966,7 @@ export async function runPmStatusAudit(options = {}) {
|
|
|
3863
3966
|
return;
|
|
3864
3967
|
const taskInput = buildOwnerScopedInput(execution.resolvedContext);
|
|
3865
3968
|
const sprintInput = buildOwnerScopedInput(execution.resolvedContext);
|
|
3969
|
+
const reviewInput = buildOwnerScopedInput(execution.resolvedContext);
|
|
3866
3970
|
const boardValue = normalizeNonEmpty(options.board);
|
|
3867
3971
|
const taskSelector = normalizeNonEmpty(options.task);
|
|
3868
3972
|
const sprintSelector = normalizeNonEmpty(options.sprint);
|
|
@@ -3870,7 +3974,7 @@ export async function runPmStatusAudit(options = {}) {
|
|
|
3870
3974
|
if (boardValue) {
|
|
3871
3975
|
boardRef = await resolveBoardReference(execution, options, boardValue);
|
|
3872
3976
|
}
|
|
3873
|
-
const [taskPayload, sprintPayload, boards] = await Promise.all([
|
|
3977
|
+
const [taskPayload, sprintPayload, reviewPayload, boards] = await Promise.all([
|
|
3874
3978
|
invokeProjectmanReadTool(execution, options, {
|
|
3875
3979
|
toolId: 'projectman.kanban-task.list',
|
|
3876
3980
|
input: taskInput,
|
|
@@ -3879,6 +3983,10 @@ export async function runPmStatusAudit(options = {}) {
|
|
|
3879
3983
|
toolId: 'projectman.sprint.list',
|
|
3880
3984
|
input: sprintInput,
|
|
3881
3985
|
}),
|
|
3986
|
+
invokeProjectmanReadTool(execution, options, {
|
|
3987
|
+
toolId: 'projectman.review-request.list',
|
|
3988
|
+
input: reviewInput,
|
|
3989
|
+
}),
|
|
3882
3990
|
listProjectmanBoards(execution, options, { includeArchived: true }),
|
|
3883
3991
|
]);
|
|
3884
3992
|
const columnSourceBoardIds = boardRef
|
|
@@ -3911,8 +4019,9 @@ export async function runPmStatusAudit(options = {}) {
|
|
|
3911
4019
|
}
|
|
3912
4020
|
const tasks = toRecordArray(unwrapHostedToolResult(taskPayload));
|
|
3913
4021
|
const sprints = toRecordArray(unwrapHostedToolResult(sprintPayload));
|
|
4022
|
+
const reviewRequests = toRecordArray(unwrapHostedToolResult(reviewPayload));
|
|
3914
4023
|
const columnIndex = buildPmStatusAuditColumnIndex(boards, boardColumnRows, columnEntities);
|
|
3915
|
-
const audit = summarizePmStatusAudit(tasks, sprints, columnIndex, {
|
|
4024
|
+
const audit = summarizePmStatusAudit(tasks, sprints, reviewRequests, columnIndex, {
|
|
3916
4025
|
board: boardValue,
|
|
3917
4026
|
boardId: boardRef?.id,
|
|
3918
4027
|
task: taskSelector,
|
|
@@ -3933,6 +4042,7 @@ export async function runPmStatusAudit(options = {}) {
|
|
|
3933
4042
|
input: compactPayload({
|
|
3934
4043
|
taskInput,
|
|
3935
4044
|
sprintInput,
|
|
4045
|
+
reviewInput,
|
|
3936
4046
|
filters: compactPayload({
|
|
3937
4047
|
board: boardValue,
|
|
3938
4048
|
task: taskSelector,
|
|
@@ -4213,11 +4323,7 @@ export async function runPmSprintSetStatus(options = {}) {
|
|
|
4213
4323
|
const targetStatus = normalizeNonEmpty(options.status)?.toLowerCase();
|
|
4214
4324
|
if (!targetStatus)
|
|
4215
4325
|
throw new Error('Missing required --status.');
|
|
4216
|
-
const
|
|
4217
|
-
const resolvedStatus = targetStatus === 'done' || targetStatus === 'complete' ? 'completed' : targetStatus;
|
|
4218
|
-
if (!validStatuses.has(targetStatus)) {
|
|
4219
|
-
throw new Error(`Invalid --status "${targetStatus}". Expected one of: ${[...validStatuses].join(', ')}.`);
|
|
4220
|
-
}
|
|
4326
|
+
const resolvedStatus = normalizeMicrotaskStatusInput(targetStatus);
|
|
4221
4327
|
const execution = await prepareExecution(options, { requireProject: false });
|
|
4222
4328
|
if (!execution)
|
|
4223
4329
|
return;
|
|
@@ -543,9 +543,9 @@ function defaultNativeRoot() {
|
|
|
543
543
|
return moduleDirectory.endsWith(`${path.sep}dist`) ? bundled : compiledOrSource;
|
|
544
544
|
}
|
|
545
545
|
function injectedNativeManifestSha256() {
|
|
546
|
-
return typeof "
|
|
546
|
+
return typeof "a107fa53b7534ad3b8d967f76261b0791269256e1698d11b8a6266fa1d1d6e30" === 'undefined'
|
|
547
547
|
? undefined
|
|
548
|
-
: "
|
|
548
|
+
: "a107fa53b7534ad3b8d967f76261b0791269256e1698d11b8a6266fa1d1d6e30";
|
|
549
549
|
}
|
|
550
550
|
function sha256(bytes) {
|
|
551
551
|
return createHash('sha256').update(bytes).digest('hex');
|
|
@@ -1,6 +1,38 @@
|
|
|
1
1
|
function messageOf(error) {
|
|
2
2
|
return error instanceof Error ? error.message : String(error);
|
|
3
3
|
}
|
|
4
|
+
const MEMBER_AUTH_REASONS = new Set([
|
|
5
|
+
'member_token_required',
|
|
6
|
+
'member_token_invalid_format',
|
|
7
|
+
'member_token_unknown',
|
|
8
|
+
'member_token_mismatch',
|
|
9
|
+
'membership_inactive',
|
|
10
|
+
'membership_channel_mismatch',
|
|
11
|
+
]);
|
|
12
|
+
function record(value) {
|
|
13
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
14
|
+
}
|
|
15
|
+
export function buildCliJsonError(error) {
|
|
16
|
+
const candidate = record(error) ? error : null;
|
|
17
|
+
const details = record(candidate?.details) ? candidate.details : null;
|
|
18
|
+
const memberAuthReason = details?.memberAuthReason;
|
|
19
|
+
const errorCode = typeof candidate?.errorCode === 'string'
|
|
20
|
+
? candidate.errorCode
|
|
21
|
+
: typeof candidate?.code === 'string'
|
|
22
|
+
? candidate.code
|
|
23
|
+
: undefined;
|
|
24
|
+
return {
|
|
25
|
+
schemaVersion: 1,
|
|
26
|
+
ok: false,
|
|
27
|
+
error: {
|
|
28
|
+
message: messageOf(error),
|
|
29
|
+
...(errorCode ? { errorCode } : {}),
|
|
30
|
+
...(typeof memberAuthReason === 'string' && MEMBER_AUTH_REASONS.has(memberAuthReason)
|
|
31
|
+
? { details: { memberAuthReason } }
|
|
32
|
+
: {}),
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
4
36
|
export function formatCliError(error, depth = 0) {
|
|
5
37
|
const message = messageOf(error);
|
|
6
38
|
if (!(error instanceof AggregateError) || error.errors.length === 0 || depth >= 3)
|
|
@@ -36,7 +36,7 @@ function categoryFor(code) {
|
|
|
36
36
|
return 'migration';
|
|
37
37
|
if (/config|policy|env|tls/.test(code))
|
|
38
38
|
return 'configuration';
|
|
39
|
-
if (/runtime|server|process|health|source_drift|build(?:_identity)?_drift/.test(code))
|
|
39
|
+
if (/runtime|server|process|health|native_child|source_drift|build(?:_identity)?_drift/.test(code))
|
|
40
40
|
return 'runtime';
|
|
41
41
|
return 'unknown';
|
|
42
42
|
}
|
|
@@ -57,7 +57,7 @@ function inferredPhase(code, fallback) {
|
|
|
57
57
|
return 'verify';
|
|
58
58
|
if (/migration|apply/.test(code))
|
|
59
59
|
return 'apply';
|
|
60
|
-
if (/start|health|process/.test(code))
|
|
60
|
+
if (/start|health|process|native_child.*(?:exited|ready)/.test(code))
|
|
61
61
|
return 'start-server';
|
|
62
62
|
return fallback;
|
|
63
63
|
}
|
|
@@ -123,6 +123,13 @@ function safeDetails(details, error) {
|
|
|
123
123
|
if (SAFE_SQLSTATE.test(sqlState))
|
|
124
124
|
output.sqlState = sqlState;
|
|
125
125
|
const message = error instanceof Error ? error.message : String(error ?? '');
|
|
126
|
+
const nativeChildExit = /^community_native_child_exited_before_ready:([^:\s]+):([^:\s]+)/u.exec(message);
|
|
127
|
+
if (nativeChildExit) {
|
|
128
|
+
output.nativeChildExitCode = /^\d+$/u.test(nativeChildExit[1])
|
|
129
|
+
? Number(nativeChildExit[1])
|
|
130
|
+
: redacted(nativeChildExit[1]);
|
|
131
|
+
output.nativeChildSignal = redacted(nativeChildExit[2]);
|
|
132
|
+
}
|
|
126
133
|
const semanticPrefix = 'community_strict_semantic_schema_mismatch:';
|
|
127
134
|
if (message.startsWith(semanticPrefix)) {
|
|
128
135
|
try {
|
package/dist/main.js
CHANGED
|
@@ -37,11 +37,12 @@ import { makeCommunityCockpitCommand } from './commands/community-cockpit.js';
|
|
|
37
37
|
import { makeCommunityDoctorCommand } from './commands/community-doctor.js';
|
|
38
38
|
import { makeTargetCommand } from './commands/target.js';
|
|
39
39
|
import { makeVersionCommand } from './commands/version.js';
|
|
40
|
+
import { makeCodexCommand } from './commands/codex.js';
|
|
40
41
|
import { makeGlobalUpdateCommand } from './commands/global-update.js';
|
|
41
42
|
import { launchBundledTui, shouldLaunchBundledTui } from './lib/tui-launcher.js';
|
|
42
43
|
import { CommunityDiagnosticError, formatCommunityDiagnostic, } from './lib/community-diagnostic.js';
|
|
43
44
|
import { resolveCliApiBaseUrl } from './utils/api.js';
|
|
44
|
-
import { formatCliError } from './lib/cli-error-format.js';
|
|
45
|
+
import { buildCliJsonError, formatCliError } from './lib/cli-error-format.js';
|
|
45
46
|
const KERNEL_COMMANDS_REPLACED_BY_AOPS = new Set(['agent', 'api', 'auth', 'client', 'host']);
|
|
46
47
|
function removeReplacedKernelCommands(program) {
|
|
47
48
|
const mutable = program;
|
|
@@ -154,6 +155,7 @@ export function buildCommunityProgram() {
|
|
|
154
155
|
program.addCommand(makeCommunityDoctorCommand());
|
|
155
156
|
program.addCommand(makeTargetCommand());
|
|
156
157
|
program.addCommand(makeVersionCommand());
|
|
158
|
+
program.addCommand(makeCodexCommand());
|
|
157
159
|
program.addCommand(makeGlobalUpdateCommand());
|
|
158
160
|
program.addHelpText('after', `
|
|
159
161
|
AOPS Community is a single-user, self-hosted/local-trusted distribution.
|
|
@@ -205,7 +207,12 @@ async function main() {
|
|
|
205
207
|
}
|
|
206
208
|
}
|
|
207
209
|
else {
|
|
208
|
-
|
|
210
|
+
if (jsonOutputRequested) {
|
|
211
|
+
process.stderr.write(`${JSON.stringify(buildCliJsonError(error))}\n`);
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
logError(formatCliError(error));
|
|
215
|
+
}
|
|
209
216
|
}
|
|
210
217
|
process.exitCode = 1;
|
|
211
218
|
}
|
package/native/manifest.json
CHANGED
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"capabilityClass": "windows-ntfs-crash-recoverable-v1",
|
|
43
43
|
"qualification": {
|
|
44
44
|
"relativePath": "qualifications/win32-x64.json",
|
|
45
|
-
"sha256": "
|
|
45
|
+
"sha256": "e6c9581ab34629b19a376c5cf3fb675e36ee34403ef64ec4f43c715533c45249"
|
|
46
46
|
}
|
|
47
47
|
}
|
|
48
48
|
]
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"filesystem": "NTFS",
|
|
8
8
|
"primitiveProfile": "windows-createfile-flush-movefileex-v1",
|
|
9
9
|
"capabilityClass": "windows-ntfs-crash-recoverable-v1",
|
|
10
|
-
"evidenceSha256": "
|
|
10
|
+
"evidenceSha256": "4d353324b943a237459b60429128c1bd19ae5e15e86c833a1cd9a20180eca9e3",
|
|
11
11
|
"crashInjectionPoints": [
|
|
12
12
|
"authority-history",
|
|
13
13
|
"authority-current",
|
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aopslabs/aops",
|
|
3
|
-
"version": "0.3.
|
|
3
|
+
"version": "0.3.22",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "AOPS CLI and terminal setup application.",
|
|
6
|
-
"aopsDockerServerVersion": "0.2.
|
|
6
|
+
"aopsDockerServerVersion": "0.2.16",
|
|
7
7
|
"license": "SEE LICENSE IN LICENSE",
|
|
8
8
|
"repository": {
|
|
9
9
|
"type": "git",
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"test:chatv3-keyring-parameter-log-effects": "node --test test/chatv3-keyring-parameter-log-effects.test.mjs",
|
|
35
35
|
"test:chatv3-session-store": "node --test test/chatv3-session-store.test.mjs",
|
|
36
36
|
"test:projectman-review-evidence": "node --test test/projectman-review-evidence.test.mjs",
|
|
37
|
+
"test:projectman-pm-contract": "node --test test/projectman-pm-contract.test.mjs",
|
|
37
38
|
"test:commercial-lifecycle-scale-effects": "node --test test/commercial-lifecycle-scale-effects.test.mjs",
|
|
38
39
|
"test:commercial-lifecycle-managed-effects": "node --test test/commercial-lifecycle-managed-effects.test.mjs",
|
|
39
40
|
"test:commercial-lifecycle-negative-effects": "node --test test/commercial-lifecycle-negative-effects.test.mjs",
|
|
@@ -55,12 +56,13 @@
|
|
|
55
56
|
"test:hosted-contract-hardening": "node --test test/hosted-contract-hardening.test.mjs",
|
|
56
57
|
"test:home": "node --test test/home-menu.test.mjs",
|
|
57
58
|
"test:launchers": "node --test test/terminal-launchers.test.mjs",
|
|
58
|
-
"test:shortcuts": "pnpm --dir ../.. run build && pnpm run test:home && pnpm run test:cockpit && pnpm run test:launchers && pnpm run test:assets-menu && pnpm run test:agent-assets-content && pnpm run test:chatv3-session-store && pnpm run test:projectman-review-evidence && pnpm run test:setup-install && pnpm run test:container-runtime && pnpm run test:native-lifecycle && pnpm run test:operation-journal && pnpm run test:commercial-canonical-order && pnpm run test:commercial-runtime-closure && pnpm run test:commercial-artifact && pnpm run test:commercial-final-readiness && pnpm run test:commercial-admission && pnpm run test:commercial-license && pnpm run test:commercial-runbook && pnpm run test:package-identity && pnpm run test:tui-launcher && pnpm run test:global-update && pnpm run test:skill-discovery && pnpm run test:target-transport && pnpm run test:target-auth && pnpm run test:r6-auth-cutover && pnpm run test:r6-cutover-baseline && pnpm run test:hosted-contract-hardening",
|
|
59
|
+
"test:shortcuts": "pnpm --dir ../.. run build && pnpm run test:home && pnpm run test:cockpit && pnpm run test:launchers && pnpm run test:assets-menu && pnpm run test:agent-assets-content && pnpm run test:chatv3-session-store && pnpm run test:projectman-review-evidence && pnpm run test:projectman-pm-contract && pnpm run test:setup-install && pnpm run test:container-runtime && pnpm run test:native-lifecycle && pnpm run test:operation-journal && pnpm run test:commercial-canonical-order && pnpm run test:commercial-runtime-closure && pnpm run test:commercial-artifact && pnpm run test:commercial-final-readiness && pnpm run test:commercial-admission && pnpm run test:commercial-license && pnpm run test:commercial-runbook && pnpm run test:package-identity && pnpm run test:tui-launcher && pnpm run test:global-update && pnpm run test:skill-discovery && pnpm run test:target-transport && pnpm run test:target-auth && pnpm run test:r6-auth-cutover && pnpm run test:r6-cutover-baseline && pnpm run test:hosted-contract-hardening",
|
|
59
60
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|
|
60
61
|
"start": "node dist/main.js"
|
|
61
62
|
},
|
|
62
63
|
"dependencies": {
|
|
63
|
-
"@aopslabs/aops-
|
|
64
|
+
"@aopslabs/aops-agent-runtime": "0.1.0",
|
|
65
|
+
"@aopslabs/aops-server": "0.2.16",
|
|
64
66
|
"@aopslabs/artifact-trust-contracts": "0.3.1",
|
|
65
67
|
"@aopslabs/cli-kit": "0.1.0",
|
|
66
68
|
"@aopslabs/aops-host-registration": "0.2.1",
|
|
@@ -71,7 +73,7 @@
|
|
|
71
73
|
"@sigstore/tuf": "4.0.2",
|
|
72
74
|
"@sigstore/verify": "3.1.1",
|
|
73
75
|
"@aopslabs/api-client": "0.2.1",
|
|
74
|
-
"@aopslabs/domain-product-client-chatv3": "0.4.
|
|
76
|
+
"@aopslabs/domain-product-client-chatv3": "0.4.1",
|
|
75
77
|
"@aopslabs/xf-cli-ui": "0.2.0",
|
|
76
78
|
"commander": "14.0.3",
|
|
77
79
|
"pg": "8.20.0",
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|