@xn-intenton-z2a/agentic-lib 7.1.53 → 7.1.55

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.
@@ -5,24 +5,37 @@
5
5
  # Discussions bot: responds to GitHub Discussions using the Copilot SDK.
6
6
  # Checks thread + repo context, responds, and can escalate to the main
7
7
  # workflow by dispatching agentic-lib-workflow.yml with a message parameter.
8
+ #
9
+ # In agentic-lib: discussion triggers are commented out, dry-run defaults to true.
10
+ # During init: #@dist restores triggers and sets dry-run to false.
8
11
 
9
12
  name: agentic-lib-bot
10
13
  run-name: "agentic-lib-bot [${{ github.ref_name }}]"
11
- concurrency:
12
- group: agentic-lib-bot-${{ github.event.discussion.node_id || github.run_id }}
13
- cancel-in-progress: false
14
+ #concurrency:
15
+ # group: agentic-lib-bot-${{ github.event.discussion.node_id || github.run_id }}
16
+ # cancel-in-progress: false
14
17
 
15
18
  on:
16
- discussion:
17
- types:
18
- - created
19
- - edited
20
- - answered
21
- - unanswered
22
- discussion_comment:
23
- types:
24
- - created
25
- - edited
19
+ #@dist discussion:
20
+ #@dist types:
21
+ #@dist - created
22
+ #@dist - edited
23
+ #@dist - answered
24
+ #@dist - unanswered
25
+ #@dist discussion_comment:
26
+ #@dist types:
27
+ #@dist - created
28
+ #@dist - edited
29
+ workflow_call:
30
+ inputs:
31
+ discussion-url:
32
+ type: string
33
+ required: false
34
+ default: ""
35
+ model:
36
+ type: string
37
+ required: false
38
+ default: "gpt-5-mini"
26
39
  workflow_dispatch:
27
40
  inputs:
28
41
  discussion-url:
@@ -39,6 +52,11 @@ on:
39
52
  - gpt-5-mini
40
53
  - claude-sonnet-4
41
54
  - gpt-4.1
55
+ dry-run:
56
+ description: "Skip all push/PR/merge operations"
57
+ type: boolean
58
+ required: false
59
+ default: true #@dist false
42
60
 
43
61
  permissions:
44
62
  contents: read
@@ -47,7 +65,7 @@ permissions:
47
65
  actions: write
48
66
 
49
67
  env:
50
- configPath: ".github/agentic-lib/agents/agentic-lib.yml"
68
+ configPath: "agentic-lib.toml"
51
69
 
52
70
  jobs:
53
71
  params:
@@ -59,8 +77,11 @@ jobs:
59
77
  run: |
60
78
  MODEL='${{ inputs.model }}'
61
79
  echo "model=${MODEL:-gpt-5-mini}" >> $GITHUB_OUTPUT
80
+ DRY_RUN='${{ inputs.dry-run }}'
81
+ echo "dry-run=${DRY_RUN:-true}" >> $GITHUB_OUTPUT
62
82
  outputs:
63
83
  model: ${{ steps.normalise.outputs.model }}
84
+ dry-run: ${{ steps.normalise.outputs.dry-run }}
64
85
 
65
86
  respond:
66
87
  needs: params
@@ -74,6 +95,10 @@ jobs:
74
95
  with:
75
96
  node-version: "24"
76
97
 
98
+ - name: Self-init (agentic-lib dev only)
99
+ if: hashFiles('scripts/self-init.sh') != '' && hashFiles('.github/agentic-lib/actions/agentic-step/package.json') == ''
100
+ run: bash scripts/self-init.sh
101
+
77
102
  - name: Install agentic-step dependencies
78
103
  working-directory: .github/agentic-lib/actions/agentic-step
79
104
  run: npm ci
@@ -5,13 +5,42 @@
5
5
  # Self-contained init: update agentic-lib, purge, push to main [skip ci].
6
6
  # Does NOT create a PR. Does NOT trigger any other workflow.
7
7
  # Closes hanging init PRs before running.
8
+ #
9
+ # In agentic-lib: schedule trigger is commented out.
10
+ # During init: #@dist restores the schedule.
8
11
 
9
12
  name: agentic-lib-init
10
13
  run-name: "agentic-lib-init [${{ github.ref_name }}]"
11
14
 
12
15
  on:
13
- schedule:
14
- - cron: "0 5 * * *"
16
+ #@dist schedule:
17
+ #@dist - cron: "0 5 * * *"
18
+ workflow_call:
19
+ inputs:
20
+ mode:
21
+ type: string
22
+ required: false
23
+ default: "update"
24
+ dry-run:
25
+ type: string
26
+ required: false
27
+ default: "false"
28
+ mission-seed:
29
+ type: string
30
+ required: false
31
+ default: "hamming-distance"
32
+ mission-text:
33
+ type: string
34
+ required: false
35
+ default: ""
36
+ schedule:
37
+ type: string
38
+ required: false
39
+ default: ""
40
+ model:
41
+ type: string
42
+ required: false
43
+ default: ""
15
44
  workflow_dispatch:
16
45
  inputs:
17
46
  mode:
@@ -113,6 +142,9 @@ jobs:
113
142
  INIT_MISSION_TEXT: ${{ needs.params.outputs.mission-text }}
114
143
  steps:
115
144
  - uses: actions/checkout@v4
145
+ if: needs.params.outputs.dry-run == 'true'
146
+ - uses: actions/checkout@v4
147
+ if: needs.params.outputs.dry-run != 'true'
116
148
  with:
117
149
  ref: main
118
150
  token: ${{ secrets.WORKFLOW_TOKEN }}
@@ -122,7 +154,7 @@ jobs:
122
154
  node-version: "24"
123
155
 
124
156
  - name: Close hanging init PRs
125
- if: env.INIT_MODE == 'purge'
157
+ if: env.INIT_MODE == 'purge' && needs.params.outputs.dry-run != 'true'
126
158
  env:
127
159
  GH_TOKEN: ${{ secrets.WORKFLOW_TOKEN }}
128
160
  run: |
@@ -145,10 +177,15 @@ jobs:
145
177
  if [ "$INIT_MODE" = "reseed" ]; then FLAGS="$FLAGS --reseed"; fi
146
178
  if [ "$INIT_MODE" = "purge" ]; then FLAGS="$FLAGS --purge --mission $INIT_MISSION_SEED"; fi
147
179
  if [ "$INIT_DRY_RUN" = "true" ]; then FLAGS="$FLAGS --dry-run"; fi
148
- npx @xn-intenton-z2a/agentic-lib $FLAGS
180
+ # Use local CLI if available (agentic-lib dev), otherwise npx
181
+ if [ -f "bin/agentic-lib.js" ]; then
182
+ node bin/agentic-lib.js $FLAGS
183
+ else
184
+ npx @xn-intenton-z2a/agentic-lib $FLAGS
185
+ fi
149
186
 
150
187
  - name: Write mission text (if provided, overrides seed)
151
- if: env.INIT_MISSION_TEXT != ''
188
+ if: env.INIT_MISSION_TEXT != '' && needs.params.outputs.dry-run != 'true'
152
189
  run: |
153
190
  printf '# Mission\n\n%s\n' "$INIT_MISSION_TEXT" > MISSION.md
154
191
  echo "Wrote custom mission text to MISSION.md"
@@ -156,12 +193,17 @@ jobs:
156
193
  - run: npm install
157
194
 
158
195
  - name: Install agentic-step deps
196
+ if: hashFiles('.github/agentic-lib/actions/agentic-step/package.json') != ''
159
197
  run: cd .github/agentic-lib/actions/agentic-step && npm ci
160
198
 
199
+ - name: Install sub-project dependencies (agentic-lib dev only)
200
+ if: hashFiles('src/actions/agentic-step/package.json') != ''
201
+ run: cd src/actions/agentic-step && npm ci
202
+
161
203
  - run: npm test
162
204
 
163
205
  - name: Update schedule (if requested)
164
- if: needs.params.outputs.schedule != ''
206
+ if: needs.params.outputs.schedule != '' && needs.params.outputs.dry-run != 'true'
165
207
  uses: actions/github-script@v7
166
208
  with:
167
209
  script: |
@@ -213,6 +255,7 @@ jobs:
213
255
  }
214
256
 
215
257
  - name: Commit and push to main [skip ci]
258
+ if: needs.params.outputs.dry-run != 'true'
216
259
  env:
217
260
  GH_TOKEN: ${{ secrets.WORKFLOW_TOKEN }}
218
261
  run: |
@@ -4,6 +4,8 @@
4
4
  #
5
5
  # Changes the agentic-lib-workflow's cron schedule by editing the workflow file
6
6
  # directly and pushing to main. Also updates the model setting in agentic-lib.toml.
7
+ #
8
+ # No trigger changes needed — uses workflow_call and workflow_dispatch only.
7
9
 
8
10
  name: agentic-lib-schedule
9
11
  run-name: "agentic-lib-schedule -> ${{ inputs.frequency }} (${{ inputs.model }})"
@@ -20,6 +22,11 @@ on:
20
22
  required: false
21
23
  type: string
22
24
  default: "gpt-5-mini"
25
+ dry-run:
26
+ description: "Skip commit and push"
27
+ required: false
28
+ type: string
29
+ default: "false"
23
30
  workflow_dispatch:
24
31
  inputs:
25
32
  frequency:
@@ -41,6 +48,11 @@ on:
41
48
  - gpt-5-mini
42
49
  - claude-sonnet-4
43
50
  - gpt-4.1
51
+ dry-run:
52
+ description: "Skip commit and push"
53
+ type: boolean
54
+ required: false
55
+ default: false
44
56
 
45
57
  permissions:
46
58
  contents: write
@@ -50,6 +62,9 @@ jobs:
50
62
  runs-on: ubuntu-latest
51
63
  steps:
52
64
  - uses: actions/checkout@v4
65
+ if: inputs.dry-run == 'true' || inputs.dry-run == true
66
+ - uses: actions/checkout@v4
67
+ if: inputs.dry-run != 'true' && inputs.dry-run != true
53
68
  with:
54
69
  ref: main
