@meza/adr-tools 2.0.3 → 2.0.4

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 (122) hide show
  1. package/dist/types/version.d.ts +1 -1
  2. package/dist/version.js +1 -1
  3. package/package.json +19 -9
  4. package/.adr-dir +0 -1
  5. package/.editorconfig +0 -13
  6. package/.gitattributes +0 -40
  7. package/.github/renovate.json +0 -4
  8. package/.github/stale.yml +0 -18
  9. package/.github/workflows/ci-pr.yml +0 -48
  10. package/.github/workflows/ci.yml +0 -67
  11. package/.github/workflows/security.yml +0 -49
  12. package/.releaserc.json +0 -55
  13. package/.yarnrc.yml +0 -8
  14. package/AGENTS.engineer.md +0 -236
  15. package/AGENTS.md +0 -11
  16. package/AGENTS.reviewer.md +0 -115
  17. package/CHANGELOG.md +0 -7
  18. package/CONTRIBUTING.md +0 -102
  19. package/biome.json +0 -28
  20. package/dist/index.test.js +0 -219
  21. package/dist/index.test.js.map +0 -1
  22. package/dist/inject-version.test.js +0 -27
  23. package/dist/inject-version.test.js.map +0 -1
  24. package/dist/lib/adr.test.js +0 -319
  25. package/dist/lib/adr.test.js.map +0 -1
  26. package/dist/lib/config.test.js +0 -60
  27. package/dist/lib/config.test.js.map +0 -1
  28. package/dist/lib/links.test.js +0 -66
  29. package/dist/lib/links.test.js.map +0 -1
  30. package/dist/lib/manipulator-errors.test.js +0 -21
  31. package/dist/lib/manipulator-errors.test.js.map +0 -1
  32. package/dist/lib/manipulator.test.js +0 -96
  33. package/dist/lib/manipulator.test.js.map +0 -1
  34. package/dist/lib/numbering.test.js +0 -39
  35. package/dist/lib/numbering.test.js.map +0 -1
  36. package/dist/lib/opening.test.js +0 -81
  37. package/dist/lib/opening.test.js.map +0 -1
  38. package/dist/lib/prompt.test.js +0 -33
  39. package/dist/lib/prompt.test.js.map +0 -1
  40. package/dist/lib/template.test.js +0 -62
  41. package/dist/lib/template.test.js.map +0 -1
  42. package/dist/types/index.test.d.ts +0 -2
  43. package/dist/types/index.test.d.ts.map +0 -1
  44. package/dist/types/inject-version.test.d.ts +0 -2
  45. package/dist/types/inject-version.test.d.ts.map +0 -1
  46. package/dist/types/lib/adr.test.d.ts +0 -2
  47. package/dist/types/lib/adr.test.d.ts.map +0 -1
  48. package/dist/types/lib/config.test.d.ts +0 -2
  49. package/dist/types/lib/config.test.d.ts.map +0 -1
  50. package/dist/types/lib/links.test.d.ts +0 -2
  51. package/dist/types/lib/links.test.d.ts.map +0 -1
  52. package/dist/types/lib/manipulator-errors.test.d.ts +0 -2
  53. package/dist/types/lib/manipulator-errors.test.d.ts.map +0 -1
  54. package/dist/types/lib/manipulator.test.d.ts +0 -2
  55. package/dist/types/lib/manipulator.test.d.ts.map +0 -1
  56. package/dist/types/lib/numbering.test.d.ts +0 -2
  57. package/dist/types/lib/numbering.test.d.ts.map +0 -1
  58. package/dist/types/lib/opening.test.d.ts +0 -2
  59. package/dist/types/lib/opening.test.d.ts.map +0 -1
  60. package/dist/types/lib/prompt.test.d.ts +0 -2
  61. package/dist/types/lib/prompt.test.d.ts.map +0 -1
  62. package/dist/types/lib/template.test.d.ts +0 -2
  63. package/dist/types/lib/template.test.d.ts.map +0 -1
  64. package/doc/adr/.adr-sequence.lock +0 -1
  65. package/doc/adr/0001-record-architecture-decisions.md +0 -21
  66. package/doc/adr/0002-using-heavy-e2e-tests.md +0 -20
  67. package/doc/adr/0003-esm.md +0 -34
  68. package/doc/adr/0004-gate-editor-opening-behind---open-and---open-with.md +0 -55
  69. package/doc/adr/decisions.md +0 -6
  70. package/lefthook.yml +0 -14
  71. package/scripts/inject-version.mjs +0 -34
  72. package/src/index.test.ts +0 -247
  73. package/src/index.ts +0 -267
  74. package/src/inject-version.test.ts +0 -31
  75. package/src/lib/adr.test.ts +0 -389
  76. package/src/lib/adr.ts +0 -384
  77. package/src/lib/config.test.ts +0 -69
  78. package/src/lib/config.ts +0 -36
  79. package/src/lib/links.test.ts +0 -74
  80. package/src/lib/links.ts +0 -34
  81. package/src/lib/manipulator-errors.test.ts +0 -22
  82. package/src/lib/manipulator.test.ts +0 -109
  83. package/src/lib/manipulator.ts +0 -98
  84. package/src/lib/numbering.test.ts +0 -45
  85. package/src/lib/numbering.ts +0 -25
  86. package/src/lib/opening.test.ts +0 -96
  87. package/src/lib/prompt.test.ts +0 -42
  88. package/src/lib/prompt.ts +0 -14
  89. package/src/lib/template.test.ts +0 -74
  90. package/src/lib/template.ts +0 -22
  91. package/src/templates/init.md +0 -21
  92. package/src/templates/template.md +0 -19
  93. package/src/types/environment.d.ts +0 -14
  94. package/src/version.ts +0 -1
  95. package/tests/.adr-dir +0 -1
  96. package/tests/__snapshots__/generate-graph.e2e.test.ts.snap +0 -39
  97. package/tests/__snapshots__/init-adr-repository.e2e.test.ts.snap +0 -51
  98. package/tests/__snapshots__/linking-records.e2e.test.ts.snap +0 -155
  99. package/tests/__snapshots__/new-adr.e2e.test.ts.snap +0 -54
  100. package/tests/__snapshots__/superseding-records.e2e.test.ts.snap +0 -122
  101. package/tests/__snapshots__/toc-prefixing.e2e.test.ts.snap +0 -9
  102. package/tests/__snapshots__/use-template-override.e2e.test.ts.snap +0 -17
  103. package/tests/edit-on-create.e2e.test.ts +0 -90
  104. package/tests/fake-editor +0 -5
  105. package/tests/fake-editor.cmd +0 -4
  106. package/tests/fake-visual +0 -5
  107. package/tests/fake-visual.cmd +0 -4
  108. package/tests/funny-characters.e2e.test.ts +0 -51
  109. package/tests/generate-graph.e2e.test.ts +0 -49
  110. package/tests/helpers/adr-cli.ts +0 -24
  111. package/tests/init-adr-repository.e2e.test.ts +0 -58
  112. package/tests/linking-records.e2e.test.ts +0 -72
  113. package/tests/list-adrs.e2e.test.ts +0 -60
  114. package/tests/new-adr.e2e.test.ts +0 -62
  115. package/tests/open-with.e2e.test.ts +0 -53
  116. package/tests/superseding-records.e2e.test.ts +0 -64
  117. package/tests/toc-prefixing.e2e.test.ts +0 -43
  118. package/tests/use-template-override.e2e.test.ts +0 -52
  119. package/tests/work-form-other-directories.e2e.test.ts +0 -48
  120. package/tsconfig.json +0 -55
  121. package/vitest.config.e2e.ts +0 -18
  122. package/vitest.config.ts +0 -30
