@xn-intenton-z2a/agentic-lib 7.1.87 → 7.1.89
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/.github/workflows/agentic-lib-init.yml +47 -0
- package/.github/workflows/agentic-lib-schedule.yml +25 -2
- package/.github/workflows/agentic-lib-test.yml +2 -2
- package/.github/workflows/agentic-lib-workflow.yml +43 -7
- package/package.json +1 -1
- package/src/seeds/missions/markdown-compiler.md +33 -0
- package/src/seeds/missions/ray-tracer.md +31 -0
- package/src/seeds/zero-package.json +1 -1
|
@@ -39,6 +39,10 @@ on:
|
|
|
39
39
|
type: string
|
|
40
40
|
required: false
|
|
41
41
|
default: ""
|
|
42
|
+
profile:
|
|
43
|
+
type: string
|
|
44
|
+
required: false
|
|
45
|
+
default: ""
|
|
42
46
|
workflow_dispatch:
|
|
43
47
|
inputs:
|
|
44
48
|
mode:
|
|
@@ -71,6 +75,9 @@ on:
|
|
|
71
75
|
- cron-engine
|
|
72
76
|
- owl-ontology
|
|
73
77
|
- time-series-lab
|
|
78
|
+
- c64-emulator
|
|
79
|
+
- ray-tracer
|
|
80
|
+
- markdown-compiler
|
|
74
81
|
- empty
|
|
75
82
|
mission-text:
|
|
76
83
|
description: "Freeform mission text for MISSION.md (overrides mission-seed if provided)"
|
|
@@ -99,6 +106,16 @@ on:
|
|
|
99
106
|
- gpt-5-mini
|
|
100
107
|
- claude-sonnet-4
|
|
101
108
|
- gpt-4.1
|
|
109
|
+
profile:
|
|
110
|
+
description: "Tuning profile (leave empty to keep current)"
|
|
111
|
+
type: choice
|
|
112
|
+
required: false
|
|
113
|
+
default: ""
|
|
114
|
+
options:
|
|
115
|
+
- ""
|
|
116
|
+
- min
|
|
117
|
+
- recommended
|
|
118
|
+
- max
|
|
102
119
|
|
|
103
120
|
permissions: write-all
|
|
104
121
|
|
|
@@ -122,6 +139,8 @@ jobs:
|
|
|
122
139
|
echo "schedule=${SCHEDULE}" >> $GITHUB_OUTPUT
|
|
123
140
|
MODEL='${{ inputs.model }}'
|
|
124
141
|
echo "model=${MODEL:-gpt-5-mini}" >> $GITHUB_OUTPUT
|
|
142
|
+
PROFILE='${{ inputs.profile }}'
|
|
143
|
+
echo "profile=${PROFILE}" >> $GITHUB_OUTPUT
|
|
125
144
|
outputs:
|
|
126
145
|
mode: ${{ steps.normalise.outputs.mode }}
|
|
127
146
|
dry-run: ${{ steps.normalise.outputs.dry-run }}
|
|
@@ -129,6 +148,7 @@ jobs:
|
|
|
129
148
|
mission-text: ${{ steps.normalise.outputs.mission-text }}
|
|
130
149
|
schedule: ${{ steps.normalise.outputs.schedule }}
|
|
131
150
|
model: ${{ steps.normalise.outputs.model }}
|
|
151
|
+
profile: ${{ steps.normalise.outputs.profile }}
|
|
132
152
|
|
|
133
153
|
init:
|
|
134
154
|
needs: params
|
|
@@ -200,6 +220,33 @@ jobs:
|
|
|
200
220
|
|
|
201
221
|
- run: npm test
|
|
202
222
|
|
|
223
|
+
- name: Update model and profile (if requested)
|
|
224
|
+
if: github.repository != 'xn-intenton-z2a/agentic-lib' && needs.params.outputs.dry-run != 'true' && (needs.params.outputs.model != '' || needs.params.outputs.profile != '')
|
|
225
|
+
uses: actions/github-script@v8
|
|
226
|
+
with:
|
|
227
|
+
script: |
|
|
228
|
+
const fs = require('fs');
|
|
229
|
+
const model = '${{ needs.params.outputs.model }}';
|
|
230
|
+
const profile = '${{ needs.params.outputs.profile }}';
|
|
231
|
+
const tomlPath = 'agentic-lib.toml';
|
|
232
|
+
if (!fs.existsSync(tomlPath)) return;
|
|
233
|
+
let toml = fs.readFileSync(tomlPath, 'utf8');
|
|
234
|
+
if (model) {
|
|
235
|
+
const modelRegex = /(\[tuning\][^\[]*?)(^\s*model\s*=\s*"[^"]*")/m;
|
|
236
|
+
if (modelRegex.test(toml)) {
|
|
237
|
+
toml = toml.replace(modelRegex, `$1model = "${model}"`);
|
|
238
|
+
core.info(`Updated [tuning].model to: ${model}`);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (profile) {
|
|
242
|
+
const profileRegex = /(\[tuning\][^\[]*?)(^\s*profile\s*=\s*"[^"]*")/m;
|
|
243
|
+
if (profileRegex.test(toml)) {
|
|
244
|
+
toml = toml.replace(profileRegex, `$1profile = "${profile}"`);
|
|
245
|
+
core.info(`Updated [tuning].profile to: ${profile}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
fs.writeFileSync(tomlPath, toml);
|
|
249
|
+
|
|
203
250
|
- name: Update schedule (if requested)
|
|
204
251
|
if: github.repository != 'xn-intenton-z2a/agentic-lib' && needs.params.outputs.schedule != '' && needs.params.outputs.dry-run != 'true'
|
|
205
252
|
uses: actions/github-script@v8
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# No trigger changes needed — uses workflow_call and workflow_dispatch only.
|
|
9
9
|
|
|
10
10
|
name: agentic-lib-schedule
|
|
11
|
-
run-name: "agentic-lib-schedule -> ${{ inputs.frequency }} (${{ inputs.model }})"
|
|
11
|
+
run-name: "agentic-lib-schedule -> ${{ inputs.frequency }} (${{ inputs.model }}${{ inputs.profile && format(', profile={0}', inputs.profile) || '' }})"
|
|
12
12
|
|
|
13
13
|
on:
|
|
14
14
|
workflow_call:
|
|
@@ -22,6 +22,11 @@ on:
|
|
|
22
22
|
required: false
|
|
23
23
|
type: string
|
|
24
24
|
default: "gpt-5-mini"
|
|
25
|
+
profile:
|
|
26
|
+
description: "Tuning profile"
|
|
27
|
+
required: false
|
|
28
|
+
type: string
|
|
29
|
+
default: ""
|
|
25
30
|
dry-run:
|
|
26
31
|
description: "Skip commit and push"
|
|
27
32
|
required: false
|
|
@@ -48,6 +53,16 @@ on:
|
|
|
48
53
|
- gpt-5-mini
|
|
49
54
|
- claude-sonnet-4
|
|
50
55
|
- gpt-4.1
|
|
56
|
+
profile:
|
|
57
|
+
description: "Tuning profile"
|
|
58
|
+
required: false
|
|
59
|
+
type: choice
|
|
60
|
+
default: ""
|
|
61
|
+
options:
|
|
62
|
+
- ""
|
|
63
|
+
- min
|
|
64
|
+
- recommended
|
|
65
|
+
- max
|
|
51
66
|
dry-run:
|
|
52
67
|
description: "Skip commit and push"
|
|
53
68
|
type: boolean
|
|
@@ -76,6 +91,7 @@ jobs:
|
|
|
76
91
|
const fs = require('fs');
|
|
77
92
|
const frequency = '${{ inputs.frequency }}';
|
|
78
93
|
const model = '${{ inputs.model || 'gpt-5-mini' }}';
|
|
94
|
+
const profile = '${{ inputs.profile }}';
|
|
79
95
|
const workflowPath = '.github/workflows/agentic-lib-workflow.yml';
|
|
80
96
|
const tomlPath = 'agentic-lib.toml';
|
|
81
97
|
|
|
@@ -139,8 +155,15 @@ jobs:
|
|
|
139
155
|
toml = toml.replace(scheduleSupervisorRegex, `$1supervisor = "${frequency}"`);
|
|
140
156
|
}
|
|
141
157
|
|
|
158
|
+
if (profile) {
|
|
159
|
+
const profileRegex = /(\[tuning\][^\[]*?)(^\s*profile\s*=\s*"[^"]*")/m;
|
|
160
|
+
if (profileRegex.test(toml)) {
|
|
161
|
+
toml = toml.replace(profileRegex, `$1profile = "${profile}"`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
142
165
|
fs.writeFileSync(tomlPath, toml);
|
|
143
|
-
core.info(`Updated agentic-lib.toml: model=${model}, supervisor=${frequency}`);
|
|
166
|
+
core.info(`Updated agentic-lib.toml: model=${model}, supervisor=${frequency}${profile ? ', profile=' + profile : ''}`);
|
|
144
167
|
} else {
|
|
145
168
|
core.warning('agentic-lib.toml not found — skipping config update');
|
|
146
169
|
}
|
|
@@ -68,7 +68,7 @@ jobs:
|
|
|
68
68
|
HOME: /root
|
|
69
69
|
|
|
70
70
|
- name: Upload screenshot
|
|
71
|
-
if:
|
|
71
|
+
if: ${{ !cancelled() }}
|
|
72
72
|
uses: actions/upload-artifact@v4
|
|
73
73
|
with:
|
|
74
74
|
name: screenshot
|
|
@@ -101,7 +101,7 @@ jobs:
|
|
|
101
101
|
dispatch-fix:
|
|
102
102
|
needs: [test, behaviour]
|
|
103
103
|
if: >-
|
|
104
|
-
|
|
104
|
+
!cancelled()
|
|
105
105
|
&& github.ref == 'refs/heads/main'
|
|
106
106
|
&& github.event_name != 'pull_request'
|
|
107
107
|
&& github.repository != 'xn-intenton-z2a/agentic-lib'
|
|
@@ -24,6 +24,10 @@ on:
|
|
|
24
24
|
type: string
|
|
25
25
|
required: false
|
|
26
26
|
default: "gpt-5-mini"
|
|
27
|
+
profile:
|
|
28
|
+
type: string
|
|
29
|
+
required: false
|
|
30
|
+
default: ""
|
|
27
31
|
mode:
|
|
28
32
|
type: string
|
|
29
33
|
required: false
|
|
@@ -47,6 +51,16 @@ on:
|
|
|
47
51
|
- gpt-5-mini
|
|
48
52
|
- claude-sonnet-4
|
|
49
53
|
- gpt-4.1
|
|
54
|
+
profile:
|
|
55
|
+
description: "Tuning profile"
|
|
56
|
+
type: choice
|
|
57
|
+
required: false
|
|
58
|
+
default: ""
|
|
59
|
+
options:
|
|
60
|
+
- ""
|
|
61
|
+
- min
|
|
62
|
+
- recommended
|
|
63
|
+
- max
|
|
50
64
|
mode:
|
|
51
65
|
description: "Run mode"
|
|
52
66
|
type: choice
|
|
@@ -115,6 +129,8 @@ jobs:
|
|
|
115
129
|
run: |
|
|
116
130
|
MODEL='${{ inputs.model }}'
|
|
117
131
|
echo "model=${MODEL:-gpt-5-mini}" >> $GITHUB_OUTPUT
|
|
132
|
+
PROFILE='${{ inputs.profile }}'
|
|
133
|
+
echo "profile=${PROFILE}" >> $GITHUB_OUTPUT
|
|
118
134
|
MODE='${{ inputs.mode }}'
|
|
119
135
|
echo "mode=${MODE:-full}" >> $GITHUB_OUTPUT
|
|
120
136
|
echo "message=${{ inputs.message }}" >> $GITHUB_OUTPUT
|
|
@@ -137,6 +153,7 @@ jobs:
|
|
|
137
153
|
echo "config-path=${CONFIG:-${{ env.configPath }}}" >> $GITHUB_OUTPUT
|
|
138
154
|
outputs:
|
|
139
155
|
model: ${{ steps.normalise.outputs.model }}
|
|
156
|
+
profile: ${{ steps.normalise.outputs.profile }}
|
|
140
157
|
mode: ${{ steps.normalise.outputs.mode }}
|
|
141
158
|
message: ${{ steps.normalise.outputs.message }}
|
|
142
159
|
issue-number: ${{ steps.normalise.outputs.issue-number }}
|
|
@@ -298,7 +315,7 @@ jobs:
|
|
|
298
315
|
maintain:
|
|
299
316
|
needs: [params]
|
|
300
317
|
if: |
|
|
301
|
-
|
|
318
|
+
!cancelled() &&
|
|
302
319
|
(needs.params.outputs.mode == 'full' || needs.params.outputs.mode == 'maintain-only') &&
|
|
303
320
|
needs.params.result == 'success'
|
|
304
321
|
runs-on: ubuntu-latest
|
|
@@ -330,6 +347,23 @@ jobs:
|
|
|
330
347
|
working-directory: .github/agentic-lib/actions/agentic-step
|
|
331
348
|
run: npm ci
|
|
332
349
|
|
|
350
|
+
- name: Apply profile and model to config
|
|
351
|
+
if: needs.params.outputs.profile != '' || needs.params.outputs.model != 'gpt-5-mini'
|
|
352
|
+
run: |
|
|
353
|
+
CONFIG="${{ needs.params.outputs.config-path }}"
|
|
354
|
+
PROFILE="${{ needs.params.outputs.profile }}"
|
|
355
|
+
MODEL="${{ needs.params.outputs.model }}"
|
|
356
|
+
if [ -f "$CONFIG" ]; then
|
|
357
|
+
if [ -n "$PROFILE" ]; then
|
|
358
|
+
sed -i "s/^profile = \"[^\"]*\"/profile = \"${PROFILE}\"/" "$CONFIG"
|
|
359
|
+
echo "Updated [tuning].profile to: ${PROFILE}"
|
|
360
|
+
fi
|
|
361
|
+
if [ -n "$MODEL" ] && [ "$MODEL" != "gpt-5-mini" ]; then
|
|
362
|
+
sed -i "s/^model = \"[^\"]*\"/model = \"${MODEL}\"/" "$CONFIG"
|
|
363
|
+
echo "Updated [tuning].model to: ${MODEL}"
|
|
364
|
+
fi
|
|
365
|
+
fi
|
|
366
|
+
|
|
333
367
|
- name: Load config
|
|
334
368
|
id: config
|
|
335
369
|
run: |
|
|
@@ -386,7 +420,7 @@ jobs:
|
|
|
386
420
|
supervisor:
|
|
387
421
|
needs: [params, pr-cleanup, telemetry, maintain]
|
|
388
422
|
if: |
|
|
389
|
-
|
|
423
|
+
!cancelled() &&
|
|
390
424
|
(needs.params.outputs.mode == 'full' || needs.params.outputs.mode == 'dev-only') &&
|
|
391
425
|
needs.params.result == 'success'
|
|
392
426
|
runs-on: ubuntu-latest
|
|
@@ -422,7 +456,7 @@ jobs:
|
|
|
422
456
|
fix-stuck:
|
|
423
457
|
needs: [params, supervisor]
|
|
424
458
|
if: |
|
|
425
|
-
|
|
459
|
+
!cancelled() &&
|
|
426
460
|
needs.params.outputs.mode == 'full' &&
|
|
427
461
|
needs.params.result == 'success'
|
|
428
462
|
runs-on: ubuntu-latest
|
|
@@ -666,7 +700,7 @@ jobs:
|
|
|
666
700
|
review-features:
|
|
667
701
|
needs: [params, supervisor]
|
|
668
702
|
if: |
|
|
669
|
-
|
|
703
|
+
!cancelled() &&
|
|
670
704
|
(needs.params.outputs.mode == 'full' || needs.params.outputs.mode == 'review-only') &&
|
|
671
705
|
needs.params.result == 'success'
|
|
672
706
|
runs-on: ubuntu-latest
|
|
@@ -711,7 +745,7 @@ jobs:
|
|
|
711
745
|
dev:
|
|
712
746
|
needs: [params, review-features]
|
|
713
747
|
if: |
|
|
714
|
-
|
|
748
|
+
!cancelled() &&
|
|
715
749
|
(needs.params.outputs.mode == 'full' || needs.params.outputs.mode == 'dev-only') &&
|
|
716
750
|
needs.params.result == 'success'
|
|
717
751
|
runs-on: ubuntu-latest
|
|
@@ -945,7 +979,7 @@ jobs:
|
|
|
945
979
|
# ─── Post-merge: stats, schedule, mission check ────────────────────
|
|
946
980
|
post-merge:
|
|
947
981
|
needs: [params, dev, pr-cleanup]
|
|
948
|
-
if:
|
|
982
|
+
if: ${{ !cancelled() && needs.params.result == 'success' }}
|
|
949
983
|
runs-on: ubuntu-latest
|
|
950
984
|
steps:
|
|
951
985
|
- uses: actions/checkout@v6
|
|
@@ -961,15 +995,17 @@ jobs:
|
|
|
961
995
|
echo "## agentic-lib-workflow run summary" >> $GITHUB_STEP_SUMMARY
|
|
962
996
|
echo "- Mode: ${{ needs.params.outputs.mode }}" >> $GITHUB_STEP_SUMMARY
|
|
963
997
|
echo "- Model: ${{ needs.params.outputs.model }}" >> $GITHUB_STEP_SUMMARY
|
|
998
|
+
echo "- Profile: ${{ needs.params.outputs.profile || '(from config)' }}" >> $GITHUB_STEP_SUMMARY
|
|
964
999
|
echo "- Dry-run: ${{ needs.params.outputs.dry-run }}" >> $GITHUB_STEP_SUMMARY
|
|
965
1000
|
echo "- Website: [${SITE_URL}](${SITE_URL})" >> $GITHUB_STEP_SUMMARY
|
|
966
1001
|
|
|
967
1002
|
# ─── Schedule change (if requested) ────────────────────────────────
|
|
968
1003
|
update-schedule:
|
|
969
1004
|
needs: [params, dev]
|
|
970
|
-
if:
|
|
1005
|
+
if: ${{ !cancelled() && needs.params.outputs.dry-run != 'true' && needs.params.outputs.schedule != '' && needs.params.result == 'success' }}
|
|
971
1006
|
uses: ./.github/workflows/agentic-lib-schedule.yml
|
|
972
1007
|
with:
|
|
973
1008
|
frequency: ${{ needs.params.outputs.schedule }}
|
|
974
1009
|
model: ${{ needs.params.outputs.model }}
|
|
1010
|
+
profile: ${{ needs.params.outputs.profile }}
|
|
975
1011
|
secrets: inherit
|
package/package.json
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# Mission
|
|
2
|
+
|
|
3
|
+
Build a Markdown-to-HTML compiler library that converts GitHub Flavored Markdown (GFM) to
|
|
4
|
+
semantic HTML.
|
|
5
|
+
|
|
6
|
+
The library should progressively implement parsing and rendering for:
|
|
7
|
+
1. Headings (h1-h6 via `#` markers) and paragraphs
|
|
8
|
+
2. Inline formatting: bold (`**`), italic (`*`), code (`` ` ``), strikethrough (`~~`)
|
|
9
|
+
3. Links `[text](url)` and images ``
|
|
10
|
+
4. Ordered and unordered lists (including nested lists)
|
|
11
|
+
5. Code blocks (fenced with ``` and language annotation)
|
|
12
|
+
6. Blockquotes (nested `>`)
|
|
13
|
+
7. Tables (GFM pipe syntax with alignment)
|
|
14
|
+
8. Horizontal rules (`---`, `***`, `___`)
|
|
15
|
+
9. Task lists (`- [ ]`, `- [x]`)
|
|
16
|
+
10. Auto-linked URLs and HTML entity escaping
|
|
17
|
+
|
|
18
|
+
## Technical Requirements
|
|
19
|
+
|
|
20
|
+
- Pure JavaScript, no external Markdown parsing libraries
|
|
21
|
+
- Two-pass architecture: tokeniser/lexer pass, then renderer pass
|
|
22
|
+
- XSS-safe: all user content must be HTML-escaped before insertion
|
|
23
|
+
- Exported as both CommonJS and ESM
|
|
24
|
+
|
|
25
|
+
## Acceptance Criteria
|
|
26
|
+
|
|
27
|
+
- `compile(markdown)` returns an HTML string
|
|
28
|
+
- `tokenize(markdown)` returns an array of token objects (for inspection/testing)
|
|
29
|
+
- Handles all 10 feature areas listed above
|
|
30
|
+
- Passes a test suite of at least 30 input/output pairs covering edge cases
|
|
31
|
+
- Nested constructs work: bold inside links, links inside lists, code inside blockquotes
|
|
32
|
+
- A sample document is compiled and saved to `docs/examples/sample.html`
|
|
33
|
+
- Output validates as well-formed HTML (no unclosed tags)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Mission
|
|
2
|
+
|
|
3
|
+
Build a ray tracer library that renders 3D scenes to PPM image files.
|
|
4
|
+
|
|
5
|
+
The library should progressively implement:
|
|
6
|
+
1. Ray-sphere intersection and basic shading
|
|
7
|
+
2. Multiple objects (spheres, planes) with diffuse lighting
|
|
8
|
+
3. Shadows and ambient occlusion
|
|
9
|
+
4. Reflective surfaces with recursive ray bouncing
|
|
10
|
+
5. Refractive materials (glass, water) with Snell's law
|
|
11
|
+
6. A scene description format (JSON) for defining cameras, lights, and objects
|
|
12
|
+
7. Anti-aliasing via supersampling
|
|
13
|
+
8. Texture mapping (checkerboard, procedural noise)
|
|
14
|
+
|
|
15
|
+
## Technical Requirements
|
|
16
|
+
|
|
17
|
+
- Pure JavaScript, no native dependencies
|
|
18
|
+
- Output PPM (P3) format — simple text-based image format
|
|
19
|
+
- Vector3 class for all geometric operations
|
|
20
|
+
- Configurable resolution and ray depth
|
|
21
|
+
- Deterministic output (no random sampling unless seeded)
|
|
22
|
+
|
|
23
|
+
## Acceptance Criteria
|
|
24
|
+
|
|
25
|
+
- `renderScene(scene)` returns a PPM string for a given scene description
|
|
26
|
+
- `parseScene(json)` loads a scene from a JSON string
|
|
27
|
+
- Renders a scene with 3+ spheres, a plane, and a point light in under 10 seconds (640x480)
|
|
28
|
+
- At least one sphere is reflective and one is refractive
|
|
29
|
+
- Unit tests verify ray-sphere intersection, reflection vectors, and Snell's law
|
|
30
|
+
- A sample scene JSON file is included in `docs/examples/`
|
|
31
|
+
- Output PPM can be viewed in any image viewer (validated by checking header format)
|