55
70
  token: ${{ secrets.WORKFLOW_TOKEN }}
@@ -131,6 +146,7 @@ jobs:
131
146
  }
132
147
 
133
148
  - name: Commit and push
149
+ if: inputs.dry-run != 'true' && inputs.dry-run != true
134
150
  env:
135
151
  GH_TOKEN: ${{ secrets.WORKFLOW_TOKEN }}
136
152
  run: |
@@ -4,15 +4,18 @@
4
4
  #
5
5
  # Test workflow seeded by agentic-lib init.
6
6
  # Also callable via workflow_call from the main pipeline.
7
+ #
8
+ # In agentic-lib: push/pull_request triggers are commented out.
9
+ # During init: #@dist restores them.
7
10
 
8
11
  name: agentic-lib-test
9
12
  run-name: "agentic-lib-test [${{ github.ref_name }}]"
10
13
 
11
14
  on:
12
- push:
13
- branches: [main]
14
- pull_request:
15
- branches: [main]
15
+ #@dist push:
16
+ #@dist branches: [main]
17
+ #@dist pull_request:
18
+ #@dist branches: [main]
16
19
  workflow_call:
17
20
  workflow_dispatch:
18
21
 
@@ -29,4 +32,8 @@ jobs:
29
32
 
30
33
  - run: npm ci
31
34
 
35
+ - name: Install sub-project dependencies (agentic-lib dev only)
36
+ if: hashFiles('src/actions/agentic-step/package.json') != ''
37
+ run: cd src/actions/agentic-step && npm ci
38
+
32
39
  - run: npm test
@@ -5,16 +5,37 @@
5
5
  # Main autonomous pipeline: supervisor + maintain + review + dev + PR cleanup.
6
6
  # Replaces agent-supervisor, agent-flow-transform, agent-flow-review,
7
7
  # agent-flow-maintain, agent-flow-fix-code, and ci-automerge.
8
+ #
9
+ # In agentic-lib: schedule is commented out, dry-run defaults to true.
10
+ # During init: #@dist restores schedule and sets dry-run to false.
8
11
 
9
12
  name: agentic-lib-workflow
10
13
  run-name: "agentic-lib-workflow [${{ github.ref_name }}]"
11
- concurrency:
12
- group: agentic-lib-workflow
13
- cancel-in-progress: false
14
+ #concurrency:
15
+ # group: agentic-lib-workflow
16
+ # cancel-in-progress: false
14
17
 
15
18
  on:
16
- schedule:
17
- - cron: "0 6 * * 1"
19
+ #@dist schedule:
20
+ #@dist - cron: "0 6 * * 1"
21
+ workflow_call:
22
+ inputs:
23
+ model:
24
+ type: string
25
+ required: false
26
+ default: "gpt-5-mini"
27
+ mode:
28
+ type: string
29
+ required: false
30
+ default: "full"
31
+ dry-run:
32
+ type: string
33
+ required: false
34
+ default: "true"
35
+ config-path:
36
+ type: string
37
+ required: false
38
+ default: ""
18
39
  workflow_dispatch:
19
40
  inputs:
20
41
  model:
@@ -64,6 +85,11 @@ on:
64
85
  type: string
65
86
  required: false
66
87
  default: ""
88
+ dry-run:
89
+ description: "Skip all push/PR/merge operations"
90
+ type: boolean
91
+ required: false
92
+ default: true #@dist false
67
93
 
68
94
  permissions:
69
95
  actions: write
@@ -74,7 +100,7 @@ permissions:
74
100
  discussions: write
75
101
 
76
102
  env:
77
- configPath: ".github/agentic-lib/agents/agentic-lib.yml"
103
+ configPath: "agentic-lib.toml"
78
104
  maxFixAttempts: "3"
79
105
  stalePrDays: "3"
80
106
 
@@ -98,6 +124,10 @@ jobs:
98
124
  echo "schedule=${SCHEDULE}" >> $GITHUB_OUTPUT
99
125
  PR='${{ inputs.pr-number }}'
100
126
  echo "pr-number=${PR}" >> $GITHUB_OUTPUT
127
+ DRY_RUN='${{ inputs.dry-run }}'
128
+ echo "dry-run=${DRY_RUN:-true}" >> $GITHUB_OUTPUT
129
+ CONFIG='${{ inputs.config-path }}'
130
+ echo "config-path=${CONFIG:-${{ env.configPath }}}" >> $GITHUB_OUTPUT
101
131
  outputs:
102
132
  model: ${{ steps.normalise.outputs.model }}
103
133
  mode: ${{ steps.normalise.outputs.mode }}
@@ -105,11 +135,15 @@ jobs:
105
135
  issue-number: ${{ steps.normalise.outputs.issue-number }}
106
136
  schedule: ${{ steps.normalise.outputs.schedule }}
107
137
  pr-number: ${{ steps.normalise.outputs.pr-number }}
138
+ dry-run: ${{ steps.normalise.outputs.dry-run }}
139
+ config-path: ${{ steps.normalise.outputs.config-path }}
108
140
 
109
141
  # ─── PR Cleanup: merge/close/delete stale PRs and branches ─────────