@@ -1,39 +0,0 @@
1
- import fs from 'fs/promises';
2
- import { afterAll, describe, expect, it, vi } from 'vitest';
3
- import { newNumber } from './numbering.js';
4
- vi.mock('fs/promises');
5
- vi.mock('./config.js', () => ({
6
- getDir: vi.fn().mockResolvedValue('/')
7
- }));
8
- describe('The numbering logic', () => {
9
- afterAll(() => {
10
- vi.resetAllMocks();
11
- });
12
- it('can read from the sequence file', async () => {
13
- const random = Math.floor(Math.random() * 100);
14
- vi.mocked(fs.readFile).mockResolvedValueOnce(random.toString());
15
- const num = await newNumber();
16
- expect(num).toEqual(random + 1);
17
- });
18
- it('returns 1 if there are no files', async () => {
19
- vi.mocked(fs.readFile).mockRejectedValueOnce('no sequence file');
20
- vi.mocked(fs.readdir).mockResolvedValueOnce([]);
21
- const num = await newNumber();
22
- expect(num).toEqual(1);
23
- });
24
- it('processes existing files if there is no lockfile', async () => {
25
- const fakeFiles = ['0001-first-file.md', '0002-first-file.md'];
26
- vi.mocked(fs.readFile).mockRejectedValueOnce('no sequence file');
27
- vi.mocked(fs.readdir).mockResolvedValueOnce(fakeFiles);
28
- const num = await newNumber();
29
- expect(num).toEqual(3);
30
- });
31
- it('ignores non-adr filenames when deriving numbers', async () => {
32
- const fakeFiles = ['notes.txt', '0005-fifth.md'];
33
- vi.mocked(fs.readFile).mockRejectedValueOnce('no sequence file');
34
- vi.mocked(fs.readdir).mockResolvedValueOnce(fakeFiles);
35
- const num = await newNumber();
36
- expect(num).toEqual(6);
37
- });
38
- });
39
- //# sourceMappingURL=numbering.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"numbering.test.js","sourceRoot":"src/","sources":["lib/numbering.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAI3C,EAAE,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACvB,EAAE,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC;IAC5B,MAAM,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC;CACvC,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,QAAQ,CAAC,GAAG,EAAE;QACZ,EAAE,CAAC,aAAa,EAAE,CAAC;IACrB,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAChE,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC/C,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;QACjE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,qBAAqB,CAAC,EAAE,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,SAAS,GAAa,CAAC,oBAAoB,EAAE,oBAAoB,CAAC,CAAC;QACzE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;QACjE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAiC,CAAC,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACjF,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,MAAM,SAAS,GAAa,CAAC,WAAW,EAAE,eAAe,CAAC,CAAC;QAC3D,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,qBAAqB,CAAC,kBAAkB,CAAC,CAAC;QACjE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,OAAiC,CAAC,CAAC,qBAAqB,CAAC,SAAS,CAAC,CAAC;QACjF,MAAM,GAAG,GAAG,MAAM,SAAS,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,81 +0,0 @@
1
- import { afterEach, describe, expect, it, vi } from 'vitest';
2
- import { chooseOpenPlan } from './adr.js';
3
- describe('chooseOpenPlan', () => {
4
- afterEach(() => {
5
- vi.unstubAllEnvs();
6
- });
7
- it('returns none when open is false', () => {
8
- expect(chooseOpenPlan({ open: false })).toEqual({ type: 'none' });
9
- });
10
- it('treats open-with as enabling open', () => {
11
- expect(chooseOpenPlan({ openWith: 'code --wait' })).toEqual({
12
- type: 'app',
13
- name: 'code',
14
- args: ['--wait']
15
- });
16
- });
17
- it('parses quoted arguments', () => {
18
- expect(chooseOpenPlan({ openWith: 'code "arg with space"' })).toEqual({
19
- type: 'app',
20
- name: 'code',
21
- args: ['arg with space']
22
- });
23
- });
24
- it('unescapes quoted arguments', () => {
25
- expect(chooseOpenPlan({ openWith: 'code "arg \\"quoted\\""' })).toEqual({
26
- type: 'app',
27
- name: 'code',
28
- args: ['arg "quoted"']
29
- });
30
- });
31
- it('parses single-quoted arguments', () => {
32
- expect(chooseOpenPlan({ openWith: "code 'arg with space'" })).toEqual({
33
- type: 'app',
34
- name: 'code',
35
- args: ['arg with space']
36
- });
37
- });
38
- it('returns none when open-with is not parseable', () => {
39
- expect(chooseOpenPlan({ openWith: '"' })).toEqual({ type: 'none' });
40
- });
41
- it('returns none when open-with is whitespace', () => {
42
- expect(chooseOpenPlan({ openWith: ' ' })).toEqual({ type: 'none' });
43
- });
44
- it('returns none when open-with is only quoted whitespace', () => {
45
- expect(chooseOpenPlan({ openWith: '" "' })).toEqual({ type: 'none' });
46
- });
47
- it('handles quoted empty command', () => {
48
- expect(chooseOpenPlan({ openWith: '""', open: true })).toEqual({ type: 'default' });
49
- });
50
- it('ignores boolean-like editor values', () => {
51
- vi.stubEnv('VISUAL', 'true');
52
- vi.stubEnv('EDITOR', 'false');
53
- expect(chooseOpenPlan({ open: true })).toEqual({ type: 'default' });
54
- });
55
- it('prefers VISUAL over EDITOR when both are set', () => {
56
- vi.stubEnv('VISUAL', 'code');
57
- vi.stubEnv('EDITOR', 'vim');
58
- expect(chooseOpenPlan({ open: true })).toEqual({ type: 'app', name: 'code', args: [] });
59
- });
60
- it('uses EDITOR when it is not npm injected', () => {
61
- vi.stubEnv('EDITOR', 'vim');
62
- vi.stubEnv('npm_execpath', '');
63
- vi.stubEnv('npm_config_editor', '');
64
- expect(chooseOpenPlan({ open: true })).toEqual({ type: 'app', name: 'vim', args: [] });
65
- });
66
- it('falls back to default when EDITOR is npm injected', () => {
67
- vi.stubEnv('npm_execpath', '/usr/bin/npm');
68
- vi.stubEnv('npm_config_editor', 'vi');
69
- vi.stubEnv('EDITOR', 'vi');
70
- vi.stubEnv('VISUAL', '');
71
- expect(chooseOpenPlan({ open: true })).toEqual({ type: 'default' });
72
- });
73
- it('uses EDITOR when npm_config_editor is different', () => {
74
- vi.stubEnv('npm_execpath', '/usr/bin/npm');
75
- vi.stubEnv('npm_config_editor', 'code');
76
- vi.stubEnv('EDITOR', 'vim');
77
- vi.stubEnv('VISUAL', '');
78
- expect(chooseOpenPlan({ open: true })).toEqual({ type: 'app', name: 'vim', args: [] });
79
- });
80
- });
81
- //# sourceMappingURL=opening.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"opening.test.js","sourceRoot":"src/","sources":["lib/opening.test.ts"],"names":[],"mappings":"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"}
@@ -1,33 +0,0 @@
1
- import { faker } from '@faker-js/faker';
2
- import inquirer from 'inquirer';
3
- import { describe, expect, it, vi } from 'vitest';
4
- import { askForClarification } from './prompt.js';
5
- vi.mock('inquirer');
6
- vi.mock('chalk', () => ({
7
- default: {
8
- blue: (str) => {
9
- return `BLUE[${str}]`;
10
- }
11
- }
12
- }));
13
- describe('The prompt helper', () => {
14
- it('calls inquirer correctly', async () => {
15
- const prompt = vi.mocked(inquirer.prompt);
16
- prompt.mockResolvedValueOnce({ target: 'does not matter' });
17
- const randomChoices = [faker.system.filePath(), faker.system.filePath(), faker.system.filePath()];
18
- await askForClarification('this is the search string', randomChoices);
19
- expect(prompt).toHaveBeenCalledOnce();
20
- const calledWith = prompt.mock.calls[0][0];
21
- expect(calledWith[0].type).toEqual('select');
22
- expect(calledWith[0].choices).toEqual(randomChoices);
23
- expect(calledWith[0].message).toMatchInlineSnapshot('"Which file do you want to link to for BLUE[this is the search string]?"');
24
- });
25
- it('returns the selected choice', async () => {
26
- const prompt = vi.mocked(inquirer.prompt);
27
- const randomResult = faker.system.filePath();
28
- prompt.mockResolvedValueOnce({ target: randomResult });
29
- const result = await askForClarification('this is the search string', ['does not matter']);
30
- expect(result).toEqual(randomResult);
31
- });
32
- });
33
- //# sourceMappingURL=prompt.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt.test.js","sourceRoot":"src/","sources":["lib/prompt.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACxC,OAAO,QAAsB,MAAM,UAAU,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAElD,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;AACpB,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;IACtB,OAAO,EAAE;QACP,IAAI,EAAE,CAAC,GAAW,EAAE,EAAE;YACpB,OAAO,QAAQ,GAAG,GAAG,CAAC;QACxB,CAAC;KACF;CACF,CAAC,CAAC,CAAC;AACJ,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;QACxC,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAE5D,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAClG,MAAM,mBAAmB,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAC;QAEtE,MAAM,CAAC,MAAM,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAe,CAAC;QACzD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC7C,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACrD,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,qBAAqB,CACjD,0EAA0E,CAC3E,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE1C,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;QAE7C,MAAM,CAAC,qBAAqB,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC;QAEvD,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,2BAA2B,EAAE,CAAC,iBAAiB,CAAC,CAAC,CAAC;QAE3F,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,62 +0,0 @@
1
- import fs from 'fs/promises';
2
- import path from 'path';
3
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
4
- vi.mock('fs/promises', () => ({
5
- default: {
6
- readFile: vi.fn()
7
- }
8
- }));
9
- vi.mock('./config.js', () => ({
10
- getDir: vi.fn()
11
- }));
12
- const mockEnv = (key, value) => {
13
- if (value === undefined) {
14
- delete process.env[key];
15
- return;
16
- }
17
- process.env[key] = value;
18
- };
19
- describe('template', () => {
20
- beforeEach(() => {
21
- vi.resetModules();
22
- vi.mocked(fs.readFile).mockReset();
23
- mockEnv('ADR_TEMPLATE', undefined);
24
- });
25
- afterEach(() => {
26
- mockEnv('ADR_TEMPLATE', undefined);
27
- vi.restoreAllMocks();
28
- });
29
- it('uses the explicit template file when provided', async () => {
30
- const { template } = await import('./template.js');
31
- vi.mocked(fs.readFile).mockResolvedValueOnce('custom');
32
- const result = await template('/tmp/custom.md');
33
- expect(result).toEqual('custom');
34
- expect(fs.readFile).toHaveBeenCalledWith(path.resolve('/tmp/custom.md'), 'utf8');
35
- });
36
- it('uses ADR_TEMPLATE when set', async () => {
37
- const { template } = await import('./template.js');
38
- mockEnv('ADR_TEMPLATE', '/tmp/env.md');
39
- vi.mocked(fs.readFile).mockResolvedValueOnce('env');
40
- const result = await template();
41
- expect(result).toEqual('env');
42
- expect(fs.readFile).toHaveBeenCalledWith(path.resolve('/tmp/env.md'), 'utf8');
43
- });
44
- it('uses template from adr directory when available', async () => {
45
- const { template } = await import('./template.js');
46
- const { getDir } = await import('./config.js');
47
- vi.mocked(getDir).mockResolvedValueOnce('/repo/doc/adr');
48
- vi.mocked(fs.readFile).mockResolvedValueOnce('repo-template');
49
- const result = await template();
50
- expect(result).toEqual('repo-template');
51
- expect(fs.readFile).toHaveBeenCalledWith(path.join('/repo/doc/adr', 'templates/template.md'), 'utf8');
52
- });
53
- it('falls back to built-in template when repo template is missing', async () => {
54
- const { template } = await import('./template.js');
55
- const { getDir } = await import('./config.js');
56
- vi.mocked(getDir).mockResolvedValueOnce('/repo/doc/adr');
57
- vi.mocked(fs.readFile).mockRejectedValueOnce(new Error('missing')).mockResolvedValueOnce('built-in');
58
- const result = await template();
59
- expect(result).toEqual('built-in');
60
- });
61
- });
62
- //# sourceMappingURL=template.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template.test.js","sourceRoot":"src/","sources":["lib/template.test.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.test.d.ts","sourceRoot":"src/","sources":["index.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=inject-version.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inject-version.test.d.ts","sourceRoot":"src/","sources":["inject-version.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=adr.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"adr.test.d.ts","sourceRoot":"src/","sources":["lib/adr.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=config.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"config.test.d.ts","sourceRoot":"src/","sources":["lib/config.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=links.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"links.test.d.ts","sourceRoot":"src/","sources":["lib/links.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=manipulator-errors.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manipulator-errors.test.d.ts","sourceRoot":"src/","sources":["lib/manipulator-errors.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=manipulator.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"manipulator.test.d.ts","sourceRoot":"src/","sources":["lib/manipulator.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=numbering.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"numbering.test.d.ts","sourceRoot":"src/","sources":["lib/numbering.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=opening.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"opening.test.d.ts","sourceRoot":"src/","sources":["lib/opening.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=prompt.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"prompt.test.d.ts","sourceRoot":"src/","sources":["lib/prompt.test.ts"],"names":[],"mappings":""}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=template.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"template.test.d.ts","sourceRoot":"src/","sources":["lib/template.test.ts"],"names":[],"mappings":""}
@@ -1 +0,0 @@
1
- 4
@@ -1,21 +0,0 @@
1
- # 1. Record architecture decisions
2
-
3
- Date: 2022-06-22
4
-
5
- ## Status
6
-
7
- Accepted
8
-
9
- ## Context
10
-
11
- We need to record the architectural decisions made on this project.
12
-
13
- ## Decision
14
-
15
- We will use Architecture Decision Records, as [described by Michael Nygard](http://thinkrelevance.com/blog/2011/11/15/documenting-architecture-decisions).
16
-
17
- ## Consequences
18
-
19
- See Michael Nygard's article, linked above.
20
- For a lightweight ADR toolset, see Nat Pryce's [adr-tools](https://github.com/npryce/adr-tools).
21
- > For a node version of the same tooling, see Meza's [adr-tools](https://github.com/meza/adr-tools).
@@ -1,20 +0,0 @@
1
- # 2. Using Heavy E2E Tests
2
-
3
- Date: 2022-06-22
4
-
5
- ## Status
6
-
7
- Accepted
8
-
9
- ## Context
10
-
11
- The original tool has an [exhaustive test suite](https://github.com/npryce/adr-tools/tree/master/tests) that allows us to make sure that we're backwards compatible.
12
-
13
- ## Decision
14
-
15
- We'll be re-implementing those tests for ourselves too. This means that we will be using the original examples,
16
- expectations and the ethos of invoking the tool with the given examples.
17
-
18
- ## Consequences
19
-
20
- The E2E test suite will be very slow to run and it can only be executed sequentially.
@@ -1,34 +0,0 @@
1
- # 3. ESM
2
-
3
- Date: 2022-06-29
4
-
5
- ## Status
6
-
7
- Accepted
8
-
9
- ## Context
10
-
11
- With typescript 4.7 come proper ESM modules.
12
-
13
- ECMAScript modules are the official standard format to package JavaScript code for reuse. Modules are defined using a variety of import and export statements.
14
-
15
- ## Decision
16
-
17
- Since this is a new project, there's no reason to _not_ go with the flow.
18
-
19
- ## Consequences
20
-
21
- There's some changes to the way the project is set up.
22
- Everything is described here, in [Typescript's official documentation](https://devblogs.microsoft.com/typescript/announcing-typescript-4-7-beta/#ecmascript-module-support-in-node-js)
23
-
24
- However, some highlights:
25
-
26
- We **must** import code with extensions and `.js` at that (even though the file's actual type is .ts)
27
-
28
- `__dirname` and `__filename` are no longer available. Use this instead:
29
- ```typescript
30
- import path from 'node:path';
31
- import { fileURLToPath } from 'node:url';
32
-
33
- const __filename = fileURLToPath(import.meta.url);
34
- const __dirname = path.dirname(__filename);```
@@ -1,55 +0,0 @@
1
- # 4. Gate editor opening behind --open and --open-with
2
-
3
- Date: 2026-01-04
4
-
5
- ## Status
6
-
7
- Accepted
8
-
9
- ## Context
10
-
11
- This tool historically tries to open a newly created ADR in the user's editor by reading the `VISUAL` and `EDITOR`
12
- environment variables.
13
-
14
- In 2025, a common way to run Node CLIs is via `npx`/`npm exec`. npm injects an `EDITOR` value into child processes
15
- based on npm config (`npm_config_editor`), even when the user did not intend to configure an editor for this tool.
16
-
17
- This creates two classes of problems:
18
-
19
- 1. Unwanted side effects. Creating an ADR can unexpectedly launch an editor or attempt to launch a placeholder value.
20
- 2. Cross-platform friction. Windows shells, quoting rules, and editor invocation are inconsistent, making the default
21
- "auto open" behavior more fragile than the rest of the CLI.
22
-
23
- We still want a good "create and open" workflow, but it must be explicit and predictable, and it must work well on
24
- Windows, macOS, and Linux.
25
-
26
- ## Decision
27
-
28
- We will stop automatically opening an editor after `adr new` by default.
29
-
30
- We will add two flags to the CLI:
31
-
32
- - `--open`: Open the newly created ADR file after creation.
33
- - `--open-with <command>`: Open the newly created ADR file using the provided command (optionally including args).
34
-
35
- When `--open` is supplied, the tool will select an opener in this order:
36
-
37
- 1. `--open-with <command>` if provided.
38
- 2. `VISUAL` if it is set by the user and not empty.
39
- 3. `EDITOR` if it is set by the user and not empty.
40
- 4. OS default application for the file type.
41
-
42
- To handle cross-platform differences, we will use a dedicated dependency (`open`) to perform the actual launching
43
- when possible, rather than building platform-specific process spawning logic in this project.
44
-
45
- ## Consequences
46
-
47
- This makes ADR creation deterministic and side-effect free by default, including when invoked via `npx` or within CI.
48
-
49
- Users who want the "open after create" workflow can still have it, but must opt in via `--open` or explicitly specify
50
- an opener via `--open-with`.
51
-
52
- This reduces platform-specific bugs and maintenance burden by relying on a well-maintained cross-platform opener.
53
-
54
- This is a breaking behavior change for users who relied on implicit editor opening when `VISUAL`/`EDITOR` were set,
55
- but the new behavior is more predictable and better aligned with modern Node execution environments.
@@ -1,6 +0,0 @@
1
- # Table of Contents
2
-
3
- - [1. Record architecture decisions](0001-record-architecture-decisions.md)
4
- - [2. Using Heavy E2E Tests](0002-using-heavy-e2e-tests.md)
5
- - [3. ESM](0003-esm.md)
6
- - [4. Gate editor opening behind --open and --open-with](0004-gate-editor-opening-behind---open-and---open-with.md)
package/lefthook.yml DELETED
@@ -1,14 +0,0 @@
1
- pre-commit:
2
- jobs:
3
- - name: lint
4
- run: yarn lint
5
-
6
- pre-push:
7
- jobs:
8
- - name: ci
9
- run: yarn ci
10
-
11
- commit-msg:
12
- jobs:
13
- - name: commitlint
14
- run: yarn -s commitlint --edit {1}
@@ -1,34 +0,0 @@
1
- import { readFileSync, writeFileSync } from 'node:fs';
2
- import { resolve } from 'node:path';
3
- import { pathToFileURL } from 'node:url';
4
-
5
- export const buildVersionSource = (version) => `export const LIB_VERSION = '${version}';\n`;
6
-
7
- export const resolveTargetPath = (argv) => {
8
- const target = argv[2];
9
- if (!target) {
10
- throw new Error('Usage: node scripts/inject-version.mjs <output-file>');
11
- }
12
- return target;
13
- };
14
-
15
- export const writeVersionFile = (target, version) => {
16
- writeFileSync(resolve(process.cwd(), target), buildVersionSource(version), 'utf8');
17
- };
18
-
19
- const readPackageVersion = () =>
20
- JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version;
21
-
22
- const run = () => {
23
- try {
24
- const target = resolveTargetPath(process.argv);
25
- writeVersionFile(target, readPackageVersion());
26
- } catch (error) {
27
- console.error(error.message);
28
- process.exit(1);
29
- }
30
- };
31
-
32
- if (pathToFileURL(process.argv[1]).href === import.meta.url) {
33
- run();
34
- }