@nonameolsson/nightjar 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +66 -2
- package/dist/account.d.ts +12 -0
- package/dist/account.js +57 -0
- package/dist/account.js.map +1 -0
- package/dist/args.d.ts +2 -1
- package/dist/args.js +7 -2
- package/dist/args.js.map +1 -1
- package/dist/build.d.ts +4 -1
- package/dist/build.js +303 -47
- package/dist/build.js.map +1 -1
- package/dist/checks.d.ts +7 -0
- package/dist/checks.js +72 -8
- package/dist/checks.js.map +1 -1
- package/dist/config.d.ts +21 -0
- package/dist/config.js +79 -0
- package/dist/config.js.map +1 -1
- package/dist/doctor.js +5 -0
- package/dist/doctor.js.map +1 -1
- package/dist/fakes/machine.d.ts +1 -0
- package/dist/fakes/machine.js +14 -7
- package/dist/fakes/machine.js.map +1 -1
- package/dist/init.d.ts +1 -0
- package/dist/init.js +10 -2
- package/dist/init.js.map +1 -1
- package/dist/ledger.d.ts +1 -1
- package/dist/ledger.js +1 -1
- package/dist/ledger.js.map +1 -1
- package/dist/main.js +20 -4
- package/dist/main.js.map +1 -1
- package/dist/person-config.d.ts +1 -0
- package/dist/person-config.js +8 -3
- package/dist/person-config.js.map +1 -1
- package/dist/prompt.d.ts +63 -0
- package/dist/prompt.js +74 -0
- package/dist/prompt.js.map +1 -1
- package/dist/serve.d.ts +10 -0
- package/dist/serve.js +85 -0
- package/dist/serve.js.map +1 -0
- package/dist/settings.d.ts +7 -1
- package/dist/settings.js +12 -3
- package/dist/settings.js.map +1 -1
- package/dist/skills.d.ts +4 -0
- package/dist/skills.js +51 -0
- package/dist/skills.js.map +1 -0
- package/dist/status-shape.d.ts +1 -1
- package/dist/workflow.d.ts +33 -0
- package/dist/workflow.js +53 -0
- package/dist/workflow.js.map +1 -0
- package/dist/worktree.d.ts +16 -0
- package/dist/worktree.js +51 -2
- package/dist/worktree.js.map +1 -1
- package/docs/ticket-contract.md +10 -0
- package/package.json +1 -1
- package/schema/factory.schema.json +107 -0
- package/src/status-shape.ts +2 -2
package/dist/workflow.js
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// A Feature's own `**Workflow:**` line, as written; the bold is optional.
|
|
2
|
+
export function workflowLine(body) {
|
|
3
|
+
const match = /^(?:\*\*)?Workflow:(?:\*\*)?[ \t]*([^*\s].*?)\s*$/im.exec(body);
|
|
4
|
+
return match?.[1]?.replace(/^`(.*)`$/, '$1').trim() || undefined;
|
|
5
|
+
}
|
|
6
|
+
export function chooseWorkflow(settings, body) {
|
|
7
|
+
const known = Object.keys(settings.workflows ?? {});
|
|
8
|
+
const asked = workflowLine(body);
|
|
9
|
+
const name = asked === undefined
|
|
10
|
+
? settings.defaultWorkflow
|
|
11
|
+
: (known.find((n) => n === asked) ??
|
|
12
|
+
known.find((n) => n.toLowerCase() === asked.toLowerCase()));
|
|
13
|
+
if (asked === undefined && name === undefined)
|
|
14
|
+
return { kind: 'none' };
|
|
15
|
+
const workflow = name === undefined ? undefined : settings.workflows?.[name];
|
|
16
|
+
if (name === undefined || workflow === undefined) {
|
|
17
|
+
const list = known.length === 0 ? 'factory.json names none' : known.map((n) => `\`${n}\``).join(', ');
|
|
18
|
+
return {
|
|
19
|
+
kind: 'refused',
|
|
20
|
+
why: `its \`**Workflow:**\` line names \`${asked ?? ''}\`, which is no Workflow. The Workflows known: ${list}.`
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
const broken = settings.brokenWorkflows?.[name];
|
|
24
|
+
if (broken !== undefined) {
|
|
25
|
+
return { kind: 'refused', why: `the Workflow \`${name}\` cannot run: ${broken}` };
|
|
26
|
+
}
|
|
27
|
+
return { kind: 'workflow', name, workflow };
|
|
28
|
+
}
|
|
29
|
+
// What a Step is called in a commit trailer, which tells a later run it is done.
|
|
30
|
+
export const stepKey = (workflow, step, ticket) => `${workflow}/${step}${ticket === null ? '' : ` #${ticket}`}`;
|
|
31
|
+
// The skills a Step's prompt names with a slash, such as `/some-skill args`.
|
|
32
|
+
export function skillsNamed(prompt) {
|
|
33
|
+
const names = [
|
|
34
|
+
...prompt.matchAll(/(?<![\w/.:~-])\/([a-z][a-z0-9_-]*(?::[a-z][a-z0-9_-]*)?)(?![\w/.-])/g)
|
|
35
|
+
];
|
|
36
|
+
return [...new Set(names.flatMap((m) => (m[1] ? [m[1]] : [])))];
|
|
37
|
+
}
|
|
38
|
+
// The pull request's section on a Workflow, or null when it ran no Step.
|
|
39
|
+
export function workflowSection(name, reports, ref) {
|
|
40
|
+
if (reports.length === 0)
|
|
41
|
+
return null;
|
|
42
|
+
const lines = reports.map((r) => {
|
|
43
|
+
const where = `\`${r.step.name}\`${r.ticket === null ? '' : ` (after ${ref(r.ticket)})`}`;
|
|
44
|
+
if (r.state === 'done')
|
|
45
|
+
return `- ${where}: done`;
|
|
46
|
+
if (r.state === 'undone')
|
|
47
|
+
return `- ${where}: **not done**, ${r.why ?? 'it did not finish'}; its changes were thrown away`;
|
|
48
|
+
const left = r.left.map((l) => `\n - ${l}`).join('');
|
|
49
|
+
return `- ${where}: its condition (${r.step.until ?? ''}) did not hold after ${String(r.rounds ?? 0)} round${r.rounds === 1 ? '' : 's'}. Left:${left || ' (it listed nothing)'}`;
|
|
50
|
+
});
|
|
51
|
+
return `## Workflow \`${name}\`\n\n${lines.join('\n')}`;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=workflow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow.js","sourceRoot":"","sources":["../src/workflow.ts"],"names":[],"mappings":"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"}
|
package/dist/worktree.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { type Env } from './git.js';
|
|
|
2
2
|
export declare class GitFailure extends Error {
|
|
3
3
|
}
|
|
4
4
|
export declare const TICKET_TRAILER = "Factory-Ticket";
|
|
5
|
+
export declare const STEP_TRAILER = "Factory-Step";
|
|
5
6
|
export declare function branchFor(id: string, title: string): string;
|
|
6
7
|
export declare function worktreesFor(home: string, root: string): string;
|
|
7
8
|
export interface FeatureBranch {
|
|
@@ -21,6 +22,21 @@ export declare class Worktree {
|
|
|
21
22
|
ahead: () => Promise<number>;
|
|
22
23
|
built(): Promise<Set<string>>;
|
|
23
24
|
commitTicket(id: string, title: string, summary: string, session: string): Promise<boolean>;
|
|
25
|
+
notes(): Promise<string>;
|
|
26
|
+
stepsDone(): Promise<Set<string>>;
|
|
27
|
+
diff(limit: number): Promise<{
|
|
28
|
+
text: string;
|
|
29
|
+
truncated: boolean;
|
|
30
|
+
}>;
|
|
31
|
+
commitStep(o: {
|
|
32
|
+
workflow: string;
|
|
33
|
+
step: string;
|
|
34
|
+
key: string;
|
|
35
|
+
after: string | null;
|
|
36
|
+
summary: string;
|
|
37
|
+
session: string;
|
|
38
|
+
}): Promise<boolean>;
|
|
39
|
+
revert(before: string): Promise<void>;
|
|
24
40
|
discard(before: string, ticket: string): Promise<string | null>;
|
|
25
41
|
}
|
|
26
42
|
export declare function openWorktree(root: string, worktrees: string, branch: string, baseBranch: string, env: Env): Promise<Worktree>;
|
package/dist/worktree.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
// Only Nightjar commits in the worktree or saves a failed attempt; the Code host pushes.
|
|
2
2
|
import { createHash } from 'node:crypto';
|
|
3
|
-
import { existsSync, writeFileSync } from 'node:fs';
|
|
4
|
-
import { basename, join, resolve } from 'node:path';
|
|
3
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
4
|
+
import { basename, dirname, join, resolve } from 'node:path';
|
|
5
5
|
import { firstLine, run } from './git.js';
|
|
6
6
|
// A git command Nightjar cannot go on without.
|
|
7
7
|
export class GitFailure extends Error {
|
|
8
8
|
}
|
|
9
9
|
// Names the Ticket a commit built, so a later run on the branch knows what is done.
|
|
10
10
|
export const TICKET_TRAILER = 'Factory-Ticket';
|
|
11
|
+
// Names the Workflow Step a commit holds, so a later run knows it is done.
|
|
12
|
+
export const STEP_TRAILER = 'Factory-Step';
|
|
13
|
+
// The notes the Steps of a run share, in the worktree and never committed.
|
|
14
|
+
const NOTES = '.factory/notes';
|
|
11
15
|
const BRANCH_PREFIX = 'factory/';
|
|
12
16
|
// An item id as a piece of a branch name: whatever a ref may not hold becomes a dash.
|
|
13
17
|
const refPart = (id) => id.replace(/[^A-Za-z0-9_-]+/g, '-');
|
|
@@ -68,6 +72,51 @@ export class Worktree {
|
|
|
68
72
|
await this.git(['commit', '-q', '-m', message]);
|
|
69
73
|
return true;
|
|
70
74
|
}
|
|
75
|
+
// The folder the Steps share, made, and kept out of every `git add` and `git clean` by the checkout's exclude file.
|
|
76
|
+
async notes() {
|
|
77
|
+
const folder = join(this.at.folder, NOTES);
|
|
78
|
+
mkdirSync(folder, { recursive: true });
|
|
79
|
+
const path = (await this.git(['rev-parse', '--git-path', 'info/exclude'])).trim();
|
|
80
|
+
const exclude = resolve(this.at.folder, path);
|
|
81
|
+
const line = `/${NOTES}/`;
|
|
82
|
+
const text = existsSync(exclude) ? readFileSync(exclude, 'utf8') : '';
|
|
83
|
+
if (!text.split('\n').includes(line)) {
|
|
84
|
+
mkdirSync(dirname(exclude), { recursive: true });
|
|
85
|
+
appendFileSync(exclude, `${text === '' || text.endsWith('\n') ? '' : '\n'}${line}\n`);
|
|
86
|
+
}
|
|
87
|
+
return folder;
|
|
88
|
+
}
|
|
89
|
+
// The Steps the branch's own commits hold, as their trailers name them.
|
|
90
|
+
async stepsDone() {
|
|
91
|
+
const out = await this.git([
|
|
92
|
+
'log',
|
|
93
|
+
`--format=%(trailers:key=${STEP_TRAILER},valueonly)`,
|
|
94
|
+
`${this.at.base}..HEAD`
|
|
95
|
+
]);
|
|
96
|
+
return new Set(out.split('\n').flatMap((l) => (l.trim() === '' ? [] : [l.trim()])));
|
|
97
|
+
}
|
|
98
|
+
// The Feature's diff against its base, cut at `limit` characters.
|
|
99
|
+
async diff(limit) {
|
|
100
|
+
const text = await this.git(['diff', `${this.at.base}...HEAD`]);
|
|
101
|
+
return text.length > limit
|
|
102
|
+
? { text: text.slice(0, limit), truncated: true }
|
|
103
|
+
: { text, truncated: false };
|
|
104
|
+
}
|
|
105
|
+
// One commit of what a Step left, naming the Workflow and the Step; false when it changed no file.
|
|
106
|
+
async commitStep(o) {
|
|
107
|
+
await this.git(['add', '-A']);
|
|
108
|
+
if ((await this.git(['diff', '--cached', '--name-only'])).trim() === '')
|
|
109
|
+
return false;
|
|
110
|
+
const subject = `${o.workflow}: ${o.step}${o.after === null ? '' : ` (after #${o.after})`}`;
|
|
111
|
+
const message = `${subject}\n\n${o.summary.trim()}\n\n${STEP_TRAILER}: ${o.key}\nFactory-Session: ${o.session}`;
|
|
112
|
+
await this.git(['commit', '-q', '-m', message]);
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
// Throws away what a Step left, keeping nothing: the Step is listed as not done.
|
|
116
|
+
async revert(before) {
|
|
117
|
+
await this.git(['reset', '-q', '--hard', before]);
|
|
118
|
+
await this.git(['clean', '-q', '-fd']);
|
|
119
|
+
}
|
|
71
120
|
// Keeps what the session left on a side branch, which it names; null when it left nothing.
|
|
72
121
|
async discard(before, ticket) {
|
|
73
122
|
await this.git(['add', '-A']);
|
package/dist/worktree.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"worktree.js","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"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"}
|
package/docs/ticket-contract.md
CHANGED
|
@@ -27,6 +27,16 @@ A Ticket is one child of a Feature, built as one commit. It holds:
|
|
|
27
27
|
|
|
28
28
|
A Ticket is built only while it carries the ready Signal (`ready-for-agent` by default). Its Feature carries no Signal until a person assigns it to themselves and gives it the Go (`factory-go` by default).
|
|
29
29
|
|
|
30
|
+
## A Feature's Workflow
|
|
31
|
+
|
|
32
|
+
A Feature may carry a **`**Workflow:**`** line anywhere in its body, on a line of its own, to add the Steps of a Workflow from `factory.json` to its build:
|
|
33
|
+
|
|
34
|
+
```markdown
|
|
35
|
+
**Workflow:** design-review
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
The rest of the line is the Workflow's name. Without the line the Feature gets the repo's `defaultWorkflow`, if it has one; a name no Workflow has marks the Feature as needing info. See the README's Workflows section.
|
|
39
|
+
|
|
30
40
|
## The Feature file
|
|
31
41
|
|
|
32
42
|
`nightjar create FILE` makes a Feature and its Tickets on the Tracker `factory.json` names, from one Markdown file:
|
package/package.json
CHANGED
|
@@ -279,6 +279,113 @@
|
|
|
279
279
|
},
|
|
280
280
|
"additionalProperties": false
|
|
281
281
|
},
|
|
282
|
+
"workflows": {
|
|
283
|
+
"description": "Work a repo adds to the build loop, by name. A Feature picks one with a **Workflow:** line; Nightjar still keeps the branch, the commits, the Signals and the pull request.",
|
|
284
|
+
"type": "object",
|
|
285
|
+
"propertyNames": {
|
|
286
|
+
"type": "string",
|
|
287
|
+
"pattern": "^[^\\r\\n]*\\S[^\\r\\n]*$"
|
|
288
|
+
},
|
|
289
|
+
"additionalProperties": {
|
|
290
|
+
"type": "object",
|
|
291
|
+
"properties": {
|
|
292
|
+
"steps": {
|
|
293
|
+
"minItems": 1,
|
|
294
|
+
"type": "array",
|
|
295
|
+
"items": {
|
|
296
|
+
"type": "object",
|
|
297
|
+
"properties": {
|
|
298
|
+
"name": {
|
|
299
|
+
"type": "string",
|
|
300
|
+
"pattern": "^[^\\r\\n]*\\S[^\\r\\n]*$",
|
|
301
|
+
"description": "The name of the Step; its commit and the pull request body name it"
|
|
302
|
+
},
|
|
303
|
+
"prompt": {
|
|
304
|
+
"type": "string",
|
|
305
|
+
"pattern": "\\S",
|
|
306
|
+
"description": "What the agent is told to do, such as \"/some-skill critique\"; it may name any skill. Nightjar adds the rule that nobody is at the keyboard."
|
|
307
|
+
},
|
|
308
|
+
"point": {
|
|
309
|
+
"type": "string",
|
|
310
|
+
"enum": [
|
|
311
|
+
"afterEachTicket",
|
|
312
|
+
"afterAllTickets"
|
|
313
|
+
],
|
|
314
|
+
"description": "afterEachTicket runs after each Ticket is built; afterAllTickets runs once, after every Ticket, before the review"
|
|
315
|
+
},
|
|
316
|
+
"model": {
|
|
317
|
+
"description": "The Step's own model; else the default model",
|
|
318
|
+
"type": "string",
|
|
319
|
+
"pattern": "\\S"
|
|
320
|
+
},
|
|
321
|
+
"effort": {
|
|
322
|
+
"description": "The Step's own effort; else the default effort",
|
|
323
|
+
"type": "string",
|
|
324
|
+
"pattern": "\\S"
|
|
325
|
+
},
|
|
326
|
+
"budgetUsd": {
|
|
327
|
+
"description": "The most one run of the Step may cost in dollars; else a Ticket's budget",
|
|
328
|
+
"type": "number",
|
|
329
|
+
"exclusiveMinimum": 0
|
|
330
|
+
},
|
|
331
|
+
"until": {
|
|
332
|
+
"description": "A condition in plain words. After each round the agent reports whether it holds, and Nightjar runs the Step again until it does or maxRounds is reached",
|
|
333
|
+
"type": "string",
|
|
334
|
+
"pattern": "\\S"
|
|
335
|
+
},
|
|
336
|
+
"maxRounds": {
|
|
337
|
+
"description": "The most rounds of a Step with an until; 3 when left out",
|
|
338
|
+
"type": "integer",
|
|
339
|
+
"minimum": 1,
|
|
340
|
+
"maximum": 10
|
|
341
|
+
}
|
|
342
|
+
},
|
|
343
|
+
"required": [
|
|
344
|
+
"name",
|
|
345
|
+
"prompt",
|
|
346
|
+
"point"
|
|
347
|
+
],
|
|
348
|
+
"additionalProperties": false
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
"serve": {
|
|
352
|
+
"description": "A command started in the background in the worktree before the Workflow's Steps and stopped after them, such as a dev server. It reads its port from the variables of ports.env, so it needs ports.",
|
|
353
|
+
"type": "string",
|
|
354
|
+
"pattern": "\\S"
|
|
355
|
+
},
|
|
356
|
+
"allowedCommands": {
|
|
357
|
+
"description": "Commands the Workflow's Steps may run besides the top-level allowedCommands, as Bash permission patterns without Bash( )",
|
|
358
|
+
"type": "array",
|
|
359
|
+
"items": {
|
|
360
|
+
"type": "string",
|
|
361
|
+
"pattern": "\\S"
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
"allowedTools": {
|
|
365
|
+
"description": "Tools the Workflow's Steps may use besides the usual ones, as Claude Code permission rules. Committing, pushing, switching branches, the outside network and gh stay denied.",
|
|
366
|
+
"type": "array",
|
|
367
|
+
"items": {
|
|
368
|
+
"type": "string",
|
|
369
|
+
"pattern": "\\S"
|
|
370
|
+
}
|
|
371
|
+
},
|
|
372
|
+
"localNetwork": {
|
|
373
|
+
"description": "true lets the Workflow's Steps reach localhost, and nothing else on the network",
|
|
374
|
+
"type": "boolean"
|
|
375
|
+
}
|
|
376
|
+
},
|
|
377
|
+
"required": [
|
|
378
|
+
"steps"
|
|
379
|
+
],
|
|
380
|
+
"additionalProperties": false,
|
|
381
|
+
"description": "A named list of Steps that a Feature picks with a **Workflow:** line"
|
|
382
|
+
}
|
|
383
|
+
},
|
|
384
|
+
"defaultWorkflow": {
|
|
385
|
+
"description": "The Workflow of a Feature without a **Workflow:** line; none when left out",
|
|
386
|
+
"type": "string",
|
|
387
|
+
"pattern": "\\S"
|
|
388
|
+
},
|
|
282
389
|
"trusted": {
|
|
283
390
|
"description": "The logins whose comments reach the agent (on Azure DevOps, sign-in names such as ann@contoso.com). When set, it replaces the Tracker default (GitHub: write access; Azure DevOps: the project's Contributors group); leave it out to keep the default.",
|
|
284
391
|
"type": "array",
|
package/src/status-shape.ts
CHANGED
|
@@ -5,9 +5,9 @@ export type Doing =
|
|
|
5
5
|
| {
|
|
6
6
|
readonly kind: 'building';
|
|
7
7
|
readonly feature: string;
|
|
8
|
-
// null while the Feature is set up and
|
|
8
|
+
// null while the Feature is set up and reviewed, and during a Step that runs after all Tickets
|
|
9
9
|
readonly ticket: string | null;
|
|
10
|
-
readonly step: 'setup' | 'build' | 'fix' | 'review';
|
|
10
|
+
readonly step: 'setup' | 'build' | 'fix' | 'review' | 'step';
|
|
11
11
|
// a build's question round or a fix round, of how many there may be
|
|
12
12
|
readonly round: number | null;
|
|
13
13
|
readonly rounds: number | null;
|