agentic-workflow-manager 6.5.2 → 8.1.0

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 (95) hide show
  1. package/dist/scripts/sensor-support-matrix.js +103 -0
  2. package/dist/scripts/support-matrix.js +40 -17
  3. package/dist/src/commands/init.js +1 -3
  4. package/dist/src/commands/ledger/index.js +6 -0
  5. package/dist/src/commands/preflight/checks.js +4 -4
  6. package/dist/src/commands/preflight/index.js +2 -2
  7. package/dist/src/commands/registry/add.js +2 -2
  8. package/dist/src/commands/registry/index.js +5 -0
  9. package/dist/src/commands/registry/status.js +7 -0
  10. package/dist/src/commands/sensors/compatibility/contract.js +382 -0
  11. package/dist/src/commands/sensors/compatibility/discovery.js +207 -0
  12. package/dist/src/commands/sensors/compatibility/live.js +92 -0
  13. package/dist/src/commands/sensors/compatibility/manifest.js +207 -0
  14. package/dist/src/commands/sensors/compatibility/materialize.js +134 -0
  15. package/dist/src/commands/sensors/compatibility/pack-source.js +78 -0
  16. package/dist/src/commands/sensors/compatibility/probe.js +47 -0
  17. package/dist/src/commands/sensors/compatibility/resolve.js +99 -0
  18. package/dist/src/commands/sensors/compatibility/types.js +2 -0
  19. package/dist/src/commands/sensors/coverage/contract.js +0 -50
  20. package/dist/src/commands/sensors/coverage/empirical.js +131 -0
  21. package/dist/src/commands/sensors/coverage/evaluate.js +85 -7
  22. package/dist/src/commands/sensors/coverage/evidence.js +5 -1
  23. package/dist/src/commands/sensors/coverage/index.js +44 -7
  24. package/dist/src/commands/sensors/coverage/render.js +214 -14
  25. package/dist/src/commands/sensors/coverage/resolve.js +24 -38
  26. package/dist/src/commands/sensors/exec.js +244 -9
  27. package/dist/src/commands/sensors/index.js +18 -6
  28. package/dist/src/commands/sensors/init.js +95 -6
  29. package/dist/src/commands/sensors/run.js +71 -0
  30. package/dist/src/commands/sensors/status.js +48 -4
  31. package/dist/src/commands/sync.js +7 -0
  32. package/dist/src/core/bundles.js +38 -3
  33. package/dist/src/core/init/steps.js +7 -4
  34. package/dist/src/core/ledger/scan.js +228 -0
  35. package/dist/src/core/ledger/store.js +89 -25
  36. package/dist/src/core/ledger/types.js +54 -0
  37. package/dist/src/core/paths.js +10 -9
  38. package/dist/src/core/registries.js +134 -14
  39. package/dist/src/index.js +24 -1
  40. package/dist/tests/commands/ledger/index.test.js +11 -0
  41. package/dist/tests/commands/preflight/preflight.test.js +64 -64
  42. package/dist/tests/commands/registry/add.test.js +69 -2
  43. package/dist/tests/commands/registry/status.test.js +14 -0
  44. package/dist/tests/commands/sensors/compatibility/contract.test.js +193 -0
  45. package/dist/tests/commands/sensors/compatibility/discovery.test.js +119 -0
  46. package/dist/tests/commands/sensors/compatibility/live.test.js +124 -0
  47. package/dist/tests/commands/sensors/compatibility/manifest.test.js +77 -0
  48. package/dist/tests/commands/sensors/compatibility/materialize.test.js +72 -0
  49. package/dist/tests/commands/sensors/compatibility/pack-source.test.js +55 -0
  50. package/dist/tests/commands/sensors/compatibility/probe.test.js +37 -0
  51. package/dist/tests/commands/sensors/compatibility/python-venv-fixture.js +29 -0
  52. package/dist/tests/commands/sensors/compatibility/resolve.test.js +83 -0
  53. package/dist/tests/commands/sensors/coverage/contract.test.js +8 -22
  54. package/dist/tests/commands/sensors/coverage/empirical.test.js +111 -0
  55. package/dist/tests/commands/sensors/coverage/evaluate.test.js +29 -0
  56. package/dist/tests/commands/sensors/coverage/evidence.test.js +9 -0
  57. package/dist/tests/commands/sensors/coverage/index.test.js +40 -13
  58. package/dist/tests/commands/sensors/coverage/render.test.js +187 -12
  59. package/dist/tests/commands/sensors/coverage/resolve.test.js +25 -4
  60. package/dist/tests/commands/sensors/exec-windows.test.js +140 -2
  61. package/dist/tests/commands/sensors/exec.test.js +115 -5
  62. package/dist/tests/commands/sensors/index.test.js +8 -0
  63. package/dist/tests/commands/sensors/init-pack-unavailable.test.js +12 -12
  64. package/dist/tests/commands/sensors/init.test.js +204 -48
  65. package/dist/tests/commands/sensors/run-inconclusive.test.js +9 -2
  66. package/dist/tests/commands/sensors/run-is-read-only.test.js +0 -0
  67. package/dist/tests/commands/sensors/run.test.js +66 -3
  68. package/dist/tests/commands/sensors/status-windows.test.js +7 -7
  69. package/dist/tests/commands/sensors/status.test.js +74 -23
  70. package/dist/tests/commands/update.test.js +1 -1
  71. package/dist/tests/core/bundles.test.js +37 -0
  72. package/dist/tests/core/discovery.test.js +4 -0
  73. package/dist/tests/core/init/orchestrator.test.js +5 -1
  74. package/dist/tests/core/init/steps.test.js +20 -4
  75. package/dist/tests/core/ledger/scan.test.js +217 -0
  76. package/dist/tests/core/ledger/store.test.js +108 -0
  77. package/dist/tests/core/profile-pins.test.js +2 -1
  78. package/dist/tests/core/project-skill-links.test.js +22 -0
  79. package/dist/tests/core/registries-capability.test.js +10 -0
  80. package/dist/tests/core/registries-sync.test.js +16 -0
  81. package/dist/tests/core/registries.test.js +129 -1
  82. package/dist/tests/core/registry-manifest.test.js +7 -0
  83. package/dist/tests/core/same-existing-path.test.js +35 -0
  84. package/dist/tests/core/sync-gates.test.js +2 -1
  85. package/dist/tests/integration/copilot-init-isolated.test.js +18 -0
  86. package/dist/tests/integration/sensor-compatibility.e2e.test.js +141 -0
  87. package/dist/tests/integration/sensor-coverage.e2e.test.js +35 -6
  88. package/dist/tests/integration/sensor-structured-run.e2e.test.js +127 -0
  89. package/dist/tests/structural/active-documentation.test.js +128 -0
  90. package/dist/tests/structural/async-entrypoint.test.js +15 -0
  91. package/dist/tests/structural/jest-environment-is-isolated.test.js +44 -0
  92. package/dist/tests/structural/r3-cli-major-version.test.js +37 -0
  93. package/dist/tests/structural/sensor-documentation-contract.test.js +77 -0
  94. package/dist/tests/structural/support-matrix-is-current.test.js +69 -2
  95. package/package.json +8 -2
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const child_process_1 = require("child_process");
9
+ const CLI_ROOT = path_1.default.resolve(__dirname, '../..');
10
+ const DIST_ENTRYPOINT = path_1.default.join(CLI_ROOT, 'dist', 'src', 'index.js');
11
+ const TARGET_VERSION = '8.0.0';
12
+ function readJson(file) {
13
+ return JSON.parse(fs_1.default.readFileSync(path_1.default.join(CLI_ROOT, file), 'utf8'));
14
+ }
15
+ function runCompiledCli(...args) {
16
+ const result = (0, child_process_1.spawnSync)(process.execPath, [DIST_ENTRYPOINT, ...args], {
17
+ cwd: CLI_ROOT,
18
+ encoding: 'utf8',
19
+ });
20
+ expect(result.error).toBeUndefined();
21
+ expect(result.status).toBe(0);
22
+ return `${result.stdout}${result.stderr}`;
23
+ }
24
+ describe('R3 public major CLI release contract', () => {
25
+ it('declares 8.0.0 consistently in package metadata and the lockfile root', () => {
26
+ const pkg = readJson('package.json');
27
+ const lock = readJson('package-lock.json');
28
+ const root = lock.packages[''];
29
+ expect(pkg.version).toBe(TARGET_VERSION);
30
+ expect(lock.version).toBe(TARGET_VERSION);
31
+ expect(root.version).toBe(TARGET_VERSION);
32
+ });
33
+ it('exposes 8.0.0 from the compiled CLI while retaining its help banner', () => {
34
+ expect(runCompiledCli('--version').trim()).toBe(TARGET_VERSION);
35
+ expect(runCompiledCli('--help')).toContain('Usage: awm');
36
+ });
37
+ });
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fs_1 = __importDefault(require("fs"));
7
+ const path_1 = __importDefault(require("path"));
8
+ const commander_1 = require("commander");
9
+ jest.mock('@clack/prompts', () => ({
10
+ log: { error: jest.fn(), success: jest.fn(), warn: jest.fn(), info: jest.fn() },
11
+ }));
12
+ const manifest_1 = require("../../src/commands/sensors/compatibility/manifest");
13
+ const ledger_1 = require("../../src/commands/ledger");
14
+ const sensors_1 = require("../../src/commands/sensors");
15
+ const ROOT = path_1.default.resolve(__dirname, '../../..');
16
+ const read = (file) => fs_1.default.readFileSync(path_1.default.join(ROOT, file), 'utf8');
17
+ function documentedJson(files) {
18
+ return files.flatMap((file) => Array.from(read(file).matchAll(/```json\s*\n([\s\S]*?)```/g), (match) => JSON.parse(match[1])));
19
+ }
20
+ function helpFor(command) {
21
+ const program = new commander_1.Command().name('awm');
22
+ (0, sensors_1.registerSensorsCommand)(program);
23
+ (0, ledger_1.registerLedgerCommand)(program);
24
+ const [parent, child] = command.split(' ');
25
+ return program.commands.find((entry) => entry.name() === parent)
26
+ .commands.find((entry) => entry.name() === child).helpInformation();
27
+ }
28
+ describe('R3 canonical sensor documentation', () => {
29
+ test.each([
30
+ ['docs/framework.md', ['Static coverage', 'Empirical coverage', 'retrospective feedback loop']],
31
+ ['docs/configuration.md', ['pack schema v2', 'legacy pack', 'compatible-unverified']],
32
+ ['docs/project-setup.md', ['version-aware', 'hardening opt-in']],
33
+ ['docs/runbook.md', ['awm sensors coverage --min', 'compatibility drift', 'orphaned asset']],
34
+ ['docs/cli-reference.md', ['schemaVersion: 2', '--defect-class', '--min']],
35
+ ['docs/architecture.md', ['compatibility resolver', 'bounded probe']],
36
+ ])('%s owns its R3 subject', (file, phrases) => {
37
+ const text = read(file);
38
+ phrases.forEach((phrase) => expect(text).toContain(phrase));
39
+ });
40
+ test('parses every documented v2 sensor manifest example with the production parser', () => {
41
+ const examples = documentedJson(['docs/configuration.md', 'docs/cli-reference.md'])
42
+ .filter((value) => typeof value === 'object' && value !== null && value.schemaVersion === 2);
43
+ expect(examples.length).toBeGreaterThan(0);
44
+ examples.forEach((example) => expect(() => (0, manifest_1.parseSensorManifest)(example, 'documented example')).not.toThrow());
45
+ });
46
+ test('keeps documented v2 sensor manifests portable across native platforms', () => {
47
+ const examples = documentedJson(['docs/configuration.md', 'docs/cli-reference.md'])
48
+ .filter((value) => typeof value === 'object' && value !== null && value.schemaVersion === 2);
49
+ expect(examples.length).toBeGreaterThan(0);
50
+ examples.forEach((example) => expect(example).not.toHaveProperty('registryRoot'));
51
+ });
52
+ test('documents exact Commander flags', () => {
53
+ expect(helpFor('sensors coverage')).toContain('--min <count>');
54
+ expect(helpFor('ledger add')).toContain('--defect-class <id>');
55
+ const reference = read('docs/cli-reference.md');
56
+ expect(reference).toContain('awm sensors coverage [--json] [--min <count>]');
57
+ expect(reference).toContain('--defect-class <id>');
58
+ });
59
+ test('does not overstate the human coverage renderer or retrospective archive wiring', () => {
60
+ const reference = read('docs/cli-reference.md');
61
+ const runbook = read('docs/runbook.md');
62
+ expect(reference).toMatch(/safe,\s+sanitized evidence references and safe cluster signatures/);
63
+ expect(reference).toMatch(/never ledger\s+descriptions, raw ledger lines, or unsafe values/);
64
+ expect(runbook).toContain('Run `awm sensors coverage --min 2` manually before archive');
65
+ expect(runbook).toMatch(/Automatic\s+coverage-before-archive enforcement is delivered by the registry in T12/);
66
+ expect(runbook).not.toContain('it automatically evaluates\ncoverage feedback');
67
+ });
68
+ test('keeps archival coverage manual until registry enforcement and scopes v2 binary resolution', () => {
69
+ const framework = read('docs/framework.md');
70
+ const osMatrix = read('docs/testing/os-matrix.md');
71
+ expect(framework).toMatch(/manual operator step[\s\S]*until the registry delivers automatic enforcement in T12/i);
72
+ expect(osMatrix).toMatch(/v2 local resolution modes use project-local `node_modules` or `.venv`\/`venv`\s+environments/i);
73
+ expect(osMatrix).toMatch(/Windows `.cmd`\/`.bat` wrappers are rejected for structured v2\s+commands/i);
74
+ expect(osMatrix).toMatch(/Legacy string\s+commands remain separate and retain their documented shell\/PATH semantics/i);
75
+ expect(osMatrix).not.toContain('Sensors resolve their binaries on PATH');
76
+ });
77
+ });
@@ -16,7 +16,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
16
16
  // Este test hace que ese desvio sea imposible de mergear. No verifica que la tabla sea
