psyclaw 0.28.0 → 0.28.2
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/README.md +5 -5
- package/agents/recommended/catalog.json +99 -0
- package/dist/apps/panel/index.html +5 -5
- package/dist/src/adapters/pi/extension.js +164 -18
- package/dist/src/adapters/pi/extension.js.map +1 -1
- package/dist/src/adapters/pi/rpc.d.ts +2 -0
- package/dist/src/adapters/pi/rpc.js +9 -2
- package/dist/src/adapters/pi/rpc.js.map +1 -1
- package/dist/src/agents/recommended-personas.d.ts +42 -0
- package/dist/src/agents/recommended-personas.js +135 -0
- package/dist/src/agents/recommended-personas.js.map +1 -0
- package/dist/src/ars/mode-editor.d.ts +20 -0
- package/dist/src/ars/mode-editor.js +57 -0
- package/dist/src/ars/mode-editor.js.map +1 -0
- package/dist/src/ars/profile.d.ts +4 -1
- package/dist/src/ars/profile.js +23 -6
- package/dist/src/ars/profile.js.map +1 -1
- package/dist/src/cli.js +6 -3
- package/dist/src/cli.js.map +1 -1
- package/dist/src/creation/contracts.d.ts +3 -0
- package/dist/src/creation/service.js +17 -5
- package/dist/src/creation/service.js.map +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/orchestration/bundled-personas.d.ts +16 -0
- package/dist/src/orchestration/bundled-personas.js +101 -0
- package/dist/src/orchestration/bundled-personas.js.map +1 -0
- package/dist/src/orchestration/effects.d.ts +8 -0
- package/dist/src/orchestration/effects.js +39 -0
- package/dist/src/orchestration/effects.js.map +1 -0
- package/dist/src/orchestration/personas.d.ts +2 -1
- package/dist/src/orchestration/personas.js +20 -7
- package/dist/src/orchestration/personas.js.map +1 -1
- package/dist/src/orchestration/pi-executor.d.ts +9 -5
- package/dist/src/orchestration/pi-executor.js +55 -22
- package/dist/src/orchestration/pi-executor.js.map +1 -1
- package/dist/src/orchestration/research-agents.d.ts +3 -7
- package/dist/src/orchestration/research-agents.js +5 -69
- package/dist/src/orchestration/research-agents.js.map +1 -1
- package/dist/src/panel/server.js +6 -0
- package/dist/src/panel/server.js.map +1 -1
- package/dist/src/style/cli-ui.d.ts +14 -0
- package/dist/src/style/cli-ui.js +45 -0
- package/dist/src/style/cli-ui.js.map +1 -1
- package/dist/src/tui/skill-manager.js +1 -1
- package/dist/src/tui/skill-manager.js.map +1 -1
- package/dist/src/updates/update.js +9 -3
- package/dist/src/updates/update.js.map +1 -1
- package/package.json +11 -3
- package/vendor/academic-paper-skills/LICENSE +21 -0
- package/vendor/academic-paper-skills/NOTICE.md +7 -0
- package/vendor/academic-paper-skills/PSYCLAW_SOURCE.json +14 -0
- package/vendor/academic-paper-skills/academic-paper-composer/SKILL.md +840 -0
- package/vendor/academic-paper-skills/academic-paper-composer/references/section_guides.md +675 -0
- package/vendor/academic-paper-skills/academic-paper-composer/references/writing_standards.md +629 -0
- package/vendor/academic-paper-skills/academic-paper-composer/scripts/chapter_quality_check.py +470 -0
- package/vendor/academic-paper-skills/academic-paper-composer/scripts/final_evaluation.py +550 -0
- package/vendor/academic-paper-skills/academic-paper-strategist/SKILL.md +670 -0
- package/vendor/academic-paper-skills/academic-paper-strategist/references/quality_standards.md +336 -0
- package/vendor/academic-paper-skills/academic-paper-strategist/references/search_strategy.md +459 -0
- package/vendor/academic-paper-skills/academic-paper-strategist/scripts/evaluate_samples.py +300 -0
- package/vendor/academic-paper-skills/academic-paper-strategist/scripts/gap_analysis.py +399 -0
- package/vendor/ars/pi/wrapper.js +9 -0
- package/vendor/nature-skills/LICENSE +201 -0
- package/vendor/nature-skills/NOTICE.md +7 -0
- package/vendor/nature-skills/PSYCLAW_SOURCE.json +19 -0
- package/vendor/nature-skills/skills/nature-figure/README.md +107 -0
- package/vendor/nature-skills/skills/nature-figure/README_EN.md +107 -0
- package/vendor/nature-skills/skills/nature-figure/SKILL.md +154 -0
- package/vendor/nature-skills/skills/nature-figure/agents/openai.yaml +4 -0
- package/vendor/nature-skills/skills/nature-figure/evals/evals.json +325 -0
- package/vendor/nature-skills/skills/nature-figure/manifest.yaml +103 -0
- package/vendor/nature-skills/skills/nature-figure/references/ai-graphical-abstract-workflow.md +129 -0
- package/vendor/nature-skills/skills/nature-figure/references/api.md +576 -0
- package/vendor/nature-skills/skills/nature-figure/references/asset-adaptation.md +72 -0
- package/vendor/nature-skills/skills/nature-figure/references/backend-selection.md +118 -0
- package/vendor/nature-skills/skills/nature-figure/references/chart-types.md +348 -0
- package/vendor/nature-skills/skills/nature-figure/references/common-patterns.md +371 -0
- package/vendor/nature-skills/skills/nature-figure/references/demos.md +58 -0
- package/vendor/nature-skills/skills/nature-figure/references/design-theory.md +467 -0
- package/vendor/nature-skills/skills/nature-figure/references/figure-contract.md +122 -0
- package/vendor/nature-skills/skills/nature-figure/references/figure-legend-conventions.md +90 -0
- package/vendor/nature-skills/skills/nature-figure/references/multipanel-evidence-architecture.md +268 -0
- package/vendor/nature-skills/skills/nature-figure/references/nature-2026-observations.md +124 -0
- package/vendor/nature-skills/skills/nature-figure/references/nature-article-requirements.md +149 -0
- package/vendor/nature-skills/skills/nature-figure/references/openrouter-image-generation.md +141 -0
- package/vendor/nature-skills/skills/nature-figure/references/qa-contract.md +344 -0
- package/vendor/nature-skills/skills/nature-figure/references/r-template-index.md +66 -0
- package/vendor/nature-skills/skills/nature-figure/references/r-workflow.md +234 -0
- package/vendor/nature-skills/skills/nature-figure/references/template-catalog.md +33 -0
- package/vendor/nature-skills/skills/nature-figure/references/tutorials.md +260 -0
- package/vendor/nature-skills/skills/nature-figure/requirements.txt +1 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/audit_figure_collisions.py +742 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/audit_panel_alignment.py +933 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/audit_pdf_text.py +152 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/figure_safety.py +50 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/generate_openrouter_schematic.py +260 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/nature_figure_backend.py +93 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/panel_alignment.R +188 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/plot_templates.py +604 -0
- package/vendor/nature-skills/skills/nature-figure/scripts/validate_figure.py +835 -0
- package/vendor/nature-skills/skills/nature-figure/static/core/contract.md +55 -0
- package/vendor/nature-skills/skills/nature-figure/static/core/stance.md +41 -0
- package/vendor/nature-skills/skills/nature-figure/static/fragments/backend/python.md +56 -0
- package/vendor/nature-skills/skills/nature-figure/static/fragments/backend/r.md +63 -0
- package/vendor/nature-skills/skills/nature-figure/tests/test_figure_safety.py +209 -0
- package/vendor/nature-skills/skills/nature-polishing/README.md +58 -0
- package/vendor/nature-skills/skills/nature-polishing/README_EN.md +58 -0
- package/vendor/nature-skills/skills/nature-polishing/SKILL.md +111 -0
- package/vendor/nature-skills/skills/nature-polishing/agents/openai.yaml +4 -0
- package/vendor/nature-skills/skills/nature-polishing/manifest.yaml +101 -0
- package/vendor/nature-skills/skills/nature-polishing/references/latex-layout.md +211 -0
- package/vendor/nature-skills/skills/nature-polishing/references/nat-comms-2025-diction.md +73 -0
- package/vendor/nature-skills/skills/nature-polishing/references/phrasebank-playbook.md +175 -0
- package/vendor/nature-skills/skills/nature-polishing/references/published-article-patterns.md +126 -0
- package/vendor/nature-skills/skills/nature-polishing/references/section-moves.md +252 -0
- package/vendor/nature-skills/skills/nature-polishing/references/style-guardrails.md +94 -0
- package/vendor/nature-skills/skills/nature-polishing/references/writing-strategy.md +160 -0
- package/vendor/nature-skills/skills/nature-polishing/static/core/failure-modes.md +29 -0
- package/vendor/nature-skills/skills/nature-polishing/static/core/output-format.md +21 -0
- package/vendor/nature-skills/skills/nature-polishing/static/core/stance.md +26 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/journal/generic.md +17 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/journal/nat-comms.md +38 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/journal/nat-mach-intell.md +102 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/journal/nature.md +19 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/language/en.md +19 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/language/zh-to-en.md +19 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/paper_type/algorithmic.md +18 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/paper_type/hypothesis.md +17 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/paper_type/methods.md +35 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/paper_type/research.md +29 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/paper_type/review.md +17 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/abstract.md +26 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/conclusion.md +15 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/discussion.md +48 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/intro.md +33 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/methods.md +26 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/results.md +61 -0
- package/vendor/nature-skills/skills/nature-polishing/static/fragments/section/title.md +17 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/README.md +44 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/README_EN.md +44 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/SKILL.md +196 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/agents/openai.yaml +4 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/manifest.yaml +19 -0
- package/vendor/nature-skills/skills/nature-ref-verifier/references/common-patterns.md +96 -0
- package/vendor/nature-skills/skills/nature-shared/README.md +43 -0
- package/vendor/nature-skills/skills/nature-shared/README_EN.md +43 -0
- package/vendor/nature-skills/skills/nature-shared/SKILL.md +33 -0
- package/vendor/nature-skills/skills/nature-shared/agents/openai.yaml +6 -0
- package/vendor/nature-skills/skills/nature-shared/core/consistency-sweep.md +122 -0
- package/vendor/nature-skills/skills/nature-shared/core/discussion-argument-language.md +192 -0
- package/vendor/nature-skills/skills/nature-shared/core/ethics.md +88 -0
- package/vendor/nature-skills/skills/nature-shared/core/main-text-discipline.md +179 -0
- package/vendor/nature-skills/skills/nature-shared/core/nature-abstract.md +171 -0
- package/vendor/nature-skills/skills/nature-shared/core/nature-introduction.md +164 -0
- package/vendor/nature-skills/skills/nature-shared/core/nature-results-discussion.md +215 -0
- package/vendor/nature-skills/skills/nature-shared/core/paper-type-taxonomy.md +41 -0
- package/vendor/nature-skills/skills/nature-shared/core/reader-workflow.md +21 -0
- package/vendor/nature-skills/skills/nature-shared/core/research-compliance.md +192 -0
- package/vendor/nature-skills/skills/nature-shared/core/terminology-ledger.md +58 -0
- package/vendor/nature-skills/skills/nature-shared/journal-formats/nat-comms.md +139 -0
- package/vendor/nature-skills/skills/nature-shared/journal-formats/nature-machine-intelligence.md +431 -0
- package/vendor/nature-skills/skills/nature-shared/journal-formats/nature.md +313 -0
- package/vendor/nature-skills/skills/nature-shared/manifest.yaml +52 -0
- package/vendor/nature-skills/skills/nature-shared/scripts/check_consistency.py +273 -0
- package/vendor/nature-skills/skills/nature-shared/tests/test_check_consistency.py +63 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
# Nature Article submission requirements
|
|
2
|
+
|
|
3
|
+
Canonical shared rules for an original-research **Article submitted to the
|
|
4
|
+
flagship journal Nature**. Do not apply these numbers automatically to Nature
|
|
5
|
+
Portfolio subjournals. Their author instructions can differ substantially.
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
1. Authority and stage gate
|
|
10
|
+
2. Editorial fit
|
|
11
|
+
3. Initial-submission file preflight
|
|
12
|
+
4. Article structure and limits
|
|
13
|
+
5. Administrative and authorship checks
|
|
14
|
+
6. Displays, Extended Data and Supplementary Information
|
|
15
|
+
7. Reporting, availability and specialist routing
|
|
16
|
+
8. Submission modes and related work
|
|
17
|
+
9. Final-submission boundary
|
|
18
|
+
10. Official sources
|
|
19
|
+
|
|
20
|
+
## 1. Authority and stage gate
|
|
21
|
+
|
|
22
|
+
Before applying a rule, record the stage:
|
|
23
|
+
|
|
24
|
+
- `initial_submission`: before the first editorial decision; Nature permits
|
|
25
|
+
reasonable formatting flexibility.
|
|
26
|
+
- `revision`: after review; follow the handling editor's instructions in
|
|
27
|
+
addition to the public guide.
|
|
28
|
+
- `accepted_in_principle`: production-quality text, figures, Extended Data,
|
|
29
|
+
Supplementary Information, forms and declarations are requested.
|
|
30
|
+
- `proof`: production corrections only; not a new manuscript rewrite.
|
|
31
|
+
|
|
32
|
+
Do not reject an otherwise reviewable initial submission merely because it has
|
|
33
|
+
not yet been converted to final production house style. Still run the readiness
|
|
34
|
+
checks below because they reduce avoidable delays and expose missing policy
|
|
35
|
+
items.
|
|
36
|
+
|
|
37
|
+
## 2. Editorial fit
|
|
38
|
+
|
|
39
|
+
A Nature Article should:
|
|
40
|
+
|
|
41
|
+
- report original scientific research whose main results and conclusions are
|
|
42
|
+
not published or simultaneously submitted elsewhere
|
|
43
|
+
- be of outstanding scientific importance
|
|
44
|
+
- reach a conclusion of interest to an interdisciplinary readership
|
|
45
|
+
- present results that are novel and arresting, with immediate and
|
|
46
|
+
far-reaching implications
|
|
47
|
+
|
|
48
|
+
Additional fit tests:
|
|
49
|
+
|
|
50
|
+
- a large-dataset paper should provide a comprehensively validated dataset or
|
|
51
|
+
a significant technical advance or scientific insight
|
|
52
|
+
- a solely technical paper needs significant impact for a research community
|
|
53
|
+
- a therapeutic paper without new mechanism needs a substantial effect on an
|
|
54
|
+
important disease
|
|
55
|
+
|
|
56
|
+
Treat these as editorial-fit criteria, not formatting promises. Flag weak fit
|
|
57
|
+
instead of inflating significance language.
|
|
58
|
+
|
|
59
|
+
## 3. Initial-submission file preflight
|
|
60
|
+
|
|
61
|
+
For a standard initial submission:
|
|
62
|
+
|
|
63
|
+
- submit through Nature's online manuscript system
|
|
64
|
+
- prefer manuscript text and figures together in one Microsoft Word or PDF
|
|
65
|
+
file, up to 30 MB
|
|
66
|
+
- place each figure legend on the same page as its figure
|
|
67
|
+
- include line numbers; number every line in a supplied PDF
|
|
68
|
+
- include titles for cited articles and datasets in the reference list
|
|
69
|
+
- before acceptance, submit a PDF for a TeX/LaTeX manuscript
|
|
70
|
+
- ensure figures have enough resolution for referees, while recognizing that
|
|
71
|
+
production-quality files are not required at this stage
|
|
72
|
+
|
|
73
|
+
If the submission uses separate files, record why and verify every display is
|
|
74
|
+
cited and present.
|
|
75
|
+
|
|
76
|
+
## 4. Article structure and limits
|
|
77
|
+
|
|
78
|
+
### Required sequence
|
|
79
|
+
|
|
80
|
+
Audit the manuscript in this order:
|
|
81
|
+
|
|
82
|
+
1. title
|
|
83
|
+
2. authors
|
|
84
|
+
3. affiliations and present addresses
|
|
85
|
+
4. bold summary paragraph
|
|
86
|
+
5. main text
|
|
87
|
+
6. main references
|
|
88
|
+
7. tables
|
|
89
|
+
8. figure legends
|
|
90
|
+
9. Methods, including separate Data Availability and Code Availability
|
|
91
|
+
statements where applicable
|
|
92
|
+
10. Methods references
|
|
93
|
+
11. acknowledgements
|
|
94
|
+
12. funding statement
|
|
95
|
+
13. author contributions
|
|
96
|
+
14. competing-interests declaration
|
|
97
|
+
15. additional information, including Supplementary Information and
|
|
98
|
+
corresponding-author lines
|
|
99
|
+
16. Extended Data figure and table legends
|
|
100
|
+
|
|
101
|
+
### Initial manuscript styling
|
|
102
|
+
|
|
103
|
+
- write in English using Oxford English Dictionary spelling conventions
|
|
104
|
+
- use double spacing
|
|
105
|
+
- Microsoft Word without style tags is preferred
|
|
106
|
+
- a standard font, preferably 12 pt Times New Roman, is recommended for the
|
|
107
|
+
manuscript text
|
|
108
|
+
- use normal text or Symbol font for ordinary mathematical and Greek symbols;
|
|
109
|
+
reserve equation editors for formulae that cannot be set reliably as text
|
|
110
|
+
|
|
111
|
+
### Title
|
|
112
|
+
|
|
113
|
+
- no more than two printed lines, equivalent to 75 characters including spaces
|
|
114
|
+
- normally avoid numbers, acronyms, abbreviations and punctuation
|
|
115
|
+
- avoid technical terms and active verbs
|
|
116
|
+
- retain enough detail for indexing while remaining intelligible outside the
|
|
117
|
+
immediate field
|
|
118
|
+
|
|
119
|
+
### Summary paragraph
|
|
120
|
+
|
|
121
|
+
- fully referenced and ideally no more than about 200 words
|
|
122
|
+
- written for readers outside the discipline
|
|
123
|
+
- avoid numbers, abbreviations, acronyms and measurements unless essential
|
|
124
|
+
- use the sequence: broad field, background/rationale, main conclusion
|
|
125
|
+
introduced by `Here we show` or an equivalent, then general context and how
|
|
126
|
+
the work moves the field forward
|
|
127
|
+
|
|
128
|
+
### Main text and display budget
|
|
129
|
+
|
|
130
|
+
- typical six-page Article: about 2,500 words and four modest display items
|
|
131
|
+
- typical eight-page Article: about 4,300 words and five or six modest display
|
|
132
|
+
items
|
|
133
|
+
- a modest display item plus legend occupies about one-quarter page; a large
|
|
134
|
+
composite can require a corresponding reduction in text
|
|
135
|
+
- up to about 50 main-text references within the page budget
|
|
136
|
+
- subheadings may contain up to 40 characters including spaces
|
|
137
|
+
- the title, author list, acknowledgements and references do not count toward
|
|
138
|
+
the main-text word count
|
|
139
|
+
|
|
140
|
+
### Methods
|
|
141
|
+
|
|
142
|
+
- include every element needed to interpret and replicate the results
|
|
143
|
+
- write concisely; the section typically does not exceed 3,000 words but may be
|
|
144
|
+
longer when necessary
|
|
145
|
+
- use short bold method headings and consider dedicated statistics, reagents
|
|
146
|
+
and animal-model subsections
|
|
147
|
+
- do not place figures or tables in Methods; route essential displays to
|
|
148
|
+
Extended Data or, exceptionally, Supplementary Information
|
|
149
|
+
- continue Methods-reference numbering after the main-text references
|
|
150
|
+
- cite deposited step-by-step protocols and mention them in Methods
|
|
151
|
+
|
|
152
|
+
### References, tables and end notes
|
|
153
|
+
|
|
154
|
+
- number references sequentially in order of first appearance across text,
|
|
155
|
+
tables, legends, Methods and Extended Data
|
|
156
|
+
- use superscript citations in text unless confusion with another superscript
|
|
157
|
+
is likely
|
|
158
|
+
- list only one publication per reference number
|
|
159
|
+
- remove linked fields produced by EndNote or similar software
|
|
160
|
+
- normally include only published or accepted work and recognized preprints;
|
|
161
|
+
describe work in preparation in the text rather than the reference list
|
|
162
|
+
- include titles for cited articles and datasets
|
|
163
|
+
- list all authors unless there are more than five; then give the first author
|
|
164
|
+
followed by `et al.`
|
|
165
|
+
- give each table a short title sentence, with details in table footnotes
|
|
166
|
+
- keep acknowledgements brief; do not thank anonymous referees or editors and
|
|
167
|
+
avoid effusive praise
|
|
168
|
+
- declare funding separately only when the work is within scope of, and arose
|
|
169
|
+
directly from, the named grant
|
|
170
|
+
- include an individual author-contribution statement and a competing-interests
|
|
171
|
+
statement
|
|
172
|
+
- identify equal contributors directly below the address list when there are up
|
|
173
|
+
to three; describe larger equal-contribution groups in the author-
|
|
174
|
+
contributions statement
|
|
175
|
+
- place present addresses immediately below the author list
|
|
176
|
+
|
|
177
|
+
## 5. Administrative and authorship checks
|
|
178
|
+
|
|
179
|
+
### Corresponding author
|
|
180
|
+
|
|
181
|
+
Before submission, confirm that the corresponding author:
|
|
182
|
+
|
|
183
|
+
- has included all authors in the author list
|
|
184
|
+
- has confirmed that every author agrees with the list order and submission
|
|
185
|
+
- is prepared to manage all journal and coauthor communication
|
|
186
|
+
- is identified with an asterisk in the manuscript
|
|
187
|
+
- is named for correspondence and material requests
|
|
188
|
+
|
|
189
|
+
### Cover letter
|
|
190
|
+
|
|
191
|
+
For flagship Nature, the initial cover letter is **optional**. If supplied:
|
|
192
|
+
|
|
193
|
+
- explain the importance of the work and its fit for Nature briefly
|
|
194
|
+
- do not repeat the abstract or introduction
|
|
195
|
+
- use it for confidential information that should not go to referees, including
|
|
196
|
+
relevant conflicts and related work in press or under consideration
|
|
197
|
+
- do not treat a missing optional cover letter as a submission blocker
|
|
198
|
+
|
|
199
|
+
### AI and LLM use
|
|
200
|
+
|
|
201
|
+
- an LLM or other AI system cannot be an author
|
|
202
|
+
- human authors retain responsibility for originality, accuracy and integrity
|
|
203
|
+
- document LLM use in Methods or, if Methods is unavailable, a suitable
|
|
204
|
+
alternative section
|
|
205
|
+
- apply the current Nature Portfolio risk framework and disclosure rules in
|
|
206
|
+
`../core/ethics.md`
|
|
207
|
+
|
|
208
|
+
## 6. Displays, Extended Data and Supplementary Information
|
|
209
|
+
|
|
210
|
+
### Figures and legends at initial submission
|
|
211
|
+
|
|
212
|
+
- embed figures with the manuscript when practical
|
|
213
|
+
- high-resolution production files are not required initially, but data must be
|
|
214
|
+
assessable by referees
|
|
215
|
+
- keep each legend below 250 words
|
|
216
|
+
- begin with a brief title sentence, then describe what is depicted rather than
|
|
217
|
+
restating results or methods
|
|
218
|
+
- make the figure and legend understandable in isolation where possible
|
|
219
|
+
|
|
220
|
+
Use the Nature-specific figure reference in `nature-figure` for final dimensions,
|
|
221
|
+
editable formats, accessibility, image integrity and the distinction between
|
|
222
|
+
main-figure and Extended Data uploads.
|
|
223
|
+
|
|
224
|
+
### Extended Data
|
|
225
|
+
|
|
226
|
+
- place integral supporting data in no more than ten multi-panel Extended Data
|
|
227
|
+
figures or tables
|
|
228
|
+
- consider a simple schematic when the main conclusion involves a complex
|
|
229
|
+
process unfamiliar to nonspecialists
|
|
230
|
+
- at initial submission, Extended Data may appear as regular display items or
|
|
231
|
+
within Supplementary Information
|
|
232
|
+
- accepted papers require formal Extended Data formatting
|
|
233
|
+
|
|
234
|
+
### Supplementary Information
|
|
235
|
+
|
|
236
|
+
Use Supplementary Information only for peer-reviewed material essential to the
|
|
237
|
+
paper's conclusion that is too large, impractical or specialized for print.
|
|
238
|
+
Prefer Extended Data for ordinary figures and small tables.
|
|
239
|
+
|
|
240
|
+
When SI is present, audit:
|
|
241
|
+
|
|
242
|
+
- the categories Supplementary Methods, Tables, Discussion, Equations, Notes,
|
|
243
|
+
Data, Video and Audio
|
|
244
|
+
- numbering separate from main-text and Extended Data displays
|
|
245
|
+
- a `SIGuide.doc` containing each file title and a summary of no more than
|
|
246
|
+
50 words; video/audio titles and legends may be up to 100 words
|
|
247
|
+
- no more than ten files where possible
|
|
248
|
+
- up to 30 MB per sound/video or combined PDF and no more than 150 MB total
|
|
249
|
+
- every SI item is cited in the manuscript and every file uses an accepted
|
|
250
|
+
format
|
|
251
|
+
|
|
252
|
+
Current accepted SI formats include PDF, Word, plain text, RTF, WordPerfect,
|
|
253
|
+
PostScript/EPS, HTML, Excel, QuickTime, WAV, MPEG/MP4/MP3 and supported systems-
|
|
254
|
+
biology markup formats such as SBML/XML/OWL. Keep SI images at or below
|
|
255
|
+
640 × 480 pixels. If a required item cannot meet the format or size contract,
|
|
256
|
+
contact the handling editor rather than silently converting or omitting it.
|
|
257
|
+
|
|
258
|
+
## 7. Reporting, availability and specialist routing
|
|
259
|
+
|
|
260
|
+
- include a Data Availability statement and, for central custom code or
|
|
261
|
+
algorithms, a separate Code Availability statement
|
|
262
|
+
- make supporting data and central code available to editors and referees when
|
|
263
|
+
requested
|
|
264
|
+
- route exact repository, accession, restriction and materials checks to
|
|
265
|
+
`nature-data`
|
|
266
|
+
- route Nature's exact statistical checklist to `nature-statistics`
|
|
267
|
+
- require a completed reporting summary for life sciences, behavioural and
|
|
268
|
+
social sciences, and ecology, evolution and environmental sciences
|
|
269
|
+
- check for field-specific physical-science reporting summaries, including
|
|
270
|
+
solar cells and claims of lasing
|
|
271
|
+
- open `../core/research-compliance.md` for human, animal, clinical, image,
|
|
272
|
+
structure, chemistry, taxonomy, geological, archaeological or
|
|
273
|
+
palaeontological research
|
|
274
|
+
|
|
275
|
+
## 8. Submission modes and related work
|
|
276
|
+
|
|
277
|
+
- disclose related manuscripts with overlapping authorship that are under
|
|
278
|
+
consideration, under appeal or in press
|
|
279
|
+
- include copies of those manuscripts as clearly marked separate files
|
|
280
|
+
- preprints are permitted: the original submitted version may be posted at any
|
|
281
|
+
time; the accepted version may be posted six months after publication; the
|
|
282
|
+
copyedited published Nature version may not be posted to a preprint server or
|
|
283
|
+
another website
|
|
284
|
+
- double-anonymized review is optional; authors must remove identifying
|
|
285
|
+
information and are responsible for successful anonymization
|
|
286
|
+
- reviewer suggestions should be independent and include contact details;
|
|
287
|
+
Nature normally permits requests to exclude one or two competing groups
|
|
288
|
+
- a presubmission enquiry, when used, needs a broad-readership cover paragraph,
|
|
289
|
+
a fully referenced summary paragraph and a reference list
|
|
290
|
+
|
|
291
|
+
## 9. Final-submission boundary
|
|
292
|
+
|
|
293
|
+
Do not apply accepted-in-principle production requirements as initial-submission
|
|
294
|
+
blockers. After an editor requests final files, separately audit:
|
|
295
|
+
|
|
296
|
+
- final accepted text and production-quality main and Extended Data files
|
|
297
|
+
- text/figure file separation and TeX/LaTeX conversion requirements
|
|
298
|
+
- final Supplementary Information and `SIGuide.doc`
|
|
299
|
+
- requested forms, declarations and licence workflow
|
|
300
|
+
- production figure specifications and unprocessed life-science gel/blot images
|
|
301
|
+
|
|
302
|
+
## 10. Official sources
|
|
303
|
+
|
|
304
|
+
Verified 2026-08-08:
|
|
305
|
+
|
|
306
|
+
- Initial submission: <https://www.nature.com/nature/for-authors/initial-submission>
|
|
307
|
+
- Formatting guide: <https://www.nature.com/nature/for-authors/formatting-guide>
|
|
308
|
+
- Editorial criteria and processes: <https://www.nature.com/nature/for-authors/editorial-criteria-and-processes>
|
|
309
|
+
- Supplementary Information: <https://www.nature.com/nature/for-authors/supp-info>
|
|
310
|
+
- Forms and declarations: <https://www.nature.com/nature/for-authors/forms-and-declarations>
|
|
311
|
+
- Final submission: <https://www.nature.com/nature/for-authors/final-submission>
|
|
312
|
+
- Nature Portfolio reporting standards: <https://www.nature.com/nature-portfolio/editorial-policies/reporting-standards>
|
|
313
|
+
- Nature Portfolio AI policy: <https://www.nature.com/nature-portfolio/editorial-policies/ai>
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
name: nature-shared
|
|
2
|
+
version: 1.6.0
|
|
3
|
+
description: >
|
|
4
|
+
Declarative manifest for shared Nature reference modules. This package is not
|
|
5
|
+
a standalone workflow; installed Nature skills use it to load exact shared
|
|
6
|
+
core or journal-format files on demand.
|
|
7
|
+
|
|
8
|
+
# Design note: never preload the whole shared package. Requesting skills should
|
|
9
|
+
# load only the specific file listed below and then return to their own workflow,
|
|
10
|
+
# output format, and QA rules.
|
|
11
|
+
|
|
12
|
+
always_load: []
|
|
13
|
+
|
|
14
|
+
core:
|
|
15
|
+
on_demand:
|
|
16
|
+
- condition: shared ethics, safety, authorship, disclosure, or non-invention guardrails are needed
|
|
17
|
+
path: core/ethics.md
|
|
18
|
+
- condition: human or animal ethics, clinical research, reporting summaries, image integrity, structures, chemistry, taxonomy, geological, archaeological, or palaeontological compliance is involved
|
|
19
|
+
path: core/research-compliance.md
|
|
20
|
+
- condition: classifying paper type, article genre, or manuscript family before applying a writing/reader workflow
|
|
21
|
+
path: core/paper-type-taxonomy.md
|
|
22
|
+
- condition: shared reader workflow is explicitly requested by another Nature skill
|
|
23
|
+
path: core/reader-workflow.md
|
|
24
|
+
- condition: maintaining terminology consistency across paper reading, polishing, writing, or slide generation
|
|
25
|
+
path: core/terminology-ledger.md
|
|
26
|
+
- condition: auditing an existing or multi-round-revised manuscript for accumulated drift — terminology/unit/number variants, headline counts that do not reconcile with the Methods, claims contradicted by the paper's own tables, over- or under-claiming, tense parallelism, and prose that restates displays
|
|
27
|
+
path: core/consistency-sweep.md
|
|
28
|
+
- condition: drafting, restructuring, compressing, or reviewer-revising scientific main text — classify results as core/support/qualification/robustness/heterogeneity/provenance/alternative inference/edge case; allocate evidence across main text, captions, and SI; run paragraph-necessity, deletion, statistics-location, and claim-repetition checks
|
|
29
|
+
path: core/main-text-discipline.md
|
|
30
|
+
- condition: drafting, restructuring, or polishing Results or Discussion for flagship Nature, Nature Communications, Nature Machine Intelligence, or another Nature Portfolio title; auditing claim escalation, evidence-bound local interpretation, diagnostic perturbation, necessary recap versus redundant re-demonstration, or cross-Results synthesis
|
|
31
|
+
path: core/nature-results-discussion.md
|
|
32
|
+
- condition: drafting, restructuring, or polishing any scientific Discussion; sequencing anchor, positioning, interpretation, contribution, limitations, and future work; calibrating modal verbs or hedging to evidence strength; or auditing whether Discussion repeats Results
|
|
33
|
+
path: core/discussion-argument-language.md
|
|
34
|
+
- condition: drafting, restructuring, or polishing an Introduction for flagship Nature, Nature Communications, Nature Machine Intelligence, or another Nature Portfolio title; building a fast problem funnel, exact knowledge gap, literature tension, question-first novelty, compact study roadmap, or Introduction–Results alignment audit
|
|
35
|
+
path: core/nature-introduction.md
|
|
36
|
+
- condition: drafting, restructuring, or polishing an abstract for flagship Nature, Nature Communications, Nature Machine Intelligence, or another Nature Portfolio title; compressing the manuscript into a discovery-centred evidence chain; selecting one main claim, one or two decisive supports, optional core numbers, and a bounded field-level payoff
|
|
37
|
+
path: core/nature-abstract.md
|
|
38
|
+
|
|
39
|
+
journal_formats:
|
|
40
|
+
on_demand:
|
|
41
|
+
- condition: formatting, initial-submission readiness, or stage-aware checking for a flagship Nature Article
|
|
42
|
+
path: journal-formats/nature.md
|
|
43
|
+
- condition: formatting or checking output for Nature Communications conventions
|
|
44
|
+
path: journal-formats/nat-comms.md
|
|
45
|
+
- condition: formatting, article-type selection, initial-submission readiness, or stage-aware checking for Nature Machine Intelligence
|
|
46
|
+
path: journal-formats/nature-machine-intelligence.md
|
|
47
|
+
|
|
48
|
+
quality_tools:
|
|
49
|
+
consistency_script: scripts/check_consistency.py
|
|
50
|
+
use_when: auditing an existing full manuscript or a manuscript revised over multiple rounds
|
|
51
|
+
purpose: warn about terminology variants, equivalent lengths expressed in different units, and equal numeric values reported at different precision
|
|
52
|
+
script_resolution: resolve relative to the nature-shared package directory, never the user working directory
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Find mechanically detectable consistency risks in manuscript text files."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import json
|
|
8
|
+
import re
|
|
9
|
+
from dataclasses import asdict, dataclass
|
|
10
|
+
from decimal import Decimal, InvalidOperation
|
|
11
|
+
from pathlib import Path
|
|
12
|
+
from typing import Iterable, Sequence
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
DEFAULT_TERM_GROUPS = {
|
|
16
|
+
"self-reference": ("this study", "this work", "this paper", "this article"),
|
|
17
|
+
"standard-deviation": ("standard deviation", "SD", "Std"),
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
LENGTH_FACTORS_METRES = {
|
|
21
|
+
"um": Decimal("0.000001"),
|
|
22
|
+
"mm": Decimal("0.001"),
|
|
23
|
+
"cm": Decimal("0.01"),
|
|
24
|
+
"m": Decimal("1"),
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@dataclass(frozen=True)
|
|
29
|
+
class Finding:
|
|
30
|
+
code: str
|
|
31
|
+
message: str
|
|
32
|
+
evidence: tuple[str, ...]
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
@dataclass(frozen=True)
|
|
36
|
+
class Occurrence:
|
|
37
|
+
path: Path
|
|
38
|
+
line: int
|
|
39
|
+
value: str
|
|
40
|
+
|
|
41
|
+
def label(self) -> str:
|
|
42
|
+
return f"{self.path}:{self.line}: {self.value}"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
def read_sources(paths: Sequence[Path]) -> dict[Path, str]:
|
|
46
|
+
return {
|
|
47
|
+
path: path.read_text(encoding="utf-8", errors="replace")
|
|
48
|
+
for path in paths
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def visible_lines(text: str) -> Iterable[tuple[int, str]]:
|
|
53
|
+
"""Yield lines after removing Markdown fences and unescaped LaTeX comments."""
|
|
54
|
+
in_fence = False
|
|
55
|
+
for line_number, raw_line in enumerate(text.splitlines(), 1):
|
|
56
|
+
if re.match(r"^\s*```", raw_line):
|
|
57
|
+
in_fence = not in_fence
|
|
58
|
+
continue
|
|
59
|
+
if in_fence:
|
|
60
|
+
continue
|
|
61
|
+
line = re.sub(r"(?<!\\)%.*$", "", raw_line)
|
|
62
|
+
yield line_number, line
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
def phrase_pattern(phrase: str) -> re.Pattern[str]:
|
|
66
|
+
escaped = re.escape(phrase).replace(r"\ ", r"\s+")
|
|
67
|
+
prefix = r"(?<![\w-])" if phrase[0].isalnum() else ""
|
|
68
|
+
suffix = r"(?![\w-])" if phrase[-1].isalnum() else ""
|
|
69
|
+
return re.compile(prefix + escaped + suffix, re.IGNORECASE)
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
def find_phrase_occurrences(
|
|
73
|
+
sources: dict[Path, str], phrase: str
|
|
74
|
+
) -> list[Occurrence]:
|
|
75
|
+
pattern = phrase_pattern(phrase)
|
|
76
|
+
occurrences: list[Occurrence] = []
|
|
77
|
+
for path, text in sources.items():
|
|
78
|
+
for line_number, line in visible_lines(text):
|
|
79
|
+
for match in pattern.finditer(line):
|
|
80
|
+
occurrences.append(Occurrence(path, line_number, match.group(0)))
|
|
81
|
+
return occurrences
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def check_term_groups(
|
|
85
|
+
sources: dict[Path, str], groups: dict[str, tuple[str, ...]]
|
|
86
|
+
) -> list[Finding]:
|
|
87
|
+
findings: list[Finding] = []
|
|
88
|
+
for group_name, variants in groups.items():
|
|
89
|
+
present: list[tuple[str, list[Occurrence]]] = []
|
|
90
|
+
for variant in variants:
|
|
91
|
+
occurrences = find_phrase_occurrences(sources, variant)
|
|
92
|
+
if occurrences:
|
|
93
|
+
present.append((variant, occurrences))
|
|
94
|
+
if len(present) < 2:
|
|
95
|
+
continue
|
|
96
|
+
counts = ", ".join(f"{variant}={len(items)}" for variant, items in present)
|
|
97
|
+
evidence = tuple(
|
|
98
|
+
occurrence.label()
|
|
99
|
+
for _, items in present
|
|
100
|
+
for occurrence in items[:3]
|
|
101
|
+
)
|
|
102
|
+
findings.append(
|
|
103
|
+
Finding(
|
|
104
|
+
code="TERM_VARIANTS_PRESENT",
|
|
105
|
+
message=f"term group '{group_name}' uses multiple variants: {counts}",
|
|
106
|
+
evidence=evidence,
|
|
107
|
+
)
|
|
108
|
+
)
|
|
109
|
+
return findings
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
NUMBER_PATTERN = re.compile(r"(?<![\w.])([+-]?(?:\d+\.\d+|\d+))(?![\w.])")
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def decimal_places(token: str) -> int:
|
|
116
|
+
unsigned = token.lstrip("+-")
|
|
117
|
+
return len(unsigned.partition(".")[2]) if "." in unsigned else 0
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
def check_numeric_precision(sources: dict[Path, str]) -> list[Finding]:
|
|
121
|
+
values: dict[Decimal, dict[int, list[Occurrence]]] = {}
|
|
122
|
+
for path, text in sources.items():
|
|
123
|
+
for line_number, line in visible_lines(text):
|
|
124
|
+
for match in NUMBER_PATTERN.finditer(line):
|
|
125
|
+
token = match.group(1)
|
|
126
|
+
try:
|
|
127
|
+
value = Decimal(token)
|
|
128
|
+
except InvalidOperation:
|
|
129
|
+
continue
|
|
130
|
+
places = decimal_places(token)
|
|
131
|
+
values.setdefault(value, {}).setdefault(places, []).append(
|
|
132
|
+
Occurrence(path, line_number, token)
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
findings: list[Finding] = []
|
|
136
|
+
for value, precision_groups in values.items():
|
|
137
|
+
if len(precision_groups) < 2:
|
|
138
|
+
continue
|
|
139
|
+
precision_summary = ", ".join(
|
|
140
|
+
f"{places} decimal place(s)={len(items)}"
|
|
141
|
+
for places, items in sorted(precision_groups.items())
|
|
142
|
+
)
|
|
143
|
+
evidence = tuple(
|
|
144
|
+
occurrence.label()
|
|
145
|
+
for _, items in sorted(precision_groups.items())
|
|
146
|
+
for occurrence in items[:3]
|
|
147
|
+
)
|
|
148
|
+
findings.append(
|
|
149
|
+
Finding(
|
|
150
|
+
code="NUMERIC_PRECISION_VARIANT",
|
|
151
|
+
message=f"numeric value {value} appears at multiple precisions: {precision_summary}",
|
|
152
|
+
evidence=evidence,
|
|
153
|
+
)
|
|
154
|
+
)
|
|
155
|
+
return findings
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
LENGTH_PATTERN = re.compile(
|
|
159
|
+
r"(?<![\w.])([+-]?(?:\d+\.\d+|\d+))\s*(?:\\,\s*)?"
|
|
160
|
+
r"(?:\\(?:mathrm|text)\s*\{\s*)?(μm|µm|um|mm|cm|m)(?:\s*\})?"
|
|
161
|
+
r"(?![A-Za-z])",
|
|
162
|
+
re.IGNORECASE,
|
|
163
|
+
)
|
|
164
|
+
|
|
165
|
+
|
|
166
|
+
def normalized_unit(unit: str) -> str:
|
|
167
|
+
unit = unit.lower()
|
|
168
|
+
return "um" if unit in {"μm", "µm"} else unit
|
|
169
|
+
|
|
170
|
+
|
|
171
|
+
def check_equivalent_length_units(sources: dict[Path, str]) -> list[Finding]:
|
|
172
|
+
values: dict[Decimal, dict[str, list[Occurrence]]] = {}
|
|
173
|
+
for path, text in sources.items():
|
|
174
|
+
for line_number, line in visible_lines(text):
|
|
175
|
+
for match in LENGTH_PATTERN.finditer(line):
|
|
176
|
+
number, raw_unit = match.groups()
|
|
177
|
+
unit = normalized_unit(raw_unit)
|
|
178
|
+
metres = Decimal(number) * LENGTH_FACTORS_METRES[unit]
|
|
179
|
+
values.setdefault(metres, {}).setdefault(unit, []).append(
|
|
180
|
+
Occurrence(path, line_number, match.group(0))
|
|
181
|
+
)
|
|
182
|
+
|
|
183
|
+
findings: list[Finding] = []
|
|
184
|
+
for metres, unit_groups in values.items():
|
|
185
|
+
if len(unit_groups) < 2:
|
|
186
|
+
continue
|
|
187
|
+
counts = ", ".join(
|
|
188
|
+
f"{unit}={len(items)}" for unit, items in sorted(unit_groups.items())
|
|
189
|
+
)
|
|
190
|
+
evidence = tuple(
|
|
191
|
+
occurrence.label()
|
|
192
|
+
for _, items in sorted(unit_groups.items())
|
|
193
|
+
for occurrence in items[:3]
|
|
194
|
+
)
|
|
195
|
+
findings.append(
|
|
196
|
+
Finding(
|
|
197
|
+
code="EQUIVALENT_LENGTH_UNIT_VARIANT",
|
|
198
|
+
message=f"equivalent length {metres} m appears in multiple units: {counts}",
|
|
199
|
+
evidence=evidence,
|
|
200
|
+
)
|
|
201
|
+
)
|
|
202
|
+
return findings
|
|
203
|
+
|
|
204
|
+
|
|
205
|
+
def parse_term_group(value: str) -> tuple[str, tuple[str, ...]]:
|
|
206
|
+
name, separator, raw_variants = value.partition("=")
|
|
207
|
+
variants = tuple(item.strip() for item in raw_variants.split("|") if item.strip())
|
|
208
|
+
if not separator or not name.strip() or len(variants) < 2:
|
|
209
|
+
raise argparse.ArgumentTypeError(
|
|
210
|
+
"term groups must use NAME=variant one|variant two with at least two variants"
|
|
211
|
+
)
|
|
212
|
+
return name.strip(), variants
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def run_checks(
|
|
216
|
+
paths: Sequence[Path],
|
|
217
|
+
term_groups: dict[str, tuple[str, ...]] | None = None,
|
|
218
|
+
) -> list[Finding]:
|
|
219
|
+
sources = read_sources(paths)
|
|
220
|
+
findings = check_term_groups(sources, term_groups or {})
|
|
221
|
+
findings.extend(check_numeric_precision(sources))
|
|
222
|
+
findings.extend(check_equivalent_length_units(sources))
|
|
223
|
+
return findings
|
|
224
|
+
|
|
225
|
+
|
|
226
|
+
def build_parser() -> argparse.ArgumentParser:
|
|
227
|
+
parser = argparse.ArgumentParser(
|
|
228
|
+
description="Find terminology, numeric-precision, and equivalent-unit variants."
|
|
229
|
+
)
|
|
230
|
+
parser.add_argument("paths", nargs="+", type=Path)
|
|
231
|
+
parser.add_argument(
|
|
232
|
+
"--term-group",
|
|
233
|
+
action="append",
|
|
234
|
+
default=[],
|
|
235
|
+
type=parse_term_group,
|
|
236
|
+
metavar="NAME=TERM|VARIANT",
|
|
237
|
+
help="Add a manuscript-specific terminology group. Repeat as needed.",
|
|
238
|
+
)
|
|
239
|
+
parser.add_argument(
|
|
240
|
+
"--no-default-term-groups",
|
|
241
|
+
action="store_true",
|
|
242
|
+
help="Disable the built-in self-reference and standard-deviation groups.",
|
|
243
|
+
)
|
|
244
|
+
parser.add_argument("--json", action="store_true", dest="as_json")
|
|
245
|
+
parser.add_argument(
|
|
246
|
+
"--fail-on-findings",
|
|
247
|
+
action="store_true",
|
|
248
|
+
help="Return exit status 1 when warnings are found.",
|
|
249
|
+
)
|
|
250
|
+
return parser
|
|
251
|
+
|
|
252
|
+
|
|
253
|
+
def main(argv: list[str] | None = None) -> int:
|
|
254
|
+
args = build_parser().parse_args(argv)
|
|
255
|
+
groups = {} if args.no_default_term_groups else dict(DEFAULT_TERM_GROUPS)
|
|
256
|
+
groups.update(dict(args.term_group))
|
|
257
|
+
findings = run_checks(args.paths, groups)
|
|
258
|
+
|
|
259
|
+
if args.as_json:
|
|
260
|
+
print(json.dumps([asdict(item) for item in findings], ensure_ascii=False, indent=2))
|
|
261
|
+
elif findings:
|
|
262
|
+
for finding in findings:
|
|
263
|
+
print(f"{finding.code}\t{finding.message}")
|
|
264
|
+
for item in finding.evidence:
|
|
265
|
+
print(f" {item}")
|
|
266
|
+
else:
|
|
267
|
+
print("No mechanical consistency warnings found.")
|
|
268
|
+
|
|
269
|
+
return 1 if findings and args.fail_on_findings else 0
|
|
270
|
+
|
|
271
|
+
|
|
272
|
+
if __name__ == "__main__":
|
|
273
|
+
raise SystemExit(main())
|