putitoutthere 0.1.43 → 0.1.45

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 (82) hide show
  1. package/CHANGELOG.md +115 -0
  2. package/MIGRATIONS.md +632 -0
  3. package/README.md +342 -94
  4. package/action.yml +5 -5
  5. package/dist/action.js +2 -2
  6. package/dist/action.js.map +1 -1
  7. package/dist/cascade.d.ts +1 -1
  8. package/dist/cascade.js +2 -2
  9. package/dist/cli.d.ts +9 -6
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +12 -426
  12. package/dist/cli.js.map +1 -1
  13. package/dist/config.d.ts +13 -61
  14. package/dist/config.d.ts.map +1 -1
  15. package/dist/config.js +31 -45
  16. package/dist/config.js.map +1 -1
  17. package/dist/git.js +1 -1
  18. package/dist/git.js.map +1 -1
  19. package/dist/handlers/npm-platform.d.ts.map +1 -1
  20. package/dist/handlers/npm-platform.js +5 -1
  21. package/dist/handlers/npm-platform.js.map +1 -1
  22. package/dist/handlers/pypi.d.ts.map +1 -1
  23. package/dist/handlers/pypi.js +29 -6
  24. package/dist/handlers/pypi.js.map +1 -1
  25. package/dist/plan.d.ts +0 -1
  26. package/dist/plan.d.ts.map +1 -1
  27. package/dist/plan.js +19 -18
  28. package/dist/plan.js.map +1 -1
  29. package/dist/preflight.js +1 -1
  30. package/dist/preflight.js.map +1 -1
  31. package/dist/publish.d.ts +0 -10
  32. package/dist/publish.d.ts.map +1 -1
  33. package/dist/publish.js +6 -52
  34. package/dist/publish.js.map +1 -1
  35. package/dist/types.d.ts +1 -21
  36. package/dist/types.d.ts.map +1 -1
  37. package/dist/types.js.map +1 -1
  38. package/package.json +5 -3
  39. package/dist/auth.d.ts +0 -68
  40. package/dist/auth.d.ts.map +0 -1
  41. package/dist/auth.js +0 -285
  42. package/dist/auth.js.map +0 -1
  43. package/dist/doctor.d.ts +0 -115
  44. package/dist/doctor.d.ts.map +0 -1
  45. package/dist/doctor.js +0 -292
  46. package/dist/doctor.js.map +0 -1
  47. package/dist/init.d.ts +0 -59
  48. package/dist/init.d.ts.map +0 -1
  49. package/dist/init.js +0 -181
  50. package/dist/init.js.map +0 -1
  51. package/dist/keyring.d.ts +0 -35
  52. package/dist/keyring.d.ts.map +0 -1
  53. package/dist/keyring.js +0 -88
  54. package/dist/keyring.js.map +0 -1
  55. package/dist/oidc-policy.d.ts +0 -145
  56. package/dist/oidc-policy.d.ts.map +0 -1
  57. package/dist/oidc-policy.js +0 -383
  58. package/dist/oidc-policy.js.map +0 -1
  59. package/dist/preflight-run.d.ts +0 -47
  60. package/dist/preflight-run.d.ts.map +0 -1
  61. package/dist/preflight-run.js +0 -197
  62. package/dist/preflight-run.js.map +0 -1
  63. package/dist/registries/crates-trust.d.ts +0 -69
  64. package/dist/registries/crates-trust.d.ts.map +0 -1
  65. package/dist/registries/crates-trust.js +0 -95
  66. package/dist/registries/crates-trust.js.map +0 -1
  67. package/dist/release.d.ts +0 -36
  68. package/dist/release.d.ts.map +0 -1
  69. package/dist/release.js +0 -102
  70. package/dist/release.js.map +0 -1
  71. package/dist/templates.d.ts +0 -43
  72. package/dist/templates.d.ts.map +0 -1
  73. package/dist/templates.js +0 -310
  74. package/dist/templates.js.map +0 -1
  75. package/dist/token-scope.d.ts +0 -65
  76. package/dist/token-scope.d.ts.map +0 -1
  77. package/dist/token-scope.js +0 -163
  78. package/dist/token-scope.js.map +0 -1
  79. package/dist/token.d.ts +0 -211
  80. package/dist/token.d.ts.map +0 -1
  81. package/dist/token.js +0 -719
  82. package/dist/token.js.map +0 -1
