dsh-nurse-record-check 0.2.10 → 0.2.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/LICENSE +197 -11
- package/README-es.md +48 -2
- package/README-hi.md +48 -2
- package/README-pt.md +48 -2
- package/README-zh.md +58 -7
- package/README.md +55 -7
- package/lib/index.d.mts +7 -12
- package/lib/index.mjs +18 -28
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
package/LICENSE
CHANGED
|
@@ -1,15 +1,201 @@
|
|
|
1
|
-
Apache License
|
|
1
|
+
Apache License
|
|
2
|
+
Version 2.0, January 2004
|
|
3
|
+
http://www.apache.org/licenses/
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
you may not use this file except in compliance with the License.
|
|
7
|
-
You may obtain a copy of the License at
|
|
7
|
+
1. Definitions.
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
"License" shall mean the terms and conditions for use, reproduction,
|
|
10
|
+
and distribution as defined by Sections 1 through 9 of this document.
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
"Licensor" shall mean the copyright owner or entity authorized by
|
|
13
|
+
the copyright owner that is granting the License.
|
|
14
|
+
|
|
15
|
+
"Legal Entity" shall mean the union of the acting entity and all
|
|
16
|
+
other entities that control, are controlled by, or are under common
|
|
17
|
+
control with that entity. For the purposes of this definition,
|
|
18
|
+
"control" means (i) the power, direct or indirect, to cause the
|
|
19
|
+
direction or management of such entity, whether by contract or
|
|
20
|
+
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
21
|
+
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
22
|
+
|
|
23
|
+
"You" (or "Your") shall mean an individual or Legal Entity
|
|
24
|
+
exercising permissions granted by this License.
|
|
25
|
+
|
|
26
|
+
"Source" form shall mean the preferred form for making modifications,
|
|
27
|
+
including but not limited to software source code, documentation
|
|
28
|
+
source, and configuration files.
|
|
29
|
+
|
|
30
|
+
"Object" form shall mean any form resulting from mechanical
|
|
31
|
+
transformation or translation of a Source form, including but
|
|
32
|
+
not limited to compiled object code, generated documentation,
|
|
33
|
+
and conversions to other media types.
|
|
34
|
+
|
|
35
|
+
"Work" shall mean the work of authorship, whether in Source or
|
|
36
|
+
Object form, made available under the License, as indicated by a
|
|
37
|
+
copyright notice that is included in or attached to the work
|
|
38
|
+
(an example is provided in the Appendix below).
|
|
39
|
+
|
|
40
|
+
"Derivative Works" shall mean any work, whether in Source or Object
|
|
41
|
+
form, that is based on (or derived from) the Work and for which the
|
|
42
|
+
editorial revisions, annotations, elaborations, or other modifications
|
|
43
|
+
represent, as a whole, an original work of authorship. For the purposes
|
|
44
|
+
of this License, Derivative Works shall not include works that remain
|
|
45
|
+
separable from, or merely link (or bind by name) to the interfaces of,
|
|
46
|
+
the Work and Derivative Works thereof.
|
|
47
|
+
|
|
48
|
+
"Contribution" shall mean any work of authorship, including
|
|
49
|
+
the original version of the Work and any modifications or additions
|
|
50
|
+
to that Work or Derivative Works thereof, that is intentionally
|
|
51
|
+
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
52
|
+
or by an individual or Legal Entity authorized to submit on behalf of
|
|
53
|
+
the copyright owner. For the purposes of this definition, "submitted"
|
|
54
|
+
means any form of electronic, verbal, or written communication sent
|
|
55
|
+
to the Licensor or its representatives, including but not limited to
|
|
56
|
+
communication on electronic mailing lists, source code control systems,
|
|
57
|
+
and issue tracking systems that are managed by, or on behalf of, the
|
|
58
|
+
Licensor for the purpose of discussing and improving the Work, but
|
|
59
|
+
excluding communication that is conspicuously marked or otherwise
|
|
60
|
+
designated in writing by the copyright owner as "Not a Contribution."
|
|
61
|
+
|
|
62
|
+
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
63
|
+
on behalf of whom a Contribution has been received by Licensor and
|
|
64
|
+
subsequently incorporated within the Work.
|
|
65
|
+
|
|
66
|
+
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
67
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
68
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
69
|
+
copyright license to reproduce, prepare Derivative Works of,
|
|
70
|
+
publicly display, publicly perform, sublicense, and distribute the
|
|
71
|
+
Work and such Derivative Works in Source or Object form.
|
|
72
|
+
|
|
73
|
+
3. Grant of Patent License. Subject to the terms and conditions of
|
|
74
|
+
this License, each Contributor hereby grants to You a perpetual,
|
|
75
|
+
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
76
|
+
(except as stated in this section) patent license to make, have made,
|
|
77
|
+
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
78
|
+
where such license applies only to those patent claims licensable
|
|
79
|
+
by such Contributor that are necessarily infringed by their
|
|
80
|
+
Contribution(s) alone or by combination of their Contribution(s)
|
|
81
|
+
with the Work to which such Contribution(s) was submitted. If You
|
|
82
|
+
institute patent litigation against any entity (including a
|
|
83
|
+
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
84
|
+
or a Contribution incorporated within the Work constitutes direct
|
|
85
|
+
or contributory patent infringement, then any patent licenses
|
|
86
|
+
granted to You under this License for that Work shall terminate
|
|
87
|
+
as of the date such litigation is filed.
|
|
88
|
+
|
|
89
|
+
4. Redistribution. You may reproduce and distribute copies of the
|
|
90
|
+
Work or Derivative Works thereof in any medium, with or without
|
|
91
|
+
modifications, and in Source or Object form, provided that You
|
|
92
|
+
meet the following conditions:
|
|
93
|
+
|
|
94
|
+
(a) You must give any other recipients of the Work or
|
|
95
|
+
Derivative Works a copy of this License; and
|
|
96
|
+
|
|
97
|
+
(b) You must cause any modified files to carry prominent notices
|
|
98
|
+
stating that You changed the files; and
|
|
99
|
+
|
|
100
|
+
(c) You must retain, in the Source form of any Derivative Works
|
|
101
|
+
that You distribute, all copyright, patent, trademark, and
|
|
102
|
+
attribution notices from the Source form of the Work,
|
|
103
|
+
excluding those notices that do not pertain to any part of
|
|
104
|
+
the Derivative Works; and
|
|
105
|
+
|
|
106
|
+
(d) If the Work includes a "NOTICE" text file as part of its
|
|
107
|
+
distribution, then any Derivative Works that You distribute must
|
|
108
|
+
include a readable copy of the attribution notices contained
|
|
109
|
+
within such NOTICE file, excluding those notices that do not
|
|
110
|
+
pertain to any part of the Derivative Works, in at least one
|
|
111
|
+
of the following places: within a NOTICE text file distributed
|
|
112
|
+
as part of the Derivative Works; within the Source form or
|
|
113
|
+
documentation, if provided along with the Derivative Works; or,
|
|
114
|
+
within a display generated by the Derivative Works, if and
|
|
115
|
+
wherever such third-party notices normally appear. The contents
|
|
116
|
+
of the NOTICE file are for informational purposes only and
|
|
117
|
+
do not modify the License. You may add Your own attribution
|
|
118
|
+
notices within Derivative Works that You distribute, alongside
|
|
119
|
+
or as an addendum to the NOTICE text from the Work, provided
|
|
120
|
+
that such additional attribution notices cannot be construed
|
|
121
|
+
as modifying the License.
|
|
122
|
+
|
|
123
|
+
You may add Your own copyright statement to Your modifications and
|
|
124
|
+
may provide additional or different license terms and conditions
|
|
125
|
+
for use, reproduction, or distribution of Your modifications, or
|
|
126
|
+
for any such Derivative Works as a whole, provided Your use,
|
|
127
|
+
reproduction, and distribution of the Work otherwise complies with
|
|
128
|
+
the conditions stated in this License.
|
|
129
|
+
|
|
130
|
+
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
131
|
+
any Contribution intentionally submitted for inclusion in the Work
|
|
132
|
+
by You to the Licensor shall be under the terms and conditions of
|
|
133
|
+
this License, without any additional terms or conditions.
|
|
134
|
+
Notwithstanding the above, nothing herein shall supersede or modify
|
|
135
|
+
the terms of any separate license agreement you may have executed
|
|
136
|
+
with Licensor regarding such Contributions.
|
|
137
|
+
|
|
138
|
+
6. Trademarks. This License does not grant permission to use the trade
|
|
139
|
+
names, trademarks, service marks, or product names of the Licensor,
|
|
140
|
+
except as required for reasonable and customary use in describing the
|
|
141
|
+
origin of the Work and reproducing the content of the NOTICE file.
|
|
142
|
+
|
|
143
|
+
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
144
|
+
agreed to in writing, Licensor provides the Work (and each
|
|
145
|
+
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
146
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
147
|
+
implied, including, without limitation, any warranties or conditions
|
|
148
|
+
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
149
|
+
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
150
|
+
appropriateness of using or redistributing the Work and assume any
|
|
151
|
+
risks associated with Your exercise of permissions under this License.
|
|
152
|
+
|
|
153
|
+
8. Limitation of Liability. In no event and under no legal theory,
|
|
154
|
+
whether in tort (including negligence), contract, or otherwise,
|
|
155
|
+
unless required by applicable law (such as deliberate and grossly
|
|
156
|
+
negligent acts) or agreed to in writing, shall any Contributor be
|
|
157
|
+
liable to You for damages, including any direct, indirect, special,
|
|
158
|
+
incidental, or consequential damages of any character arising as a
|
|
159
|
+
result of this License or out of the use or inability to use the
|
|
160
|
+
Work (including but not limited to damages for loss of goodwill,
|
|
161
|
+
work stoppage, computer failure or malfunction, or any and all
|
|
162
|
+
other commercial damages or losses), even if such Contributor
|
|
163
|
+
has been advised of the possibility of such damages.
|
|
164
|
+
|
|
165
|
+
9. Accepting Warranty or Additional Liability. While redistributing
|
|
166
|
+
the Work or Derivative Works thereof, You may choose to offer,
|
|
167
|
+
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
168
|
+
or other liability obligations and/or rights consistent with this
|
|
169
|
+
License. However, in accepting such obligations, You may act only
|
|
170
|
+
on Your own behalf and on Your sole responsibility, not on behalf
|
|
171
|
+
of any other Contributor, and only if You agree to indemnify,
|
|
172
|
+
defend, and hold each Contributor harmless for any liability
|
|
173
|
+
incurred by, or claims asserted against, such Contributor by reason
|
|
174
|
+
of your accepting any such warranty or additional liability.
|
|
175
|
+
|
|
176
|
+
END OF TERMS AND CONDITIONS
|
|
177
|
+
|
|
178
|
+
APPENDIX: How to apply the Apache License to your work.
|
|
179
|
+
|
|
180
|
+
To apply the Apache License to your work, attach the following
|
|
181
|
+
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
182
|
+
replaced with your own identifying information. (Don't include
|
|
183
|
+
the brackets!) The text should be enclosed in the appropriate
|
|
184
|
+
comment syntax for the file format. We also recommend that a
|
|
185
|
+
file or class name and description of purpose be included on the
|
|
186
|
+
same "printed page" as the copyright notice for easier
|
|
187
|
+
identification within third-party archives.
|
|
188
|
+
|
|
189
|
+
Copyright [yyyy] [name of copyright owner]
|
|
190
|
+
|
|
191
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
192
|
+
you may not use this file except in compliance with the License.
|
|
193
|
+
You may obtain a copy of the License at
|
|
194
|
+
|
|
195
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
196
|
+
|
|
197
|
+
Unless required by applicable law or agreed to in writing, software
|
|
198
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
199
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
200
|
+
See the License for the specific language governing permissions and
|
|
201
|
+
limitations under the License.
|
package/README-es.md
CHANGED
|
@@ -8,6 +8,7 @@ dsh plugin --profile <name> add dsh-nurse-record-check
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
[](https://dsh.market/)
|
|
11
|
+
[](https://dshfind.com/en/plugins/PerryLink/dsh-nurse-record-check?ref=badge)
|
|
11
12
|
|
|
12
13
|
`dsh-nurse-record-check` lee una exportación legible por máquina de un episodio de hospitalización —registros de enfermería, órdenes médicas y formularios de evaluación completados— y comprueba los plazos, las firmas y la conservación de formularios de esa documentación de enfermería (护理记录), informando de las diferencias literales frente a las cláusulas citadas: que cada registro de enfermería deje un responsable y una hora trazables, que toda fecha y hora esté escrita en formato de 24 horas y se pueda leer, que la hora de un registro de reanimación sea precisa al minuto y su nota se escriba dentro de las 6 horas siguientes al final de la reanimación, que una orden temporal lleve hora de ejecución y la firma de la enfermera que la ejecutó y que una orden anulada registre su anulación, que la primera evaluación de enfermería y la frecuencia de documentación cumplan los umbrales que configure la institución, que los formularios de riesgo de caídas y de lesión por presión estén archivados, y que el intervalo entre rondas de vigilancia corresponda a la guía de cuidados graduados del nivel de cuidados que el registro indica. Una comprobación que no puede ejecutarse se lista en `skipped` en lugar de pasar.
|
|
13
14
|
|
|
@@ -20,14 +21,55 @@ dsh --profile <name> --dump-config | grep 'dsh-nurse-record-check'
|
|
|
20
21
|
|
|
21
22
|
## Cómo se ve la salida
|
|
22
23
|
|
|
23
|
-

|
|
25
|
+
|
|
26
|
+
*Resumen del flujo: documento → reglas → hallazgos. Los ejemplos siguientes usan la superficie de comandos real.*
|
|
24
27
|
|
|
25
|
-

|
|
26
28
|
|
|
27
29
|
Salida real de este plugin sobre su propio fixture de prueba `NR-007` — no es un montaje. El paquete de reglas no inventa citas, así que cada hallazgo nombra la cláusula aplicada y advierte que su texto no se obtuvo.
|
|
28
30
|
|
|
29
31
|
## Qué responde
|
|
30
32
|
|
|
33
|
+
### Ejemplos
|
|
34
|
+
|
|
35
|
+
La tabla siguiente es el conjunto de ejemplos: la primera fila es el caso detallado y las demás son casos breves.
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#### Salida detallada
|
|
39
|
+
|
|
40
|
+
**Herramienta** `nurse_record_check`
|
|
41
|
+
|
|
42
|
+
**Entrada**
|
|
43
|
+
|
|
44
|
+
~~~yaml
|
|
45
|
+
records:
|
|
46
|
+
- id: REC-0001
|
|
47
|
+
kind: general
|
|
48
|
+
recordedAt: "2026-03-15 09:00"
|
|
49
|
+
nurseId: N10231
|
|
50
|
+
- id: REC-0002
|
|
51
|
+
kind: general
|
|
52
|
+
recordedAt: "2026-03-15 11:00"
|
|
53
|
+
nurseName: 李护士
|
|
54
|
+
~~~
|
|
55
|
+
|
|
56
|
+
**Salida**
|
|
57
|
+
|
|
58
|
+
~~~json
|
|
59
|
+
{
|
|
60
|
+
"id": "dsh-nurse-record-check.NR-001.185cc700",
|
|
61
|
+
"ruleId": "NR-001",
|
|
62
|
+
"severity": "error",
|
|
63
|
+
"locator": {
|
|
64
|
+
"cell": "REC-0002"
|
|
65
|
+
},
|
|
66
|
+
"found": "记录无签名护士标识",
|
|
67
|
+
"expected": "每条护理记录均应有签名"
|
|
68
|
+
}
|
|
69
|
+
~~~
|
|
70
|
+
|
|
71
|
+
*Observado en `dsh-nurse-record-check/tests/fixtures/NR-001/NR-001-unsafe.yaml`*
|
|
72
|
+
|
|
31
73
|
| Usted pregunta | Qué responde |
|
|
32
74
|
|---|---|
|
|
33
75
|
| Un registro de enfermería salió del sistema de planta sin enfermera firmante. ¿Se informa de ello? | Sí. `NR-001` informa de todo registro de enfermería que no deja un identificador de responsable y también de un `nurseId` que no coincide con el formato de número de personal configurado. Comprueba que el material deje una marca de responsable y una hora, no cómo se implementa técnicamente la firma electrónica. |
|
|
@@ -111,6 +153,10 @@ node ../scripts/sync-shared.mjs dsh-nurse-record-check
|
|
|
111
153
|
|
|
112
154
|
El último comando copia el kit compartido de `../_shared` a `src/shared/`; vuelva a ejecutarlo tras cada cambio compartido.
|
|
113
155
|
|
|
156
|
+
## PerryLink DSH Plugin Family
|
|
157
|
+
|
|
158
|
+
Full family index: [choose a checker by material](https://perrylink.github.io/zh/checkers/choose/) and [all plugins](https://github.com/PerryLink). This repository is one of them.
|
|
159
|
+
|
|
114
160
|
## License
|
|
115
161
|
|
|
116
162
|
[Apache License 2.0](LICENSE) © 2026 dsh-nurse-record-check contributors.
|
package/README-hi.md
CHANGED
|
@@ -8,6 +8,7 @@ dsh plugin --profile <name> add dsh-nurse-record-check
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
[](https://dsh.market/)
|
|
11
|
+
[](https://dshfind.com/en/plugins/PerryLink/dsh-nurse-record-check?ref=badge)
|
|
11
12
|
|
|
12
13
|
`dsh-nurse-record-check` एक भर्ती प्रकरण (inpatient episode) के मशीन-पठनीय निर्यात को पढ़ता है — नर्सिंग प्रविष्टियाँ, चिकित्सकीय आदेश और भरे गए मूल्यांकन प्रपत्र — और उस नर्सिंग दस्तावेज़ (护理记录) की समय-सीमा, हस्ताक्षर और मूल्यांकन-प्रपत्र की जाँच करता है, तथा उद्धृत धाराओं के विरुद्ध शाब्दिक अंतर दर्ज करता है: कि हर नर्सिंग प्रविष्टि में पता लगाने योग्य रिकॉर्डर और समय हो, कि हर दिनांक और समय 24-घंटे के प्रारूप में लिखा हो और पढ़ा जा सके, कि पुनर्जीवन (rescue) रिकॉर्ड का समय मिनट तक सटीक हो और उसका नोट पुनर्जीवन समाप्त होने के 6 घंटे के भीतर लिखा गया हो, कि अस्थायी आदेश (temporary order) में निष्पादन समय और निष्पादन करने वाली नर्स का हस्ताक्षर हो तथा रद्द किए गए आदेश में रद्दीकरण दर्ज हो, कि प्रथम नर्सिंग मूल्यांकन और दस्तावेज़ीकरण की आवृत्ति संस्थान द्वारा कॉन्फ़िगर की गई सीमाओं के अनुरूप हो, कि गिरने के जोखिम और दबाव-घाव (pressure injury) के मूल्यांकन प्रपत्र अभिलेख में उपलब्ध हों, और यह कि गश्त (rounds) का अंतराल रिकॉर्ड में दर्ज देखभाल-स्तर के श्रेणीबद्ध नर्सिंग मार्गदर्शन से मेल खाता हो। जो जाँच चल न सके वह पास होने के बजाय `skipped` में दर्ज की जाती है।
|
|
13
14
|
|
|
@@ -20,14 +21,55 @@ dsh --profile <name> --dump-config | grep 'dsh-nurse-record-check'
|
|
|
20
21
|
|
|
21
22
|
## आउटपुट कैसा दिखता है
|
|
22
23
|
|
|
23
|
-

|
|
25
|
+
|
|
26
|
+
*कार्यप्रवाह: दस्तावेज़ → नियम → निष्कर्ष। नीचे के उदाहरण वास्तविक कमांड सतह का उपयोग करते हैं।*
|
|
24
27
|
|
|
25
|
-

|
|
26
28
|
|
|
27
29
|
इस प्लगइन का अपने ही `NR-007` टेस्ट फ़िक्स्चर पर वास्तविक आउटपुट — कोई नकली चित्र नहीं। नियम-पैक उद्धरण नहीं गढ़ता, इसलिए हर निष्कर्ष लागू किए गए खंड का नाम और यह भी बताता है कि उसका मूल पाठ इस बार प्राप्त नहीं हुआ।
|
|
28
30
|
|
|
29
31
|
## यह किन सवालों का जवाब देता है
|
|
30
32
|
|
|
33
|
+
### उदाहरण
|
|
34
|
+
|
|
35
|
+
नीचे दी गई तालिका उदाहरण-समुच्चय है: पहली पंक्ति विस्तृत केस है, बाकी संक्षिप्त केस हैं।
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#### विस्तृत आउटपुट
|
|
39
|
+
|
|
40
|
+
**उपकरण** `nurse_record_check`
|
|
41
|
+
|
|
42
|
+
**इनपुट**
|
|
43
|
+
|
|
44
|
+
~~~yaml
|
|
45
|
+
records:
|
|
46
|
+
- id: REC-0001
|
|
47
|
+
kind: general
|
|
48
|
+
recordedAt: "2026-03-15 09:00"
|
|
49
|
+
nurseId: N10231
|
|
50
|
+
- id: REC-0002
|
|
51
|
+
kind: general
|
|
52
|
+
recordedAt: "2026-03-15 11:00"
|
|
53
|
+
nurseName: 李护士
|
|
54
|
+
~~~
|
|
55
|
+
|
|
56
|
+
**आउटपुट**
|
|
57
|
+
|
|
58
|
+
~~~json
|
|
59
|
+
{
|
|
60
|
+
"id": "dsh-nurse-record-check.NR-001.185cc700",
|
|
61
|
+
"ruleId": "NR-001",
|
|
62
|
+
"severity": "error",
|
|
63
|
+
"locator": {
|
|
64
|
+
"cell": "REC-0002"
|
|
65
|
+
},
|
|
66
|
+
"found": "记录无签名护士标识",
|
|
67
|
+
"expected": "每条护理记录均应有签名"
|
|
68
|
+
}
|
|
69
|
+
~~~
|
|
70
|
+
|
|
71
|
+
*स्रोत `dsh-nurse-record-check/tests/fixtures/NR-001/NR-001-unsafe.yaml`*
|
|
72
|
+
|
|
31
73
|
| आपका सवाल | इसका जवाब |
|
|
32
74
|
|---|---|
|
|
33
75
|
| एक नर्सिंग प्रविष्टि में हस्ताक्षर करने वाली नर्स का विवरण नहीं है। क्या यह दर्ज होता है? | हाँ। `NR-001` ऐसी हर नर्सिंग प्रविष्टि दर्ज करता है जिसमें रिकॉर्डर का कोई पहचान-चिह्न न हो, और ऐसा `nurseId` भी जो कॉन्फ़िगर किए गए कर्मचारी-क्रमांक प्रारूप से मेल न खाए। यह देखता है कि सामग्री में रिकॉर्डर का चिह्न और समय छूटा है या नहीं — इलेक्ट्रॉनिक हस्ताक्षर तकनीकी रूप से कैसे लागू किया गया है, यह नहीं जाँचता। |
|
|
@@ -111,6 +153,10 @@ node ../scripts/sync-shared.mjs dsh-nurse-record-check
|
|
|
111
153
|
|
|
112
154
|
अंतिम कमांड `../_shared` का साझा किट `src/shared/` में कॉपी करता है; हर साझा बदलाव के बाद इसे दोबारा चलाएँ।
|
|
113
155
|
|
|
156
|
+
## PerryLink DSH Plugin Family
|
|
157
|
+
|
|
158
|
+
Full family index: [choose a checker by material](https://perrylink.github.io/zh/checkers/choose/) and [all plugins](https://github.com/PerryLink). This repository is one of them.
|
|
159
|
+
|
|
114
160
|
## License
|
|
115
161
|
|
|
116
162
|
[Apache License 2.0](LICENSE) © 2026 dsh-nurse-record-check contributors.
|
package/README-pt.md
CHANGED
|
@@ -8,6 +8,7 @@ dsh plugin --profile <name> add dsh-nurse-record-check
|
|
|
8
8
|
|
|
9
9
|
|
|
10
10
|
[](https://dsh.market/)
|
|
11
|
+
[](https://dshfind.com/en/plugins/PerryLink/dsh-nurse-record-check?ref=badge)
|
|
11
12
|
|
|
12
13
|
`dsh-nurse-record-check` lê uma exportação legível por máquina de um episódio de internamento —registos de enfermagem, ordens médicas e formulários de avaliação preenchidos— e verifica os prazos, as assinaturas e a conservação de formulários dessa documentação de enfermagem (护理记录), assinalando as diferenças literais face às cláusulas citadas: que cada registo de enfermagem deixe um responsável e uma hora rastreáveis, que toda a data e hora esteja escrita em formato de 24 horas e possa ser lida, que a hora de um registo de reanimação seja precisa ao minuto e a sua nota seja escrita nas 6 horas seguintes ao fim da reanimação, que uma ordem temporária traga hora de execução e a assinatura da enfermeira que a executou e que uma ordem anulada registe o seu cancelamento, que a primeira avaliação de enfermagem e a frequência de documentação cumpram os limiares que a instituição configurar, que os formulários de risco de queda e de lesão por pressão estejam arquivados, e que o intervalo entre rondas de vigilância corresponda à orientação de cuidados graduados do nível de cuidados indicado no registo. Uma verificação que não pode ser executada é listada em `skipped` em vez de passar.
|
|
13
14
|
|
|
@@ -20,14 +21,55 @@ dsh --profile <name> --dump-config | grep 'dsh-nurse-record-check'
|
|
|
20
21
|
|
|
21
22
|
## Como é a saída
|
|
22
23
|
|
|
23
|
-

|
|
25
|
+
|
|
26
|
+
*Visão geral do fluxo: documento → regras → achados. Os exemplos abaixo usam a superfície real de comandos.*
|
|
24
27
|
|
|
25
|
-

|
|
26
28
|
|
|
27
29
|
Saída real deste plugin sobre o seu próprio fixture de teste `NR-007` — não é uma simulação. O pacote de regras não inventa citações, por isso cada achado nomeia a cláusula aplicada e avisa que o seu texto não foi obtido.
|
|
28
30
|
|
|
29
31
|
## O que ele responde
|
|
30
32
|
|
|
33
|
+
### Exemplos
|
|
34
|
+
|
|
35
|
+
A tabela abaixo é o conjunto de exemplos: a primeira linha é o caso detalhado e as demais são casos curtos.
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
#### Saída detalhada
|
|
39
|
+
|
|
40
|
+
**Ferramenta** `nurse_record_check`
|
|
41
|
+
|
|
42
|
+
**Entrada**
|
|
43
|
+
|
|
44
|
+
~~~yaml
|
|
45
|
+
records:
|
|
46
|
+
- id: REC-0001
|
|
47
|
+
kind: general
|
|
48
|
+
recordedAt: "2026-03-15 09:00"
|
|
49
|
+
nurseId: N10231
|
|
50
|
+
- id: REC-0002
|
|
51
|
+
kind: general
|
|
52
|
+
recordedAt: "2026-03-15 11:00"
|
|
53
|
+
nurseName: 李护士
|
|
54
|
+
~~~
|
|
55
|
+
|
|
56
|
+
**Saída**
|
|
57
|
+
|
|
58
|
+
~~~json
|
|
59
|
+
{
|
|
60
|
+
"id": "dsh-nurse-record-check.NR-001.185cc700",
|
|
61
|
+
"ruleId": "NR-001",
|
|
62
|
+
"severity": "error",
|
|
63
|
+
"locator": {
|
|
64
|
+
"cell": "REC-0002"
|
|
65
|
+
},
|
|
66
|
+
"found": "记录无签名护士标识",
|
|
67
|
+
"expected": "每条护理记录均应有签名"
|
|
68
|
+
}
|
|
69
|
+
~~~
|
|
70
|
+
|
|
71
|
+
*Observado em `dsh-nurse-record-check/tests/fixtures/NR-001/NR-001-unsafe.yaml`*
|
|
72
|
+
|
|
31
73
|
| Você pergunta | O que ele responde |
|
|
32
74
|
|---|---|
|
|
33
75
|
| Um registo de enfermagem saiu do sistema da enfermaria sem enfermeira que o assine. Isso é assinalado? | Sim. `NR-001` assinala todo o registo de enfermagem que não deixa um identificador de responsável e também um `nurseId` que não corresponda ao formato de número profissional configurado. Verifica que o material deixa uma marca de responsável e uma hora, não como a assinatura eletrónica está tecnicamente implementada. |
|
|
@@ -111,6 +153,10 @@ node ../scripts/sync-shared.mjs dsh-nurse-record-check
|
|
|
111
153
|
|
|
112
154
|
O último comando copia o kit compartilhado de `../_shared` para `src/shared/`; execute-o novamente após cada alteração compartilhada.
|
|
113
155
|
|
|
156
|
+
## PerryLink DSH Plugin Family
|
|
157
|
+
|
|
158
|
+
Full family index: [choose a checker by material](https://perrylink.github.io/zh/checkers/choose/) and [all plugins](https://github.com/PerryLink). This repository is one of them.
|
|
159
|
+
|
|
114
160
|
## License
|
|
115
161
|
|
|
116
162
|
[Apache License 2.0](LICENSE) © 2026 dsh-nurse-record-check contributors.
|
package/README-zh.md
CHANGED
|
@@ -2,7 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
|
|
4
4
|
|
|
5
|
+
<!-- topblock:v1 -->
|
|
6
|
+
> **这是什么** 护理记录时限、签名与评估表完整性校验。输出一份「哪一行、哪一栏、差什么」的清单。
|
|
7
|
+
> **给谁用** 护理部、护士长;不用懂命令行。
|
|
8
|
+
> **你交什么** 这项核对用到的原始材料(表格、清单或文书);不改原件。Excel 可先转成 JSON/YAML,对话里也能代转。
|
|
9
|
+
> **它不做什么** 不判合规、不认定责任、不替代审核人;只列材料内部能逐条指认的差异。
|
|
10
|
+
> **怎么开始** 在 WorkBuddy / 扣子搜「医疗文书质控包」(本检查是其中一项;上架以商城为准);或命令行:
|
|
11
|
+
> `dsh plugin --profile <name> add dsh-nurse-record-check`
|
|
12
|
+
<!-- /topblock:v1 -->
|
|
13
|
+
|
|
5
14
|
[](https://dsh.market/)
|
|
15
|
+
[](https://dshfind.com/en/plugins/PerryLink/dsh-nurse-record-check?ref=badge)
|
|
6
16
|
|
|
7
17
|
`dsh-nurse-record-check` 读取一次住院过程的机器可读导出材料——护理记录、医嘱与已完成的评估表——核对这份护理记录的时限、签名与评估表留存,逐条报出与所引条款的字面差异:每条护理记录是否留下可追溯的记录人与时间、日期与时间是否按 24 小时制书写且可解析、抢救记录的时间是否精确到分钟且是否在抢救结束后 6 小时内补记、临时医嘱是否记录执行时间与执行护士签名、取消的医嘱是否记录取消信息、首次护理评估与护理记录书写频次是否满足本机构配置的阈值、跌倒与压力性损伤风险评估表是否留存、巡视间隔是否与该记录所载护理级别对应的分级护理指导原则相符。无法执行的检查计入 `skipped`,不会静默通过。
|
|
8
18
|
|
|
@@ -15,14 +25,55 @@ dsh --profile <name> --dump-config | grep 'dsh-nurse-record-check'
|
|
|
15
25
|
|
|
16
26
|
## 实际输出长什么样
|
|
17
27
|
|
|
18
|
-

|
|
29
|
+
|
|
30
|
+
*工作流概览:文档 → 规则包 → 核对结果。下面的示例使用实际命令面。*
|
|
19
31
|
|
|
20
|
-

|
|
21
32
|
|
|
22
33
|
本插件对自己 `NR-007` 测试夹具的**真实输出**,不是示意图。规则库不伪造引文,因此每条发现都会同时写明所引条款,以及该条款原文本次未取得。
|
|
23
34
|
|
|
24
35
|
## 它回答什么问题
|
|
25
36
|
|
|
37
|
+
### 示例
|
|
38
|
+
|
|
39
|
+
下表是示例集:第一行是详细走查,其余行是简短案例。
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
#### 详细输出
|
|
43
|
+
|
|
44
|
+
**工具** `nurse_record_check`
|
|
45
|
+
|
|
46
|
+
**输入**
|
|
47
|
+
|
|
48
|
+
~~~yaml
|
|
49
|
+
records:
|
|
50
|
+
- id: REC-0001
|
|
51
|
+
kind: general
|
|
52
|
+
recordedAt: "2026-03-15 09:00"
|
|
53
|
+
nurseId: N10231
|
|
54
|
+
- id: REC-0002
|
|
55
|
+
kind: general
|
|
56
|
+
recordedAt: "2026-03-15 11:00"
|
|
57
|
+
nurseName: 李护士
|
|
58
|
+
~~~
|
|
59
|
+
|
|
60
|
+
**输出**
|
|
61
|
+
|
|
62
|
+
~~~json
|
|
63
|
+
{
|
|
64
|
+
"id": "dsh-nurse-record-check.NR-001.185cc700",
|
|
65
|
+
"ruleId": "NR-001",
|
|
66
|
+
"severity": "error",
|
|
67
|
+
"locator": {
|
|
68
|
+
"cell": "REC-0002"
|
|
69
|
+
},
|
|
70
|
+
"found": "记录无签名护士标识",
|
|
71
|
+
"expected": "每条护理记录均应有签名"
|
|
72
|
+
}
|
|
73
|
+
~~~
|
|
74
|
+
|
|
75
|
+
*来源 `dsh-nurse-record-check/tests/fixtures/NR-001/NR-001-unsafe.yaml`*
|
|
76
|
+
|
|
26
77
|
| 你会问 | 它怎么答 |
|
|
27
78
|
|---|---|
|
|
28
79
|
| 有一条护理记录导出时没有签名护士,会被报出吗? | 会。`NR-001` 会报出没有留下记录人标识的护理记录,也会报出不符合所配置工号格式的 `nurseId`。它只核对材料是否留下记录人标识与时间,不校验电子签名的技术实现。 |
|
|
@@ -45,11 +96,7 @@ dsh --profile <name> --dump-config | grep 'dsh-nurse-record-check'
|
|
|
45
96
|
| 《三级医院评审标准(2020年版)》 | 国卫医发〔2020〕26号 | NR-009 |
|
|
46
97
|
| 《综合医院分级护理指导原则(试行)》 | 卫医政发〔2009〕49号 | NR-011 |
|
|
47
98
|
|
|
48
|
-
|
|
49
|
-
documentation (护理记录) in an **inpatient** episode. It is not `dsh-medrec-qc` (which checks the
|
|
50
|
-
front sheet of the medical record and its internal contradictions), not a nursing-quality
|
|
51
|
-
scorecard, and not a clinical decision aid. It reads a machine-readable export and reports literal
|
|
52
|
-
mismatches against cited clauses; it never decides whether an episode of care was appropriate.
|
|
99
|
+
**边界(中文译文,以英文原文为准):** 本插件核对一次**住院**诊疗中**护理**文书(护理记录)的及时性、签名与评估表记录。它不是 `dsh-medrec-qc`(后者核对病案首页及其内部矛盾),不是护理质量评分卡,也不是临床决策辅助工具。它读取机器可读的导出数据,并报出与所引条款之间的字面不符;它从不判定某次诊疗过程是否恰当。
|
|
53
100
|
|
|
54
101
|
## Compatibility
|
|
55
102
|
|
|
@@ -106,6 +153,10 @@ node ../scripts/sync-shared.mjs dsh-nurse-record-check
|
|
|
106
153
|
|
|
107
154
|
第 4 项把 `../_shared` 的共享件同步进 `src/shared/`;每次改动共享件后都要重跑。
|
|
108
155
|
|
|
156
|
+
## PerryLink DSH Plugin Family
|
|
157
|
+
|
|
158
|
+
完整清单(62 个核查器 + 通用插件)见 [按材料选核查器](https://perrylink.github.io/zh/checkers/choose/);本仓只是其中一个。
|
|
159
|
+
|
|
109
160
|
## License
|
|
110
161
|
|
|
111
162
|
[Apache License 2.0](LICENSE) © 2026 dsh-nurse-record-check contributors.
|
package/README.md
CHANGED
|
@@ -2,12 +2,17 @@
|
|
|
2
2
|
|
|
3
3
|
[English](README.md) · [简体中文](README-zh.md) · [Español](README-es.md) · [Português](README-pt.md) · [हिन्दी](README-hi.md)
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
5
|
+
<!-- topblock:v1 -->
|
|
6
|
+
> **What it is** — Nursing record timeliness, sign-off and assessment-form completeness check. It returns a list of what is inconsistent, where, and what to fix.
|
|
7
|
+
> **Who it is for** — nursing managers; no command line required.
|
|
8
|
+
> **What you give it** — the source material the check works on (a table, register or document); the original is never modified. Excel can be converted to JSON/YAML first, in chat if the platform supports it.
|
|
9
|
+
> **What it does not do** — no compliance verdict, no liability finding, no replacement for the reviewer; differences only.
|
|
10
|
+
> **How to start** — search "Medical Record QC Suite" in WorkBuddy / Coze (this check is one part of it; availability as listed); or:
|
|
11
|
+
> `dsh plugin --profile <name> add dsh-nurse-record-check`
|
|
12
|
+
<!-- /topblock:v1 -->
|
|
9
13
|
|
|
10
14
|
[](https://dsh.market/)
|
|
15
|
+
[](https://dshfind.com/en/plugins/PerryLink/dsh-nurse-record-check?ref=badge)
|
|
11
16
|
|
|
12
17
|
`dsh-nurse-record-check` reads a machine-readable export of one inpatient episode — nursing entries, medical orders and completed assessment forms — and checks the timeliness, sign-off and assessment-form record of that nursing documentation (护理记录), reporting literal mismatches against cited clauses: that every nursing entry leaves a traceable recorder and a time, that every date and time is written in 24-hour form and can be read, that a rescue record's time is precise to the minute and its note is written up within 6 hours of the rescue ending, that a temporary order carries an execution time and the executing nurse's signature and that a cancelled order records its cancellation, that the first nursing assessment and the documentation frequency meet the thresholds the institution configures, that fall-risk and pressure-injury assessment forms are on file, and that the rounds interval matches the graded-nursing guidance for the care level the record states. A check that cannot run is listed in `skipped` instead of passing.
|
|
13
18
|
|
|
@@ -20,14 +25,53 @@ dsh --profile <name> --dump-config | grep 'dsh-nurse-record-check'
|
|
|
20
25
|
|
|
21
26
|
## What it looks like
|
|
22
27
|
|
|
23
|
-

|
|
29
|
+
|
|
30
|
+
*Workflow overview: document → rule pack → findings. The examples below use the real command surface.*
|
|
24
31
|
|
|
25
|
-

|
|
26
32
|
|
|
27
|
-
Real output from this plugin over its own `NR-007` test fixture — not a mock-up. The rule pack ships no invented quotations, so a finding names both the clause it applied and the fact that the clause text was not obtained.
|
|
28
33
|
|
|
29
34
|
## What it answers
|
|
30
35
|
|
|
36
|
+
### Examples
|
|
37
|
+
|
|
38
|
+
The table below is the example set: the first row is the detailed walkthrough, the remaining rows are short cases.
|
|
39
|
+
|
|
40
|
+
#### Detailed output
|
|
41
|
+
|
|
42
|
+
**Tool** `nurse_record_check`
|
|
43
|
+
|
|
44
|
+
**Input**
|
|
45
|
+
|
|
46
|
+
~~~yaml
|
|
47
|
+
records:
|
|
48
|
+
- id: REC-0001
|
|
49
|
+
kind: general
|
|
50
|
+
recordedAt: "2026-03-15 09:00"
|
|
51
|
+
nurseId: N10231
|
|
52
|
+
- id: REC-0002
|
|
53
|
+
kind: general
|
|
54
|
+
recordedAt: "2026-03-15 11:00"
|
|
55
|
+
nurseName: 李护士
|
|
56
|
+
~~~
|
|
57
|
+
|
|
58
|
+
**Output**
|
|
59
|
+
|
|
60
|
+
~~~json
|
|
61
|
+
{
|
|
62
|
+
"id": "dsh-nurse-record-check.NR-001.185cc700",
|
|
63
|
+
"ruleId": "NR-001",
|
|
64
|
+
"severity": "error",
|
|
65
|
+
"locator": {
|
|
66
|
+
"cell": "REC-0002"
|
|
67
|
+
},
|
|
68
|
+
"found": "记录无签名护士标识",
|
|
69
|
+
"expected": "每条护理记录均应有签名"
|
|
70
|
+
}
|
|
71
|
+
~~~
|
|
72
|
+
|
|
73
|
+
*Observed from `dsh-nurse-record-check/tests/fixtures/NR-001/NR-001-unsafe.yaml`*
|
|
74
|
+
|
|
31
75
|
| You ask | What it answers |
|
|
32
76
|
|---|---|
|
|
33
77
|
| A nursing entry came out of the ward system with no signing nurse. Is that reported? | Yes. `NR-001` reports every nursing entry that leaves no recorder identifier, and also a `nurseId` that does not match the configured staff-number pattern. It checks that the material leaves a recorder mark and a time, not how the electronic signature is technically implemented. |
|
|
@@ -186,6 +230,10 @@ pnpm run build # tsdown -> lib/index.mjs + lib/index.d.mts
|
|
|
186
230
|
node ../scripts/sync-shared.mjs dsh-nurse-record-check # refresh src/shared from ../_shared
|
|
187
231
|
```
|
|
188
232
|
|
|
233
|
+
## PerryLink DSH Plugin Family
|
|
234
|
+
|
|
235
|
+
Full family index: [choose a checker by material](https://perrylink.github.io/zh/checkers/choose/) and [all plugins](https://github.com/PerryLink). This repository is one of them.
|
|
236
|
+
|
|
189
237
|
## License
|
|
190
238
|
|
|
191
239
|
[Apache License 2.0](LICENSE) © 2026 dsh-nurse-record-check contributors.
|
package/lib/index.d.mts
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import Schema from "@deepseek-ai/schemastery";
|
|
2
2
|
import { Context } from "@deepseek-ai/cordis";
|
|
3
|
-
//#region src/config.d.ts
|
|
4
3
|
/**
|
|
5
4
|
* Every tunable lives here so an operator can change behaviour from
|
|
6
5
|
* `cordis.yml` without editing code (the family's "no hard-coded tunables"
|
|
7
6
|
* redline). The rule pack itself is data as well and can be pointed elsewhere.
|
|
8
7
|
*/
|
|
9
|
-
interface Config {
|
|
8
|
+
export interface Config {
|
|
10
9
|
/** Rule-pack path relative to the plugin package root. */
|
|
11
10
|
rulesFile: string;
|
|
12
11
|
/** Rule ids disabled for this deployment. */
|
|
@@ -18,13 +17,11 @@ interface Config {
|
|
|
18
17
|
/** Tool timeout budget in milliseconds. */
|
|
19
18
|
timeoutMs: number;
|
|
20
19
|
}
|
|
21
|
-
declare const Config: Schema<Config>;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
declare const name = "dsh-nurse-record-check";
|
|
25
|
-
declare const inject: string[];
|
|
20
|
+
export declare const Config: Schema<Config>;
|
|
21
|
+
export declare const name = "dsh-nurse-record-check";
|
|
22
|
+
export declare const inject: string[];
|
|
26
23
|
/** Tool id exposed to the model, and the row id in `cordis.patch.yml`. */
|
|
27
|
-
declare const TOOL_NAME = "nurse_record_check";
|
|
24
|
+
export declare const TOOL_NAME = "nurse_record_check";
|
|
28
25
|
/**
|
|
29
26
|
* Locate a package-owned file such as the rule pack.
|
|
30
27
|
*
|
|
@@ -38,7 +35,7 @@ declare const TOOL_NAME = "nurse_record_check";
|
|
|
38
35
|
* @returns the resolved absolute path.
|
|
39
36
|
* @throws Error naming every location tried, when the file is absent.
|
|
40
37
|
*/
|
|
41
|
-
declare function resolvePackageFile(relative: string): string;
|
|
38
|
+
export declare function resolvePackageFile(relative: string): string;
|
|
42
39
|
/**
|
|
43
40
|
* Register the nursing-record checker tool.
|
|
44
41
|
*
|
|
@@ -49,6 +46,4 @@ declare function resolvePackageFile(relative: string): string;
|
|
|
49
46
|
* @param ctx - plugin context, with `tools` already available.
|
|
50
47
|
* @param config - validated configuration.
|
|
51
48
|
*/
|
|
52
|
-
declare function apply(ctx: Context, config: Config): () => void;
|
|
53
|
-
//#endregion
|
|
54
|
-
export { Config, TOOL_NAME, apply, inject, name, resolvePackageFile };
|
|
49
|
+
export declare function apply(ctx: Context, config: Config): () => void;
|
package/lib/index.mjs
CHANGED
|
@@ -3,7 +3,7 @@ import { existsSync } from "node:fs";
|
|
|
3
3
|
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
4
4
|
import { defineTool } from "@deepseek-ai/dsh-tools";
|
|
5
5
|
import Schema from "@deepseek-ai/schemastery";
|
|
6
|
-
|
|
6
|
+
// src/config.ts
|
|
7
7
|
const Config = Schema.object({
|
|
8
8
|
rulesFile: Schema.string().default("rules/nurse-record.yaml").description("规则库文件路径(相对插件包根目录)。替换该文件即可切换规则集版本。"),
|
|
9
9
|
disabledRules: Schema.array(Schema.string()).default([]).description("要停用的规则 id 列表;停用的规则会出现在报告的 skipped 中。"),
|
|
@@ -11,8 +11,7 @@ const Config = Schema.object({
|
|
|
11
11
|
skipNotes: Schema.string().default("").description("附加到每条 skipped 说明后的备注,例如标注本机构实施细则。"),
|
|
12
12
|
timeoutMs: Schema.number().default(12e4).description("工具协作式超时预算(毫秒)。")
|
|
13
13
|
});
|
|
14
|
-
|
|
15
|
-
//#region src/shared/datetime.ts
|
|
14
|
+
// src/shared/datetime.ts
|
|
16
15
|
const DATE_PATTERN = /^(\d{4})[-/.](\d{1,2})[-/.](\d{1,2})$/;
|
|
17
16
|
const TIME_PATTERN = /^(\d{1,2}):(\d{2})(?::(\d{2}))?$/;
|
|
18
17
|
function pad(value, width = 2) {
|
|
@@ -90,8 +89,7 @@ function formatDuration(minutes) {
|
|
|
90
89
|
if (rest === 0) return `${sign}${hours}小时`;
|
|
91
90
|
return `${sign}${hours}小时${rest}分钟`;
|
|
92
91
|
}
|
|
93
|
-
|
|
94
|
-
//#region src/shared/rules.ts
|
|
92
|
+
// src/shared/rules.ts
|
|
95
93
|
/**
|
|
96
94
|
* Compose the one-line `basis` string rendered into reports.
|
|
97
95
|
* @param basis - the rule's normative basis.
|
|
@@ -121,8 +119,7 @@ function disabledAsSkipped(ruleset, disabledIds, reason) {
|
|
|
121
119
|
reason
|
|
122
120
|
}));
|
|
123
121
|
}
|
|
124
|
-
|
|
125
|
-
//#region src/shared/yaml.ts
|
|
122
|
+
// src/shared/yaml.ts
|
|
126
123
|
/**
|
|
127
124
|
* Minimal, dependency-free YAML reader for rule packs and check material.
|
|
128
125
|
*
|
|
@@ -475,6 +472,10 @@ var Reader = class {
|
|
|
475
472
|
if (!isSequenceItem(line.text)) break;
|
|
476
473
|
this.index += 1;
|
|
477
474
|
const rest = line.text === "-" ? "" : line.text.slice(2).trim();
|
|
475
|
+
if (rest.startsWith("{") || rest.startsWith("[")) {
|
|
476
|
+
items.push(parseScalar(rest, line.num));
|
|
477
|
+
continue;
|
|
478
|
+
}
|
|
478
479
|
if ((rest === "" ? -1 : findKeySeparator(rest)) >= 0) {
|
|
479
480
|
items.push(this.readMapping(indent + 2, {
|
|
480
481
|
text: rest,
|
|
@@ -554,8 +555,7 @@ function requireString(source, key, where) {
|
|
|
554
555
|
if (typeof value !== "string" || value.trim() === "") throw new YamlSubsetError(`${where}: missing required string field "${key}"`);
|
|
555
556
|
return value;
|
|
556
557
|
}
|
|
557
|
-
|
|
558
|
-
//#region src/shared/ruleset.ts
|
|
558
|
+
// src/shared/ruleset.ts
|
|
559
559
|
/**
|
|
560
560
|
* Rule-pack loading and validation.
|
|
561
561
|
*
|
|
@@ -697,8 +697,7 @@ function paramNumberMap(rule, key) {
|
|
|
697
697
|
}
|
|
698
698
|
return out;
|
|
699
699
|
}
|
|
700
|
-
|
|
701
|
-
//#region src/shared/report.ts
|
|
700
|
+
// src/shared/report.ts
|
|
702
701
|
/** Locator fields that participate in the stable issue id, in fixed order. */
|
|
703
702
|
const LOCATOR_ID_KEYS = [
|
|
704
703
|
"file",
|
|
@@ -774,8 +773,7 @@ function sortValue(value) {
|
|
|
774
773
|
}
|
|
775
774
|
return target;
|
|
776
775
|
}
|
|
777
|
-
|
|
778
|
-
//#region src/model.ts
|
|
776
|
+
// src/model.ts
|
|
779
777
|
/** The record kinds for which a minute-precision timestamp is required. */
|
|
780
778
|
const MINUTE_PRECISION_KINDS = ["rescue"];
|
|
781
779
|
/** All record kinds, in the order the report lists them. */
|
|
@@ -810,8 +808,7 @@ function toRecordKind(raw) {
|
|
|
810
808
|
其他: "other"
|
|
811
809
|
}[raw.trim().toLowerCase()] ?? "other";
|
|
812
810
|
}
|
|
813
|
-
|
|
814
|
-
//#region src/check.ts
|
|
811
|
+
// src/check.ts
|
|
815
812
|
/**
|
|
816
813
|
* Pure check core: `(input, ruleset, options) => Report`.
|
|
817
814
|
*
|
|
@@ -1250,8 +1247,7 @@ function runCheck(input, ruleset, options) {
|
|
|
1250
1247
|
skipped
|
|
1251
1248
|
});
|
|
1252
1249
|
}
|
|
1253
|
-
|
|
1254
|
-
//#region src/shared/dictionary.ts
|
|
1250
|
+
// src/shared/dictionary.ts
|
|
1255
1251
|
/** Strip decoration that never carries meaning in a header cell. */
|
|
1256
1252
|
function normalizeHeader(raw) {
|
|
1257
1253
|
return raw.replace(/[\u3000\s]+/g, "").replace(/[**]/g, "").replace(/[((][^(())]*[))]/g, "").replace(/[::]/g, "").replace(/[【】\[\]]/g, "").toLowerCase();
|
|
@@ -1333,8 +1329,7 @@ const ASSESSMENT_SYNONYMS = [
|
|
|
1333
1329
|
]
|
|
1334
1330
|
}
|
|
1335
1331
|
];
|
|
1336
|
-
|
|
1337
|
-
//#region src/parse.ts
|
|
1332
|
+
// src/parse.ts
|
|
1338
1333
|
/**
|
|
1339
1334
|
* Reader for the canonical nursing-record material.
|
|
1340
1335
|
*
|
|
@@ -1547,12 +1542,10 @@ function parseMaterial(source, target) {
|
|
|
1547
1542
|
if (unknownKinds.length > 0) warnings.push(`有 ${unknownKinds.length} 条记录的 kind 无法识别,按 other 处理`);
|
|
1548
1543
|
return input;
|
|
1549
1544
|
}
|
|
1550
|
-
|
|
1551
|
-
//#region src/shared/wording.ts
|
|
1545
|
+
// src/shared/wording.ts
|
|
1552
1546
|
/** Footer appended to every rendered report. */
|
|
1553
1547
|
const DISCLAIMER = "免责声明:本报告由程序按声明的规则集自动生成,仅列出与所引条款之间的字面差异,供人工复核线索使用;不构成对任何事实、行为或文件的定性意见,也不替代主管人员、评审专家或监管机构的判断。规则集的时效性与适用范围以引用文件的最新有效版本为准。";
|
|
1554
|
-
|
|
1555
|
-
//#region src/view.ts
|
|
1548
|
+
// src/view.ts
|
|
1556
1549
|
/**
|
|
1557
1550
|
* Model-facing projection of a {@link Report}.
|
|
1558
1551
|
*
|
|
@@ -1641,8 +1634,7 @@ function buildView(report) {
|
|
|
1641
1634
|
reportJson: canonicalJson(report)
|
|
1642
1635
|
};
|
|
1643
1636
|
}
|
|
1644
|
-
|
|
1645
|
-
//#region src/shared/memo.ts
|
|
1637
|
+
// src/shared/memo.ts
|
|
1646
1638
|
/**
|
|
1647
1639
|
* Memoized loading of package-owned rule packs.
|
|
1648
1640
|
*
|
|
@@ -1665,8 +1657,7 @@ function loadRulesetFile(path) {
|
|
|
1665
1657
|
pending.catch(() => cache.delete(path));
|
|
1666
1658
|
return pending;
|
|
1667
1659
|
}
|
|
1668
|
-
|
|
1669
|
-
//#region src/index.ts
|
|
1660
|
+
// src/index.ts
|
|
1670
1661
|
const name = "dsh-nurse-record-check";
|
|
1671
1662
|
const inject = ["tools"];
|
|
1672
1663
|
/** Tool id exposed to the model, and the row id in `cordis.patch.yml`. */
|
|
@@ -1805,5 +1796,4 @@ function apply(ctx, config) {
|
|
|
1805
1796
|
}
|
|
1806
1797
|
}));
|
|
1807
1798
|
}
|
|
1808
|
-
//#endregion
|
|
1809
1799
|
export { Config, TOOL_NAME, apply, inject, name, resolvePackageFile };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-nurse-record-check",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.12",
|
|
4
4
|
"description": "护理记录时限、签名与评估表完整性校验(依据《病历书写基本规范》等公开文件,仅提示差异,不作出定性结论)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.mjs",
|
|
@@ -78,14 +78,14 @@
|
|
|
78
78
|
"@deepseek-ai/schemastery": "^3.18.2"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
|
-
"@deepseek-ai/cordis": "4.0.5
|
|
82
|
-
"@deepseek-ai/dsh-package-manifest": "0.2.1-rc.
|
|
81
|
+
"@deepseek-ai/cordis": "4.0.5",
|
|
82
|
+
"@deepseek-ai/dsh-package-manifest": "0.2.1-rc.3",
|
|
83
83
|
"@deepseek-ai/dsh-tools": "0.2.1-rc.2",
|
|
84
|
-
"@deepseek-ai/schemastery": "3.18.5
|
|
84
|
+
"@deepseek-ai/schemastery": "3.18.5",
|
|
85
85
|
"@types/node": "^22.20.1",
|
|
86
86
|
"vitest": "^3.2.7",
|
|
87
87
|
"@deepseek-ai/dsh-working-directory": "0.2.1-rc.2",
|
|
88
|
-
"tsdown": "^0.
|
|
88
|
+
"tsdown": "^0.23.1",
|
|
89
89
|
"typescript": "^5.9.3"
|
|
90
90
|
},
|
|
91
91
|
"dependencies": {}
|