@renkosky/lark-fe-skills 0.1.1 → 0.1.3
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 +46 -30
- package/bin/lark-fe-skills.js +44 -7
- package/node_modules/yaml/LICENSE +13 -0
- package/node_modules/yaml/README.md +172 -0
- package/node_modules/yaml/bin.mjs +11 -0
- package/node_modules/yaml/browser/dist/compose/compose-collection.js +88 -0
- package/node_modules/yaml/browser/dist/compose/compose-doc.js +43 -0
- package/node_modules/yaml/browser/dist/compose/compose-node.js +109 -0
- package/node_modules/yaml/browser/dist/compose/compose-scalar.js +86 -0
- package/node_modules/yaml/browser/dist/compose/composer.js +219 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-map.js +115 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-scalar.js +198 -0
- package/node_modules/yaml/browser/dist/compose/resolve-block-seq.js +49 -0
- package/node_modules/yaml/browser/dist/compose/resolve-end.js +37 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-collection.js +207 -0
- package/node_modules/yaml/browser/dist/compose/resolve-flow-scalar.js +225 -0
- package/node_modules/yaml/browser/dist/compose/resolve-props.js +146 -0
- package/node_modules/yaml/browser/dist/compose/util-contains-newline.js +34 -0
- package/node_modules/yaml/browser/dist/compose/util-empty-scalar-position.js +26 -0
- package/node_modules/yaml/browser/dist/compose/util-flow-indent-check.js +15 -0
- package/node_modules/yaml/browser/dist/compose/util-map-includes.js +13 -0
- package/node_modules/yaml/browser/dist/doc/Document.js +335 -0
- package/node_modules/yaml/browser/dist/doc/anchors.js +71 -0
- package/node_modules/yaml/browser/dist/doc/applyReviver.js +55 -0
- package/node_modules/yaml/browser/dist/doc/createNode.js +88 -0
- package/node_modules/yaml/browser/dist/doc/directives.js +176 -0
- package/node_modules/yaml/browser/dist/errors.js +57 -0
- package/node_modules/yaml/browser/dist/index.js +17 -0
- package/node_modules/yaml/browser/dist/log.js +11 -0
- package/node_modules/yaml/browser/dist/nodes/Alias.js +116 -0
- package/node_modules/yaml/browser/dist/nodes/Collection.js +147 -0
- package/node_modules/yaml/browser/dist/nodes/Node.js +38 -0
- package/node_modules/yaml/browser/dist/nodes/Pair.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/Scalar.js +24 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLMap.js +144 -0
- package/node_modules/yaml/browser/dist/nodes/YAMLSeq.js +113 -0
- package/node_modules/yaml/browser/dist/nodes/addPairToJSMap.js +63 -0
- package/node_modules/yaml/browser/dist/nodes/identity.js +36 -0
- package/node_modules/yaml/browser/dist/nodes/toJS.js +37 -0
- package/node_modules/yaml/browser/dist/parse/cst-scalar.js +214 -0
- package/node_modules/yaml/browser/dist/parse/cst-stringify.js +61 -0
- package/node_modules/yaml/browser/dist/parse/cst-visit.js +97 -0
- package/node_modules/yaml/browser/dist/parse/cst.js +98 -0
- package/node_modules/yaml/browser/dist/parse/lexer.js +721 -0
- package/node_modules/yaml/browser/dist/parse/line-counter.js +39 -0
- package/node_modules/yaml/browser/dist/parse/parser.js +975 -0
- package/node_modules/yaml/browser/dist/public-api.js +102 -0
- package/node_modules/yaml/browser/dist/schema/Schema.js +37 -0
- package/node_modules/yaml/browser/dist/schema/common/map.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/null.js +15 -0
- package/node_modules/yaml/browser/dist/schema/common/seq.js +17 -0
- package/node_modules/yaml/browser/dist/schema/common/string.js +14 -0
- package/node_modules/yaml/browser/dist/schema/core/bool.js +19 -0
- package/node_modules/yaml/browser/dist/schema/core/float.js +43 -0
- package/node_modules/yaml/browser/dist/schema/core/int.js +38 -0
- package/node_modules/yaml/browser/dist/schema/core/schema.js +23 -0
- package/node_modules/yaml/browser/dist/schema/json/schema.js +62 -0
- package/node_modules/yaml/browser/dist/schema/tags.js +96 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/binary.js +58 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/bool.js +26 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/float.js +46 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/int.js +71 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/merge.js +67 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/omap.js +74 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/pairs.js +78 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/schema.js +39 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/set.js +93 -0
- package/node_modules/yaml/browser/dist/schema/yaml-1.1/timestamp.js +101 -0
- package/node_modules/yaml/browser/dist/stringify/foldFlowLines.js +146 -0
- package/node_modules/yaml/browser/dist/stringify/stringify.js +129 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyCollection.js +153 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyComment.js +20 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyDocument.js +85 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyNumber.js +25 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyPair.js +150 -0
- package/node_modules/yaml/browser/dist/stringify/stringifyString.js +336 -0
- package/node_modules/yaml/browser/dist/util.js +11 -0
- package/node_modules/yaml/browser/dist/visit.js +233 -0
- package/node_modules/yaml/browser/index.js +5 -0
- package/node_modules/yaml/browser/package.json +3 -0
- package/node_modules/yaml/dist/cli.d.ts +8 -0
- package/node_modules/yaml/dist/cli.mjs +201 -0
- package/node_modules/yaml/dist/compose/compose-collection.d.ts +11 -0
- package/node_modules/yaml/dist/compose/compose-collection.js +90 -0
- package/node_modules/yaml/dist/compose/compose-doc.d.ts +7 -0
- package/node_modules/yaml/dist/compose/compose-doc.js +45 -0
- package/node_modules/yaml/dist/compose/compose-node.d.ts +29 -0
- package/node_modules/yaml/dist/compose/compose-node.js +112 -0
- package/node_modules/yaml/dist/compose/compose-scalar.d.ts +5 -0
- package/node_modules/yaml/dist/compose/compose-scalar.js +88 -0
- package/node_modules/yaml/dist/compose/composer.d.ts +63 -0
- package/node_modules/yaml/dist/compose/composer.js +224 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-map.js +117 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.d.ts +11 -0
- package/node_modules/yaml/dist/compose/resolve-block-scalar.js +200 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-block-seq.js +51 -0
- package/node_modules/yaml/dist/compose/resolve-end.d.ts +6 -0
- package/node_modules/yaml/dist/compose/resolve-end.js +39 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.d.ts +7 -0
- package/node_modules/yaml/dist/compose/resolve-flow-collection.js +209 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.d.ts +10 -0
- package/node_modules/yaml/dist/compose/resolve-flow-scalar.js +227 -0
- package/node_modules/yaml/dist/compose/resolve-props.d.ts +23 -0
- package/node_modules/yaml/dist/compose/resolve-props.js +148 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-contains-newline.js +36 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.d.ts +2 -0
- package/node_modules/yaml/dist/compose/util-empty-scalar-position.js +28 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.d.ts +3 -0
- package/node_modules/yaml/dist/compose/util-flow-indent-check.js +17 -0
- package/node_modules/yaml/dist/compose/util-map-includes.d.ts +4 -0
- package/node_modules/yaml/dist/compose/util-map-includes.js +15 -0
- package/node_modules/yaml/dist/doc/Document.d.ts +141 -0
- package/node_modules/yaml/dist/doc/Document.js +337 -0
- package/node_modules/yaml/dist/doc/anchors.d.ts +24 -0
- package/node_modules/yaml/dist/doc/anchors.js +76 -0
- package/node_modules/yaml/dist/doc/applyReviver.d.ts +9 -0
- package/node_modules/yaml/dist/doc/applyReviver.js +57 -0
- package/node_modules/yaml/dist/doc/createNode.d.ts +17 -0
- package/node_modules/yaml/dist/doc/createNode.js +90 -0
- package/node_modules/yaml/dist/doc/directives.d.ts +49 -0
- package/node_modules/yaml/dist/doc/directives.js +178 -0
- package/node_modules/yaml/dist/errors.d.ts +21 -0
- package/node_modules/yaml/dist/errors.js +62 -0
- package/node_modules/yaml/dist/index.d.ts +25 -0
- package/node_modules/yaml/dist/index.js +50 -0
- package/node_modules/yaml/dist/log.d.ts +3 -0
- package/node_modules/yaml/dist/log.js +19 -0
- package/node_modules/yaml/dist/nodes/Alias.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/Alias.js +118 -0
- package/node_modules/yaml/dist/nodes/Collection.d.ts +73 -0
- package/node_modules/yaml/dist/nodes/Collection.js +151 -0
- package/node_modules/yaml/dist/nodes/Node.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/Node.js +40 -0
- package/node_modules/yaml/dist/nodes/Pair.d.ts +22 -0
- package/node_modules/yaml/dist/nodes/Pair.js +39 -0
- package/node_modules/yaml/dist/nodes/Scalar.d.ts +47 -0
- package/node_modules/yaml/dist/nodes/Scalar.js +27 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.d.ts +53 -0
- package/node_modules/yaml/dist/nodes/YAMLMap.js +147 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.d.ts +60 -0
- package/node_modules/yaml/dist/nodes/YAMLSeq.js +115 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.d.ts +4 -0
- package/node_modules/yaml/dist/nodes/addPairToJSMap.js +65 -0
- package/node_modules/yaml/dist/nodes/identity.d.ts +23 -0
- package/node_modules/yaml/dist/nodes/identity.js +53 -0
- package/node_modules/yaml/dist/nodes/toJS.d.ts +29 -0
- package/node_modules/yaml/dist/nodes/toJS.js +39 -0
- package/node_modules/yaml/dist/options.d.ts +350 -0
- package/node_modules/yaml/dist/parse/cst-scalar.d.ts +64 -0
- package/node_modules/yaml/dist/parse/cst-scalar.js +218 -0
- package/node_modules/yaml/dist/parse/cst-stringify.d.ts +8 -0
- package/node_modules/yaml/dist/parse/cst-stringify.js +63 -0
- package/node_modules/yaml/dist/parse/cst-visit.d.ts +39 -0
- package/node_modules/yaml/dist/parse/cst-visit.js +99 -0
- package/node_modules/yaml/dist/parse/cst.d.ts +109 -0
- package/node_modules/yaml/dist/parse/cst.js +112 -0
- package/node_modules/yaml/dist/parse/lexer.d.ts +87 -0
- package/node_modules/yaml/dist/parse/lexer.js +723 -0
- package/node_modules/yaml/dist/parse/line-counter.d.ts +22 -0
- package/node_modules/yaml/dist/parse/line-counter.js +41 -0
- package/node_modules/yaml/dist/parse/parser.d.ts +84 -0
- package/node_modules/yaml/dist/parse/parser.js +980 -0
- package/node_modules/yaml/dist/public-api.d.ts +44 -0
- package/node_modules/yaml/dist/public-api.js +107 -0
- package/node_modules/yaml/dist/schema/Schema.d.ts +17 -0
- package/node_modules/yaml/dist/schema/Schema.js +39 -0
- package/node_modules/yaml/dist/schema/common/map.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/map.js +19 -0
- package/node_modules/yaml/dist/schema/common/null.d.ts +4 -0
- package/node_modules/yaml/dist/schema/common/null.js +17 -0
- package/node_modules/yaml/dist/schema/common/seq.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/seq.js +19 -0
- package/node_modules/yaml/dist/schema/common/string.d.ts +2 -0
- package/node_modules/yaml/dist/schema/common/string.js +16 -0
- package/node_modules/yaml/dist/schema/core/bool.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/bool.js +21 -0
- package/node_modules/yaml/dist/schema/core/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/float.js +47 -0
- package/node_modules/yaml/dist/schema/core/int.d.ts +4 -0
- package/node_modules/yaml/dist/schema/core/int.js +42 -0
- package/node_modules/yaml/dist/schema/core/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/core/schema.js +25 -0
- package/node_modules/yaml/dist/schema/json/schema.d.ts +2 -0
- package/node_modules/yaml/dist/schema/json/schema.js +64 -0
- package/node_modules/yaml/dist/schema/json-schema.d.ts +69 -0
- package/node_modules/yaml/dist/schema/tags.d.ts +48 -0
- package/node_modules/yaml/dist/schema/tags.js +99 -0
- package/node_modules/yaml/dist/schema/types.d.ts +92 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.d.ts +2 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/binary.js +70 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.d.ts +7 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/bool.js +29 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.d.ts +4 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/float.js +50 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.d.ts +5 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/int.js +76 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.d.ts +9 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/merge.js +71 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.d.ts +22 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/omap.js +77 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.d.ts +10 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/pairs.js +82 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.d.ts +1 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/schema.js +41 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.d.ts +28 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/set.js +96 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.d.ts +6 -0
- package/node_modules/yaml/dist/schema/yaml-1.1/timestamp.js +105 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.d.ts +34 -0
- package/node_modules/yaml/dist/stringify/foldFlowLines.js +151 -0
- package/node_modules/yaml/dist/stringify/stringify.d.ts +21 -0
- package/node_modules/yaml/dist/stringify/stringify.js +132 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.d.ts +17 -0
- package/node_modules/yaml/dist/stringify/stringifyCollection.js +155 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.d.ts +10 -0
- package/node_modules/yaml/dist/stringify/stringifyComment.js +24 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.d.ts +4 -0
- package/node_modules/yaml/dist/stringify/stringifyDocument.js +87 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.d.ts +2 -0
- package/node_modules/yaml/dist/stringify/stringifyNumber.js +27 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.d.ts +3 -0
- package/node_modules/yaml/dist/stringify/stringifyPair.js +152 -0
- package/node_modules/yaml/dist/stringify/stringifyString.d.ts +9 -0
- package/node_modules/yaml/dist/stringify/stringifyString.js +338 -0
- package/node_modules/yaml/dist/test-events.d.ts +4 -0
- package/node_modules/yaml/dist/test-events.js +134 -0
- package/node_modules/yaml/dist/util.d.ts +16 -0
- package/node_modules/yaml/dist/util.js +28 -0
- package/node_modules/yaml/dist/visit.d.ts +102 -0
- package/node_modules/yaml/dist/visit.js +236 -0
- package/node_modules/yaml/package.json +97 -0
- package/node_modules/yaml/util.js +2 -0
- package/package.json +8 -2
- package/skills/prd-fe-schedule/README.md +205 -0
- package/skills/prd-fe-schedule/SKILL.md +201 -0
- package/skills/prd-fe-schedule/agents/openai.yaml +4 -0
- package/skills/prd-fe-schedule/references/dry-run-output-template.md +35 -0
- package/skills/prd-fe-schedule/scripts/config-schedule.sh +5 -0
- package/skills/prd-fe-schedule/scripts/config-types.sh +5 -0
- package/skills/prd-fe-schedule/scripts/create-schedule.sh +5 -0
- package/skills/prd-fe-schedule/scripts/dry-run-schedule.sh +5 -0
- package/skills/prd-fe-schedule/scripts/schedule-core.js +1000 -0
- package/skills/prd-fe-task/README.md +20 -6
- package/skills/prd-fe-task/SKILL.md +9 -2
- package/skills/prd-fe-task/references/task-breakdown-template.md +7 -1
- package/skills/prd-fe-task/scripts/config.js +104 -0
- package/skills/prd-fe-task/scripts/config.sh +2 -117
- package/skills/prd-fe-task/scripts/list-configs.js +34 -0
- package/skills/prd-fe-task/scripts/list-configs.sh +2 -37
- package/skills/prd-fe-task/scripts/plan-lark-doc.js +332 -0
- package/skills/prd-fe-task/scripts/plan-lark-doc.sh +2 -210
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ Lark/Feishu based Codex skills for frontend requirement planning.
|
|
|
14
14
|
|
|
15
15
|
`@renkosky/lark-fe-skills` packages Codex skills for Lark-based frontend workflows.
|
|
16
16
|
|
|
17
|
-
The first
|
|
17
|
+
The first packaged workflow includes `prd-fe-task` for task breakdowns and `prd-fe-schedule` for Lark Base schedule dry-runs.
|
|
18
18
|
|
|
19
19
|
## 🚀 Install
|
|
20
20
|
|
|
@@ -24,10 +24,10 @@ The first skill is `prd-fe-task`: read a Lark/Feishu requirement document, inspe
|
|
|
24
24
|
npm install -g @renkosky/lark-fe-skills
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
2. Install the
|
|
27
|
+
2. Install the Codex skills:
|
|
28
28
|
|
|
29
29
|
```bash
|
|
30
|
-
lark-fe-skills install
|
|
30
|
+
lark-fe-skills install
|
|
31
31
|
```
|
|
32
32
|
|
|
33
33
|
3. Restart Codex or open a new Codex session.
|
|
@@ -35,7 +35,7 @@ lark-fe-skills install prd-fe-task
|
|
|
35
35
|
PATH fallback:
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
|
-
npm exec --package=@renkosky/lark-fe-skills -- lark-fe-skills install
|
|
38
|
+
npm exec --package=@renkosky/lark-fe-skills -- lark-fe-skills install
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
Use it in Codex:
|
|
@@ -47,9 +47,10 @@ Use it in Codex:
|
|
|
47
47
|
|
|
48
48
|
## 🧰 Prerequisites
|
|
49
49
|
|
|
50
|
-
Install and configure `lark-cli` first:
|
|
50
|
+
Install Node.js and configure `lark-cli` first:
|
|
51
51
|
|
|
52
52
|
```bash
|
|
53
|
+
npm --version
|
|
53
54
|
npm install -g @larksuite/cli
|
|
54
55
|
lark-cli config init
|
|
55
56
|
lark-cli auth login --recommend
|
|
@@ -62,9 +63,11 @@ Official lark-cli documentation: <https://github.com/larksuite/cli/tree/main>
|
|
|
62
63
|
```bash
|
|
63
64
|
lark-fe-skills list
|
|
64
65
|
lark-fe-skills path
|
|
65
|
-
lark-fe-skills path
|
|
66
|
-
lark-fe-skills install
|
|
67
|
-
lark-fe-skills
|
|
66
|
+
lark-fe-skills path <skill-name>
|
|
67
|
+
lark-fe-skills install
|
|
68
|
+
lark-fe-skills install <skill-name>
|
|
69
|
+
lark-fe-skills uninstall
|
|
70
|
+
lark-fe-skills uninstall <skill-name>
|
|
68
71
|
lark-fe-skills uninstall lark-fe-task
|
|
69
72
|
```
|
|
70
73
|
|
|
@@ -73,12 +76,13 @@ lark-fe-skills uninstall lark-fe-task
|
|
|
73
76
|
| Skill | Description |
|
|
74
77
|
| --- | --- |
|
|
75
78
|
| `prd-fe-task` | Turn Lark/Feishu requirement documents into concrete frontend task breakdowns. |
|
|
79
|
+
| `prd-fe-schedule` | Preview Lark Base schedule records from generated frontend task Markdown. |
|
|
76
80
|
|
|
77
81
|
## 📝 Notes
|
|
78
82
|
|
|
79
83
|
- npm installation and Codex skill installation are separate steps.
|
|
80
84
|
- This package installs skills to `~/.codex/skills`.
|
|
81
|
-
- Use `lark-fe-skills uninstall
|
|
85
|
+
- Use `lark-fe-skills uninstall` to reset local Codex skill installation for first-run testing.
|
|
82
86
|
- Use `lark-fe-skills uninstall lark-fe-task` to remove the legacy install directory.
|
|
83
87
|
- Existing Lark skills may live under `~/.agents/skills`; that is a different source.
|
|
84
88
|
|
|
@@ -91,11 +95,15 @@ lark-fe-skills uninstall lark-fe-task
|
|
|
91
95
|
- [x] Inspect configured frontend project paths lightly for code-location clues.
|
|
92
96
|
- [x] Generate ignored Markdown task files under the configured output directory.
|
|
93
97
|
- [ ] Phase 2: Create Lark schedule tasks from generated frontend task Markdown.
|
|
94
|
-
- [
|
|
95
|
-
- [
|
|
96
|
-
- [
|
|
97
|
-
- [
|
|
98
|
-
- [
|
|
98
|
+
- [x] Add `prd-fe-schedule` dry-run skill.
|
|
99
|
+
- [x] Add YAML schedule profiles with comments for configurable fields, defaults, and record rules.
|
|
100
|
+
- [x] Accept a Lark schedule Base URL or title, then read its table schema before generating a profile.
|
|
101
|
+
- [x] Map Markdown tasks into schedule fields using profile rules instead of hard-coded company task types.
|
|
102
|
+
- [x] Configure and remember task classification rules with `+config-types`.
|
|
103
|
+
- [x] Read custom task status/type options from the Base instead of inventing tags.
|
|
104
|
+
- [x] Support dry-run previews from a profile without modifying Lark.
|
|
105
|
+
- [x] Reduce token usage by printing compact dry-run summaries and writing full previews to local temp files.
|
|
106
|
+
- [x] Add an explicit `+create` helper that requires confirmation/`--yes` before writing records.
|
|
99
107
|
- [ ] Phase 3: Implement frontend tasks from generated Markdown.
|
|
100
108
|
- [ ] Default to implementing one task at a time to keep human review small and manageable.
|
|
101
109
|
- [ ] After each task, stop and report changed files, verification results, remaining tasks, mocks used, and unresolved questions.
|
|
@@ -120,7 +128,7 @@ lark-fe-skills uninstall lark-fe-task
|
|
|
120
128
|
|
|
121
129
|
`@renkosky/lark-fe-skills` 用于分发基于 Lark/飞书的前端需求工作流 Codex skills。
|
|
122
130
|
|
|
123
|
-
|
|
131
|
+
首个工作流包含 `prd-fe-task` 和 `prd-fe-schedule`:前者生成前端任务拆分,后者基于任务 Markdown 生成 Lark Base 排期 dry-run 预览。
|
|
124
132
|
|
|
125
133
|
## 🚀 安装
|
|
126
134
|
|
|
@@ -130,10 +138,10 @@ lark-fe-skills uninstall lark-fe-task
|
|
|
130
138
|
npm install -g @renkosky/lark-fe-skills
|
|
131
139
|
```
|
|
132
140
|
|
|
133
|
-
2. 安装
|
|
141
|
+
2. 安装 Codex skills:
|
|
134
142
|
|
|
135
143
|
```bash
|
|
136
|
-
lark-fe-skills install
|
|
144
|
+
lark-fe-skills install
|
|
137
145
|
```
|
|
138
146
|
|
|
139
147
|
3. 重启 Codex 或新开一个 Codex 会话。
|
|
@@ -141,7 +149,7 @@ lark-fe-skills install prd-fe-task
|
|
|
141
149
|
PATH fallback:
|
|
142
150
|
|
|
143
151
|
```bash
|
|
144
|
-
npm exec --package=@renkosky/lark-fe-skills -- lark-fe-skills install
|
|
152
|
+
npm exec --package=@renkosky/lark-fe-skills -- lark-fe-skills install
|
|
145
153
|
```
|
|
146
154
|
|
|
147
155
|
在 Codex 中使用:
|
|
@@ -153,9 +161,10 @@ npm exec --package=@renkosky/lark-fe-skills -- lark-fe-skills install prd-fe-tas
|
|
|
153
161
|
|
|
154
162
|
## 🧰 前置条件
|
|
155
163
|
|
|
156
|
-
|
|
164
|
+
先准备 Node.js,并安装配置 `lark-cli`:
|
|
157
165
|
|
|
158
166
|
```bash
|
|
167
|
+
npm --version
|
|
159
168
|
npm install -g @larksuite/cli
|
|
160
169
|
lark-cli config init
|
|
161
170
|
lark-cli auth login --recommend
|
|
@@ -168,9 +177,11 @@ lark-cli auth login --recommend
|
|
|
168
177
|
```bash
|
|
169
178
|
lark-fe-skills list
|
|
170
179
|
lark-fe-skills path
|
|
171
|
-
lark-fe-skills path
|
|
172
|
-
lark-fe-skills install
|
|
173
|
-
lark-fe-skills
|
|
180
|
+
lark-fe-skills path <skill-name>
|
|
181
|
+
lark-fe-skills install
|
|
182
|
+
lark-fe-skills install <skill-name>
|
|
183
|
+
lark-fe-skills uninstall
|
|
184
|
+
lark-fe-skills uninstall <skill-name>
|
|
174
185
|
lark-fe-skills uninstall lark-fe-task
|
|
175
186
|
```
|
|
176
187
|
|
|
@@ -179,12 +190,13 @@ lark-fe-skills uninstall lark-fe-task
|
|
|
179
190
|
| Skill | 说明 |
|
|
180
191
|
| --- | --- |
|
|
181
192
|
| `prd-fe-task` | 将 Lark/飞书需求文档拆解成可开发的前端任务。 |
|
|
193
|
+
| `prd-fe-schedule` | 根据前端任务 Markdown 预览 Lark Base 排期记录。 |
|
|
182
194
|
|
|
183
195
|
## 📝 说明
|
|
184
196
|
|
|
185
197
|
- npm 包安装和 Codex skill 安装是两步。
|
|
186
198
|
- 本包默认安装到 `~/.codex/skills`。
|
|
187
|
-
- 可以用 `lark-fe-skills uninstall
|
|
199
|
+
- 可以用 `lark-fe-skills uninstall` 清理本地 Codex skills,方便测试首次安装流程。
|
|
188
200
|
- 可以用 `lark-fe-skills uninstall lark-fe-task` 清理旧版安装目录。
|
|
189
201
|
- 已有 Lark skills 可能位于 `~/.agents/skills`,这是另一类来源。
|
|
190
202
|
|
|
@@ -197,22 +209,26 @@ lark-fe-skills uninstall lark-fe-task
|
|
|
197
209
|
- [x] 轻量检查已配置前端项目路径,补充代码定位线索。
|
|
198
210
|
- [x] 在已配置输出目录下生成被 git 忽略的 Markdown 任务文件。
|
|
199
211
|
- [ ] Phase 2:把已生成的前端任务 Markdown 转成 Lark 排期任务。
|
|
200
|
-
- [
|
|
201
|
-
- [
|
|
202
|
-
- [
|
|
203
|
-
- [
|
|
204
|
-
- [
|
|
212
|
+
- [x] 新增 `prd-fe-schedule` dry-run skill。
|
|
213
|
+
- [x] 新增带注释的 YAML schedule profile,用于配置字段、默认值和记录生成规则。
|
|
214
|
+
- [x] 支持用户提供 Lark 排期 Base 链接或名称,并在生成 profile 前读取表结构。
|
|
215
|
+
- [x] 根据 profile 规则映射 Markdown 任务,不再写死某家公司任务类型。
|
|
216
|
+
- [x] 支持通过 `+config-types` 配置并记住任务分类规则。
|
|
217
|
+
- [x] 从 Base 读取自定义任务状态/类型选项,不臆造 tag。
|
|
218
|
+
- [x] 支持基于 profile 的 dry-run 预览,不修改 Lark。
|
|
219
|
+
- [x] 默认输出精简 dry-run 摘要,并把完整预览写入本地临时文件,降低 token 消耗。
|
|
220
|
+
- [x] 新增显式 `+create` helper,要求确认/`--yes` 后才写入记录。
|
|
205
221
|
- [ ] Phase 3:根据已生成的 Markdown 实际开发前端任务。
|
|
206
222
|
- [ ] 默认一次只实现一个 Task,控制代码改动粒度,方便人工 review。
|
|
207
223
|
- [ ] 每完成一个 Task 就暂停,并汇报改动文件、验证结果、剩余任务、使用的 mock 和未解决问题。
|
|
208
224
|
- [ ] 只有用户明确要求继续,或明确要求一次实现多个任务时,才继续处理后续 Task。
|
|
209
225
|
- [ ] 如果单个 Task 本身过大,先拆成更小的实现批次再改代码。
|
|
210
226
|
- [ ] 优先复用项目里已有的接口、hooks、stores、组件、权限、i18n 和 mock 模式,再考虑新增实现。
|
|
211
|
-
- [ ]
|
|
227
|
+
- [ ] 这一阶段不做真实后端接口对接;接口行为不可用时,优先使用已有可复用数据或项目 mock 体系。
|
|
212
228
|
- [ ] 如果 API 字段、权限 key、状态枚举或核心产品行为在代码里找不到,要先询问用户,不臆造。
|
|
213
229
|
- [ ] 代码改动只限制在任务 Markdown 标出的受影响项目路径和模块内。
|
|
214
230
|
- [ ] 每完成一个 Task 后运行最相关的静态检查,并明确说明是否存在无关历史失败。
|
|
215
|
-
- [ ] Phase 4
|
|
231
|
+
- [ ] Phase 4:接口对接与后端交付文档工作流。
|
|
216
232
|
- [ ] 这部分在后端接口交付格式统一前保持待定。
|
|
217
233
|
- [ ] 预期方向:继续使用 Lark 作为接口交付和协作载体。
|
|
218
234
|
- [ ] 实施前需要先和后端约定文档格式,包括接口地址、请求方法、请求参数、响应结构、错误码、mock 示例和负责人。
|
package/bin/lark-fe-skills.js
CHANGED
|
@@ -8,8 +8,11 @@ import { homedir } from 'node:os'
|
|
|
8
8
|
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
9
9
|
const packageRoot = resolve(__dirname, '..')
|
|
10
10
|
const skillsRoot = join(packageRoot, 'skills')
|
|
11
|
-
const packagedSkills = ['prd-fe-task']
|
|
11
|
+
const packagedSkills = ['prd-fe-task', 'prd-fe-schedule']
|
|
12
12
|
const uninstallableSkills = [...packagedSkills, 'lark-fe-task']
|
|
13
|
+
const skillRuntimeDependencies = {
|
|
14
|
+
'prd-fe-schedule': ['yaml'],
|
|
15
|
+
}
|
|
13
16
|
|
|
14
17
|
function usage() {
|
|
15
18
|
console.log(`lark-fe-skills
|
|
@@ -23,14 +26,14 @@ Usage:
|
|
|
23
26
|
Commands:
|
|
24
27
|
list List packaged skills.
|
|
25
28
|
path Print the package skills directory or one skill path.
|
|
26
|
-
install Copy
|
|
27
|
-
uninstall Remove
|
|
29
|
+
install Copy all packaged skills, or one named skill, to $HOME/.codex/skills.
|
|
30
|
+
uninstall Remove all packaged skills, or one named skill, from $HOME/.codex/skills.
|
|
28
31
|
|
|
29
32
|
Examples:
|
|
30
33
|
lark-fe-skills list
|
|
31
34
|
lark-fe-skills path prd-fe-task
|
|
32
|
-
lark-fe-skills install
|
|
33
|
-
lark-fe-skills uninstall
|
|
35
|
+
lark-fe-skills install
|
|
36
|
+
lark-fe-skills uninstall
|
|
34
37
|
lark-fe-skills uninstall lark-fe-task`)
|
|
35
38
|
}
|
|
36
39
|
|
|
@@ -58,7 +61,7 @@ function printPath(skillName) {
|
|
|
58
61
|
console.log(skillsRoot)
|
|
59
62
|
}
|
|
60
63
|
|
|
61
|
-
function
|
|
64
|
+
function installOneSkill(skillName) {
|
|
62
65
|
assertSkillName(skillName)
|
|
63
66
|
|
|
64
67
|
const source = join(skillsRoot, skillName)
|
|
@@ -76,10 +79,33 @@ function installSkill(skillName = 'prd-fe-task') {
|
|
|
76
79
|
}
|
|
77
80
|
cpSync(source, target, { recursive: true, force: true })
|
|
78
81
|
|
|
82
|
+
for (const dependencyName of skillRuntimeDependencies[skillName] || []) {
|
|
83
|
+
const dependencySource = join(packageRoot, 'node_modules', dependencyName)
|
|
84
|
+
const dependencyTarget = join(target, 'node_modules', dependencyName)
|
|
85
|
+
if (!existsSync(dependencySource)) {
|
|
86
|
+
console.error(`Runtime dependency not found: ${dependencyName}`)
|
|
87
|
+
console.error('Run npm install in the package before installing this skill.')
|
|
88
|
+
process.exit(1)
|
|
89
|
+
}
|
|
90
|
+
mkdirSync(dirname(dependencyTarget), { recursive: true })
|
|
91
|
+
cpSync(dependencySource, dependencyTarget, { recursive: true, force: true })
|
|
92
|
+
}
|
|
93
|
+
|
|
79
94
|
console.log(`Installed ${skillName} to ${target}`)
|
|
80
95
|
}
|
|
81
96
|
|
|
82
|
-
function
|
|
97
|
+
function installSkill(skillName) {
|
|
98
|
+
if (skillName) {
|
|
99
|
+
installOneSkill(skillName)
|
|
100
|
+
return
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
for (const packagedSkill of packagedSkills) {
|
|
104
|
+
installOneSkill(packagedSkill)
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function uninstallOneSkill(skillName) {
|
|
83
109
|
assertSkillName(skillName, uninstallableSkills)
|
|
84
110
|
|
|
85
111
|
const target = join(homedir(), '.codex', 'skills', skillName)
|
|
@@ -93,6 +119,17 @@ function uninstallSkill(skillName = 'prd-fe-task') {
|
|
|
93
119
|
console.log(`Uninstalled ${skillName} from ${target}`)
|
|
94
120
|
}
|
|
95
121
|
|
|
122
|
+
function uninstallSkill(skillName) {
|
|
123
|
+
if (skillName) {
|
|
124
|
+
uninstallOneSkill(skillName)
|
|
125
|
+
return
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
for (const packagedSkill of packagedSkills) {
|
|
129
|
+
uninstallOneSkill(packagedSkill)
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
96
133
|
const [command, skillName] = process.argv.slice(2)
|
|
97
134
|
|
|
98
135
|
switch (command) {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
Copyright Eemeli Aro <eemeli@gmail.com>
|
|
2
|
+
|
|
3
|
+
Permission to use, copy, modify, and/or distribute this software for any purpose
|
|
4
|
+
with or without fee is hereby granted, provided that the above copyright notice
|
|
5
|
+
and this permission notice appear in all copies.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
|
8
|
+
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
|
|
9
|
+
FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
10
|
+
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
|
|
11
|
+
OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
|
|
12
|
+
TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF
|
|
13
|
+
THIS SOFTWARE.
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# YAML <a href="https://www.npmjs.com/package/yaml"><img align="right" src="https://badge.fury.io/js/yaml.svg" title="npm package" /></a>
|
|
2
|
+
|
|
3
|
+
`yaml` is a definitive library for [YAML](https://yaml.org/), the human friendly data serialization standard.
|
|
4
|
+
This library:
|
|
5
|
+
|
|
6
|
+
- Supports both YAML 1.1 and YAML 1.2 and all common data schemas,
|
|
7
|
+
- Passes all of the [yaml-test-suite](https://github.com/yaml/yaml-test-suite) tests,
|
|
8
|
+
- Can accept any string as input without throwing, parsing as much YAML out of it as it can, and
|
|
9
|
+
- Supports parsing, modifying, and writing YAML comments and blank lines.
|
|
10
|
+
|
|
11
|
+
The library is released under the ISC open source license, and the code is [available on GitHub](https://github.com/eemeli/yaml/).
|
|
12
|
+
It has no external dependencies and runs on Node.js as well as modern browsers.
|
|
13
|
+
|
|
14
|
+
For the purposes of versioning, any changes that break any of the documented endpoints or APIs will be considered semver-major breaking changes.
|
|
15
|
+
Undocumented library internals may change between minor versions, and previous APIs may be deprecated (but not removed).
|
|
16
|
+
|
|
17
|
+
The minimum supported TypeScript version of the included typings is 3.9;
|
|
18
|
+
for use in earlier versions you may need to set `skipLibCheck: true` in your config.
|
|
19
|
+
This requirement may be updated between minor versions of the library.
|
|
20
|
+
|
|
21
|
+
For more information, see the project's documentation site: [**eemeli.org/yaml**](https://eemeli.org/yaml/)
|
|
22
|
+
|
|
23
|
+
For build instructions and contribution guidelines, see [docs/CONTRIBUTING.md](docs/CONTRIBUTING.md).
|
|
24
|
+
|
|
25
|
+
To install:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
npm install yaml
|
|
29
|
+
# or
|
|
30
|
+
deno add jsr:@eemeli/yaml
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
**Note:** These docs are for `yaml@2`. For v1, see the [v1.10.0 tag](https://github.com/eemeli/yaml/tree/v1.10.0) for the source and [eemeli.org/yaml/v1](https://eemeli.org/yaml/v1/) for the documentation.
|
|
34
|
+
|
|
35
|
+
## API Overview
|
|
36
|
+
|
|
37
|
+
The API provided by `yaml` has three layers, depending on how deep you need to go: [Parse & Stringify](https://eemeli.org/yaml/#parse-amp-stringify), [Documents](https://eemeli.org/yaml/#documents), and the underlying [Lexer/Parser/Composer](https://eemeli.org/yaml/#parsing-yaml).
|
|
38
|
+
The first has the simplest API and "just works", the second gets you all the bells and whistles supported by the library along with a decent [AST](https://eemeli.org/yaml/#content-nodes), and the third lets you get progressively closer to YAML source, if that's your thing.
|
|
39
|
+
|
|
40
|
+
A [command-line tool](https://eemeli.org/yaml/#command-line-tool) is also included.
|
|
41
|
+
|
|
42
|
+
### Parse & Stringify
|
|
43
|
+
|
|
44
|
+
```js
|
|
45
|
+
import { parse, stringify } from 'yaml'
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
- [`parse(str, reviver?, options?): value`](https://eemeli.org/yaml/#yaml-parse)
|
|
49
|
+
- [`stringify(value, replacer?, options?): string`](https://eemeli.org/yaml/#yaml-stringify)
|
|
50
|
+
|
|
51
|
+
### Documents
|
|
52
|
+
|
|
53
|
+
<!-- prettier-ignore -->
|
|
54
|
+
```js
|
|
55
|
+
import {
|
|
56
|
+
Document,
|
|
57
|
+
isDocument,
|
|
58
|
+
parseAllDocuments,
|
|
59
|
+
parseDocument
|
|
60
|
+
} from 'yaml'
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
- [`Document`](https://eemeli.org/yaml/#documents)
|
|
64
|
+
- [`constructor(value, replacer?, options?)`](https://eemeli.org/yaml/#creating-documents)
|
|
65
|
+
- [`#contents`](https://eemeli.org/yaml/#content-nodes)
|
|
66
|
+
- [`#directives`](https://eemeli.org/yaml/#stream-directives)
|
|
67
|
+
- [`#errors`](https://eemeli.org/yaml/#errors)
|
|
68
|
+
- [`#warnings`](https://eemeli.org/yaml/#errors)
|
|
69
|
+
- [`isDocument(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
70
|
+
- [`parseAllDocuments(str, options?): Document[]`](https://eemeli.org/yaml/#parsing-documents)
|
|
71
|
+
- [`parseDocument(str, options?): Document`](https://eemeli.org/yaml/#parsing-documents)
|
|
72
|
+
|
|
73
|
+
### Content Nodes
|
|
74
|
+
|
|
75
|
+
<!-- prettier-ignore -->
|
|
76
|
+
```js
|
|
77
|
+
import {
|
|
78
|
+
isAlias, isCollection, isMap, isNode,
|
|
79
|
+
isPair, isScalar, isSeq, Scalar,
|
|
80
|
+
visit, visitAsync, YAMLMap, YAMLSeq
|
|
81
|
+
} from 'yaml'
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- [`isAlias(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
85
|
+
- [`isCollection(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
86
|
+
- [`isMap(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
87
|
+
- [`isNode(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
88
|
+
- [`isPair(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
89
|
+
- [`isScalar(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
90
|
+
- [`isSeq(foo): boolean`](https://eemeli.org/yaml/#identifying-node-types)
|
|
91
|
+
- [`new Scalar(value)`](https://eemeli.org/yaml/#scalar-values)
|
|
92
|
+
- [`new YAMLMap()`](https://eemeli.org/yaml/#collections)
|
|
93
|
+
- [`new YAMLSeq()`](https://eemeli.org/yaml/#collections)
|
|
94
|
+
- [`doc.createAlias(node, name?): Alias`](https://eemeli.org/yaml/#creating-nodes)
|
|
95
|
+
- [`doc.createNode(value, options?): Node`](https://eemeli.org/yaml/#creating-nodes)
|
|
96
|
+
- [`doc.createPair(key, value): Pair`](https://eemeli.org/yaml/#creating-nodes)
|
|
97
|
+
- [`visit(node, visitor)`](https://eemeli.org/yaml/#finding-and-modifying-nodes)
|
|
98
|
+
- [`visitAsync(node, visitor)`](https://eemeli.org/yaml/#finding-and-modifying-nodes)
|
|
99
|
+
|
|
100
|
+
### Parsing YAML
|
|
101
|
+
|
|
102
|
+
```js
|
|
103
|
+
import { Composer, Lexer, Parser } from 'yaml'
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
- [`new Lexer().lex(src)`](https://eemeli.org/yaml/#lexer)
|
|
107
|
+
- [`new Parser(onNewLine?).parse(src)`](https://eemeli.org/yaml/#parser)
|
|
108
|
+
- [`new Composer(options?).compose(tokens)`](https://eemeli.org/yaml/#composer)
|
|
109
|
+
|
|
110
|
+
## YAML.parse
|
|
111
|
+
|
|
112
|
+
```yaml
|
|
113
|
+
# file.yml
|
|
114
|
+
YAML:
|
|
115
|
+
- A human-readable data serialization language
|
|
116
|
+
- https://en.wikipedia.org/wiki/YAML
|
|
117
|
+
yaml:
|
|
118
|
+
- A complete JavaScript implementation
|
|
119
|
+
- https://www.npmjs.com/package/yaml
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
```js
|
|
123
|
+
import fs from 'fs'
|
|
124
|
+
import YAML from 'yaml'
|
|
125
|
+
|
|
126
|
+
YAML.parse('3.14159')
|
|
127
|
+
// 3.14159
|
|
128
|
+
|
|
129
|
+
YAML.parse('[ true, false, maybe, null ]\n')
|
|
130
|
+
// [ true, false, 'maybe', null ]
|
|
131
|
+
|
|
132
|
+
const file = fs.readFileSync('./file.yml', 'utf8')
|
|
133
|
+
YAML.parse(file)
|
|
134
|
+
// { YAML:
|
|
135
|
+
// [ 'A human-readable data serialization language',
|
|
136
|
+
// 'https://en.wikipedia.org/wiki/YAML' ],
|
|
137
|
+
// yaml:
|
|
138
|
+
// [ 'A complete JavaScript implementation',
|
|
139
|
+
// 'https://www.npmjs.com/package/yaml' ] }
|
|
140
|
+
```
|
|
141
|
+
|
|
142
|
+
## YAML.stringify
|
|
143
|
+
|
|
144
|
+
```js
|
|
145
|
+
import YAML from 'yaml'
|
|
146
|
+
|
|
147
|
+
YAML.stringify(3.14159)
|
|
148
|
+
// '3.14159\n'
|
|
149
|
+
|
|
150
|
+
YAML.stringify([true, false, 'maybe', null])
|
|
151
|
+
// `- true
|
|
152
|
+
// - false
|
|
153
|
+
// - maybe
|
|
154
|
+
// - null
|
|
155
|
+
// `
|
|
156
|
+
|
|
157
|
+
YAML.stringify({ number: 3, plain: 'string', block: 'two\nlines\n' })
|
|
158
|
+
// `number: 3
|
|
159
|
+
// plain: string
|
|
160
|
+
// block: |
|
|
161
|
+
// two
|
|
162
|
+
// lines
|
|
163
|
+
// `
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
Browser testing provided by:
|
|
169
|
+
|
|
170
|
+
<a href="https://www.browserstack.com/open-source">
|
|
171
|
+
<img width=200 src="https://eemeli.org/yaml/images/browserstack.svg" alt="BrowserStack" />
|
|
172
|
+
</a>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { UserError, cli, help } from './dist/cli.mjs'
|
|
4
|
+
|
|
5
|
+
cli(process.stdin, error => {
|
|
6
|
+
if (error instanceof UserError) {
|
|
7
|
+
if (error.code === UserError.ARGS) console.error(`${help}\n`)
|
|
8
|
+
console.error(error.message)
|
|
9
|
+
process.exitCode = error.code
|
|
10
|
+
} else if (error) throw error
|
|
11
|
+
})
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { isNode } from '../nodes/identity.js';
|
|
2
|
+
import { Scalar } from '../nodes/Scalar.js';
|
|
3
|
+
import { YAMLMap } from '../nodes/YAMLMap.js';
|
|
4
|
+
import { YAMLSeq } from '../nodes/YAMLSeq.js';
|
|
5
|
+
import { resolveBlockMap } from './resolve-block-map.js';
|
|
6
|
+
import { resolveBlockSeq } from './resolve-block-seq.js';
|
|
7
|
+
import { resolveFlowCollection } from './resolve-flow-collection.js';
|
|
8
|
+
|
|
9
|
+
function resolveCollection(CN, ctx, token, onError, tagName, tag) {
|
|
10
|
+
const coll = token.type === 'block-map'
|
|
11
|
+
? resolveBlockMap(CN, ctx, token, onError, tag)
|
|
12
|
+
: token.type === 'block-seq'
|
|
13
|
+
? resolveBlockSeq(CN, ctx, token, onError, tag)
|
|
14
|
+
: resolveFlowCollection(CN, ctx, token, onError, tag);
|
|
15
|
+
const Coll = coll.constructor;
|
|
16
|
+
// If we got a tagName matching the class, or the tag name is '!',
|
|
17
|
+
// then use the tagName from the node class used to create it.
|
|
18
|
+
if (tagName === '!' || tagName === Coll.tagName) {
|
|
19
|
+
coll.tag = Coll.tagName;
|
|
20
|
+
return coll;
|
|
21
|
+
}
|
|
22
|
+
if (tagName)
|
|
23
|
+
coll.tag = tagName;
|
|
24
|
+
return coll;
|
|
25
|
+
}
|
|
26
|
+
function composeCollection(CN, ctx, token, props, onError) {
|
|
27
|
+
const tagToken = props.tag;
|
|
28
|
+
const tagName = !tagToken
|
|
29
|
+
? null
|
|
30
|
+
: ctx.directives.tagName(tagToken.source, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg));
|
|
31
|
+
if (token.type === 'block-seq') {
|
|
32
|
+
const { anchor, newlineAfterProp: nl } = props;
|
|
33
|
+
const lastProp = anchor && tagToken
|
|
34
|
+
? anchor.offset > tagToken.offset
|
|
35
|
+
? anchor
|
|
36
|
+
: tagToken
|
|
37
|
+
: (anchor ?? tagToken);
|
|
38
|
+
if (lastProp && (!nl || nl.offset < lastProp.offset)) {
|
|
39
|
+
const message = 'Missing newline after block sequence props';
|
|
40
|
+
onError(lastProp, 'MISSING_CHAR', message);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const expType = token.type === 'block-map'
|
|
44
|
+
? 'map'
|
|
45
|
+
: token.type === 'block-seq'
|
|
46
|
+
? 'seq'
|
|
47
|
+
: token.start.source === '{'
|
|
48
|
+
? 'map'
|
|
49
|
+
: 'seq';
|
|
50
|
+
// shortcut: check if it's a generic YAMLMap or YAMLSeq
|
|
51
|
+
// before jumping into the custom tag logic.
|
|
52
|
+
if (!tagToken ||
|
|
53
|
+
!tagName ||
|
|
54
|
+
tagName === '!' ||
|
|
55
|
+
(tagName === YAMLMap.tagName && expType === 'map') ||
|
|
56
|
+
(tagName === YAMLSeq.tagName && expType === 'seq')) {
|
|
57
|
+
return resolveCollection(CN, ctx, token, onError, tagName);
|
|
58
|
+
}
|
|
59
|
+
let tag = ctx.schema.tags.find(t => t.tag === tagName && t.collection === expType);
|
|
60
|
+
if (!tag) {
|
|
61
|
+
const kt = ctx.schema.knownTags[tagName];
|
|
62
|
+
if (kt?.collection === expType) {
|
|
63
|
+
ctx.schema.tags.push(Object.assign({}, kt, { default: false }));
|
|
64
|
+
tag = kt;
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
if (kt) {
|
|
68
|
+
onError(tagToken, 'BAD_COLLECTION_TYPE', `${kt.tag} used for ${expType} collection, but expects ${kt.collection ?? 'scalar'}`, true);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
onError(tagToken, 'TAG_RESOLVE_FAILED', `Unresolved tag: ${tagName}`, true);
|
|
72
|
+
}
|
|
73
|
+
return resolveCollection(CN, ctx, token, onError, tagName);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const coll = resolveCollection(CN, ctx, token, onError, tagName, tag);
|
|
77
|
+
const res = tag.resolve?.(coll, msg => onError(tagToken, 'TAG_RESOLVE_FAILED', msg), ctx.options) ?? coll;
|
|
78
|
+
const node = isNode(res)
|
|
79
|
+
? res
|
|
80
|
+
: new Scalar(res);
|
|
81
|
+
node.range = coll.range;
|
|
82
|
+
node.tag = tagName;
|
|
83
|
+
if (tag?.format)
|
|
84
|
+
node.format = tag.format;
|
|
85
|
+
return node;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export { composeCollection };
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Document } from '../doc/Document.js';
|
|
2
|
+
import { composeNode, composeEmptyNode } from './compose-node.js';
|
|
3
|
+
import { resolveEnd } from './resolve-end.js';
|
|
4
|
+
import { resolveProps } from './resolve-props.js';
|
|
5
|
+
|
|
6
|
+
function composeDoc(options, directives, { offset, start, value, end }, onError) {
|
|
7
|
+
const opts = Object.assign({ _directives: directives }, options);
|
|
8
|
+
const doc = new Document(undefined, opts);
|
|
9
|
+
const ctx = {
|
|
10
|
+
atKey: false,
|
|
11
|
+
atRoot: true,
|
|
12
|
+
directives: doc.directives,
|
|
13
|
+
options: doc.options,
|
|
14
|
+
schema: doc.schema
|
|
15
|
+
};
|
|
16
|
+
const props = resolveProps(start, {
|
|
17
|
+
indicator: 'doc-start',
|
|
18
|
+
next: value ?? end?.[0],
|
|
19
|
+
offset,
|
|
20
|
+
onError,
|
|
21
|
+
parentIndent: 0,
|
|
22
|
+
startOnNewline: true
|
|
23
|
+
});
|
|
24
|
+
if (props.found) {
|
|
25
|
+
doc.directives.docStart = true;
|
|
26
|
+
if (value &&
|
|
27
|
+
(value.type === 'block-map' || value.type === 'block-seq') &&
|
|
28
|
+
!props.hasNewline)
|
|
29
|
+
onError(props.end, 'MISSING_CHAR', 'Block collection cannot start on same line with directives-end marker');
|
|
30
|
+
}
|
|
31
|
+
// @ts-expect-error If Contents is set, let's trust the user
|
|
32
|
+
doc.contents = value
|
|
33
|
+
? composeNode(ctx, value, props, onError)
|
|
34
|
+
: composeEmptyNode(ctx, props.end, start, null, props, onError);
|
|
35
|
+
const contentEnd = doc.contents.range[2];
|
|
36
|
+
const re = resolveEnd(end, contentEnd, false, onError);
|
|
37
|
+
if (re.comment)
|
|
38
|
+
doc.comment = re.comment;
|
|
39
|
+
doc.range = [offset, contentEnd, re.offset];
|
|
40
|
+
return doc;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export { composeDoc };
|