package/dist/doctor.js DELETED
@@ -1,292 +0,0 @@
1
- /**
2
- * `putitoutthere doctor` — pre-flight validator.
3
- *
4
- * Validates: config parses; every package has a resolvable kind; every
5
- * package has usable credentials (OIDC or per-kind token). Returns a
6
- * structured report rather than throwing so the CLI can render it as
7
- * a table.
8
- *
9
- * When `checkArtifacts` is on, also walks the plan and checks each
10
- * expected artifact directory. Silent-skips when plan can't run (no
11
- * git state / no commits) so `doctor` stays useful in contexts that
12
- * don't have a release history yet.
13
- *
14
- * Issue #23. Plan: §21.1, §16.4.7. Artifact check: #89.
15
- */
16
- import { existsSync } from 'node:fs';
17
- import { join } from 'node:path';
18
- import { expectedLayout } from './completeness.js';
19
- import { loadConfig } from './config.js';
20
- import { checkEnvironment, checkPermissions, checkPublishInvocation, diffEnvironment, diffWorkflowFilename, findPublishWorkflows, inferFromGithubWorkflowRef, } from './oidc-policy.js';
21
- import { diffCratesTrust, fetchCratesTrustPolicy, } from './registries/crates-trust.js';
22
- import { plan } from './plan.js';
23
- import { checkAuth } from './preflight.js';
24
- import { deepCheck } from './token-scope.js';
25
- export async function doctor(opts) {
26
- const issues = [];
27
- let config = null;
28
- /* v8 ignore next -- tests always pass an explicit cwd */
29
- const cfgPath = opts.configPath ?? `${opts.cwd.replace(/\/+$/, '')}/putitoutthere.toml`;
30
- try {
31
- config = loadConfig(cfgPath);
32
- /* v8 ignore start -- non-Error catch fallback path */
33
- }
34
- catch (err) {
35
- issues.push(`config: ${err instanceof Error ? err.message : String(err)}`);
36
- }
37
- /* v8 ignore stop */
38
- const packages = [];
39
- if (config) {
40
- const auth = checkAuth(config.packages);
41
- for (const pkg of config.packages) {
42
- const row = auth.results.find((r) => r.package === pkg.name);
43
- /* v8 ignore next -- every cascaded package has a row in checkAuth */
44
- const via = row?.via ?? 'missing';
45
- packages.push({ name: pkg.name, kind: pkg.kind, auth: via });
46
- if (via === 'missing') {
47
- issues.push(`auth: ${pkg.name} (${pkg.kind}) needs ${row?.acceptedEnvVars.join(' or ') ?? '<env-var>'} or OIDC`);
48
- }
49
- }
50
- if (opts.deep) {
51
- const scopable = config.packages.filter((p) => {
52
- const r = auth.results.find((x) => x.package === p.name);
53
- return r !== undefined && r.via === 'token';
54
- });
55
- const envVarForPackage = new Map();
56
- for (const p of scopable) {
57
- const r = auth.results.find((x) => x.package === p.name);
58
- /* v8 ignore next -- filter above guarantees a row */
59
- if (r !== undefined)
60
- envVarForPackage.set(p.name, r.envVar);
61
- }
62
- const rows = await deepCheck({
63
- packages: scopable,
64
- envVarForPackage,
65
- ...(opts.inspectFn !== undefined ? { inspect: opts.inspectFn } : {}),
66
- });
67
- for (const row of rows) {
68
- const pkgEntry = packages.find((p) => p.name === row.package);
69
- /* v8 ignore next -- deepCheck rows always correspond to a scoped package */
70
- if (pkgEntry === undefined)
71
- continue;
72
- pkgEntry.scope = row.scope;
73
- pkgEntry.scope_match = row.match;
74
- if (row.match === 'mismatch' || row.match === 'error') {
75
- issues.push(`scope: ${row.package} (${row.kind}) — ${row.detail ?? 'token scope does not match config'}`);
76
- }
77
- }
78
- }
79
- }
80
- const artifacts = opts.checkArtifacts && config
81
- ? await checkArtifacts(opts, cfgPath, issues)
82
- : undefined;
83
- const workflows = findPublishWorkflows(opts.cwd);
84
- const trustPolicy = checkTrustPolicyLocal(workflows, issues);
85
- const trustPolicyDeclared = config
86
- ? checkTrustPolicyDeclared(config.packages, workflows, issues)
87
- : undefined;
88
- const trustPolicyCratesIo = config
89
- ? await checkTrustPolicyCratesIo(config.packages, issues, opts.cratesIoFetch)
90
- : undefined;
91
- return {
92
- ok: issues.length === 0,
93
- issues,
94
- packages,
95
- ...(artifacts !== undefined ? { artifacts } : {}),
96
- ...(trustPolicy !== undefined ? { trustPolicy } : {}),
97
- ...(trustPolicyDeclared !== undefined ? { trustPolicyDeclared } : {}),
98
- ...(trustPolicyCratesIo !== undefined ? { trustPolicyCratesIo } : {}),
99
- };
100
- }
101
- /**
102
- * Trust-policy (local) phase. Additive; runs after auth-availability.
103
- * Deferred to a follow-up: filename-vs-registry diff and environment-
104
- * name-vs-registry diff (Option C of #162).
105
- */
106
- function checkTrustPolicyLocal(workflows, issues) {
107
- if (workflows.length === 0)
108
- return undefined;
109
- const report = { workflows: [] };
110
- for (const wf of workflows) {
111
- const wfIssues = [];
112
- const invocation = checkPublishInvocation(wf);
113
- if (invocation !== null) {
114
- wfIssues.push(`trust-policy: ${wf.filename}: no clearly-identifiable publish step (commented out?)`);
115
- }
116
- const perms = checkPermissions(wf);
117
- for (const p of perms) {
118
- wfIssues.push(`trust-policy: ${wf.filename}: job \`${p.job}\` is missing \`${p.permission}\` permission — add it to the job or to workflow-level \`permissions:\``);
119
- }
120
- const env = checkEnvironment(wf);
121
- if (env !== null) {
122
- wfIssues.push(`trust-policy: ${wf.filename}: job \`${env.job}\` has no \`environment:\` key — many trust policies pin an environment; add one (e.g. \`environment: release\`) matching the registry registration`);
123
- }
124
- for (const line of wfIssues)
125
- issues.push(line);
126
- report.workflows.push({
127
- filename: wf.filename,
128
- permissions_ok: perms.length === 0,
129
- environment_ok: env === null,
130
- invocation_ok: invocation === null,
131
- issues: wfIssues,
132
- });
133
- }
134
- return report;
135
- }
136
- /**
137
- * Exported for CLI rendering: the explicit "what's NOT checked" line
138
- * we surface below the trust-policy phase so a green doctor output
139
- * doesn't imply the filename landmine is caught.
140
- */
141
- export const TRUST_POLICY_SCOPE_NOTE = 'note: declare `[package.trust_policy]` to have `doctor` diff workflow + environment against the config. Registry cross-check is crates.io-only (set `CRATES_IO_DOCTOR_TOKEN`); PyPI and npm are declaration-only.';
142
- /**
143
- * Declared-diff phase (#189). For each package with a `[package.trust_policy]`
144
- * block, diffs the declaration against:
145
- * - the local workflow file that `findPublishWorkflows` identified
146
- * - `GITHUB_WORKFLOW_REF` when running inside Actions
147
- * Returns `undefined` when no package has a declaration.
148
- */
149
- function checkTrustPolicyDeclared(packages, workflows, issues) {
150
- const declared = packages.filter((p) => p.trust_policy !== undefined);
151
- if (declared.length === 0)
152
- return undefined;
153
- const report = { packages: [] };
154
- const localWorkflow = workflows[0]?.filename;
155
- const inferred = inferFromGithubWorkflowRef();
156
- for (const pkg of declared) {
157
- const policy = pkg.trust_policy;
158
- /* v8 ignore next -- filter guarantees trust_policy is set */
159
- if (policy === undefined)
160
- continue;
161
- const pkgIssues = [];
162
- let workflowOk = true;
163
- let environmentOk = true;
164
- let refOk = true;
165
- if (localWorkflow !== undefined) {
166
- const mismatch = diffWorkflowFilename(policy.workflow, localWorkflow);
167
- if (mismatch !== null) {
168
- workflowOk = false;
169
- pkgIssues.push(renderWorkflowMismatch(pkg.name, mismatch));
170
- }
171
- }
172
- if (policy.environment !== undefined) {
173
- for (const wf of workflows) {
174
- const envMismatch = diffEnvironment(policy.environment, wf);
175
- if (envMismatch !== null) {
176
- environmentOk = false;
177
- pkgIssues.push(renderEnvironmentMismatch(pkg.name, envMismatch));
178
- break;
179
- }
180
- }
181
- }
182
- if (inferred !== null && inferred.workflow !== policy.workflow) {
183
- refOk = false;
184
- pkgIssues.push(`trust-policy: ${pkg.name}: GITHUB_WORKFLOW_REF says the running workflow is ${inferred.workflow}, but [package.trust_policy].workflow is ${policy.workflow}`);
185
- }
186
- for (const line of pkgIssues)
187
- issues.push(line);
188
- report.packages.push({
189
- name: pkg.name,
190
- workflow_ok: workflowOk,
191
- environment_ok: environmentOk,
192
- ref_ok: refOk,
193
- issues: pkgIssues,
194
- });
195
- }
196
- return report;
197
- }
198
- function renderWorkflowMismatch(pkgName, m) {
199
- return `trust-policy: ${pkgName}: declared workflow ${m.declared} does not match local workflow ${m.actual} — update [package.trust_policy].workflow or rename the workflow file back`;
200
- }
201
- function renderEnvironmentMismatch(pkgName, m) {
202
- const actual = m.actual ?? '(none)';
203
- return `trust-policy: ${pkgName}: declared environment ${m.declared} does not match workflow ${m.workflow}'s environment ${actual}`;
204
- }
205
- /**
206
- * Opt-in crates.io cross-check (#189). Silent-skip when
207
- * `CRATES_IO_DOCTOR_TOKEN` is unset. For each `kind = "crates"` package
208
- * with a declared `trust_policy`, fetches the registered configs and
209
- * diffs against the declaration. Transient failures are neutral-skipped
210
- * so a bad crates.io minute doesn't turn doctor red; 401 fails.
211
- */
212
- async function checkTrustPolicyCratesIo(packages, issues, fetchFn = fetchCratesTrustPolicy) {
213
- const crates = packages.filter((p) => p.kind === 'crates' && p.trust_policy !== undefined);
214
- if (crates.length === 0)
215
- return undefined;
216
- const token = process.env.CRATES_IO_DOCTOR_TOKEN;
217
- if (token === undefined || token.length === 0) {
218
- return {
219
- status: 'skipped',
220
- reason: 'set CRATES_IO_DOCTOR_TOKEN to enable crates.io trust-policy cross-check',
221
- crates: [],
222
- };
223
- }
224
- const report = { status: 'ran', crates: [] };
225
- for (const pkg of crates) {
226
- const crateName = pkg.name;
227
- const result = await fetchFn(crateName, token);
228
- if (result.kind === 'skip-transient') {
229
- report.crates.push({ name: crateName, status: 'skip-transient', reason: result.reason });
230
- continue;
231
- }
232
- if (result.kind === 'auth-failed') {
233
- report.crates.push({ name: crateName, status: 'auth-failed', reason: result.reason });
234
- issues.push(`trust-policy: ${crateName}: ${result.reason}`);
235
- continue;
236
- }
237
- const policy = pkg.trust_policy;
238
- const mismatches = diffCratesTrust(crateName, {
239
- workflow: policy.workflow,
240
- ...(policy.environment !== undefined ? { environment: policy.environment } : {}),
241
- ...(policy.repository !== undefined ? { repository: policy.repository } : {}),
242
- }, result.configs);
243
- if (mismatches.length === 0) {
244
- report.crates.push({ name: crateName, status: 'ok' });
245
- }
246
- else {
247
- report.crates.push({ name: crateName, status: 'mismatch', mismatches });
248
- for (const m of mismatches) {
249
- issues.push(`trust-policy: ${crateName}: crates.io has ${m.field} = ${m.registered ?? '(none)'}, config declares ${m.declared}`);
250
- }
251
- }
252
- }
253
- return report;
254
- }
255
- async function checkArtifacts(opts, cfgPath, issues) {
256
- let matrix;
257
- try {
258
- matrix = (await plan({ cwd: opts.cwd, configPath: cfgPath }));
259
- }
260
- catch (err) {
261
- // Plan needs a git repo with at least one commit. In a scratch
262
- // checkout (no git state yet) we can't walk the plan at all, so
263
- // we note it as a soft issue and move on.
264
- /* v8 ignore next -- non-Error catch fallback path */
265
- const message = err instanceof Error ? err.message : String(err);
266
- issues.push(`artifacts: cannot walk plan (${message})`);
267
- return [];
268
- }
269
- const root = join(opts.cwd, 'artifacts');
270
- const rows = [];
271
- for (const row of matrix) {
272
- // Vanilla npm publishes from the source tree; there's no separate
273
- // artifact dir to check. Mirrors completeness.ts's carve-out.
274
- if (row.kind === 'npm' && row.target === 'noarch')
275
- continue;
276
- const dir = join(root, row.artifact_name);
277
- const present = existsSync(dir);
278
- const expected = expectedLayout(row);
279
- rows.push({
280
- package: row.name,
281
- target: row.target,
282
- artifact_name: row.artifact_name,
283
- present,
284
- expected,
285
- });
286
- if (!present) {
287
- issues.push(`artifacts: ${row.name} (${row.target}) missing; expected ${expected}`);
288
- }
289
- }
290
- return rows;
291
- }
292
- //# sourceMappingURL=doctor.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
package/dist/init.d.ts DELETED
@@ -1,59 +0,0 @@
1
- /**
2
- * `putitoutthere init` — scaffold a new repo.
3
- *
4
- * Writes:
5
- * - `putitoutthere.toml` (skeleton with `version = 1`, no packages)
6
- * - `putitoutthere/AGENTS.md` (trailer convention doc per plan.md §17.3)
7
- * - `.github/workflows/release.yml` + `.github/workflows/putitoutthere-check.yml`
8
- * - Appends `@putitoutthere/AGENTS.md` to `CLAUDE.md` (creates if missing)
9
- *
10
- * Idempotency (plan.md §17.4):
11
- * - Existing `putitoutthere.toml` → skip unless `--force`.
12
- * - Existing workflow → if byte-identical, mark already-present (no .bak);
13
- * otherwise rename to `.bak` before writing (#148).
14
- * - Existing `CLAUDE.md` already containing the import line → skip the append.
15
- *
16
- * Issue #20 / #25. Plan: §9, §17.
17
- */
18
- import { type Cadence } from './templates.js';
19
- export interface InitOptions {
20
- cwd: string;
21
- /** Overwrite `putitoutthere.toml` even if it exists. */
22
- force?: boolean;
23
- /** Reserved for v0.1. Only `claude` supported today. */
24
- agent?: 'claude' | 'cursor';
25
- /** Release cadence; selects which release.yml template to emit. */
26
- cadence?: Cadence;
27
- }
28
- export interface InitResult {
29
- wrote: string[];
30
- /**
31
- * Files skipped because they already exist and `--force` would
32
- * overwrite them. Just `putitoutthere.toml` today.
33
- */
34
- skipped: string[];
35
- /**
36
- * Files already in a correct state (AGENTS.md exists untouched,
37
- * CLAUDE.md already imports the trailer doc, etc.). `--force`
38
- * would not change these, so the CLI shouldn't suggest it.
39
- */
40
- alreadyPresent: string[];
41
- backedUp: string[];
42
- /**
43
- * Short notes for the CLI to surface to the user — e.g. "detected
44
- * existing v* tags; suggested tag_format = \"v{version}\" in the
45
- * skeleton." Not errors; just signal about automatic decisions.
46
- */
47
- notes: string[];
48
- }
49
- export declare function init(opts: InitOptions): InitResult;
50
- /**
51
- * Shape returned when the repo already carries a `v{X.Y.Z}` tag
52
- * history. The caller embeds a `tag_format = "v{version}"` line in
53
- * the emitted TOML skeleton and surfaces a note to the user.
54
- */
55
- export interface TagFormatSuggestion {
56
- tag_format: 'v{version}';
57
- detectedTags: string[];
58
- }
59
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAMH,OAAO,EAAkD,KAAK,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAE9F,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,wDAAwD;IACxD,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,wDAAwD;IACxD,KAAK,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC5B,mEAAmE;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB;;;OAGG;IACH,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB;;;;OAIG;IACH,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB;;;;OAIG;IACH,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAiFlD;AAgCD;;;;GAIG;AACH,MAAM,WAAW,mBAAmB;IAClC,UAAU,EAAE,YAAY,CAAC;IACzB,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB"}
package/dist/init.js DELETED
@@ -1,181 +0,0 @@
1
- /**
2
- * `putitoutthere init` — scaffold a new repo.
3
- *
4
- * Writes:
5
- * - `putitoutthere.toml` (skeleton with `version = 1`, no packages)
6
- * - `putitoutthere/AGENTS.md` (trailer convention doc per plan.md §17.3)
7
- * - `.github/workflows/release.yml` + `.github/workflows/putitoutthere-check.yml`
8
- * - Appends `@putitoutthere/AGENTS.md` to `CLAUDE.md` (creates if missing)
9
- *
10
- * Idempotency (plan.md §17.4):
11
- * - Existing `putitoutthere.toml` → skip unless `--force`.
12
- * - Existing workflow → if byte-identical, mark already-present (no .bak);
13
- * otherwise rename to `.bak` before writing (#148).
14
- * - Existing `CLAUDE.md` already containing the import line → skip the append.
15
- *
16
- * Issue #20 / #25. Plan: §9, §17.
17
- */
18
- import { execFileSync } from 'node:child_process';
19
- import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
20
- import { dirname, join } from 'node:path';
21
- import { AGENTS_MD, CHECK_YML, releaseYml, tomlSkeleton } from './templates.js';
22
- export function init(opts) {
23
- const cwd = opts.cwd;
24
- const force = Boolean(opts.force);
25
- const agent = opts.agent ?? 'claude';
26
- const cadence = opts.cadence ?? 'immediate';
27
- const result = {
28
- wrote: [],
29
- skipped: [],
30
- alreadyPresent: [],
31
- backedUp: [],
32
- notes: [],
33
- };
34
- // 1. putitoutthere.toml -- `--force`-gated.
35
- // Detect single-package shape + existing v* tag history so we suggest
36
- // `tag_format = "v{version}"` instead of leaving the commented-out
37
- // default — which would fork a parallel {name}-v{version} timeline on
38
- // repos that already tag as v*. #204.
39
- const suggestion = detectTagFormatSuggestion(cwd);
40
- const tomlPath = join(cwd, 'putitoutthere.toml');
41
- if (existsSync(tomlPath) && !force) {
42
- result.skipped.push('putitoutthere.toml');
43
- }
44
- else {
45
- const seeds = suggestion
46
- ? {
47
- tag_format: suggestion.tag_format,
48
- tag_format_reason: `existing v*-style tag history (${suggestion.detectedTags
49
- .slice(0, 3)
50
- .join(', ')}${suggestion.detectedTags.length > 3 ? ', …' : ''})`,
51
- }
52
- : null;
53
- writeAtomic(tomlPath, tomlSkeleton(seeds));
54
- result.wrote.push('putitoutthere.toml');
55
- if (suggestion !== null) {
56
- result.notes.push(`tag_format: detected existing \`v*\` tags (${suggestion.detectedTags.slice(0, 3).join(', ')}${suggestion.detectedTags.length > 3 ? ', …' : ''}); suggested \`tag_format = "v{version}"\` in putitoutthere.toml to keep the existing timeline. Edit the file to override.`);
57
- }
58
- }
59
- // 2. putitoutthere/AGENTS.md -- not `--force`-gated; users edit this.
60
- const agentsPath = join(cwd, 'putitoutthere', 'AGENTS.md');
61
- if (existsSync(agentsPath)) {
62
- result.alreadyPresent.push('putitoutthere/AGENTS.md');
63
- }
64
- else {
65
- writeAtomic(agentsPath, AGENTS_MD);
66
- result.wrote.push('putitoutthere/AGENTS.md');
67
- }
68
- // 3. CLAUDE.md / .cursorrules -- append-only; skip if already imported.
69
- if (agent === 'claude') {
70
- const claudePath = join(cwd, 'CLAUDE.md');
71
- const importLine = '@putitoutthere/AGENTS.md';
72
- const existing = existsSync(claudePath) ? readFileSync(claudePath, 'utf8') : '';
73
- if (existing.includes(importLine)) {
74
- result.alreadyPresent.push('CLAUDE.md');
75
- }
76
- else {
77
- const sep = existing.length > 0 && !existing.endsWith('\n') ? '\n' : '';
78
- writeAtomic(claudePath, `${existing}${sep}${importLine}\n`);
79
- result.wrote.push('CLAUDE.md');
80
- }
81
- /* v8 ignore start -- cursor path is stub-level until requested */
82
- }
83
- else {
84
- const cursorPath = join(cwd, '.cursorrules');
85
- const existing = existsSync(cursorPath) ? readFileSync(cursorPath, 'utf8') : '';
86
- if (existing.includes('Release signaling for Put It Out There')) {
87
- result.alreadyPresent.push('.cursorrules');
88
- }
89
- else {
90
- writeAtomic(cursorPath, `${existing}${existing.length > 0 ? '\n' : ''}${AGENTS_MD}`);
91
- result.wrote.push('.cursorrules');
92
- }
93
- }
94
- /* v8 ignore stop */
95
- // 4. Workflows
96
- writeWorkflow(cwd, 'release.yml', releaseYml(cadence), result);
97
- writeWorkflow(cwd, 'putitoutthere-check.yml', CHECK_YML, result);
98
- return result;
99
- }
100
- /* ---------------------------- internals ---------------------------- */
101
- function writeWorkflow(cwd, name, contents, result) {
102
- const target = join(cwd, '.github', 'workflows', name);
103
- const rel = `.github/workflows/${name}`;
104
- if (existsSync(target)) {
105
- // #148: skip the `.bak` dance when the existing file is already
106
- // byte-identical to what init would write. Otherwise re-running init
107
- // pollutes the working tree with a fresh .bak each time.
108
- const existing = readFileSync(target, 'utf8');
109
- if (existing === contents) {
110
- result.alreadyPresent.push(rel);
111
- return;
112
- }
113
- const bak = `${target}.bak`;
114
- renameSync(target, bak);
115
- result.backedUp.push(rel);
116
- }
117
- writeAtomic(target, contents);
118
- result.wrote.push(rel);
119
- }
120
- function writeAtomic(path, contents) {
121
- // lgtm[js/insecure-temporary-file] -- writes into opts.cwd, which
122
- // is the user's project root in production; only the test harness
123
- // passes an os.tmpdir() subpath here, and that's controlled input.
124
- mkdirSync(dirname(path), { recursive: true, mode: 0o755 });
125
- writeFileSync(path, contents, { encoding: 'utf8', mode: 0o644 });
126
- }
127
- /**
128
- * Look for strict-semver `v*` tags on the current checkout. When
129
- * present (and no `<name>-v*` tags are also present), suggest
130
- * `tag_format = "v{version}"` in the skeleton so the adopter's next
131
- * release stays on their existing tag timeline instead of starting a
132
- * parallel `{name}-v{version}` one. #204.
133
- *
134
- * Returns null in any of these cases (default `{name}-v{version}` is
135
- * right):
136
- * - Not a git repo / `git` not on PATH.
137
- * - No `v{X.Y.Z}` tags.
138
- * - `<name>-v*` tags already exist (the repo is polyglot-shaped).
139
- */
140
- function detectTagFormatSuggestion(cwd) {
141
- let vTags;
142
- try {
143
- const out = execFileSync('git', ['tag', '-l', 'v*.*.*'], {
144
- cwd,
145
- encoding: 'utf8',
146
- stdio: ['ignore', 'pipe', 'pipe'],
147
- })
148
- .trim()
149
- .split('\n')
150
- .filter((l) => /^v\d+\.\d+\.\d+$/.test(l));
151
- vTags = out;
152
- }
153
- catch {
154
- return null;
155
- }
156
- if (vTags.length === 0)
157
- return null;
158
- // If any `<name>-v*` tag exists, the repo is polyglot-shaped; don't
159
- // hijack the default.
160
- /* v8 ignore start -- defensive: the first git call succeeded above,
161
- * so this one with a different glob is vanishingly unlikely to fail.
162
- * Kept as belt-and-braces for unusual filesystems. */
163
- try {
164
- const out = execFileSync('git', ['tag', '-l', '*-v*.*.*'], {
165
- cwd,
166
- encoding: 'utf8',
167
- stdio: ['ignore', 'pipe', 'pipe'],
168
- })
169
- .trim()
170
- .split('\n')
171
- .filter((l) => /^.+-v\d+\.\d+\.\d+$/.test(l));
172
- if (out.length > 0)
173
- return null;
174
- }
175
- catch {
176
- /* fall through */
177
- }
178
- /* v8 ignore stop */
179
- return { tag_format: 'v{version}', detectedTags: vTags };
180
- }
181
- //# sourceMappingURL=init.js.map
package/dist/init.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.ts"],"names":[],"mappings":"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"}
package/dist/keyring.d.ts DELETED
@@ -1,35 +0,0 @@
1
- /**
2
- * Keyring — persistent storage for the user access token obtained
3
- * through `auth login`.
4
- *
5
- * Ships with a file-backed implementation (chmod 0600 in an XDG-
6
- * compliant config dir). The `Keyring` interface is the seam for
7
- * swapping in an OS keychain binding (e.g. `keytar`) later; see #105.
8
- *
9
- * Token values are never logged. Callers pass the whole `StoredAuth`
10
- * in and out; this module does not expose a "read just the access
11
- * token" affordance that could encourage stringification.
12
- */
13
- export interface StoredAuth {
14
- /** GitHub login of the account that approved the Device Flow. */
15
- account: string;
16
- access_token: string;
17
- refresh_token: string;
18
- /** Epoch seconds. */
19
- access_token_expires_at: number;
20
- /** Epoch seconds. */
21
- refresh_token_expires_at: number;
22
- }
23
- export interface Keyring {
24
- get(): Promise<StoredAuth | null>;
25
- set(auth: StoredAuth): Promise<void>;
26
- delete(): Promise<void>;
27
- }
28
- export interface FileKeyringOptions {
29
- /** Override the resolved config dir. Tests inject a tmp path. */
30
- dir?: string;
31
- }
32
- export declare function fileKeyring(opts?: FileKeyringOptions): Keyring;
33
- /** Returned for production callers. */
34
- export declare function defaultKeyring(): Keyring;
35
- //# sourceMappingURL=keyring.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"keyring.d.ts","sourceRoot":"","sources":["../src/keyring.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAaH,MAAM,WAAW,UAAU;IACzB,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,qBAAqB;IACrB,uBAAuB,EAAE,MAAM,CAAC;IAChC,qBAAqB;IACrB,wBAAwB,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,OAAO;IACtB,GAAG,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IAClC,GAAG,CAAC,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACzB;AAED,MAAM,WAAW,kBAAkB;IACjC,iEAAiE;IACjE,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,wBAAgB,WAAW,CAAC,IAAI,GAAE,kBAAuB,GAAG,OAAO,CA4BlE;AAED,uCAAuC;AACvC,wBAAgB,cAAc,IAAI,OAAO,CAExC"}