@warnyin/sdlc 0.8.0 → 0.10.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.
Files changed (76) hide show
  1. package/CHANGELOG.md +293 -258
  2. package/LICENSE +21 -21
  3. package/README.md +118 -92
  4. package/bin/cli.mjs +694 -682
  5. package/lib/active.mjs +199 -199
  6. package/lib/caps.mjs +46 -46
  7. package/lib/config.mjs +41 -41
  8. package/lib/delta.mjs +227 -227
  9. package/lib/frontmatter.mjs +59 -59
  10. package/lib/glob.mjs +29 -29
  11. package/lib/lenses.mjs +48 -48
  12. package/lib/manifest.mjs +99 -99
  13. package/lib/settings-merge.mjs +63 -63
  14. package/lib/skills.mjs +148 -148
  15. package/lib/update-notice.mjs +42 -0
  16. package/lib/validate.mjs +198 -198
  17. package/lib/version.mjs +23 -0
  18. package/package.json +42 -42
  19. package/payload/adapters/agents-md.md +8 -8
  20. package/payload/adapters/claude/agents/sdlc-architect.md +12 -12
  21. package/payload/adapters/claude/agents/sdlc-builder.md +14 -14
  22. package/payload/adapters/claude/agents/sdlc-contractor.md +13 -13
  23. package/payload/adapters/claude/agents/sdlc-evaluator.md +13 -13
  24. package/payload/adapters/claude/agents/sdlc-learner.md +16 -16
  25. package/payload/adapters/claude/agents/sdlc-ops.md +11 -11
  26. package/payload/adapters/claude/agents/sdlc-quality.md +13 -13
  27. package/payload/adapters/claude/agents/sdlc-security.md +12 -12
  28. package/payload/adapters/claude/commands/sdlc/converge.md +5 -5
  29. package/payload/adapters/claude/commands/sdlc/init.md +4 -4
  30. package/payload/adapters/claude/commands/sdlc/next.md +4 -4
  31. package/payload/adapters/claude/commands/sdlc/observe.md +4 -4
  32. package/payload/adapters/claude/commands/sdlc/steer.md +4 -4
  33. package/payload/adapters/claude/skills/contract-writing/SKILL.md +26 -26
  34. package/payload/adapters/claude/skills/delta-spec-format/SKILL.md +36 -36
  35. package/payload/adapters/claude/skills/sdlc-conventions/SKILL.md +30 -30
  36. package/payload/adapters/cline.md +8 -8
  37. package/payload/adapters/copilot.md +8 -8
  38. package/payload/adapters/cursor.mdc +7 -7
  39. package/payload/adapters/gemini.md +8 -8
  40. package/payload/adapters/windsurf.md +4 -4
  41. package/payload/hooks/_shared.mjs +138 -138
  42. package/payload/hooks/_update-notice.mjs +81 -0
  43. package/payload/hooks/check-update.mjs +45 -0
  44. package/payload/hooks/guard-writes.mjs +87 -87
  45. package/payload/hooks/inject-context.mjs +61 -57
  46. package/payload/hooks/journal.mjs +66 -66
  47. package/payload/hooks/session-summary.mjs +52 -52
  48. package/payload/hooks/validate-artifact.mjs +84 -84
  49. package/payload/playbook/README.md +32 -32
  50. package/payload/playbook/context.md +26 -26
  51. package/payload/playbook/contract.md +29 -29
  52. package/payload/playbook/converge.md +19 -19
  53. package/payload/playbook/design.md +28 -28
  54. package/payload/playbook/init.md +22 -22
  55. package/payload/playbook/lenses.md +64 -64
  56. package/payload/playbook/new.md +41 -33
  57. package/payload/playbook/next.md +24 -24
  58. package/payload/playbook/observe.md +20 -20
  59. package/payload/playbook/principles.md +28 -28
  60. package/payload/playbook/review.md +31 -31
  61. package/payload/playbook/routing.md +19 -19
  62. package/payload/playbook/rules-card.md +17 -16
  63. package/payload/playbook/ship.md +35 -35
  64. package/payload/playbook/steer.md +21 -21
  65. package/payload/playbook/verify.md +42 -42
  66. package/payload/templates/change-deep.md +29 -29
  67. package/payload/templates/change-standard.md +28 -28
  68. package/payload/templates/change-vibe.md +19 -19
  69. package/payload/templates/config.yaml +12 -8
  70. package/payload/templates/constitution.md +14 -14
  71. package/payload/templates/contract-evals.md +9 -9
  72. package/payload/templates/contract-tests.md +9 -9
  73. package/payload/templates/harness.md +34 -34
  74. package/payload/templates/spec.md +14 -14
  75. package/payload/templates/steering.md +9 -9
  76. package/scripts/validate.mjs +47 -47
