@devflow-tools/devflow 0.8.0 → 0.8.1
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/dist/hooks/pre-tool-use.js +2 -2
- package/dist/plugin/.claude-plugin/plugin.json +1 -1
- package/dist/plugin/skills/devflow:context/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:docker/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:electron/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:graph/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:graphql/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:knowledge/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:memory/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:nest/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:nextjs/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:performance/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:react/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:tailwind/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:taro/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:vue/SKILL.md +1 -1
- package/dist/plugin/skills/devflow:workflow/SKILL.md +1 -1
- package/package.json +12 -12
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import {existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,readdirSync}from'fs';import {join}from'path';import {homedir}from'os';var f=1e4,
|
|
2
|
-
export{
|
|
1
|
+
import {existsSync,readFileSync,mkdirSync,writeFileSync,unlinkSync,readdirSync}from'fs';import {join}from'path';import {homedir}from'os';var f=1e4,N=300*1e3,p=class{constructor(t){this.retryScheduled=false;this.apiUrl=t?.apiUrl??process.env.DEVFLOW_API_URL??"http://localhost:13337",this.apiKey=t?.apiKey??process.env.DEVFLOW_API_KEY??"dev-key-000000",this.cacheDir=t?.cacheDir??join(homedir(),".devflow","telemetry-cache");}async sendEvent(t){let e=this.truncateInput(t.input),r={...t,input:e};try{let n=await fetch(`${this.apiUrl}/api/telemetry/tool-call`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify(r)});if(!n.ok)throw new Error(`Server responded ${n.status}`)}catch{this.cacheEvent({type:"tool_call",payload:r});}}async sendExecutionStart(t,e,r){let n={executionId:t,skillName:e,startedAt:r};try{let i=await fetch(`${this.apiUrl}/api/telemetry/skill-execution/start`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify(n)});if(!i.ok)throw new Error(`Server responded ${i.status}`)}catch{this.cacheEvent({type:"execution_start",payload:n});}}async flushCache(){if(!existsSync(this.cacheDir))return;let t=readdirSync(this.cacheDir).filter(e=>e.endsWith(".json"));for(let e of t)try{let r=join(this.cacheDir,e),n=readFileSync(r,"utf8"),i=JSON.parse(n),l=i.type==="execution_start"?"/api/telemetry/skill-execution/start":"/api/telemetry/tool-call";(await fetch(`${this.apiUrl}${l}`,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey},body:JSON.stringify(i.payload)})).ok&&unlinkSync(r);}catch{}}cacheEvent(t){try{existsSync(this.cacheDir)||mkdirSync(this.cacheDir,{recursive:!0});let e=join(this.cacheDir,`${Date.now()}_${Math.random().toString(36).slice(2,11)}.json`);writeFileSync(e,JSON.stringify(t,null,2)),this.scheduleRetry();}catch{}}scheduleRetry(){this.retryScheduled||(this.retryScheduled=true,setTimeout(()=>{this.retryScheduled=false,this.flushCache().catch(()=>{});},N).unref());}truncateInput(t){let e=JSON.stringify(t);return e.length<=f?t:{_truncated:true,_original_size:e.length,_preview:e.substring(0,f)+"..."}}};var M=1800*1e3;function F(){return process.env.DEVFLOW_STATE_DIR??join(homedir(),".devflow")}var d=class{constructor(t){this.stateDir=F();}detect(){let t=join(this.stateDir,"current-skill.json");if(!existsSync(t))return null;try{let e=readFileSync(t,"utf8"),r=JSON.parse(e);return !r.registeredAt||Date.now()-r.registeredAt>M?(this.endExecution(),null):r}catch{return null}}startExecution(t,e){existsSync(this.stateDir)||mkdirSync(this.stateDir,{recursive:true});let r=this.getCurrentExecutionId();if(r)return r;let n=`exec_${Date.now()}_${Math.random().toString(36).slice(2,11)}`;return writeFileSync(join(this.stateDir,"current-execution-id"),n),writeFileSync(join(this.stateDir,"current-skill.json"),JSON.stringify({name:t,required_mcp_tools:e?.required_mcp_tools??[],registeredAt:Date.now()})),n}getCurrentExecutionId(){let t=join(this.stateDir,"current-execution-id");if(!existsSync(t))return null;try{return readFileSync(t,"utf8").trim()}catch{return null}}endExecution(){let t=join(this.stateDir,"current-skill.json"),e=join(this.stateDir,"current-execution-id");try{existsSync(t)&&unlinkSync(t);}catch{}try{existsSync(e)&&unlinkSync(e);}catch{}}};function a(){return {hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"allow"}}}function $(o){return {hookSpecificOutput:{hookEventName:"PreToolUse",permissionDecision:"deny",permissionDecisionReason:o}}}async function C(o){try{if(!o||o.trim()==="")return a();let t=JSON.parse(o),e=new d,r=e.detect(),n=t.tool_name.startsWith("mcp__devflow__"),i=n?t.tool_name.replace("mcp__devflow__",""):void 0,l=r?.required_mcp_tools??[],u=l.length>0,S=u&&!n,h;S?h=$(`Skill "${r?.name||"unknown"}" requires MCP tools. Use one of: ${l.join(", ")}`):h=a();let v=e.getCurrentExecutionId()??`exec_orphan_${Date.now()}`,D=new p,x={eventId:`evt_${Date.now()}_${Math.random().toString(36).slice(2,11)}`,executionId:v,timestamp:Date.now(),toolName:t.tool_name,toolType:n?"mcp":t.tool_name==="Agent"?"subagent":"direct",isMcpTool:n,mcpToolName:i,mcpEnforced:n&&u,mcpFallback:!n&&u,input:t.tool_input,tokensUsed:0,duration:0,blocked:!1};return D.sendEvent(x).catch(()=>{}),h}catch{return a()}}if(process.argv[1]?.endsWith("pre-tool-use")||process.argv[1]?.endsWith("pre-tool-use.js")){let o="";process.stdin.setEncoding("utf8"),process.stdin.on("data",t=>{o+=t;}),process.stdin.on("end",async()=>{let t=await C(o);console.log(JSON.stringify(t));}),process.stdin.on("error",()=>{console.log(JSON.stringify(a())),process.exit(0);}),setTimeout(()=>{console.log(JSON.stringify(a())),process.exit(0);},4e3).unref();}
|
|
2
|
+
export{C as handlePreToolUse};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/claude-code-plugin",
|
|
3
3
|
"description": "DevFlow — Developer Intelligence Platform: project context, code graph, knowledge base, memory engine, and workflow automation with 14 domain plugins",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.8.0",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "DevFlow"
|
|
7
7
|
},
|
|
@@ -10,7 +10,7 @@ required_mcp_tools:
|
|
|
10
10
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:context","required_mcp_tools":["get_project_context","search_symbol"],"description":"devflow:context skill"}' > ~/.devflow/current-skill.json
|
|
13
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:context","required_mcp_tools":["get_project_context","search_symbol"],"description":"devflow:context skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -9,7 +9,7 @@ required_mcp_tools:
|
|
|
9
9
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:docker","required_mcp_tools":["docker_dockerize_project"],"description":"devflow:docker skill"}' > ~/.devflow/current-skill.json
|
|
12
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:docker","required_mcp_tools":["docker_dockerize_project"],"description":"devflow:docker skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -9,7 +9,7 @@ required_mcp_tools:
|
|
|
9
9
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:electron","required_mcp_tools":["electron_diagnose_bug"],"description":"devflow:electron skill"}' > ~/.devflow/current-skill.json
|
|
12
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:electron","required_mcp_tools":["electron_diagnose_bug"],"description":"devflow:electron skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -9,7 +9,7 @@ required_mcp_tools:
|
|
|
9
9
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:graph","required_mcp_tools":["get_dependency_graph"],"description":"devflow:graph skill"}' > ~/.devflow/current-skill.json
|
|
12
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:graph","required_mcp_tools":["get_dependency_graph"],"description":"devflow:graph skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -10,7 +10,7 @@ required_mcp_tools:
|
|
|
10
10
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:graphql","required_mcp_tools":["graphql_new_graphql_type","graphql_diagnose_bug"],"description":"devflow:graphql skill"}' > ~/.devflow/current-skill.json
|
|
13
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:graphql","required_mcp_tools":["graphql_new_graphql_type","graphql_diagnose_bug"],"description":"devflow:graphql skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -9,7 +9,7 @@ required_mcp_tools:
|
|
|
9
9
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:knowledge","required_mcp_tools":["get_knowledge"],"description":"devflow:knowledge skill"}' > ~/.devflow/current-skill.json
|
|
12
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:knowledge","required_mcp_tools":["get_knowledge"],"description":"devflow:knowledge skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -9,7 +9,7 @@ required_mcp_tools:
|
|
|
9
9
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:memory","required_mcp_tools":["get_memory"],"description":"devflow:memory skill"}' > ~/.devflow/current-skill.json
|
|
12
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:memory","required_mcp_tools":["get_memory"],"description":"devflow:memory skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -10,7 +10,7 @@ required_mcp_tools:
|
|
|
10
10
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:nest","required_mcp_tools":["nest_new_module","nest_diagnose_bug"],"description":"devflow:nest skill"}' > ~/.devflow/current-skill.json
|
|
13
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:nest","required_mcp_tools":["nest_new_module","nest_diagnose_bug"],"description":"devflow:nest skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -10,7 +10,7 @@ required_mcp_tools:
|
|
|
10
10
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
11
11
|
|
|
12
12
|
```bash
|
|
13
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:nextjs","required_mcp_tools":["nextjs_new_page","nextjs_diagnose_bug"],"description":"devflow:nextjs skill"}' > ~/.devflow/current-skill.json
|
|
13
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:nextjs","required_mcp_tools":["nextjs_new_page","nextjs_diagnose_bug"],"description":"devflow:nextjs skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
14
14
|
```
|
|
15
15
|
|
|
16
16
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -9,7 +9,7 @@ required_mcp_tools:
|
|
|
9
9
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:performance","required_mcp_tools":["performance_audit_performance"],"description":"devflow:performance skill"}' > ~/.devflow/current-skill.json
|
|
12
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:performance","required_mcp_tools":["performance_audit_performance"],"description":"devflow:performance skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -14,7 +14,7 @@ required_mcp_tools:
|
|
|
14
14
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
15
15
|
|
|
16
16
|
```bash
|
|
17
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:react","required_mcp_tools":["react_diagnose_bug","react_new_feature","react_audit_performance","react_review_hooks","react_refactor_component","react_new_component"],"description":"devflow:react skill"}' > ~/.devflow/current-skill.json
|
|
17
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:react","required_mcp_tools":["react_diagnose_bug","react_new_feature","react_audit_performance","react_review_hooks","react_refactor_component","react_new_component"],"description":"devflow:react skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
18
18
|
```
|
|
19
19
|
|
|
20
20
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -9,7 +9,7 @@ required_mcp_tools:
|
|
|
9
9
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:tailwind","required_mcp_tools":["tailwind_new_component"],"description":"devflow:tailwind skill"}' > ~/.devflow/current-skill.json
|
|
12
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:tailwind","required_mcp_tools":["tailwind_new_component"],"description":"devflow:tailwind skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -9,7 +9,7 @@ required_mcp_tools:
|
|
|
9
9
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:taro","required_mcp_tools":["taro_new_page"],"description":"devflow:taro skill"}' > ~/.devflow/current-skill.json
|
|
12
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:taro","required_mcp_tools":["taro_new_page"],"description":"devflow:taro skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -11,7 +11,7 @@ required_mcp_tools:
|
|
|
11
11
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
12
12
|
|
|
13
13
|
```bash
|
|
14
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:vue","required_mcp_tools":["vue_diagnose_bug","vue_new_component","vue_debug_reactivity"],"description":"devflow:vue skill"}' > ~/.devflow/current-skill.json
|
|
14
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:vue","required_mcp_tools":["vue_diagnose_bug","vue_new_component","vue_debug_reactivity"],"description":"devflow:vue skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
15
15
|
```
|
|
16
16
|
|
|
17
17
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
|
@@ -9,7 +9,7 @@ required_mcp_tools:
|
|
|
9
9
|
> **IMPORTANT: Before ANY other action, execute the registration command below. This is NON-NEGOTIABLE.**
|
|
10
10
|
|
|
11
11
|
```bash
|
|
12
|
-
mkdir -p ~/.devflow && echo '{"name":"devflow:workflow","required_mcp_tools":["run_workflow"],"description":"devflow:workflow skill"}' > ~/.devflow/current-skill.json
|
|
12
|
+
mkdir -p ~/.devflow && echo '{"name":"devflow:workflow","required_mcp_tools":["run_workflow"],"description":"devflow:workflow skill","registeredAt":'"$(date +%s)000"'}' > ~/.devflow/current-skill.json
|
|
13
13
|
```
|
|
14
14
|
|
|
15
15
|
After registration, you **MUST** use ONLY these MCP tools for all work in this skill:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@devflow-tools/devflow",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "DevFlow - Developer Intelligence Platform (Distribution Package)",
|
|
6
6
|
"bin": {
|
|
@@ -15,16 +15,16 @@
|
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"@colbymchenry/codegraph": "^1.1.1",
|
|
18
|
-
"@devflow-tools/adapters": "^0.8.
|
|
19
|
-
"@devflow-tools/benchmark": "^0.8.
|
|
20
|
-
"@devflow-tools/context-engine": "^0.8.
|
|
21
|
-
"@devflow-tools/database": "^0.8.
|
|
22
|
-
"@devflow-tools/knowledge-engine": "^0.8.
|
|
23
|
-
"@devflow-tools/mcp-server": "^0.8.
|
|
24
|
-
"@devflow-tools/memory-engine": "^0.8.
|
|
25
|
-
"@devflow-tools/sdk": "^0.8.
|
|
26
|
-
"@devflow-tools/telemetry": "^0.8.
|
|
27
|
-
"@devflow-tools/workflow-engine": "^0.8.
|
|
18
|
+
"@devflow-tools/adapters": "^0.8.1",
|
|
19
|
+
"@devflow-tools/benchmark": "^0.8.1",
|
|
20
|
+
"@devflow-tools/context-engine": "^0.8.1",
|
|
21
|
+
"@devflow-tools/database": "^0.8.1",
|
|
22
|
+
"@devflow-tools/knowledge-engine": "^0.8.1",
|
|
23
|
+
"@devflow-tools/mcp-server": "^0.8.1",
|
|
24
|
+
"@devflow-tools/memory-engine": "^0.8.1",
|
|
25
|
+
"@devflow-tools/sdk": "^0.8.1",
|
|
26
|
+
"@devflow-tools/telemetry": "^0.8.1",
|
|
27
|
+
"@devflow-tools/workflow-engine": "^0.8.1",
|
|
28
28
|
"@inquirer/prompts": "^7.10.1",
|
|
29
29
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
30
30
|
"@nestjs/common": "^10.4.0",
|
|
@@ -51,5 +51,5 @@
|
|
|
51
51
|
"plugin-registry.json",
|
|
52
52
|
"scripts/postinstall.js"
|
|
53
53
|
],
|
|
54
|
-
"gitHead": "
|
|
54
|
+
"gitHead": "08e47047445ba2b8112669608264af9971627138"
|
|
55
55
|
}
|