@chenguangyao/devflow-kit 0.1.43

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.
Files changed (198) hide show
  1. package/CHANGELOG.md +232 -0
  2. package/LICENSE +21 -0
  3. package/README.md +539 -0
  4. package/bin/devflow.js +9 -0
  5. package/docs/RFC-001-devflow-kit.md +617 -0
  6. package/docs/RFC-002-workflow-kernel.md +134 -0
  7. package/docs/enterprise-integration-supplement.md +274 -0
  8. package/docs/internal-gitlab-setup.md +426 -0
  9. package/docs/marketplace-skills.md +231 -0
  10. package/docs/migration-from-arb.md +232 -0
  11. package/docs/tooling-overview.md +774 -0
  12. package/docs/workflow-orchestration.md +695 -0
  13. package/docs/workflow-ui-prototype.html +271 -0
  14. package/package.json +52 -0
  15. package/schemas/config.schema.json +51 -0
  16. package/schemas/delta.schema.json +22 -0
  17. package/schemas/state.schema.json +130 -0
  18. package/schemas/status-surface.schema.json +197 -0
  19. package/schemas/workflow-confirmation-surface.schema.json +70 -0
  20. package/schemas/workflow-picker.schema.json +94 -0
  21. package/scripts/postinstall.js +101 -0
  22. package/scripts/render-workflow-ui-prototype.js +271 -0
  23. package/skills/apply/SKILL.md +313 -0
  24. package/skills/apply/references/discipline-checklist.md +145 -0
  25. package/skills/apply/references/subagent-implementer-prompt.md +113 -0
  26. package/skills/apply/references/subagent-orchestration.md +150 -0
  27. package/skills/apply/references/subagent-reviewer-prompt.md +180 -0
  28. package/skills/apply/references/tdd-loop.md +287 -0
  29. package/skills/apply/references/when-plan-is-wrong.md +279 -0
  30. package/skills/apply/references/worktree-swarm.md +292 -0
  31. package/skills/archive/SKILL.md +229 -0
  32. package/skills/archive/references/conflict-resolution.md +336 -0
  33. package/skills/archive/references/knowledge-deposit.md +381 -0
  34. package/skills/archive/references/spec-merge.md +365 -0
  35. package/skills/brainstorm/SKILL.md +123 -0
  36. package/skills/brainstorm/references/proposal-template.md +244 -0
  37. package/skills/brainstorm/references/question-catalog.md +168 -0
  38. package/skills/brainstorm/references/session-template.md +184 -0
  39. package/skills/ci-fix/SKILL.md +63 -0
  40. package/skills/ci-fix/references/loop.md +25 -0
  41. package/skills/code-review/SKILL.md +279 -0
  42. package/skills/code-review/references/escalation-playbook.md +192 -0
  43. package/skills/code-review/references/language-cheatsheets/go.md +175 -0
  44. package/skills/code-review/references/language-cheatsheets/java-spring-mybatis.md +246 -0
  45. package/skills/code-review/references/language-cheatsheets/python.md +170 -0
  46. package/skills/code-review/references/language-cheatsheets/vue.md +199 -0
  47. package/skills/code-review/references/output-template.md +275 -0
  48. package/skills/code-review/references/review-checklist.md +251 -0
  49. package/skills/complexity-grading/SKILL.md +259 -0
  50. package/skills/deliver/SKILL.md +271 -0
  51. package/skills/deliver/references/delivery-modes.md +299 -0
  52. package/skills/deliver/references/notify.md +359 -0
  53. package/skills/deliver/references/pr-description.md +319 -0
  54. package/skills/dependency-upgrade/SKILL.md +57 -0
  55. package/skills/dependency-upgrade/references/risk-matrix.md +38 -0
  56. package/skills/df-orchestrator/SKILL.md +407 -0
  57. package/skills/df-orchestrator/references/complexity-grading.md +177 -0
  58. package/skills/df-orchestrator/references/escalation-matrix.md +191 -0
  59. package/skills/df-orchestrator/references/routing-rules.md +290 -0
  60. package/skills/df-orchestrator/references/workflow-state-machine.md +208 -0
  61. package/skills/frontend-quality/SKILL.md +61 -0
  62. package/skills/frontend-quality/references/checklist.md +35 -0
  63. package/skills/handoff-resume/SKILL.md +59 -0
  64. package/skills/handoff-resume/references/handoff-template.md +54 -0
  65. package/skills/plan/SKILL.md +166 -0
  66. package/skills/plan/references/task-breakdown.md +207 -0
  67. package/skills/plan/references/task-sequencing.md +143 -0
  68. package/skills/plan/references/task-template.md +248 -0
  69. package/skills/requirement-analysis/SKILL.md +499 -0
  70. package/skills/requirement-analysis/references/acceptance-criteria.md +183 -0
  71. package/skills/requirement-analysis/references/code-recon.md +151 -0
  72. package/skills/requirement-analysis/references/edge-case-catalog.md +164 -0
  73. package/skills/requirement-analysis/references/requirement-template.md +339 -0
  74. package/skills/requirement-analysis/references/scope-negotiation.md +162 -0
  75. package/skills/security-hardening/SKILL.md +60 -0
  76. package/skills/security-hardening/references/checklist.md +42 -0
  77. package/skills/tech-spec/SKILL.md +388 -0
  78. package/skills/tech-spec/references/api-contract-design.md +172 -0
  79. package/skills/tech-spec/references/decision-records.md +110 -0
  80. package/skills/tech-spec/references/design-template.md +301 -0
  81. package/skills/tech-spec/references/rollout-and-rollback.md +203 -0
  82. package/skills/tech-spec/references/spec-delta-conventions.md +250 -0
  83. package/skills/tech-spec/references/transaction-patterns.md +212 -0
  84. package/skills/test-spec/SKILL.md +219 -0
  85. package/skills/test-spec/references/coverage-strategy.md +218 -0
  86. package/skills/test-spec/references/edge-case-to-test.md +143 -0
  87. package/skills/test-spec/references/test-case-template.md +276 -0
  88. package/skills/verify/SKILL.md +232 -0
  89. package/skills/verify/references/nfr-verification.md +292 -0
  90. package/skills/verify/references/report-templates.md +510 -0
  91. package/skills/verify/references/self-test-guide.md +240 -0
  92. package/skills/verify/references/verify-rollback-map.md +247 -0
  93. package/src/cli/commands/_helpers.js +108 -0
  94. package/src/cli/commands/_submit.js +718 -0
  95. package/src/cli/commands/apply.js +198 -0
  96. package/src/cli/commands/archive.js +180 -0
  97. package/src/cli/commands/checkpoint.js +113 -0
  98. package/src/cli/commands/deliver.js +377 -0
  99. package/src/cli/commands/deploy.js +504 -0
  100. package/src/cli/commands/design.js +158 -0
  101. package/src/cli/commands/disable.js +21 -0
  102. package/src/cli/commands/doctor.js +178 -0
  103. package/src/cli/commands/enable.js +21 -0
  104. package/src/cli/commands/flow.js +645 -0
  105. package/src/cli/commands/help.js +93 -0
  106. package/src/cli/commands/ingest.js +602 -0
  107. package/src/cli/commands/init.js +341 -0
  108. package/src/cli/commands/knowledge.js +523 -0
  109. package/src/cli/commands/logs.js +43 -0
  110. package/src/cli/commands/new.js +202 -0
  111. package/src/cli/commands/plan.js +49 -0
  112. package/src/cli/commands/propose.js +27 -0
  113. package/src/cli/commands/provider.js +698 -0
  114. package/src/cli/commands/report.js +143 -0
  115. package/src/cli/commands/requirement.js +227 -0
  116. package/src/cli/commands/review.js +301 -0
  117. package/src/cli/commands/skills.js +457 -0
  118. package/src/cli/commands/status.js +925 -0
  119. package/src/cli/commands/switch.js +27 -0
  120. package/src/cli/commands/sync.js +47 -0
  121. package/src/cli/commands/test.js +366 -0
  122. package/src/cli/commands/uninstall.js +32 -0
  123. package/src/cli/commands/update.js +74 -0
  124. package/src/cli/commands/verify.js +354 -0
  125. package/src/cli/commands/worktree.js +78 -0
  126. package/src/cli/index.js +72 -0
  127. package/src/cli/parse-args.js +102 -0
  128. package/src/core/autodetect.js +271 -0
  129. package/src/core/change.js +208 -0
  130. package/src/core/checkpoint.js +217 -0
  131. package/src/core/config.js +60 -0
  132. package/src/core/delta.js +290 -0
  133. package/src/core/markers.js +59 -0
  134. package/src/core/paths.js +173 -0
  135. package/src/core/plan-tasks.js +36 -0
  136. package/src/core/project-routing.js +285 -0
  137. package/src/core/projects.js +200 -0
  138. package/src/core/state.js +200 -0
  139. package/src/core/workflow-check.js +177 -0
  140. package/src/core/workflow-init.js +34 -0
  141. package/src/core/workflow-picker.js +154 -0
  142. package/src/core/workflow-policy.js +119 -0
  143. package/src/core/workflow-suggest.js +181 -0
  144. package/src/core/workflow-verify.js +88 -0
  145. package/src/core/workflow.js +433 -0
  146. package/src/core/worktree.js +241 -0
  147. package/src/knowledge/categories.js +107 -0
  148. package/src/knowledge/classify.js +125 -0
  149. package/src/knowledge/deposit.js +414 -0
  150. package/src/knowledge/migrate.js +149 -0
  151. package/src/knowledge/mr.js +219 -0
  152. package/src/knowledge/query.js +131 -0
  153. package/src/knowledge/registry.js +151 -0
  154. package/src/knowledge/sync.js +179 -0
  155. package/src/providers/base.js +74 -0
  156. package/src/providers/drivers/api-yapi.js +78 -0
  157. package/src/providers/drivers/ci-jenkins.js +109 -0
  158. package/src/providers/drivers/intake-confluence.js +544 -0
  159. package/src/providers/drivers/kb-git.js +549 -0
  160. package/src/providers/drivers/kb-weknora.js +472 -0
  161. package/src/providers/drivers/notify-smtp.js +515 -0
  162. package/src/providers/drivers/observability-oss.js +43 -0
  163. package/src/providers/drivers/observability-sls.js +50 -0
  164. package/src/providers/lifecycle.js +135 -0
  165. package/src/providers/loader.js +132 -0
  166. package/src/providers/local.js +190 -0
  167. package/src/providers/userconfig.js +283 -0
  168. package/src/reports/aggregate.js +185 -0
  169. package/src/reports/coverage.js +163 -0
  170. package/src/reports/detect.js +143 -0
  171. package/src/reports/parse.js +236 -0
  172. package/src/templates/files/ci/github.yml +38 -0
  173. package/src/templates/files/ci/gitlab.yml +27 -0
  174. package/src/templates/files/design.md +63 -0
  175. package/src/templates/files/ide/devflow-workflow.md +58 -0
  176. package/src/templates/files/ide/project-overview-reference.md +1 -0
  177. package/src/templates/files/ide/project-overview.md +27 -0
  178. package/src/templates/files/knowledge-index.json +17 -0
  179. package/src/templates/files/knowledge.md +28 -0
  180. package/src/templates/files/meta.json +8 -0
  181. package/src/templates/files/plan.md +38 -0
  182. package/src/templates/files/proposal.md +33 -0
  183. package/src/templates/files/reports/contract-test.md +40 -0
  184. package/src/templates/files/reports/e2e-test.md +30 -0
  185. package/src/templates/files/reports/integration-test.md +36 -0
  186. package/src/templates/files/reports/joint-test.md +58 -0
  187. package/src/templates/files/reports/perf.md +24 -0
  188. package/src/templates/files/reports/regression.md +20 -0
  189. package/src/templates/files/reports/remote-test.md +55 -0
  190. package/src/templates/files/reports/self-test.md +43 -0
  191. package/src/templates/files/reports/smoke-test.md +22 -0
  192. package/src/templates/files/reports/unit-test.md +36 -0
  193. package/src/templates/files/requirement.md +51 -0
  194. package/src/templates/files/review.md +38 -0
  195. package/src/templates/files/tests.md +36 -0
  196. package/src/templates/files/verify.md +32 -0
  197. package/src/templates/index.js +21 -0
  198. package/src/utils/log.js +37 -0
