agentsys 5.0.1 → 5.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (185) hide show
  1. package/.claude-plugin/marketplace.json +13 -13
  2. package/.claude-plugin/plugin.json +1 -1
  3. package/CHANGELOG.md +10 -0
  4. package/README.md +1 -0
  5. package/adapters/codex/skills/consult/SKILL.md +2 -2
  6. package/adapters/opencode/agents/consult-agent.md +1 -1
  7. package/adapters/opencode/commands/consult.md +2 -2
  8. package/adapters/opencode/skills/agnix/SKILL.md +1 -1
  9. package/adapters/opencode/skills/consult/SKILL.md +22 -6
  10. package/adapters/opencode/skills/deslop/SKILL.md +1 -1
  11. package/adapters/opencode/skills/discover-tasks/SKILL.md +1 -1
  12. package/adapters/opencode/skills/drift-analysis/SKILL.md +1 -1
  13. package/adapters/opencode/skills/enhance-agent-prompts/SKILL.md +1 -1
  14. package/adapters/opencode/skills/enhance-claude-memory/SKILL.md +1 -1
  15. package/adapters/opencode/skills/enhance-cross-file/SKILL.md +1 -1
  16. package/adapters/opencode/skills/enhance-docs/SKILL.md +1 -1
  17. package/adapters/opencode/skills/enhance-hooks/SKILL.md +1 -1
  18. package/adapters/opencode/skills/enhance-orchestrator/SKILL.md +1 -1
  19. package/adapters/opencode/skills/enhance-plugins/SKILL.md +1 -1
  20. package/adapters/opencode/skills/enhance-prompts/SKILL.md +1 -1
  21. package/adapters/opencode/skills/enhance-skills/SKILL.md +1 -1
  22. package/adapters/opencode/skills/learn/SKILL.md +1 -1
  23. package/adapters/opencode/skills/perf-analyzer/SKILL.md +1 -1
  24. package/adapters/opencode/skills/perf-baseline-manager/SKILL.md +1 -1
  25. package/adapters/opencode/skills/perf-benchmarker/SKILL.md +1 -1
  26. package/adapters/opencode/skills/perf-code-paths/SKILL.md +1 -1
  27. package/adapters/opencode/skills/perf-investigation-logger/SKILL.md +1 -1
  28. package/adapters/opencode/skills/perf-profiler/SKILL.md +1 -1
  29. package/adapters/opencode/skills/perf-theory-gatherer/SKILL.md +1 -1
  30. package/adapters/opencode/skills/perf-theory-tester/SKILL.md +1 -1
  31. package/adapters/opencode/skills/sync-docs/SKILL.md +1 -1
  32. package/adapters/opencode/skills/validate-delivery/SKILL.md +1 -1
  33. package/bin/cli.js +25 -6
  34. package/bin/dev-cli.js +16 -6
  35. package/lib/collectors/github.js +76 -12
  36. package/lib/perf/benchmark-runner.js +11 -6
  37. package/lib/perf/investigation-state.js +12 -13
  38. package/lib/perf/profiling-runner.js +23 -4
  39. package/lib/repo-map/concurrency.js +29 -0
  40. package/lib/repo-map/runner.js +218 -19
  41. package/lib/repo-map/updater.js +115 -27
  42. package/lib/state/workflow-state.js +31 -30
  43. package/lib/utils/command-parser.js +0 -0
  44. package/lib/utils/state-helpers.js +61 -0
  45. package/package.json +1 -1
  46. package/plugins/agnix/.claude-plugin/plugin.json +1 -1
  47. package/plugins/agnix/skills/agnix/SKILL.md +1 -1
  48. package/plugins/audit-project/.claude-plugin/plugin.json +1 -1
  49. package/plugins/audit-project/lib/collectors/github.js +76 -12
  50. package/plugins/audit-project/lib/perf/benchmark-runner.js +11 -6
  51. package/plugins/audit-project/lib/perf/investigation-state.js +12 -13
  52. package/plugins/audit-project/lib/perf/profiling-runner.js +23 -4
  53. package/plugins/audit-project/lib/repo-map/concurrency.js +29 -0
  54. package/plugins/audit-project/lib/repo-map/runner.js +218 -19
  55. package/plugins/audit-project/lib/repo-map/updater.js +115 -27
  56. package/plugins/audit-project/lib/state/workflow-state.js +31 -30
  57. package/plugins/audit-project/lib/utils/command-parser.js +0 -0
  58. package/plugins/audit-project/lib/utils/state-helpers.js +61 -0
  59. package/plugins/consult/.claude-plugin/plugin.json +1 -1
  60. package/plugins/consult/agents/consult-agent.md +1 -1
  61. package/plugins/consult/commands/consult.md +2 -2
  62. package/plugins/consult/skills/consult/SKILL.md +22 -6
  63. package/plugins/deslop/.claude-plugin/plugin.json +1 -1
  64. package/plugins/deslop/lib/collectors/github.js +76 -12
  65. package/plugins/deslop/lib/perf/benchmark-runner.js +11 -6
  66. package/plugins/deslop/lib/perf/investigation-state.js +12 -13
  67. package/plugins/deslop/lib/perf/profiling-runner.js +23 -4
  68. package/plugins/deslop/lib/repo-map/concurrency.js +29 -0
  69. package/plugins/deslop/lib/repo-map/runner.js +218 -19
  70. package/plugins/deslop/lib/repo-map/updater.js +115 -27
  71. package/plugins/deslop/lib/state/workflow-state.js +31 -30
  72. package/plugins/deslop/lib/utils/command-parser.js +0 -0
  73. package/plugins/deslop/lib/utils/state-helpers.js +61 -0
  74. package/plugins/deslop/skills/deslop/SKILL.md +1 -1
  75. package/plugins/drift-detect/.claude-plugin/plugin.json +1 -1
  76. package/plugins/drift-detect/lib/collectors/github.js +76 -12
  77. package/plugins/drift-detect/lib/perf/benchmark-runner.js +11 -6
  78. package/plugins/drift-detect/lib/perf/investigation-state.js +12 -13
  79. package/plugins/drift-detect/lib/perf/profiling-runner.js +23 -4
  80. package/plugins/drift-detect/lib/repo-map/concurrency.js +29 -0
  81. package/plugins/drift-detect/lib/repo-map/runner.js +218 -19
  82. package/plugins/drift-detect/lib/repo-map/updater.js +115 -27
  83. package/plugins/drift-detect/lib/state/workflow-state.js +31 -30
  84. package/plugins/drift-detect/lib/utils/command-parser.js +0 -0
  85. package/plugins/drift-detect/lib/utils/state-helpers.js +61 -0
  86. package/plugins/drift-detect/skills/drift-analysis/SKILL.md +1 -1
  87. package/plugins/enhance/.claude-plugin/plugin.json +1 -1
  88. package/plugins/enhance/lib/collectors/github.js +76 -12
  89. package/plugins/enhance/lib/perf/benchmark-runner.js +11 -6
  90. package/plugins/enhance/lib/perf/investigation-state.js +12 -13
  91. package/plugins/enhance/lib/perf/profiling-runner.js +23 -4
  92. package/plugins/enhance/lib/repo-map/concurrency.js +29 -0
  93. package/plugins/enhance/lib/repo-map/runner.js +218 -19
  94. package/plugins/enhance/lib/repo-map/updater.js +115 -27
  95. package/plugins/enhance/lib/state/workflow-state.js +31 -30
  96. package/plugins/enhance/lib/utils/command-parser.js +0 -0
  97. package/plugins/enhance/lib/utils/state-helpers.js +61 -0
  98. package/plugins/enhance/skills/enhance-agent-prompts/SKILL.md +1 -1
  99. package/plugins/enhance/skills/enhance-claude-memory/SKILL.md +1 -1
  100. package/plugins/enhance/skills/enhance-cross-file/SKILL.md +1 -1
  101. package/plugins/enhance/skills/enhance-docs/SKILL.md +1 -1
  102. package/plugins/enhance/skills/enhance-hooks/SKILL.md +1 -1
  103. package/plugins/enhance/skills/enhance-orchestrator/SKILL.md +1 -1
  104. package/plugins/enhance/skills/enhance-plugins/SKILL.md +1 -1
  105. package/plugins/enhance/skills/enhance-prompts/SKILL.md +1 -1
  106. package/plugins/enhance/skills/enhance-skills/SKILL.md +1 -1
  107. package/plugins/learn/.claude-plugin/plugin.json +1 -1
  108. package/plugins/learn/lib/collectors/github.js +76 -12
  109. package/plugins/learn/lib/perf/benchmark-runner.js +11 -6
  110. package/plugins/learn/lib/perf/investigation-state.js +12 -13
  111. package/plugins/learn/lib/perf/profiling-runner.js +23 -4
  112. package/plugins/learn/lib/repo-map/concurrency.js +29 -0
  113. package/plugins/learn/lib/repo-map/runner.js +218 -19
  114. package/plugins/learn/lib/repo-map/updater.js +115 -27
  115. package/plugins/learn/lib/state/workflow-state.js +31 -30
  116. package/plugins/learn/lib/utils/command-parser.js +0 -0
  117. package/plugins/learn/lib/utils/state-helpers.js +61 -0
  118. package/plugins/learn/skills/learn/SKILL.md +1 -1
  119. package/plugins/next-task/.claude-plugin/plugin.json +1 -1
  120. package/plugins/next-task/lib/collectors/github.js +76 -12
  121. package/plugins/next-task/lib/perf/benchmark-runner.js +11 -6
  122. package/plugins/next-task/lib/perf/investigation-state.js +12 -13
  123. package/plugins/next-task/lib/perf/profiling-runner.js +23 -4
  124. package/plugins/next-task/lib/repo-map/concurrency.js +29 -0
  125. package/plugins/next-task/lib/repo-map/runner.js +218 -19
  126. package/plugins/next-task/lib/repo-map/updater.js +115 -27
  127. package/plugins/next-task/lib/state/workflow-state.js +31 -30
  128. package/plugins/next-task/lib/utils/command-parser.js +0 -0
  129. package/plugins/next-task/lib/utils/state-helpers.js +61 -0
  130. package/plugins/next-task/skills/discover-tasks/SKILL.md +1 -1
  131. package/plugins/next-task/skills/validate-delivery/SKILL.md +1 -1
  132. package/plugins/perf/.claude-plugin/plugin.json +1 -1
  133. package/plugins/perf/lib/collectors/github.js +76 -12
  134. package/plugins/perf/lib/perf/benchmark-runner.js +11 -6
  135. package/plugins/perf/lib/perf/investigation-state.js +12 -13
  136. package/plugins/perf/lib/perf/profiling-runner.js +23 -4
  137. package/plugins/perf/lib/repo-map/concurrency.js +29 -0
  138. package/plugins/perf/lib/repo-map/runner.js +218 -19
  139. package/plugins/perf/lib/repo-map/updater.js +115 -27
  140. package/plugins/perf/lib/state/workflow-state.js +31 -30
  141. package/plugins/perf/lib/utils/command-parser.js +0 -0
  142. package/plugins/perf/lib/utils/state-helpers.js +61 -0
  143. package/plugins/perf/skills/perf-analyzer/SKILL.md +1 -1
  144. package/plugins/perf/skills/perf-baseline-manager/SKILL.md +1 -1
  145. package/plugins/perf/skills/perf-benchmarker/SKILL.md +1 -1
  146. package/plugins/perf/skills/perf-code-paths/SKILL.md +1 -1
  147. package/plugins/perf/skills/perf-investigation-logger/SKILL.md +1 -1
  148. package/plugins/perf/skills/perf-profiler/SKILL.md +1 -1
  149. package/plugins/perf/skills/perf-theory-gatherer/SKILL.md +1 -1
  150. package/plugins/perf/skills/perf-theory-tester/SKILL.md +1 -1
  151. package/plugins/repo-map/.claude-plugin/plugin.json +1 -1
  152. package/plugins/repo-map/lib/collectors/github.js +76 -12
  153. package/plugins/repo-map/lib/perf/benchmark-runner.js +11 -6
  154. package/plugins/repo-map/lib/perf/investigation-state.js +12 -13
  155. package/plugins/repo-map/lib/perf/profiling-runner.js +23 -4
  156. package/plugins/repo-map/lib/repo-map/concurrency.js +29 -0
  157. package/plugins/repo-map/lib/repo-map/runner.js +218 -19
  158. package/plugins/repo-map/lib/repo-map/updater.js +115 -27
  159. package/plugins/repo-map/lib/state/workflow-state.js +31 -30
  160. package/plugins/repo-map/lib/utils/command-parser.js +0 -0
  161. package/plugins/repo-map/lib/utils/state-helpers.js +61 -0
  162. package/plugins/ship/.claude-plugin/plugin.json +1 -1
  163. package/plugins/ship/lib/collectors/github.js +76 -12
  164. package/plugins/ship/lib/perf/benchmark-runner.js +11 -6
  165. package/plugins/ship/lib/perf/investigation-state.js +12 -13
  166. package/plugins/ship/lib/perf/profiling-runner.js +23 -4
  167. package/plugins/ship/lib/repo-map/concurrency.js +29 -0
  168. package/plugins/ship/lib/repo-map/runner.js +218 -19
  169. package/plugins/ship/lib/repo-map/updater.js +115 -27
  170. package/plugins/ship/lib/state/workflow-state.js +31 -30
  171. package/plugins/ship/lib/utils/command-parser.js +0 -0
  172. package/plugins/ship/lib/utils/state-helpers.js +61 -0
  173. package/plugins/sync-docs/.claude-plugin/plugin.json +1 -1
  174. package/plugins/sync-docs/lib/collectors/github.js +76 -12
  175. package/plugins/sync-docs/lib/perf/benchmark-runner.js +11 -6
  176. package/plugins/sync-docs/lib/perf/investigation-state.js +12 -13
  177. package/plugins/sync-docs/lib/perf/profiling-runner.js +23 -4
  178. package/plugins/sync-docs/lib/repo-map/concurrency.js +29 -0
  179. package/plugins/sync-docs/lib/repo-map/runner.js +218 -19
  180. package/plugins/sync-docs/lib/repo-map/updater.js +115 -27
  181. package/plugins/sync-docs/lib/state/workflow-state.js +31 -30
  182. package/plugins/sync-docs/lib/utils/command-parser.js +0 -0
  183. package/plugins/sync-docs/lib/utils/state-helpers.js +61 -0
  184. package/plugins/sync-docs/skills/sync-docs/SKILL.md +1 -1
  185. package/site/content.json +1 -1