17
17
  // "linda": verifica que sea LA MISMA que produce el codigo hoy.
18
18
  const fs_1 = __importDefault(require("fs"));
19
+ const path_1 = __importDefault(require("path"));
19
20
  const support_matrix_1 = require("../../scripts/support-matrix");
21
+ const sensor_support_matrix_1 = require("../../scripts/sensor-support-matrix");
22
+ const SENSOR_FIXTURE_REGISTRY = path_1.default.join(__dirname, '..', 'fixtures', 'sensor-support-matrix', 'registry');
20
23
  describe('docs/support-matrix.md refleja el codigo', () => {
21
24
  it('el bloque generado esta al dia', () => {
22
25
  const doc = fs_1.default.readFileSync(support_matrix_1.DOC_PATH, 'utf-8');
@@ -30,6 +33,18 @@ describe('docs/support-matrix.md refleja el codigo', () => {
30
33
  expect(doc).toContain(support_matrix_1.BEGIN_MARKER);
31
34
  expect(doc).toContain(support_matrix_1.END_MARKER);
32
35
  });
36
+ it('the generated pre-publication v2 sensor-pack contract fixture is current', () => {
37
+ const doc = fs_1.default.readFileSync(support_matrix_1.DOC_PATH, 'utf-8');
38
+ expect(doc).toContain(sensor_support_matrix_1.SENSOR_BEGIN_MARKER);
39
+ expect(doc).toContain(sensor_support_matrix_1.SENSOR_END_MARKER);
40
+ expect(doc).toContain(sensor_support_matrix_1.R3_PREPUBLICATION_FIXTURE_PURPOSE);
41
+ expect(doc).toContain('not the published `awm-baseline-registry` manifests');
42
+ expect(doc).toBe((0, sensor_support_matrix_1.spliceSensorSupportMatrix)(doc, (0, sensor_support_matrix_1.renderSensorSupportMatrix)(SENSOR_FIXTURE_REGISTRY)));
43
+ });
44
+ it('pins the documentation generator to the declared R3 pre-publication fixture', () => {
45
+ const packageJson = JSON.parse(fs_1.default.readFileSync(path_1.default.join(__dirname, '..', '..', 'package.json'), 'utf8'));
46
+ expect(packageJson.scripts?.['docs:matrix']).toContain(`--registry-root ${sensor_support_matrix_1.R3_PREPUBLICATION_FIXTURE_RELATIVE_PATH}`);
47
+ });
33
48
  it('la tabla nombra a los seis providers declarados', () => {
34
49
  // Que el bloque este "al dia" no sirve si el generador se olvidara de un provider:
35
50
  // doc y generador coincidirian, los dos incompletos.
@@ -61,6 +76,58 @@ describe('docs/support-matrix.md refleja el codigo', () => {
61
76
  jest.resetModules();
62
77
  }
63
78
  });
79
+ it('documents default provider paths even when this machine overrides CODEX_HOME', () => {
80
+ const saved = process.env.CODEX_HOME;
81
+ process.env.CODEX_HOME = '/private/codex-home';
82
+ try {
83
+ jest.resetModules();
84
+ const { renderProviderTables: fresh } = require('../../scripts/support-matrix');
85
+ expect(fresh()).toContain('`~/.codex/agents`');
86
+ expect(fresh()).not.toContain('/private/codex-home');
87
+ }
88
+ finally {
89
+ if (saved === undefined)
90
+ delete process.env.CODEX_HOME;
91
+ else
92
+ process.env.CODEX_HOME = saved;
93
+ jest.resetModules();
94
+ }
95
+ });
96
+ it('does not leak a normalized CODEX_HOME override into generated documentation', () => {
97
+ const saved = process.env.CODEX_HOME;
98
+ process.env.CODEX_HOME = '/private/codex/../secret-codex/';
99
+ try {
100
+ jest.resetModules();
101
+ const { renderProviderTables: fresh } = require('../../scripts/support-matrix');
102
+ const generated = fresh();
103
+ expect(generated).toContain('`~/.codex/agents`');
104
+ expect(generated).not.toContain('/private/');
105
+ expect(generated).not.toContain('secret-codex');
106
+ }
107
+ finally {
108
+ if (saved === undefined)
109
+ delete process.env.CODEX_HOME;
110
+ else
111
+ process.env.CODEX_HOME = saved;
112
+ jest.resetModules();
113
+ }
114
+ });
115
+ it('keeps a separator when CODEX_HOME has a trailing slash', () => {
116
+ const saved = process.env.CODEX_HOME;
117
+ process.env.CODEX_HOME = '/private/codex-home/';
118
+ try {
119
+ jest.resetModules();
120
+ const { renderProviderTables: fresh } = require('../../scripts/support-matrix');
121
+ expect(fresh()).toContain('`~/.codex/agents`');
122
+ }
123
+ finally {
124
+ if (saved === undefined)
125
+ delete process.env.CODEX_HOME;
126
+ else
127
+ process.env.CODEX_HOME = saved;
128
+ jest.resetModules();
129
+ }
130
+ });
64
131
  // La abreviacion a `~` se probaba solo end-to-end, y en Linux eso no distingue entre
65
132
  // "normaliza bien" y "los separadores ya coincidian". La CI de Windows encontro que no
66
133
  // normalizaba: comparaba el prefijo ANTES de convertir separadores, asi que alla no
@@ -89,12 +156,12 @@ describe('docs/support-matrix.md refleja el codigo', () => {
89
156
  expect(out).toContain('linea uno\r\nlinea dos');
90
157
  expect(out.split('\r\n').length - 1).toBe(out.split('\n').length - 1); // ni un LF suelto
91
158
  });
92
- it('marca como no soportado, no como ausente, el scope que un provider no tiene', () => {
159
+ it('marks an unsupported scope rather than leaving it absent', () => {
93
160
  // La diferencia entre "no soportado" y una celda vacia es exactamente lo que el
94
161
  // documento existe para no dejar ambiguo: Copilot no tiene scope global por
95
162
  // decision del producto que integramos, no porque falte implementarlo.
96
163
  const generated = (0, support_matrix_1.renderProviderTables)();
97
164
  const copilotRow = generated.split('\n').find((l) => l.startsWith('| `copilot` |'));
98
- expect(copilotRow).toContain('**no soportado**');
165
+ expect(copilotRow).toContain('**unsupported**');
99
166
  });
100
167
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-workflow-manager",
3
- "version": "6.5.2",
3
+ "version": "8.1.0",
4
4
  "main": "dist/src/index.js",
5
5
  "bin": {
6
6
  "awm": "./dist/src/index.js"
@@ -18,13 +18,16 @@
18
18
  },
19
19
  "scripts": {
20
20
  "build": "tsc && chmod +x dist/src/index.js",
21
+ "typecheck": "tsc --noEmit",
22
+ "lint": "eslint . --config eslint.config.awm.mjs --cache --format json",
23
+ "depcheck": "depcruise --config .dep-cruiser.awm.js src",
21
24
  "test": "jest --runInBand",
22
25
  "start": "ts-node src/index.ts",
23
26
  "prerelease": "npm run build",
24
27
  "release": "node dist/src/release/index.js",
25
28
  "prepack": "npm run build",
26
29
  "prepublishOnly": "npm run build",
27
- "docs:matrix": "ts-node scripts/support-matrix.ts"
30
+ "docs:matrix": "ts-node scripts/support-matrix.ts && ts-node scripts/sensor-support-matrix.ts --registry-root tests/fixtures/sensor-support-matrix/registry"
28
31
  },
29
32
  "keywords": [
30
33
  "agentic",
@@ -43,17 +46,20 @@
43
46
  "@clack/prompts": "^1.0.1",
44
47
  "commander": "^14.0.3",
45
48
  "picocolors": "^1.1.1",
49
+ "semver": "^7.7.4",
46
50
  "simple-git": "^3.32.2"
47
51
  },
48
52
  "devDependencies": {
49
53
  "@types/jest": "^30.0.0",
50
54
  "@types/js-yaml": "4.0.9",
51
55
  "@types/node": "^25.3.0",
56
+ "@types/semver": "^7.7.1",
52
57
  "dependency-cruiser": "^17.4.3",
53
58
  "eslint": "^10.4.1",
54
59
  "jest": "^30.2.0",
55
60
  "js-yaml": "4.1.0",
56
61
  "ts-jest": "^29.4.6",
62
+ "ts-node": "^10.9.2",
57
63
  "typescript": "^5.9.3"
58
64
  }
59
65
  }