agentic-workflow-manager 9.7.1 → 9.8.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 (78) hide show
  1. package/README.md +5 -1
  2. package/dist/src/commands/job/exec-wrapper.js +53 -3
  3. package/dist/src/commands/plan/index.js +124 -6
  4. package/dist/src/commands/sensors/bootstrap.js +36 -5
  5. package/dist/src/commands/sensors/compatibility/contract.js +19 -4
  6. package/dist/src/commands/sensors/compatibility/discovery.js +23 -3
  7. package/dist/src/commands/sensors/compatibility/live.js +18 -1
  8. package/dist/src/commands/sensors/compatibility/probe.js +8 -2
  9. package/dist/src/commands/sensors/compatibility/resolve.js +5 -2
  10. package/dist/src/commands/sensors/coverage/evidence.js +19 -10
  11. package/dist/src/commands/sensors/coverage/index.js +11 -2
  12. package/dist/src/commands/sensors/coverage/resolve.js +10 -0
  13. package/dist/src/commands/sensors/exec.js +16 -1
  14. package/dist/src/commands/sensors/migrate.js +62 -2
  15. package/dist/src/commands/sensors/prepare.js +2 -0
  16. package/dist/src/commands/sensors/result.js +2 -0
  17. package/dist/src/commands/sensors/run.js +64 -1
  18. package/dist/src/commands/sensors/status.js +6 -4
  19. package/dist/src/commands/watch/archive-unused.js +138 -0
  20. package/dist/src/commands/watch/generations.js +32 -9
  21. package/dist/src/commands/watch/index.js +108 -2
  22. package/dist/src/commands/watch/init.js +149 -18
  23. package/dist/src/commands/watch/supervisor.js +167 -13
  24. package/dist/src/commands/watch/teardown-driver.js +13 -13
  25. package/dist/src/commands/watch/track-state.js +59 -0
  26. package/dist/src/commands/watch/tracks.js +38 -102
  27. package/dist/src/core/admission/index.js +181 -0
  28. package/dist/src/core/admission/registry-contracts.js +290 -0
  29. package/dist/src/core/journal/fingerprint.js +35 -1
  30. package/dist/src/core/journal/paths.js +11 -0
  31. package/dist/src/core/journal/store.js +146 -4
  32. package/dist/src/core/journal/types.js +35 -1
  33. package/dist/src/core/migration/historical-provenance.js +18 -0
  34. package/dist/src/core/migration/index.js +322 -0
  35. package/dist/src/core/plan/identity.js +75 -0
  36. package/dist/src/core/plan/validate.js +178 -64
  37. package/dist/tests/commands/job/exec-wrapper.test.js +16 -0
  38. package/dist/tests/commands/job/gate-reconcile.test.js +24 -10
  39. package/dist/tests/commands/pin.test.js +23 -23
  40. package/dist/tests/commands/plan/index.test.js +630 -14
  41. package/dist/tests/commands/sensors/bootstrap.test.js +57 -4
  42. package/dist/tests/commands/sensors/compatibility/contract.test.js +21 -0
  43. package/dist/tests/commands/sensors/compatibility/discovery.test.js +19 -0
  44. package/dist/tests/commands/sensors/compatibility/probe.test.js +14 -1
  45. package/dist/tests/commands/sensors/compatibility/resolve.test.js +17 -0
  46. package/dist/tests/commands/sensors/coverage/evidence.test.js +51 -27
  47. package/dist/tests/commands/sensors/coverage/resolve.test.js +51 -0
  48. package/dist/tests/commands/sensors/exec.test.js +112 -0
  49. package/dist/tests/commands/sensors/run-changed.test.js +11 -0
  50. package/dist/tests/commands/sensors/run.test.js +15 -2
  51. package/dist/tests/commands/sensors/status.test.js +3 -3
  52. package/dist/tests/commands/watch/e2e-crash.test.js +126 -11
  53. package/dist/tests/commands/watch/generations.test.js +113 -4
  54. package/dist/tests/commands/watch/plan-lifecycle.test.js +263 -0
  55. package/dist/tests/commands/watch/supervisor-loop.test.js +247 -49
  56. package/dist/tests/commands/watch/track-finalize.test.js +20 -3
  57. package/dist/tests/commands/watch/track-freeze.test.js +43 -30
  58. package/dist/tests/commands/watch/track-state-dependency.test.js +15 -0
  59. package/dist/tests/commands/watch/watch-init.test.js +244 -0
  60. package/dist/tests/core/admission/index.test.js +87 -0
  61. package/dist/tests/core/journal/fingerprint.test.js +22 -0
  62. package/dist/tests/core/journal/store.test.js +53 -0
  63. package/dist/tests/core/journal/types.test.js +7 -0
  64. package/dist/tests/core/migration/facts.test.js +289 -0
  65. package/dist/tests/core/migration/historical-provenance.test.js +25 -0
  66. package/dist/tests/core/plan/validate.test.js +320 -6
  67. package/dist/tests/integration/pack-e2e.test.js +4 -1
  68. package/dist/tests/integration/preflight-json-pipe.e2e.test.js +7 -3
  69. package/dist/tests/integration/sensor-bootstrap.e2e.test.js +37 -0
  70. package/dist/tests/integration/sensor-structured-run.e2e.test.js +12 -10
  71. package/dist/tests/providers/injection-config.test.js +14 -6
  72. package/dist/tests/structural/jest-environment-is-isolated.test.js +29 -24
  73. package/dist/tests/structural/native-release-artifacts.test.js +16 -0
  74. package/package.json +2 -2
  75. package/prebuilds/darwin-arm64/secure_fs.node +0 -0
  76. package/prebuilds/darwin-x64/secure_fs.node +0 -0
  77. package/prebuilds/win32-arm64/secure_fs.node +0 -0
  78. package/prebuilds/win32-x64/secure_fs.node +0 -0