@@ -16,11 +16,11 @@ const path = require('path');
16
16
  const crypto = require('crypto');
17
17
  const { getStateDir } = require('../platform/state-dir');
18
18
  const { writeJsonAtomic } = require('../utils/atomic-write');
19
+ const { isPlainObject, updatesApplied, sleepForRetry } = require('../utils/state-helpers');
19
20
 
20
21
  // File paths
21
22
  const TASKS_FILE = 'tasks.json';
22
23
  const FLOW_FILE = 'flow.json';
23
-
24
24
  /**
25
25
  * Validate and resolve path to prevent path traversal attacks
26
26
  * @param {string} basePath - Base directory path
@@ -223,7 +223,7 @@ function writeFlow(flow, worktreePath = process.cwd()) {
223
223
  * Uses optimistic locking with version check and retry
224
224
  */
225
225
  function updateFlow(updates, worktreePath = process.cwd()) {
226
- const MAX_RETRIES = 3;
226
+ const MAX_RETRIES = 5;
227
227
 
228
228
  for (let attempt = 0; attempt < MAX_RETRIES; attempt++) {
229
229
  const flow = readFlow(worktreePath) || {};
@@ -238,10 +238,7 @@ function updateFlow(updates, worktreePath = process.cwd()) {
238
238
  flow[key] = null;
239
239
  }
240
240
  // Deep merge if both source and target are non-null objects
241
- else if (
242
- value && typeof value === 'object' && !Array.isArray(value) &&
243
- flow[key] && typeof flow[key] === 'object' && !Array.isArray(flow[key])
244
- ) {
241
+ else if (isPlainObject(value) && isPlainObject(flow[key])) {
245
242
  flow[key] = { ...flow[key], ...value };
246
243
  }
247
244
  // Otherwise direct assignment
@@ -258,24 +255,26 @@ function updateFlow(updates, worktreePath = process.cwd()) {
258
255
 
259
256
  // Re-read to verify our write succeeded
260
257
  const afterWrite = readFlow(worktreePath);
261
- if (afterWrite && afterWrite._version === initialVersion + 1) {
258
+ if (afterWrite && afterWrite._version >= initialVersion + 1 && updatesApplied(afterWrite, updates)) {
262
259
  return true; // Success
263
260
  }
264
261
 
265
- // Version conflict - retry after brief delay
262
+ // Version conflict or overwrite - retry after brief delay
266
263
  if (attempt < MAX_RETRIES - 1) {
267
- // Small random delay to reduce collision probability
268
264
  const delay = Math.floor(Math.random() * 50) + 10;
269
- const start = Date.now();
270
- while (Date.now() - start < delay) {
271
- // Busy wait (synchronous delay)
272
- }
265
+ sleepForRetry(delay);
273
266
  }
274
267
  }
275
268
 
276
- // All retries exhausted
277
- console.error('[WARN] updateFlow: max retries exceeded, possible version conflict');
278
- return true; // Return true to not break callers, but log warning
269
+ // All retries exhausted. One final read can detect if another writer
270
+ // applied the same updates while we were retrying.
271
+ const latest = readFlow(worktreePath);
272
+ if (latest && updatesApplied(latest, updates)) {
273
+ return true;
274
+ }
275
+
276
+ console.error('[ERROR] updateFlow: failed to apply updates after max retries');
277
+ return false;
279
278
  }
280
279
 
281
280
  /**
@@ -420,8 +419,8 @@ function completePhase(result = null, worktreePath = process.cwd()) {
420
419
  }
421
420
  }
422
421
 
423
- updateFlow(updates, worktreePath);
424
- return readFlow(worktreePath);
422
+ const updated = updateFlow(updates, worktreePath);
423
+ return updated ? readFlow(worktreePath) : null;
425
424
  }
426
425
 
427
426
  /**
@@ -454,16 +453,17 @@ function failWorkflow(error, worktreePath = process.cwd()) {
454
453
  function completeWorkflow(worktreePath = process.cwd()) {
455
454
  const flow = readFlow(worktreePath);
456
455
 
457
- // Clear active task from main project if projectPath is stored
458
- if (flow && flow.projectPath) {
459
- clearActiveTask(flow.projectPath);
460
- }
461
-
462
- return updateFlow({
456
+ const updated = updateFlow({
463
457
  phase: 'complete',
464
458
  status: 'completed',
465
459
  completedAt: new Date().toISOString()
466
460
  }, worktreePath);
461
+
462
+ if (updated && flow && flow.projectPath) {
463
+ clearActiveTask(flow.projectPath);
464
+ }
465
+
466
+ return updated;
467
467
  }
468
468
 
469
469
  /**
@@ -473,16 +473,17 @@ function completeWorkflow(worktreePath = process.cwd()) {
473
473
  function abortWorkflow(reason, worktreePath = process.cwd()) {
474
474
  const flow = readFlow(worktreePath);
475
475
 
476
- // Clear active task from main project if projectPath is stored
477
- if (flow && flow.projectPath) {
478
- clearActiveTask(flow.projectPath);
479
- }
480
-
481
- return updateFlow({
476
+ const updated = updateFlow({
482
477
  status: 'aborted',
483
478
  abortReason: reason,
484
479
  abortedAt: new Date().toISOString()
485
480
  }, worktreePath);
481
+
482
+ if (updated && flow && flow.projectPath) {
483
+ clearActiveTask(flow.projectPath);
484
+ }
485
+
486
+ return updated;
486
487
  }
487
488
 
488
489
  // =============================================================================
@@ -0,0 +1,61 @@
1
+ 'use strict';
2
+
3
+ const { isDeepStrictEqual } = require('util');
4
+
5
+ const RETRY_SLEEP_STATE = typeof SharedArrayBuffer === 'function' && typeof Atomics === 'object' && typeof Atomics.wait === 'function'
6
+ ? new Int32Array(new SharedArrayBuffer(4))
7
+ : null;
8
+
9
+ function isPlainObject(value) {
10
+ return Boolean(value) && typeof value === 'object' && !Array.isArray(value);
11
+ }
12
+
13
+ function hasUpdatedSubset(target, subset) {
14
+ if (!isPlainObject(subset)) {
15
+ return isDeepStrictEqual(target, subset);
16
+ }
17
+ if (!isPlainObject(target)) {
18
+ return false;
19
+ }
20
+
21
+ for (const [key, value] of Object.entries(subset)) {
22
+ if (!hasUpdatedSubset(target[key], value)) {
23
+ return false;
24
+ }
25
+ }
26
+ return true;
27
+ }
28
+
29
+ function updatesApplied(state, updates) {
30
+ if (!state) return false;
31
+
32
+ for (const [key, value] of Object.entries(updates || {})) {
33
+ if (key === '_version') continue;
34
+ if (!hasUpdatedSubset(state[key], value)) {
35
+ return false;
36
+ }
37
+ }
38
+
39
+ return true;
40
+ }
41
+
42
+ function sleepForRetry(ms) {
43
+ if (!Number.isFinite(ms) || ms <= 0) {
44
+ return;
45
+ }
46
+
47
+ const delayMs = Math.floor(ms);
48
+ if (RETRY_SLEEP_STATE) {
49
+ try {
50
+ Atomics.wait(RETRY_SLEEP_STATE, 0, 0, delayMs);
51
+ } catch {
52
+ // Ignore environments where Atomics.wait exists but cannot be used.
53
+ }
54
+ }
55
+ }
56
+
57
+ module.exports = {
58
+ isPlainObject,
59
+ updatesApplied,
60
+ sleepForRetry
61
+ };
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: sync-docs
3
3
  description: "Sync documentation with code. Use when user asks to update docs, check docs, fix stale documentation, update changelog, or after code changes."
4
- version: 5.0.1
4
+ version: 5.0.3
5
5
  argument-hint: "[report|apply] [--scope=all|recent|before-pr] [--include-undocumented]"
6
6
  allowed-tools: Bash(git:*), Read, Grep, Glob
7
7
  ---
package/site/content.json CHANGED
@@ -5,7 +5,7 @@
5
5
  "url": "https://avifenesh.github.io/agentsys",
6
6
  "repo": "https://github.com/avifenesh/agentsys",
7
7
  "npm": "https://www.npmjs.com/package/agentsys",
8
- "version": "5.0.1",
8
+ "version": "5.0.3",
9
9
  "author": "Avi Fenesh",
10
10
  "author_url": "https://github.com/avifenesh"
11
11
  },