dsh-power-ticket-check 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,15 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ Licensed under the Apache License, Version 2.0 (the "License");
6
+ you may not use this file except in compliance with the License.
7
+ You may obtain a copy of the License at
8
+
9
+ http://www.apache.org/licenses/LICENSE-2.0
10
+
11
+ Unless required by applicable law or agreed to in writing, software
12
+ distributed under the License is distributed on an "AS IS" BASIS,
13
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ See the License for the specific language governing permissions and
15
+ limitations under the License.
package/README-es.md ADDED
@@ -0,0 +1,97 @@
1
+ # dsh-power-ticket-check
2
+
3
+ **Boundary:** this plugin checks one **电力工作票** for what a form can be held to — that the required
4
+ boxes are filled, that 签发 / 许可 / 终结 happened in an order that is physically possible, that 延期
5
+ moves the end forward, and that roles you require to be separate are held by different people. It does
6
+ **not** judge whether the safety measures written on the ticket were adequate, **does not** say which
7
+ kind of ticket a job needs, and **does not** verify that anyone's qualification is real.
8
+
9
+ > ### ⚠️ Three things this plugin refuses to do, and the effect tier that fixes its severities
10
+ >
11
+ > **1. It respects the standard's own effect tier.** GB 26860—2011's foreword says, verbatim,
12
+ > 「本标准的第5章和7.3.4为推荐性,其余为强制性」 — **the work-ticket regime sits in the *recommendatory*
13
+ > chapter 5.** So every rule resting on chapter 5 ships at `warn` or `info` and **nothing there can block a
14
+ > workflow**. `PT-006` (the five safety technical measures, clause 6.1.1) is the **only** `error`, because
15
+ > chapter 6 is mandatory. `PT-007` (the permit formalities, clause 5.5.1) is a `warn`; its note explains that
16
+ > an institution which wants those formalities to block can raise it by editing the rule pack, with no code
17
+ > change. A test asserts both directions: no chapter-5 rule is an `error`, and `PT-006` is the sole one.
18
+ >
19
+ > **2. It does not adopt three claims that have no basis in the standards.** After reading GB 26860—2011
20
+ > and GB 26859—2011 in full: there is **no** "第一种工作票应工作前一日送达" deadline anywhere; 5.3.12 and
21
+ > 5.4.10 say only 「延期应办理手续」 with **no ceiling on duration or count**; and the statutory name is
22
+ > **紧急抢修单** (5.2.4), not "事故应急抢修单". A test asserts the pack records all three.
23
+ >
24
+ > **3. It does not treat the ticket layout as mandatory.** 5.1.2 says the ticket "**可**包含" those items,
25
+ > and appendices A–D are marked **资料性附录** (informative) in the standard's contents. So `PT-001` ships
26
+ > with an **empty** field list for you to fill from your own form, and reports at `info`.
27
+ >
28
+ > Two more lists are yours: `PT-002`'s ticket kinds and `PT-005`'s exclusive role pairs. Both ship empty.
29
+ > The plugin never judges whether the safety measures written on a ticket were adequate, which ticket
30
+ > kind a job needs, or whether anyone's qualification is real — the standard sets out roles' **duties**
31
+ > (5.4.1–5.4.5) and **no qualification conditions**.
32
+
33
+ ## Compatibility
34
+
35
+ | Superficie | Estado |
36
+ |---|---|
37
+ | Harness | Rango de peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.2.0-0 <0.3.0` — verificado para aceptar tanto `0.2.0-rc.2` como `0.2.1-alpha.1`. **No se declara `engines.dsh`**: no tiene lector y no puede rechazar ningún host |
38
+ | Node | `^22.19.0 || >=24.0.0` |
39
+ | Plataformas | Todas (ESM puro; sin código nativo, sin red, sin llamada al modelo) |
40
+ | Modo de herramienta | Funciona en `native`, `ptc` y `both`; para un directorio completo use `ptc` |
41
+
42
+ ## What it does
43
+
44
+ La tabla de reglas, los campos y el comportamiento detallado están en [README.md](README.md#what-it-does) (versión principal en inglés). El plugin sólo enumera divergencias literales frente a las cláusulas citadas e indica en `skipped` cada comprobación que no pudo ejecutarse.
45
+
46
+ ## Install
47
+
48
+ ```sh
49
+ dsh plugin --profile <name> add dsh-power-ticket-check
50
+ dsh --profile <name> --dump-config | grep 'dsh-power-ticket-check'
51
+ ```
52
+
53
+ ## Configuration
54
+
55
+ Todos los parámetros ajustables viven en el esquema Schemastery de `src/config.ts`, por lo que se cambian desde `cordis.yml` sin tocar el código; los umbrales por regla están en el paquete de reglas bajo `rules/`.
56
+
57
+ | Clave | Tipo | Predeterminado | Descripción |
58
+ |---|---|---|---|
59
+ | `rulesFile` | string | `rules/power-ticket-check.yaml` | Ruta del paquete de reglas, relativa a la raíz del paquete |
60
+ | `disabledRules` | string[] | `[]` | Ids de reglas que se dejan de ejecutar; cada una aparece en `skipped` |
61
+ | `onlyRules` | string[] | `[]` | Ejecutar solo estas reglas; vacío ejecuta todas |
62
+ | `skipNotes` | string | `""` | Nota añadida a cada motivo de `skipped` |
63
+ | `timeoutMs` | number | `120000` | Presupuesto de tiempo de espera cooperativo de la herramienta |
64
+
65
+ ## Material format
66
+
67
+ Acepta JSON o YAML. El ejemplo completo de campos está en [README.md](README.md#material-format) (versión principal en inglés). Los campos son opcionales en la capa de lectura y los valida el motor, de modo que una exportación parcial produce hallazgos sobre lo que falta en lugar de un fallo.
68
+
69
+ ## Rule sources
70
+
71
+ Los datos de las reglas están separados del código: cada regla lleva documento, número, cláusula en la numeración propia de la fuente, extracto literal y URL de origen. El cargador impone que el extracto sea una cita real de al menos ocho caracteres y que una comprobación basada sólo en un principio general (`kind: derived-from-principle`, tope `warn`) o en una política local (`kind: institutional-configuration`, tope `info`) nunca se declare `error`.
72
+
73
+ Los límites verificados y las conclusiones deliberadamente **no** afirmadas están en [README.md](README.md#rule-sources) (versión principal en inglés) y en `rules/evidence/`.
74
+
75
+ ## Troubleshooting
76
+
77
+ - **El plugin se instala pero la herramienta no aparece**: compruebe que `main` resuelve a `lib/index.mjs` y que `pnpm run build` lo generó.
78
+ - **`dsh plugin add` rechaza el paquete**: la faixa de peers cubre `0.1.x` y `0.2.x`; fuera de ella, conceda una exención explícita con `dsh plugin --profile <name> allow-version <pkg@ver> --dsh-version <runtime> --accept-risk`.
79
+ - **Una regla no se ejecutó**: lea el arreglo `skipped`.
80
+ - **`check` informa `manifest-peers` como fallo**: es un problema conocido de `dsh-plugin-dev`; el runtime aplica la compatibilidad al instalar.
81
+ - **Los horarios parecen desplazados**: toda la aritmética es de hora local sobre las cadenas entregadas.
82
+
83
+ ## Development
84
+
85
+ ```sh
86
+ pnpm install
87
+ pnpm run typecheck
88
+ pnpm test
89
+ pnpm run build
90
+ node ../scripts/sync-shared.mjs dsh-power-ticket-check
91
+ ```
92
+
93
+ El último comando copia el kit compartido de `../_shared` a `src/shared/`; vuelva a ejecutarlo tras cada cambio compartido.
94
+
95
+ ## License
96
+
97
+ [Apache License 2.0](LICENSE) © 2026 dsh-power-ticket-check contributors.
package/README-hi.md ADDED
@@ -0,0 +1,97 @@
1
+ # dsh-power-ticket-check
2
+
3
+ **Boundary:** this plugin checks one **电力工作票** for what a form can be held to — that the required
4
+ boxes are filled, that 签发 / 许可 / 终结 happened in an order that is physically possible, that 延期
5
+ moves the end forward, and that roles you require to be separate are held by different people. It does
6
+ **not** judge whether the safety measures written on the ticket were adequate, **does not** say which
7
+ kind of ticket a job needs, and **does not** verify that anyone's qualification is real.
8
+
9
+ > ### ⚠️ Three things this plugin refuses to do, and the effect tier that fixes its severities
10
+ >
11
+ > **1. It respects the standard's own effect tier.** GB 26860—2011's foreword says, verbatim,
12
+ > 「本标准的第5章和7.3.4为推荐性,其余为强制性」 — **the work-ticket regime sits in the *recommendatory*
13
+ > chapter 5.** So every rule resting on chapter 5 ships at `warn` or `info` and **nothing there can block a
14
+ > workflow**. `PT-006` (the five safety technical measures, clause 6.1.1) is the **only** `error`, because
15
+ > chapter 6 is mandatory. `PT-007` (the permit formalities, clause 5.5.1) is a `warn`; its note explains that
16
+ > an institution which wants those formalities to block can raise it by editing the rule pack, with no code
17
+ > change. A test asserts both directions: no chapter-5 rule is an `error`, and `PT-006` is the sole one.
18
+ >
19
+ > **2. It does not adopt three claims that have no basis in the standards.** After reading GB 26860—2011
20
+ > and GB 26859—2011 in full: there is **no** "第一种工作票应工作前一日送达" deadline anywhere; 5.3.12 and
21
+ > 5.4.10 say only 「延期应办理手续」 with **no ceiling on duration or count**; and the statutory name is
22
+ > **紧急抢修单** (5.2.4), not "事故应急抢修单". A test asserts the pack records all three.
23
+ >
24
+ > **3. It does not treat the ticket layout as mandatory.** 5.1.2 says the ticket "**可**包含" those items,
25
+ > and appendices A–D are marked **资料性附录** (informative) in the standard's contents. So `PT-001` ships
26
+ > with an **empty** field list for you to fill from your own form, and reports at `info`.
27
+ >
28
+ > Two more lists are yours: `PT-002`'s ticket kinds and `PT-005`'s exclusive role pairs. Both ship empty.
29
+ > The plugin never judges whether the safety measures written on a ticket were adequate, which ticket
30
+ > kind a job needs, or whether anyone's qualification is real — the standard sets out roles' **duties**
31
+ > (5.4.1–5.4.5) and **no qualification conditions**.
32
+
33
+ ## Compatibility
34
+
35
+ | सतह | स्थिति |
36
+ |---|---|
37
+ | Harness | peer रेंज `>=0.1.2-rc.1 <0.2.0 \|\| >=0.2.0-0 <0.3.0` — `0.2.0-rc.2` और `0.2.1-alpha.1` दोनों को स्वीकार करने के लिए सत्यापित। **`engines.dsh` जानबूझकर घोषित नहीं**: इसका कोई पाठक नहीं और यह किसी होस्ट को अस्वीकार नहीं कर सकता |
38
+ | Node | `^22.19.0 || >=24.0.0` |
39
+ | प्लेटफ़ॉर्म | सभी (शुद्ध ESM; कोई नेटिव कोड नहीं, कोई नेटवर्क नहीं, कोई मॉडल कॉल नहीं) |
40
+ | टूल मोड | `native`, `ptc` और `both` में काम करता है; पूरे फ़ोल्डर के लिए `ptc` चुनें |
41
+
42
+ ## What it does
43
+
44
+ नियम-सूची, फ़ील्ड और विस्तृत व्यवहार [README.md](README.md#what-it-does) (अंग्रेज़ी मुख्य संस्करण) में हैं। यह प्लगइन केवल उद्धृत धाराओं के सामने शाब्दिक अंतर सूचीबद्ध करता है और हर न चल पाई जाँच को `skipped` में बताता है।
45
+
46
+ ## Install
47
+
48
+ ```sh
49
+ dsh plugin --profile <name> add dsh-power-ticket-check
50
+ dsh --profile <name> --dump-config | grep 'dsh-power-ticket-check'
51
+ ```
52
+
53
+ ## Configuration
54
+
55
+ सभी समायोज्य पैरामीटर `src/config.ts` की Schemastery स्कीमा में हैं, इसलिए कोड बदले बिना `cordis.yml` से बदले जा सकते हैं; प्रति-नियम सीमाएँ `rules/` के नियम-पैक में हैं।
56
+
57
+ | कुंजी | प्रकार | डिफ़ॉल्ट | विवरण |
58
+ |---|---|---|---|
59
+ | `rulesFile` | string | `rules/power-ticket-check.yaml` | नियम-पैक का पथ, पैकेज रूट के सापेक्ष |
60
+ | `disabledRules` | string[] | `[]` | बंद करने वाले नियम id; प्रत्येक `skipped` में दिखता है |
61
+ | `onlyRules` | string[] | `[]` | केवल ये नियम चलाएँ; खाली होने पर सभी नियम चलते हैं |
62
+ | `skipNotes` | string | `""` | हर `skipped` कारण के आगे जोड़ी जाने वाली टिप्पणी |
63
+ | `timeoutMs` | number | `120000` | उपकरण का सहकारी समय-सीमा बजट |
64
+
65
+ ## Material format
66
+
67
+ JSON या YAML स्वीकार्य है। पूरा फ़ील्ड उदाहरण [README.md](README.md#material-format) (अंग्रेज़ी मुख्य संस्करण) में है। पढ़ने की परत में फ़ील्ड वैकल्पिक हैं और जाँच इंजन उन्हें सत्यापित करता है, इसलिए आंशिक निर्यात पर क्रैश के बजाय "अनुपस्थित" श्रेणी के निष्कर्ष मिलते हैं।
68
+
69
+ ## Rule sources
70
+
71
+ नियम-डेटा कोड से अलग है: प्रत्येक नियम में दस्तावेज़, संख्या, स्रोत की अपनी क्रमांकन-प्रणाली के अनुसार धारा, शब्दशः उद्धरण और स्रोत URL होता है। लोडर लागू करता है कि उद्धरण कम से कम आठ अक्षरों का वास्तविक उद्धरण हो, और जिस जाँच का आधार केवल सामान्य सिद्धांत (`kind: derived-from-principle`, अधिकतम `warn`) या स्थानीय नीति (`kind: institutional-configuration`, अधिकतम `info`) हो, उसे कभी `error` घोषित न किया जाए।
72
+
73
+ सत्यापित सीमाएँ और जान-बूझकर **न** कहे गए निष्कर्ष [README.md](README.md#rule-sources) (अंग्रेज़ी मुख्य संस्करण) और `rules/evidence/` में हैं।
74
+
75
+ ## Troubleshooting
76
+
77
+ - **प्लगइन इंस्टॉल हो गया पर टूल दिखता नहीं**: जाँचें कि `main` `lib/index.mjs` पर जाता है और `pnpm run build` ने उसे बनाया है।
78
+ - **`dsh plugin add` असंगत बताकर मना करता है**: peer range `0.1.x` और `0.2.x` दोनों को कवर करती है; बाहर होने पर स्पष्ट छूट दें: `dsh plugin --profile <name> allow-version <pkg@ver> --dsh-version <runtime> --accept-risk`।
79
+ - **कोई नियम नहीं चला**: `skipped` सरणी देखें।
80
+ - **`check` में `manifest-peers` विफल दिखता है**: यह `dsh-plugin-dev` की ज्ञात अपस्ट्रीम समस्या है; रनटाइम इंस्टॉल के समय अनुकूलता लागू करता है।
81
+ - **समय खिसका हुआ लगता है**: सारी गणना दिए गए स्ट्रिंग पर वॉल-क्लॉक है।
82
+
83
+ ## Development
84
+
85
+ ```sh
86
+ pnpm install
87
+ pnpm run typecheck
88
+ pnpm test
89
+ pnpm run build
90
+ node ../scripts/sync-shared.mjs dsh-power-ticket-check
91
+ ```
92
+
93
+ अंतिम कमांड `../_shared` का साझा किट `src/shared/` में कॉपी करता है; हर साझा बदलाव के बाद इसे दोबारा चलाएँ।
94
+
95
+ ## License
96
+
97
+ [Apache License 2.0](LICENSE) © 2026 dsh-power-ticket-check contributors.
package/README-pt.md ADDED
@@ -0,0 +1,97 @@
1
+ # dsh-power-ticket-check
2
+
3
+ **Boundary:** this plugin checks one **电力工作票** for what a form can be held to — that the required
4
+ boxes are filled, that 签发 / 许可 / 终结 happened in an order that is physically possible, that 延期
5
+ moves the end forward, and that roles you require to be separate are held by different people. It does
6
+ **not** judge whether the safety measures written on the ticket were adequate, **does not** say which
7
+ kind of ticket a job needs, and **does not** verify that anyone's qualification is real.
8
+
9
+ > ### ⚠️ Three things this plugin refuses to do, and the effect tier that fixes its severities
10
+ >
11
+ > **1. It respects the standard's own effect tier.** GB 26860—2011's foreword says, verbatim,
12
+ > 「本标准的第5章和7.3.4为推荐性,其余为强制性」 — **the work-ticket regime sits in the *recommendatory*
13
+ > chapter 5.** So every rule resting on chapter 5 ships at `warn` or `info` and **nothing there can block a
14
+ > workflow**. `PT-006` (the five safety technical measures, clause 6.1.1) is the **only** `error`, because
15
+ > chapter 6 is mandatory. `PT-007` (the permit formalities, clause 5.5.1) is a `warn`; its note explains that
16
+ > an institution which wants those formalities to block can raise it by editing the rule pack, with no code
17
+ > change. A test asserts both directions: no chapter-5 rule is an `error`, and `PT-006` is the sole one.
18
+ >
19
+ > **2. It does not adopt three claims that have no basis in the standards.** After reading GB 26860—2011
20
+ > and GB 26859—2011 in full: there is **no** "第一种工作票应工作前一日送达" deadline anywhere; 5.3.12 and
21
+ > 5.4.10 say only 「延期应办理手续」 with **no ceiling on duration or count**; and the statutory name is
22
+ > **紧急抢修单** (5.2.4), not "事故应急抢修单". A test asserts the pack records all three.
23
+ >
24
+ > **3. It does not treat the ticket layout as mandatory.** 5.1.2 says the ticket "**可**包含" those items,
25
+ > and appendices A–D are marked **资料性附录** (informative) in the standard's contents. So `PT-001` ships
26
+ > with an **empty** field list for you to fill from your own form, and reports at `info`.
27
+ >
28
+ > Two more lists are yours: `PT-002`'s ticket kinds and `PT-005`'s exclusive role pairs. Both ship empty.
29
+ > The plugin never judges whether the safety measures written on a ticket were adequate, which ticket
30
+ > kind a job needs, or whether anyone's qualification is real — the standard sets out roles' **duties**
31
+ > (5.4.1–5.4.5) and **no qualification conditions**.
32
+
33
+ ## Compatibility
34
+
35
+ | Superfície | Estado |
36
+ |---|---|
37
+ | Harness | Faixa de peers `>=0.1.2-rc.1 <0.2.0 \|\| >=0.2.0-0 <0.3.0` — verificada para aceitar tanto `0.2.0-rc.2` quanto `0.2.1-alpha.1`. **`engines.dsh` não é declarado**: não tem leitor e não pode recusar nenhum host |
38
+ | Node | `^22.19.0 || >=24.0.0` |
39
+ | Plataformas | Todas (ESM puro; sem código nativo, sem rede, sem chamada ao modelo) |
40
+ | Modo de ferramenta | Funciona em `native`, `ptc` e `both`; para um diretório inteiro use `ptc` |
41
+
42
+ ## What it does
43
+
44
+ A tabela de regras, os campos e o comportamento detalhado estão em [README.md](README.md#what-it-does) (versão principal em inglês). O plugin apenas lista divergências literais frente às cláusulas citadas e indica em `skipped` cada verificação que não pôde ser executada.
45
+
46
+ ## Install
47
+
48
+ ```sh
49
+ dsh plugin --profile <name> add dsh-power-ticket-check
50
+ dsh --profile <name> --dump-config | grep 'dsh-power-ticket-check'
51
+ ```
52
+
53
+ ## Configuration
54
+
55
+ Todos os parâmetros ajustáveis ficam no esquema Schemastery de `src/config.ts`, portanto mudam pelo `cordis.yml` sem editar código; os limites por regra ficam no pacote de regras sob `rules/`.
56
+
57
+ | Chave | Tipo | Padrão | Descrição |
58
+ |---|---|---|---|
59
+ | `rulesFile` | string | `rules/power-ticket-check.yaml` | Caminho do pacote de regras, relativo à raiz do pacote |
60
+ | `disabledRules` | string[] | `[]` | Ids de regras a desativar; cada uma aparece em `skipped` |
61
+ | `onlyRules` | string[] | `[]` | Executar apenas estas regras; vazio executa todas |
62
+ | `skipNotes` | string | `""` | Nota acrescentada a cada motivo de `skipped` |
63
+ | `timeoutMs` | number | `120000` | Orçamento de tempo limite cooperativo da ferramenta |
64
+
65
+ ## Material format
66
+
67
+ Aceita JSON ou YAML. O exemplo completo de campos está em [README.md](README.md#material-format) (versão principal em inglês). Os campos são opcionais na camada de leitura e validados pelo motor, de modo que uma exportação parcial gera achados sobre o que falta em vez de falhar.
68
+
69
+ ## Rule sources
70
+
71
+ Os dados das regras ficam separados do código: cada regra traz documento, número, cláusula na numeração própria da fonte, trecho literal e URL de origem. O carregador impõe que o trecho seja citação real de pelo menos oito caracteres e que uma verificação baseada apenas em princípio geral (`kind: derived-from-principle`, teto `warn`) ou em política local (`kind: institutional-configuration`, teto `info`) nunca seja declarada `error`.
72
+
73
+ Os limites verificados e as conclusões deliberadamente **não** afirmadas estão em [README.md](README.md#rule-sources) (versão principal em inglês) e em `rules/evidence/`.
74
+
75
+ ## Troubleshooting
76
+
77
+ - **O plugin instala mas a ferramenta não aparece**: confirme que `main` resolve para `lib/index.mjs` e que `pnpm run build` o gerou.
78
+ - **`dsh plugin add` recusa o pacote**: a faixa de peers cobre `0.1.x` e `0.2.x`; fora dela, conceda isenção explícita com `dsh plugin --profile <name> allow-version <pkg@ver> --dsh-version <runtime> --accept-risk`.
79
+ - **Uma regra não executou**: leia o arranjo `skipped`.
80
+ - **`check` informa `manifest-peers` como falha**: problema conhecido do `dsh-plugin-dev`; o runtime aplica a compatibilidade na instalação.
81
+ - **Os horários parecem deslocados**: toda a aritmética é de hora local sobre as cadeias fornecidas.
82
+
83
+ ## Development
84
+
85
+ ```sh
86
+ pnpm install
87
+ pnpm run typecheck
88
+ pnpm test
89
+ pnpm run build
90
+ node ../scripts/sync-shared.mjs dsh-power-ticket-check
91
+ ```
92
+
93
+ O último comando copia o kit compartilhado de `../_shared` para `src/shared/`; execute-o novamente após cada alteração compartilhada.
94
+
95
+ ## License
96
+
97
+ [Apache License 2.0](LICENSE) © 2026 dsh-power-ticket-check contributors.
package/README-zh.md ADDED
@@ -0,0 +1,97 @@
1
+ # dsh-power-ticket-check
2
+
3
+ **Boundary:** this plugin checks one **电力工作票** for what a form can be held to — that the required
4
+ boxes are filled, that 签发 / 许可 / 终结 happened in an order that is physically possible, that 延期
5
+ moves the end forward, and that roles you require to be separate are held by different people. It does
6
+ **not** judge whether the safety measures written on the ticket were adequate, **does not** say which
7
+ kind of ticket a job needs, and **does not** verify that anyone's qualification is real.
8
+
9
+ > ### ⚠️ Three things this plugin refuses to do, and the effect tier that fixes its severities
10
+ >
11
+ > **1. It respects the standard's own effect tier.** GB 26860—2011's foreword says, verbatim,
12
+ > 「本标准的第5章和7.3.4为推荐性,其余为强制性」 — **the work-ticket regime sits in the *recommendatory*
13
+ > chapter 5.** So every rule resting on chapter 5 ships at `warn` or `info` and **nothing there can block a
14
+ > workflow**. `PT-006` (the five safety technical measures, clause 6.1.1) is the **only** `error`, because
15
+ > chapter 6 is mandatory. `PT-007` (the permit formalities, clause 5.5.1) is a `warn`; its note explains that
16
+ > an institution which wants those formalities to block can raise it by editing the rule pack, with no code
17
+ > change. A test asserts both directions: no chapter-5 rule is an `error`, and `PT-006` is the sole one.
18
+ >
19
+ > **2. It does not adopt three claims that have no basis in the standards.** After reading GB 26860—2011
20
+ > and GB 26859—2011 in full: there is **no** "第一种工作票应工作前一日送达" deadline anywhere; 5.3.12 and
21
+ > 5.4.10 say only 「延期应办理手续」 with **no ceiling on duration or count**; and the statutory name is
22
+ > **紧急抢修单** (5.2.4), not "事故应急抢修单". A test asserts the pack records all three.
23
+ >
24
+ > **3. It does not treat the ticket layout as mandatory.** 5.1.2 says the ticket "**可**包含" those items,
25
+ > and appendices A–D are marked **资料性附录** (informative) in the standard's contents. So `PT-001` ships
26
+ > with an **empty** field list for you to fill from your own form, and reports at `info`.
27
+ >
28
+ > Two more lists are yours: `PT-002`'s ticket kinds and `PT-005`'s exclusive role pairs. Both ship empty.
29
+ > The plugin never judges whether the safety measures written on a ticket were adequate, which ticket
30
+ > kind a job needs, or whether anyone's qualification is real — the standard sets out roles' **duties**
31
+ > (5.4.1–5.4.5) and **no qualification conditions**.
32
+
33
+ ## Compatibility
34
+
35
+ | 项目 | 状态 |
36
+ |---|---|
37
+ | Harness | 对等版本范围 `>=0.1.2-rc.1 <0.2.0 \|\| >=0.2.0-0 <0.3.0` —— 已实测同时接受 `0.2.0-rc.2` 与 `0.2.1-alpha.1`。**刻意不声明 `engines.dsh`**:它没有任何读取者,也无法拒装任何宿主 |
38
+ | Node | `^22.19.0 || >=24.0.0` |
39
+ | 平台 | 全平台(纯 ESM;无原生代码、无联网、不调用模型) |
40
+ | 工具模式 | `native` / `ptc` / `both` 均可;批量校验整个目录时建议 `ptc`,schema 成本只付一次 |
41
+
42
+ ## What it does
43
+
44
+ 规则表、字段说明与行为细节见 [README.md](README.md#what-it-does)(英文主版本)。本插件只列出材料与所引条款之间的字面差异,并对无法执行的检查在 `skipped` 中逐项说明。
45
+
46
+ ## Install
47
+
48
+ ```sh
49
+ dsh plugin --profile <name> add dsh-power-ticket-check
50
+ dsh --profile <name> --dump-config | grep 'dsh-power-ticket-check'
51
+ ```
52
+
53
+ ## Configuration
54
+
55
+ 全部可调参数都在 `src/config.ts` 的 Schemastery schema 中,只改 `cordis.yml` 即可生效,无需改代码;逐条阈值在 `rules/` 下的规则库文件里。
56
+
57
+ | 键 | 类型 | 默认值 | 说明 |
58
+ |---|---|---|---|
59
+ | `rulesFile` | string | `rules/power-ticket-check.yaml` | 规则库文件路径,相对插件包根目录 |
60
+ | `disabledRules` | string[] | `[]` | 要停用的规则 id 列表;每条都会出现在 `skipped` 中 |
61
+ | `onlyRules` | string[] | `[]` | 只执行这些规则 id;留空表示执行全部规则 |
62
+ | `skipNotes` | string | `""` | 附加到每条 `skipped` 说明后的备注 |
63
+ | `timeoutMs` | number | `120000` | 工具协作式超时预算(毫秒) |
64
+
65
+ ## Material format
66
+
67
+ 支持 JSON 与 YAML。完整字段示例见 [README.md](README.md#material-format)(英文主版本)。字段在读取层是可选的,由检查引擎校验,因此部分导出的材料会产生"缺项"类差异,而不是让程序崩溃。
68
+
69
+ ## Rule sources
70
+
71
+ 规则数据与代码分离,每条规则都带文件名、文号、按原文自身编号体系的条款号、逐字摘录与来源地址。加载期强制:摘录必须是真实引文且不少于八个字符;依据仅为原则性条款(`kind: derived-from-principle`,严重级上限 `warn`)或本机构配置(`kind: institutional-configuration`,上限 `info`)的检查不得标为 `error`。夸大依据的规则库会在加载期失败,而不会产出一份看起来很有底气的报告。
72
+
73
+ 核验中确认的边界与"刻意没有作出的结论"见 [README.md](README.md#rule-sources)(英文主版本)与随包的 `rules/evidence/` 目录。
74
+
75
+ ## Troubleshooting
76
+
77
+ - **插件装上了但工具不出现**:确认 `main` 指向 `lib/index.mjs` 且 `pnpm run build` 已生成该文件;`main` 写错会让加载器静默跳过该条目。
78
+ - **`dsh plugin add` 报版本不兼容**:peer 范围覆盖 `0.1.x` 与 `0.2.x`;若运行时在其之外,可显式豁免:`dsh plugin --profile <name> allow-version <包名@版本> --dsh-version <runtime> --accept-risk`
79
+ - **某条规则没有执行**:查看 `skipped` 数组,其中写明了规则 id 与原因。
80
+ - **`check` 报 `manifest-peers` 失败**:静态检查器比对的是一份早于 0.2 世代的硬编码 peer 范围;安装期的 peer 校验以运行时为准。这是 `dsh-plugin-dev` 的已知上游问题。
81
+ - **时间看起来偏移**:全部计算都是对输入字符串做墙上时钟运算,不做时区换算。
82
+
83
+ ## Development
84
+
85
+ ```sh
86
+ pnpm install
87
+ pnpm run typecheck
88
+ pnpm test
89
+ pnpm run build
90
+ node ../scripts/sync-shared.mjs dsh-power-ticket-check
91
+ ```
92
+
93
+ 第 4 项把 `../_shared` 的共享件同步进 `src/shared/`;每次改动共享件后都要重跑。
94
+
95
+ ## License
96
+
97
+ [Apache License 2.0](LICENSE) © 2026 dsh-power-ticket-check contributors.
package/README.md CHANGED
@@ -1,3 +1,172 @@
1
- # Temporary Holding Version
1
+ # dsh-power-ticket-check
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ **Boundary:** this plugin checks one **电力工作票** for what a form can be held to — that the required
4
+ boxes are filled, that 签发 / 许可 / 终结 happened in an order that is physically possible, that 延期
5
+ moves the end forward, and that roles you require to be separate are held by different people. It does
6
+ **not** judge whether the safety measures written on the ticket were adequate, **does not** say which
7
+ kind of ticket a job needs, and **does not** verify that anyone's qualification is real.
8
+
9
+ > ### ⚠️ Three things this plugin refuses to do, and the effect tier that fixes its severities
10
+ >
11
+ > **1. It respects the standard's own effect tier.** GB 26860—2011's foreword says, verbatim,
12
+ > 「本标准的第5章和7.3.4为推荐性,其余为强制性」 — **the work-ticket regime sits in the *recommendatory*
13
+ > chapter 5.** So every rule resting on chapter 5 ships at `warn` or `info` and **nothing there can block a
14
+ > workflow**. `PT-006` (the five safety technical measures, clause 6.1.1) is the **only** `error`, because
15
+ > chapter 6 is mandatory. `PT-007` (the permit formalities, clause 5.5.1) is a `warn`; its note explains that
16
+ > an institution which wants those formalities to block can raise it by editing the rule pack, with no code
17
+ > change. A test asserts both directions: no chapter-5 rule is an `error`, and `PT-006` is the sole one.
18
+ >
19
+ > **2. It does not adopt three claims that have no basis in the standards.** After reading GB 26860—2011
20
+ > and GB 26859—2011 in full: there is **no** "第一种工作票应工作前一日送达" deadline anywhere; 5.3.12 and
21
+ > 5.4.10 say only 「延期应办理手续」 with **no ceiling on duration or count**; and the statutory name is
22
+ > **紧急抢修单** (5.2.4), not "事故应急抢修单". A test asserts the pack records all three.
23
+ >
24
+ > **3. It does not treat the ticket layout as mandatory.** 5.1.2 says the ticket "**可**包含" those items,
25
+ > and appendices A–D are marked **资料性附录** (informative) in the standard's contents. So `PT-001` ships
26
+ > with an **empty** field list for you to fill from your own form, and reports at `info`.
27
+ >
28
+ > Two more lists are yours: `PT-002`'s ticket kinds and `PT-005`'s exclusive role pairs. Both ship empty.
29
+ > The plugin never judges whether the safety measures written on a ticket were adequate, which ticket
30
+ > kind a job needs, or whether anyone's qualification is real — the standard sets out roles' **duties**
31
+ > (5.4.1–5.4.5) and **no qualification conditions**.
32
+
33
+ ## Compatibility
34
+
35
+ | Surface | Status |
36
+ |---|---|
37
+ | Harness | Peer range `>=0.1.2-rc.1 <0.2.0 \|\| >=0.2.0-0 <0.3.0` — verified to accept both `0.2.0-rc.2` and `0.2.1-alpha.1`. `engines.dsh` is deliberately not declared: it has no reader and cannot reject a host |
38
+ | Node | `^22.19.0 || >=24.0.0` |
39
+ | Platforms | All (plain ESM; no native code, no network, no model call) |
40
+ | Tool mode | Works in `native`, `ptc` and `both`; for a month of tickets use `ptc` |
41
+
42
+ ## What it does
43
+
44
+ Registers the `power_ticket_check` tool. It reads one ticket as a flat mapping of the ticket's own column
45
+ names to their values, applies a versioned rule pack, and returns a report.
46
+
47
+ | Rule | Check | Severity | Basis kind |
48
+ |---|---|---|---|
49
+ | `PT-001` | every configured column is filled (off by default, informative layout) | info | local |
50
+ | `PT-002` | the ticket kind is one you use, and matches the work's nature | warn | direct |
51
+ | `PT-003` | 签发 → 许可 → 终结 is a possible order; optional interval and duration limits | warn | principle |
52
+ | `PT-004` | 延期 moves the end forward and follows the permit | warn | direct |
53
+ | `PT-005` | roles you require to be separate are held by different people (off by default) | warn | direct |
54
+ | `PT-006` | the five safety technical measures are written on the ticket | error | direct |
55
+ | `PT-007` | the permit formalities (site re-check, live parts pointed out, both signatures) | warn | direct |
56
+
57
+ ## Install
58
+
59
+ ```sh
60
+ dsh plugin --profile <name> add dsh-power-ticket-check
61
+ dsh --profile <name> --dump-config | grep 'dsh-power-ticket-check'
62
+ ```
63
+
64
+ ## Configuration
65
+
66
+ | Key | Type | Default | Description |
67
+ |---|---|---|---|
68
+ | `rulesFile` | string | `rules/power-ticket-check.yaml` | Rule-pack path, relative to the package root |
69
+ | `disabledRules` | string[] | `[]` | Rule ids to stop running; each appears in `skipped` |
70
+ | `onlyRules` | string[] | `[]` | Run only these rule ids; empty runs every rule |
71
+ | `skipNotes` | string | `""` | Note appended to every `skipped` reason |
72
+ | `timeoutMs` | number | `120000` | Cooperative tool timeout budget |
73
+
74
+ Rule-level parameters worth knowing:
75
+
76
+ - `PT-001` `requiredFields` — the columns that must be filled, using the same names the material uses.
77
+ - `PT-002` `ticketKinds` — your ticket kinds, e.g. `[第一种工作票, 第二种工作票, 带电作业票]`. It can
78
+ also be passed per call.
79
+ - `PT-003` `minMinutesBeforeWork` — the least interval you require between 签发 and 许可. `0` disables
80
+ the interval comparison.
81
+ - `PT-003` `maxDurationHours` — the longest a single ticket may run. `0` disables the duration check.
82
+ - `PT-005` `exclusiveRolePairs` — pairs that must not be the same person, written
83
+ `['工作票签发人|工作许可人']`.
84
+
85
+ ## Material format
86
+
87
+ The tool accepts JSON or YAML. One ticket is one flat mapping:
88
+
89
+ ```yaml
90
+ 工作票编号: DL-2026-0001
91
+ 工作票种类: 第一种工作票
92
+ 工作地点: 35kV 某某变电站
93
+ 工作任务: 10kV 某某线 01 号杆更换隔离开关
94
+ 计划开始时间: 2026-03-15 08:00
95
+ 计划结束时间: 2026-03-15 18:00
96
+ 签发时间: 2026-03-14 16:00
97
+ 许可时间: 2026-03-15 08:30
98
+ 终结时间: 2026-03-15 17:00
99
+ 工作票签发人: 张工
100
+ 工作负责人: 李工
101
+ 工作许可人: 王工
102
+ ```
103
+
104
+ Times are accepted as `2026-03-15 08:30` or as a bare date, in which case midnight is assumed and the
105
+ report says so when that matters. Role columns may carry a suffix — `工作负责人签名` is recognised as the
106
+ 工作负责人 role — so a form exported with its signature boxes still maps cleanly.
107
+
108
+ The chronology check compares both ends on **one continuous timeline**, so a permit that falls on an
109
+ earlier day is reported as an earlier instant, not as a small negative same-day interval.
110
+
111
+ ## Rule sources
112
+
113
+ Rule data lives in `rules/power-ticket-check.yaml`. Every rule carries a document, a document number, a
114
+ clause in the source's own numbering, a verbatim excerpt and the URL the excerpt was read from. The
115
+ loader enforces that an excerpt is a real quotation of at least eight characters, and that a check
116
+ resting on a general principle or a local policy can never be declared `error`.
117
+
118
+ The clauses quoted come from **GB 26860—2011《电力安全工作规程 发电厂和变电站电气部分》** — 5.1.2, 5.2.1–5.2.4,
119
+ 5.3.7, 5.3.12, 5.5.1, 5.7.5 and 6.1.1 — with the standard's foreword providing the effect tier that
120
+ fixes each rule's severity. The clause text was obtained from a full-text scan transcription and
121
+ cross-checked verbatim against a second independent site.
122
+
123
+ Current standards in this family, all verified against the standards platform:
124
+
125
+ | Standard | In force | Note |
126
+ |---|---|---|
127
+ | GB 26860—2011 发电厂和变电站电气部分 | 2012-06-01 | mandatory, except chapters 5 and 7.3.4; a revision is "being approved" |
128
+ | GB 26859—2011 电力线路部分 | 2012-06-01 | the line-side counterpart |
129
+ | DL/T 408—2023 发电厂和变电站电气部分 | 2024-06-28 | replaces **DL 408—1991**, runs **alongside** GB 26860 — not a replacement for it |
130
+ | DL/T 409—2023 电力线路部分 | 2024-06-28 | |
131
+ | DL/T 560—2022 高压试验室部分 | 2022-11-13 | replaces DL 560—1995 |
132
+
133
+ **DL/T 408—2023's clause text could not be obtained, so this pack cites none of it.** Its identity and
134
+ chapter structure were verified, and DL/T 408—2023 renames 紧急抢修单 to 故障紧急抢修单 and adds 带电作业票 and
135
+ 双签发 — which is why `PT-002` accepts both names rather than picking one.
136
+
137
+ The full clause-verification report, including the sources that were checked and rejected, is in
138
+ `rules/evidence/clause-verification.md`.
139
+
140
+ ## Troubleshooting
141
+
142
+ - **`PT-001`, `PT-002` or `PT-005` report themselves as skipped.** Their lists are empty. Fill in the
143
+ ones your enterprise's rules require.
144
+ - **`PT-003` reports nothing about order.** 签发时间 and 许可时间 are not both present; the rule says so
145
+ in `skipped`. If a time is present but unreadable, the rule reports *that* instead of skipping, so an
146
+ unparseable cell never hides the check.
147
+ - **`PT-003` fires on a duration that is normal for us.** `maxDurationHours` is `0` by default; if you set
148
+ it, it applies to every ticket the tool sees. Leave it at `0` if your tickets legitimately run long.
149
+ - **`PT-005` misses a case I know about.** Add the role pair. The plugin compares only the pairs you list,
150
+ because which roles must be separate depends on the ticket kind and your implementing rules.
151
+ - **The plugin installs but the tool never appears.** Check that `main` resolves to `lib/index.mjs` and
152
+ that `pnpm run build` produced it; a wrong `main` makes the loader skip the entry silently.
153
+ - **`dsh plugin add` refuses the package as incompatible.** The peer range covers `0.1.x` and `0.2.x`;
154
+ if your runtime sits outside it, grant an explicit exemption:
155
+ `dsh plugin --profile <name> allow-version dsh-power-ticket-check@0.1.0 --dsh-version <runtime> --accept-risk`
156
+ - **`check` reports `manifest-peers` as failed.** The static checker compares against a hard-coded peer
157
+ range that predates the 0.2 line. The runtime enforces peer compatibility at install time, so the
158
+ declared range is the correct one; this is a known upstream issue in `dsh-plugin-dev`.
159
+
160
+ ## Development
161
+
162
+ ```sh
163
+ pnpm install
164
+ pnpm run typecheck # tsc --noEmit
165
+ pnpm test # vitest, paired fixtures per rule
166
+ pnpm run build # tsdown -> lib/index.mjs + lib/index.d.mts
167
+ node ../scripts/sync-shared.mjs dsh-power-ticket-check # refresh src/shared from ../_shared
168
+ ```
169
+
170
+ ## License
171
+
172
+ [Apache License 2.0](LICENSE) © 2026 dsh-power-ticket-check contributors.
@@ -0,0 +1,8 @@
1
+ # dsh-power-ticket-check bundle layer: register this plugin as a bundle row.
2
+ # This file is the `dsh.bundle.patch` layer (see package.json#dsh.bundle.patch).
3
+ # Layer semantics: a YAML array of row verbs; `insert` adds plugin rows to the
4
+ # composed config. A row's `id` must be unique within the layer stack; `name`
5
+ # resolves the plugin module through the installed package (package.json#main).
6
+ - insert:
7
+ - id: dsh-power-ticket-check
8
+ name: dsh-power-ticket-check
package/icon.svg ADDED
@@ -0,0 +1,6 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" role="img" aria-label="Power work ticket check">
2
+ <rect width="64" height="64" rx="12" fill="#0f766e"/>
3
+ <path d="M16 20h32M16 32h22M16 44h26" stroke="#ffffff" stroke-width="4" stroke-linecap="round"/>
4
+ <circle cx="50" cy="46" r="9" fill="#ffffff"/>
5
+ <path d="M46 46l3 3 5-6" stroke="#0f766e" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" fill="none"/>
6
+ </svg>