@@ -1,34 +1,34 @@
1
- # Harness — <project>
2
- <!-- cap:60 · CONFIGURE-phase output; reviewed like code. Registry + tables only — doctrine lives in sdlc/.playbook/. -->
3
-
4
- ## Tools & MCP (what the agent may call)
5
- | Tool/MCP | Scope | Notes |
6
- |---|---|---|
7
- | <tool> | <what it may touch> | <when to use> |
8
-
9
- ## Sandbox & execution
10
- - test command: `<cmd>`
11
- - sandbox notes: <where code runs, what it cannot reach>
12
-
13
- ## Guardrails (mirror of installed hooks — deterministic, the agent cannot skip them)
14
- - `sdlc/specs/**` and archive are write-locked outside ship.
15
- - Artifact line caps validated on every write.
16
- - Session token/cost journaled per change.
17
-
18
- ## Model routing (generic tiers — the harness adapter maps them to real models)
19
- | Task kind | Tier |
20
- |---|---|
21
- | requirements, architecture, deep design | deepest |
22
- | standard implementation | balanced |
23
- | test generation, review passes, mechanical/scaffold, eval judging, learning | cheap |
24
-
25
- ## Tier triage (stakes → tier)
26
- - vibe: reversible, no behavior-contract change, ≤2 files.
27
- - deep: security / payments / data-loss / irreversible surface, new capability, or multi-capability delta.
28
- - otherwise: standard.
29
-
30
- ## Autonomy policy
31
- - auto-ship: vibe, standard.
32
- - escalate to human: hard-floor (security, payments, data-loss, irreversible), verify failed > 3 rounds,
33
- token budget exceeded, information the agent cannot obtain or safely assume,
34
- installing a skill or agent (suggest only; see `.playbook/lenses.md`).
1
+ # Harness — <project>
2
+ <!-- cap:60 · CONFIGURE-phase output; reviewed like code. Registry + tables only — doctrine lives in sdlc/.playbook/. -->
3
+
4
+ ## Tools & MCP (what the agent may call)
5
+ | Tool/MCP | Scope | Notes |
6
+ |---|---|---|
7
+ | <tool> | <what it may touch> | <when to use> |
8
+
9
+ ## Sandbox & execution
10
+ - test command: `<cmd>`
11
+ - sandbox notes: <where code runs, what it cannot reach>
12
+
13
+ ## Guardrails (mirror of installed hooks — deterministic, the agent cannot skip them)
14
+ - `sdlc/specs/**` and archive are write-locked outside ship.
15
+ - Artifact line caps validated on every write.
16
+ - Session token/cost journaled per change.
17
+
18
+ ## Model routing (generic tiers — the harness adapter maps them to real models)
19
+ | Task kind | Tier |
20
+ |---|---|
21
+ | requirements, architecture, deep design | deepest |
22
+ | standard implementation | balanced |
23
+ | test generation, review passes, mechanical/scaffold, eval judging, learning | cheap |
24
+
25
+ ## Tier triage (stakes → tier)
26
+ - vibe: reversible, no behavior-contract change, ≤2 files.
27
+ - deep: security / payments / data-loss / irreversible surface, new capability, or multi-capability delta.
28
+ - otherwise: standard.
29
+
30
+ ## Autonomy policy
31
+ - auto-ship: vibe, standard.
32
+ - escalate to human: hard-floor (security, payments, data-loss, irreversible), verify failed > 3 rounds,
33
+ token budget exceeded, information the agent cannot obtain or safely assume,
34
+ installing a skill or agent (suggest only; see `.playbook/lenses.md`).
@@ -1,14 +1,14 @@
1
- # Spec: <capability>
2
- <!-- cap:150 (soft) · living spec — observable behavior only, no implementation detail. Split the capability beyond the cap. -->
3
-
4
- ## Purpose
5
- <!-- one or two lines; commands grep this header first (progressive disclosure) -->
6
-
7
- ## Requirements
8
-
9
- ### Requirement: <name>
10
- The system SHALL <behavior>.
11
-
12
- #### Scenario: <name>
13
- - WHEN <condition>
14
- - THEN <observable outcome>
1
+ # Spec: <capability>
2
+ <!-- cap:150 (soft) · living spec — observable behavior only, no implementation detail. Split the capability beyond the cap. -->
3
+
4
+ ## Purpose
5
+ <!-- one or two lines; commands grep this header first (progressive disclosure) -->
6
+
7
+ ## Requirements
8
+
9
+ ### Requirement: <name>
10
+ The system SHALL <behavior>.
11
+
12
+ #### Scenario: <name>
13
+ - WHEN <condition>
14
+ - THEN <observable outcome>
@@ -1,9 +1,9 @@
1
- ---
2
- name: <topic>
3
- inclusion: paths # always | paths | manual | agent
4
- pathMatch: ["src/<area>/**"]
5
- ---
6
- # Steering: <topic>
7
- <!-- cap:40 · loaded only when pathMatch hits or explicitly requested. Dense, scoped conventions — no generalities. -->
8
-
9
- <conventions, gotchas, and reference patterns for this scope>
1
+ ---
2
+ name: <topic>
3
+ inclusion: paths # always | paths | manual | agent
4
+ pathMatch: ["src/<area>/**"]
5
+ ---
6
+ # Steering: <topic>
7
+ <!-- cap:40 · loaded only when pathMatch hits or explicitly requested. Dense, scoped conventions — no generalities. -->
8
+
9
+ <conventions, gotchas, and reference patterns for this scope>
@@ -1,47 +1,47 @@
1
- #!/usr/bin/env node
2
- // Thin CLI wrapper — validator core lives in lib/validate.mjs so that
3
- // installed hooks (sdlc/.hooks/lib/) can share the exact same logic.
4
- // Exit codes: 0 = clean, 1 = errors, 2 = usage/setup error.
5
-
6
- import fs from 'node:fs';
7
- import path from 'node:path';
8
- import process from 'node:process';
9
- import { fileURLToPath } from 'node:url';
10
- import { validateAll, formatIssues } from '../lib/validate.mjs';
11
-
12
- export * from '../lib/validate.mjs';
13
-
14
- function main() {
15
- const args = process.argv.slice(2);
16
- const strict = args.includes('--strict');
17
- const rootIdx = args.indexOf('--root');
18
- const projectRoot = rootIdx !== -1 ? args[rootIdx + 1] : process.cwd();
19
- const positional = args.filter((a, i) => !a.startsWith('--') && args[i - 1] !== '--root');
20
- const changeId = positional[0] && positional[0] !== '--all' ? positional[0] : null;
21
-
22
- const sdlcRoot = path.join(projectRoot, 'sdlc');
23
- if (!fs.existsSync(sdlcRoot)) {
24
- console.error(`No sdlc/ directory at ${projectRoot} — run \`npx @warnyin/sdlc init\` first.`);
25
- process.exit(2);
26
- }
27
-
28
- const issues = validateAll(sdlcRoot, { strict, changeId });
29
- if (issues.length) console.log(formatIssues(issues));
30
- const errors = issues.filter((i) => i.level === 'error').length;
31
- const warns = issues.length - errors;
32
- console.log(`validate: ${errors} error(s), ${warns} warning(s)${strict ? ' [strict]' : ''}`);
33
- process.exit(errors > 0 ? 1 : 0);
34
- }
35
-
36
- function isEntrypoint() {
37
- if (!process.argv[1]) return false;
38
- try {
39
- return fs.realpathSync.native(path.resolve(process.argv[1])) === fileURLToPath(import.meta.url);
40
- } catch {
41
- return false;
42
- }
43
- }
44
-
45
- if (isEntrypoint()) {
46
- main();
47
- }
1
+ #!/usr/bin/env node
2
+ // Thin CLI wrapper — validator core lives in lib/validate.mjs so that
3
+ // installed hooks (sdlc/.hooks/lib/) can share the exact same logic.
4
+ // Exit codes: 0 = clean, 1 = errors, 2 = usage/setup error.
5
+
6
+ import fs from 'node:fs';
7
+ import path from 'node:path';
8
+ import process from 'node:process';
9
+ import { fileURLToPath } from 'node:url';
10
+ import { validateAll, formatIssues } from '../lib/validate.mjs';
11
+
12
+ export * from '../lib/validate.mjs';
13
+
14
+ function main() {
15
+ const args = process.argv.slice(2);
16
+ const strict = args.includes('--strict');
17
+ const rootIdx = args.indexOf('--root');
18
+ const projectRoot = rootIdx !== -1 ? args[rootIdx + 1] : process.cwd();
19
+ const positional = args.filter((a, i) => !a.startsWith('--') && args[i - 1] !== '--root');
20
+ const changeId = positional[0] && positional[0] !== '--all' ? positional[0] : null;
21
+
22
+ const sdlcRoot = path.join(projectRoot, 'sdlc');
23
+ if (!fs.existsSync(sdlcRoot)) {
24
+ console.error(`No sdlc/ directory at ${projectRoot} — run \`npx @warnyin/sdlc init\` first.`);
25
+ process.exit(2);
26
+ }
27
+
28
+ const issues = validateAll(sdlcRoot, { strict, changeId });
29
+ if (issues.length) console.log(formatIssues(issues));
30
+ const errors = issues.filter((i) => i.level === 'error').length;
31
+ const warns = issues.length - errors;
32
+ console.log(`validate: ${errors} error(s), ${warns} warning(s)${strict ? ' [strict]' : ''}`);
33
+ process.exit(errors > 0 ? 1 : 0);
34
+ }
35
+
36
+ function isEntrypoint() {
37
+ if (!process.argv[1]) return false;
38
+ try {
39
+ return fs.realpathSync.native(path.resolve(process.argv[1])) === fileURLToPath(import.meta.url);
40
+ } catch {
41
+ return false;
42
+ }
43
+ }
44
+
45
+ if (isEntrypoint()) {
46
+ main();
47
+ }