easy-coding-harness 1.1.0-beta.1 → 1.1.0-beta.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/CHANGELOG.md +21 -0
- package/README.md +17 -6
- package/dist/cli.js +395 -190
- package/dist/cli.js.map +1 -1
- package/package.json +1 -1
- package/templates/common/skills/ec-analysis/SKILL.md +8 -4
- package/templates/common/skills/ec-config/SKILL.md +33 -5
- package/templates/common/skills/ec-implementing/SKILL.md +10 -2
- package/templates/common/skills/ec-memory/SKILL.md +48 -24
- package/templates/common/skills/ec-quality/SKILL.md +42 -10
- package/templates/common/skills/ec-task-management/SKILL.md +10 -3
- package/templates/common/skills/ec-workflow/SKILL.md +30 -10
- package/templates/main-constraint/AGENTS.md.tpl +27 -9
- package/templates/main-constraint/CLAUDE.md.tpl +27 -9
- package/templates/runtime/memory/SHORT_MEMORY_TEMPLATE.md +21 -48
- package/templates/shared-hooks/easy_coding_inputs.py +18 -0
- package/templates/shared-hooks/easy_coding_state.py +367 -126
|
@@ -11,14 +11,12 @@ domain:
|
|
|
11
11
|
tags:
|
|
12
12
|
- "{keyword}"
|
|
13
13
|
related_files:
|
|
14
|
-
- "{
|
|
15
|
-
commit: none
|
|
16
|
-
verification: passed | partial | not_run
|
|
14
|
+
- "{entrypoint or file useful for applying this knowledge}"
|
|
17
15
|
memory_value: business | technical | both | none
|
|
18
16
|
target_long: BUSINESS | TECHNICAL | BOTH | NONE
|
|
19
17
|
---
|
|
20
18
|
|
|
21
|
-
#
|
|
19
|
+
# {Reusable knowledge topic}
|
|
22
20
|
|
|
23
21
|
> This template defines the format for files under `.easy-coding/memory/short/`.
|
|
24
22
|
> File naming convention: `{memory_id}_{YYYYMMDD}_{smart_name}.md`
|
|
@@ -26,57 +24,32 @@ target_long: BUSINESS | TECHNICAL | BOTH | NONE
|
|
|
26
24
|
> both the filename prefix and this frontmatter `id`. The UUIDv7 id is safe for concurrent agents.
|
|
27
25
|
> Keep `smart_name` as the readable summary suffix.
|
|
28
26
|
> `source_task` must exactly match the current workflow task id from `task.json`.
|
|
29
|
-
> Short memories are immutable
|
|
30
|
-
>
|
|
31
|
-
> When short memories reach the threshold (default 10), the newest 5 are kept as recent
|
|
27
|
+
> Short memories are immutable and directly useful for later development before distillation.
|
|
28
|
+
> When short memories exceed the threshold (default 10), the newest 5 are kept as recent
|
|
32
29
|
> context; older entries are distillation candidates for long-term memory.
|
|
33
30
|
> Sorting: by frontmatter `date` ascending, then by frontmatter `id`, then by filename. Legacy
|
|
34
31
|
> `SM-YYYYMMDD-NNN` ids sort before UUIDv7 ids on the same date for upgrade compatibility.
|
|
35
32
|
|
|
36
|
-
##
|
|
33
|
+
## Knowledge Summary
|
|
37
34
|
|
|
38
|
-
|
|
39
|
-
- Scope: {modules, pages, interfaces, or files involved}
|
|
40
|
-
- Result: {completed / partially completed / not completed, with reasons}
|
|
41
|
-
- Key Constraints: {encoding, compatibility, interface, spec, or user-specified constraints; "none" if none}
|
|
42
|
-
- Workflow Mode: {frozen mode and why it was selected or escalated}
|
|
35
|
+
{When this knowledge is useful and the main conclusion a future developer should find.}
|
|
43
36
|
|
|
44
|
-
##
|
|
37
|
+
## Reusable Knowledge
|
|
45
38
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
| Commit Info | {commit hash; "none" if not committed} |
|
|
39
|
+
{Write only confirmed facts with future reuse value. Use natural paragraphs or bullets; omit
|
|
40
|
+
inapplicable categories rather than filling a checklist. Useful material includes business rules,
|
|
41
|
+
design reasons, change entrypoints, compatibility boundaries, and failure causes with their fixes.
|
|
42
|
+
Add applicable conditions, necessary reasons and exact symbols where they guide the next change.
|
|
43
|
+
Do not promote a task-specific restriction into a permanent project rule.}
|
|
52
44
|
|
|
53
|
-
##
|
|
45
|
+
## Sources
|
|
54
46
|
|
|
55
|
-
|
|
47
|
+
- {Relevant dev-spec section, implementation result or Review finding; reference instead of copying.}
|
|
48
|
+
- {Related memory or existing knowledge topic, only when useful.}
|
|
56
49
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
## Technical Memory Candidates
|
|
64
|
-
|
|
65
|
-
> Only record engineering facts with future reuse value. Write "none" if none.
|
|
66
|
-
|
|
67
|
-
- Architecture / Interface Decisions: {module boundaries, dependency direction, interface contracts}
|
|
68
|
-
- Engineering Rules / Workflows: {coding, commit, release, installation, directory boundaries}
|
|
69
|
-
- Implementation Patterns / Reusable Approaches: {recommended approaches, fallback strategies, compatibility patterns}
|
|
70
|
-
- Pitfalls / Fix Strategies: {root cause, fix approach, verification method}
|
|
71
|
-
- Verification Experience: {test commands, environment constraints, acceptance paths}
|
|
72
|
-
|
|
73
|
-
## Non-Distillation Content
|
|
74
|
-
|
|
75
|
-
> Content that should NOT enter long-term memory, with reasons — prevents accidental absorption of noise.
|
|
76
|
-
|
|
77
|
-
- {routine file lists / temp logs / one-time data / non-reusable implementation details; "none" if none}
|
|
78
|
-
|
|
79
|
-
## Related Memories
|
|
80
|
-
|
|
81
|
-
- Predecessor: {related short memory id, long-term topic, or "none"}
|
|
82
|
-
- Successor: {follow-up task; "none" if none}
|
|
50
|
+
> Authoring guidance, not memory content: remove these instructions and unused placeholders.
|
|
51
|
+
> If nothing new is reusable, set `memory_value: none` and `target_long: NONE`, give a brief reason
|
|
52
|
+
> in Knowledge Summary and retain Sources; omit Reusable Knowledge rather than inventing lessons.
|
|
53
|
+
> Leave task status, approvals, fingerprints, test statistics and temporary logs in task records.
|
|
54
|
+
> Keep a verification command only when it teaches a reusable method or environment requirement.
|
|
55
|
+
> Do not include an acceptance report or a list of excluded noise.
|
|
@@ -40,6 +40,24 @@ def memo(key, compute):
|
|
|
40
40
|
return cache[key]
|
|
41
41
|
|
|
42
42
|
|
|
43
|
+
def invalidate_memo(key):
|
|
44
|
+
cache = _operation.get()
|
|
45
|
+
if cache is not None:
|
|
46
|
+
cache.pop(key, None)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def cached_memo(key):
|
|
50
|
+
cache = _operation.get()
|
|
51
|
+
return cache.get(key) if cache is not None else None
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def command_identity(command):
|
|
55
|
+
# Shell 展开和重定向受引号影响;只归一化普通 argv 命令,避免错误复用。
|
|
56
|
+
if re.search(r"[\$`\\\n;|&<>*?\[\]{}~#]", command):
|
|
57
|
+
return command
|
|
58
|
+
return tuple(shlex.split(command))
|
|
59
|
+
|
|
60
|
+
|
|
43
61
|
def digest(value):
|
|
44
62
|
return hashlib.sha256(json.dumps(value, sort_keys=True, ensure_ascii=False,
|
|
45
63
|
separators=(",", ":")).encode()).hexdigest()
|