110
142
  pr-cleanup:
111
143
  needs: params
112
- if: needs.params.outputs.mode == 'full' || needs.params.outputs.mode == 'pr-cleanup-only'
144
+ if: |
145
+ needs.params.outputs.dry-run != 'true' &&
146
+ (needs.params.outputs.mode == 'full' || needs.params.outputs.mode == 'pr-cleanup-only')
113
147
  runs-on: ubuntu-latest
114
148
  steps:
115
149
  - name: PR cleanup
@@ -194,7 +228,9 @@ jobs:
194
228
  # ─── Telemetry: gather repo state for supervisor ───────────────────
195
229
  telemetry:
196
230
  needs: params
197
- if: needs.params.outputs.mode == 'full' || needs.params.outputs.mode == 'dev-only' || needs.params.outputs.mode == 'review-only'
231
+ if: |
232
+ needs.params.outputs.dry-run != 'true' &&
233
+ (needs.params.outputs.mode == 'full' || needs.params.outputs.mode == 'dev-only' || needs.params.outputs.mode == 'review-only')
198
234
  runs-on: ubuntu-latest
199
235
  steps:
200
236
  - uses: actions/checkout@v4
@@ -271,6 +307,7 @@ jobs:
271
307
  needs: [params, pr-cleanup, telemetry]
272
308
  if: |
273
309
  always() &&
310
+ needs.params.outputs.dry-run != 'true' &&
274
311
  (needs.params.outputs.mode == 'full' || needs.params.outputs.mode == 'dev-only') &&
275
312
  needs.params.result == 'success'
276
313
  runs-on: ubuntu-latest
@@ -281,6 +318,10 @@ jobs:
281
318
  with:
282
319
  node-version: "24"
283
320
 
321
+ - name: Self-init (agentic-lib dev only)
322
+ if: hashFiles('scripts/self-init.sh') != '' && hashFiles('.github/agentic-lib/actions/agentic-step/package.json') == ''
323
+ run: bash scripts/self-init.sh
324
+
284
325
  - name: Install agentic-step dependencies
285
326
  working-directory: .github/agentic-lib/actions/agentic-step
286
327
  run: npm ci
@@ -292,7 +333,7 @@ jobs:
292
333
  COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
293
334
  with:
294
335
  task: "supervise"
295
- config: ${{ env.configPath }}
336
+ config: ${{ needs.params.outputs.config-path }}
296
337
  instructions: ".github/agentic-lib/agents/agent-supervisor.md"
297
338
  model: ${{ needs.params.outputs.model }}
298
339
 
@@ -313,6 +354,10 @@ jobs:
313
354
  with:
314
355
  node-version: "24"
315
356
 
357
+ - name: Self-init (agentic-lib dev only)
358
+ if: hashFiles('scripts/self-init.sh') != '' && hashFiles('.github/agentic-lib/actions/agentic-step/package.json') == ''
359
+ run: bash scripts/self-init.sh
360
+
316
361
  - name: Install agentic-step dependencies
317
362
  working-directory: .github/agentic-lib/actions/agentic-step
318
363
  run: npm ci
@@ -320,7 +365,7 @@ jobs:
320
365
  - name: Load config
321
366
  id: config
322
367
  run: |
323
- CONFIG="${{ env.configPath }}"
368
+ CONFIG="${{ needs.params.outputs.config-path }}"
324
369
  FEATURES=$(yq -r '.paths.featuresPath.path // "features/"' "$CONFIG")
325
370
  LIBRARY=$(yq -r '.paths.libraryDocumentsPath.path // "library/"' "$CONFIG")
326
371
  SOURCES=$(yq -r '.paths.librarySourcesFilepath.path // "SOURCES.md"' "$CONFIG")
@@ -334,7 +379,7 @@ jobs:
334
379
  COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
335
380
  with:
336
381
  task: "maintain-features"
337
- config: ${{ env.configPath }}
382
+ config: ${{ needs.params.outputs.config-path }}
338
383
  instructions: ".github/agentic-lib/agents/agent-maintain-features.md"
339
384
  writable-paths: ${{ steps.config.outputs.featuresWritablePaths }}
340
385
  model: ${{ needs.params.outputs.model }}
@@ -346,12 +391,13 @@ jobs:
346
391
  COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
347
392
  with:
348
393
  task: "maintain-library"
349
- config: ${{ env.configPath }}
394
+ config: ${{ needs.params.outputs.config-path }}
350
395
  instructions: ".github/agentic-lib/agents/agent-maintain-library.md"
351
396
  writable-paths: ${{ steps.config.outputs.libraryWritablePaths }}
352
397
  model: ${{ needs.params.outputs.model }}
353
398
 
354
399
  - name: Commit and push changes
400
+ if: needs.params.outputs.dry-run != 'true'
355
401
  uses: ./.github/agentic-lib/actions/commit-if-changed
356
402
  with:
357
403
  commit-message: "agentic-step: maintain features and library"
@@ -362,6 +408,7 @@ jobs:
362
408
  needs: [params, supervisor]
363
409
  if: |
364
410
  always() &&
