godpowers 2.2.0 → 2.2.1

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/CHANGELOG.md CHANGED
@@ -7,6 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [2.2.1] - 2026-05-30
11
+
12
+ ### Fixed
13
+ - Made `.godpowers/REQUIREMENTS.md` stable on no-op regenerations by ignoring
14
+ generated timestamp-only changes and removing the extra blank line at EOF.
15
+ - Persisted reverse-sync deliverable summaries into `state.json.deliverables`,
16
+ matching the documented `/god-sync` and reverse-sync behavior.
17
+ - Reconciled the Godpowers self-ledger so the shipped deliverable-progress
18
+ feature is marked done in `.godpowers/roadmap/ROADMAP.md`,
19
+ `.godpowers/REQUIREMENTS.md`, and `.godpowers/state.json`.
20
+
10
21
  ## [2.2.0] - 2026-05-30
11
22
 
12
23
  ### Added
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  [![CI](https://github.com/aihxp/godpowers/actions/workflows/ci.yml/badge.svg)](https://github.com/aihxp/godpowers/actions/workflows/ci.yml)
4
4
  [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
- [![Version](https://img.shields.io/badge/version-2.2.0-blue)](CHANGELOG.md)
5
+ [![Version](https://img.shields.io/badge/version-2.2.1-blue)](CHANGELOG.md)
6
6
  [![npm](https://img.shields.io/npm/v/godpowers.svg)](https://www.npmjs.com/package/godpowers)
7
7
 
8
8
  **Ship fast. Ship right. Ship everything. Ship accountably.**
@@ -21,7 +21,7 @@ Godpowers makes AI coding accountable: every serious run should leave disk
21
21
  state, artifacts, validation gates, host guarantees, and a next action. Code is
22
22
  only one output. The project memory and proof trail matter too.
23
23
 
24
- Version 2.2.0 keeps the proof loop executable. `npx godpowers quick-proof
24
+ Version 2.2.1 keeps the proof loop executable. `npx godpowers quick-proof
25
25
  --project=.` now renders a shipped fixture with real `.godpowers/state.json`,
26
26
  computed next action, missing-artifact visibility, and host guarantees. The
27
27
  2.0 line also ships a proof transcript, adoption canary harness, published npm
package/RELEASE.md CHANGED
@@ -1,11 +1,11 @@
1
- # Godpowers 2.2.0 Release
1
+ # Godpowers 2.2.1 Release
2
2
 
3
3
  > Status: Ready for release
4
4
  > Date: 2026-05-30
5
5
 
6
- Godpowers 2.2.0 adds deliverable progress tracking on top of the 2.1.1
7
- documentation and off-switch safety patch. It keeps the public slash-command
8
- surface stable and backward compatible.
6
+ Godpowers 2.2.1 is a patch release for the 2.2 deliverable-progress line. It
7
+ keeps the public slash-command surface stable and fixes ledger persistence,
8
+ idempotence, and release-state reconciliation.
9
9
 
10
10
  ## What's in this release
11
11
 
@@ -16,23 +16,15 @@ surface stable and backward compatible.
16
16
 
17
17
  ## Highlights
18
18
 
19
- - Deliverable progress tracking: the new `/god-progress` command and the
20
- `.godpowers/REQUIREMENTS.md` ledger report which PRD requirements and roadmap
21
- increments are done, in progress, or not started. Status is derived from the
22
- linkage map by `lib/requirements.js`, so it cannot drift from the code that is
23
- actually implemented.
24
- - Stable requirement and increment ids: PRD requirements carry
25
- `P-MUST-NN`/`P-SHOULD-NN`/`P-COULD-NN`, and ROADMAP increments carry `M-slug`
26
- ids with a per-increment `Status` and member requirement ids.
27
- - The build chain populates the ledger during real runs: `god-planner` names the
28
- requirement ids each slice delivers, `god-executor` stamps `// Implements: P-...`
29
- annotations, and the spec and quality reviewers verify them.
30
- - The dashboard (`/god-status`, `/god-next`, `/god-mode` closeout) gains a
31
- `Deliverable progress` section, and a `whats-done` recipe routes natural
32
- language like "how far along are we" to `/god-progress`.
33
- - Documentation reconciled with the shipped surface and version: accurate
34
- counts and `/god-progress`/`REQUIREMENTS.md` awareness across README,
35
- ARCHITECTURE, reference, linkage, recipes, and the artifact inventories.
19
+ - `.godpowers/REQUIREMENTS.md` no longer rewrites on timestamp-only no-op
20
+ regenerations, and the generated ledger no longer carries an extra blank line
21
+ at EOF.
22
+ - `lib/reverse-sync.js` now persists deliverable summaries into
23
+ `state.json.deliverables`, matching the documented `/god-sync` behavior.
24
+ - The Godpowers self-ledger now reports the shipped deliverable-progress feature
25
+ as done across roadmap, requirements ledger, and state cache.
26
+ - Regression tests cover no-op ledger writes, state-cache persistence, and
27
+ no-op reverse-sync stability.
36
28
 
37
29
  ## Validation
38
30
 
@@ -42,14 +34,14 @@ surface stable and backward compatible.
42
34
 
43
35
  ## Upgrade
44
36
 
45
- - `npm install -g godpowers@2.2.0` or `npx godpowers@2.2.0`
37
+ - `npm install -g godpowers@2.2.1` or `npx godpowers@2.2.1`
46
38
  - Re-run `/god-context` in each project to refresh installed runtime metadata
47
39
  - No breaking changes; existing `.godpowers/` state is compatible. Projects gain
48
40
  a `REQUIREMENTS.md` ledger the next time `/god-progress` or `/god-sync` runs.
49
41
 
50
42
  ## Notes
51
43
 
52
- - GitHub release creation for `v2.2.0`
44
+ - GitHub release creation for `v2.2.1`
53
45
  - The tag should match the npm package version
54
- - The `v2.2.0` tag should point to the release commit that matches the npm
55
- `godpowers@2.2.0` package.
46
+ - The `v2.2.1` tag should point to the release commit that matches the npm
47
+ `godpowers@2.2.1` package.
@@ -363,6 +363,27 @@ function progressBar(done, total, width = 20) {
363
363
 
364
364
  const MARK = { done: '[x]', 'in-progress': '[~]', untouched: '[ ]' };
365
365
  const INC_MARK = { done: '[x]', building: '[~]', pending: '[ ]' };
366
+ const UPDATED_LINE_RE = /^Updated: .+$/m;
367
+
368
+ function finishLedger(lines) {
369
+ while (lines.length > 0 && lines[lines.length - 1] === '') lines.pop();
370
+ return lines.join('\n');
371
+ }
372
+
373
+ function normalizeLedgerTimestamp(content) {
374
+ return String(content).replace(UPDATED_LINE_RE, 'Updated: <timestamp>');
375
+ }
376
+
377
+ function withoutUpdated(value) {
378
+ if (!value || typeof value !== 'object') return value;
379
+ const copy = JSON.parse(JSON.stringify(value));
380
+ delete copy.updated;
381
+ return copy;
382
+ }
383
+
384
+ function sameIgnoringUpdated(a, b) {
385
+ return JSON.stringify(withoutUpdated(a)) === JSON.stringify(withoutUpdated(b));
386
+ }
366
387
 
367
388
  /**
368
389
  * Compact lines for the dashboard "Deliverable progress" section.
@@ -411,7 +432,7 @@ function renderLedger(derived) {
411
432
  out.push('No requirements are declared yet. Once the PRD lists MUST/SHOULD/COULD');
412
433
  out.push('requirements with stable ids (P-MUST-01, ...), they appear here.');
413
434
  out.push('');
414
- return out.join('\n');
435
+ return finishLedger(out);
415
436
  }
416
437
 
417
438
  out.push(`Progress: ${progressBar(s.done, s.total)} done (${s.percent}%) | ${s.inProgress} in progress | ${s.untouched} not started`);
@@ -469,23 +490,30 @@ function renderLedger(derived) {
469
490
  out.push('');
470
491
  }
471
492
 
472
- return out.join('\n');
493
+ return finishLedger(out);
473
494
  }
474
495
 
475
496
  function writeLedger(projectRoot, derived) {
476
497
  const data = derived || derive(projectRoot);
477
498
  const file = path.join(projectRoot, LEDGER_PATH);
478
499
  fs.mkdirSync(path.dirname(file), { recursive: true });
479
- fs.writeFileSync(file, renderLedger(data) + '\n');
500
+ const rendered = renderLedger(data) + '\n';
501
+ if (fs.existsSync(file)) {
502
+ const current = fs.readFileSync(file, 'utf8');
503
+ if (normalizeLedgerTimestamp(current) === normalizeLedgerTimestamp(rendered)) {
504
+ return LEDGER_PATH;
505
+ }
506
+ }
507
+ fs.writeFileSync(file, rendered);
480
508
  return LEDGER_PATH;
481
509
  }
482
510
 
483
511
  /**
484
512
  * Small cacheable summary for state.json (state.deliverables).
485
513
  */
486
- function summarizeForState(derived) {
514
+ function summarizeForState(derived, currentSummary = null) {
487
515
  const s = derived.summary;
488
- return {
516
+ const next = {
489
517
  updated: derived.updated,
490
518
  source: 'PRD + ROADMAP + linkage + build state',
491
519
  requirements: {
@@ -505,6 +533,10 @@ function summarizeForState(derived) {
505
533
  })),
506
534
  gaps: derived.gaps.length
507
535
  };
536
+ if (currentSummary && currentSummary.updated && sameIgnoringUpdated(currentSummary, next)) {
537
+ next.updated = currentSummary.updated;
538
+ }
539
+ return next;
508
540
  }
509
541
 
510
542
  module.exports = {
@@ -27,6 +27,7 @@ const reviewRequired = require('./review-required');
27
27
  const impeccable = require('./impeccable-bridge');
28
28
  const sourceSync = require('./source-sync');
29
29
  const requirements = require('./requirements');
30
+ const state = require('./state');
30
31
 
31
32
  const FENCE_BEGIN = '<!-- godpowers:linkage:begin -->';
32
33
  const FENCE_END = '<!-- godpowers:linkage:end -->';
@@ -321,7 +322,15 @@ function run(projectRoot, opts = {}) {
321
322
  const derived = requirements.derive(projectRoot);
322
323
  if (derived.hasRequirements) {
323
324
  requirements.writeLedger(projectRoot, derived);
324
- requirementsSummary = requirements.summarizeForState(derived);
325
+ const currentState = state.read(projectRoot);
326
+ requirementsSummary = requirements.summarizeForState(
327
+ derived,
328
+ currentState && currentState.deliverables
329
+ );
330
+ if (currentState) {
331
+ currentState.deliverables = requirementsSummary;
332
+ state.write(projectRoot, currentState);
333
+ }
325
334
  }
326
335
  } catch (e) {
327
336
  requirementsSummary = null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "godpowers",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "description": "AI-powered development system: 111 slash commands and 40 specialist agents that take a project from raw idea to hardened production. Runs inside Claude Code, Codex, Cursor, Windsurf, Gemini, and 10+ other AI coding tools.",
5
5
  "bin": {
6
6
  "godpowers": "./bin/install.js"
@@ -50,7 +50,7 @@ GODPOWERS DOCTOR
50
50
  Install: claude (~/.claude/)
51
51
  [OK] 111 skills installed
52
52
  [OK] 40 agents installed
53
- [OK] VERSION matches (2.2.0)
53
+ [OK] VERSION matches (2.2.1)
54
54
  [WARN] routing/god-doctor.yaml exists but skill file did not until now
55
55
 
56
56
  Project: /Users/.../my-project/.godpowers/
@@ -14,7 +14,7 @@ Print version and a short capability summary.
14
14
  ## Output
15
15
 
16
16
  ```
17
- Godpowers v2.2.0
17
+ Godpowers v2.2.1
18
18
  Install: /Users/.../.claude/ (matches package.json)
19
19
  Surface: 111 skills, 40 agents, 13 workflows, 41 recipes
20
20
  Schema: intent.v1, state.v1, events.v1, workflow.v1, routing.v1, recipe.v1