@@ -6,44 +6,49 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const os_1 = __importDefault(require("os"));
7
7
  const fs_1 = __importDefault(require("fs"));
8
8
  const path_1 = __importDefault(require("path"));
9
+ function isWithin(parent, candidate, pathApi = path_1.default) {
10
+ const relative = pathApi.relative(parent, candidate);
11
+ return relative === '' || (relative !== '..' && !relative.startsWith(`..${pathApi.sep}`) && !pathApi.isAbsolute(relative));
12
+ }
9
13
  describe('Jest environment isolation', () => {
14
+ it('treats a path on another volume as outside the operator home', () => {
15
+ expect(isWithin('C:\\operator-home', 'D:\\suite-root', path_1.default.win32)).toBe(false);
16
+ });
10
17
  it('does not inherit the operator Codex home', () => {
11
18
  expect(process.env.CODEX_HOME).toBeUndefined();
12
19
  });
13
20
  it('uses a suite-owned temporary directory', () => {
14
21
  expect(os_1.default.tmpdir()).toContain('awm-jest-');
15
22
  });
16
- it('falls back to the system temp directory when the home cache is read-only', async () => {
23
+ it('routes every unscoped AWM write into the suite-owned temporary directory', () => {
24
+ expect(process.env.AWM_HOME).toBe(path_1.default.join(process.env.AWM_JEST_TMPDIR, 'awm-home'));
25
+ });
26
+ it('keeps the suite root and both homes outside the operator home', () => {
27
+ const suiteRoot = process.env.AWM_JEST_TMPDIR;
28
+ const operatorHome = fs_1.default.realpathSync(os_1.default.userInfo().homedir);
29
+ expect(isWithin(operatorHome, suiteRoot)).toBe(false);
30
+ expect(process.env.HOME).toBe(path_1.default.join(suiteRoot, 'home'));
31
+ expect(process.env.AWM_HOME).toBe(path_1.default.join(suiteRoot, 'awm-home'));
32
+ });
33
+ it('creates its physical root below the system temp directory, not the operator home', async () => {
17
34
  const originalEnv = { ...process.env };
18
- const fallback = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'awm-jest-fallback-'));
35
+ const systemTemp = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'awm-jest-system-'));
36
+ const operatorHome = path_1.default.join(systemTemp, 'operator-home');
19
37
  try {
38
+ fs_1.default.mkdirSync(operatorHome);
20
39
  jest.resetModules();
21
40
  jest.doMock('os', () => ({
22
41
  ...jest.requireActual('os'),
23
- homedir: () => '/readonly-home',
24
- tmpdir: () => fallback,
25
- }));
26
- const actualFs = jest.requireActual('fs');
27
- jest.doMock('fs', () => ({
28
- ...actualFs,
29
- mkdirSync: jest.fn((target, ...args) => {
30
- if (String(target).includes('readonly-home')) {
31
- return undefined;
32
- }
33
- return actualFs.mkdirSync(target, ...args);
34
- }),
35
- mkdtempSync: jest.fn((prefix, ...args) => {
36
- if (prefix.includes('readonly-home')) {
37
- const error = new Error('read-only');
38
- error.code = 'EROFS';
39
- throw error;
40
- }
41
- return actualFs.mkdtempSync(prefix, ...args);
42
- }),
42
+ homedir: () => operatorHome,
43
+ tmpdir: () => systemTemp,
43
44
  }));
44
45
  const setup = require('../../jest.global-setup.js');
45
46
  await expect(setup()).resolves.toBeUndefined();
46
- expect(process.env.AWM_JEST_TMPDIR?.startsWith(path_1.default.join(fallback, 'awm-cache', 'awm-jest-'))).toBe(true);
47
+ const suiteRoot = process.env.AWM_JEST_TMPDIR;
48
+ expect(suiteRoot.startsWith(path_1.default.join(fs_1.default.realpathSync(systemTemp), 'awm-jest-'))).toBe(true);
49
+ expect(isWithin(operatorHome, suiteRoot)).toBe(false);
50
+ expect(process.env.HOME).toBe(path_1.default.join(suiteRoot, 'home'));
51
+ expect(process.env.AWM_HOME).toBe(path_1.default.join(suiteRoot, 'awm-home'));
47
52
  }
48
53
  finally {
49
54
  jest.dontMock('fs');
@@ -52,7 +57,7 @@ describe('Jest environment isolation', () => {
52
57
  for (const key of Object.keys(process.env))
53
58
  delete process.env[key];
54
59
  Object.assign(process.env, originalEnv);
55
- fs_1.default.rmSync(fallback, { recursive: true, force: true });
60
+ fs_1.default.rmSync(systemTemp, { recursive: true, force: true });
56
61
  }
57
62
  });
58
63
  });
