@ankhorage/renovate 0.1.1

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 (41) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +21 -0
  3. package/README.md +54 -0
  4. package/default.json +53 -0
  5. package/devtools-owner.json +25 -0
  6. package/dist/changeset-workflow.test.d.ts +2 -0
  7. package/dist/changeset-workflow.test.d.ts.map +1 -0
  8. package/dist/changeset-workflow.test.js +135 -0
  9. package/dist/changeset-workflow.test.js.map +1 -0
  10. package/dist/default.test.d.ts +2 -0
  11. package/dist/default.test.d.ts.map +1 -0
  12. package/dist/default.test.js +139 -0
  13. package/dist/default.test.js.map +1 -0
  14. package/dist/index.d.ts +8 -0
  15. package/dist/index.d.ts.map +1 -0
  16. package/dist/index.js +8 -0
  17. package/dist/index.js.map +1 -0
  18. package/dist/index.test.d.ts +2 -0
  19. package/dist/index.test.d.ts.map +1 -0
  20. package/dist/index.test.js +6 -0
  21. package/dist/index.test.js.map +1 -0
  22. package/examples/devtools-renovate.json5 +14 -0
  23. package/examples/renovate.json5 +17 -0
  24. package/package.json +72 -0
  25. package/paradox/badges/build.svg +7 -0
  26. package/paradox/badges/docs.svg +7 -0
  27. package/paradox/badges/eslint.svg +7 -0
  28. package/paradox/badges/license.svg +7 -0
  29. package/paradox/badges/npm.svg +7 -0
  30. package/paradox/badges/prettier.svg +7 -0
  31. package/paradox/badges/runtime.svg +7 -0
  32. package/paradox/badges/tests.svg +7 -0
  33. package/paradox/badges/typescript.svg +7 -0
  34. package/paradox/components.md +1 -0
  35. package/paradox/diagrams/architecture-overview.mmd +12 -0
  36. package/paradox/diagrams/export-graph.mmd +5 -0
  37. package/paradox/diagrams/module-relationships.mmd +6 -0
  38. package/paradox/exports.json +1 -0
  39. package/paradox/exports.md +1 -0
  40. package/paradox/index.html +348 -0
  41. package/paradox/paradox.json +283 -0