411
+ needs.params.outputs.dry-run != 'true' &&
365
412
  needs.params.outputs.mode == 'full' &&
366
413
  needs.params.result == 'success'
367
414
  runs-on: ubuntu-latest
@@ -377,6 +424,10 @@ jobs:
377
424
  - name: Install project dependencies
378
425
  run: npm ci
379
426
 
427
+ - name: Self-init (agentic-lib dev only)
428
+ if: hashFiles('scripts/self-init.sh') != '' && hashFiles('.github/agentic-lib/actions/agentic-step/package.json') == ''
429
+ run: bash scripts/self-init.sh
430
+
380
431
  - name: Install agentic-step dependencies
381
432
  working-directory: .github/agentic-lib/actions/agentic-step
382
433
  run: npm ci
@@ -447,7 +498,7 @@ jobs:
447
498
  COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
448
499
  with:
449
500
  task: "fix-code"
450
- config: ${{ env.configPath }}
501
+ config: ${{ needs.params.outputs.config-path }}
451
502
  instructions: ".github/agentic-lib/agents/agent-apply-fix.md"
452
503
  pr-number: ${{ env.FIX_PR_NUMBER }}
453
504
  test-command: "npm test"
@@ -474,6 +525,10 @@ jobs:
474
525
  with:
475
526
  node-version: "24"
476
527
 
528
+ - name: Self-init (agentic-lib dev only)
529
+ if: hashFiles('scripts/self-init.sh') != '' && hashFiles('.github/agentic-lib/actions/agentic-step/package.json') == ''
530
+ run: bash scripts/self-init.sh
531
+
477
532
  - name: Install agentic-step dependencies
478
533
  working-directory: .github/agentic-lib/actions/agentic-step
479
534
  run: npm ci
@@ -485,7 +540,7 @@ jobs:
485
540
  COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
486
541
  with:
487
542
  task: "review-issue"
488
- config: ${{ env.configPath }}
543
+ config: ${{ needs.params.outputs.config-path }}
489
544
  instructions: ".github/agentic-lib/agents/agent-review-issue.md"
490
545
  model: ${{ needs.params.outputs.model }}
491
546
 
@@ -496,7 +551,7 @@ jobs:
496
551
  COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
497
552
  with:
498
553
  task: "enhance-issue"
499
- config: ${{ env.configPath }}
554
+ config: ${{ needs.params.outputs.config-path }}
500
555
  instructions: ".github/agentic-lib/agents/agent-ready-issue.md"
501
556
  model: ${{ needs.params.outputs.model }}
502
557
 
@@ -521,6 +576,10 @@ jobs:
521
576
  - name: Install project dependencies
522
577
  run: npm ci
523
578
 
579
+ - name: Self-init (agentic-lib dev only)
580
+ if: hashFiles('scripts/self-init.sh') != '' && hashFiles('.github/agentic-lib/actions/agentic-step/package.json') == ''
581
+ run: bash scripts/self-init.sh
582
+
524
583
  - name: Install agentic-step dependencies
525
584
  working-directory: .github/agentic-lib/actions/agentic-step
526
585
  run: npm ci
@@ -528,7 +587,7 @@ jobs:
528
587
  - name: Load config
529
588
  id: config
530
589
  run: |
531
- CONFIG="${{ env.configPath }}"
590
+ CONFIG="${{ needs.params.outputs.config-path }}"
532
591
  SOURCE=$(yq -r '.paths.targetSourcePath.path // "src/lib/"' "$CONFIG")
533
592
  TESTS=$(yq -r '.paths.targetTestsPath.path // "tests/unit/"' "$CONFIG")
534
593
  FEATURES=$(yq -r '.paths.featuresPath.path // "features/"' "$CONFIG")
@@ -579,7 +638,7 @@ jobs:
579
638
  COPILOT_GITHUB_TOKEN: ${{ secrets.COPILOT_GITHUB_TOKEN }}
580
639
  with:
581
640
  task: "transform"
582
- config: ${{ env.configPath }}
641
+ config: ${{ needs.params.outputs.config-path }}
583
642
  instructions: ".github/agentic-lib/agents/agent-issue-resolution.md"
584
643
  test-command: "npm test"
585
644
  model: ${{ needs.params.outputs.model }}
@@ -587,14 +646,14 @@ jobs:
587
646
  writable-paths: ${{ steps.config.outputs.writablePaths }}
588
647
 
589
648
  - name: Commit and push
590
- if: steps.issue.outputs.issue-number != ''
649
+ if: steps.issue.outputs.issue-number != '' && needs.params.outputs.dry-run != 'true'
591
650
  uses: ./.github/agentic-lib/actions/commit-if-changed
592
651
  with:
593
652
  commit-message: "agentic-step: transform issue #${{ steps.issue.outputs.issue-number }}"
594
653
  push-ref: ${{ steps.branch.outputs.branchName }}
595
654
 
596
655
  - name: Create PR and attempt merge
597
- if: steps.issue.outputs.issue-number != ''
656
+ if: steps.issue.outputs.issue-number != '' && needs.params.outputs.dry-run != 'true'
598
657
  uses: actions/github-script@v7
