waypoint-codex 0.6.1 → 0.8.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 +9 -8
- package/dist/src/core.js +71 -7
- package/dist/src/track-index.js +107 -0
- package/package.json +1 -1
- package/templates/.agents/skills/break-it-qa/SKILL.md +1 -4
- package/templates/.agents/skills/code-guide-audit/SKILL.md +5 -1
- package/templates/.agents/skills/planning/SKILL.md +2 -0
- package/templates/.agents/skills/pre-pr-hygiene/SKILL.md +3 -1
- package/templates/.agents/skills/work-tracker/SKILL.md +110 -0
- package/templates/.agents/skills/workspace-compress/SKILL.md +3 -0
- package/templates/.waypoint/agent-operating-manual.md +12 -11
- package/templates/.waypoint/agents/code-health-reviewer.md +7 -1
- package/templates/.waypoint/agents/code-reviewer.md +5 -1
- package/templates/.waypoint/docs/README.md +2 -0
- package/templates/.waypoint/scripts/build-track-index.mjs +169 -0
- package/templates/.waypoint/scripts/prepare-context.mjs +24 -0
- package/templates/.waypoint/track/README.md +38 -0
- package/templates/.waypoint/track/_template.md +44 -0
- package/templates/WORKSPACE.md +5 -1
- package/templates/managed-agents-block.md +3 -2
- package/templates/.agents/skills/e2e-verify/SKILL.md +0 -63
- package/templates/.agents/skills/e2e-verify/agents/openai.yaml +0 -4
- package/templates/.agents/skills/error-audit/SKILL.md +0 -69
- package/templates/.agents/skills/error-audit/references/error-patterns.md +0 -37
- package/templates/.agents/skills/observability-audit/SKILL.md +0 -67
- package/templates/.agents/skills/observability-audit/references/observability-patterns.md +0 -35
- package/templates/.agents/skills/ux-states-audit/SKILL.md +0 -63
- package/templates/.agents/skills/ux-states-audit/references/ux-patterns.md +0 -34
package/README.md
CHANGED
|
@@ -22,10 +22,12 @@ Waypoint scaffolds a Codex-friendly repo structure built around a few core piece
|
|
|
22
22
|
|
|
23
23
|
- `AGENTS.md` for the startup contract
|
|
24
24
|
- `.waypoint/WORKSPACE.md` for live operational state
|
|
25
|
+
- `.waypoint/track/` for active long-running execution trackers
|
|
25
26
|
- `.waypoint/docs/` for durable project memory
|
|
26
27
|
- `.waypoint/DOCS_INDEX.md` for docs routing
|
|
28
|
+
- `.waypoint/TRACKS_INDEX.md` for tracker routing
|
|
27
29
|
- `.waypoint/context/` for generated startup context
|
|
28
|
-
- `.agents/skills/` for repo-local workflows like planning, audits, and QA
|
|
30
|
+
- `.agents/skills/` for repo-local workflows like planning, tracking, audits, and QA
|
|
29
31
|
|
|
30
32
|
The philosophy is simple:
|
|
31
33
|
|
|
@@ -40,7 +42,7 @@ Waypoint is most useful when you want:
|
|
|
40
42
|
|
|
41
43
|
- multi-session continuity in a real repo
|
|
42
44
|
- a durable docs and workspace structure for agents
|
|
43
|
-
- stronger planning, review, QA, and closeout defaults
|
|
45
|
+
- stronger planning, tracking, review, QA, and closeout defaults
|
|
44
46
|
- repo-local scaffolding instead of a bunch of global mystery behavior
|
|
45
47
|
|
|
46
48
|
If you only use Codex for tiny one-off edits, Waypoint is probably unnecessary.
|
|
@@ -76,9 +78,11 @@ repo/
|
|
|
76
78
|
├── .agents/
|
|
77
79
|
│ └── skills/
|
|
78
80
|
└── .waypoint/
|
|
79
|
-
├── WORKSPACE.md
|
|
80
81
|
├── DOCS_INDEX.md
|
|
82
|
+
├── TRACKS_INDEX.md
|
|
83
|
+
├── WORKSPACE.md
|
|
81
84
|
├── docs/
|
|
85
|
+
├── track/
|
|
82
86
|
├── context/
|
|
83
87
|
├── scripts/
|
|
84
88
|
└── ...
|
|
@@ -126,16 +130,13 @@ Flags you can combine:
|
|
|
126
130
|
Waypoint ships a strong default skill pack for real coding work:
|
|
127
131
|
|
|
128
132
|
- `planning`
|
|
129
|
-
- `
|
|
130
|
-
- `observability-audit`
|
|
131
|
-
- `ux-states-audit`
|
|
133
|
+
- `work-tracker`
|
|
132
134
|
- `docs-sync`
|
|
133
135
|
- `code-guide-audit`
|
|
134
136
|
- `break-it-qa`
|
|
135
137
|
- `workspace-compress`
|
|
136
138
|
- `pre-pr-hygiene`
|
|
137
139
|
- `pr-review`
|
|
138
|
-
- `e2e-verify`
|
|
139
140
|
|
|
140
141
|
These are repo-local, so the workflow travels with the project.
|
|
141
142
|
|
|
@@ -147,7 +148,7 @@ If you initialize with `--with-roles`, Waypoint scaffolds:
|
|
|
147
148
|
- `code-reviewer`
|
|
148
149
|
- `plan-reviewer`
|
|
149
150
|
|
|
150
|
-
The intended workflow is
|
|
151
|
+
The intended workflow is chunk-based: once there is a meaningful reviewable slice, run the reviewers in parallel, fix real findings, then close out. A recent self-authored commit is the preferred scope anchor when one cleanly represents the slice, but it is not the only valid trigger.
|
|
151
152
|
|
|
152
153
|
## What makes it different
|
|
153
154
|
|
package/dist/src/core.js
CHANGED
|
@@ -4,14 +4,18 @@ import os from "node:os";
|
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import * as TOML from "@iarna/toml";
|
|
6
6
|
import { renderDocsIndex } from "./docs-index.js";
|
|
7
|
+
import { renderTracksIndex } from "./track-index.js";
|
|
7
8
|
import { readTemplate, renderWaypointConfig, MANAGED_BLOCK_END, MANAGED_BLOCK_START, templatePath } from "./templates.js";
|
|
8
9
|
const DEFAULT_CONFIG_PATH = ".waypoint/config.toml";
|
|
9
10
|
const DEFAULT_DOCS_DIR = ".waypoint/docs";
|
|
10
11
|
const DEFAULT_DOCS_INDEX = ".waypoint/DOCS_INDEX.md";
|
|
12
|
+
const DEFAULT_TRACK_DIR = ".waypoint/track";
|
|
13
|
+
const DEFAULT_TRACKS_INDEX = ".waypoint/TRACKS_INDEX.md";
|
|
11
14
|
const DEFAULT_WORKSPACE = ".waypoint/WORKSPACE.md";
|
|
12
15
|
const STATE_DIR = ".waypoint/state";
|
|
13
16
|
const SYNC_RECORDS_FILE = ".waypoint/state/sync-records.json";
|
|
14
17
|
const TIMESTAMPED_WORKSPACE_SECTIONS = new Set([
|
|
18
|
+
"## Active Trackers",
|
|
15
19
|
"## Current State",
|
|
16
20
|
"## In Progress",
|
|
17
21
|
"## Next",
|
|
@@ -101,6 +105,7 @@ function scaffoldWaypointOptionalTemplates(projectRoot) {
|
|
|
101
105
|
copyTemplateTree(templatePath(".waypoint/automations"), path.join(projectRoot, ".waypoint/automations"));
|
|
102
106
|
copyTemplateTree(templatePath(".waypoint/rules"), path.join(projectRoot, ".waypoint/rules"));
|
|
103
107
|
copyTemplateTree(templatePath(".waypoint/scripts"), path.join(projectRoot, ".waypoint/scripts"));
|
|
108
|
+
copyTemplateTree(templatePath(".waypoint/track"), path.join(projectRoot, ".waypoint/track"));
|
|
104
109
|
}
|
|
105
110
|
function scaffoldOptionalCodex(projectRoot) {
|
|
106
111
|
copyTemplateTree(templatePath(".codex"), path.join(projectRoot, ".codex"));
|
|
@@ -112,6 +117,9 @@ export function initRepository(projectRoot, options) {
|
|
|
112
117
|
"docs/README.md",
|
|
113
118
|
"docs/code-guide.md",
|
|
114
119
|
"docs/legacy-import",
|
|
120
|
+
".agents/skills/error-audit",
|
|
121
|
+
".agents/skills/observability-audit",
|
|
122
|
+
".agents/skills/ux-states-audit",
|
|
115
123
|
"WAYPOINT_MIGRATION.md",
|
|
116
124
|
".agents/skills/waypoint-planning",
|
|
117
125
|
".agents/skills/waypoint-docs",
|
|
@@ -145,6 +153,7 @@ export function initRepository(projectRoot, options) {
|
|
|
145
153
|
}));
|
|
146
154
|
writeIfMissing(path.join(projectRoot, DEFAULT_WORKSPACE), readTemplate("WORKSPACE.md"));
|
|
147
155
|
ensureDir(path.join(projectRoot, DEFAULT_DOCS_DIR));
|
|
156
|
+
ensureDir(path.join(projectRoot, DEFAULT_TRACK_DIR));
|
|
148
157
|
writeIfMissing(path.join(projectRoot, ".waypoint/docs/README.md"), readTemplate(".waypoint/docs/README.md"));
|
|
149
158
|
writeIfMissing(path.join(projectRoot, ".waypoint/docs/code-guide.md"), readTemplate(".waypoint/docs/code-guide.md"));
|
|
150
159
|
upsertManagedBlock(path.join(projectRoot, "AGENTS.md"), readTemplate("managed-agents-block.md"));
|
|
@@ -154,13 +163,15 @@ export function initRepository(projectRoot, options) {
|
|
|
154
163
|
}
|
|
155
164
|
appendGitignoreSnippet(projectRoot);
|
|
156
165
|
const docsIndex = renderDocsIndex(projectRoot, path.join(projectRoot, DEFAULT_DOCS_DIR));
|
|
166
|
+
const tracksIndex = renderTracksIndex(projectRoot, path.join(projectRoot, DEFAULT_TRACK_DIR));
|
|
157
167
|
writeText(path.join(projectRoot, DEFAULT_DOCS_INDEX), `${docsIndex.content}\n`);
|
|
168
|
+
writeText(path.join(projectRoot, DEFAULT_TRACKS_INDEX), `${tracksIndex.content}\n`);
|
|
158
169
|
return [
|
|
159
170
|
"Initialized Waypoint scaffold",
|
|
160
171
|
"Installed managed AGENTS block",
|
|
161
|
-
"Created .waypoint/WORKSPACE.md and .waypoint/
|
|
172
|
+
"Created .waypoint/WORKSPACE.md, .waypoint/docs/, and .waypoint/track/ scaffold",
|
|
162
173
|
"Installed repo-local Waypoint skills",
|
|
163
|
-
"Generated .waypoint/DOCS_INDEX.md",
|
|
174
|
+
"Generated .waypoint/DOCS_INDEX.md and .waypoint/TRACKS_INDEX.md",
|
|
164
175
|
];
|
|
165
176
|
}
|
|
166
177
|
export function loadWaypointConfig(projectRoot) {
|
|
@@ -366,6 +377,7 @@ export function doctorRepository(projectRoot) {
|
|
|
366
377
|
const workspaceText = readFileSync(workspacePath, "utf8");
|
|
367
378
|
for (const section of [
|
|
368
379
|
"## Active Goal",
|
|
380
|
+
"## Active Trackers",
|
|
369
381
|
"## Current State",
|
|
370
382
|
"## In Progress",
|
|
371
383
|
"## Next",
|
|
@@ -398,6 +410,7 @@ export function doctorRepository(projectRoot) {
|
|
|
398
410
|
path.join(projectRoot, ".waypoint", "agent-operating-manual.md"),
|
|
399
411
|
path.join(projectRoot, ".waypoint", "scripts", "prepare-context.mjs"),
|
|
400
412
|
path.join(projectRoot, ".waypoint", "scripts", "build-docs-index.mjs"),
|
|
413
|
+
path.join(projectRoot, ".waypoint", "scripts", "build-track-index.mjs"),
|
|
401
414
|
]) {
|
|
402
415
|
if (!existsSync(requiredFile)) {
|
|
403
416
|
findings.push({
|
|
@@ -412,6 +425,9 @@ export function doctorRepository(projectRoot) {
|
|
|
412
425
|
const docsDir = path.join(projectRoot, config.docs_dir ?? DEFAULT_DOCS_DIR);
|
|
413
426
|
const docsIndexPath = path.join(projectRoot, config.docs_index_file ?? DEFAULT_DOCS_INDEX);
|
|
414
427
|
const docsIndex = renderDocsIndex(projectRoot, docsDir);
|
|
428
|
+
const trackDir = path.join(projectRoot, DEFAULT_TRACK_DIR);
|
|
429
|
+
const tracksIndexPath = path.join(projectRoot, DEFAULT_TRACKS_INDEX);
|
|
430
|
+
const tracksIndex = renderTracksIndex(projectRoot, trackDir);
|
|
415
431
|
if (!existsSync(docsDir)) {
|
|
416
432
|
findings.push({
|
|
417
433
|
severity: "error",
|
|
@@ -448,18 +464,62 @@ export function doctorRepository(projectRoot) {
|
|
|
448
464
|
paths: [docsIndexPath],
|
|
449
465
|
});
|
|
450
466
|
}
|
|
467
|
+
if (!existsSync(trackDir)) {
|
|
468
|
+
findings.push({
|
|
469
|
+
severity: "error",
|
|
470
|
+
category: "track",
|
|
471
|
+
message: ".waypoint/track/ directory is missing.",
|
|
472
|
+
remediation: "Run `waypoint init` to scaffold track files.",
|
|
473
|
+
paths: [trackDir],
|
|
474
|
+
});
|
|
475
|
+
}
|
|
476
|
+
for (const relPath of tracksIndex.invalidTracks) {
|
|
477
|
+
findings.push({
|
|
478
|
+
severity: "warn",
|
|
479
|
+
category: "track",
|
|
480
|
+
message: `Tracker is missing valid frontmatter or status: ${relPath}`,
|
|
481
|
+
remediation: "Add `summary`, `last_updated`, `status`, and `read_when` frontmatter using the track template.",
|
|
482
|
+
paths: [path.join(projectRoot, relPath)],
|
|
483
|
+
});
|
|
484
|
+
}
|
|
485
|
+
if (!existsSync(tracksIndexPath)) {
|
|
486
|
+
findings.push({
|
|
487
|
+
severity: "warn",
|
|
488
|
+
category: "track",
|
|
489
|
+
message: ".waypoint/TRACKS_INDEX.md is missing.",
|
|
490
|
+
remediation: "Run `waypoint sync` to generate the tracks index.",
|
|
491
|
+
paths: [tracksIndexPath],
|
|
492
|
+
});
|
|
493
|
+
}
|
|
494
|
+
else if (readFileSync(tracksIndexPath, "utf8").trimEnd() !== tracksIndex.content.trimEnd()) {
|
|
495
|
+
findings.push({
|
|
496
|
+
severity: "warn",
|
|
497
|
+
category: "track",
|
|
498
|
+
message: ".waypoint/TRACKS_INDEX.md is stale.",
|
|
499
|
+
remediation: "Run `waypoint sync` to rebuild the tracks index.",
|
|
500
|
+
paths: [tracksIndexPath],
|
|
501
|
+
});
|
|
502
|
+
}
|
|
503
|
+
if (existsSync(workspacePath) &&
|
|
504
|
+
tracksIndex.activeTrackPaths.length > 0 &&
|
|
505
|
+
!tracksIndex.activeTrackPaths.some((trackPath) => readFileSync(workspacePath, "utf8").includes(trackPath))) {
|
|
506
|
+
findings.push({
|
|
507
|
+
severity: "warn",
|
|
508
|
+
category: "track",
|
|
509
|
+
message: "Workspace does not reference any active tracker file.",
|
|
510
|
+
remediation: "Add the active `.waypoint/track/*.md` file paths under `## Active Trackers` in `.waypoint/WORKSPACE.md`.",
|
|
511
|
+
paths: [workspacePath, ...tracksIndex.activeTrackPaths.map((trackPath) => path.join(projectRoot, trackPath))],
|
|
512
|
+
});
|
|
513
|
+
}
|
|
451
514
|
for (const skillName of [
|
|
452
515
|
"planning",
|
|
453
|
-
"
|
|
454
|
-
"observability-audit",
|
|
455
|
-
"ux-states-audit",
|
|
516
|
+
"work-tracker",
|
|
456
517
|
"docs-sync",
|
|
457
518
|
"code-guide-audit",
|
|
458
519
|
"break-it-qa",
|
|
459
520
|
"workspace-compress",
|
|
460
521
|
"pre-pr-hygiene",
|
|
461
522
|
"pr-review",
|
|
462
|
-
"e2e-verify",
|
|
463
523
|
]) {
|
|
464
524
|
const skillPath = path.join(projectRoot, ".agents/skills", skillName, "SKILL.md");
|
|
465
525
|
if (!existsSync(skillPath)) {
|
|
@@ -529,8 +589,12 @@ export function syncRepository(projectRoot) {
|
|
|
529
589
|
const docsDir = path.join(projectRoot, config.docs_dir ?? DEFAULT_DOCS_DIR);
|
|
530
590
|
const docsIndexPath = path.join(projectRoot, config.docs_index_file ?? DEFAULT_DOCS_INDEX);
|
|
531
591
|
const docsIndex = renderDocsIndex(projectRoot, docsDir);
|
|
592
|
+
const trackDir = path.join(projectRoot, DEFAULT_TRACK_DIR);
|
|
593
|
+
const tracksIndexPath = path.join(projectRoot, DEFAULT_TRACKS_INDEX);
|
|
594
|
+
const tracksIndex = renderTracksIndex(projectRoot, trackDir);
|
|
532
595
|
writeText(docsIndexPath, `${docsIndex.content}\n`);
|
|
533
|
-
|
|
596
|
+
writeText(tracksIndexPath, `${tracksIndex.content}\n`);
|
|
597
|
+
const results = ["Rebuilt .waypoint/DOCS_INDEX.md", "Rebuilt .waypoint/TRACKS_INDEX.md"];
|
|
534
598
|
const featureMap = config.features ?? {};
|
|
535
599
|
if (featureMap.rules) {
|
|
536
600
|
results.push(...syncRules(projectRoot));
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
const VALID_TRACK_STATUSES = new Set(["active", "blocked", "paused", "done", "archived"]);
|
|
4
|
+
const ACTIVE_TRACK_STATUSES = new Set(["active", "blocked", "paused"]);
|
|
5
|
+
const SKIP_NAMES = new Set(["README.md", "CHANGELOG.md", "LICENSE.md"]);
|
|
6
|
+
function shouldSkipTrackFile(entry) {
|
|
7
|
+
return SKIP_NAMES.has(entry) || entry.startsWith("_");
|
|
8
|
+
}
|
|
9
|
+
function parseFrontmatter(filePath) {
|
|
10
|
+
const text = readFileSync(filePath, "utf8");
|
|
11
|
+
if (!text.startsWith("---\n")) {
|
|
12
|
+
return { summary: "", lastUpdated: "", readWhen: [], status: "" };
|
|
13
|
+
}
|
|
14
|
+
const endIndex = text.indexOf("\n---\n", 4);
|
|
15
|
+
if (endIndex === -1) {
|
|
16
|
+
return { summary: "", lastUpdated: "", readWhen: [], status: "" };
|
|
17
|
+
}
|
|
18
|
+
const frontmatter = text.slice(4, endIndex);
|
|
19
|
+
let summary = "";
|
|
20
|
+
let lastUpdated = "";
|
|
21
|
+
let status = "";
|
|
22
|
+
const readWhen = [];
|
|
23
|
+
let collectingReadWhen = false;
|
|
24
|
+
for (const rawLine of frontmatter.split("\n")) {
|
|
25
|
+
const line = rawLine.trim();
|
|
26
|
+
if (line.startsWith("summary:")) {
|
|
27
|
+
summary = line.slice("summary:".length).trim().replace(/^['"]|['"]$/g, "");
|
|
28
|
+
collectingReadWhen = false;
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
if (line.startsWith("last_updated:")) {
|
|
32
|
+
lastUpdated = line.slice("last_updated:".length).trim().replace(/^['"]|['"]$/g, "");
|
|
33
|
+
collectingReadWhen = false;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (line.startsWith("status:")) {
|
|
37
|
+
status = line.slice("status:".length).trim().replace(/^['"]|['"]$/g, "").toLowerCase();
|
|
38
|
+
collectingReadWhen = false;
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (line.startsWith("read_when:")) {
|
|
42
|
+
collectingReadWhen = true;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (collectingReadWhen && line.startsWith("- ")) {
|
|
46
|
+
readWhen.push(line.slice(2).trim());
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (collectingReadWhen && line.length > 0) {
|
|
50
|
+
collectingReadWhen = false;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return { summary, lastUpdated, readWhen, status };
|
|
54
|
+
}
|
|
55
|
+
function walkTracks(projectRoot, currentDir, output, invalid) {
|
|
56
|
+
for (const entry of readdirSync(currentDir)) {
|
|
57
|
+
const fullPath = path.join(currentDir, entry);
|
|
58
|
+
const stat = statSync(fullPath);
|
|
59
|
+
if (stat.isDirectory()) {
|
|
60
|
+
walkTracks(projectRoot, fullPath, output, invalid);
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
if (!entry.endsWith(".md") || shouldSkipTrackFile(entry)) {
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
const { summary, lastUpdated, readWhen, status } = parseFrontmatter(fullPath);
|
|
67
|
+
const relPath = path.relative(projectRoot, fullPath);
|
|
68
|
+
if (!summary || !lastUpdated || readWhen.length === 0 || !VALID_TRACK_STATUSES.has(status)) {
|
|
69
|
+
invalid.push(relPath);
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
output.push({ path: relPath, summary, readWhen, status });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
export function renderTracksIndex(projectRoot, trackDir) {
|
|
76
|
+
const entries = [];
|
|
77
|
+
const invalidTracks = [];
|
|
78
|
+
if (existsSync(trackDir)) {
|
|
79
|
+
walkTracks(projectRoot, trackDir, entries, invalidTracks);
|
|
80
|
+
}
|
|
81
|
+
const lines = [
|
|
82
|
+
"# Tracks Index",
|
|
83
|
+
"",
|
|
84
|
+
"Auto-generated by `waypoint sync` / `waypoint doctor`. Read active trackers when resuming long-running work.",
|
|
85
|
+
"",
|
|
86
|
+
"## .waypoint/track/",
|
|
87
|
+
"",
|
|
88
|
+
];
|
|
89
|
+
if (entries.length === 0) {
|
|
90
|
+
lines.push("No tracker files found.");
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
for (const entry of entries.sort((a, b) => a.path.localeCompare(b.path))) {
|
|
94
|
+
lines.push(`- **${entry.path}** — [${entry.status}] ${entry.summary}`);
|
|
95
|
+
lines.push(` Read when: ${entry.readWhen.join("; ")}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
lines.push("");
|
|
99
|
+
return {
|
|
100
|
+
content: `${lines.join("\n")}`,
|
|
101
|
+
invalidTracks,
|
|
102
|
+
activeTrackPaths: entries
|
|
103
|
+
.filter((entry) => ACTIVE_TRACK_STATUSES.has(entry.status))
|
|
104
|
+
.map((entry) => entry.path)
|
|
105
|
+
.sort((a, b) => a.localeCompare(b)),
|
|
106
|
+
};
|
|
107
|
+
}
|
package/package.json
CHANGED
|
@@ -7,10 +7,7 @@ description: Verify a user-facing feature by trying to break it on purpose inste
|
|
|
7
7
|
|
|
8
8
|
Use this skill to attack the feature like an impatient, confused, or careless user.
|
|
9
9
|
|
|
10
|
-
This is
|
|
11
|
-
|
|
12
|
-
- `e2e-verify` proves the intended flow works end to end.
|
|
13
|
-
- `break-it-qa` tries to make the feature fail through invalid, interrupted, stale, repeated, or out-of-order interactions.
|
|
10
|
+
This skill is for adversarial manual QA. It tries to make the feature fail through invalid, interrupted, stale, repeated, or out-of-order interactions instead of only proving the happy path works.
|
|
14
11
|
|
|
15
12
|
## Step 1: Ask The Three Setup Questions
|
|
16
13
|
|
|
@@ -11,7 +11,9 @@ This skill owns one job: inspect the specific code the user points at, map it ag
|
|
|
11
11
|
|
|
12
12
|
## Step 1: Load The Right Scope
|
|
13
13
|
|
|
14
|
-
- Read
|
|
14
|
+
- Read the repo's routed code guide.
|
|
15
|
+
- In standard Waypoint repos, use `.waypoint/docs/code-guide.md`.
|
|
16
|
+
- If the repo routes the code guide somewhere else, follow the repo's own docs and routing instead of assuming another fixed path.
|
|
15
17
|
- Read only the files, routes, tests, contracts, and nearby docs needed to understand the specific feature or slice under review.
|
|
16
18
|
- If the scope is ambiguous, resolve it to a concrete file set, feature path, or commit-sized change surface before auditing.
|
|
17
19
|
|
|
@@ -45,6 +47,8 @@ Skip rules that genuinely do not apply, but say that you skipped them.
|
|
|
45
47
|
|
|
46
48
|
This skill is narrower than `pre-pr-hygiene`. Use that other skill for broader ship-readiness.
|
|
47
49
|
|
|
50
|
+
If this audit produces a large remediation campaign, create or update a tracker under `.waypoint/track/` before switching into implementation so the fix list does not live only in chat.
|
|
51
|
+
|
|
48
52
|
## Step 4: Verify Evidence
|
|
49
53
|
|
|
50
54
|
Ground each finding in the actual code.
|
|
@@ -36,6 +36,8 @@ The plan belongs in the repo, not only in chat.
|
|
|
36
36
|
- Make sure the doc remains discoverable through the routed docs layer.
|
|
37
37
|
- In chat, return only a concise summary plus the path to the plan doc.
|
|
38
38
|
|
|
39
|
+
If the planned implementation will be large, multi-step, or likely to span multiple sessions, also create or update a tracker under `.waypoint/track/` and link it from `WORKSPACE.md` before implementation begins.
|
|
40
|
+
|
|
39
41
|
## The Core Loop
|
|
40
42
|
|
|
41
43
|
```
|
|
@@ -16,7 +16,9 @@ Before the hygiene pass:
|
|
|
16
16
|
3. Read `.waypoint/WORKSPACE.md`
|
|
17
17
|
4. Read `.waypoint/context/MANIFEST.md`
|
|
18
18
|
5. Read every file listed in that manifest
|
|
19
|
-
6. Read
|
|
19
|
+
6. Read the repo's routed code guide and the routed docs relevant to the area being shipped
|
|
20
|
+
|
|
21
|
+
In standard Waypoint repos, the code guide lives at `.waypoint/docs/code-guide.md`. If the repo routes it somewhere else, follow the repo's own docs and routing instead of assuming another fixed path.
|
|
20
22
|
|
|
21
23
|
## Step 1: Audit The Whole Change Surface
|
|
22
24
|
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: work-tracker
|
|
3
|
+
description: Create or maintain a durable tracker under `.waypoint/track/` for large multi-step work. Use when implementation will span multiple sessions, when an audit or review produces many fix items, when verification has a long checklist, or whenever `WORKSPACE.md` would become too detailed if it tried to hold the whole execution log.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Work Tracker
|
|
7
|
+
|
|
8
|
+
Use this skill when the work is too large, too long-running, or too itemized to live safely in `WORKSPACE.md`.
|
|
9
|
+
|
|
10
|
+
This skill owns the execution tracker layer:
|
|
11
|
+
|
|
12
|
+
- create or update `.waypoint/track/<slug>.md`
|
|
13
|
+
- keep `WORKSPACE.md` pointing at the active tracker
|
|
14
|
+
- move detailed checklists and progress into the tracker instead of bloating the workspace
|
|
15
|
+
|
|
16
|
+
## Read First
|
|
17
|
+
|
|
18
|
+
Before tracking:
|
|
19
|
+
|
|
20
|
+
1. Read `.waypoint/SOUL.md`
|
|
21
|
+
2. Read `.waypoint/agent-operating-manual.md`
|
|
22
|
+
3. Read `.waypoint/WORKSPACE.md`
|
|
23
|
+
4. Read `.waypoint/context/MANIFEST.md`
|
|
24
|
+
5. Read every file listed in that manifest
|
|
25
|
+
6. Read `.waypoint/track/README.md`
|
|
26
|
+
|
|
27
|
+
## When A Tracker Is Required
|
|
28
|
+
|
|
29
|
+
Create or update a tracker when any of these are true:
|
|
30
|
+
|
|
31
|
+
- the work will likely span multiple sessions
|
|
32
|
+
- there are many actionable items to implement
|
|
33
|
+
- an audit, QA pass, or review produced a remediation campaign
|
|
34
|
+
- verification requires a substantial checklist
|
|
35
|
+
- `WORKSPACE.md` would become noisy if it carried all the detail
|
|
36
|
+
|
|
37
|
+
Small, single-shot work does not need a tracker.
|
|
38
|
+
|
|
39
|
+
## Step 1: Choose The Tracker File
|
|
40
|
+
|
|
41
|
+
- Use `.waypoint/track/<kebab-case-slug>.md`.
|
|
42
|
+
- If a relevant tracker already exists, update it instead of creating a competing one.
|
|
43
|
+
- Keep one tracker per coherent workstream, not one tracker per tiny edit.
|
|
44
|
+
|
|
45
|
+
## Step 2: Set The Frontmatter
|
|
46
|
+
|
|
47
|
+
Trackers need:
|
|
48
|
+
|
|
49
|
+
```yaml
|
|
50
|
+
---
|
|
51
|
+
summary: One-line description
|
|
52
|
+
last_updated: "2026-03-13 11:38 PDT"
|
|
53
|
+
status: active
|
|
54
|
+
read_when:
|
|
55
|
+
- resuming this workstream
|
|
56
|
+
---
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
Valid statuses:
|
|
60
|
+
|
|
61
|
+
- `active`
|
|
62
|
+
- `blocked`
|
|
63
|
+
- `paused`
|
|
64
|
+
- `done`
|
|
65
|
+
- `archived`
|
|
66
|
+
|
|
67
|
+
Use `active` unless there is a clear reason not to.
|
|
68
|
+
|
|
69
|
+
## Step 3: Structure The Tracker
|
|
70
|
+
|
|
71
|
+
A good tracker usually includes:
|
|
72
|
+
|
|
73
|
+
- `Goal`
|
|
74
|
+
- `Source`
|
|
75
|
+
- `Current State`
|
|
76
|
+
- `Next`
|
|
77
|
+
- `Workstreams`
|
|
78
|
+
- `Verification`
|
|
79
|
+
- `Decisions`
|
|
80
|
+
- `Notes`
|
|
81
|
+
|
|
82
|
+
Use checklists when there are many concrete items. Use timestamped bullets for materially revised state.
|
|
83
|
+
|
|
84
|
+
## Step 4: Link It From The Workspace
|
|
85
|
+
|
|
86
|
+
Add or update a bullet under `## Active Trackers` in `.waypoint/WORKSPACE.md` that points at the tracker path and states the current phase or next step.
|
|
87
|
+
|
|
88
|
+
`WORKSPACE.md` should answer "what matters right now?"
|
|
89
|
+
The tracker should answer "what exactly is happening across the whole workstream?"
|
|
90
|
+
|
|
91
|
+
## Step 5: Maintain It During Execution
|
|
92
|
+
|
|
93
|
+
- Update `last_updated` whenever you materially change the tracker.
|
|
94
|
+
- Mark completed items done instead of deleting the record.
|
|
95
|
+
- Add blockers, new tasks, and verification status as the work evolves.
|
|
96
|
+
- When the workstream finishes, set `status: done` or `status: archived`.
|
|
97
|
+
|
|
98
|
+
Do not let the tracker become fiction. It must match reality.
|
|
99
|
+
|
|
100
|
+
## Step 6: Distill Durable Knowledge
|
|
101
|
+
|
|
102
|
+
If the tracker reveals durable architecture, rollout, or debugging knowledge, move that durable knowledge into `.waypoint/docs/` and leave the tracker focused on execution state.
|
|
103
|
+
|
|
104
|
+
## Report
|
|
105
|
+
|
|
106
|
+
When you create or update a tracker, report:
|
|
107
|
+
|
|
108
|
+
- the tracker path
|
|
109
|
+
- the current status
|
|
110
|
+
- what `WORKSPACE.md` now points to
|
|
@@ -39,6 +39,7 @@ Ask one question:
|
|
|
39
39
|
|
|
40
40
|
Keep only the answer to that question in the workspace. Usually that means:
|
|
41
41
|
|
|
42
|
+
- active tracker pointers
|
|
42
43
|
- current focus
|
|
43
44
|
- latest verified state
|
|
44
45
|
- open blockers or risks
|
|
@@ -52,6 +53,7 @@ Usually remove or collapse:
|
|
|
52
53
|
- validation transcripts
|
|
53
54
|
- old milestone history
|
|
54
55
|
- duplicated durable documentation
|
|
56
|
+
- per-item implementation checklists that belong in `.waypoint/track/`
|
|
55
57
|
|
|
56
58
|
Compression is documentation quality, not data loss.
|
|
57
59
|
|
|
@@ -66,6 +68,7 @@ When editing the workspace:
|
|
|
66
68
|
5. Do not turn the workspace into an archive, changelog, or debug notebook.
|
|
67
69
|
|
|
68
70
|
If durable context is missing from `.waypoint/docs/`, add or refresh the smallest coherent routed doc before removing it from the workspace.
|
|
71
|
+
If execution detail is still active but too large for the workspace, move it into `.waypoint/track/` instead of deleting it.
|
|
69
72
|
|
|
70
73
|
## Step 4: Protect User-Owned State
|
|
71
74
|
|
|
@@ -33,8 +33,9 @@ Do not skip this sequence.
|
|
|
33
33
|
The repository should contain the context the next agent needs.
|
|
34
34
|
|
|
35
35
|
- `.waypoint/WORKSPACE.md` is the live operational record: in progress, current state, next steps
|
|
36
|
+
- `.waypoint/track/` is the durable execution-tracking layer for active long-running work
|
|
36
37
|
- `.waypoint/docs/` is the durable project memory: architecture, decisions, integration notes, debugging knowledge, and durable plans
|
|
37
|
-
- `.waypoint/context/` is the generated session context bundle: current git/PR/doc index state
|
|
38
|
+
- `.waypoint/context/` is the generated session context bundle: current git/PR/doc/track index state
|
|
38
39
|
|
|
39
40
|
If something important lives only in your head or in the chat transcript, the repo is under-documented.
|
|
40
41
|
|
|
@@ -43,8 +44,10 @@ If something important lives only in your head or in the chat transcript, the re
|
|
|
43
44
|
- Read code before editing it.
|
|
44
45
|
- Follow the repo's documented patterns when they are healthy.
|
|
45
46
|
- Update `.waypoint/WORKSPACE.md` as live execution state when progress meaningfully changes. In multi-topic sections, prefix new or materially revised bullets with a local timestamp like `[2026-03-06 20:10 PST]`.
|
|
47
|
+
- For large multi-step work, create or update a tracker in `.waypoint/track/`, keep detailed execution state there, and point at it from `## Active Trackers` in `.waypoint/WORKSPACE.md`.
|
|
46
48
|
- Update `.waypoint/docs/` when durable knowledge changes, and refresh each changed routable doc's `last_updated` field.
|
|
47
49
|
- Rebuild `.waypoint/DOCS_INDEX.md` whenever routable docs change.
|
|
50
|
+
- Rebuild `.waypoint/TRACKS_INDEX.md` whenever tracker files change.
|
|
48
51
|
- Use the repo-local skills and optional reviewer agents instead of improvising from scratch.
|
|
49
52
|
- Do not kill long-running subagents or reviewer agents just because they are slow. Wait unless they are clearly stuck, failed, or the user redirects the work.
|
|
50
53
|
|
|
@@ -64,16 +67,13 @@ Do not document every trivial implementation detail. Document the non-obvious, d
|
|
|
64
67
|
## When to use Waypoint skills
|
|
65
68
|
|
|
66
69
|
- `planning` for non-trivial changes
|
|
67
|
-
- `
|
|
68
|
-
- `observability-audit` when production debugging signals look weak
|
|
69
|
-
- `ux-states-audit` when async/data-driven UI likely lacks loading, empty, or error states
|
|
70
|
+
- `work-tracker` when large multi-step work needs durable progress tracking in `.waypoint/track/`
|
|
70
71
|
- `docs-sync` when routed docs may be stale, missing, or inconsistent with the codebase
|
|
71
72
|
- `code-guide-audit` when a specific feature or file set needs a targeted coding-guide compliance check
|
|
72
73
|
- `break-it-qa` when a browser-facing feature should be attacked with invalid inputs, refreshes, repeated clicks, wrong action order, or other adversarial manual QA
|
|
73
74
|
- `workspace-compress` after meaningful chunks, before stopping, and before review when the live handoff needs compression
|
|
74
75
|
- `pre-pr-hygiene` before pushing or opening/updating a PR for substantial work
|
|
75
76
|
- `pr-review` once a PR has active review comments or automated review in progress
|
|
76
|
-
- `e2e-verify` for major user-facing or cross-system changes that need manual end-to-end verification
|
|
77
77
|
|
|
78
78
|
## When to use the optional reviewer agents
|
|
79
79
|
|
|
@@ -83,14 +83,15 @@ If the repo was initialized with Waypoint roles enabled, use them as focused sec
|
|
|
83
83
|
- `code-health-reviewer` for maintainability drift
|
|
84
84
|
- `plan-reviewer` to challenge weak implementation plans before execution
|
|
85
85
|
|
|
86
|
-
##
|
|
86
|
+
## Review Loop
|
|
87
87
|
|
|
88
|
-
If Waypoint's optional roles are enabled
|
|
88
|
+
If Waypoint's optional roles are enabled, run the reviewer pair after a meaningful reviewable implementation chunk, not just as a reflex after every tiny commit.
|
|
89
89
|
|
|
90
|
-
1. Launch `code-reviewer` and `code-health-reviewer` in parallel as background, read-only reviewers.
|
|
91
|
-
2.
|
|
92
|
-
3.
|
|
93
|
-
4.
|
|
90
|
+
1. Launch `code-reviewer` and `code-health-reviewer` in parallel as background, read-only reviewers once there is a coherent slice of work worth reviewing.
|
|
91
|
+
2. If you have a recent self-authored commit that cleanly represents that slice, use it as the default review scope anchor. Otherwise scope the reviewers to the current changed slice.
|
|
92
|
+
3. Widen only when surrounding files are needed to validate a finding.
|
|
93
|
+
4. Do not call the work finished before you read both reviewer results.
|
|
94
|
+
5. Fix real findings, rerun the relevant verification, update workspace/docs if needed, and make a follow-up commit when fixes change the repo.
|
|
94
95
|
|
|
95
96
|
## Quality bar
|
|
96
97
|
|
|
@@ -59,7 +59,13 @@ Do not create findings for:
|
|
|
59
59
|
|
|
60
60
|
## Scope
|
|
61
61
|
|
|
62
|
-
In Waypoint's default
|
|
62
|
+
In Waypoint's default review loop, start with the reviewable slice the main agent hands you.
|
|
63
|
+
|
|
64
|
+
- If there is a recent self-authored commit that cleanly represents the slice, use that commit as the default scope anchor.
|
|
65
|
+
- Otherwise, start from the current changed files or diff under review.
|
|
66
|
+
- Widen only when related files are needed to validate a maintainability issue.
|
|
67
|
+
|
|
68
|
+
Focus on:
|
|
63
69
|
|
|
64
70
|
- recently changed files
|
|
65
71
|
- their importers
|
|
@@ -41,7 +41,11 @@ Not:
|
|
|
41
41
|
|
|
42
42
|
### 1. Get the Changes
|
|
43
43
|
|
|
44
|
-
In Waypoint's default
|
|
44
|
+
In Waypoint's default review loop, start with the reviewable slice the main agent hands you.
|
|
45
|
+
|
|
46
|
+
- If there is a recent self-authored commit that cleanly represents the slice, use that commit as the default scope anchor.
|
|
47
|
+
- Otherwise, start from the current changed files or diff the main agent is asking you to review.
|
|
48
|
+
- Widen only as needed.
|
|
45
49
|
|
|
46
50
|
### 2. Deep Research
|
|
47
51
|
|
|
@@ -13,6 +13,8 @@ Put the durable context here that the next agent will need to continue the work:
|
|
|
13
13
|
|
|
14
14
|
These are **project docs**, not Waypoint internals.
|
|
15
15
|
|
|
16
|
+
Do not use `.waypoint/docs/` as the execution tracker layer for active long-running work. That belongs under `.waypoint/track/`.
|
|
17
|
+
|
|
16
18
|
Every routable doc needs YAML frontmatter:
|
|
17
19
|
|
|
18
20
|
```yaml
|