package/CHANGELOG.md ADDED
@@ -0,0 +1,26 @@
1
+ # @ankhorage/renovate
2
+
3
+ ## 0.1.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 8f1fd6a: Restrict automated dependency updates to packages in the `@ankhorage` scope.
8
+ - c9ee948: Publish separate Renovate policies for normal consumers and the Devtools owner repository, and
9
+ automatically synchronize consumer Renovate branches with their exact selected Ankh and Devtools
10
+ releases through the least-privileged reusable workflow, using the workflow's exact canonical Ankh
11
+ CLI pin when a Devtools-only consumer does not declare the CLI itself.
12
+
13
+ ## 0.1.0
14
+
15
+ ### Minor Changes
16
+
17
+ - b7305e8: Add safe automatic Changeset creation and green-CI automerge for Ankhorage dependency updates.
18
+ - f4526fd: Establish the standalone Renovate policy package and canonical Ankhorage preset.
19
+
20
+ ### Patch Changes
21
+
22
+ - 38e46ee: Bump Ankhorage dependency ranges so every package release can propagate to downstream repositories.
23
+
24
+ ## 0.0.0
25
+
26
+ Initial package foundation.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Ankhorage
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,54 @@
1
+ <!-- markdownlint-disable MD013 MD033 -->
2
+ <!-- This file is generated by Paradox. Do not edit manually. -->
3
+
4
+ # @ankhorage/renovate
5
+
6
+ ![license: MIT](./paradox/badges/license.svg) ![npm: v0.1.1](./paradox/badges/npm.svg) ![runtime: bun](./paradox/badges/runtime.svg) ![typescript: strict](./paradox/badges/typescript.svg) ![eslint: checked](./paradox/badges/eslint.svg) ![prettier: checked](./paradox/badges/prettier.svg) ![build: checked](./paradox/badges/build.svg) ![tests: checked](./paradox/badges/tests.svg) ![docs: paradox](./paradox/badges/docs.svg)
7
+
8
+ Ankhorage dependency update policy and automation powered by Renovate.
9
+
10
+ ## Usage
11
+
12
+ Extend the repository-hosted preset from each Ankhorage repository that Renovate manages.
13
+
14
+ ### Devtools owner repository configuration
15
+
16
+ Loads the owner-specific policy that enables and groups the root Bun, ESLint, Knip, Prettier,
17
+ TypeScript, and validation/publishing dependencies maintained by @ankhorage/devtools. Major
18
+ upgrades remain reviewable. Do not use this profile in normal consumer repositories.
19
+
20
+ Source: `examples/devtools-renovate.json5`
21
+
22
+ ```
23
+ {
24
+ $schema: 'https://docs.renovatebot.com/renovate-schema.json',
25
+ extends: ['github>ankhorage/renovate:devtools-owner'],
26
+ }
27
+ ```
28
+
29
+ ### Repository configuration
30
+
31
+ Loads the normal consumer policy from its default branch. The policy keeps Devtools-owned
32
+ packages and canonical workflows out of independent Renovate updates, and groups compatible
33
+ @ankhorage/ankh and @ankhorage/devtools releases for the trusted automatic synchronization
34
+ workflow. The workflow runs the exact lock-selected Devtools provider with either the consumer's
35
+ lock-selected Ankh CLI or its own exact canonical CLI pin, requires byte stability, and commits
36
+ the complete managed result without a manual repository sync.
37
+
38
+ Source: `examples/renovate.json5`
39
+
40
+ ```
41
+ {
42
+ $schema: 'https://docs.renovatebot.com/renovate-schema.json',
43
+ extends: ['github>ankhorage/renovate'],
44
+ }
45
+ ```
46
+
47
+ ## Generated documentation
48
+
49
+ - [Interactive documentation app](./paradox/index.html)
50
+ - [Public API reference](./paradox/exports.md)
51
+ - [Component registry](./paradox/components.md)
52
+ - [Architecture overview](./paradox/diagrams/architecture-overview.mmd)
53
+ - [Module relationships](./paradox/diagrams/module-relationships.mmd)
54
+ - [Export graph](./paradox/diagrams/export-graph.mmd)
package/default.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "description": ["Canonical dependency update policy for Ankhorage consumer repositories."],
4
+ "extends": ["config:recommended", ":dependencyDashboard"],
5
+ "gitIgnoredAuthors": ["41898282+github-actions[bot]@users.noreply.github.com"],
6
+ "labels": ["dependencies"],
7
+ "packageRules": [
8
+ {
9
+ "description": "Disable dependency updates unless a later Ankhorage rule explicitly enables them.",
10
+ "matchPackageNames": ["*"],
11
+ "enabled": false
12
+ },
13
+ {
14
+ "description": "Group Ankhorage package updates and propagate every release downstream.",
15
+ "matchDatasources": ["npm"],
16
+ "matchPackageNames": ["@ankhorage/**"],
17
+ "enabled": true,
18
+ "groupName": "Ankhorage packages",
19
+ "rangeStrategy": "bump",
20
+ "automerge": true,
21
+ "automergeType": "pr",
22
+ "platformAutomerge": false
23
+ },
24
+ {
25
+ "description": "Update the canonical Ankh CLI and Devtools provider as one toolchain.",
26
+ "matchDatasources": ["npm"],
27
+ "matchPackageNames": ["@ankhorage/ankh", "@ankhorage/devtools"],
28
+ "enabled": true,
29
+ "groupName": "Ankhorage CLI and Devtools toolchain",
30
+ "rangeStrategy": "bump",
31
+ "automerge": true,
32
+ "automergeType": "pr",
33
+ "platformAutomerge": false
34
+ },
35
+ {
36
+ "description": "Require review for major CLI and Devtools toolchain upgrades.",
37
+ "matchDatasources": ["npm"],
38
+ "matchPackageNames": ["@ankhorage/ankh", "@ankhorage/devtools"],
39
+ "matchUpdateTypes": ["major"],
40
+ "automerge": false
41
+ },
42
+ {
43
+ "description": "Keep canonical Devtools workflows under deterministic Devtools sync ownership.",
44
+ "matchManagers": ["github-actions"],
45
+ "matchFileNames": [
46
+ ".github/workflows/ci.yml",
47
+ ".github/workflows/renovate.yml",
48
+ ".github/workflows/release.yml"
49
+ ],
50
+ "enabled": false
51
+ }
52
+ ]
53
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "https://docs.renovatebot.com/renovate-schema.json",
3
+ "description": ["Devtools-owner dependency update policy for ankhorage/devtools."],
4
+ "extends": ["./default"],
5
+ "packageRules": [
6
+ {
7
+ "description": "Group dependencies owned and validated by the Devtools repository.",
8
+ "matchManagers": ["bun"],
9
+ "matchFileNames": ["package.json"],
10
+ "enabled": true,
11
+ "groupName": "Devtools-owned toolchain",
12
+ "rangeStrategy": "bump",
13
+ "automerge": true,
14
+ "automergeType": "pr",
15
+ "platformAutomerge": false
16
+ },
17
+ {
18
+ "description": "Require review for major Devtools-owned toolchain upgrades.",
19
+ "matchManagers": ["bun"],
20
+ "matchFileNames": ["package.json"],
21
+ "matchUpdateTypes": ["major"],
22
+ "automerge": false
23
+ }
24
+ ]
25
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=changeset-workflow.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeset-workflow.test.d.ts","sourceRoot":"","sources":["../src/changeset-workflow.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,135 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { describe, expect, test } from 'bun:test';
3
+ const workflow = readFileSync(new URL('../.github/workflows/changeset.yml', import.meta.url), 'utf8');
4
+ const [prepareJob, commitJob = ''] = workflow.split('\n commit:');
5
+ const surfaceManifest = {
6
+ name: '@ankhorage/surface',
7
+ packageManager: 'bun@1.3.14',
8
+ devDependencies: {
9
+ '@ankhorage/devtools': '^1.7.0',
10
+ },
11
+ };
12
+ const surfaceLock = `
13
+ workspaces: {
14
+ "": {
15
+ devDependencies: {
16
+ "@ankhorage/devtools": "^1.7.0",
17
+ },
18
+ },
19
+ },
20
+ packages: {
21
+ "@ankhorage/devtools": ["@ankhorage/devtools@1.7.0", "", {}],
22
+ },
23
+ `;
24
+ describe('trusted Renovate integration', () => {
25
+ test('accepts only same-repository Renovate branches', () => {
26
+ expect(workflow).toContain("context.actor !== 'renovate[bot]'");
27
+ expect(workflow).toContain("pull.head.ref.startsWith('renovate/')");
28
+ expect(workflow).toContain("pull.head.repo?.full_name !== owner + '/' + repo");
29
+ expect(workflow).toContain('artifact.headSha !== pull.head.sha');
30
+ });
31
+ test('isolates untrusted branch preparation from write credentials', () => {
32
+ expect(prepareJob).toContain('contents: read');
33
+ expect(prepareJob).toContain('persist-credentials: false');
34
+ expect(prepareJob).toContain('actions/checkout@11d5960a326750d5838078e36cf38b85af677262');
35
+ expect(commitJob).toContain('contents: write');
36
+ expect(commitJob).not.toContain('actions/checkout');
37
+ expect(commitJob).not.toContain('\n run: |');
38
+ });
39
+ test('uses the exact lock-selected provider without package scripts', () => {
40
+ expect(workflow).toContain("resolveVersion('@ankhorage/devtools')");
41
+ expect(workflow).toContain('"@ankhorage/ankh": process.env.ANKH_VERSION');
42
+ expect(workflow).toContain('"@ankhorage/devtools": process.env.DEVTOOLS_VERSION');
43
+ expect(workflow).toContain('package.json and bun.lock must select the same exact root');
44
+ expect(workflow).toContain('--ignore-scripts --lockfile-only');
45
+ expect(workflow).toContain('--registry=https://registry.npmjs.org');
46
+ expect(workflow).not.toContain('@latest');
47
+ });
48
+ test('supports the real Surface shape with a canonical exact CLI fallback', () => {
49
+ expect(resolveFixtureVersion(surfaceManifest, surfaceLock, '@ankhorage/ankh', '0.4.0')).toBe('0.4.0');
50
+ expect(resolveFixtureVersion(surfaceManifest, surfaceLock, '@ankhorage/devtools')).toBe('1.7.0');
51
+ expect(workflow).toContain("CANONICAL_ANKH_VERSION: '0.4.0'");
52
+ expect(workflow).toContain('if (declarations.length === 0 && fallbackVersion)');
53
+ expect(workflow).toContain("resolveVersion('@ankhorage/ankh', process.env.CANONICAL_ANKH_VERSION)");
54
+ });
55
+ test('requires a byte-stable second sync and current status', () => {
56
+ const syncCommand = '"$RUNNER_TEMP/toolchain/node_modules/.bin/ankh" devtools sync .';
57
+ expect(workflow.split(syncCommand)).toHaveLength(3);
58
+ expect(workflow).toContain('test "$first_hash" = "$second_hash"');
59
+ expect(workflow).toContain('"$RUNNER_TEMP/toolchain/node_modules/.bin/ankh" devtools status .');
60
+ });
61
+ });
62
+ function resolveFixtureVersion(manifest, lock, name, fallbackVersion) {
63
+ const sections = [
64
+ manifest.dependencies,
65
+ manifest.devDependencies,
66
+ manifest.optionalDependencies,
67
+ manifest.peerDependencies,
68
+ ];
69
+ const declarations = sections
70
+ .map((section) => Object.entries(section ?? {}).find(([candidate]) => candidate === name)?.[1])
71
+ .filter((value) => typeof value === 'string');
72
+ if (declarations.length === 0 && fallbackVersion) {
73
+ if (!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(fallbackVersion)) {
74
+ throw new Error('The fixture fallback must be an exact version.');
75
+ }
76
+ return fallbackVersion;
77
+ }
78
+ const escaped = name.replace(/[.*+?^$()|[\]\\]/g, '\\$&');
79
+ const match = new RegExp('^ "' + escaped + '": \\["' + escaped + '@([^"]+)"', 'm').exec(lock);
80
+ const declaration = declarations.length === 1 ? declarations.at(0) : undefined;
81
+ const declared = typeof declaration === 'string'
82
+ ? /^[~^]?(\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?)$/.exec(declaration)
83
+ : null;
84
+ const selectedVersion = match?.at(1);
85
+ const declaredVersion = declared?.at(1);
86
+ if (typeof selectedVersion !== 'string' || declaredVersion !== selectedVersion) {
87
+ throw new Error('The fixture does not select one exact root ' + name + ' version.');
88
+ }
89
+ return selectedVersion;
90
+ }
91
+ describe('trusted Renovate write boundary', () => {
92
+ test('limits derived writes to the Devtools-managed inventory', () => {
93
+ for (const path of [
94
+ '.github/workflows/ci.yml',
95
+ '.github/workflows/release.yml',
96
+ '.github/workflows/renovate.yml',
97
+ '.prettierrc.js',
98
+ '.vscode/extensions.json',
99
+ '.vscode/settings.json',
100
+ 'bun.lock',
101
+ 'eslint.config.mjs',
102
+ 'eslint.local.config.mjs',
103
+ 'knip.config.ts',
104
+ 'package.json',
105
+ 'prettier.local.config.js',
106
+ ]) {
107
+ expect(workflow).toContain("'" + path + "'");
108
+ }
109
+ expect(workflow).not.toContain("'.github/workflows/studio-acceptance.yml'");
110
+ expect(workflow).toContain('Devtools sync changed an unexpected path:');
111
+ expect(workflow).toContain('Devtools sync created an unexpected path:');
112
+ });
113
+ test('commits through the Git API and revalidates the exact commit', () => {
114
+ expect(workflow).toContain('github.rest.git.createBlob');
115
+ expect(workflow).toContain('github.rest.git.getCommit');
116
+ expect(workflow).toContain('github.rest.git.createTree');
117
+ expect(workflow).toContain('github.rest.git.createCommit');
118
+ expect(workflow).toContain('github.rest.git.updateRef');
119
+ expect(workflow).toContain("workflow_id: 'ci.yml'");
120
+ expect(workflow).toContain('if (currentContent !== content)');
121
+ });
122
+ test('creates release metadata for Devtools-owned dependency updates', () => {
123
+ expect(workflow).toContain("const isDevtoolsOwner = owner + '/' + repo === 'ankhorage/devtools';");
124
+ expect(workflow).toContain('Update Devtools-owned dependencies:');
125
+ expect(workflow).toContain("changed.push({ name: 'bun', section: 'packageManager' })");
126
+ });
127
+ test('pins every third-party action by immutable commit', () => {
128
+ const uses = [...workflow.matchAll(/^\s*uses: ([^\s#]+)/gm)].map((match) => match[1]);
129
+ expect(uses.length).toBeGreaterThan(0);
130
+ for (const action of uses) {
131
+ expect(action).toMatch(/@[0-9a-f]{40}$/);
132
+ }
133
+ });
134
+ });
135
+ //# sourceMappingURL=changeset-workflow.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"changeset-workflow.test.js","sourceRoot":"","sources":["../src/changeset-workflow.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAElD,MAAM,QAAQ,GAAG,YAAY,CAC3B,IAAI,GAAG,CAAC,oCAAoC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAC9D,MAAM,CACP,CAAC;AACF,MAAM,CAAC,UAAU,EAAE,SAAS,GAAG,EAAE,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;AACnE,MAAM,eAAe,GAAoB;IACvC,IAAI,EAAE,oBAAoB;IAC1B,cAAc,EAAE,YAAY;IAC5B,eAAe,EAAE;QACf,qBAAqB,EAAE,QAAQ;KAChC;CACF,CAAC;AACF,MAAM,WAAW,GAAG;;;;;;;;;;;CAWnB,CAAC;AAWF,QAAQ,CAAC,8BAA8B,EAAE,GAAG,EAAE;IAC5C,IAAI,CAAC,gDAAgD,EAAE,GAAG,EAAE;QAC1D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,mCAAmC,CAAC,CAAC;QAChE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAC;QACpE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,kDAAkD,CAAC,CAAC;QAC/E,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,oCAAoC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAC;QAC/C,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QAC3D,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,2DAA2D,CAAC,CAAC;QAC1F,MAAM,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC;QAC/C,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACtD,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACzE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAC;QACpE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,6CAA6C,CAAC,CAAC;QAC1E,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,qDAAqD,CAAC,CAAC;QAClF,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,2DAA2D,CAAC,CAAC;QACxF,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC;QAC/D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,uCAAuC,CAAC,CAAC;QACpE,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC/E,MAAM,CAAC,qBAAqB,CAAC,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAC1F,OAAO,CACR,CAAC;QACF,MAAM,CAAC,qBAAqB,CAAC,eAAe,EAAE,WAAW,EAAE,qBAAqB,CAAC,CAAC,CAAC,IAAI,CACrF,OAAO,CACR,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;QAC9D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,mDAAmD,CAAC,CAAC;QAChF,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CACxB,uEAAuE,CACxE,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uDAAuD,EAAE,GAAG,EAAE;QACjE,MAAM,WAAW,GAAG,iEAAiE,CAAC;QACtF,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QAClE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,mEAAmE,CAAC,CAAC;IAClG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,qBAAqB,CAC5B,QAAyB,EACzB,IAAY,EACZ,IAAY,EACZ,eAAwB;IAExB,MAAM,QAAQ,GAAG;QACf,QAAQ,CAAC,YAAY;QACrB,QAAQ,CAAC,eAAe;QACxB,QAAQ,CAAC,oBAAoB;QAC7B,QAAQ,CAAC,gBAAgB;KAC1B,CAAC;IACF,MAAM,YAAY,GAAG,QAAQ;SAC1B,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SAC9F,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC;IACjE,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,IAAI,eAAe,EAAE,CAAC;QACjD,IAAI,CAAC,qCAAqC,CAAC,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC;YACjE,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IAC1D,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,WAAW,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjG,MAAM,WAAW,GAAG,YAAY,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAC/E,MAAM,QAAQ,GACZ,OAAO,WAAW,KAAK,QAAQ;QAC7B,CAAC,CAAC,4CAA4C,CAAC,IAAI,CAAC,WAAW,CAAC;QAChE,CAAC,CAAC,IAAI,CAAC;IACX,MAAM,eAAe,GAAG,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,eAAe,GAAG,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IACxC,IAAI,OAAO,eAAe,KAAK,QAAQ,IAAI,eAAe,KAAK,eAAe,EAAE,CAAC;QAC/E,MAAM,IAAI,KAAK,CAAC,6CAA6C,GAAG,IAAI,GAAG,WAAW,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,eAAe,CAAC;AACzB,CAAC;AAED,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,IAAI,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACnE,KAAK,MAAM,IAAI,IAAI;YACjB,0BAA0B;YAC1B,+BAA+B;YAC/B,gCAAgC;YAChC,gBAAgB;YAChB,yBAAyB;YACzB,uBAAuB;YACvB,UAAU;YACV,mBAAmB;YACnB,yBAAyB;YACzB,gBAAgB;YAChB,cAAc;YACd,0BAA0B;SAC3B,EAAE,CAAC;YACF,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,IAAI,GAAG,GAAG,CAAC,CAAC;QAC/C,CAAC;QACD,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,2CAA2C,CAAC,CAAC;QAC5E,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,2CAA2C,CAAC,CAAC;QACxE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,2CAA2C,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,8DAA8D,EAAE,GAAG,EAAE;QACxE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,4BAA4B,CAAC,CAAC;QACzD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,8BAA8B,CAAC,CAAC;QAC3D,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,2BAA2B,CAAC,CAAC;QACxD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,uBAAuB,CAAC,CAAC;QACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,iCAAiC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CACxB,sEAAsE,CACvE,CAAC;QACF,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,qCAAqC,CAAC,CAAC;QAClE,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,0DAA0D,CAAC,CAAC;IACzF,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACtF,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACvC,KAAK,MAAM,MAAM,IAAI,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=default.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.test.d.ts","sourceRoot":"","sources":["../src/default.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,139 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { describe, expect, test } from 'bun:test';
3
+ const consumerPreset = readPreset('../default.json');
4
+ const devtoolsOwnerPreset = readPreset('../devtools-owner.json');
5
+ describe('consumer preset', () => {
6
+ test('publishes the canonical default-deny policy at the repository root', () => {
7
+ expect(consumerPreset).toMatchObject({
8
+ description: ['Canonical dependency update policy for Ankhorage consumer repositories.'],
9
+ extends: ['config:recommended', ':dependencyDashboard'],
10
+ gitIgnoredAuthors: ['41898282+github-actions[bot]@users.noreply.github.com'],
11
+ labels: ['dependencies'],
12
+ });
13
+ expect(consumerPreset.packageRules[0]).toMatchObject({
14
+ enabled: false,
15
+ matchPackageNames: ['*'],
16
+ });
17
+ });
18
+ test('keeps ordinary Ankhorage packages eligible', () => {
19
+ expect(resolveRules(consumerPreset.packageRules, dependency('@ankhorage/contracts'))).toMatchObject({
20
+ automerge: true,
21
+ enabled: true,
22
+ groupName: 'Ankhorage packages',
23
+ rangeStrategy: 'bump',
24
+ });
25
+ });
26
+ test('groups the compatible CLI and provider pair', () => {
27
+ for (const packageName of ['@ankhorage/ankh', '@ankhorage/devtools']) {
28
+ expect(resolveRules(consumerPreset.packageRules, dependency(packageName))).toMatchObject({
29
+ automerge: true,
30
+ automergeType: 'pr',
31
+ enabled: true,
32
+ groupName: 'Ankhorage CLI and Devtools toolchain',
33
+ platformAutomerge: false,
34
+ rangeStrategy: 'bump',
35
+ });
36
+ }
37
+ });
38
+ });
39
+ describe('consumer toolchain safeguards', () => {
40
+ test('requires review for major CLI and provider upgrades', () => {
41
+ expect(resolveRules(consumerPreset.packageRules, dependency('@ankhorage/devtools', { updateType: 'major' }))).toMatchObject({
42
+ automerge: false,
43
+ enabled: true,
44
+ groupName: 'Ankhorage CLI and Devtools toolchain',
45
+ });
46
+ });
47
+ test('does not independently update consumer-owned Devtools packages', () => {
48
+ expect(resolveRules(consumerPreset.packageRules, dependency('eslint'))).toEqual({
49
+ enabled: false,
50
+ });
51
+ expect(resolveRules(consumerPreset.packageRules, dependency('@types/bun'))).toEqual({
52
+ enabled: false,
53
+ });
54
+ });
55
+ test('names only the canonical workflow inventory as Devtools-owned', () => {
56
+ const canonicalRule = consumerPreset.packageRules.find((rule) => rule.description.includes('canonical Devtools workflows'));
57
+ expect(canonicalRule).toMatchObject({
58
+ enabled: false,
59
+ matchFileNames: [
60
+ '.github/workflows/ci.yml',
61
+ '.github/workflows/renovate.yml',
62
+ '.github/workflows/release.yml',
63
+ ],
64
+ matchManagers: ['github-actions'],
65
+ });
66
+ expect(canonicalRule?.matchFileNames).not.toContain('.github/workflows/studio-acceptance.yml');
67
+ });
68
+ });
69
+ describe('Devtools-owner preset', () => {
70
+ const effectiveRules = [...consumerPreset.packageRules, ...devtoolsOwnerPreset.packageRules];
71
+ test('composes with the consumer default-deny boundary', () => {
72
+ expect(devtoolsOwnerPreset.extends).toEqual(['./default']);
73
+ });
74
+ test('enables and groups the complete root Bun package toolchain', () => {
75
+ for (const packageName of ['bun', '@types/bun', 'eslint', 'knip', 'prettier', 'typescript']) {
76
+ expect(resolveRules(effectiveRules, dependency(packageName))).toMatchObject({
77
+ automerge: true,
78
+ automergeType: 'pr',
79
+ enabled: true,
80
+ groupName: 'Devtools-owned toolchain',
81
+ platformAutomerge: false,
82
+ rangeStrategy: 'bump',
83
+ });
84
+ }
85
+ });
86
+ test('requires review for major owner toolchain upgrades', () => {
87
+ expect(resolveRules(effectiveRules, dependency('typescript', { updateType: 'major' }))).toMatchObject({
88
+ automerge: false,
89
+ enabled: true,
90
+ groupName: 'Devtools-owned toolchain',
91
+ });
92
+ });
93
+ test('does not broaden owner permissions beyond the root package manifest', () => {
94
+ expect(resolveRules(effectiveRules, dependency('eslint', { fileName: 'examples/package.json' }))).toEqual({ enabled: false });
95
+ });
96
+ });
97
+ function dependency(packageName, overrides = {}) {
98
+ return {
99
+ datasource: 'npm',
100
+ fileName: 'package.json',
101
+ manager: 'bun',
102
+ packageName,
103
+ updateType: 'minor',
104
+ ...overrides,
105
+ };
106
+ }
107
+ function matchesRule(rule, candidate) {
108
+ return (matches(rule.matchDatasources, candidate.datasource) &&
109
+ matches(rule.matchFileNames, candidate.fileName) &&
110
+ matches(rule.matchManagers, candidate.manager) &&
111
+ matches(rule.matchPackageNames, candidate.packageName) &&
112
+ matches(rule.matchUpdateTypes, candidate.updateType));
113
+ }
114
+ function matches(patterns, value) {
115
+ if (patterns === undefined)
116
+ return true;
117
+ return patterns.some((pattern) => pattern === '*' ||
118
+ pattern === value ||
119
+ (pattern.endsWith('/**') && value.startsWith(pattern.slice(0, -2))));
120
+ }
121
+ function readPreset(relativePath) {
122
+ return JSON.parse(readFileSync(new URL(relativePath, import.meta.url), 'utf8'));
123
+ }
124
+ function resolveRules(rules, candidate) {
125
+ return rules
126
+ .filter((rule) => matchesRule(rule, candidate))
127
+ .reduce((resolved, rule) => ({
128
+ ...resolved,
129
+ ...(rule.automerge === undefined ? {} : { automerge: rule.automerge }),
130
+ ...(rule.automergeType === undefined ? {} : { automergeType: rule.automergeType }),
131
+ ...(rule.enabled === undefined ? {} : { enabled: rule.enabled }),
132
+ ...(rule.groupName === undefined ? {} : { groupName: rule.groupName }),
133
+ ...(rule.platformAutomerge === undefined
134
+ ? {}
135
+ : { platformAutomerge: rule.platformAutomerge }),
136
+ ...(rule.rangeStrategy === undefined ? {} : { rangeStrategy: rule.rangeStrategy }),
137
+ }), {});
138
+ }
139
+ //# sourceMappingURL=default.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default.test.js","sourceRoot":"","sources":["../src/default.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEvC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAiClD,MAAM,cAAc,GAAG,UAAU,CAAC,iBAAiB,CAAC,CAAC;AACrD,MAAM,mBAAmB,GAAG,UAAU,CAAC,wBAAwB,CAAC,CAAC;AAEjE,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,IAAI,CAAC,oEAAoE,EAAE,GAAG,EAAE;QAC9E,MAAM,CAAC,cAAc,CAAC,CAAC,aAAa,CAAC;YACnC,WAAW,EAAE,CAAC,yEAAyE,CAAC;YACxF,OAAO,EAAE,CAAC,oBAAoB,EAAE,sBAAsB,CAAC;YACvD,iBAAiB,EAAE,CAAC,uDAAuD,CAAC;YAC5E,MAAM,EAAE,CAAC,cAAc,CAAC;SACzB,CAAC,CAAC;QACH,MAAM,CAAC,cAAc,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;YACnD,OAAO,EAAE,KAAK;YACd,iBAAiB,EAAE,CAAC,GAAG,CAAC;SACzB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACtD,MAAM,CACJ,YAAY,CAAC,cAAc,CAAC,YAAY,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAC9E,CAAC,aAAa,CAAC;YACd,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,oBAAoB;YAC/B,aAAa,EAAE,MAAM;SACtB,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;QACvD,KAAK,MAAM,WAAW,IAAI,CAAC,iBAAiB,EAAE,qBAAqB,CAAC,EAAE,CAAC;YACrE,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,YAAY,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBACvF,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,IAAI;gBACnB,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,sCAAsC;gBACjD,iBAAiB,EAAE,KAAK;gBACxB,aAAa,EAAE,MAAM;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC/D,MAAM,CACJ,YAAY,CACV,cAAc,CAAC,YAAY,EAC3B,UAAU,CAAC,qBAAqB,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAC3D,CACF,CAAC,aAAa,CAAC;YACd,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,sCAAsC;SAClD,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,gEAAgE,EAAE,GAAG,EAAE;QAC1E,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,YAAY,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAC9E,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;QACH,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,YAAY,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YAClF,OAAO,EAAE,KAAK;SACf,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,+DAA+D,EAAE,GAAG,EAAE;QACzE,MAAM,aAAa,GAAG,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAC1D,CAAC;QACF,MAAM,CAAC,aAAa,CAAC,CAAC,aAAa,CAAC;YAClC,OAAO,EAAE,KAAK;YACd,cAAc,EAAE;gBACd,0BAA0B;gBAC1B,gCAAgC;gBAChC,+BAA+B;aAChC;YACD,aAAa,EAAE,CAAC,gBAAgB,CAAC;SAClC,CAAC,CAAC;QACH,MAAM,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACjG,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,MAAM,cAAc,GAAG,CAAC,GAAG,cAAc,CAAC,YAAY,EAAE,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IAE7F,IAAI,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC5D,MAAM,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACtE,KAAK,MAAM,WAAW,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,EAAE,CAAC;YAC5F,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;gBAC1E,SAAS,EAAE,IAAI;gBACf,aAAa,EAAE,IAAI;gBACnB,OAAO,EAAE,IAAI;gBACb,SAAS,EAAE,0BAA0B;gBACrC,iBAAiB,EAAE,KAAK;gBACxB,aAAa,EAAE,MAAM;aACtB,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;QAC9D,MAAM,CACJ,YAAY,CAAC,cAAc,EAAE,UAAU,CAAC,YAAY,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAChF,CAAC,aAAa,CAAC;YACd,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,IAAI;YACb,SAAS,EAAE,0BAA0B;SACtC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,qEAAqE,EAAE,GAAG,EAAE;QAC/E,MAAM,CACJ,YAAY,CAAC,cAAc,EAAE,UAAU,CAAC,QAAQ,EAAE,EAAE,QAAQ,EAAE,uBAAuB,EAAE,CAAC,CAAC,CAC1F,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,SAAS,UAAU,CAAC,WAAmB,EAAE,YAAiC,EAAE;IAC1E,OAAO;QACL,UAAU,EAAE,KAAK;QACjB,QAAQ,EAAE,cAAc;QACxB,OAAO,EAAE,KAAK;QACd,WAAW;QACX,UAAU,EAAE,OAAO;QACnB,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,IAAiB,EAAE,SAAqB;IAC3D,OAAO,CACL,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,UAAU,CAAC;QACpD,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,QAAQ,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,SAAS,CAAC,OAAO,CAAC;QAC9C,OAAO,CAAC,IAAI,CAAC,iBAAiB,EAAE,SAAS,CAAC,WAAW,CAAC;QACtD,OAAO,CAAC,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,UAAU,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,QAAuC,EAAE,KAAa;IACrE,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACxC,OAAO,QAAQ,CAAC,IAAI,CAClB,CAAC,OAAO,EAAE,EAAE,CACV,OAAO,KAAK,GAAG;QACf,OAAO,KAAK,KAAK;QACjB,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CACtE,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,YAAoB;IACtC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAW,CAAC;AAC5F,CAAC;AAED,SAAS,YAAY,CAAC,KAA6B,EAAE,SAAqB;IACxE,OAAO,KAAK;SACT,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;SAC9C,MAAM,CACL,CAAC,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QACnB,GAAG,QAAQ;QACX,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;QAClF,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,iBAAiB,KAAK,SAAS;YACtC,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC;KACnF,CAAC,EACF,EAAE,CACH,CAAC;AACN,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Canonical Renovate policy and future automation provider for Ankhorage repositories.
3
+ *
4
+ * The shared preset is published as `default.json` and consumed from GitHub. The TypeScript
5
+ * public API is intentionally reserved for the future `ankh renovate` provider.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Canonical Renovate policy and future automation provider for Ankhorage repositories.
3
+ *
4
+ * The shared preset is published as `default.json` and consumed from GitHub. The TypeScript
5
+ * public API is intentionally reserved for the future `ankh renovate` provider.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.d.ts","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,6 @@
1
+ import { expect, test } from 'bun:test';
2
+ import * as packageApi from './index.js';
3
+ test('keeps the bootstrap TypeScript API intentionally empty', () => {
4
+ expect(Object.keys(packageApi)).toEqual([]);
5
+ });
6
+ //# sourceMappingURL=index.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.test.js","sourceRoot":"","sources":["../src/index.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAExC,OAAO,KAAK,UAAU,MAAM,YAAY,CAAC;AAEzC,IAAI,CAAC,wDAAwD,EAAE,GAAG,EAAE;IAClE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC"}
@@ -0,0 +1,14 @@
1
+ /***
2
+ * Devtools owner repository configuration
3
+ *
4
+ * Loads the owner-specific policy that enables and groups the root Bun, ESLint, Knip, Prettier,
5
+ * TypeScript, and validation/publishing dependencies maintained by @ankhorage/devtools. Major
6
+ * upgrades remain reviewable. Do not use this profile in normal consumer repositories.
7
+ *
8
+ * @usage
9
+ * @readme
10
+ */
11
+ {
12
+ $schema: 'https://docs.renovatebot.com/renovate-schema.json',
13
+ extends: ['github>ankhorage/renovate:devtools-owner'],
14
+ }
@@ -0,0 +1,17 @@
1
+ /***
2
+ * Repository configuration
3
+ *
4
+ * Loads the normal consumer policy from its default branch. The policy keeps Devtools-owned
5
+ * packages and canonical workflows out of independent Renovate updates, and groups compatible
6
+ * @ankhorage/ankh and @ankhorage/devtools releases for the trusted automatic synchronization
7
+ * workflow. The workflow runs the exact lock-selected Devtools provider with either the consumer's
8
+ * lock-selected Ankh CLI or its own exact canonical CLI pin, requires byte stability, and commits
9
+ * the complete managed result without a manual repository sync.
10
+ *
11
+ * @usage
12
+ * @readme
13
+ */
14
+ {
15
+ $schema: 'https://docs.renovatebot.com/renovate-schema.json',
16
+ extends: ['github>ankhorage/renovate'],
17
+ }