enigma-cli 1.37.3 → 1.38.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/assets/commands/gate.md +41 -10
- package/assets/memory/AGENTS.md +1 -1
- package/assets/memory/CLAUDE.md +1 -1
- package/assets/registry/primitives/registry.json +213 -26
- package/assets/skills/anti-overengineering-policy/skill.json +1 -1
- package/assets/skills/anti-overengineering-review/skill.json +1 -1
- package/assets/skills/backend-policy/skill.json +1 -1
- package/assets/skills/ciphera-style-policy/skill.json +1 -1
- package/assets/skills/code-review-policy/skill.json +1 -1
- package/assets/skills/core-engineering-policy/skill.json +1 -1
- package/assets/skills/database-expert/skill.json +1 -1
- package/assets/skills/debugging-policy/skill.json +1 -1
- package/assets/skills/dependency-policy/skill.json +1 -1
- package/assets/skills/email-policy/skill.json +1 -1
- package/assets/skills/frontend-design/skill.json +1 -1
- package/assets/skills/frontend-policy/SKILL.md +1 -0
- package/assets/skills/frontend-policy/skill.json +3 -3
- package/assets/skills/git-policy/skill.json +1 -1
- package/assets/skills/logo-sourcing-policy/skill.json +1 -1
- package/assets/skills/security-policy/skill.json +1 -1
- package/assets/skills/skill-creator/skill.json +1 -1
- package/assets/skills/task-completion-policy/skill.json +1 -1
- package/assets/skills/technical-writing-policy/skill.json +1 -1
- package/assets/skills/testing-policy/skill.json +1 -1
- package/assets/skills/validation-policy/skill.json +1 -1
- package/bin/checksums.json +4 -4
- package/bin/statusline.mjs +16 -7
- package/package.json +1 -1
package/assets/commands/gate.md
CHANGED
|
@@ -123,12 +123,26 @@ What follows from that:
|
|
|
123
123
|
`/gate off`: `-l` for this project, `-g` only when the user says every project -
|
|
124
124
|
a bare `enigma config` writes the GLOBAL file. Report the change and its scope;
|
|
125
125
|
it is the user's strictness you are lowering.
|
|
126
|
-
- **
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
126
|
+
- **Sizing the run is YOUR job, not a question.** Pick the shape from the change in
|
|
127
|
+
front of you, run it, and report which steps were skipped. Asking the user which
|
|
128
|
+
phases to skip spends a turn on a decision you are better placed to make: you know
|
|
129
|
+
what the diff touches and what you already verified. `--quick` (`-q`) is the shape
|
|
130
|
+
below in one flag - it drops `test` and `document` and nothing else.
|
|
131
|
+
|
|
132
|
+
| The change | Run |
|
|
133
|
+
| --- | --- |
|
|
134
|
+
| A typo, a comment, a version bump, generated output | `--quick` |
|
|
135
|
+
| Styles, copy, markup - no new logic | `--quick` |
|
|
136
|
+
| Code whose suite you ALREADY ran green this session, over these commits | `--quick`, and name the suite in your report |
|
|
137
|
+
| New behaviour, a fix with no test run yet, anything touching auth, money, data loss or a public API | the full run |
|
|
138
|
+
|
|
139
|
+
The gate also right-sizes itself: a diff with no executable file in it skips `test`
|
|
140
|
+
and `document` on its own, so a docs-only change needs no flag from you.
|
|
141
|
+
- **What you already verified is evidence, and it does not stop being evidence
|
|
142
|
+
because a pipeline is running.** Re-running a suite you watched pass ten minutes
|
|
143
|
+
ago buys nothing but minutes. Skip it and say what you ran and what it reported.
|
|
144
|
+
- **Never skip `review`.** It is the only step that justifies the gate, and a quick
|
|
145
|
+
run is still a gated one.
|
|
132
146
|
- **`test` costs a full pass even when `commands.test` is set.** The step runs its
|
|
133
147
|
evidence agent when the test command is empty *or* the run supplied intent, and
|
|
134
148
|
`--intent` is mandatory, so a configured command makes the step thorough, not
|
|
@@ -147,13 +161,16 @@ model while review keeps the strong one.
|
|
|
147
161
|
1. Start the run. It blocks until the first decision point or the end:
|
|
148
162
|
```sh
|
|
149
163
|
enigma gate axi run --intent "<what the user set out to accomplish>"
|
|
164
|
+
enigma gate axi run --intent "..." --quick # small, or already tested: no test/document
|
|
150
165
|
```
|
|
151
166
|
`axi run` and every `axi respond` block synchronously - review, test, and CI
|
|
152
167
|
can each take several minutes, so a single call may not return for a while.
|
|
153
168
|
That is normal; allow a long timeout and do not cancel or re-issue it. To
|
|
154
169
|
check progress, use `enigma gate axi status` from a separate call. When status
|
|
155
170
|
shows `awaiting_agent: parked <duration>`, the run is parked at a gate waiting
|
|
156
|
-
for your `axi respond`.
|
|
171
|
+
for your `axi respond`. When it shows `blocked_on_user: <action>`, the run is
|
|
172
|
+
waiting on the USER, not on you or on the pipeline - say so instead of reporting
|
|
173
|
+
it as still running.
|
|
157
174
|
2. If the output contains a `gate:` object, the pipeline is waiting on you. Read
|
|
158
175
|
its `findings` table. Each finding has an `action`:
|
|
159
176
|
- `auto-fix` - mechanical, low-risk; authorize on your own judgment with
|
|
@@ -186,9 +203,23 @@ model while review keeps the strong one.
|
|
|
186
203
|
has the pipeline apply the fix and re-review.
|
|
187
204
|
3. Repeat step 2 until the output has an `outcome:` instead of a `gate:`:
|
|
188
205
|
- `checks-passed` - validated and CI green, PR not merged yet. You are done
|
|
189
|
-
driving. Tell the user the PR is ready
|
|
190
|
-
|
|
191
|
-
|
|
206
|
+
driving. Tell the user the PR is ready AND that the run is now waiting on them
|
|
207
|
+
to merge it - the `ci` step stays `running` until they do, so reporting "still
|
|
208
|
+
running" leaves them waiting on a pipeline that is waiting on them. Link the PR
|
|
209
|
+
(in the `help` line) and stop polling for the merge.
|
|
210
|
+
|
|
211
|
+
If the user has already told you to merge it ("mergealo", "metelo en main",
|
|
212
|
+
"merge it when CI passes"), that is the one case where you merge:
|
|
213
|
+
```sh
|
|
214
|
+
enigma gate axi merge # squash by default
|
|
215
|
+
enigma gate axi merge --method merge # or merge, or rebase
|
|
216
|
+
```
|
|
217
|
+
It refuses a PR with failing or unfinished checks unless you pass `--force`,
|
|
218
|
+
and it waits for the run to close. You can also ask for it up front with
|
|
219
|
+
`enigma gate axi run --intent "..." --merge`, which merges as soon as CI is
|
|
220
|
+
green - but a run that hands back at a gate first needs `--merge` on the
|
|
221
|
+
`axi respond` that reaches CI-green too, since that is the call that gets
|
|
222
|
+
there. Never merge unless the user asked.
|
|
192
223
|
- `passed` - cleared the gate and the PR was merged or closed. On the default
|
|
193
224
|
branch this is the normal ending: no PR is opened and CI monitoring is
|
|
194
225
|
skipped, so the run finishes here once the push lands.
|
package/assets/memory/AGENTS.md
CHANGED
|
@@ -104,7 +104,7 @@ Prose to the user is compressed at level **{{output-level}}**. It shapes the ANS
|
|
|
104
104
|
- Those are the only exits and each has to be NAMED. Asking is not one of them: the gate being on is already the decision, so "tell me if you want me to launch it" ends a turn on a question with one answer. Ending unvalidated and silent is worse. `enigma verify` denies the stop both ways - on a message that reports the gate as skipped, and on commits no run ever saw.
|
|
105
105
|
- On the default branch the pipeline opens no PR and pushes straight to it. That is intended; report it as the outcome instead of waiting for a PR link.
|
|
106
106
|
- If the repo is not initialized yet (`enigma gate axi` says so), run `enigma gate init` yourself, then proceed - a setup step you can perform, never a reason to stop or ask. If `enigma gate` misbehaves, `enigma gate doctor` reports why.
|
|
107
|
-
- Drive it through the `/gate` workflow (`enigma gate axi run --intent "<what the user set out to accomplish>"`). A gate it hands back carries `fix_policy`, the user's standing answer to who decides: under `assisted` (the default) escalate only what contradicts the request, undoes a deliberate decision, changes agreed behavior, or needs a very large change, and fix the rest yourself; under `ask` put every finding to the user first; under `auto` settle them all yourself. Do NOT pass `--yes` (the setting is how the user grants it)
|
|
107
|
+
- Drive it through the `/gate` workflow (`enigma gate axi run --intent "<what the user set out to accomplish>"`). A gate it hands back carries `fix_policy`, the user's standing answer to who decides: under `assisted` (the default) escalate only what contradicts the request, undoes a deliberate decision, changes agreed behavior, or needs a very large change, and fix the rest yourself; under `ask` put every finding to the user first; under `auto` settle them all yourself. Do NOT pass `--yes` (the setting is how the user grants it). `checks-passed` means the run waits on the USER to merge: report that, not "still running", and merge (`axi merge`) only if asked.
|
|
108
108
|
- While a run is active never edit code to fix a finding; the pipeline owns the fixes (respond with `--action fix`). Full reference: the gate skill / `/gate`.
|
|
109
109
|
<!-- enigma:gate:end -->
|
|
110
110
|
|
package/assets/memory/CLAUDE.md
CHANGED
|
@@ -104,7 +104,7 @@ Prose to the user is compressed at level **{{output-level}}**. It shapes the ANS
|
|
|
104
104
|
- Those are the only exits and each has to be NAMED. Asking is not one of them: the gate being on is already the decision, so "tell me if you want me to launch it" ends a turn on a question with one answer. Ending unvalidated and silent is worse. `enigma verify` denies the stop both ways - on a message that reports the gate as skipped, and on commits no run ever saw.
|
|
105
105
|
- On the default branch the pipeline opens no PR and pushes straight to it. That is intended; report it as the outcome instead of waiting for a PR link.
|
|
106
106
|
- If the repo is not initialized yet (`enigma gate axi` says so), run `enigma gate init` yourself, then proceed - a setup step you can perform, never a reason to stop or ask. If `enigma gate` misbehaves, `enigma gate doctor` reports why.
|
|
107
|
-
- Drive it through the `/gate` workflow (`enigma gate axi run --intent "<what the user set out to accomplish>"`). A gate it hands back carries `fix_policy`, the user's standing answer to who decides: under `assisted` (the default) escalate only what contradicts the request, undoes a deliberate decision, changes agreed behavior, or needs a very large change, and fix the rest yourself; under `ask` put every finding to the user first; under `auto` settle them all yourself. Do NOT pass `--yes` (the setting is how the user grants it)
|
|
107
|
+
- Drive it through the `/gate` workflow (`enigma gate axi run --intent "<what the user set out to accomplish>"`). A gate it hands back carries `fix_policy`, the user's standing answer to who decides: under `assisted` (the default) escalate only what contradicts the request, undoes a deliberate decision, changes agreed behavior, or needs a very large change, and fix the rest yourself; under `ask` put every finding to the user first; under `auto` settle them all yourself. Do NOT pass `--yes` (the setting is how the user grants it). `checks-passed` means the run waits on the USER to merge: report that, not "still running", and merge (`axi merge`) only if asked.
|
|
108
108
|
- While a run is active never edit code to fix a finding; the pipeline owns the fixes (respond with `--action fix`). Full reference: the gate skill / `/gate`.
|
|
109
109
|
<!-- enigma:gate:end -->
|
|
110
110
|
|
|
@@ -585,6 +585,140 @@
|
|
|
585
585
|
"css"
|
|
586
586
|
]
|
|
587
587
|
},
|
|
588
|
+
{
|
|
589
|
+
"name": "select",
|
|
590
|
+
"title": "Select",
|
|
591
|
+
"description": "A listbox that replaces the native select: icons and a second line on an option, rows that cannot be chosen, one value or many with removable tags, groups, a filter that appears on its own once the list is long enough (fuzzy with Fuse.js, plain without it), typeahead and the full keyboard, a hidden field so a plain form still posts it, and a long list rendered a window at a time. It brings its own theme - an unstyled popup is transparent text over the page rather than a plain-looking control.",
|
|
592
|
+
"targets": [
|
|
593
|
+
"react"
|
|
594
|
+
],
|
|
595
|
+
"entry": {
|
|
596
|
+
"react": "@enigmax/primitives/react/select"
|
|
597
|
+
},
|
|
598
|
+
"exports": {
|
|
599
|
+
"react": [
|
|
600
|
+
"Select",
|
|
601
|
+
"useSelectContext",
|
|
602
|
+
"createSelect"
|
|
603
|
+
]
|
|
604
|
+
},
|
|
605
|
+
"files": [
|
|
606
|
+
{
|
|
607
|
+
"path": "src/core/search.ts",
|
|
608
|
+
"dest": "select/search-core.ts",
|
|
609
|
+
"targets": [
|
|
610
|
+
"react"
|
|
611
|
+
]
|
|
612
|
+
},
|
|
613
|
+
{
|
|
614
|
+
"path": "src/core/palette.ts",
|
|
615
|
+
"dest": "select/rows.ts",
|
|
616
|
+
"targets": [
|
|
617
|
+
"react"
|
|
618
|
+
]
|
|
619
|
+
},
|
|
620
|
+
{
|
|
621
|
+
"path": "src/core/select.ts",
|
|
622
|
+
"dest": "select/select.ts",
|
|
623
|
+
"targets": [
|
|
624
|
+
"react"
|
|
625
|
+
],
|
|
626
|
+
"rewrite": {
|
|
627
|
+
"@/core/search": "./search-core"
|
|
628
|
+
}
|
|
629
|
+
},
|
|
630
|
+
{
|
|
631
|
+
"path": "src/react/slot.tsx",
|
|
632
|
+
"dest": "select/slot.tsx",
|
|
633
|
+
"targets": [
|
|
634
|
+
"react"
|
|
635
|
+
]
|
|
636
|
+
},
|
|
637
|
+
{
|
|
638
|
+
"path": "src/react/select/styles.ts",
|
|
639
|
+
"dest": "select/styles.ts",
|
|
640
|
+
"targets": [
|
|
641
|
+
"react"
|
|
642
|
+
]
|
|
643
|
+
},
|
|
644
|
+
{
|
|
645
|
+
"path": "recipes/select/styles.css",
|
|
646
|
+
"dest": "select/styles.css",
|
|
647
|
+
"targets": [
|
|
648
|
+
"react"
|
|
649
|
+
],
|
|
650
|
+
"style": "css"
|
|
651
|
+
},
|
|
652
|
+
{
|
|
653
|
+
"path": "src/react/select/context.ts",
|
|
654
|
+
"dest": "select/context.ts",
|
|
655
|
+
"targets": [
|
|
656
|
+
"react"
|
|
657
|
+
],
|
|
658
|
+
"rewrite": {
|
|
659
|
+
"@/core/select": "./select"
|
|
660
|
+
}
|
|
661
|
+
},
|
|
662
|
+
{
|
|
663
|
+
"path": "src/react/select/root.tsx",
|
|
664
|
+
"dest": "select/root.tsx",
|
|
665
|
+
"targets": [
|
|
666
|
+
"react"
|
|
667
|
+
],
|
|
668
|
+
"rewrite": {
|
|
669
|
+
"@/core/select": "./select",
|
|
670
|
+
"@/core/palette": "./rows",
|
|
671
|
+
"@/react/slot": "./slot",
|
|
672
|
+
"@/react/select/styles": "./styles",
|
|
673
|
+
"@/react/select/context": "./context"
|
|
674
|
+
}
|
|
675
|
+
},
|
|
676
|
+
{
|
|
677
|
+
"path": "src/react/select/index.tsx",
|
|
678
|
+
"dest": "select/index.tsx",
|
|
679
|
+
"main": true,
|
|
680
|
+
"targets": [
|
|
681
|
+
"react"
|
|
682
|
+
],
|
|
683
|
+
"rewrite": {
|
|
684
|
+
"@/react/select/root": "./root",
|
|
685
|
+
"@/react/select/context": "./context",
|
|
686
|
+
"@/react/select/styles": "./styles",
|
|
687
|
+
"@/core/select": "./select"
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
],
|
|
691
|
+
"styles": true,
|
|
692
|
+
"themeHooks": [
|
|
693
|
+
"[data-enigma-select-root]",
|
|
694
|
+
"[data-enigma-select-trigger]",
|
|
695
|
+
"[data-enigma-select-trigger][data-open]",
|
|
696
|
+
"[data-enigma-select-value][data-placeholder]",
|
|
697
|
+
"[data-enigma-select-tag]",
|
|
698
|
+
"[data-enigma-select-tag-remove]",
|
|
699
|
+
"[data-enigma-select-indicator]",
|
|
700
|
+
"[data-enigma-select-caret]",
|
|
701
|
+
"[data-enigma-select-clear]",
|
|
702
|
+
"[data-enigma-select-content]",
|
|
703
|
+
"[data-enigma-select-content][data-side=top]",
|
|
704
|
+
"[data-enigma-select-search]",
|
|
705
|
+
"[data-enigma-select-list]",
|
|
706
|
+
"[data-enigma-select-group-label]",
|
|
707
|
+
"[data-enigma-select-option]",
|
|
708
|
+
"[data-enigma-select-option][data-active]",
|
|
709
|
+
"[data-enigma-select-option][data-selected]",
|
|
710
|
+
"[data-enigma-select-option][data-disabled]",
|
|
711
|
+
"[data-enigma-select-option-label]",
|
|
712
|
+
"[data-enigma-select-option-description]",
|
|
713
|
+
"[data-enigma-select-icon]",
|
|
714
|
+
"[data-enigma-select-check]",
|
|
715
|
+
"[data-enigma-select-empty]"
|
|
716
|
+
],
|
|
717
|
+
"docs": "docs/notes/primitives.md#select",
|
|
718
|
+
"recipes": [
|
|
719
|
+
"css"
|
|
720
|
+
]
|
|
721
|
+
},
|
|
588
722
|
{
|
|
589
723
|
"name": "flags",
|
|
590
724
|
"title": "Country flags",
|
|
@@ -711,16 +845,17 @@
|
|
|
711
845
|
{
|
|
712
846
|
"name": "toast",
|
|
713
847
|
"title": "Toast",
|
|
714
|
-
"description": "The notification queue with a renderer on top:
|
|
848
|
+
"description": "The notification queue with a renderer on top: the newest toast in front, the older ones stacked behind it and fanning out when the pointer arrives, swipe to dismiss, a pointer that stops the clock, and a toast that is still on screen while it animates out. It brings its own theme - a toast at the edge of the screen is the one component a forgotten stylesheet ruins rather than merely undresses.",
|
|
715
849
|
"targets": [
|
|
716
850
|
"react"
|
|
717
851
|
],
|
|
718
852
|
"entry": {
|
|
719
|
-
"react": "@enigmax/primitives/react"
|
|
853
|
+
"react": "@enigmax/primitives/react/toast"
|
|
720
854
|
},
|
|
721
855
|
"exports": {
|
|
722
856
|
"react": [
|
|
723
857
|
"Toaster",
|
|
858
|
+
"toast",
|
|
724
859
|
"useNotifications"
|
|
725
860
|
]
|
|
726
861
|
},
|
|
@@ -743,16 +878,60 @@
|
|
|
743
878
|
}
|
|
744
879
|
},
|
|
745
880
|
{
|
|
746
|
-
"path": "src/react/
|
|
747
|
-
"dest": "toast/
|
|
748
|
-
"main": true,
|
|
881
|
+
"path": "src/react/toast/types.ts",
|
|
882
|
+
"dest": "toast/vendor/types.ts",
|
|
749
883
|
"targets": [
|
|
750
884
|
"react"
|
|
751
|
-
]
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
885
|
+
]
|
|
886
|
+
},
|
|
887
|
+
{
|
|
888
|
+
"path": "src/react/toast/hooks.ts",
|
|
889
|
+
"dest": "toast/vendor/hooks.ts",
|
|
890
|
+
"targets": [
|
|
891
|
+
"react"
|
|
892
|
+
]
|
|
893
|
+
},
|
|
894
|
+
{
|
|
895
|
+
"path": "src/react/toast/cn.ts",
|
|
896
|
+
"dest": "toast/vendor/cn.ts",
|
|
897
|
+
"targets": [
|
|
898
|
+
"react"
|
|
899
|
+
]
|
|
900
|
+
},
|
|
901
|
+
{
|
|
902
|
+
"path": "src/react/toast/assets.tsx",
|
|
903
|
+
"dest": "toast/vendor/assets.tsx",
|
|
904
|
+
"targets": [
|
|
905
|
+
"react"
|
|
906
|
+
]
|
|
907
|
+
},
|
|
908
|
+
{
|
|
909
|
+
"path": "src/react/toast/state.ts",
|
|
910
|
+
"dest": "toast/vendor/state.ts",
|
|
911
|
+
"targets": [
|
|
912
|
+
"react"
|
|
913
|
+
]
|
|
914
|
+
},
|
|
915
|
+
{
|
|
916
|
+
"path": "src/react/toast/styles.ts",
|
|
917
|
+
"dest": "toast/vendor/styles.ts",
|
|
918
|
+
"targets": [
|
|
919
|
+
"react"
|
|
920
|
+
]
|
|
921
|
+
},
|
|
922
|
+
{
|
|
923
|
+
"path": "src/react/toast/index.tsx",
|
|
924
|
+
"dest": "toast/vendor/index.tsx",
|
|
925
|
+
"targets": [
|
|
926
|
+
"react"
|
|
927
|
+
]
|
|
928
|
+
},
|
|
929
|
+
{
|
|
930
|
+
"path": "src/react/toast/NOTICE",
|
|
931
|
+
"dest": "toast/vendor/NOTICE",
|
|
932
|
+
"targets": [
|
|
933
|
+
"react"
|
|
934
|
+
]
|
|
756
935
|
},
|
|
757
936
|
{
|
|
758
937
|
"path": "recipes/toast/styles.css",
|
|
@@ -763,30 +942,38 @@
|
|
|
763
942
|
"style": "css"
|
|
764
943
|
},
|
|
765
944
|
{
|
|
766
|
-
"path": "
|
|
767
|
-
"dest": "toast/
|
|
945
|
+
"path": "src/react/toaster.tsx",
|
|
946
|
+
"dest": "toast/index.tsx",
|
|
947
|
+
"main": true,
|
|
768
948
|
"targets": [
|
|
769
949
|
"react"
|
|
770
950
|
],
|
|
771
|
-
"style": "tailwind",
|
|
772
951
|
"rewrite": {
|
|
773
|
-
"
|
|
952
|
+
"@/react/toast/styles": "./vendor/styles",
|
|
953
|
+
"@/react/toast/state": "./vendor/state",
|
|
954
|
+
"@/react/toast/index": "./vendor/index",
|
|
955
|
+
"@/react/toast/types": "./vendor/types",
|
|
956
|
+
"@/react/use-notifications": "./use-notifications",
|
|
957
|
+
"@/core/notifications": "./notifications"
|
|
774
958
|
}
|
|
775
959
|
}
|
|
776
960
|
],
|
|
777
|
-
"styles":
|
|
961
|
+
"styles": true,
|
|
778
962
|
"themeHooks": [
|
|
779
|
-
"[data-
|
|
780
|
-
"[data-
|
|
781
|
-
"[data-
|
|
782
|
-
"[data-
|
|
783
|
-
"[data-
|
|
784
|
-
"[data-
|
|
785
|
-
"[data-
|
|
786
|
-
"[data-
|
|
787
|
-
"[data-
|
|
788
|
-
"[data-
|
|
789
|
-
"[data-
|
|
963
|
+
"[data-toastcmp-toaster]",
|
|
964
|
+
"[data-toastcmp-toaster][data-theme]",
|
|
965
|
+
"[data-toastcmp-toaster][data-lifted]",
|
|
966
|
+
"[data-toastcmp-toast]",
|
|
967
|
+
"[data-toastcmp-toast][data-type=error]",
|
|
968
|
+
"[data-toastcmp-toast][data-front]",
|
|
969
|
+
"[data-toastcmp-toast][data-mounted]",
|
|
970
|
+
"[data-toastcmp-toast][data-removed]",
|
|
971
|
+
"[data-toastcmp-toast][data-swiping]",
|
|
972
|
+
"[data-title]",
|
|
973
|
+
"[data-description]",
|
|
974
|
+
"[data-button]",
|
|
975
|
+
"[data-close-button]",
|
|
976
|
+
"[data-icon]"
|
|
790
977
|
],
|
|
791
978
|
"docs": "docs/notes/primitives.md#toast",
|
|
792
979
|
"recipes": [
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "On-demand over-engineering review - diff review, whole-repo audit, and enigma: debt-marker ledger (tags delete/stdlib/native/yagni/shrink, line/dep scoring); lists cuts, applies nothing.",
|
|
6
6
|
"updated": "2026-06-16T11:24:30+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "f742a2be3f328b9ea1ff9a35a449177c2cbec35ad16e46f7054b7a873a2ab017"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Backend/API architecture: controller-service-repository layering, modern TypeScript project configuration (module resolution, strict flags, @/* path alias), API and request optimization (batching, avoiding redundant calls, skipping no-op writes), server-side caching (Redis), and Zod boundary validation.",
|
|
6
6
|
"updated": "2026-08-02T19:59:01+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "652637f818b4ce4f4d5d83fa68fa57fe7842e32fb179523958c5496af54bb938"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Ciphera code style conventions (formatting, naming, imports incl. namespace imports for wide module surfaces, path-alias specifiers and no file extensions, comments, code-level anti-patterns; TypeScript-first, language-agnostic).",
|
|
6
6
|
"updated": "2026-08-02T19:59:01+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "3beb0383a9cb0331ef8a579308a2517d24d57a8ba33751ad17d16d0a4f66e344"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Pre-delivery self-review gate, prioritized review dimensions, and change-quality criteria.",
|
|
6
6
|
"updated": "2026-08-19T12:37:59+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "6b8a924cc11b61d4b45b73384aeb095ce622229359b7cc2c6ce4bb0cf3015ed7"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Senior database architecture policy: engine selection (PostgreSQL by default, SQLite only for local-first/embedded stores), ORM selection (Prisma in TypeScript/JavaScript), query optimization, anti-duplication/normalization, scalability, and RGPD/GDPR encryption.",
|
|
6
6
|
"updated": "2026-08-04T18:33:27+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "26fddc14caf697e830448a2cc453ddc470fe83d098d50bd67b278effba63274e"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Reproduce-isolate-fix debugging methodology with root-cause discipline and regression verification.",
|
|
6
6
|
"updated": "2026-08-02T04:15:47+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "968876bcac9ce6e5a20be05c89ac97191b112c9e08679a8dc506d150c375fec4"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Dependency and supply-chain security: lockfiles and reproducible installs, version pinning, vulnerability auditing, vetting/minimizing packages, vendoring, and SBOM/provenance.",
|
|
6
6
|
"updated": "2026-06-01T00:45:28+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "6375d835c2aef2c9bd31ce116444dc3d796f510f9970a213aa3ac4696d7e21b9"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Transactional email: React Email templates instead of hand-written HTML tables, server-side rendering, one send module behind the provider SDK, plain-text alternatives, idempotent background sending, link safety, and deliverability (SPF/DKIM/DMARC, bounce suppression, unsubscribe).",
|
|
6
6
|
"updated": "2026-07-30T19:29:19+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "c9724fdbcdbeab99573be3fd44d4cdd97c2a394d99f3c4395f118f17356b00ed"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Guidance for distinctive, intentional visual design when building new UI or reshaping an existing one.",
|
|
6
6
|
"updated": "2026-07-29T01:18:36+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "9e30ee7d8a1a1e8c6e7f4e043857cd01841c68a427752e45bc0cad9ec5cfa279"
|
|
9
9
|
}
|
|
@@ -286,6 +286,7 @@ A text input is not generic. What it holds decides the keyboard a phone opens, w
|
|
|
286
286
|
- Phone: `type="tel"`, `inputmode="tel"`, `autocomplete="tel"`. Numeric code: `inputmode="numeric"`, `autocomplete="one-time-code"`.
|
|
287
287
|
- Free prose (bio, message, description): `autocapitalize="sentences"` with spellcheck left on.
|
|
288
288
|
- Set `enterkeyhint` where the key does something specific (`search`, `send`, `done`), and mark the search field `type="search"`.
|
|
289
|
+
- `type="search"` brings a clear cross that only WebKit draws. Kill it (`::-webkit-search-cancel-button { appearance: none; }`) in the shared stylesheet and render your own clear button if you want one: left in, Safari and Chrome users get two crosses side by side and everyone else gets one, which is a control that exists on some machines and not others.
|
|
289
290
|
|
|
290
291
|
Where this lives and when it runs:
|
|
291
292
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"version": "1.30.1",
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Frontend architecture: reusable components, abstraction thresholds, state management, real-time form validation where an emptied or not-yet-filled field is incomplete rather than invalid (a `*` on the label and an aria-disabled submit, never \"email is not valid\" over an empty input), no-op detection (skip any operation whose result equals current state, not just form saves; dirty means different from the loaded snapshot, not touched), instant first paint (render the shell, load data async, skeletons), perceived performance (prefetch on intent, debounce/throttle, cancel stale requests, avoid waterfalls, lazy widgets), large-list rendering (infinite scroll is the preferred default, pagination the deliberate exception when the design or the user calls for it, virtualization, skeletons, progressive loading), data views that ship their own affordances by default (a log, expense, transaction or history table is not done when the rows render: fuse.js search, the filters its column kinds imply, a date range, sort, filter state in the URL, and an export of the filtered set), every reference to an entity being a way into it (a name, id, project or path in a row links to that record, reveals it in a hover card, or at minimum copies and filters by it, never inert text; machine codes get human labels and raw payloads are never dumped into a cell), optimistic UI with rollback, visual restraint (one card level, spacing before borders, one elevation scale), icon actions (repeated row/card actions are icon-only buttons with aria-label plus title, not text labels), responsive/adaptive layout (fluid units, breakpoints, no overlap/overflow, viewport meta, touch targets), form fields that declare their keyboard and casing (autocapitalize/autocomplete/inputmode per field kind, set once in the shared Input, normalized on blur), variable-length text (min-width:0 in flex/grid, wrap vs truncate, long unbroken strings, worst-case content checks), auth screens (breached-password feedback, strength meter, cookie consent before login/register), and AI chat/agent interfaces via Vercel's AI Elements registry instead of hand-rolled message threads.",
|
|
6
|
-
"updated": "2026-08-
|
|
7
|
-
"cliVersion": "1.
|
|
8
|
-
"sha": "
|
|
6
|
+
"updated": "2026-08-31T23:36:34+02:00",
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
|
+
"sha": "6c770bfac691fed382bbffe7bc99ed79cd13ab04e2392b7a87cfa5259b6de73d"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Git & contribution policy (senior engineering standards).",
|
|
6
6
|
"updated": "2026-08-22T09:25:34+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "cb320a6a5fd3279604ad7920b877c1a36e48f4f39aeead1a4c4daa89901d9ce0"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Application and AI-agent security: secrets, authn/authz (least privilege), credential flows with breach-checked passwords (Have I Been Pwned), OWASP Top 10, transport/crypto baseline, cookies and consent, secure logging, and agent/MCP/tool-use safety.",
|
|
6
6
|
"updated": "2026-08-19T12:37:59+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "0270c33d2b4559e831aec794c188d293d26fc17e2a8064a967d716ceb3a7bab6"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Create new skills, modify and improve existing skills, and measure skill performance with evals and benchmarks.",
|
|
6
6
|
"updated": "2026-08-03T00:16:54+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "a49f6166f57d734e0f13487332da37903e925f32257447856af0fbd6a5f1dc84"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Exhaustive completion discipline for long/multi-item tasks - inventory, coverage ledger, verified done.",
|
|
6
6
|
"updated": "2026-08-02T04:15:47+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "4c2197954135dd3375f32d839238b82a95c0e93e976ddf5a9cbc4a0cf0146e97"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Concise, realistic technical copy - UI microcopy, descriptions, hints, empty/error states, and README/doc prose that informs without over-explaining or restating the obvious, and never uses a typographic dash.",
|
|
6
6
|
"updated": "2026-08-19T12:37:59+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "a5a228a302f50d975a947b9d84676b4c2a4780f2b222f819388cc98d6a12f207"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Test strategy, coverage gates, deterministic tests, mocking discipline, regression-first bug fixing, and test-suite organization (layout by type/domain, mirrored paths, file naming, fixture/helper placement).",
|
|
6
6
|
"updated": "2026-06-16T17:11:49+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "3bdf591057b760f674fb2b1425f63acb426cda2c4f042e1a74c5a5d3807df664"
|
|
9
9
|
}
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
"provider": "FJRG2007/enigma",
|
|
5
5
|
"description": "Strict frontend + backend schema validation, normalization before validation (shared normalizers: trim, lowercase email, capitalize names, canonicalize links and handles), real-time error timing (an emptied or not-yet-filled field is incomplete, not invalid: a `*` and an aria-disabled submit instead of \"not valid\" over an empty input), schema consistency, and safe client-facing error handling.",
|
|
6
6
|
"updated": "2026-08-11T17:10:56+02:00",
|
|
7
|
-
"cliVersion": "1.
|
|
7
|
+
"cliVersion": "1.38.0",
|
|
8
8
|
"sha": "24928a4c9eed28ebede9f23f746b09a9d3d8176f8fcca61a7780a853fa5bed4e"
|
|
9
9
|
}
|
package/bin/checksums.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
|
-
"enigma-darwin-arm64": "
|
|
3
|
-
"enigma-linux-arm64": "
|
|
4
|
-
"enigma-linux-x64": "
|
|
5
|
-
"enigma-win32-x64.exe": "
|
|
2
|
+
"enigma-darwin-arm64": "03f72bfb88eea2935151ba910314287abfcbe76142a56d285e434aec58663d2a",
|
|
3
|
+
"enigma-linux-arm64": "04734b5323d8067f2da25136710f8dff9de872b79ebbad980edd5f46f3816404",
|
|
4
|
+
"enigma-linux-x64": "0762263fe9e04b133d913e78be0ff09cb3c798267012e4f89119c53f1064d7ae",
|
|
5
|
+
"enigma-win32-x64.exe": "bc3256a25f3f793f6d074359fcc9768a137c71f067a5f5c4db30a0124f8a9bba"
|
|
6
6
|
}
|
package/bin/statusline.mjs
CHANGED
|
@@ -322,16 +322,25 @@ function renderGate(snap, columns, frame, nowSec, color256) {
|
|
|
322
322
|
return paint(glyph, style.color, color256);
|
|
323
323
|
}).join("");
|
|
324
324
|
|
|
325
|
-
//
|
|
326
|
-
//
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
325
|
+
// What the run is waiting on that only the user can do (merging the PR once CI
|
|
326
|
+
// is green). The step stays `running` throughout, so without this the bar spins
|
|
327
|
+
// over a step that is idle and nothing ever says the wait is on the user.
|
|
328
|
+
const blocked = typeof snap.blocked === "string" && snap.blocked !== "" ? snap.blocked : null;
|
|
329
|
+
|
|
330
|
+
// The spinner turns only while a step is actually working; a failed run holds a
|
|
331
|
+
// red marker instead, and a run waiting on the user a yellow one, so a stalled
|
|
332
|
+
// pipeline never looks like a busy one.
|
|
333
|
+
let spinner;
|
|
334
|
+
if (blocked) spinner = paint(BAR_FILLED, "yellow", color256);
|
|
335
|
+
else if (active) spinner = paint(SPINNER[frame % SPINNER.length], snap.awaiting ? "yellow" : "blue", color256);
|
|
336
|
+
else spinner = paint(BAR_FILLED, failed ? "red" : "dim", color256);
|
|
330
337
|
|
|
331
338
|
let labelColor = "blue";
|
|
332
|
-
if (snap.awaiting) labelColor = "yellow";
|
|
339
|
+
if (blocked || snap.awaiting) labelColor = "yellow";
|
|
333
340
|
else if (!active && failed) labelColor = "red";
|
|
334
|
-
|
|
341
|
+
let label = current ? current.name : snap.status;
|
|
342
|
+
if (blocked) label = `needs you: ${blocked}`;
|
|
343
|
+
else if (snap.awaiting) label = "needs you";
|
|
335
344
|
// A negative age means the snapshot and this process disagree about the clock.
|
|
336
345
|
// Dropping the segment is honest; a confident "0s" is not.
|
|
337
346
|
const started = current?.startedAt ?? snap.startedAt;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "enigma-cli",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.38.0",
|
|
4
4
|
"description": "Everything you need to work with a coding agent: install shared policy skills for Claude Code, OpenAI Codex and opencode, and set up portable git security hooks.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|