@dzhechkov/keysarium 1.5.32 → 1.5.33
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/.dz-manifest.json +33 -33
- package/package.json +1 -1
- package/sbom.json +32 -32
- package/src/commands/doctor.js +71 -111
- package/src/commands/init.js +1 -1
- package/src/commands/list.js +1 -1
- package/src/commands/remove.js +1 -1
- package/src/commands/update.js +1 -1
- package/src/utils.js +99 -11
- package/templates/docs/continuous-learning-guide.md +4 -4
- package/templates/docs/feature-adr/01-architecture.md +1 -1
- package/templates/docs/feature-adr/03-deployment-guide.md +2 -2
- package/templates/docs/improvement-directions.md +1 -1
- package/templates/docs/keysarium/01-deployment-guide.md +16 -16
- package/templates/docs/keysarium/02-admin-guide.md +1 -1
- package/templates/docs/keysarium/04-infrastructure-requirements.md +6 -6
- package/templates/docs/keysarium-core/03-deployment-guide.md +5 -5
- package/templates/docs/keysarium-core/04-admin-guide.md +6 -6
- package/templates/lib/platform-templates/opencode.md +1 -1
- package/templates/lib/worker-templates/brain-export.md +1 -1
package/.dz-manifest.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
},
|
|
10
10
|
{
|
|
11
11
|
"path": "CHANGELOG.md",
|
|
12
|
-
"sha256": "
|
|
12
|
+
"sha256": "d7ebdc513689fb05fd652691b7446335fedbdc137b4420de3ab9c016f8d3aa15"
|
|
13
13
|
},
|
|
14
14
|
{
|
|
15
15
|
"path": "README.md",
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
"path": "install.sh",
|
|
28
|
-
"sha256": "
|
|
28
|
+
"sha256": "9631575645f93ca8a65aa2f346da7253cd6ffa6394e36c13a2bf0d7eb605387f"
|
|
29
29
|
},
|
|
30
30
|
{
|
|
31
31
|
"path": "package.json",
|
|
32
|
-
"sha256": "
|
|
32
|
+
"sha256": "0869b59a6f7c9dfeb990cf4251d5d8dc7ce12c4b54a1c9a058e5caf12461d11f"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
"path": "scripts/sync-templates.js",
|
|
@@ -45,27 +45,27 @@
|
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
"path": "src/commands/doctor.js",
|
|
48
|
-
"sha256": "
|
|
48
|
+
"sha256": "c378ac7ea4943fdbddb176abdd5dae04a4680919ddc475e3d1dc1dfb8a696287"
|
|
49
49
|
},
|
|
50
50
|
{
|
|
51
51
|
"path": "src/commands/init.js",
|
|
52
|
-
"sha256": "
|
|
52
|
+
"sha256": "c25118fca72fae774906da099ec4f414fb3ae46694f2c5e5843d73bee0d1b647"
|
|
53
53
|
},
|
|
54
54
|
{
|
|
55
55
|
"path": "src/commands/list.js",
|
|
56
|
-
"sha256": "
|
|
56
|
+
"sha256": "2f9cf66aca055f18f2149fc551d555e24e0a825c9ea5efa612d6cad05fc354db"
|
|
57
57
|
},
|
|
58
58
|
{
|
|
59
59
|
"path": "src/commands/remove.js",
|
|
60
|
-
"sha256": "
|
|
60
|
+
"sha256": "ffedc6cd03a694785d8639ce8d0b82a4708c6937650a216a62d5d3d9e0761d74"
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
"path": "src/commands/update.js",
|
|
64
|
-
"sha256": "
|
|
64
|
+
"sha256": "8fb7a602452c228f2841170f09217f5523bd926f64180f4338348bd3a795bb79"
|
|
65
65
|
},
|
|
66
66
|
{
|
|
67
67
|
"path": "src/utils.js",
|
|
68
|
-
"sha256": "
|
|
68
|
+
"sha256": "c1ba04e4cf8ca75ac3e0da779f5361a87e909acc5527ee982b547c71f5cba208"
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
"path": "templates/.claude/agents/cjm-variant-worker.md",
|
|
@@ -713,7 +713,7 @@
|
|
|
713
713
|
},
|
|
714
714
|
{
|
|
715
715
|
"path": "templates/docs/continuous-learning-guide.md",
|
|
716
|
-
"sha256": "
|
|
716
|
+
"sha256": "06d6b3f2e89c72cffa488aac5569d87f84f42da3a4904c79b2bae4ae6c69fef5"
|
|
717
717
|
},
|
|
718
718
|
{
|
|
719
719
|
"path": "templates/docs/edu-site-generator/01-deployment-guide.md",
|
|
@@ -741,7 +741,7 @@
|
|
|
741
741
|
},
|
|
742
742
|
{
|
|
743
743
|
"path": "templates/docs/feature-adr/01-architecture.md",
|
|
744
|
-
"sha256": "
|
|
744
|
+
"sha256": "c403fbadf2086291d729f51a0245a3982bf0f3e9ab98bf18f1078bfbdcc033a3"
|
|
745
745
|
},
|
|
746
746
|
{
|
|
747
747
|
"path": "templates/docs/feature-adr/02-functionality.md",
|
|
@@ -749,7 +749,7 @@
|
|
|
749
749
|
},
|
|
750
750
|
{
|
|
751
751
|
"path": "templates/docs/feature-adr/03-deployment-guide.md",
|
|
752
|
-
"sha256": "
|
|
752
|
+
"sha256": "98b4468359e91c5aebdccef2c53ce49f771a87f43f609a57591fb6968fcbad09"
|
|
753
753
|
},
|
|
754
754
|
{
|
|
755
755
|
"path": "templates/docs/feature-adr/04-admin-guide.md",
|
|
@@ -757,7 +757,7 @@
|
|
|
757
757
|
},
|
|
758
758
|
{
|
|
759
759
|
"path": "templates/docs/feature-adr/05-user-guide.md",
|
|
760
|
-
"sha256": "
|
|
760
|
+
"sha256": "da59b505c050e5c4712d8ea507b1c3dcfe475bfa75ab4693dc1d6dc0ba793e6f"
|
|
761
761
|
},
|
|
762
762
|
{
|
|
763
763
|
"path": "templates/docs/feature-adr/06-user-flows.md",
|
|
@@ -765,7 +765,7 @@
|
|
|
765
765
|
},
|
|
766
766
|
{
|
|
767
767
|
"path": "templates/docs/improvement-directions.md",
|
|
768
|
-
"sha256": "
|
|
768
|
+
"sha256": "df7649c930a622ee7467a3a16765196d27634a0ed9f23da36427da0bed79d2d5"
|
|
769
769
|
},
|
|
770
770
|
{
|
|
771
771
|
"path": "templates/docs/keysarium-core/01-architecture.md",
|
|
@@ -773,15 +773,15 @@
|
|
|
773
773
|
},
|
|
774
774
|
{
|
|
775
775
|
"path": "templates/docs/keysarium-core/02-functionality.md",
|
|
776
|
-
"sha256": "
|
|
776
|
+
"sha256": "4a768dd2b37b1cb030a4e67a81c269ed46e12327cd6ebb790cbf91e80e6b997b"
|
|
777
777
|
},
|
|
778
778
|
{
|
|
779
779
|
"path": "templates/docs/keysarium-core/03-deployment-guide.md",
|
|
780
|
-
"sha256": "
|
|
780
|
+
"sha256": "c560c3a8adb6b344c305d3376c09657d1f8540e371e26acc9a1165931f98b82d"
|
|
781
781
|
},
|
|
782
782
|
{
|
|
783
783
|
"path": "templates/docs/keysarium-core/04-admin-guide.md",
|
|
784
|
-
"sha256": "
|
|
784
|
+
"sha256": "6de7defa13889e6583a452a0e5d7d73ab64f8341a08625af5d12d726ebbb8b5b"
|
|
785
785
|
},
|
|
786
786
|
{
|
|
787
787
|
"path": "templates/docs/keysarium-core/05-user-guide.md",
|
|
@@ -793,55 +793,55 @@
|
|
|
793
793
|
},
|
|
794
794
|
{
|
|
795
795
|
"path": "templates/docs/keysarium/01-deployment-guide.md",
|
|
796
|
-
"sha256": "
|
|
796
|
+
"sha256": "11bcea773e2e84f75ee0c67fd9cce108f15bc94a175aec9f8268c2fe2ede7b9f"
|
|
797
797
|
},
|
|
798
798
|
{
|
|
799
799
|
"path": "templates/docs/keysarium/02-admin-guide.md",
|
|
800
|
-
"sha256": "
|
|
800
|
+
"sha256": "abfe96ab001e649b9c1813f7dffabb016d6fe279a058e9eecd9e57a3468c814a"
|
|
801
801
|
},
|
|
802
802
|
{
|
|
803
803
|
"path": "templates/docs/keysarium/03-user-guide.md",
|
|
804
|
-
"sha256": "
|
|
804
|
+
"sha256": "1d843e70458b09d535c6b6b33800c7a2de539054966e25bc463d616cc793e62b"
|
|
805
805
|
},
|
|
806
806
|
{
|
|
807
807
|
"path": "templates/docs/keysarium/04-infrastructure-requirements.md",
|
|
808
|
-
"sha256": "
|
|
808
|
+
"sha256": "1fb430d68c97fdd03a57119639d299ebcb059b2352e653d179e74fd5c7a614a5"
|
|
809
809
|
},
|
|
810
810
|
{
|
|
811
811
|
"path": "templates/docs/keysarium/05-architecture.md",
|
|
812
|
-
"sha256": "
|
|
812
|
+
"sha256": "4e167e622ebaffcbfe710d72d47d1c56bd0188de699cdf223cd66bcba2f4b595"
|
|
813
813
|
},
|
|
814
814
|
{
|
|
815
815
|
"path": "templates/docs/keysarium/06-user-flows.md",
|
|
816
|
-
"sha256": "
|
|
816
|
+
"sha256": "bff121a07af83343febd0e1715f51b7b8314e31bc21f5c2f3577954b369700b5"
|
|
817
817
|
},
|
|
818
818
|
{
|
|
819
819
|
"path": "templates/docs/skills-bto/01-deployment-guide.md",
|
|
820
|
-
"sha256": "
|
|
820
|
+
"sha256": "96f1ab721532bc6b38a2583263e50015721bf7b920432232ad90a236bc85b334"
|
|
821
821
|
},
|
|
822
822
|
{
|
|
823
823
|
"path": "templates/docs/skills-bto/02-admin-guide.md",
|
|
824
|
-
"sha256": "
|
|
824
|
+
"sha256": "e9fa284257dee51d29f5fa7baf28780aac5d4b4b5e3e0248402877b080a37515"
|
|
825
825
|
},
|
|
826
826
|
{
|
|
827
827
|
"path": "templates/docs/skills-bto/03-user-guide.md",
|
|
828
|
-
"sha256": "
|
|
828
|
+
"sha256": "2afa935e95dc2c311e1a84a0067c79458e7fb3bbd8f8f20813115c0a9213c508"
|
|
829
829
|
},
|
|
830
830
|
{
|
|
831
831
|
"path": "templates/docs/skills-bto/04-infrastructure-requirements.md",
|
|
832
|
-
"sha256": "
|
|
832
|
+
"sha256": "9396fc706942041e466a1426e6f4bde4606a8f98a2d64c3af46a6959c3f5c25c"
|
|
833
833
|
},
|
|
834
834
|
{
|
|
835
835
|
"path": "templates/docs/skills-bto/05-architecture.md",
|
|
836
|
-
"sha256": "
|
|
836
|
+
"sha256": "cef86321b722dd7a75e24f8412c17256cc3c148b29a5d22ce24ee35a5e610a7a"
|
|
837
837
|
},
|
|
838
838
|
{
|
|
839
839
|
"path": "templates/docs/skills-bto/06-user-flows.md",
|
|
840
|
-
"sha256": "
|
|
840
|
+
"sha256": "ac47e003c42d2a82e95066f89b3a9471bc5ff18bd1c9775376f99d6dab2b24a9"
|
|
841
841
|
},
|
|
842
842
|
{
|
|
843
843
|
"path": "templates/docs/transcript-site-generator/01-deployment-guide.md",
|
|
844
|
-
"sha256": "
|
|
844
|
+
"sha256": "ee4227342004cbbfb9db367ce5000a81620cd9e59b1395fbe0711bc611d37d1a"
|
|
845
845
|
},
|
|
846
846
|
{
|
|
847
847
|
"path": "templates/docs/transcript-site-generator/02-admin-guide.md",
|
|
@@ -905,7 +905,7 @@
|
|
|
905
905
|
},
|
|
906
906
|
{
|
|
907
907
|
"path": "templates/lib/platform-templates/opencode.md",
|
|
908
|
-
"sha256": "
|
|
908
|
+
"sha256": "d093eb0cc533f0459ce745a9ded5cabafca91a96ab09480bb1f04f0038971bbd"
|
|
909
909
|
},
|
|
910
910
|
{
|
|
911
911
|
"path": "templates/lib/reward-tracker.md",
|
|
@@ -921,7 +921,7 @@
|
|
|
921
921
|
},
|
|
922
922
|
{
|
|
923
923
|
"path": "templates/lib/worker-templates/brain-export.md",
|
|
924
|
-
"sha256": "
|
|
924
|
+
"sha256": "0949882d82866500f4c03089db34cf029ab2ba12c12c53829cadb3d00a2969a9"
|
|
925
925
|
},
|
|
926
926
|
{
|
|
927
927
|
"path": "templates/lib/worker-templates/consolidate.md",
|
|
@@ -941,5 +941,5 @@
|
|
|
941
941
|
}
|
|
942
942
|
]
|
|
943
943
|
},
|
|
944
|
-
"signature": "
|
|
944
|
+
"signature": "Zha9YxKobLgXgBV+tQ7B1xiGPXelkCRa3gSuG0ge7q6Sn7N7SkE9myZ/QGn7heGRXCFV1sbiYPH6Ao4omzHKAg=="
|
|
945
945
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dzhechkov/keysarium",
|
|
3
|
-
"version": "1.5.
|
|
3
|
+
"version": "1.5.33",
|
|
4
4
|
"description": "AI Case Research Toolkit for Claude Code — full 7-phase pipeline with feature-adr, dream cycles, background workers, multi-platform support, reward learning, and Cloud.ru AI Factory mapping (--ai-factory flag)",
|
|
5
5
|
"main": "src/cli.js",
|
|
6
6
|
"bin": {
|
package/sbom.json
CHANGED
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"hashes": [
|
|
26
26
|
{
|
|
27
27
|
"alg": "SHA-256",
|
|
28
|
-
"content": "
|
|
28
|
+
"content": "d7ebdc513689fb05fd652691b7446335fedbdc137b4420de3ab9c016f8d3aa15"
|
|
29
29
|
}
|
|
30
30
|
]
|
|
31
31
|
},
|
|
@@ -65,7 +65,7 @@
|
|
|
65
65
|
"hashes": [
|
|
66
66
|
{
|
|
67
67
|
"alg": "SHA-256",
|
|
68
|
-
"content": "
|
|
68
|
+
"content": "9631575645f93ca8a65aa2f346da7253cd6ffa6394e36c13a2bf0d7eb605387f"
|
|
69
69
|
}
|
|
70
70
|
]
|
|
71
71
|
},
|
|
@@ -75,7 +75,7 @@
|
|
|
75
75
|
"hashes": [
|
|
76
76
|
{
|
|
77
77
|
"alg": "SHA-256",
|
|
78
|
-
"content": "
|
|
78
|
+
"content": "0869b59a6f7c9dfeb990cf4251d5d8dc7ce12c4b54a1c9a058e5caf12461d11f"
|
|
79
79
|
}
|
|
80
80
|
]
|
|
81
81
|
},
|
|
@@ -115,7 +115,7 @@
|
|
|
115
115
|
"hashes": [
|
|
116
116
|
{
|
|
117
117
|
"alg": "SHA-256",
|
|
118
|
-
"content": "
|
|
118
|
+
"content": "c378ac7ea4943fdbddb176abdd5dae04a4680919ddc475e3d1dc1dfb8a696287"
|
|
119
119
|
}
|
|
120
120
|
]
|
|
121
121
|
},
|
|
@@ -125,7 +125,7 @@
|
|
|
125
125
|
"hashes": [
|
|
126
126
|
{
|
|
127
127
|
"alg": "SHA-256",
|
|
128
|
-
"content": "
|
|
128
|
+
"content": "c25118fca72fae774906da099ec4f414fb3ae46694f2c5e5843d73bee0d1b647"
|
|
129
129
|
}
|
|
130
130
|
]
|
|
131
131
|
},
|
|
@@ -135,7 +135,7 @@
|
|
|
135
135
|
"hashes": [
|
|
136
136
|
{
|
|
137
137
|
"alg": "SHA-256",
|
|
138
|
-
"content": "
|
|
138
|
+
"content": "2f9cf66aca055f18f2149fc551d555e24e0a825c9ea5efa612d6cad05fc354db"
|
|
139
139
|
}
|
|
140
140
|
]
|
|
141
141
|
},
|
|
@@ -145,7 +145,7 @@
|
|
|
145
145
|
"hashes": [
|
|
146
146
|
{
|
|
147
147
|
"alg": "SHA-256",
|
|
148
|
-
"content": "
|
|
148
|
+
"content": "ffedc6cd03a694785d8639ce8d0b82a4708c6937650a216a62d5d3d9e0761d74"
|
|
149
149
|
}
|
|
150
150
|
]
|
|
151
151
|
},
|
|
@@ -155,7 +155,7 @@
|
|
|
155
155
|
"hashes": [
|
|
156
156
|
{
|
|
157
157
|
"alg": "SHA-256",
|
|
158
|
-
"content": "
|
|
158
|
+
"content": "8fb7a602452c228f2841170f09217f5523bd926f64180f4338348bd3a795bb79"
|
|
159
159
|
}
|
|
160
160
|
]
|
|
161
161
|
},
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
"hashes": [
|
|
166
166
|
{
|
|
167
167
|
"alg": "SHA-256",
|
|
168
|
-
"content": "
|
|
168
|
+
"content": "c1ba04e4cf8ca75ac3e0da779f5361a87e909acc5527ee982b547c71f5cba208"
|
|
169
169
|
}
|
|
170
170
|
]
|
|
171
171
|
},
|
|
@@ -1785,7 +1785,7 @@
|
|
|
1785
1785
|
"hashes": [
|
|
1786
1786
|
{
|
|
1787
1787
|
"alg": "SHA-256",
|
|
1788
|
-
"content": "
|
|
1788
|
+
"content": "06d6b3f2e89c72cffa488aac5569d87f84f42da3a4904c79b2bae4ae6c69fef5"
|
|
1789
1789
|
}
|
|
1790
1790
|
]
|
|
1791
1791
|
},
|
|
@@ -1855,7 +1855,7 @@
|
|
|
1855
1855
|
"hashes": [
|
|
1856
1856
|
{
|
|
1857
1857
|
"alg": "SHA-256",
|
|
1858
|
-
"content": "
|
|
1858
|
+
"content": "c403fbadf2086291d729f51a0245a3982bf0f3e9ab98bf18f1078bfbdcc033a3"
|
|
1859
1859
|
}
|
|
1860
1860
|
]
|
|
1861
1861
|
},
|
|
@@ -1875,7 +1875,7 @@
|
|
|
1875
1875
|
"hashes": [
|
|
1876
1876
|
{
|
|
1877
1877
|
"alg": "SHA-256",
|
|
1878
|
-
"content": "
|
|
1878
|
+
"content": "98b4468359e91c5aebdccef2c53ce49f771a87f43f609a57591fb6968fcbad09"
|
|
1879
1879
|
}
|
|
1880
1880
|
]
|
|
1881
1881
|
},
|
|
@@ -1895,7 +1895,7 @@
|
|
|
1895
1895
|
"hashes": [
|
|
1896
1896
|
{
|
|
1897
1897
|
"alg": "SHA-256",
|
|
1898
|
-
"content": "
|
|
1898
|
+
"content": "da59b505c050e5c4712d8ea507b1c3dcfe475bfa75ab4693dc1d6dc0ba793e6f"
|
|
1899
1899
|
}
|
|
1900
1900
|
]
|
|
1901
1901
|
},
|
|
@@ -1915,7 +1915,7 @@
|
|
|
1915
1915
|
"hashes": [
|
|
1916
1916
|
{
|
|
1917
1917
|
"alg": "SHA-256",
|
|
1918
|
-
"content": "
|
|
1918
|
+
"content": "df7649c930a622ee7467a3a16765196d27634a0ed9f23da36427da0bed79d2d5"
|
|
1919
1919
|
}
|
|
1920
1920
|
]
|
|
1921
1921
|
},
|
|
@@ -1935,7 +1935,7 @@
|
|
|
1935
1935
|
"hashes": [
|
|
1936
1936
|
{
|
|
1937
1937
|
"alg": "SHA-256",
|
|
1938
|
-
"content": "
|
|
1938
|
+
"content": "4a768dd2b37b1cb030a4e67a81c269ed46e12327cd6ebb790cbf91e80e6b997b"
|
|
1939
1939
|
}
|
|
1940
1940
|
]
|
|
1941
1941
|
},
|
|
@@ -1945,7 +1945,7 @@
|
|
|
1945
1945
|
"hashes": [
|
|
1946
1946
|
{
|
|
1947
1947
|
"alg": "SHA-256",
|
|
1948
|
-
"content": "
|
|
1948
|
+
"content": "c560c3a8adb6b344c305d3376c09657d1f8540e371e26acc9a1165931f98b82d"
|
|
1949
1949
|
}
|
|
1950
1950
|
]
|
|
1951
1951
|
},
|
|
@@ -1955,7 +1955,7 @@
|
|
|
1955
1955
|
"hashes": [
|
|
1956
1956
|
{
|
|
1957
1957
|
"alg": "SHA-256",
|
|
1958
|
-
"content": "
|
|
1958
|
+
"content": "6de7defa13889e6583a452a0e5d7d73ab64f8341a08625af5d12d726ebbb8b5b"
|
|
1959
1959
|
}
|
|
1960
1960
|
]
|
|
1961
1961
|
},
|
|
@@ -1985,7 +1985,7 @@
|
|
|
1985
1985
|
"hashes": [
|
|
1986
1986
|
{
|
|
1987
1987
|
"alg": "SHA-256",
|
|
1988
|
-
"content": "
|
|
1988
|
+
"content": "11bcea773e2e84f75ee0c67fd9cce108f15bc94a175aec9f8268c2fe2ede7b9f"
|
|
1989
1989
|
}
|
|
1990
1990
|
]
|
|
1991
1991
|
},
|
|
@@ -1995,7 +1995,7 @@
|
|
|
1995
1995
|
"hashes": [
|
|
1996
1996
|
{
|
|
1997
1997
|
"alg": "SHA-256",
|
|
1998
|
-
"content": "
|
|
1998
|
+
"content": "abfe96ab001e649b9c1813f7dffabb016d6fe279a058e9eecd9e57a3468c814a"
|
|
1999
1999
|
}
|
|
2000
2000
|
]
|
|
2001
2001
|
},
|
|
@@ -2005,7 +2005,7 @@
|
|
|
2005
2005
|
"hashes": [
|
|
2006
2006
|
{
|
|
2007
2007
|
"alg": "SHA-256",
|
|
2008
|
-
"content": "
|
|
2008
|
+
"content": "1d843e70458b09d535c6b6b33800c7a2de539054966e25bc463d616cc793e62b"
|
|
2009
2009
|
}
|
|
2010
2010
|
]
|
|
2011
2011
|
},
|
|
@@ -2015,7 +2015,7 @@
|
|
|
2015
2015
|
"hashes": [
|
|
2016
2016
|
{
|
|
2017
2017
|
"alg": "SHA-256",
|
|
2018
|
-
"content": "
|
|
2018
|
+
"content": "1fb430d68c97fdd03a57119639d299ebcb059b2352e653d179e74fd5c7a614a5"
|
|
2019
2019
|
}
|
|
2020
2020
|
]
|
|
2021
2021
|
},
|
|
@@ -2025,7 +2025,7 @@
|
|
|
2025
2025
|
"hashes": [
|
|
2026
2026
|
{
|
|
2027
2027
|
"alg": "SHA-256",
|
|
2028
|
-
"content": "
|
|
2028
|
+
"content": "4e167e622ebaffcbfe710d72d47d1c56bd0188de699cdf223cd66bcba2f4b595"
|
|
2029
2029
|
}
|
|
2030
2030
|
]
|
|
2031
2031
|
},
|
|
@@ -2035,7 +2035,7 @@
|
|
|
2035
2035
|
"hashes": [
|
|
2036
2036
|
{
|
|
2037
2037
|
"alg": "SHA-256",
|
|
2038
|
-
"content": "
|
|
2038
|
+
"content": "bff121a07af83343febd0e1715f51b7b8314e31bc21f5c2f3577954b369700b5"
|
|
2039
2039
|
}
|
|
2040
2040
|
]
|
|
2041
2041
|
},
|
|
@@ -2045,7 +2045,7 @@
|
|
|
2045
2045
|
"hashes": [
|
|
2046
2046
|
{
|
|
2047
2047
|
"alg": "SHA-256",
|
|
2048
|
-
"content": "
|
|
2048
|
+
"content": "96f1ab721532bc6b38a2583263e50015721bf7b920432232ad90a236bc85b334"
|
|
2049
2049
|
}
|
|
2050
2050
|
]
|
|
2051
2051
|
},
|
|
@@ -2055,7 +2055,7 @@
|
|
|
2055
2055
|
"hashes": [
|
|
2056
2056
|
{
|
|
2057
2057
|
"alg": "SHA-256",
|
|
2058
|
-
"content": "
|
|
2058
|
+
"content": "e9fa284257dee51d29f5fa7baf28780aac5d4b4b5e3e0248402877b080a37515"
|
|
2059
2059
|
}
|
|
2060
2060
|
]
|
|
2061
2061
|
},
|
|
@@ -2065,7 +2065,7 @@
|
|
|
2065
2065
|
"hashes": [
|
|
2066
2066
|
{
|
|
2067
2067
|
"alg": "SHA-256",
|
|
2068
|
-
"content": "
|
|
2068
|
+
"content": "2afa935e95dc2c311e1a84a0067c79458e7fb3bbd8f8f20813115c0a9213c508"
|
|
2069
2069
|
}
|
|
2070
2070
|
]
|
|
2071
2071
|
},
|
|
@@ -2075,7 +2075,7 @@
|
|
|
2075
2075
|
"hashes": [
|
|
2076
2076
|
{
|
|
2077
2077
|
"alg": "SHA-256",
|
|
2078
|
-
"content": "
|
|
2078
|
+
"content": "9396fc706942041e466a1426e6f4bde4606a8f98a2d64c3af46a6959c3f5c25c"
|
|
2079
2079
|
}
|
|
2080
2080
|
]
|
|
2081
2081
|
},
|
|
@@ -2085,7 +2085,7 @@
|
|
|
2085
2085
|
"hashes": [
|
|
2086
2086
|
{
|
|
2087
2087
|
"alg": "SHA-256",
|
|
2088
|
-
"content": "
|
|
2088
|
+
"content": "cef86321b722dd7a75e24f8412c17256cc3c148b29a5d22ce24ee35a5e610a7a"
|
|
2089
2089
|
}
|
|
2090
2090
|
]
|
|
2091
2091
|
},
|
|
@@ -2095,7 +2095,7 @@
|
|
|
2095
2095
|
"hashes": [
|
|
2096
2096
|
{
|
|
2097
2097
|
"alg": "SHA-256",
|
|
2098
|
-
"content": "
|
|
2098
|
+
"content": "ac47e003c42d2a82e95066f89b3a9471bc5ff18bd1c9775376f99d6dab2b24a9"
|
|
2099
2099
|
}
|
|
2100
2100
|
]
|
|
2101
2101
|
},
|
|
@@ -2105,7 +2105,7 @@
|
|
|
2105
2105
|
"hashes": [
|
|
2106
2106
|
{
|
|
2107
2107
|
"alg": "SHA-256",
|
|
2108
|
-
"content": "
|
|
2108
|
+
"content": "ee4227342004cbbfb9db367ce5000a81620cd9e59b1395fbe0711bc611d37d1a"
|
|
2109
2109
|
}
|
|
2110
2110
|
]
|
|
2111
2111
|
},
|
|
@@ -2265,7 +2265,7 @@
|
|
|
2265
2265
|
"hashes": [
|
|
2266
2266
|
{
|
|
2267
2267
|
"alg": "SHA-256",
|
|
2268
|
-
"content": "
|
|
2268
|
+
"content": "d093eb0cc533f0459ce745a9ded5cabafca91a96ab09480bb1f04f0038971bbd"
|
|
2269
2269
|
}
|
|
2270
2270
|
]
|
|
2271
2271
|
},
|
|
@@ -2305,7 +2305,7 @@
|
|
|
2305
2305
|
"hashes": [
|
|
2306
2306
|
{
|
|
2307
2307
|
"alg": "SHA-256",
|
|
2308
|
-
"content": "
|
|
2308
|
+
"content": "0949882d82866500f4c03089db34cf029ab2ba12c12c53829cadb3d00a2969a9"
|
|
2309
2309
|
}
|
|
2310
2310
|
]
|
|
2311
2311
|
},
|
package/src/commands/doctor.js
CHANGED
|
@@ -5,7 +5,7 @@ const path = require('path');
|
|
|
5
5
|
const {
|
|
6
6
|
green, red, yellow, cyan, bold, dim,
|
|
7
7
|
info, success, warn, error: logError,
|
|
8
|
-
fileExists, readJSON, readManifest,
|
|
8
|
+
fileExists, readJSON, readManifest, getTemplateFileNames,
|
|
9
9
|
MANIFEST_FILE,
|
|
10
10
|
} = require('../utils');
|
|
11
11
|
|
|
@@ -60,7 +60,7 @@ function checkFilesExist(manifest, targetDir) {
|
|
|
60
60
|
return {
|
|
61
61
|
passed: false,
|
|
62
62
|
detail: `${missing.length} file(s) missing: ${missing.slice(0, 5).join(', ')}${missing.length > 5 ? '...' : ''}`,
|
|
63
|
-
fix: `Run ${cyan('@dzhechkov/keysarium update')} to restore missing files.`,
|
|
63
|
+
fix: `Run ${cyan('npx @dzhechkov/keysarium update')} to restore missing files.`,
|
|
64
64
|
};
|
|
65
65
|
});
|
|
66
66
|
}
|
|
@@ -76,7 +76,7 @@ function checkClaudeMd(targetDir) {
|
|
|
76
76
|
return {
|
|
77
77
|
passed: false,
|
|
78
78
|
detail: 'CLAUDE.md not found',
|
|
79
|
-
fix: `Run ${cyan('@dzhechkov/keysarium update')} or ${cyan('@dzhechkov/keysarium init --force')} to restore.`,
|
|
79
|
+
fix: `Run ${cyan('npx @dzhechkov/keysarium update')} or ${cyan('npx @dzhechkov/keysarium init --force')} to restore.`,
|
|
80
80
|
};
|
|
81
81
|
}
|
|
82
82
|
|
|
@@ -117,7 +117,7 @@ function checkSkillsComplete(targetDir) {
|
|
|
117
117
|
return {
|
|
118
118
|
passed: false,
|
|
119
119
|
detail: '.claude/skills/ directory not found',
|
|
120
|
-
fix: `Run ${cyan('@dzhechkov/keysarium update')} to restore skills.`,
|
|
120
|
+
fix: `Run ${cyan('npx @dzhechkov/keysarium update')} to restore skills.`,
|
|
121
121
|
};
|
|
122
122
|
}
|
|
123
123
|
|
|
@@ -165,141 +165,100 @@ function checkSkillsComplete(targetDir) {
|
|
|
165
165
|
}
|
|
166
166
|
|
|
167
167
|
/**
|
|
168
|
-
*
|
|
168
|
+
* Shared body for the "every shipped <thing>.md is installed" checks.
|
|
169
|
+
*
|
|
170
|
+
* The expected list is DERIVED from the package's own templates/ tree, never hardcoded —
|
|
171
|
+
* a command or rule added to templates/ is named-checked on the next run with no edit here.
|
|
172
|
+
* (Regression this guards: the lists used to be frozen at a legacy 11-command / 7-rule
|
|
173
|
+
* subset, so `doctor` reported "All 11 command files present" on a 19-command install and
|
|
174
|
+
* newer files like feature-adr.md / dream.md / reward-learning.md were never named.)
|
|
169
175
|
*/
|
|
170
|
-
function
|
|
171
|
-
|
|
172
|
-
const commandsDir = path.join(targetDir, '.claude', 'commands');
|
|
173
|
-
const expectedCommands = [
|
|
174
|
-
'casarium.md',
|
|
175
|
-
'new-research.md',
|
|
176
|
-
'parallel-research.md',
|
|
177
|
-
'discovery.md',
|
|
178
|
-
'explore-case.md',
|
|
179
|
-
'research.md',
|
|
180
|
-
'cjm-prototype.md',
|
|
181
|
-
'solve.md',
|
|
182
|
-
'architecture-phase.md',
|
|
183
|
-
'presentation.md',
|
|
184
|
-
'harvest.md',
|
|
185
|
-
];
|
|
186
|
-
|
|
187
|
-
if (!fileExists(commandsDir)) {
|
|
188
|
-
return {
|
|
189
|
-
passed: false,
|
|
190
|
-
detail: '.claude/commands/ directory not found',
|
|
191
|
-
fix: `Run ${cyan('@dzhechkov/keysarium update')} to restore commands.`,
|
|
192
|
-
};
|
|
193
|
-
}
|
|
176
|
+
function checkComponentFilesPresent(targetDir, opts) {
|
|
177
|
+
const { checkName, componentKey, dirParts, noun } = opts;
|
|
194
178
|
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
}
|
|
200
|
-
}
|
|
179
|
+
return check(checkName, () => {
|
|
180
|
+
const dir = path.join(targetDir, ...dirParts);
|
|
181
|
+
const relDir = dirParts.join('/') + '/';
|
|
182
|
+
const expected = getTemplateFileNames(componentKey);
|
|
201
183
|
|
|
202
|
-
if (
|
|
184
|
+
if (expected.length === 0) {
|
|
203
185
|
return {
|
|
204
|
-
passed:
|
|
205
|
-
detail: `
|
|
186
|
+
passed: false,
|
|
187
|
+
detail: `Cannot read the shipped ${noun} list from the package templates/ tree`,
|
|
188
|
+
fix: 'Reinstall the package: the templates/ directory is missing or unreadable.',
|
|
206
189
|
};
|
|
207
190
|
}
|
|
208
191
|
|
|
209
|
-
|
|
210
|
-
passed: false,
|
|
211
|
-
detail: `Missing ${missing.length} command(s): ${missing.join(', ')}`,
|
|
212
|
-
fix: `Run ${cyan('@dzhechkov/keysarium update')} to restore missing commands.`,
|
|
213
|
-
};
|
|
214
|
-
});
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
/**
|
|
218
|
-
* Check 5: All 7 rule .md files are present.
|
|
219
|
-
*/
|
|
220
|
-
function checkRulesPresent(targetDir) {
|
|
221
|
-
return check('Rules present', () => {
|
|
222
|
-
const rulesDir = path.join(targetDir, '.claude', 'rules');
|
|
223
|
-
const expectedRules = [
|
|
224
|
-
'agent-swarm.md',
|
|
225
|
-
'anti-patterns.md',
|
|
226
|
-
'checkpoint-protocol.md',
|
|
227
|
-
'domain-specific.md',
|
|
228
|
-
'file-conventions.md',
|
|
229
|
-
'modular-reuse.md',
|
|
230
|
-
'research-quality.md',
|
|
231
|
-
];
|
|
232
|
-
|
|
233
|
-
if (!fileExists(rulesDir)) {
|
|
192
|
+
if (!fileExists(dir)) {
|
|
234
193
|
return {
|
|
235
194
|
passed: false,
|
|
236
|
-
detail:
|
|
237
|
-
fix: `Run ${cyan('@dzhechkov/keysarium update')} to restore
|
|
195
|
+
detail: `${relDir} directory not found`,
|
|
196
|
+
fix: `Run ${cyan('npx @dzhechkov/keysarium update')} to restore ${noun}s.`,
|
|
238
197
|
};
|
|
239
198
|
}
|
|
240
199
|
|
|
241
|
-
const missing =
|
|
242
|
-
for (const rule of expectedRules) {
|
|
243
|
-
if (!fileExists(path.join(rulesDir, rule))) {
|
|
244
|
-
missing.push(rule);
|
|
245
|
-
}
|
|
246
|
-
}
|
|
200
|
+
const missing = expected.filter((name) => !fileExists(path.join(dir, name)));
|
|
247
201
|
|
|
248
202
|
if (missing.length === 0) {
|
|
249
203
|
return {
|
|
250
204
|
passed: true,
|
|
251
|
-
detail: `All ${
|
|
205
|
+
detail: `All ${expected.length} ${noun} files present`,
|
|
252
206
|
};
|
|
253
207
|
}
|
|
254
208
|
|
|
255
209
|
return {
|
|
256
210
|
passed: false,
|
|
257
|
-
detail: `Missing ${missing.length}
|
|
258
|
-
fix: `Run ${cyan('@dzhechkov/keysarium update')} to restore missing
|
|
211
|
+
detail: `Missing ${missing.length}/${expected.length} ${noun}(s): ${missing.slice(0, 5).join(', ')}${missing.length > 5 ? '...' : ''}`,
|
|
212
|
+
fix: `Run ${cyan('npx @dzhechkov/keysarium update')} to restore missing ${noun}s.`,
|
|
259
213
|
};
|
|
260
214
|
});
|
|
261
215
|
}
|
|
262
216
|
|
|
263
217
|
/**
|
|
264
|
-
* Check
|
|
218
|
+
* Check 4: every shipped command .md file is present.
|
|
265
219
|
*/
|
|
266
|
-
function
|
|
267
|
-
return
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
fix: `Run ${cyan('@dzhechkov/keysarium update')} to restore agents.`,
|
|
275
|
-
};
|
|
276
|
-
}
|
|
277
|
-
|
|
278
|
-
let entries;
|
|
279
|
-
try {
|
|
280
|
-
entries = fs.readdirSync(agentsDir);
|
|
281
|
-
} catch {
|
|
282
|
-
return {
|
|
283
|
-
passed: false,
|
|
284
|
-
detail: 'Cannot read .claude/agents/ directory',
|
|
285
|
-
fix: 'Check directory permissions.',
|
|
286
|
-
};
|
|
287
|
-
}
|
|
220
|
+
function checkCommandsPresent(targetDir) {
|
|
221
|
+
return checkComponentFilesPresent(targetDir, {
|
|
222
|
+
checkName: 'Commands present',
|
|
223
|
+
componentKey: 'commands',
|
|
224
|
+
dirParts: ['.claude', 'commands'],
|
|
225
|
+
noun: 'command',
|
|
226
|
+
});
|
|
227
|
+
}
|
|
288
228
|
|
|
289
|
-
|
|
229
|
+
/**
|
|
230
|
+
* Check 5: every shipped rule .md file is present.
|
|
231
|
+
*/
|
|
232
|
+
function checkRulesPresent(targetDir) {
|
|
233
|
+
return checkComponentFilesPresent(targetDir, {
|
|
234
|
+
checkName: 'Rules present',
|
|
235
|
+
componentKey: 'rules',
|
|
236
|
+
dirParts: ['.claude', 'rules'],
|
|
237
|
+
noun: 'rule',
|
|
238
|
+
});
|
|
239
|
+
}
|
|
290
240
|
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
241
|
+
/**
|
|
242
|
+
* Check 5b: every shipped governance shard is present.
|
|
243
|
+
*/
|
|
244
|
+
function checkShardsPresent(targetDir) {
|
|
245
|
+
return checkComponentFilesPresent(targetDir, {
|
|
246
|
+
checkName: 'Shards present',
|
|
247
|
+
componentKey: 'shards',
|
|
248
|
+
dirParts: ['.claude', 'shards'],
|
|
249
|
+
noun: 'shard',
|
|
250
|
+
});
|
|
251
|
+
}
|
|
297
252
|
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
253
|
+
/**
|
|
254
|
+
* Check 6: every shipped agent template .md file is present.
|
|
255
|
+
*/
|
|
256
|
+
function checkAgentsPresent(targetDir) {
|
|
257
|
+
return checkComponentFilesPresent(targetDir, {
|
|
258
|
+
checkName: 'Agents present',
|
|
259
|
+
componentKey: 'agents',
|
|
260
|
+
dirParts: ['.claude', 'agents'],
|
|
261
|
+
noun: 'agent',
|
|
303
262
|
});
|
|
304
263
|
}
|
|
305
264
|
|
|
@@ -314,7 +273,7 @@ function checkSettingsValid(targetDir) {
|
|
|
314
273
|
return {
|
|
315
274
|
passed: false,
|
|
316
275
|
detail: '.claude/settings.json not found',
|
|
317
|
-
fix: `Run ${cyan('@dzhechkov/keysarium update')} to restore settings.`,
|
|
276
|
+
fix: `Run ${cyan('npx @dzhechkov/keysarium update')} to restore settings.`,
|
|
318
277
|
};
|
|
319
278
|
}
|
|
320
279
|
|
|
@@ -390,7 +349,7 @@ async function run(options) {
|
|
|
390
349
|
// ── a) Check manifest exists ───────────────────────────────────────────
|
|
391
350
|
if (!fileExists(manifestPath)) {
|
|
392
351
|
logError('Keysarium is not installed in this directory.');
|
|
393
|
-
info(`Run ${cyan('@dzhechkov/keysarium init')} to install.`);
|
|
352
|
+
info(`Run ${cyan('npx @dzhechkov/keysarium init')} to install.`);
|
|
394
353
|
process.exit(1);
|
|
395
354
|
}
|
|
396
355
|
|
|
@@ -411,6 +370,7 @@ async function run(options) {
|
|
|
411
370
|
checkSkillsComplete(targetDir),
|
|
412
371
|
checkCommandsPresent(targetDir),
|
|
413
372
|
checkRulesPresent(targetDir),
|
|
373
|
+
checkShardsPresent(targetDir),
|
|
414
374
|
checkAgentsPresent(targetDir),
|
|
415
375
|
checkSettingsValid(targetDir),
|
|
416
376
|
checkResearchDir(targetDir),
|
package/src/commands/init.js
CHANGED
|
@@ -90,7 +90,7 @@ async function run(options) {
|
|
|
90
90
|
if (fileExists(manifestPath)) {
|
|
91
91
|
if (!force) {
|
|
92
92
|
warn('Keysarium is already installed in this directory.');
|
|
93
|
-
info(`Run ${cyan('@dzhechkov/keysarium update')} to update, or use ${yellow('--force')} to overwrite.`);
|
|
93
|
+
info(`Run ${cyan('npx @dzhechkov/keysarium update')} to update, or use ${yellow('--force')} to overwrite.`);
|
|
94
94
|
process.exit(1);
|
|
95
95
|
}
|
|
96
96
|
warn('Existing installation found — overwriting (--force).');
|
package/src/commands/list.js
CHANGED
|
@@ -65,7 +65,7 @@ async function run(options) {
|
|
|
65
65
|
// ── a) Read manifest ───────────────────────────────────────────────────
|
|
66
66
|
if (!fileExists(manifestPath)) {
|
|
67
67
|
warn('Keysarium is not installed in this directory.');
|
|
68
|
-
info(`Run ${cyan('@dzhechkov/keysarium init')} to install.`);
|
|
68
|
+
info(`Run ${cyan('npx @dzhechkov/keysarium init')} to install.`);
|
|
69
69
|
process.exit(1);
|
|
70
70
|
}
|
|
71
71
|
|
package/src/commands/remove.js
CHANGED
|
@@ -187,7 +187,7 @@ async function run(options) {
|
|
|
187
187
|
console.log(` ${dim('-')} ${skippedCount} file(s) already missing (skipped)`);
|
|
188
188
|
}
|
|
189
189
|
console.log('');
|
|
190
|
-
info(`To reinstall, run: ${cyan('@dzhechkov/keysarium init')}`);
|
|
190
|
+
info(`To reinstall, run: ${cyan('npx @dzhechkov/keysarium init')}`);
|
|
191
191
|
console.log('');
|
|
192
192
|
|
|
193
193
|
process.exit(0);
|
package/src/commands/update.js
CHANGED
|
@@ -30,7 +30,7 @@ async function run(options) {
|
|
|
30
30
|
// ── a) Read existing manifest ───────────────────────────────────────────
|
|
31
31
|
if (!fileExists(manifestPath)) {
|
|
32
32
|
logError('Keysarium is not installed in this directory.');
|
|
33
|
-
info(`Run ${cyan('@dzhechkov/keysarium init')} to install.`);
|
|
33
|
+
info(`Run ${cyan('npx @dzhechkov/keysarium init')} to install.`);
|
|
34
34
|
process.exit(1);
|
|
35
35
|
}
|
|
36
36
|
|
package/src/utils.js
CHANGED
|
@@ -250,19 +250,105 @@ function getTemplatesDir() {
|
|
|
250
250
|
// Component definitions
|
|
251
251
|
// ===========================================================================
|
|
252
252
|
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
253
|
+
/**
|
|
254
|
+
* Count the units a component contributes, by inspecting the real templates/ tree.
|
|
255
|
+
*
|
|
256
|
+
* `countMode` decides what a "unit" is:
|
|
257
|
+
* 'dirs' — immediate subdirectories (one skill pack = one directory)
|
|
258
|
+
* 'files' — every file, recursively (lib/, docs/ ship nested files)
|
|
259
|
+
* 'md' — immediate *.md files (one command / rule / shard / agent = one file)
|
|
260
|
+
*
|
|
261
|
+
* Returns null when the count cannot be determined (missing dir, unreadable),
|
|
262
|
+
* so callers can degrade to a bare label instead of printing a wrong number.
|
|
263
|
+
*/
|
|
264
|
+
function countTemplateUnits(comp) {
|
|
265
|
+
if (comp.isFile) return null;
|
|
266
|
+
|
|
267
|
+
const srcPath = path.join(getTemplatesDir(), comp.src);
|
|
268
|
+
|
|
269
|
+
try {
|
|
270
|
+
if (!fs.statSync(srcPath).isDirectory()) return null;
|
|
271
|
+
} catch {
|
|
272
|
+
return null;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
try {
|
|
276
|
+
if (comp.countMode === 'files') {
|
|
277
|
+
return getRelativePaths(srcPath).length;
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
const entries = fs.readdirSync(srcPath, { withFileTypes: true });
|
|
281
|
+
|
|
282
|
+
if (comp.countMode === 'dirs') {
|
|
283
|
+
return entries.filter((e) => e.isDirectory()).length;
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
// default: 'md'
|
|
287
|
+
return entries.filter((e) => e.isFile() && e.name.endsWith('.md')).length;
|
|
288
|
+
} catch {
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
/**
|
|
294
|
+
* Component definitions.
|
|
295
|
+
*
|
|
296
|
+
* IMPORTANT: `label` is a COMPUTED getter — the parenthetical count is read from the
|
|
297
|
+
* shipped templates/ tree at access time, never hardcoded. Adding a command / rule /
|
|
298
|
+
* skill to templates/ changes what `init`, `init --dry-run` and `list` print, with no
|
|
299
|
+
* source edit. (Regression this guards: the labels used to be frozen strings reading
|
|
300
|
+
* "8 skill packs / 13 slash commands / 10 rules / 7 shards / 4 modules" long after the
|
|
301
|
+
* tree had grown past all five numbers.)
|
|
302
|
+
*/
|
|
303
|
+
const COMPONENT_SPECS = {
|
|
304
|
+
skills: { src: '.claude/skills', name: 'Skills', unit: 'skill packs', countMode: 'dirs', group: 'core' },
|
|
305
|
+
commands: { src: '.claude/commands', name: 'Commands', unit: 'slash commands', countMode: 'md', group: 'core' },
|
|
306
|
+
rules: { src: '.claude/rules', name: 'Rules', unit: 'auto-loaded rules', countMode: 'md', group: 'core' },
|
|
307
|
+
shards: { src: '.claude/shards', name: 'Shards', unit: 'context shards', countMode: 'md', group: 'core' },
|
|
308
|
+
agents: { src: '.claude/agents', name: 'Agent templates', unit: 'swarm configs', countMode: 'md', group: 'core' },
|
|
309
|
+
hooks: { src: '.claude/settings.json', name: 'Hooks configuration', group: 'core', isFile: true },
|
|
310
|
+
lib: { src: 'lib', name: 'Library modules', unit: 'modules', countMode: 'files', group: 'extended' },
|
|
311
|
+
docs: { src: 'docs', name: 'Documentation', unit: 'guides', countMode: 'files', group: 'docs' },
|
|
312
|
+
claude_md: { src: 'CLAUDE.md', name: 'Master instructions', group: 'core', isFile: true },
|
|
313
|
+
harvest: { src: 'TOOLKIT_HARVEST.md', name: 'Knowledge harvest tracker', group: 'core', isFile: true },
|
|
264
314
|
};
|
|
265
315
|
|
|
316
|
+
/**
|
|
317
|
+
* The shipped `*.md` filenames for a directory component, read from templates/.
|
|
318
|
+
*
|
|
319
|
+
* This is the single source of truth for "what SHOULD be installed" — `doctor` derives its
|
|
320
|
+
* named checks from it, so a new command/rule/shard is named-checked the moment it lands in
|
|
321
|
+
* templates/, with no second list to keep in sync. Returns [] when templates/ is unreadable.
|
|
322
|
+
*/
|
|
323
|
+
function getTemplateFileNames(componentKey) {
|
|
324
|
+
const comp = COMPONENT_SPECS[componentKey];
|
|
325
|
+
if (!comp || comp.isFile) return [];
|
|
326
|
+
|
|
327
|
+
try {
|
|
328
|
+
return fs
|
|
329
|
+
.readdirSync(path.join(getTemplatesDir(), comp.src), { withFileTypes: true })
|
|
330
|
+
.filter((e) => e.isFile() && e.name.endsWith('.md'))
|
|
331
|
+
.map((e) => e.name)
|
|
332
|
+
.sort();
|
|
333
|
+
} catch {
|
|
334
|
+
return [];
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
const COMPONENTS = {};
|
|
339
|
+
for (const [key, spec] of Object.entries(COMPONENT_SPECS)) {
|
|
340
|
+
const comp = Object.assign({}, spec);
|
|
341
|
+
Object.defineProperty(comp, 'label', {
|
|
342
|
+
enumerable: true,
|
|
343
|
+
get() {
|
|
344
|
+
const n = countTemplateUnits(this);
|
|
345
|
+
if (n === null || !this.unit) return this.name;
|
|
346
|
+
return `${this.name} (${n} ${this.unit})`;
|
|
347
|
+
},
|
|
348
|
+
});
|
|
349
|
+
COMPONENTS[key] = comp;
|
|
350
|
+
}
|
|
351
|
+
|
|
266
352
|
// ===========================================================================
|
|
267
353
|
// Exports
|
|
268
354
|
// ===========================================================================
|
|
@@ -306,4 +392,6 @@ module.exports = {
|
|
|
306
392
|
|
|
307
393
|
// Components
|
|
308
394
|
COMPONENTS,
|
|
395
|
+
countTemplateUnits,
|
|
396
|
+
getTemplateFileNames,
|
|
309
397
|
};
|
|
@@ -511,7 +511,7 @@ Checkpoint ответы ──→ .keysarium/memory/{domain}/ ←── memory_
|
|
|
511
511
|
│ ↓ │
|
|
512
512
|
│ Если score стабильно ≥ 7.0 на 3+ кейсах: │
|
|
513
513
|
│ ↓ │
|
|
514
|
-
│ Contribute back → PR в
|
|
514
|
+
│ Contribute back → PR в dz-harness-hub │
|
|
515
515
|
└─────────────────────────────────────────────────────────┘
|
|
516
516
|
```
|
|
517
517
|
|
|
@@ -539,8 +539,8 @@ Checkpoint ответы ──→ .keysarium/memory/{domain}/ ←── memory_
|
|
|
539
539
|
|
|
540
540
|
**3. Contribute back (если вы — мейнтейнер пакета):**
|
|
541
541
|
```bash
|
|
542
|
-
# В репозитории
|
|
543
|
-
cp <your-project>/.claude/skills/<name>/ packages/
|
|
542
|
+
# В репозитории dz-harness-hub:
|
|
543
|
+
cp <your-project>/.claude/skills/<name>/ packages/@dzhechkov/keysarium/skills/<name>/
|
|
544
544
|
# + обновить trust tier в .claude/rules/trust-tiers.md
|
|
545
545
|
# + обновить SKILL.md frontmatter (bto_score, bto_date)
|
|
546
546
|
# + commit + publish
|
|
@@ -568,7 +568,7 @@ BTO оптимизация модифицирует файлы скилла **in
|
|
|
568
568
|
|
|
569
569
|
- **Не экспортируйте reward data для улучшения скилла** — reward data влияет на выбор подхода в runtime, а не на содержимое скилла
|
|
570
570
|
- **Не копируйте `.keysarium/memory/` между проектами** — используйте `/brain-export` + `/brain-import`
|
|
571
|
-
- **Не модифицируйте core протоколы** (`lib/*.md`, `packages/
|
|
571
|
+
- **Не модифицируйте core протоколы** (`lib/*.md`, `packages/@dzhechkov/keysarium-core/`) — если нужно изменить протокол, это архитектурное решение, не результат обучения
|
|
572
572
|
|
|
573
573
|
---
|
|
574
574
|
|
|
@@ -549,7 +549,7 @@ Feature-adr -- это отдельный pipeline. Он **не использу
|
|
|
549
549
|
### 11.1 Структура пакета
|
|
550
550
|
|
|
551
551
|
```
|
|
552
|
-
packages/
|
|
552
|
+
packages/@dzhechkov/skills-feature-adr/
|
|
553
553
|
├── package.json ← @dzhechkov/skills-feature-adr v1.0.0
|
|
554
554
|
├── bin/
|
|
555
555
|
│ └── cli.js ← Entry point (#!/usr/bin/env node)
|
|
@@ -80,8 +80,8 @@ npx @dzhechkov/skills-feature-adr init
|
|
|
80
80
|
Для разработки и модификации:
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
-
git clone https://github.com/
|
|
84
|
-
cd
|
|
83
|
+
git clone https://github.com/djd1m/dz-harness-hub.git
|
|
84
|
+
cd dz-harness-hub/packages/@dzhechkov/skills-feature-adr
|
|
85
85
|
npm link
|
|
86
86
|
```
|
|
87
87
|
|
|
@@ -139,7 +139,7 @@ npx @dzhechkov/keysarium brain merge brain1 brain2 # Слияние из нес
|
|
|
139
139
|
{
|
|
140
140
|
"version": "1.0",
|
|
141
141
|
"exported_at": "2026-03-01T12:00:00Z",
|
|
142
|
-
"source_project": "
|
|
142
|
+
"source_project": "dz-harness-hub",
|
|
143
143
|
"patterns": [...],
|
|
144
144
|
"bto_evaluations": [...],
|
|
145
145
|
"harvest_data": [...],
|
|
@@ -130,12 +130,12 @@ pip install cryptography pynacl
|
|
|
130
130
|
|
|
131
131
|
```bash
|
|
132
132
|
# Клонирование по HTTPS
|
|
133
|
-
git clone https://github.com
|
|
134
|
-
cd
|
|
133
|
+
git clone https://github.com/djd1m/dz-harness-hub.git
|
|
134
|
+
cd dz-harness-hub
|
|
135
135
|
|
|
136
136
|
# Либо по SSH (если настроены SSH-ключи)
|
|
137
|
-
git clone git@github.com
|
|
138
|
-
cd
|
|
137
|
+
git clone git@github.com:djd1m/dz-harness-hub.git
|
|
138
|
+
cd dz-harness-hub
|
|
139
139
|
```
|
|
140
140
|
|
|
141
141
|
### 2.2. Проверка структуры
|
|
@@ -221,7 +221,7 @@ export CLAUDE_MODEL="claude-opus-4-20250514"
|
|
|
221
221
|
|
|
222
222
|
```bash
|
|
223
223
|
# Перейдите в директорию проекта
|
|
224
|
-
cd
|
|
224
|
+
cd dz-harness-hub
|
|
225
225
|
|
|
226
226
|
# Запустите Claude Code
|
|
227
227
|
claude
|
|
@@ -238,7 +238,7 @@ claude
|
|
|
238
238
|
|
|
239
239
|
```bash
|
|
240
240
|
# 1. Запустите Claude Code в директории проекта
|
|
241
|
-
cd
|
|
241
|
+
cd dz-harness-hub
|
|
242
242
|
claude
|
|
243
243
|
|
|
244
244
|
# 2. В интерфейсе Claude Code выполните:
|
|
@@ -324,7 +324,7 @@ rm -rf researches/test/
|
|
|
324
324
|
|
|
325
325
|
```bash
|
|
326
326
|
# Запустите Claude Code
|
|
327
|
-
cd
|
|
327
|
+
cd dz-harness-hub
|
|
328
328
|
claude
|
|
329
329
|
|
|
330
330
|
# Запустите полный пайплайн
|
|
@@ -425,7 +425,7 @@ researches/bank_kc_automation/
|
|
|
425
425
|
### Пример файла .env
|
|
426
426
|
|
|
427
427
|
```bash
|
|
428
|
-
# /home/user/
|
|
428
|
+
# /home/user/dz-harness-hub/.env
|
|
429
429
|
# Этот файл НЕ коммитится в git
|
|
430
430
|
|
|
431
431
|
ANTHROPIC_API_KEY=sk-ant-api03-ваш-ключ-здесь
|
|
@@ -487,7 +487,7 @@ npm config set https-proxy "http://corporate-proxy.example.com:8080"
|
|
|
487
487
|
### 8.1. Обновление из основного репозитория
|
|
488
488
|
|
|
489
489
|
```bash
|
|
490
|
-
cd
|
|
490
|
+
cd dz-harness-hub
|
|
491
491
|
|
|
492
492
|
# Получить последние изменения
|
|
493
493
|
git fetch origin
|
|
@@ -563,19 +563,19 @@ nano .claude/commands/casarium.md
|
|
|
563
563
|
|
|
564
564
|
```bash
|
|
565
565
|
# === Пользователь 1 (Алиса) ===
|
|
566
|
-
git clone https://github.com
|
|
566
|
+
git clone https://github.com/djd1m/dz-harness-hub.git ~/alice-keysarium
|
|
567
567
|
cd ~/alice-keysarium
|
|
568
568
|
export ANTHROPIC_API_KEY="sk-ant-alice-key"
|
|
569
569
|
claude
|
|
570
570
|
|
|
571
571
|
# === Пользователь 2 (Борис) ===
|
|
572
|
-
git clone https://github.com
|
|
572
|
+
git clone https://github.com/djd1m/dz-harness-hub.git ~/boris-keysarium
|
|
573
573
|
cd ~/boris-keysarium
|
|
574
574
|
export ANTHROPIC_API_KEY="sk-ant-boris-key"
|
|
575
575
|
claude
|
|
576
576
|
|
|
577
577
|
# === Пользователь 3 (Вера) ===
|
|
578
|
-
git clone https://github.com
|
|
578
|
+
git clone https://github.com/djd1m/dz-harness-hub.git ~/vera-keysarium
|
|
579
579
|
cd ~/vera-keysarium
|
|
580
580
|
export ANTHROPIC_API_KEY="sk-ant-vera-key"
|
|
581
581
|
claude
|
|
@@ -660,7 +660,7 @@ curl -s https://api.anthropic.com/v1/messages \
|
|
|
660
660
|
# Проблема: /casarium не распознаётся
|
|
661
661
|
# Убедитесь, что вы в корневой директории проекта
|
|
662
662
|
pwd
|
|
663
|
-
# Должен быть: /path/to/
|
|
663
|
+
# Должен быть: /path/to/dz-harness-hub
|
|
664
664
|
|
|
665
665
|
# Проверьте наличие файлов команд
|
|
666
666
|
ls .claude/commands/
|
|
@@ -760,8 +760,8 @@ nvm install 20
|
|
|
760
760
|
npm install -g @anthropic-ai/claude-code
|
|
761
761
|
|
|
762
762
|
# 5. Клонируйте репозиторий и работайте как в Linux
|
|
763
|
-
git clone https://github.com
|
|
764
|
-
cd
|
|
763
|
+
git clone https://github.com/djd1m/dz-harness-hub.git
|
|
764
|
+
cd dz-harness-hub
|
|
765
765
|
export ANTHROPIC_API_KEY="sk-ant-ваш-ключ"
|
|
766
766
|
claude
|
|
767
767
|
```
|
|
@@ -773,7 +773,7 @@ claude
|
|
|
773
773
|
```bash
|
|
774
774
|
# Полная установка за 5 минут:
|
|
775
775
|
npm install -g @anthropic-ai/claude-code # 1. Установка CLI
|
|
776
|
-
git clone <repo-url> && cd
|
|
776
|
+
git clone <repo-url> && cd dz-harness-hub # 2. Клонирование
|
|
777
777
|
export ANTHROPIC_API_KEY="sk-ant-ваш-ключ" # 3. API-ключ
|
|
778
778
|
claude # 4. Запуск
|
|
779
779
|
/new-research test # 5. Проверка
|
|
@@ -455,8 +455,8 @@ nvm install 20
|
|
|
455
455
|
npm install -g @anthropic-ai/claude-code
|
|
456
456
|
|
|
457
457
|
# 7. Клонирование и работа
|
|
458
|
-
git clone https://github.com
|
|
459
|
-
cd
|
|
458
|
+
git clone https://github.com/djd1m/dz-harness-hub.git
|
|
459
|
+
cd dz-harness-hub
|
|
460
460
|
export ANTHROPIC_API_KEY="sk-ant-ваш-ключ"
|
|
461
461
|
claude
|
|
462
462
|
```
|
|
@@ -576,7 +576,7 @@ claude
|
|
|
576
576
|
### 9.2. Gitpod
|
|
577
577
|
|
|
578
578
|
```bash
|
|
579
|
-
# 1. Откройте: https://gitpod.io/#https://github.com
|
|
579
|
+
# 1. Откройте: https://gitpod.io/#https://github.com/djd1m/dz-harness-hub
|
|
580
580
|
# 2. В терминале Gitpod:
|
|
581
581
|
|
|
582
582
|
npm install -g @anthropic-ai/claude-code
|
|
@@ -618,8 +618,8 @@ nvm use 20
|
|
|
618
618
|
npm install -g @anthropic-ai/claude-code
|
|
619
619
|
|
|
620
620
|
# Клонирование репозитория
|
|
621
|
-
git clone https://github.com
|
|
622
|
-
cd
|
|
621
|
+
git clone https://github.com/djd1m/dz-harness-hub.git
|
|
622
|
+
cd dz-harness-hub
|
|
623
623
|
|
|
624
624
|
# API-ключ (рекомендуется через AWS Secrets Manager)
|
|
625
625
|
export ANTHROPIC_API_KEY="sk-ant-ваш-ключ"
|
|
@@ -962,6 +962,6 @@ jobs:
|
|
|
962
962
|
### Быстрая проверка (1 минута)
|
|
963
963
|
|
|
964
964
|
```bash
|
|
965
|
-
cd
|
|
965
|
+
cd dz-harness-hub
|
|
966
966
|
node --version && git --version && claude --version && echo "ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:+SET}" && echo "Всё готово!"
|
|
967
967
|
```
|
|
@@ -136,8 +136,8 @@ npm install @dzhechkov/skills-feature-adr @dzhechkov/keysarium-core
|
|
|
136
136
|
Если вам нужна последняя версия из исходников:
|
|
137
137
|
|
|
138
138
|
```bash
|
|
139
|
-
git clone https://github.com/
|
|
140
|
-
cd
|
|
139
|
+
git clone https://github.com/djd1m/dz-harness-hub.git
|
|
140
|
+
cd dz-harness-hub/packages/@dzhechkov/keysarium-core/
|
|
141
141
|
|
|
142
142
|
# Проверка содержимого
|
|
143
143
|
ls -la
|
|
@@ -408,7 +408,7 @@ find node_modules/@dzhechkov/keysarium-core -name "*.md" | wc -l
|
|
|
408
408
|
# Ожидаемый результат: 19
|
|
409
409
|
|
|
410
410
|
# Или при установке из git:
|
|
411
|
-
find packages/
|
|
411
|
+
find packages/@dzhechkov/keysarium-core -name "*.md" | wc -l
|
|
412
412
|
# Ожидаемый результат: 19
|
|
413
413
|
```
|
|
414
414
|
|
|
@@ -569,12 +569,12 @@ cat .keysarium/memory/config.json | grep '"version"'
|
|
|
569
569
|
### 7.4. Обновление из Git
|
|
570
570
|
|
|
571
571
|
```bash
|
|
572
|
-
cd
|
|
572
|
+
cd dz-harness-hub
|
|
573
573
|
git fetch origin
|
|
574
574
|
git pull origin main
|
|
575
575
|
|
|
576
576
|
# Проверка обновлений в core
|
|
577
|
-
git log --oneline -5 -- packages/
|
|
577
|
+
git log --oneline -5 -- packages/@dzhechkov/keysarium-core/
|
|
578
578
|
```
|
|
579
579
|
|
|
580
580
|
---
|
|
@@ -31,12 +31,12 @@
|
|
|
31
31
|
|
|
32
32
|
```bash
|
|
33
33
|
# Перечислить все файлы core-пакета
|
|
34
|
-
ls packages/
|
|
35
|
-
ls packages/
|
|
36
|
-
ls packages/
|
|
37
|
-
ls packages/
|
|
38
|
-
ls packages/
|
|
39
|
-
ls packages/
|
|
34
|
+
ls packages/@dzhechkov/keysarium-core/governance/
|
|
35
|
+
ls packages/@dzhechkov/keysarium-core/memory/
|
|
36
|
+
ls packages/@dzhechkov/keysarium-core/orchestration/
|
|
37
|
+
ls packages/@dzhechkov/keysarium-core/verification/
|
|
38
|
+
ls packages/@dzhechkov/keysarium-core/trust-tiers/
|
|
39
|
+
ls packages/@dzhechkov/keysarium-core/platform/
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
Ожидаемые файлы по модулям:
|
|
@@ -15,7 +15,7 @@ Create `.opencode/config.yaml` with the following structure:
|
|
|
15
15
|
```yaml
|
|
16
16
|
# OpenCode configuration for {project name}
|
|
17
17
|
# Generated from .claude/ directory by /init-platform
|
|
18
|
-
# Source:
|
|
18
|
+
# Source: dz-harness-hub
|
|
19
19
|
|
|
20
20
|
project:
|
|
21
21
|
name: "{project name from CLAUDE.md}"
|
|
@@ -99,7 +99,7 @@ Write `{OUTPUT_DIR}/output/brain-export-{YYYYMMDD}.json`:
|
|
|
99
99
|
"version": "1.0",
|
|
100
100
|
"format": "keysarium-brain",
|
|
101
101
|
"exported_at": "{ISO8601 timestamp}",
|
|
102
|
-
"source_project": "
|
|
102
|
+
"source_project": "dz-harness-hub",
|
|
103
103
|
"worker_id": "{WORKER_ID}",
|
|
104
104
|
"skills": [
|
|
105
105
|
{
|