599
658
  with:
600
659
  script: |
@@ -696,11 +755,12 @@ jobs:
696
755
  echo "## agentic-lib-workflow run summary" >> $GITHUB_STEP_SUMMARY
697
756
  echo "- Mode: ${{ needs.params.outputs.mode }}" >> $GITHUB_STEP_SUMMARY
698
757
  echo "- Model: ${{ needs.params.outputs.model }}" >> $GITHUB_STEP_SUMMARY
758
+ echo "- Dry-run: ${{ needs.params.outputs.dry-run }}" >> $GITHUB_STEP_SUMMARY
699
759
 
700
760
  # ─── Schedule change (if requested) ────────────────────────────────
701
761
  update-schedule:
702
762
  needs: [params, dev]
703
- if: always() && needs.params.outputs.schedule != '' && needs.params.result == 'success'
763
+ if: always() && needs.params.outputs.dry-run != 'true' && needs.params.outputs.schedule != '' && needs.params.result == 'success'
704
764
  uses: ./.github/workflows/agentic-lib-schedule.yml
705
765
  with:
706
766
  frequency: ${{ needs.params.outputs.schedule }}
@@ -0,0 +1,39 @@
1
+ # SPDX-License-Identifier: GPL-3.0-only
2
+ # Copyright (C) 2025-2026 Polycode Limited
3
+ # agentic-lib.toml — Configuration for agentic-lib workflows
4
+ #
5
+ # Locally: paths point to test/ so dry-run workflows operate on test fixtures.
6
+ # During init: #@dist transforms restore standard paths for consumer repos.
7
+
8
+ [schedule]
9
+ supervisor = "daily" # off | weekly | daily | hourly | continuous
10
+ model = "gpt-5-mini" # gpt-5-mini | claude-sonnet-4 | gpt-4.1
11
+
12
+ [paths]
13
+ mission = "test/MISSION.md" #@dist "MISSION.md"
14
+ source = "test/src/lib/" #@dist "src/lib/"
15
+ tests = "test/tests/unit/" #@dist "tests/unit/"
16
+ features = "test/features/" #@dist "features/"
17
+ library = "test/library/" #@dist "library/"
18
+ docs = "test/docs/" #@dist "docs/"
19
+ examples = "test/examples/" #@dist "examples/"
20
+ readme = "test/README.md" #@dist "README.md"
21
+ dependencies = "test/package.json" #@dist "package.json"
22
+ contributing = "test/CONTRIBUTING.md" #@dist "CONTRIBUTING.md"
23
+ library-sources = "test/SOURCES.md" #@dist "SOURCES.md"
24
+
25
+ [execution]
26
+ build = "npm run build"
27
+ test = "npm test"
28
+ start = "npm run start"
29
+
30
+ [limits]
31
+ feature-issues = 2
32
+ maintenance-issues = 1
33
+ attempts-per-branch = 3
34
+ attempts-per-issue = 2
35
+ features-limit = 2
36
+ library-limit = 32
37
+
38
+ [bot]
39
+ log-file = "test/intentïon.md" #@dist "intentïon.md"
@@ -15,6 +15,7 @@
15
15
  // npx @xn-intenton-z2a/agentic-lib fix-code
16
16
 
17
17
  import { copyFileSync, existsSync, mkdirSync, rmSync, rmdirSync, readdirSync, readFileSync, writeFileSync } from "fs";
18
+ import { applyDistTransform } from "../src/dist-transform.js";
18
19
  import { resolve, dirname, join } from "path";
19
20
  import { fileURLToPath } from "url";
20
21
  import { execSync } from "child_process";