@@ -9,6 +9,22 @@ const path_1 = __importDefault(require("path"));
9
9
  const CLI_ROOT = path_1.default.resolve(__dirname, '..', '..');
10
10
  const REPO_ROOT = path_1.default.resolve(CLI_ROOT, '..');
11
11
  describe('native release artifacts', () => {
12
+ it('checks Windows admission before full suites and stops a failed suite without weakening publication', () => {
13
+ for (const name of ['ci.yml', 'release.yml']) {
14
+ const workflow = fs_1.default.readFileSync(path_1.default.join(REPO_ROOT, '.github', 'workflows', name), 'utf8');
15
+ expect(workflow).toContain('- name: Windows admission smoke');
16
+ expect(workflow).toContain("if: runner.os == 'Windows'");
17
+ expect(workflow).toContain('run: npx jest tests/commands/plan/index.test.ts --runInBand --bail');
18
+ expect(workflow).toContain('run: npx jest --runInBand --bail');
19
+ expect(workflow.indexOf('- name: Windows admission smoke')).toBeLessThan(workflow.indexOf('run: npx jest --runInBand --bail'));
20
+ }
21
+ const release = fs_1.default.readFileSync(path_1.default.join(REPO_ROOT, '.github', 'workflows', 'release.yml'), 'utf8');
22
+ expect(release).toMatch(/release:\s*\n\s*needs: test/);
23
+ for (const target of ['linux-x64', 'linux-arm64', 'darwin-x64', 'darwin-arm64', 'win32-x64', 'win32-arm64']) {
24
+ expect(release).toContain(`target: ${target}`);
25
+ }
26
+ expect(release).toContain('cancel-in-progress: false');
27
+ });
12
28
  it('keeps native prebuilds generated instead of versioned source', () => {
13
29
  const gitignore = fs_1.default.readFileSync(path_1.default.join(REPO_ROOT, '.gitignore'), 'utf8');
14
30
  const tracked = (0, child_process_1.execFileSync)('git', ['ls-files', '--', 'cli/prebuilds'], {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentic-workflow-manager",
3
- "version": "9.7.1",
3
+ "version": "9.8.0",
4
4
  "main": "dist/src/index.js",
5
5
  "bin": {
6
6
  "awm": "./dist/src/index.js"
@@ -47,7 +47,7 @@
47
47
  },
48
48
  "description": "CLI to manage Agentic Workflows - install skills, workflows, and processes for AI agents",
49
49
  "dependencies": {
50
- "@clack/prompts": "^1.0.1",
50
+ "@clack/prompts": "^0.11.0",
51
51
  "commander": "^14.0.3",
52
52
  "picocolors": "^1.1.1",
53
53
  "semver": "^7.7.4",
Binary file
Binary file