@@ -0,0 +1,178 @@
1
+ 'use strict';
2
+ const fs = require('fs/promises');
3
+ const fsSync = require('fs');
4
+ const path = require('path');
5
+ const log = require('../../utils/log.js');
6
+ const paths = require('../../core/paths.js');
7
+ const config = require('../../core/config.js');
8
+ const change = require('../../core/change.js');
9
+ const state = require('../../core/state.js');
10
+ const providers = require('../../providers/loader.js');
11
+ const lifecycle = require('../../providers/lifecycle.js');
12
+
13
+ const SCOPES = ['env', 'config', 'provider', 'cred', 'change', 'knowledge', 'overview', 'git'];
14
+
15
+ async function audit(root, scopes) {
16
+ const wanted = (scopes && scopes.length) ? scopes : SCOPES;
17
+ const findings = [];
18
+ for (const scope of wanted) {
19
+ if (!SCOPES.includes(scope)) {
20
+ findings.push({ scope, level: 'warn', msg: `unknown scope: ${scope}` });
21
+ continue;
22
+ }
23
+ const fn = checkers[scope];
24
+ try {
25
+ const items = await fn(root);
26
+ for (const it of items) findings.push({ scope, ...it });
27
+ } catch (e) {
28
+ findings.push({ scope, level: 'error', msg: `check failed: ${e.message}` });
29
+ }
30
+ }
31
+ const errors = findings.filter((f) => f.level === 'error').length;
32
+ const warns = findings.filter((f) => f.level === 'warn').length;
33
+ return { findings, errors, warns };
34
+ }
35
+
36
+ async function run({ flags = {}, cwd }) {
37
+ const root = cwd || process.cwd();
38
+ const wanted = flags.scope ? String(flags.scope).split(',').map((s) => s.trim()) : SCOPES;
39
+ const json = flags.json === true || flags.json === 'true';
40
+ const { findings } = await audit(root, wanted);
41
+
42
+ if (json) {
43
+ process.stdout.write(JSON.stringify({ findings }, null, 2) + '\n');
44
+ return;
45
+ }
46
+
47
+ let errors = 0, warns = 0;
48
+ for (const f of findings) {
49
+ if (f.level === 'error') { errors++; log.error(`[${f.scope}] ${f.msg}`); }
50
+ else if (f.level === 'warn') { warns++; log.warn(`[${f.scope}] ${f.msg}`); }
51
+ else if (f.level === 'ok') log.ok(`[${f.scope}] ${f.msg}`);
52
+ else log.info(`[${f.scope}] ${f.msg}`);
53
+ }
54
+ log.raw('');
55
+ if (errors > 0) {
56
+ log.error(`doctor: ${errors} error(s), ${warns} warning(s)`);
57
+ process.exitCode = 1;
58
+ } else if (warns > 0) {
59
+ log.warn(`doctor: ${warns} warning(s)`);
60
+ } else {
61
+ log.ok('doctor: all checks passed');
62
+ }
63
+ }
64
+
65
+ const checkers = {
66
+ async env() {
67
+ const items = [];
68
+ const node = process.versions.node;
69
+ const major = parseInt(node.split('.')[0], 10);
70
+ if (major < 20) items.push({ level: 'error', msg: `node ${node} < required 20` });
71
+ else items.push({ level: 'ok', msg: `node ${node}` });
72
+ return items;
73
+ },
74
+ async config(root) {
75
+ const items = [];
76
+ const file = paths.configFile(root);
77
+ if (!fsSync.existsSync(file)) {
78
+ items.push({ level: 'error', msg: `missing devflow/config.json. run "devflow init"` });
79
+ } else {
80
+ try {
81
+ const cfg = await config.read(root);
82
+ if (!cfg.version) items.push({ level: 'warn', msg: 'config.version missing' });
83
+ else items.push({ level: 'ok', msg: 'config.json present' });
84
+ } catch (e) {
85
+ items.push({ level: 'error', msg: `config.json parse error: ${e.message}` });
86
+ }
87
+ }
88
+ return items;
89
+ },
90
+ async provider(root) {
91
+ const items = [];
92
+ const list = await providers.listConfigured(root);
93
+ if (!list.length) items.push({ level: 'info', msg: 'no providers configured (using local fallbacks)' });
94
+ for (const p of list) {
95
+ let v;
96
+ try {
97
+ const inst = await providers.load(root, { name: p.name });
98
+ v = await inst.validate();
99
+ } catch (e) {
100
+ items.push({ level: 'warn', msg: `${p.name}: ${e.message.split('\n')[0]}` });
101
+ continue;
102
+ }
103
+ if (v.ok) items.push({ level: 'ok', msg: `${p.name} (${p.type}/${p.driver}) [${p.source}] ok` });
104
+ else if (v.needsLogin) items.push({ level: 'warn', msg: `${p.name}: needs login — run "devflow provider relogin ${p.name}"` });
105
+ else items.push({ level: 'warn', msg: `${p.name}: ${v.reason}` });
106
+ }
107
+ return items;
108
+ },
109
+ async cred(root) {
110
+ const items = [];
111
+ const findings = await lifecycle.securityCheck(root);
112
+ if (!findings.length) {
113
+ items.push({ level: 'ok', msg: 'no plaintext secrets / weak modes detected' });
114
+ } else {
115
+ for (const f of findings) {
116
+ items.push({ level: f.severity || 'warn', msg: `${f.file}: ${f.message}` });
117
+ }
118
+ }
119
+ // Also surface "no chmod info on Windows" → not an error
120
+ return items;
121
+ },
122
+ async change(root) {
123
+ const items = [];
124
+ const all = await change.listChanges(root);
125
+ if (!all.length) {
126
+ items.push({ level: 'info', msg: 'no in-progress changes' });
127
+ return items;
128
+ }
129
+ for (const slug of all) {
130
+ const stateFile = paths.stateFile(root, slug);
131
+ if (!fsSync.existsSync(stateFile)) {
132
+ items.push({ level: 'error', msg: `${slug}: missing state.json` });
133
+ continue;
134
+ }
135
+ try {
136
+ const st = await state.read(root, slug);
137
+ items.push({ level: 'ok', msg: `${slug}: phase=${st.currentPhase} level=${st.level}` });
138
+ } catch (e) {
139
+ items.push({ level: 'error', msg: `${slug}: state.json parse error: ${e.message}` });
140
+ }
141
+ }
142
+ return items;
143
+ },
144
+ async knowledge(root) {
145
+ const items = [];
146
+ const idx = path.join(paths.workspaceKnowledgeRoot(), 'index.json');
147
+ if (!fsSync.existsSync(idx)) {
148
+ items.push({ level: 'warn', msg: 'workspace knowledge/index.json missing (run devflow init)' });
149
+ } else items.push({ level: 'ok', msg: 'workspace knowledge/index.json present' });
150
+ return items;
151
+ },
152
+ async overview(root) {
153
+ const items = [];
154
+ const cfg = await config.read(root).catch(() => null);
155
+ if (!cfg) return items;
156
+ const ov = cfg.projectOverview || {};
157
+ if (ov.mode === 'reference') {
158
+ const ref = ov.referencedFile;
159
+ if (!ref) items.push({ level: 'warn', msg: 'projectOverview.mode=reference but no source detected' });
160
+ else if (!fsSync.existsSync(path.join(root, ref))) items.push({ level: 'error', msg: `referenced overview missing: ${ref}` });
161
+ else items.push({ level: 'ok', msg: `overview ref: ${ref}` });
162
+ } else {
163
+ items.push({ level: 'info', msg: `overview mode=${ov.mode}` });
164
+ }
165
+ return items;
166
+ },
167
+ async git(root) {
168
+ const items = [];
169
+ if (!fsSync.existsSync(path.join(root, '.git'))) {
170
+ items.push({ level: 'warn', msg: 'not a git repo' });
171
+ return items;
172
+ }
173
+ items.push({ level: 'ok', msg: 'git repo present' });
174
+ return items;
175
+ },
176
+ };
177
+
178
+ module.exports = { run, audit, SCOPES };
@@ -0,0 +1,21 @@
1
+ 'use strict';
2
+ const log = require('../../utils/log.js');
3
+ const state = require('../../core/state.js');
4
+ const helpers = require('./_helpers.js');
5
+
6
+ async function run({ flags = {}, positional = [], cwd }) {
7
+ const root = cwd || process.cwd();
8
+ const feature = positional[0];
9
+ if (!feature) { log.error('usage: devflow enable <feature>'); process.exitCode = 2; return; }
10
+ const slug = await helpers.resolveSlug(root, flags, positional.slice(1));
11
+ if (!slug) { process.exitCode = 1; return; }
12
+ const st = await helpers.loadStateOrFail(root, slug);
13
+ if (!st) { process.exitCode = 1; return; }
14
+ st.enabled = st.enabled || {};
15
+ st.enabled[feature] = true;
16
+ state.logEvent(st, `enable ${feature}`);
17
+ await state.write(root, slug, st);
18
+ log.ok(`enabled: ${feature}`);
19
+ }
20
+
21
+ module.exports = { run };