vouchington-tooling 0.22.0 → 0.23.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 +34 -0
- package/dist/markdown/details-scope.d.mts +13 -0
- package/dist/markdown/details-scope.mjs +73 -0
- package/dist/markdown/document-sections.d.mts +3 -0
- package/dist/markdown/document-sections.mjs +64 -0
- package/dist/markdown/document-types.d.mts +21 -0
- package/dist/markdown/document-types.mjs +1 -0
- package/dist/markdown/index.d.mts +3 -0
- package/dist/markdown/index.mjs +2 -0
- package/dist/markdown/validate-sections.d.mts +3 -0
- package/dist/markdown/validate-sections.mjs +34 -0
- package/package.json +1 -1
- package/skills/agent-workflow/SKILL.md +19 -24
- package/skills/agent-workflow/references/evidence-sweep.md +4 -0
- package/skills/agent-workflow/references/implementation-and-review.md +2 -7
- package/skills/agent-workflow/references/implementation.md +9 -2
- package/skills/agent-workflow/references/review.md +3 -0
- package/skills/backend-vitest-test-authoring/SKILL.md +5 -1
- package/skills/blackboard/SKILL.md +5 -1
- package/skills/dependabot/SKILL.md +5 -1
- package/skills/dotnet-test-authoring/SKILL.md +5 -1
- package/skills/git-commit-checklist/SKILL.md +9 -1
- package/skills/github-actions-authoring/SKILL.md +5 -1
- package/skills/github-actions-checklist/SKILL.md +9 -1
- package/skills/github-issue/SKILL.md +5 -1
- package/skills/manifest.json +52 -41
- package/skills/nextjs-vitest-test-authoring/SKILL.md +5 -1
- package/skills/npm-publishing/SKILL.md +5 -1
- package/skills/organize-github-issues/SKILL.md +5 -1
- package/skills/package-json-checklist/SKILL.md +5 -1
- package/skills/planning/SKILL.md +16 -11
- package/skills/planning/references/impact-discovery.md +2 -0
- package/skills/playwright-authoring/SKILL.md +5 -1
- package/skills/postgres-node-performance-tuning/SKILL.md +5 -1
- package/skills/postgres-partitioning-uuid-v7/SKILL.md +5 -1
- package/skills/pr-description/SKILL.md +49 -11
- package/skills/pr-description/references/examples.md +136 -0
- package/skills/retrospective/SKILL.md +5 -1
- package/skills/retrospective-distill/SKILL.md +5 -1
- package/skills/review-ci-logs/SKILL.md +15 -1
- package/skills/review-github-issue-taxonomy/SKILL.md +5 -1
- package/skills/revisit-followups/SKILL.md +5 -1
- package/skills/stacked-prs/SKILL.md +5 -1
- package/skills/static-analysis-checklist/SKILL.md +5 -1
- package/skills/storybook-authoring/SKILL.md +5 -1
- package/skills/swift-test-authoring/SKILL.md +5 -1
- package/skills/test-authoring/SKILL.md +5 -1
- package/skills/test-authoring/references/core-practice.md +2 -0
- package/skills/vitest-test-authoring/SKILL.md +5 -1
package/README.md
CHANGED
|
@@ -338,6 +338,32 @@ shape, including short table delimiters. `extractLooseMarkdownTableRows` is inte
|
|
|
338
338
|
recovery for malformed pipe rows; callers supply table positions to exclude and retain ownership of
|
|
339
339
|
their policy interpretation.
|
|
340
340
|
|
|
341
|
+
`parseMarkdownSections` returns visible root H2 sections, their exact original `content`,
|
|
342
|
+
`startOffset`/`endOffset` source ranges, heading line, and `hasVisibleContent`. Heading text is
|
|
343
|
+
normalized by collapsing whitespace and removing Markdown formatting/comments and collapsed text; matching remains
|
|
344
|
+
case-sensitive. Source offsets are JavaScript string offsets, so `source.slice(startOffset,
|
|
345
|
+
endOffset)` preserves Unicode and CRLF exactly. Sections end at the next visible root H2 or EOF;
|
|
346
|
+
fenced examples, quoted headings, and headings inside `<details>` do not create boundaries.
|
|
347
|
+
|
|
348
|
+
```ts
|
|
349
|
+
import { parseMarkdownSections, validateMarkdownSections } from 'vouchington-tooling/markdown'
|
|
350
|
+
|
|
351
|
+
const document = parseMarkdownSections(body)
|
|
352
|
+
const diagnostics = validateMarkdownSections(document, {
|
|
353
|
+
requiredHeadings: ['Summary', 'Impact'],
|
|
354
|
+
})
|
|
355
|
+
const relatedIssues = document.sections.find((section) => section.heading === 'Related issues')
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
The caller owns required headings. Validation returns diagnostics with `code`, `message`, and
|
|
359
|
+
optional `heading`/`line`, for `missing-heading`, `duplicate-heading`, `empty-section`, or
|
|
360
|
+
`malformed-details`. Nonempty visible paragraphs, lists, and populated table bodies satisfy the
|
|
361
|
+
content check; comments, fenced/indented code, images, disclosure labels, and collapsed-only content
|
|
362
|
+
do not. The parser tracks balanced nested details/summary tags in GFM HTML nodes, accepting optional
|
|
363
|
+
summaries and quoted attributes; it is not a general HTML validator or sanitizer. It never rewrites
|
|
364
|
+
the input or infers semantic relevance, cost, schema conformance, or failure causes. The existing
|
|
365
|
+
`markdownSectionBetweenHeadings` API retains its original boundary behavior.
|
|
366
|
+
|
|
341
367
|
`agent-harness-config` merges classifier-auto and sandbox keys into Claude, Codex, Grok, and Cursor
|
|
342
368
|
config files. See [docs/agent-harness-config.md](./docs/agent-harness-config.md). `--global` updates
|
|
343
369
|
home-directory configs; `--repo` updates a checkout. It does not copy allowlists, hooks, or plugins.
|
|
@@ -462,6 +488,14 @@ Codex plugins. The package build materializes plugin source trees without hand-c
|
|
|
462
488
|
and writes sorted schema-v1 provenance to `skills/manifest.json`.
|
|
463
489
|
Each manifest entry may declare its ordered `prerequisites`; ordinary Markdown links remain
|
|
464
490
|
cross-references and never cause additional skills to be linked.
|
|
491
|
+
Prerequisites ensure installation closure; they do not require eagerly reading every installed
|
|
492
|
+
skill. Follow the invoked skill's conditional instructions for the current task.
|
|
493
|
+
|
|
494
|
+
Canonical entrypoints direct agents to applicable local instructions and adapters before using
|
|
495
|
+
portable policy. Local `AGENTS.md` may name an adapter alias; an already-read canonical skill or
|
|
496
|
+
adapter is not loaded again. `linkSkill` still links files only: it does not load instructions,
|
|
497
|
+
resolve local aliases, or execute a workflow. Validate observed agent loading separately from
|
|
498
|
+
installation and packaged-resource checks.
|
|
465
499
|
|
|
466
500
|
Use `readSkillManifest(skillsRoot)` to discover installed skills or
|
|
467
501
|
`linkSkill({ name, sourceRoot, targetRoot })` to link one into an explicit consumer directory. The
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { MarkdownSectionsDiagnostic } from './document-types.mts';
|
|
2
|
+
/** Tracks disclosure tags from HTML nodes, never from fenced code or Markdown comments. */
|
|
3
|
+
export declare class DetailsScope {
|
|
4
|
+
private readonly markdown;
|
|
5
|
+
readonly diagnostics: MarkdownSectionsDiagnostic[];
|
|
6
|
+
private readonly frames;
|
|
7
|
+
constructor(markdown: string);
|
|
8
|
+
get visible(): boolean;
|
|
9
|
+
acceptHtml(html: string, startOffset: number): void;
|
|
10
|
+
finish(): void;
|
|
11
|
+
private acceptTag;
|
|
12
|
+
private problem;
|
|
13
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/** Tracks disclosure tags from HTML nodes, never from fenced code or Markdown comments. */
|
|
2
|
+
export class DetailsScope {
|
|
3
|
+
markdown;
|
|
4
|
+
diagnostics = [];
|
|
5
|
+
frames = [];
|
|
6
|
+
constructor(markdown) {
|
|
7
|
+
this.markdown = markdown;
|
|
8
|
+
}
|
|
9
|
+
get visible() {
|
|
10
|
+
return this.frames.length === 0;
|
|
11
|
+
}
|
|
12
|
+
acceptHtml(html, startOffset) {
|
|
13
|
+
const tokens = /<!--[\s\S]*?(?:-->|$)|<\/?[a-z][a-z\d:-]*(?:[^"'<>]|"[^"]*"|'[^']*')*>/giu;
|
|
14
|
+
for (const token of html.matchAll(tokens)) {
|
|
15
|
+
if (token[0].startsWith('<!--'))
|
|
16
|
+
continue;
|
|
17
|
+
const tag = /^<(\/?)([a-z][a-z\d:-]*)/iu.exec(token[0]);
|
|
18
|
+
const name = tag[2].toLowerCase();
|
|
19
|
+
if (name !== 'details' && name !== 'summary')
|
|
20
|
+
continue;
|
|
21
|
+
const line = this.markdown.slice(0, startOffset + token.index).split('\n').length;
|
|
22
|
+
if (/\/\s*>$/u.test(token[0])) {
|
|
23
|
+
this.problem(line, `${tag[2]} cannot be self-closing`);
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
this.acceptTag(name, tag[1] === '/', line);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
finish() {
|
|
30
|
+
for (const frame of this.frames)
|
|
31
|
+
this.problem(frame.line, 'details has no closing tag');
|
|
32
|
+
}
|
|
33
|
+
acceptTag(name, closing, line) {
|
|
34
|
+
if (name === 'details') {
|
|
35
|
+
if (!closing) {
|
|
36
|
+
if (this.frames.at(-1)?.summary === 'open') {
|
|
37
|
+
this.problem(line, 'details cannot open inside summary');
|
|
38
|
+
}
|
|
39
|
+
this.frames.push({ line, summary: 'absent' });
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const frame = this.frames.pop();
|
|
43
|
+
if (!frame)
|
|
44
|
+
this.problem(line, 'details closes without an opening tag');
|
|
45
|
+
else if (frame.summary === 'open')
|
|
46
|
+
this.problem(line, 'summary has no closing tag');
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
const frame = this.frames.at(-1);
|
|
50
|
+
if (!frame) {
|
|
51
|
+
this.problem(line, 'summary must be inside details');
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
if (closing) {
|
|
55
|
+
if (frame.summary !== 'open')
|
|
56
|
+
this.problem(line, 'summary closes without an opening tag');
|
|
57
|
+
else
|
|
58
|
+
frame.summary = 'closed';
|
|
59
|
+
}
|
|
60
|
+
else if (frame.summary !== 'absent') {
|
|
61
|
+
this.problem(line, 'details contains more than one summary or a nested summary');
|
|
62
|
+
}
|
|
63
|
+
else
|
|
64
|
+
frame.summary = 'open';
|
|
65
|
+
}
|
|
66
|
+
problem(line, reason) {
|
|
67
|
+
this.diagnostics.push({
|
|
68
|
+
code: 'malformed-details',
|
|
69
|
+
line,
|
|
70
|
+
message: `Malformed details: ${reason}.`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { parseGfmMarkdown } from './ast.mjs';
|
|
2
|
+
import { DetailsScope } from './details-scope.mjs';
|
|
3
|
+
/** Parses visible root H2 sections while retaining exact source ranges and disclosure scope. */
|
|
4
|
+
export function parseMarkdownSections(markdown) {
|
|
5
|
+
const sections = [];
|
|
6
|
+
const scope = new DetailsScope(markdown);
|
|
7
|
+
let current;
|
|
8
|
+
const visit = (node, collectText) => {
|
|
9
|
+
if (node.type === 'html') {
|
|
10
|
+
scope.acceptHtml(node.value, node.position.start.offset);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (node.type === 'code' || node.type === 'image')
|
|
14
|
+
return;
|
|
15
|
+
if (collectText &&
|
|
16
|
+
scope.visible &&
|
|
17
|
+
current &&
|
|
18
|
+
(node.type === 'text' || node.type === 'inlineCode') &&
|
|
19
|
+
node.value.trim()) {
|
|
20
|
+
current.hasVisibleContent = true;
|
|
21
|
+
}
|
|
22
|
+
if (!('children' in node))
|
|
23
|
+
return;
|
|
24
|
+
for (const [index, child] of node.children.entries()) {
|
|
25
|
+
visit(child, collectText && node.type !== 'heading' && (node.type !== 'table' || index > 0));
|
|
26
|
+
}
|
|
27
|
+
};
|
|
28
|
+
for (const node of parseGfmMarkdown(markdown).children) {
|
|
29
|
+
if (node.type === 'heading') {
|
|
30
|
+
const wasVisible = scope.visible;
|
|
31
|
+
const heading = headingText(node, scope).replace(/\s+/gu, ' ').trim();
|
|
32
|
+
if (node.depth === 2 && wasVisible && heading) {
|
|
33
|
+
if (current)
|
|
34
|
+
current.endOffset = node.position.start.offset;
|
|
35
|
+
current = {
|
|
36
|
+
heading,
|
|
37
|
+
content: '',
|
|
38
|
+
startOffset: node.position.end.offset,
|
|
39
|
+
endOffset: markdown.length,
|
|
40
|
+
line: node.position.start.line,
|
|
41
|
+
hasVisibleContent: false,
|
|
42
|
+
};
|
|
43
|
+
sections.push(current);
|
|
44
|
+
}
|
|
45
|
+
continue;
|
|
46
|
+
}
|
|
47
|
+
visit(node, node.type === 'paragraph' || node.type === 'list' || node.type === 'table');
|
|
48
|
+
}
|
|
49
|
+
scope.finish();
|
|
50
|
+
for (const section of sections)
|
|
51
|
+
section.content = markdown.slice(section.startOffset, section.endOffset);
|
|
52
|
+
return { sections, diagnostics: scope.diagnostics };
|
|
53
|
+
}
|
|
54
|
+
function headingText(node, scope) {
|
|
55
|
+
if (node.type === 'html') {
|
|
56
|
+
scope.acceptHtml(node.value, node.position.start.offset);
|
|
57
|
+
return '';
|
|
58
|
+
}
|
|
59
|
+
if (node.type === 'text' || node.type === 'inlineCode')
|
|
60
|
+
return scope.visible ? node.value : '';
|
|
61
|
+
if (!('children' in node))
|
|
62
|
+
return '';
|
|
63
|
+
return node.children.map((child) => headingText(child, scope)).join('');
|
|
64
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type MarkdownVisibleSection = {
|
|
2
|
+
heading: string;
|
|
3
|
+
content: string;
|
|
4
|
+
startOffset: number;
|
|
5
|
+
endOffset: number;
|
|
6
|
+
line: number;
|
|
7
|
+
hasVisibleContent: boolean;
|
|
8
|
+
};
|
|
9
|
+
export type MarkdownSectionsDiagnostic = {
|
|
10
|
+
code: 'missing-heading' | 'duplicate-heading' | 'empty-section' | 'malformed-details';
|
|
11
|
+
message: string;
|
|
12
|
+
heading?: string;
|
|
13
|
+
line?: number;
|
|
14
|
+
};
|
|
15
|
+
export type MarkdownSectionsDocument = {
|
|
16
|
+
sections: MarkdownVisibleSection[];
|
|
17
|
+
diagnostics: MarkdownSectionsDiagnostic[];
|
|
18
|
+
};
|
|
19
|
+
export type ValidateMarkdownSectionsOptions = {
|
|
20
|
+
requiredHeadings: readonly string[];
|
|
21
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
export { findMarkdownNode, findMarkdownNodes, parseGfmMarkdown, walkMarkdown } from './ast.mts';
|
|
2
2
|
export { extractLooseMarkdownTableRows } from './loose-pipe-rows.mts';
|
|
3
|
+
export { parseMarkdownSections } from './document-sections.mts';
|
|
4
|
+
export { validateMarkdownSections } from './validate-sections.mts';
|
|
5
|
+
export type { MarkdownVisibleSection, MarkdownSectionsDiagnostic, MarkdownSectionsDocument, ValidateMarkdownSectionsOptions, } from './document-types.mts';
|
|
3
6
|
export { markdownSectionBetweenHeadings } from './sections.mts';
|
|
4
7
|
export { extractMarkdownTables, parseMarkdownTables } from './tables.mts';
|
|
5
8
|
export { markdownNodeText } from './text.mts';
|
package/dist/markdown/index.mjs
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { findMarkdownNode, findMarkdownNodes, parseGfmMarkdown, walkMarkdown } from './ast.mjs';
|
|
2
2
|
export { extractLooseMarkdownTableRows } from './loose-pipe-rows.mjs';
|
|
3
|
+
export { parseMarkdownSections } from './document-sections.mjs';
|
|
4
|
+
export { validateMarkdownSections } from './validate-sections.mjs';
|
|
3
5
|
export { markdownSectionBetweenHeadings } from './sections.mjs';
|
|
4
6
|
export { extractMarkdownTables, parseMarkdownTables } from './tables.mjs';
|
|
5
7
|
export { markdownNodeText } from './text.mjs';
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { MarkdownSectionsDiagnostic, MarkdownSectionsDocument, ValidateMarkdownSectionsOptions } from './document-types.mts';
|
|
2
|
+
/** Validates caller-owned headings and visible core content without inferring semantic relevance. */
|
|
3
|
+
export declare function validateMarkdownSections(document: MarkdownSectionsDocument, options: ValidateMarkdownSectionsOptions): MarkdownSectionsDiagnostic[];
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** Validates caller-owned headings and visible core content without inferring semantic relevance. */
|
|
2
|
+
export function validateMarkdownSections(document, options) {
|
|
3
|
+
const diagnostics = [...document.diagnostics];
|
|
4
|
+
for (const heading of options.requiredHeadings) {
|
|
5
|
+
const sections = document.sections.filter((section) => section.heading === heading);
|
|
6
|
+
if (sections.length === 0) {
|
|
7
|
+
diagnostics.push({
|
|
8
|
+
code: 'missing-heading',
|
|
9
|
+
heading,
|
|
10
|
+
message: `Missing required section: ${heading}.`,
|
|
11
|
+
});
|
|
12
|
+
continue;
|
|
13
|
+
}
|
|
14
|
+
if (sections.length > 1) {
|
|
15
|
+
diagnostics.push({
|
|
16
|
+
code: 'duplicate-heading',
|
|
17
|
+
heading,
|
|
18
|
+
line: sections[1].line,
|
|
19
|
+
message: `Duplicate required section: ${heading}.`,
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
for (const section of sections) {
|
|
23
|
+
if (!section.hasVisibleContent) {
|
|
24
|
+
diagnostics.push({
|
|
25
|
+
code: 'empty-section',
|
|
26
|
+
heading,
|
|
27
|
+
line: section.line,
|
|
28
|
+
message: `Required section has no visible prose, list, or table content: ${heading}.`,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
return diagnostics;
|
|
34
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vouchington-tooling",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "Vouchington CLI and extractable tooling libraries.",
|
|
5
5
|
"homepage": "https://github.com/vouchington/vouchington-tooling/tree/main/packages/vouchington-tooling#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -1,35 +1,30 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: agent-workflow
|
|
3
|
-
description:
|
|
3
|
+
description: Implement and review repository changes within local policy.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Agent workflow
|
|
7
7
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
Read applicable `AGENTS.md` and their declared adapter alias, otherwise
|
|
9
|
+
`.agents/skills/agent-workflow/SKILL.md` from the repository root if present.
|
|
10
|
+
Local policy overrides these defaults; do not reload an already-read adapter or canonical skill.
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
file, then relevant documentation and tests. Apply the closest instruction only when rules
|
|
16
|
-
conflict, and treat all applicable local instructions as higher priority than this skill.
|
|
17
|
-
3. Confirm the accepted task's boundary. Reuse existing ownership and utilities; ask before
|
|
18
|
-
widening scope or making an irreversible external change.
|
|
19
|
-
4. Write a focused test first when behavior can be tested. Keep source, tests, docs, and generated
|
|
20
|
-
artifacts within the repository's stated size and formatting rules.
|
|
21
|
-
5. Run the focused checks, then the local commands required for the changed surface. Report skipped
|
|
22
|
-
checks with a concrete reason.
|
|
23
|
-
6. Review the diff for accidental files, secrets, generated output, broken documentation links,
|
|
24
|
-
and assumptions that belong in local instructions instead.
|
|
25
|
-
7. When feedback arrives on an open change, give every surfaced item a disposition and drive it to
|
|
26
|
-
closure before hand-off; do not leave items unaddressed or silently absorb or defer them.
|
|
12
|
+
Use before implementation. Inspect checkout status without discarding work; follow local branch,
|
|
13
|
+
worktree, contribution, and CI policy. Read every applicable `AGENTS.md` from the repository root
|
|
14
|
+
through changed files, plus relevant documentation and tests. Local instructions govern this skill.
|
|
27
15
|
|
|
28
|
-
|
|
29
|
-
[
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
16
|
+
Use [PR descriptions](../pr-description/SKILL.md) before creating or updating a pull request.
|
|
17
|
+
Diagnose failed CI with [CI-log review](../review-ci-logs/SKILL.md), then update confirmed harness
|
|
18
|
+
gaps before handoff. Keep those records after checks pass; routine local successes stay in the
|
|
19
|
+
evidence record.
|
|
20
|
+
|
|
21
|
+
- During implementation, use [implementation](references/implementation.md).
|
|
22
|
+
- Before handoff, use [evidence sweep](references/evidence-sweep.md).
|
|
23
|
+
- For review, use [review](references/review.md).
|
|
24
|
+
- For surfaced feedback, use [review response](references/review-response.md).
|
|
25
|
+
|
|
26
|
+
Load only the references required by the current phase. Keep scope changes explicit; a discovered
|
|
27
|
+
blocker or follow-up does not authorize widening the task.
|
|
33
28
|
|
|
34
29
|
Consumer wrapper or local instructions own: default branch, runner class, documentation root,
|
|
35
30
|
review system, merge policy, and command catalog.
|
|
@@ -6,3 +6,7 @@ finding: state the blocker, affected surface, and remaining risk.
|
|
|
6
6
|
|
|
7
7
|
Before handoff, compare the final diff to the accepted decision ledger and verify documentation,
|
|
8
8
|
generated output, and public contracts agree with the implementation.
|
|
9
|
+
|
|
10
|
+
When one semantic defect is found, search sibling call and write sites for the same shape; record
|
|
11
|
+
why remaining matches are safe. Keep large logs and analysis artifacts outside the agent context,
|
|
12
|
+
and report bounded findings and their evidence rather than raw payloads.
|
|
@@ -1,9 +1,4 @@
|
|
|
1
1
|
# Implementation and review
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
After focused validation, inspect the complete diff for accidental generated files, secret exposure,
|
|
7
|
-
dead paths, and documentation drift. Validate the public interface and failure paths, not only the
|
|
8
|
-
happy path. Before a reviewable commit, run the repository-required checks and state any skipped
|
|
9
|
-
checks with their concrete blocker.
|
|
3
|
+
Use [implementation](implementation.md) while editing, [evidence sweep](evidence-sweep.md) before
|
|
4
|
+
handoff, and [review](review.md) for an independent review.
|
|
@@ -1,8 +1,15 @@
|
|
|
1
1
|
# Implementation
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
For cross-cutting work, track accepted interface, data, validation, and ownership decisions that
|
|
4
|
+
could otherwise be lost during coding. Start from a failing behavioral test when practical and
|
|
5
5
|
complete the real path rather than adding placeholders or compatibility shims without a requirement.
|
|
6
6
|
|
|
7
7
|
When behavior changes, update the public contract, documentation, fixtures, and generated artifacts
|
|
8
8
|
that describe it. Keep local commands, branch policy, and release mechanics in the consumer wrapper.
|
|
9
|
+
|
|
10
|
+
Resolve rebase conflicts semantically: identify the upstream invariant, integrate both changes,
|
|
11
|
+
and rerun the tests for that invariant. Do not treat the conflict as a choice of whole-file versions.
|
|
12
|
+
|
|
13
|
+
Removing a deadline or abort bound needs a replacement on the same path, or evidence and a test
|
|
14
|
+
showing every caller supplies its own bound. When changing a policy table, check sibling rows for
|
|
15
|
+
contradictory conventions.
|
|
@@ -5,3 +5,6 @@ contract compatibility, failure paths, authorization, untrusted input, secrets,
|
|
|
5
5
|
boundaries. Remove dead paths and stale documentation rather than labeling them as legacy.
|
|
6
6
|
|
|
7
7
|
Record unresolved risk as an explicit accepted decision or follow-up, never as an unnoticed gap.
|
|
8
|
+
Check the pull-request description against the final behavior and audience impact. After CI
|
|
9
|
+
diagnosis, ensure confirmed local-verification gaps or local/CI mismatches and their correction
|
|
10
|
+
remain disclosed; passing checks do not erase the gap discovered earlier.
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: backend-vitest-test-authoring
|
|
3
|
-
description:
|
|
3
|
+
description: Test backend persistence, providers, services, and queues with Vitest.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Backend Vitest test authoring
|
|
7
7
|
|
|
8
|
+
Read applicable `AGENTS.md` and their declared adapter alias, otherwise
|
|
9
|
+
`.agents/skills/backend-vitest-test-authoring/SKILL.md` from the repository root if present.
|
|
10
|
+
Local policy overrides these defaults; do not reload an already-read adapter or canonical skill.
|
|
11
|
+
|
|
8
12
|
Apply [vitest-test-authoring](../vitest-test-authoring/SKILL.md) first.
|
|
9
13
|
|
|
10
14
|
- Exercise a real integration boundary only when the test environment controls its lifecycle.
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: blackboard
|
|
3
|
-
description: Record and retrieve
|
|
3
|
+
description: Record and retrieve contemporaneous findings in the repository journal.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Session journal
|
|
7
7
|
|
|
8
|
+
Read applicable `AGENTS.md` and their declared adapter alias, otherwise
|
|
9
|
+
`.agents/skills/blackboard/SKILL.md` from the repository root if present.
|
|
10
|
+
Local policy overrides these defaults; do not reload an already-read adapter or canonical skill.
|
|
11
|
+
|
|
8
12
|
Use when the current repository provides a journal, blackboard, or equivalent durable session
|
|
9
13
|
record. Read local `AGENTS.md` for the provider, credential, retention, and
|
|
10
14
|
subagent-identity rules.
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dependabot
|
|
3
|
-
description: Configure
|
|
3
|
+
description: Configure Dependabot coverage, grouping, cooldowns, and trusted automation.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Dependabot policy
|
|
7
7
|
|
|
8
|
+
Read applicable `AGENTS.md` and their declared adapter alias, otherwise
|
|
9
|
+
`.agents/skills/dependabot/SKILL.md` from the repository root if present.
|
|
10
|
+
Local policy overrides these defaults; do not reload an already-read adapter or canonical skill.
|
|
11
|
+
|
|
8
12
|
Read every applicable `AGENTS.md`, then the repository's dependency, CI, release,
|
|
9
13
|
and branch-protection docs. The consumer wrapper owns the accepted cooldown, package roots,
|
|
10
14
|
first-party publishers, manual-update exceptions, runner policy, required checks, and secret source.
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: dotnet-test-authoring
|
|
3
|
-
description:
|
|
3
|
+
description: Author .NET unit, application, and integration tests.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# .NET test authoring
|
|
7
7
|
|
|
8
|
+
Read applicable `AGENTS.md` and their declared adapter alias, otherwise
|
|
9
|
+
`.agents/skills/dotnet-test-authoring/SKILL.md` from the repository root if present.
|
|
10
|
+
Local policy overrides these defaults; do not reload an already-read adapter or canonical skill.
|
|
11
|
+
|
|
8
12
|
Apply [test-authoring](../test-authoring/SKILL.md).
|
|
9
13
|
|
|
10
14
|
- Place a test at the narrowest layer that proves the behavior.
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: git-commit-checklist
|
|
3
|
-
description:
|
|
3
|
+
description: Verify scope, checks, and local policy before committing.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Git commit checklist
|
|
7
7
|
|
|
8
|
+
Read applicable `AGENTS.md` and their declared adapter alias, otherwise
|
|
9
|
+
`.agents/skills/git-commit-checklist/SKILL.md` from the repository root if present.
|
|
10
|
+
Local policy overrides these defaults; do not reload an already-read adapter or canonical skill.
|
|
11
|
+
|
|
8
12
|
Use before every commit. Read local `AGENTS.md`, contribution guidance, and hook
|
|
9
13
|
output first; they own commit format, required trailers, file-size limits, and validation commands.
|
|
10
14
|
|
|
@@ -19,3 +23,7 @@ output first; they own commit format, required trailers, file-size limits, and v
|
|
|
19
23
|
|
|
20
24
|
Local instructions or the consumer wrapper own: branch names, file-size budgets, commit
|
|
21
25
|
conventions, pull-request templates, and push commands.
|
|
26
|
+
|
|
27
|
+
When an authorized rebase push may race another writer, capture the remote tip before fetching and
|
|
28
|
+
push with an exact expected-tip lease. A lease against a freshly fetched tracking ref can overwrite
|
|
29
|
+
the concurrent change it was meant to protect.
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: github-actions-authoring
|
|
3
|
-
description:
|
|
3
|
+
description: Design event-driven GitHub Actions without remote-state polling.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# GitHub Actions authoring
|
|
7
7
|
|
|
8
|
+
Read applicable `AGENTS.md` and their declared adapter alias, otherwise
|
|
9
|
+
`.agents/skills/github-actions-authoring/SKILL.md` from the repository root if present.
|
|
10
|
+
Local policy overrides these defaults; do not reload an already-read adapter or canonical skill.
|
|
11
|
+
|
|
8
12
|
Never poll in CI. A workflow reacts to a state transition. Read
|
|
9
13
|
[github-actions-checklist](../github-actions-checklist/SKILL.md) first, then every applicable
|
|
10
14
|
`AGENTS.md`. Repository-local policy and the consumer wrapper own runner labels,
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: github-actions-checklist
|
|
3
|
-
description:
|
|
3
|
+
description: Check Actions triggers, permissions, runners, pins, and deadlines.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# GitHub Actions checklist
|
|
7
7
|
|
|
8
|
+
Read applicable `AGENTS.md` and their declared adapter alias, otherwise
|
|
9
|
+
`.agents/skills/github-actions-checklist/SKILL.md` from the repository root if present.
|
|
10
|
+
Local policy overrides these defaults; do not reload an already-read adapter or canonical skill.
|
|
11
|
+
|
|
8
12
|
Use before editing a workflow or composite action. Repository-local instructions own runners,
|
|
9
13
|
approved action pins, concurrency names, secrets, permissions, and workflow-only pull-request rules.
|
|
10
14
|
Apply this baseline unless a stricter local rule overrides it.
|
|
@@ -14,6 +18,10 @@ Apply this baseline unless a stricter local rule overrides it.
|
|
|
14
18
|
- Use `pull_request` for pull-request workflows in private repositories.
|
|
15
19
|
- Reserve `pull_request_target` for base-owned orchestration in a public repository, or for a
|
|
16
20
|
narrowly scoped Dependabot or Renovate workflow.
|
|
21
|
+
- A pull-request CI workflow must not subscribe to `ready_for_review` or `converted_to_draft`
|
|
22
|
+
unless a job changes what it does on that transition. Those activity types start another run for
|
|
23
|
+
the same head, and `cancel-in-progress: true` replaces checks that already passed. Dependabot
|
|
24
|
+
auto-merge may keep `ready_for_review`: it enables merge and does not rerun tests.
|
|
17
25
|
- A privileged workflow must not check out or execute untrusted pull-request content.
|
|
18
26
|
- When changing orchestration, load
|
|
19
27
|
[github-actions-authoring](../github-actions-authoring/SKILL.md). Do not poll remote workflow,
|
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: github-issue
|
|
3
|
-
description: Search,
|
|
3
|
+
description: Search, write, and classify GitHub issues within live authorization.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# GitHub issues
|
|
7
7
|
|
|
8
|
+
Read applicable `AGENTS.md` and their declared adapter alias, otherwise
|
|
9
|
+
`.agents/skills/github-issue/SKILL.md` from the repository root if present.
|
|
10
|
+
Local policy overrides these defaults; do not reload an already-read adapter or canonical skill.
|
|
11
|
+
|
|
8
12
|
Use for durable follow-ups and pull-request linkage. Read local `AGENTS.md`, issue
|
|
9
13
|
templates, and repository-routing policy before any remote mutation.
|
|
10
14
|
|