@arjunkhera/atlas 0.4.57 → 0.4.58

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atlas",
3
- "version": "0.4.57",
3
+ "version": "0.4.58",
4
4
  "description": "Atlas: the delivery lifecycle, its crews and the Atlas tools, for any repository.",
5
5
  "author": {
6
6
  "name": "Arjun Khera"
@@ -234,10 +234,12 @@ export function runnerClaim({ repo, issue, holder, gh = ghApi, now = Date.now()
234
234
  export const YOU = Object.freeze([/^sign #[1-9][0-9]{0,8}$/, /^read #[1-9][0-9]{0,8}$/, /^read item [0-9a-f]{8}$/, /^the merge door is off in the runner$/, /^start stopped$/]);
235
235
  const PR_NUMBER = /^[1-9][0-9]{0,8}$/;
236
236
  const RELEASE = /^[0-9]+\.[0-9]+\.[0-9]+$/;
237
+ // A date alone read as midnight on 10 Nov 2026, so the line said 00:00 UTC.
238
+ const UTC_TIME = /^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}(:[0-9]{2}(\.[0-9]{1,3})?)?Z$/;
237
239
  const refuseLine = (why) => { throw usage(`the run file ${why}`); };
238
240
  export function runLine({ repo, at, you = [], landed = [], opened = [], open_jobs = 0, release = null }) {
239
241
  if (!repoOk(repo)) refuseLine('needs repo as owner/name');
240
- if (!Number.isFinite(new Date(at).getTime())) refuseLine('needs at as a time');
242
+ if (!(typeof at === 'number' || UTC_TIME.test(String(at))) || !Number.isFinite(new Date(at).getTime())) refuseLine('needs at as a full UTC time, such as 2026-11-10T03:48:00Z');
241
243
  for (const one of you) if (!YOU.some((form) => form.test(String(one)))) refuseLine(`holds a "you" entry that is not a known form: ${JSON.stringify(String(one).slice(0, 40))}`);
242
244
  for (const pull of [...landed, ...opened]) if (!PR_NUMBER.test(String(pull?.number))) refuseLine('holds a pull request with no number');
243
245
  for (const pull of landed) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arjunkhera/atlas",
3
- "version": "0.4.57",
3
+ "version": "0.4.58",
4
4
  "description": "Atlas: the delivery lifecycle, its crews and the Atlas tools, as a Claude Code plugin for any repository.",
5
5
  "type": "module",
6
6
  "license": "UNLICENSED",
@@ -67,7 +67,8 @@ its environment come from `trigger.yaml` beside this file.
67
67
  from this session starts the checks again. A push from an Actions job
68
68
  would not.
69
69
  7. Write the run facts to a file as JSON: `repo`, `at`, `you`, `landed`,
70
- `opened`, `open_jobs` and `release`. Ids and counts only, no prose. Each
70
+ `opened`, `open_jobs` and `release`. Ids and counts only, no prose. Take
71
+ `at` from `date -u +%Y-%m-%dT%H:%M:%SZ`; a date with no time is refused. Each
71
72
  `you` entry is one of: `sign #<pr>`, `read #<issue>`, `read item <id>`,
72
73
  `the merge door is off in the runner`, `start stopped`. A landed pull
73
74
  request carries its `number`, its `release`, and the id of its proof
@@ -76,8 +77,9 @@ its environment come from `trigger.yaml` beside this file.
76
77
  word, as one comment on the repo's notice issue (label `atlas-notice`).
77
78
  The notice workflow reads the facts and posts the run line as the bot,
78
79
  so GitHub tells the owner.
79
- 9. Run `atlas runner line --from <file>`. Its output is the last message of
80
- the run, word for word.
80
+ 9. Run `atlas runner line --from <file>`. Copy its output, word for word,
81
+ as the last message of the run. Do not type the line again from memory,
82
+ and do not change a version or a time in it.
81
83
 
82
84
  ## Until the exit test
83
85