@@ -611,6 +612,19 @@ function createCliTools(writablePaths, defineTool) {
611
612
 
612
613
  // ─── Init Runner ─────────────────────────────────────────────────────
613
614
 
615
+ function initTransformFile(src, dst, label) {
616
+ const content = readFileSync(src, "utf8");
617
+ const transformed = applyDistTransform(content);
618
+ if (dryRun) {
619
+ console.log(` TRANSFORM: ${label}`);
620
+ } else {
621
+ mkdirSync(dirname(dst), { recursive: true });
622
+ writeFileSync(dst, transformed);
623
+ console.log(` TRANSFORM: ${label}`);
624
+ }
625
+ initChanges++;
626
+ }
627
+
614
628
  function initCopyFile(src, dst, label) {
615
629
  if (dryRun) {
616
630
  console.log(` COPY: ${label}`);
@@ -655,33 +669,17 @@ function removeStaleWorkflows(templateWorkflows) {
655
669
 
656
670
  function initWorkflows() {
657
671
  console.log("--- Workflows ---");
658
- const workflowsDir = resolve(srcDir, "workflows");
659
- if (!existsSync(workflowsDir)) return;
672
+ // Distributable workflows live in .github/workflows/agentic-lib-*.yml
673
+ // and are transformed via #@dist markers during init
674
+ const ownWorkflowsDir = resolve(pkgRoot, ".github/workflows");
675
+ if (!existsSync(ownWorkflowsDir)) return;
660
676
  const templateWorkflows = new Set();
661
- for (const f of readdirSync(workflowsDir)) {
662
- if (f.endsWith(".yml")) {
677
+ for (const f of readdirSync(ownWorkflowsDir)) {
678
+ if (f.startsWith("agentic-lib-") && f.endsWith(".yml")) {
663
679
  templateWorkflows.add(f);
664
- initCopyFile(resolve(workflowsDir, f), resolve(target, ".github/workflows", f), `workflows/${f}`);
680
+ initTransformFile(resolve(ownWorkflowsDir, f), resolve(target, ".github/workflows", f), `workflows/${f}`);
665
681
  }
666
682
  }
667
- const seedTest = resolve(srcDir, "seeds/agentic-lib-test.yml");
668
- if (existsSync(seedTest)) {
669
- templateWorkflows.add("agentic-lib-test.yml");
670
- initCopyFile(
671
- seedTest,
672
- resolve(target, ".github/workflows/agentic-lib-test.yml"),
673
- "workflows/agentic-lib-test.yml (from seeds)",
674
- );
675
- }
676
- const seedInit = resolve(srcDir, "seeds/agentic-lib-init.yml");
677
- if (existsSync(seedInit)) {
678
- templateWorkflows.add("agentic-lib-init.yml");
679
- initCopyFile(
680
- seedInit,
681
- resolve(target, ".github/workflows/agentic-lib-init.yml"),
682
- "workflows/agentic-lib-init.yml (from seeds)",
683
- );
684
- }
685
683
  removeStaleWorkflows(templateWorkflows);
686
684
  }
687
685
 
@@ -748,14 +746,15 @@ function initScripts(agenticDir) {
748
746
 
749
747
  function initConfig(seedsDir) {
750
748
  console.log("\n--- Config ---");
751
- const tomlSeed = resolve(seedsDir, "zero-agentic-lib.toml");
749
+ // Config TOML lives at project root with #@dist markers — transform for distribution
750
+ const tomlSource = resolve(pkgRoot, "agentic-lib.toml");
752
751
  const tomlTarget = resolve(target, "agentic-lib.toml");
753
- if (existsSync(tomlSeed) && !existsSync(tomlTarget)) {
754
- initCopyFile(tomlSeed, tomlTarget, "agentic-lib.toml (new)");
752
+ if (existsSync(tomlSource) && !existsSync(tomlTarget)) {
753
+ initTransformFile(tomlSource, tomlTarget, "agentic-lib.toml (new)");
755
754
  } else if (existsSync(tomlTarget)) {
756
755
  console.log(" SKIP: agentic-lib.toml already exists");
757
756
  } else {
758
- console.log(" SKIP: seed TOML not found");
757
+ console.log(" SKIP: source TOML not found");
759
758
  }
760
759
 
761
760
  const giSeed = resolve(seedsDir, "zero-.gitignore");
@@ -856,7 +855,6 @@ function initPurge(seedsDir, missionName) {
856
855
  "zero-SOURCES.md": "SOURCES.md",
857
856
  "zero-package.json": "package.json",
858
857
  "zero-README.md": "README.md",
859
- "zero-agentic-lib.toml": "agentic-lib.toml",
860
858
  "zero-.gitignore": ".gitignore",
861
859
  };
862
860
  for (const [seedFile, targetRel] of Object.entries(SEED_MAP)) {
@@ -866,6 +864,12 @@ function initPurge(seedsDir, missionName) {
866
864
  }
867
865
  }
868
866
 
867
+ // Force-overwrite agentic-lib.toml during purge (transformed from root)
868
+ const tomlSource = resolve(pkgRoot, "agentic-lib.toml");
869
+ if (existsSync(tomlSource)) {
870
+ initTransformFile(tomlSource, resolve(target, "agentic-lib.toml"), "SEED: agentic-lib.toml (transformed)");
871
+ }
872
+
869
873
  // Copy mission seed file as MISSION.md
870
874
  const missionsDir = resolve(seedsDir, "missions");
871
875
  const missionFile = resolve(missionsDir, `${missionName}.md`);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xn-intenton-z2a/agentic-lib",
3
- "version": "7.1.53",
3
+ "version": "7.1.55",
4
4
  "description": "Agentic-lib Agentic Coding Systems SDK powering automated GitHub workflows.",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -70,7 +70,9 @@
70
70
  "files": [
71
71
  "package.json",
72
72
  "bin/",
73
- "src/workflows/",
73
+ "src/dist-transform.js",
74
+ ".github/workflows/agentic-lib-*.yml",
75
+ "agentic-lib.toml",
74
76
  "src/actions/agentic-step/*.js",
75
77
  "src/actions/agentic-step/*.yml",
76
78
  "src/actions/agentic-step/*.json",
@@ -40,15 +40,23 @@ runs:
40
40
  git commit -m "${{ inputs.commit-message }}"
41
41
  REF="${{ inputs.push-ref }}"
42
42
  MAX_RETRIES=3
43
+ REMOTE_REF_EXISTS=""
44
+ if [ -n "$REF" ]; then
45
+ git ls-remote --exit-code origin "$REF" > /dev/null 2>&1 && REMOTE_REF_EXISTS="true"
46
+ else
47
+ REMOTE_REF_EXISTS="true"
48
+ fi
43
49
  for attempt in $(seq 1 $MAX_RETRIES); do
44
50
  if [ -n "$REF" ]; then
45
- git pull --rebase origin "$REF" || {
46
- echo "Rebase conflict on attempt $attempt aborting rebase and retrying"
47
- git rebase --abort 2>/dev/null || true
48
- sleep $((attempt * 2))
49
- continue
50
- }
51
- git push origin "$REF" && break
51
+ if [ "$REMOTE_REF_EXISTS" = "true" ]; then
52
+ git pull --rebase origin "$REF" || {
53
+ echo "Rebase conflict on attempt $attempt — aborting rebase and retrying"
54
+ git rebase --abort 2>/dev/null || true
55
+ sleep $((attempt * 2))
56
+ continue
57
+ }
58
+ fi
59
+ git push origin "$REF" && { REMOTE_REF_EXISTS="true"; break; }
52
60
  else
53
61
  git pull --rebase || {
54
62
  echo "Rebase conflict on attempt $attempt — aborting rebase and retrying"
@@ -0,0 +1,36 @@
1
+ // SPDX-License-Identifier: GPL-3.0-only
2
+ // Copyright (C) 2025-2026 Polycode Limited
3
+ // src/dist-transform.js — #@dist marker transform for distribution
4
+
5
+ /**
6
+ * Apply #@dist transforms to file content for distribution.
7
+ *
8
+ * Two patterns:
9
+ * 1. Line starts with "#@dist " — uncomment by removing the "#@dist " prefix
10
+ * e.g. "#@dist schedule:" → "schedule:"
11
+ * 2. Line contains " #@dist <value>" suffix — replace the preceding value
12
+ * e.g. 'default: true #@dist false' → 'default: false'
13
+ * e.g. 'mission = "test/MISSION.md" #@dist "MISSION.md"' → 'mission = "MISSION.md"'
14
+ */
15
+ export function applyDistTransform(content) {
16
+ return content
17
+ .split("\n")
18
+ .map((line) => {
19
+ // Pattern 1: line starts with #@dist — uncomment
20
+ const commentMatch = line.match(/^(\s*)#@dist (.*)$/);
21
+ if (commentMatch) {
22
+ return commentMatch[1] + commentMatch[2];
23
+ }
24
+ // Pattern 2: inline #@dist <replacement> — replace preceding value
25
+ const inlineMatch = line.match(/^(.+?)\s+#@dist\s+(.+)$/); // eslint-disable-line sonarjs/slow-regex
26
+ if (inlineMatch) {
27
+ const before = inlineMatch[1];
28
+ const replacement = inlineMatch[2];
29
+ // Replace the last value token on the line before #@dist
30
+ // Handles: 'key: value' (YAML) and 'key = "value"' (TOML)
31
+ return before.replace(/(:\s*|=\s*)(\S+)\s*$/, `$1${replacement}`); // eslint-disable-line sonarjs/slow-regex
32
+ }
33
+ return line;
34
+ })
35
+ .join("\n");
36
+ }
@@ -4,3 +4,5 @@ Reference material and documentation sources for this project.
4
4
 
5
5
  Add URLs, papers, API docs, or other reference material here.
6
6
  The maintain-library workflow will process these into `library/` documents.
7
+
8
+ - https://en.wikipedia.org/wiki/Fizz_buzz
@@ -14,7 +14,7 @@
14
14
  "author": "",
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
- "@xn-intenton-z2a/agentic-lib": "^7.1.53"
17
+ "@xn-intenton-z2a/agentic-lib": "^7.1.55"
18
18
  },
19
19
  "devDependencies": {
20
20
  "@vitest/coverage-v8": "^4.0.18",
@@ -1,39 +0,0 @@
1
- # SPDX-License-Identifier: MIT
2
- # Copyright (C) 2025-2026 Polycode Limited
3
- # agentic-lib.toml — Configuration for agentic-lib workflows
4
- #
5
- # This file controls how agentic workflows operate on your repository.
6
- # Place it at the root of your project.
7
-
8
- [schedule]
9
- supervisor = "daily" # off | weekly | daily | hourly | continuous
10
- model = "gpt-5-mini" # gpt-5-mini | claude-sonnet-4 | gpt-4.1
11
-
12
- [paths]
13
- mission = "MISSION.md"
14
- source = "src/lib/"
15
- tests = "tests/unit/"
16
- features = "features/"
17
- library = "library/"
18
- docs = "docs/"
19
- examples = "examples/"
20
- readme = "README.md"
21
- dependencies = "package.json"
22
- contributing = "CONTRIBUTING.md"
23
- library-sources = "SOURCES.md"
24
-
25
- [execution]
26
- build = "npm run build"
27
- test = "npm test"
28
- start = "npm run start"
29
-
30
- [limits]
31
- feature-issues = 5
32
- maintenance-issues = 1
33
- attempts-per-branch = 3
34
- attempts-per-issue = 2
35
- features-limit = 4
36
- library-limit = 32
37
-
38
- [bot]
39
- log-file = "intentïon.md"